"resolved": "https://registry.npmjs.org/ngx-logger/-/ngx-logger-1.1.2.tgz",
"integrity": "sha1-//QiCP9KTHqmIf7z9nOgCHW9Yts="
},
+ "ngx-toggle-switch": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/ngx-toggle-switch/-/ngx-toggle-switch-2.0.5.tgz",
+ "integrity": "sha1-7Z3ji09SdjYS8dAL5V33M3Dn0CA="
+ },
"no-case": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
"typeface-exo": "0.0.22",
"zone.js": "0.8.18",
"ngx-logger": "1.1.2",
- "angular2-toaster": "5.0.0"
+ "angular2-toaster": "5.0.0",
+ "ngx-toggle-switch": ""
},
"devDependencies": {
"@angular/cli": "1.6.3",
constructor(private toasterService: ToasterService) { }
- default(title: string, content: string) {
+ default(title: string, content?: string) {
this.showToast('default', title, content);
}
- info(title: string, content: string) {
+ info(title: string, content?: string) {
this.showToast('info', title, content);
}
- success(title: string, content: string) {
+ success(title: string, content?: string) {
this.showToast('success', title, content);
}
- warning(title: string, content: string) {
+ warning(title: string, content?: string) {
this.showToast('warning', title, content);
}
- error(title: string, content: string) {
+ error(title: string, content?: string) {
this.showToast('error', title, content);
}
--- /dev/null
+<nb-flip-card>
+ <nb-card-front>
+ <nb-card size="xsmall" accent="{{(device.locked===0) ? 'success' : 'active'}}" class="device-card {{device.type.name}}">
+ <nb-card-body>
+ <div cass="row">
+ <button class="btn btn-icon btn-hero-info" type="button" (click)=toggleLock(device.id,device.locked)>
+ <div class="icon"></div>
+ </button>
+ <div class="info">
+ <div class="title font-w-bold">{{device.type.name | uppercase}}</div>
+ <div class="description font-w-light">{{device.model}}</div>
+ </div>
+ <div *ngIf="device.locked===1" class="locked"><i class="nb-locked"></i></div>
+ </div>
+ </nb-card-body>
+ <nb-card-footer>
+ <nb-actions size="small">
+ <nb-action>
+ <a class="icon-container" href="#/home/reports/{{device.id}}">
+ <i class="control-icon nb-list"></i>
+ </a>
+ </nb-action>
+ <nb-action>
+ <a class="icon-container" href="#/home/policies/{{device.id}}">
+ <i class="control-icon nb-gear"></i>
+ </a>
+ </nb-action>
+ </nb-actions>
+ </nb-card-footer>
+ </nb-card>
+ </nb-card-front>
+ <nb-card-back>
+ <nb-card size="xsmall" accent="{{(device.locked===0) ? 'success' : 'active'}}">
+ <nb-card-body>
+ <div class="row">
+ <div class="col-xxxl-12 col-md-12">
+ <h4 class="font-w-bold">COMMON</h4></div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Type:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.type.name}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Model:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.model}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">SN:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.sn}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Registered:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.ctime | date:'medium'}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-12 col-md-12">
+ <h4 class="font-w-bold mt-3">OS</h4></div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Name:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.os.name}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Version:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.os.version}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">SW:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.os.sw}}</div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-12 col-md-12">
+ <h4 class="font-w-bold mt-3">GEO</h4></div>
+ </div>
+ <div class="row">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Country:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.geo.country_name}}</div>
+ </div>
+ <div class="row mb-2">
+ <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">City:</span></div>
+ <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.geo.city}}</div>
+ </div>
+ </nb-card-body>
+ <nb-card-footer>
+ <p></p>
+ </nb-card-footer>
+ </nb-card>
+ </nb-card-back>
+</nb-flip-card>
}
nb-actions {
- &:hover {
- cursor: pointer;
- }
i {
font-size: 2rem;
}
--- /dev/null
+<nb-card>
+ <nb-card-header>
+ <h3>{{policyGroup.group | uppercase}} POLICIES</h3>
+ </nb-card-header>
+ <nb-card-body>
+ <sam-policy *ngFor="let policy of policyGroup.policies" [policy]="policy"></sam-policy>
+ </nb-card-body>
+ <nb-card-footer>
+ <button (click)="applyPolicies()" class="btn btn-success">Apply</button>
+ </nb-card-footer>
+</nb-card>
--- /dev/null
+@import '../../@theme/styles/themes';
+@import '~@nebular/theme/styles/global/bootstrap/breakpoints';
+@import '~bootstrap/scss/mixins/breakpoints';
+
+.btn:hover {
+ cursor: pointer;
+}
--- /dev/null
+import { Component, Input } from '@angular/core';
+import { PolicyService } from '../../services/policy.service';
+import { PolicyGroup, UpdatedDevicePolicies, Device } from '../../models';
+import { NotificationsService } from '../../@theme/components/notifications/notifications.service';
+import { NGXLogger } from 'ngx-logger';
+
+@Component({
+ selector: 'sam-policy-group',
+ templateUrl: './policy-group.component.html',
+ styleUrls: ['./policy-group.component.scss'],
+})
+export class PolicyGroupComponent {
+ @Input() deviceId: number;
+ @Input() policyGroup: PolicyGroup;
+
+ constructor(private policyService: PolicyService,
+ private notifications: NotificationsService,
+ private logger: NGXLogger) { }
+
+ applyPolicies(): void {
+ let updatedPolicies: UpdatedDevicePolicies;
+
+ try {
+ updatedPolicies = new UpdatedDevicePolicies(this.policyGroup.policies);
+ } catch (e) {
+ this.logger.error(e.message);
+ this.notifications.error(e.message);
+
+ return;
+ }
+
+ this.policyService.setDevicePolicies(
+ this.deviceId,
+ updatedPolicies,
+ ).subscribe(
+ (policies) => {
+ this.policyGroup.policies = policies;
+ this.notifications.success('Policies successfully applied');
+ },
+ (error) => {
+ this.logger.error('Policies applying error');
+ this.notifications.error('Policies applying error');
+ },
+ );
+ }
+}
--- /dev/null
+import { NgModule } from '@angular/core';
+
+import { ThemeModule } from '../../@theme/theme.module';
+import { PolicyGroupComponent } from './policy-group.component';
+import { PolicyModule } from '../policy/policy.module';
+
+
+@NgModule({
+ imports: [
+ ThemeModule,
+ PolicyModule,
+ ],
+ declarations: [
+ PolicyGroupComponent,
+ ],
+ exports: [
+ PolicyGroupComponent,
+ ],
+})
+export class PolicyGroupModule { }
--- /dev/null
+<div [ngSwitch]="policy.type" class="form-group row">
+ <label [attr.for]="policy.name" class="col-sm-3 col-form-label header">
+ <h5>{{policy.uiname}}</h5>
+ </label>
+ <div class="col-sm-9">
+ <ui-switch *ngSwitchCase="PolicyType.FLAG" [(ngModel)]="policy.value"></ui-switch>
+ <div *ngSwitchCase="PolicyType.INPUT_NUMBER" class="input-group">
+ <input [(ngModel)]="policy.value" [attr.id]="policy.name" type="number" class="form-control" />
+ </div>
+ <div *ngSwitchCase="PolicyType.MULTISELECT">
+ <nb-checkbox *ngFor="let item of policy.items" [(ngModel)]="item.value" (change)="lol()">{{item.key}}</nb-checkbox>
+ </div>
+ <div *ngSwitchCase="PolicyType.SELECT">
+ <label *ngFor="let item of policy.items" class="custom-control custom-radio" style="float:left;">
+ <input [checked]="item.value === 1" [value]="item.value" (change)="onRadioChange(item, $event)"
+ class="custom-control-input" name="select" type="radio">
+ <span class="custom-control-indicator"></span>
+ <span class="custom-control-description">{{item.key | uppercase}}</span>
+ </label>
+ </div>
+ </div>
+</div>
--- /dev/null
+@import '../../@theme/styles/themes';
+@import '~@nebular/theme/styles/global/bootstrap/breakpoints';
+@import '~bootstrap/scss/mixins/breakpoints';
--- /dev/null
+import { Component, Input } from '@angular/core';
+import { ValuePolicy, SelectPolicy, PolicyType, SelectItem } from '../../models';
+
+@Component({
+ selector: 'sam-policy',
+ templateUrl: './policy.component.html',
+ styleUrls: ['./policy.component.scss'],
+})
+export class PolicyComponent {
+ @Input() policy: SelectPolicy | ValuePolicy;
+ PolicyType = PolicyType;
+
+ onRadioChange(item: SelectItem): void {
+ const newPolicy = new SelectPolicy(this.policy.name, this.policy.uiname,
+ this.policy.descr, this.policy.type, this.policy.state, (this.policy as SelectPolicy).items);
+ item.value = item.value === 0 ? 1 : 0;
+ newPolicy.setItem(item);
+ this.policy = newPolicy;
+ }
+
+ lol() {
+ console.info('azazazazaz');
+ }
+}
--- /dev/null
+import { NgModule } from '@angular/core';
+import { UiSwitchModule } from 'ngx-toggle-switch';
+import { ThemeModule } from '../../@theme/theme.module';
+import { PolicyComponent } from './policy.component';
+
+
+@NgModule({
+ imports: [
+ ThemeModule,
+ UiSwitchModule,
+ ],
+ declarations: [
+ PolicyComponent,
+ ],
+ exports: [
+ PolicyComponent,
+ ],
+})
+export class PolicyModule { }
+++ /dev/null
-<nb-flip-card>
- <nb-card-front>
- <nb-card size="xsmall" accent="{{(device.locked===0) ? 'success' : 'active'}}" class="device-card {{device.type.name}}">
- <nb-card-body>
- <div cass="row">
- <button class="btn btn-icon btn-hero-info" type="button" (click)=toggleLock(device.id,device.locked)>
- <div class="icon"></div>
- </button>
- <div class="info">
- <div class="title font-w-bold">{{device.type.name | uppercase}}</div>
- <div class="description font-w-light">{{device.model}}</div>
- </div>
- <div *ngIf="device.locked===1" class="locked"><i class="nb-locked"></i></div>
- </div>
- </nb-card-body>
- <nb-card-footer>
- <nb-actions size="small">
- <nb-action>
- <i class="nb-list"></i><span>Reports</span>
- </nb-action>
- <nb-action>
- <i class="nb-gear"></i><span>Policies</span>
- </nb-action>
- </nb-actions>
- </nb-card-footer>
- </nb-card>
- </nb-card-front>
- <nb-card-back>
- <nb-card size="xsmall" accent="{{(device.locked===0) ? 'success' : 'active'}}">
- <nb-card-body>
- <div class="row">
- <div class="col-xxxl-12 col-md-12"><h4 class="font-w-bold">COMMON</h4></div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Type:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.type.name}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Model:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.model}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">SN:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.sn}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Registered:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.ctime | date:'medium'}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-12 col-md-12"><h4 class="font-w-bold mt-3">OS</h4></div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Name:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.os.name}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Version:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.os.version}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">SW:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.os.sw}}</div>
- </div>
- <div class="row">
- <div class="col-xxxl-12 col-md-12"><h4 class="font-w-bold mt-3">GEO</h4></div>
- </div>
- <div class="row">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">Country:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.geo.country_name}}</div>
- </div>
- <div class="row mb-2">
- <div class="col-xxxl-3 col-md-3 col-sm-3"><span class="font-w-bold">City:</span></div>
- <div class="col-xxxl-9 col-md-9 col-sm-9">{{device.geo.city}}</div>
- </div>
- </nb-card-body>
- <nb-card-footer><p></p></nb-card-footer>
- </nb-card>
- </nb-card-back>
-</nb-flip-card>
import { ThemeModule } from '../../@theme/theme.module';
import { DevicesComponent } from './devices.component';
-import { DeviceModule } from '../device/device.module';
-import { DeviceComponent } from '../device/device.component';
-import { DeviceService } from '../../services/device.service';
+import { DeviceModule } from '../../components/device/device.module';
+import { DeviceService } from '../../services';
@NgModule({
import { PagesComponent } from './pages.component';
import { DashboardComponent } from './dashboard/dashboard.component';
import { DevicesComponent } from './devices/devices.component';
+import { PoliciesComponent } from './policies/policies.component';
const routes: Routes = [{
path: '',
component: DevicesComponent,
},
{
+ path: 'policies/:id',
+ component: PoliciesComponent,
+ },
+ {
path: '',
redirectTo: 'dashboard',
pathMatch: 'full',
`,
})
export class PagesComponent {
-
menu = MENU_ITEMS;
}
import { PagesComponent } from './pages.component';
import { DashboardModule } from './dashboard/dashboard.module';
import { DevicesModule } from './devices/devices.module';
-import { DeviceModule } from './device/device.module';
+import { PoliciesModule } from './policies/policies.module';
import { PagesRoutingModule } from './pages-routing.module';
import { ThemeModule } from '../@theme/theme.module';
PagesRoutingModule,
ThemeModule,
DashboardModule,
- DeviceModule,
DevicesModule,
+ PoliciesModule,
],
declarations: [
...PAGES_COMPONENTS,
--- /dev/null
+<div class="row">
+ <sam-device [device]="device" class="col-md-12 col-xxxl-3"></sam-device>
+ <div class="col-md-12 col-xxxl-9">
+ <nb-card>
+ <nb-card-body>
+ <nb-tabset>
+ <nb-tab *ngFor="let policyGroup of policies$ | async; let index = index"
+ tabTitle="{{policyGroup.group | uppercase}}"
+ active="{{(index===0) ? 'true' : 'false'}}">
+ <sam-policy-group [deviceId]="deviceId" [policyGroup]="policyGroup"></sam-policy-group>
+ </nb-tab>
+ </nb-tabset>
+ </nb-card-body>
+ </nb-card>
+ </div>
+</div>
--- /dev/null
+import { Component, Input, OnInit } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { PolicyService, DeviceService } from '../../services';
+import { ActivatedRoute } from '@angular/router';
+import { UpdatedDevicePolicies, Device, PolicyGroup } from '../../models';
+
+@Component({
+ selector: 'sam-policies',
+ templateUrl: './policies.component.html',
+})
+export class PoliciesComponent implements OnInit {
+ device: Device;
+ deviceId: number;
+ policies$: Observable<PolicyGroup[]>;
+
+ constructor(private policyService: PolicyService,
+ private route: ActivatedRoute,
+ private deviceService: DeviceService) {
+ }
+
+ ngOnInit() {
+ this.deviceId = +this.route.snapshot.paramMap.get('id');
+ this.getDevice()
+ this.getDevicePolicies();
+ }
+
+ private getDevicePolicies(): void {
+ this.policies$ = this.policyService.getDevicePolicies(this.deviceId);
+ }
+
+ private getDevice(): void {
+ this.deviceService.getDevice(this.deviceId).subscribe(device => this.device = device);
+ }
+}
--- /dev/null
+import { NgModule } from '@angular/core';
+
+import { ThemeModule } from '../../@theme/theme.module';
+import { PoliciesComponent } from './policies.component';
+import { PolicyService, DeviceService } from '../../services';
+import { PolicyGroupModule } from '../../components/policy-group/policy-group.module';
+import { DeviceModule } from '../../components/device/device.module';
+
+
+
+@NgModule({
+ imports: [
+ ThemeModule,
+ PolicyGroupModule,
+ DeviceModule,
+ ],
+ declarations: [
+ PoliciesComponent,
+ ],
+ providers: [
+ PolicyService,
+ ],
+})
+export class PoliciesModule { }