diff --git a/package-lock.json b/package-lock.json index c6db9da..28f1a5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "overflow-member-wepapp", + "name": "@overflow/member-wepapp", "version": "0.0.0", "lockfileVersion": 1, "requires": true, @@ -259,8 +259,7 @@ "@overflow/commons-typescript": { "version": "0.0.1", "resolved": "https://nexus.loafle.net/repository/npm-all/@overflow/commons-typescript/-/commons-typescript-0.0.1.tgz", - "integrity": "sha512-ExzlR7RsCu3nPn1m1ADJEFV9fYr2rVg3Oyge8MogHOjDa1BoeUx9OLwluL7IOuBEHA5tVX6BucRIeaNFOME8TQ==", - "dev": true + "integrity": "sha512-ExzlR7RsCu3nPn1m1ADJEFV9fYr2rVg3Oyge8MogHOjDa1BoeUx9OLwluL7IOuBEHA5tVX6BucRIeaNFOME8TQ==" }, "@schematics/angular": { "version": "0.1.17", @@ -1881,7 +1880,6 @@ "dev": true }, "common-tags": { - "version": "1.7.2", "resolved": "https://nexus.loafle.net/repository/npm-all/common-tags/-/common-tags-1.7.2.tgz", "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==", diff --git a/src/packages/discovery/component/setting/result/result.component.1.ts b/src/packages/discovery/component/setting/result/result.component.1.ts new file mode 100644 index 0000000..9e741b7 --- /dev/null +++ b/src/packages/discovery/component/setting/result/result.component.1.ts @@ -0,0 +1,190 @@ +import { Component, OnInit, Input, AfterContentInit, Output, EventEmitter, OnDestroy } from '@angular/core'; +import { Store, select, StateObservable } from '@ngrx/store'; +import { RPCClientError } from '@loafer/ng-rpc/protocol'; +import { Subscription } from 'rxjs/Subscription'; +import { TreeNode } from 'primeng/primeng'; + +import * as DiscoveredStore from 'packages/discovery/store/setting'; +import { SettingSelector, DiscoverSelector } from 'packages/discovery/store'; +import * as DiscoverStore from 'packages/discovery/store/discover'; +import * as RegistStore from 'packages/discovery/store/regist'; + +import { Zone } from '@overflow/commons-typescript/model/discovery'; +import { Host } from '@overflow/commons-typescript/model/discovery'; +import { Port } from '@overflow/commons-typescript/model/discovery'; +import { Service } from '@overflow/commons-typescript/model/discovery'; + +@Component({ + selector: 'of-discovery-result', + templateUrl: './result.component.html', +}) +export class ResultComponent implements OnInit, AfterContentInit, OnDestroy { + + treeNodes = []; + selectedNodes = []; + zones: Map = null; + checkedSet = new Set(); + + resultSubscription$: Subscription; + result$: any; + startedSubscription$: Subscription; + started$: any; + endedSubscription$: Subscription; + ended$: any; + + inProgress = false; + + + selectedDiscoveryResult: TreeNode[]; + + constructor( + private discoverdStore: Store, + private discoverStore: Store, + private registStore: Store, + ) { + this.result$ = discoverStore.pipe(select(DiscoverSelector.select('zones'))); + this.started$ = discoverStore.pipe(select(DiscoverSelector.select('isStart'))); + this.ended$ = discoverStore.pipe(select(DiscoverSelector.select('isEnd'))); + } + + ngOnInit() { + this.resultSubscription$ = this.result$.subscribe( + (zones: Map) => { + if (zones !== undefined && zones !== null) { + console.log(zones); + this.treeNodes = this.convertTreeViewZone(zones); + this.zones = zones; + } + }, + (error: RPCClientError) => { + console.log(error.response.message); + } + ); + this.startedSubscription$ = this.started$.subscribe( + (isStart: boolean) => { + if (isStart !== undefined && isStart !== null && isStart) { + this.inProgress = true; + console.log('##Discovery has started.##'); + } + }, + (error: RPCClientError) => { + console.log(error.response.message); + } + ); + this.endedSubscription$ = this.ended$.subscribe( + (isEnd: boolean) => { + if (isEnd !== undefined && isEnd !== null && isEnd) { + console.log('##Discovery has done.##'); + } + }, + (error: RPCClientError) => { + console.log(error.response.message); + } + ); + } + + ngAfterContentInit() { + } + + ngOnDestroy() { + if (this.startedSubscription$) { + this.startedSubscription$.unsubscribe(); + } + if (this.endedSubscription$) { + this.endedSubscription$.unsubscribe(); + } + if (this.resultSubscription$) { + this.resultSubscription$.unsubscribe(); + } + } + + save() { + } + + convertTreeViewZone(zones: Map) { + + if (zones === undefined || zones === null) { + return; + } + + const treeNodes: any[] = []; + + zones.forEach((value: Zone, key: string, map) => { + const jZone: any = { + label: 'Zone - ' + value.iface, + // className: 'cn' + value.ip, + expandedIcon: 'fa-folder-open', + collapsedIcon: 'fa-folder', + }; + jZone.obj = value; + jZone.children = this.convertViewHost(value.hosts); + treeNodes.push(jZone); + }); + + return treeNodes; + } + + convertViewHost(hosts): any[] { + if (hosts === undefined || hosts === null) { + return null; + } + const hostNodes: any[] = []; + + hosts.forEach((host, hostKey) => { + + const jHost: any = { + label: 'Host - ' + host.ipv4, + // className: 'cn' + host.ip + expandedIcon: 'fa-folder-open', + collapsedIcon: 'fa-folder', + }; + jHost.obj = host; + jHost.children = this.convertViewPort(host.ports); + hostNodes.push(jHost); + + }); + + return hostNodes; + + } + + convertViewPort(ports): any[] { + if (ports === undefined || ports === null || ports.size < 0) { + return null; + } + const portChildren: any[] = []; + ports.forEach((port, portKey) => { + const jPort: any = { + label: 'Port - ' + port.portNumber, + // className: 'cn' + port.portNumber, + expandedIcon: 'fa-folder-open', + collapsedIcon: 'fa-folder', + }; + jPort.obj = port; + jPort.children = this.convertViewService(port.services); + portChildren.push(jPort); + }); + + return portChildren; + } + + convertViewService(services): any[] { + if (services === undefined || services === null || services.size <= 0) { + return null; + } + const serviceChildren: any[] = []; + services.forEach((service, serviceKey) => { + const jService: any = { + label: 'Service - ' + service.serviceName, + // className: 'cn' + service.serviceName, + }; + jService.obj = service; + + serviceChildren.push(jService); + }); + + return serviceChildren; + } + + +} diff --git a/src/packages/sensor/component/detail/detail.component.html b/src/packages/sensor/component/detail/detail.component.html index 49b6626..6dfeb25 100644 --- a/src/packages/sensor/component/detail/detail.component.html +++ b/src/packages/sensor/component/detail/detail.component.html @@ -37,7 +37,7 @@
- + @@ -51,4 +51,9 @@
- \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/src/packages/sensor/component/detail/detail.component.ts b/src/packages/sensor/component/detail/detail.component.ts index c35f188..65e0320 100644 --- a/src/packages/sensor/component/detail/detail.component.ts +++ b/src/packages/sensor/component/detail/detail.component.ts @@ -18,13 +18,16 @@ export class DetailComponent implements OnInit, AfterContentInit, OnDestroy { sensorSubscription$: Subscription; sensor$ = this.detailStore.pipe(select(sensorSelector.select('sensor'))); sensor: Sensor; + sensorSettingDisplay: boolean; constructor( private route: ActivatedRoute, private router: Router, private confirmationService: ConfirmationService, private detailStore: Store, - ) { } + ) { + this.sensorSettingDisplay = false; + } ngOnInit() { this.sensorSubscription$ = this.sensor$.subscribe( @@ -55,7 +58,9 @@ export class DetailComponent implements OnInit, AfterContentInit, OnDestroy { onStartOrStop() { } - onEdit() { } + onEdit() { + this.sensorSettingDisplay = true; + } onRemove() { this.confirmationService.confirm({ diff --git a/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.html b/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.html new file mode 100644 index 0000000..5108fca --- /dev/null +++ b/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.html @@ -0,0 +1,17 @@ + +
+
+ + + + +
+
+ + +
개발자의 배려가 돋보이는 친절한 안내 메시지
+
+
+ +
+
\ No newline at end of file diff --git a/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.spec.ts b/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.spec.ts new file mode 100644 index 0000000..87f023d --- /dev/null +++ b/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CrawlerAuthComponent } from './crawler-auth.component'; + +describe('FilterComponent', () => { + let component: CrawlerAuthComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CrawlerAuthComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CrawlerAuthComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.ts b/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.ts new file mode 100644 index 0000000..da9a5b7 --- /dev/null +++ b/src/packages/sensor/component/setting.1/crawler-auth/crawler-auth.component.ts @@ -0,0 +1,96 @@ +import { Component, OnInit, Input, OnChanges, Output, EventEmitter } from '@angular/core'; +import { Router } from '@angular/router'; +import { MetaCrawler } from '@overflow/commons-typescript/model/meta'; + +import { Store, select } from '@ngrx/store'; +import { RPCClientError } from '@loafer/ng-rpc/protocol'; +import * as ListStore from 'packages/meta/crawler-input-item/store/list'; +import { ReadCrawlerInputItemSelector } from 'packages/meta/crawler-input-item/store'; +import { MetaCrawlerInputItem } from '@overflow/commons-typescript/model/meta'; + + +@Component({ + selector: 'of-crawler-auth', + templateUrl: './crawler-auth.component.html', +}) +export class CrawlerAuthComponent implements OnInit, OnChanges { + + inputItems$ = this.listStore.pipe(select(ReadCrawlerInputItemSelector.select('inputs'))); + inputItems: MetaCrawlerInputItem[]; + title: string; + + @Output() credentialPassed = new EventEmitter(); + @Input() crawler: MetaCrawler; + + constructor( + private router: Router, + private listStore: Store, + ) { } + + ngOnInit() { + // this.inputItems$.subscribe( + // (list: MetaCrawlerInputItem[]) => { + // if (list !== null) { + // if (this.inputItems !== list) { + // this.testPassEvent.emit(false); + // } + // this.inputItems = list; + // } + // }, + // (error: RPCClientError) => { + // console.log(error.response.message); + // } + // ); + } + + ngOnChanges() { + // this.getCrawlerAuthInputItems(); + this.title = '3. Credentials'; + + this.inputItems = []; + // Temporary data + if (null == this.crawler) { + return; + } + this.title += ' for ' + this.crawler.name; + for (let i = 0; i < 10; i++) { + const item: MetaCrawlerInputItem = { + id: i, + // inputType: { + // id: i, + // name: '', + // description: '', + // }, + crawler: null, + description: '', + name: '', + createDate: new Date(), + required: true, + defaultValue: '', + pattern: '', + keyName: '', + keyValue: '', + }; + this.inputItems.push(item); + } + + } + + getCrawlerAuthInputItems() { + this.listStore.dispatch(new ListStore.ReadAll(this.crawler)); + } + + testCredentials() { + // switch (this.crawler.id) { + // case 1: + // break; + // case 2: + // break; + // case 3: + // break; + // default : + // break; + // } + this.credentialPassed.emit(true); + } +} diff --git a/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.html b/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.html new file mode 100644 index 0000000..ad29f81 --- /dev/null +++ b/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.html @@ -0,0 +1,16 @@ +
+ + +
+
{{crawler.name}}
+
+
+
+
+ + + +
개발자의 배려가 돋보이는 친절한 안내 메시지
+
+
\ No newline at end of file diff --git a/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.spec.ts b/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.spec.ts new file mode 100644 index 0000000..77251eb --- /dev/null +++ b/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CrawlerSelectorComponent } from './crawler-selector.component'; + +describe('FilterComponent', () => { + let component: CrawlerSelectorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CrawlerSelectorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CrawlerSelectorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.ts b/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.ts new file mode 100644 index 0000000..32742e1 --- /dev/null +++ b/src/packages/sensor/component/setting.1/crawler-selector/crawler-selector.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit, Input, OnChanges, AfterContentInit, Output, EventEmitter } from '@angular/core'; +import { Router } from '@angular/router'; +import { Target } from '@overflow/commons-typescript/model/target'; + +import { Store, select } from '@ngrx/store'; +import { RPCClientError } from '@loafer/ng-rpc/protocol'; +import * as ListStore from 'packages/meta/crawler/store/list'; +import { ReadAllCrawlerSelector } from 'packages/meta/crawler/store'; +import { MetaCrawler } from '@overflow/commons-typescript/model/meta'; + + +@Component({ + selector: 'of-crawler-selector', + templateUrl: './crawler-selector.component.html', +}) +export class CrawlerSelectorComponent implements OnInit, OnChanges, AfterContentInit { + + crawlers$ = this.listStore.pipe(select(ReadAllCrawlerSelector.select('metaCrawlerList'))); + @Input() target: Target; + crawlers: MetaCrawler[]; + @Output() crawlerSelected = new EventEmitter(); + + constructor( + private router: Router, + private listStore: Store, + ) { } + + ngOnInit() { + // this.crawlers$.subscribe( + // (list: MetaCrawler[]) => { + // if (list !== null) { + // this.crawlers = list; + // } + // }, + // (error: RPCClientError) => { + // console.log(error.response.message); + // } + // ); + + } + + ngAfterContentInit() { + // this.listStore.dispatch(new ListStore.ReadAll()); + } + + ngOnChanges() { + + this.crawlers = []; + if (null == this.target) { + return; + } + + // Temporary Data + for (let i = 0; i < 4; i++) { + const c: MetaCrawler = { + id: i, + name: 'CrawlerName' + i + ' For ' + this.target.displayName, + }; + this.crawlers.push(c); + } + + } + + onSelectionChange(event) { + this.crawlerSelected.emit(event.value[0]); + } +} diff --git a/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.html b/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.html new file mode 100644 index 0000000..595851d --- /dev/null +++ b/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.html @@ -0,0 +1,10 @@ + +
+ +
+ + +
개발자의 배려가 돋보이는 친절한 안내 메시지
+
+
\ No newline at end of file diff --git a/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.spec.ts b/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.spec.ts new file mode 100644 index 0000000..25e7477 --- /dev/null +++ b/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SensorItemSelectorComponent } from './sensor-item-selector.component'; + +describe('SensorItemSelectorComponent', () => { + let component: SensorItemSelectorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SensorItemSelectorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SensorItemSelectorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.ts b/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.ts new file mode 100644 index 0000000..a72c5a4 --- /dev/null +++ b/src/packages/sensor/component/setting.1/sensor-item-selector/sensor-item-selector.component.ts @@ -0,0 +1,126 @@ +import { Component, OnInit, OnChanges, Input, Output, EventEmitter, ViewChild, AfterViewInit, OnDestroy } from '@angular/core'; +import { Router } from '@angular/router'; +import { Store, select } from '@ngrx/store'; +import { RPCClientError } from '@loafer/ng-rpc/protocol'; +import * as ListStore from 'packages/meta/sensor-display-item/store/list'; +import { ReadAllSensorDisplayItemByCrawlerSelector } from 'packages/meta/sensor-display-item/store'; +import { MetaSensorDisplayItem } from '@overflow/commons-typescript/model/meta'; +import { MetaCrawler } from '@overflow/commons-typescript/model/meta'; +import { MetaSensorItemType } from '@overflow/commons-typescript/model/meta'; +import { TreeNode } from 'primeng/primeng'; +import { Target } from '@overflow/commons-typescript/model/target'; + +@Component({ + selector: 'of-sensor-item-selector', + templateUrl: './sensor-item-selector.component.html', +}) +export class SensorItemSelectorComponent implements OnInit, OnChanges { + + @Input() target: Target; + @Input() crawler: MetaCrawler; + @Output() sensorItemsSelected = new EventEmitter(); + + items$ = this.listStore.pipe(select(ReadAllSensorDisplayItemByCrawlerSelector.select('list'))); + + selectedItems: TreeNode[]; + itemTreeNode: TreeNode[]; + + constructor( + private router: Router, + private listStore: Store, + ) { } + + ngOnInit() { + // this.selectedItems = new Set(); + // this.items$.subscribe( + // (list: MetaSensorDisplayItem[]) => { + // if (list !== null) { + // } + // }, + // (error: RPCClientError) => { + // console.log(error.response.message); + // } + // ); + + } + + ngOnChanges() { + // this.selectedItems.clear(); + // this.listStore.dispatch(new ListStore.ReadAllByCrawler(this.crawler)); + + this.itemTreeNode = []; + if (!this.target || !this.crawler) { + return; + } + // Temporary data + const displayItems = []; + for (let i = 0; i < 10; i++) { + let isDefault = false; + const t: MetaSensorItemType = { + name: 'CPU' + }; + if (i % 2) { + isDefault = true; + t.name = 'Memory'; + } + const si: MetaSensorDisplayItem = { + id: i, + key: 'SensorDisplayItemKey' + i, + displayName: 'this.is.display.item.name' + i, + description: 'Description' + i, + default: isDefault, + itemType: t + }; + displayItems.push(si); + } + + this.generateTreeData(displayItems); + } + + generateTreeData(items) { + this.itemTreeNode = []; + for (const item of items) { + const categoryNode = this.existCategory(item); + if (categoryNode === null) { + const childrenNode = []; + childrenNode.push(this.getChildNode(item)); + const node = { + label: item.itemType.name, + children: childrenNode, + expanded: true, + }; + this.itemTreeNode.push(node); + } else { + categoryNode.children.push(this.getChildNode(item)); + } + } + } + + getChildNode(item) { + const childNode = { + label: item.displayName, + expandedIcon: item.default ? 'ui-icon-star' : '', + collapsedIcon: item.default ? 'ui-icon-star' : '', + expanded: true, + data: item + }; + return childNode; + } + existCategory(item: MetaSensorDisplayItem) { + let categoryNode = null; + for (const node of this.itemTreeNode) { + if (node.label === item.itemType.name) { + categoryNode = node; + } + } + return categoryNode; + } + + + onNodeSelect(event) { + this.sensorItemsSelected.emit(this.selectedItems); + } + onNodeUnselect(event) { + this.sensorItemsSelected.emit(this.selectedItems); + } +} diff --git a/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.html b/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.html new file mode 100644 index 0000000..68799a4 --- /dev/null +++ b/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.html @@ -0,0 +1,3 @@ +
+ page 2222222 +
\ No newline at end of file diff --git a/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.spec.ts b/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.spec.ts new file mode 100644 index 0000000..4f94006 --- /dev/null +++ b/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SettingETCComponent } from './setting-etc.component'; + +describe('SettingETCComponent', () => { + let component: SettingETCComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SettingETCComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingETCComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.ts b/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.ts new file mode 100644 index 0000000..2891968 --- /dev/null +++ b/src/packages/sensor/component/setting.1/setting-etc/setting-etc.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Router } from '@angular/router'; +import { MetaCrawler } from '@overflow/commons-typescript/model/meta'; +import { MetaSensorDisplayItem } from '@overflow/commons-typescript/model/meta'; +import { Target } from '@overflow/commons-typescript/model/target'; + + +@Component({ + selector: 'of-sensor-setting-etc', + templateUrl: './setting-etc.component.html', +}) +export class SettingETCComponent implements OnInit { + + @Input() selectedTarget: Target; + @Input() selectedCrawler: MetaCrawler; + @Input() selectedItems: MetaSensorDisplayItem[]; + + intervals = [ + '600 sec', + '400 sec', + '200 sec', + ]; + + + constructor( + private router: Router, + ) { } + + ngOnInit() { + } + +} diff --git a/src/packages/sensor/component/setting.1/setting.component.html b/src/packages/sensor/component/setting.1/setting.component.html new file mode 100644 index 0000000..51eaecd --- /dev/null +++ b/src/packages/sensor/component/setting.1/setting.component.html @@ -0,0 +1,60 @@ +

Add Sensor

+
+ + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+ + + + \ No newline at end of file diff --git a/src/packages/sensor/component/setting.1/setting.component.spec.ts b/src/packages/sensor/component/setting.1/setting.component.spec.ts new file mode 100644 index 0000000..0f66542 --- /dev/null +++ b/src/packages/sensor/component/setting.1/setting.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SettingComponent } from './setting.component'; + +describe('SensorSettingComponent', () => { + let component: SettingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SettingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/packages/sensor/component/setting.1/setting.component.ts b/src/packages/sensor/component/setting.1/setting.component.ts new file mode 100644 index 0000000..061b570 --- /dev/null +++ b/src/packages/sensor/component/setting.1/setting.component.ts @@ -0,0 +1,159 @@ +import { Component, OnInit, Input, Inject, DoCheck, ViewEncapsulation, Output, EventEmitter, OnChanges } from '@angular/core'; +import { Target } from '@overflow/commons-typescript/model/target'; +import { Infra } from '@overflow/commons-typescript/model/infra'; +import { MetaCrawler } from '@overflow/commons-typescript/model/meta'; +import { MetaSensorDisplayItem } from '@overflow/commons-typescript/model/meta'; + +import { Store, select, StateObservable } from '@ngrx/store'; +import { RPCClientError } from '@loafer/ng-rpc/protocol'; +import * as SensorItemKeyListStore from 'packages/sensor-item/store/key-list'; +import { ReadSensorItemKeySelector } from 'packages/sensor-item/store'; +import { MetaSensorItemKey } from '@overflow/commons-typescript/model/meta'; +import { TreeNode } from 'primeng/primeng'; + +@Component({ + selector: 'of-sensor-setting', + templateUrl: './setting.component.html', + encapsulation: ViewEncapsulation.None +}) +export class SettingComponent implements OnInit, DoCheck, OnChanges { + + @Input() preTarget: Target; + @Output() close = new EventEmitter(); + @Input() visible; + + nextable = false; + selectedTarget: Target; + selectedCrawler: MetaCrawler; + credentialPassed: boolean; + selectedSensorDisplayItems: MetaSensorDisplayItem[]; + itemNodes: TreeNode[]; + step = 0; + page = 1; + + sensorItemKeys$: StateObservable; + + + constructor( + private keyListStore: Store + ) { + keyListStore.pipe(select(ReadSensorItemKeySelector.select('list'))); + } + + ngOnInit() { + this.step = this.preTarget ? 1 : 0; + // this.sensorItemKeys$.subscribe( + // (list: MetaSensorItemKey[]) => { + // if (list !== null) { + // console.log(list); + // } + // }, + // (error: RPCClientError) => { + // console.log(error.response.message); + // } + // ); + } + + ngOnChanges(changes) { + this.step = this.preTarget ? 1 : 0; + } + + ngDoCheck() { + try { + if ( + this.selectedTarget === null || + this.selectedCrawler === null || + this.itemNodes === null || + this.itemNodes.length === 0 || + !this.credentialPassed + ) { + this.nextable = false; + } else { + this.nextable = true; + } + } catch (exception) { + this.nextable = false; + } + } + + onCancel() { + this.page = 1; + this.step = 0; + this.visible = false; + this.nextable = false; + this.selectedTarget = null; + this.selectedCrawler = null; + this.credentialPassed = false; + this.selectedSensorDisplayItems = null; + this.close.emit(); + } + + onNext() { + this.page += 1; + } + + onPrev() { + this.page -= 1; + } + + onDone() { + this.selectedSensorDisplayItems = []; + for (const node of this.itemNodes) { + if (node.data && node.data !== undefined) { + this.selectedSensorDisplayItems.push(node.data); + } + } + console.log(this.selectedSensorDisplayItems); + } + + onTargetSelect(t: Target) { + this.selectedTarget = t; + this.step = 1; + } + onCrawlerSelect(c: MetaCrawler) { + this.selectedCrawler = c; + this.step = 2; + } + onCredentialPass(b: boolean) { + if (!b) { + return; + } + this.credentialPassed = b; + this.step = 3; + } + onItemsSelect(nodes: TreeNode[]) { + this.itemNodes = nodes; + } + + onTabOpen(event) { + this.step = event.index; + } + + getTitle(index) { + if (index === 0 && this.preTarget) { + return this.preTarget.displayName; + } + let title = ''; + switch (index) { + case 0: + title = this.selectedTarget && this.step !== index ? + this.selectedTarget.displayName : + 'Choose a Target to monitor.'; + break; + case 1: + title = this.selectedCrawler && this.step !== index ? + this.selectedCrawler.name : + 'Choose a Crawler.'; + break; + case 2: + title = this.credentialPassed && this.step !== index ? + 'Credentials test succeed.' : + 'Credentials'; + break; + case 3: + title = 'Choose Sensor Items.'; + break; + } + return title; + } +} diff --git a/src/packages/sensor/component/setting.1/target-selector/target-selector.component.html b/src/packages/sensor/component/setting.1/target-selector/target-selector.component.html new file mode 100644 index 0000000..1758fe1 --- /dev/null +++ b/src/packages/sensor/component/setting.1/target-selector/target-selector.component.html @@ -0,0 +1,11 @@ +
+ + +
+ +
{{ target.displayName }}
+
+
+
+
diff --git a/src/packages/sensor/component/setting.1/target-selector/target-selector.component.spec.ts b/src/packages/sensor/component/setting.1/target-selector/target-selector.component.spec.ts new file mode 100644 index 0000000..c13ee67 --- /dev/null +++ b/src/packages/sensor/component/setting.1/target-selector/target-selector.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TargetSelectorComponent } from './target-selector.component'; + +describe('FilterComponent', () => { + let component: TargetSelectorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TargetSelectorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TargetSelectorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/packages/sensor/component/setting.1/target-selector/target-selector.component.ts b/src/packages/sensor/component/setting.1/target-selector/target-selector.component.ts new file mode 100644 index 0000000..ba9ec54 --- /dev/null +++ b/src/packages/sensor/component/setting.1/target-selector/target-selector.component.ts @@ -0,0 +1,92 @@ +import { Component, OnInit, Output, EventEmitter, Input, AfterContentInit, OnChanges } from '@angular/core'; +import { Router } from '@angular/router'; +import { Target } from '@overflow/commons-typescript/model/target'; +import { RPCClientError } from '@loafer/ng-rpc/protocol'; +import { Domain } from '@overflow/commons-typescript/model/domain'; +import { AuthSelector } from 'packages/member/store'; +import * as ListStore from 'packages/infra/store/list'; +import { ListSelector } from 'packages/infra/store'; +import { Store, select } from '@ngrx/store'; +import { Page, PageParams } from 'app/commons/model'; +import { SelectItem } from 'primeng/primeng'; + +@Component({ + selector: 'of-target-selector', + templateUrl: './target-selector.component.html', +}) +export class TargetSelectorComponent implements OnInit, OnChanges { + + targets$ = this.store.pipe(select(ListSelector.select('page'))); + + @Input() preTarget: Target = null; + @Input() visible; + @Output() targetSelected = new EventEmitter(); + targets: Target[] = null; + + constructor( + private router: Router, + private store: Store + ) { } + + ngOnInit() { + // this.targets$.subscribe( + // (page: Page) => { + // if (page !== null) { + // this.convertInfraToTarget(page); + // } + // }, + // (error: RPCClientError) => { + // console.log(error.response.message); + // } + // ); + } + + ngOnChanges(changes) { + this.targets = []; + if (this.preTarget === null) { + this.getTargetList(); + } else { + this.targets.push(this.preTarget); + this.targetSelected.emit(this.preTarget); + } + } + + convertInfraToTarget(page: Page) { + for (const infra of page.content) { + this.targets.push(infra.target); + } + } + + getTargetList() { + // this.store.select(AuthSelector.select('domain')).subscribe( + // (domain: Domain) => { + // const pageParams: PageParams = { + // pageNo: '0', + // countPerPage: '9999', + // sortCol: 'id', + // sortDirection: 'descending' + // }; + // this.store.dispatch(new ListStore.ReadAllByDomain({ domain, pageParams })); + // }, + // (error) => { + // console.log(error); + // } + // ); + + // Temporary data + for (let i = 0; i < 10; i++) { + const t: Target = { + id: i, + displayName: 'DisplayName' + i, + createDate: new Date(), + description: 'Description' + i, + }; + this.targets.push(t); + } + } + + onSelectionChange(event) { + this.targetSelected.emit(event.value[0]); + } + +} diff --git a/src/packages/sensor/component/setting/crawler-selector/crawler-selector.component.ts b/src/packages/sensor/component/setting/crawler-selector/crawler-selector.component.ts index 32742e1..f4a3c10 100644 --- a/src/packages/sensor/component/setting/crawler-selector/crawler-selector.component.ts +++ b/src/packages/sensor/component/setting/crawler-selector/crawler-selector.component.ts @@ -62,6 +62,9 @@ export class CrawlerSelectorComponent implements OnInit, OnChanges, AfterContent } onSelectionChange(event) { + // FIXME: 이미 해당 크롤러를 사용하는 센서가 있는지 확인해야 함 + // 있다면, 사용자에 알려주고 수정 모드로 변경 + // 기존 SensorDisplayItem 목록 조회 this.crawlerSelected.emit(event.value[0]); } } diff --git a/src/packages/sensor/component/setting/setting.component.ts b/src/packages/sensor/component/setting/setting.component.ts index 2e48998..bc96f72 100644 --- a/src/packages/sensor/component/setting/setting.component.ts +++ b/src/packages/sensor/component/setting/setting.component.ts @@ -4,7 +4,7 @@ import { Infra } from '@overflow/commons-typescript/model/infra'; import { MetaCrawler } from '@overflow/commons-typescript/model/meta'; import { MetaSensorDisplayItem } from '@overflow/commons-typescript/model/meta'; -import { Store, select } from '@ngrx/store'; +import { Store, select, StateObservable } from '@ngrx/store'; import { RPCClientError } from '@loafer/ng-rpc/protocol'; import * as SensorItemKeyListStore from 'packages/sensor-item/store/key-list'; import { ReadSensorItemKeySelector } from 'packages/sensor-item/store'; @@ -20,7 +20,8 @@ export class SettingComponent implements OnInit, DoCheck, OnChanges { @Input() preTarget: Target; @Output() close = new EventEmitter(); - @Input() visible; + @Input() visible: boolean; + @Input() editMode: boolean; nextable = false; selectedTarget: Target; @@ -31,12 +32,14 @@ export class SettingComponent implements OnInit, DoCheck, OnChanges { step = 0; page = 1; - sensorItemKeys$ = this.keyListStore.pipe(select(ReadSensorItemKeySelector.select('list'))); + sensorItemKeys$: StateObservable; constructor( - private keyListStore: Store, + private keyListStore: Store ) { + keyListStore.pipe(select(ReadSensorItemKeySelector.select('list'))); + this.editMode = true; } ngOnInit() {