import { Component, ViewChild, OnInit, Input, AfterContentInit, OnDestroy } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; import { Sensor } from 'packages/sensor/model'; import { Infra } from 'packages/infra/model'; import { Store, select } from '@ngrx/store'; import { DetailSelector as InfraDetailSelector } from 'packages/infra/store'; import * as InfraDetailStore from 'packages/infra/store/detail'; import { Subscription } from 'rxjs/Subscription'; import { RPCClientError } from '@loafer/ng-rpc/protocol'; import { sensorListSelector } from 'packages/sensor/store'; import * as SensorListStore from 'packages/sensor/store/list'; import { PageParams, Page } from 'app/commons/model'; import { ModifySelector } from 'packages/target/store'; import * as TargetModifyStore from 'packages/target/store/modify'; import { Target } from '../../model'; @Component({ selector: 'of-target-detail', templateUrl: './detail.component.html', }) export class DetailComponent implements OnInit, AfterContentInit, OnDestroy { infraSubscription$: Subscription; infra$ = this.infraDetailStore.pipe(select(InfraDetailSelector.select('infra'))); sensorsSubscription$: Subscription; sensors$ = this.sensorListStore.pipe(select(sensorListSelector.select('page'))); target$ = this.targetModifyStore.pipe(select(ModifySelector.select('target'))); infraId = null; infra: Infra; sensors: Sensor[]; sensorsCount = 0; sensorSettingDisplay = false; pageSize = '10'; totalLength = 0; currPage = 0; constructor( private router: Router, private route: ActivatedRoute, private infraDetailStore: Store, private sensorListStore: Store, private targetModifyStore: Store ) { } ngOnInit() { this.infraSubscription$ = this.infra$.subscribe( (infra: Infra) => { this.infra = infra; }, (error: RPCClientError) => { console.log(error.response.message); } ); this.sensorsSubscription$ = this.sensors$.subscribe( (page: Page) => { if (page) { this.sensorsCount = page.totalElements; this.sensors = page.content; } }, (error: RPCClientError) => { console.log(error.response.message); } ); } ngAfterContentInit() { this.infraId = this.route.snapshot.paramMap.get('id'); this.getInfra(); this.getSensors(this.currPage); } ngOnDestroy() { if (this.infraSubscription$) { this.infraSubscription$.unsubscribe(); } } getInfra() { this.infraDetailStore.dispatch( new InfraDetailStore.Read( { id: this.infraId } ) ); } getSensors(pageIndex) { const pageParams: PageParams = { pageNo: pageIndex + '', countPerPage: this.pageSize, sortCol: 'id', sortDirection: 'descending' }; this.sensorListStore.dispatch( new SensorListStore.ReadAllByInfra( { id: this.infraId, pageParams: pageParams } ) ); } onAddSensor() { this.sensorSettingDisplay = true; } onSensorSettingClose() { this.sensorSettingDisplay = false; } onPaging(e) { this.getSensors(e.page); } onRowSelect(event) { this.router.navigate(['sensor', event.data.id, 'info']); } onTraceroute() { alert('지원 예정'); } onDisplayNameChange(value: string) { if (value === this.infra.target.displayName) { return; } const target = this.infra.target; target.displayName = value; this.targetModifyStore.dispatch( new TargetModifyStore.Modify(target) ); const modifySuccessSubscription$: Subscription = this.target$.subscribe( (t: Target) => { if (t) { } if (modifySuccessSubscription$) { modifySuccessSubscription$.unsubscribe(); } }, (error: RPCClientError) => { console.log(error); } ); } onDisplayNameChangeKeypress(event, value) { if (event.key === 'Enter') { this.onDisplayNameChange(value); } } }