Merge remote-tracking branch 'origin/master'

# Conflicts:
#	@overflow/member/container/index.ts
This commit is contained in:
geek 2018-05-28 19:28:55 +09:00
commit fada7b057a
43 changed files with 279 additions and 363 deletions

View File

@ -2,14 +2,14 @@
<!-- <div class="ui-g-12">
<p-panel [showHeader]="false" >Temp Area</p-panel>
</div> -->
<div class="ui-g">
<div class="ui-g-12 ui-md-3">
<p-accordion (onClose)="onTabClose($event)" (onOpen)="OnTabOpen($event)">
<p-accordionTab header="Probe Select Area" [selected]="true">
<of-probe-selector
[preProbe]="probeHosts"
(probeSelected)="onSelectedProbe($event)"
></of-probe-selector>
<!-- <of-probe-selector
[preProbe]="selectedProbeHost"
[probeHosts]="probeHosts"></of-probe-selector> -->
</p-accordionTab>
<p-accordionTab header="Discovery Search Config Area" >
<of-discovery-search-config

View File

@ -2,7 +2,7 @@ import {
AfterContentInit, Component, Input,
OnInit
} from '@angular/core';
import {Probe} from '@overflow/commons-typescript/model/probe';
import { Probe, ProbeHost } from '@overflow/commons-typescript/model/probe';
@Component({
selector: 'of-discovery',
@ -10,16 +10,19 @@ import {Probe} from '@overflow/commons-typescript/model/probe';
})
export class DiscoveryComponent implements OnInit, AfterContentInit {
@Input() probeHosts;
@Input() probeHostID: number;
private tabIdx: number;
selectedProbe: Probe;
selectedProbeHost: ProbeHost;
constructor(
) {
}
ngOnInit() {
// if (this.probeHostID) {
// this.selectedProbeHost = this.probeHosts.find(probeHost => probeHost.id === this.probeHostID);
// }
}
ngAfterContentInit() {
@ -43,7 +46,7 @@ export class DiscoveryComponent implements OnInit, AfterContentInit {
onSelectedProbe(probe) {
console.log(probe);
this.selectedProbe = probe;
// this.selectedProbe = probe;
}
onProbeSelect(probe) {

View File

@ -1,9 +0,0 @@
<div *ngIf="!preProbe">
<p-dropdown #dropdown [options]="probes"
optionLabel="displayName"
placeholder="Select a Probe"
[(ngModel)]="selected"
(onChange)="onProbeSelect($event)"
[style]="{'width':'100%'}">
</p-dropdown>
</div>

View File

@ -1,59 +0,0 @@
import {
Component, OnInit, Input, AfterContentInit, Output,
EventEmitter, OnDestroy, ViewChild
} from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import {Probe, ProbeHost} from '@overflow/commons-typescript/model/probe';
@Component({
selector: 'of-probe-selector',
templateUrl: './probe-selector.component.html',
})
export class ProbeSelectorComponent implements OnInit, AfterContentInit, OnDestroy {
@Input() preProbe: ProbeHost;
probes: Probe[];
selected: Probe;
@Output() probeSelected = new EventEmitter<Probe>();
constructor(
) {
}
ngOnInit() {
}
ngAfterContentInit() {
this.getProbes();
}
ngOnDestroy() {
this.selected = null;
this.probes = null;
}
getProbes() {
}
onProbeSelect(event) {
this.selected = event.value;
this.probeSelected.emit(this.selected);
}
registerOnChange(fn: any): void {
}
registerOnTouched(fn: any): void {
}
setDisabledState(isDisabled: boolean): void {
}
writeValue(obj: any): void {
}
}

View File

@ -1,4 +1,3 @@
import { ProbeSelectorComponent } from './discovery/probe-selector/probe-selector.component';
import { ServiceSelectorComponent } from './discovery/service-selector/service-selector.component';
import { DiscoveryComponent } from './discovery/discovery.component';
import { SearchConfigComponent } from './discovery/search-config/search-config.component';
@ -8,7 +7,6 @@ import { IpInputComponent } from './discovery/search-config/ip-input.component';
export const COMPONENTS = [
ServiceSelectorComponent,
ProbeSelectorComponent,
DiscoveryComponent,
SearchConfigComponent,
SearchFilterComponent,

View File

@ -1 +1,2 @@
<of-discovery [probeHosts]="probeHosts$ | async"></of-discovery>
<of-probe-selector-container [probeHostID]="probeHostID"></of-probe-selector-container>
<of-discovery [probeHostID]="probeHostID"></of-discovery>

View File

@ -1,53 +1,19 @@
import {
AfterContentInit, Component, Input,
OnInit
Component,
Input,
} from '@angular/core';
import { select, Store} from '@ngrx/store';
import { ActivatedRoute } from '@angular/router';
import { Probe, ProbeHost } from '@overflow/commons-typescript/model/probe';
import { AuthSelector } from '@overflow/member/store';
import { Domain } from '@overflow/commons-typescript/model/domain';
import * as ProbeEntityStore from '@overflow/probe/store/entity/probe';
import {Observable} from 'rxjs';
import { ProbeEntitySelector } from '@overflow/probe/store';
@Component({
selector: 'of-discovery-container',
templateUrl: './discovery-container.component.html',
})
export class DiscoveryContainerComponent implements OnInit, AfterContentInit {
export class DiscoveryContainerComponent {
// probe select ?
// get probe list for server
// discovery start
// discovery stop
// get service list
@Input() hostID;
probeHosts$: Observable<Probe[]>;
selectProbes?: Probe[];
@Input() probeHostID;
constructor(
private activatedRoute: ActivatedRoute,
private store: Store<ProbeEntityStore.State>
) {
this.probeHosts$ = store.pipe(select(ProbeEntitySelector.selectAll));
}
ngOnInit() {
this.store.select(AuthSelector.select('domain')).subscribe(
(domain: Domain) => {
this.store.dispatch(new ProbeEntityStore.ReadAllByDomainID(domain.id));
},
(error) => {
console.log(error);
}
);
}
ngAfterContentInit() {
}
}

View File

@ -11,6 +11,7 @@ import { SERVICES } from './service';
import { PrimeNGModules } from '@overflow/commons/prime-ng/prime-ng.module';
import { KeyValueModule } from '@overflow/commons/component/key-value/key-value.module';
import { CONTAINER_COMPONENTS } from './container';
import { ProbeModule } from '../probe/probe.module';
@NgModule({
imports: [
@ -21,7 +22,8 @@ import { CONTAINER_COMPONENTS } from './container';
DiscoveryStoreModule,
DiscoveryRPCModule,
DiscoveryLoggerModule,
KeyValueModule
KeyValueModule,
ProbeModule
],
declarations: [
COMPONENTS,

View File

@ -8,4 +8,5 @@ export const CONTAINERS = [
MemberSignupContainerComponent,
MemberTermsContainerComponent,
MemberTotpContainerComponent,
// MemberSignupContainerComponent,
];

View File

@ -1,9 +1,11 @@
import { ProbeDetailComponent } from './detail/detail.component';
import { ProbeListComponent } from './list/list.component';
import { ProbeDownloadComponent } from './download/download.component';
import { ProbeSelectorComponent } from './selector/selector.component';
export const COMPONENTS = [
ProbeListComponent,
ProbeDetailComponent,
ProbeDownloadComponent,
ProbeSelectorComponent,
];

View File

@ -0,0 +1 @@
<p-dropdown *ngIf="probeHosts.length > 0" [options]="options" [(ngModel)]="selected" optionLabel="displayName" placeholder="Select a Probe"></p-dropdown>

View File

@ -0,0 +1,29 @@
import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
import { ProbeHost, Probe } from '@overflow/commons-typescript/model/probe';
@Component({
selector: 'of-probe-selector',
templateUrl: './selector.component.html',
})
export class ProbeSelectorComponent implements OnChanges {
@Output() select = new EventEmitter<ProbeHost>();
@Input() probeHosts: ProbeHost[];
@Input() probeHostID: number;
options: Probe[];
constructor() {
}
ngOnChanges(changes: SimpleChanges): void {
this.options = [];
for (const ph of this.probeHosts) {
this.options.push(ph.probe);
}
}
onProbeSelect(event) {
this.select.emit(event.data);
}
}

View File

@ -1,7 +1,9 @@
import { ProbeListContainerComponent } from '../container/probe-list-container.component';
import { ProbeDetailContainerComponent } from '../container/probe-detail-container.component';
import { ProbeSelectorContainerComponent } from './probe-selector-container.component';
export const CONTAINER_COMPONENTS = [
ProbeListContainerComponent,
ProbeDetailContainerComponent,
ProbeSelectorContainerComponent
];

View File

@ -1,9 +1,9 @@
import { Component, OnInit, Input, Output, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
import { Observable } from 'rxjs';
import { ProbeHost, Probe } from '@overflow/commons-typescript/model/probe';
import { ProbeHost } from '@overflow/commons-typescript/model/probe';
import { Store, select } from '@ngrx/store';
import * as ProbeStore from '../store/entity/probe';
import { ProbeEntitySelector, ProbeDetailContainerSelector } from '../store';
import { ProbeDetailContainerSelector } from '../store';
import { ActivatedRoute } from '@angular/router';
@Component({
@ -19,15 +19,15 @@ export class ProbeDetailContainerComponent implements OnInit, OnChanges {
error$: Observable<any>;
constructor(
private store: Store<ProbeStore.State>,
private store: Store<any>,
private route: ActivatedRoute,
) {
this.pending$ = this.store.pipe(select(ProbeDetailContainerSelector.selectPending));
this.error$ = this.store.pipe(select(ProbeEntitySelector.selectError));
}
ngOnInit() {
this.probeHost$ = this.store.pipe(select(ProbeEntitySelector.selectOne(this.probeHostID)));
this.pending$ = this.store.pipe(select(ProbeDetailContainerSelector.selectPending));
this.error$ = this.store.pipe(select(ProbeDetailContainerSelector.selectError));
this.probeHost$ = this.store.pipe(select(ProbeDetailContainerSelector.selectOne(this.probeHostID)));
}
ngOnChanges(changes: SimpleChanges): void {

View File

@ -3,9 +3,9 @@ import { ProbeHost } from '@overflow/commons-typescript/model/probe';
import { Observable } from 'rxjs';
import { Store, select } from '@ngrx/store';
import * as ProbeEntityStore from '../store/entity/probe';
import { ProbeEntitySelector, ProbeListContainerSelector } from '../store';
import { AuthSelector } from '@overflow/member/store';
import { Domain } from '@overflow/commons-typescript/model/domain';
import { ProbeListContainerSelector } from '../store';
import { AuthContainerSelector } from '../../shared/auth/store';
import { DomainMember } from '@overflow/commons-typescript/model/domain';
@Component({
selector: 'of-probe-list-container',
@ -15,22 +15,20 @@ export class ProbeListContainerComponent implements OnInit {
probeHosts$: Observable<ProbeHost[]>;
pending$: Observable<boolean>;
error$: Observable<any>;
@Output() select = new EventEmitter();
constructor(
private store: Store<ProbeEntityStore.State>,
private store: Store<any>,
) {
this.probeHosts$ = store.pipe(select(ProbeEntitySelector.selectAll));
this.pending$ = store.pipe(select(ProbeListContainerSelector.selectPending));
}
ngOnInit() {
this.store.select(AuthSelector.select('domain')).subscribe(
(domain: Domain) => {
this.store.dispatch(new ProbeEntityStore.ReadAllByDomainID(domain.id));
},
(error) => {
console.log(error);
this.probeHosts$ = this.store.pipe(select(ProbeListContainerSelector.selectAll));
this.pending$ = this.store.pipe(select(ProbeListContainerSelector.selectPending));
this.store.select(AuthContainerSelector.selectDomainMember).subscribe(
(domainMember: DomainMember) => {
this.store.dispatch(new ProbeEntityStore.ReadAllByDomainID(domainMember.domain.id));
}
);
}

View File

@ -0,0 +1 @@
<of-probe-selector (select)="onSelect($event)" [probeHosts]="probeHosts$ | async" [probeHostID]="probeHostID"></of-probe-selector>

View File

@ -0,0 +1,39 @@
import { Component, EventEmitter, Output, OnInit, Input } from '@angular/core';
import { ProbeHost, Probe } from '@overflow/commons-typescript/model/probe';
import { Observable } from 'rxjs';
import { Store, select } from '@ngrx/store';
import * as ProbeEntityStore from '@overflow/probe/store/entity/probe';
import { ProbeListContainerSelector } from '@overflow/probe/store';
import { AuthContainerSelector } from '@overflow/shared/auth/store';
import { DomainMember } from '@overflow/commons-typescript/model/domain';
@Component({
selector: 'of-probe-selector-container',
templateUrl: './probe-selector-container.component.html',
})
export class ProbeSelectorContainerComponent implements OnInit {
probeHosts$: Observable<ProbeHost[]>;
@Output() select = new EventEmitter();
@Input() probeHostID: number;
constructor(
private store: Store<any>,
) {
}
ngOnInit() {
this.probeHosts$ = this.store.pipe(select(ProbeListContainerSelector.selectAll));
this.store.select(AuthContainerSelector.selectDomainMember).subscribe(
(domainMember: DomainMember) => {
this.store.dispatch(new ProbeEntityStore.ReadAllByDomainID(domainMember.domain.id));
}
);
}
onSelect(probeHost: ProbeHost) {
alert(probeHost.probe.displayName);
// this.select.emit(probeHost);
}
}

View File

@ -7,7 +7,6 @@ import { ProbeStoreModule } from './probe-store.module';
import { SERVICES } from './service';
import { PrimeNGModules } from '../commons/prime-ng/prime-ng.module';
import { FormsModule } from '@angular/forms';
import { DiscoveryModule } from '@overflow/discovery/discovery.module';
import { MetaCrawlerModule } from '@overflow/meta/crawler/crawler.module';
import { KeyValueModule } from '@overflow/commons/component/key-value/key-value.module';
@ -17,7 +16,6 @@ import { KeyValueModule } from '@overflow/commons/component/key-value/key-value.
PrimeNGModules,
ProbeStoreModule,
FormsModule,
DiscoveryModule,
KeyValueModule,
MetaCrawlerModule
],

View File

@ -2,6 +2,7 @@ import { ActionType, Actions } from '../../entity/probe';
import {
State,
initialState,
probeListContainerAdapter
} from './probe-detail.state';
import { Probe } from '@overflow/commons-typescript/model/probe';
@ -16,17 +17,11 @@ export function reducer(state = initialState, action: Actions): State {
}
case ActionType.ReadSuccess: {
return {
...state,
pending: false,
};
return probeListContainerAdapter.setOne(action.payload, {...state, pending: false});
}
case ActionType.ReadFailure: {
return {
...state,
pending: true,
};
return probeListContainerAdapter.setError(action.payload, {...state, pending: false});
}
default: {

View File

@ -1,15 +1,19 @@
import { RPCClientError } from '@loafer/ng-rpc';
import { ProbeHost } from '@overflow/commons-typescript/model/probe';
import { Selector, createSelector } from '@ngrx/store';
import { createEntityAdapter, EntityState } from '@loafer/ng-entity';
export interface State {
export const probeListContainerAdapter = createEntityAdapter<ProbeHost, RPCClientError>();
export interface State extends EntityState<ProbeHost, RPCClientError> {
pending: boolean;
}
export const initialState: State = {
export const initialState: State = probeListContainerAdapter.getInitialState({
pending: false,
};
});
export function getSelectors<S>(selector: Selector<any, State>) {
return {
...probeListContainerAdapter.getSelectors(selector),
selectPending: createSelector(selector, (state: State) => state.pending),
};
}

View File

@ -2,6 +2,7 @@ import { ActionType, Actions } from '../../entity/probe';
import {
State,
initialState,
probeListContainerAdapter
} from './probe-list.state';
import { Probe } from '@overflow/commons-typescript/model/probe';
@ -16,17 +17,11 @@ export function reducer(state = initialState, action: Actions): State {
}
case ActionType.ReadAllByDomainIDSuccess: {
return {
...state,
pending: false,
};
return probeListContainerAdapter.setAll(action.payload, {...state, pending: false});
}
case ActionType.ReadAllByDomainIDFailure: {
return {
...state,
pending: true,
};
return probeListContainerAdapter.setError(action.payload, {...state, pending: false});
}
default: {

View File

@ -1,15 +1,21 @@
import { RPCClientError } from '@loafer/ng-rpc';
import { ProbeHost } from '@overflow/commons-typescript/model/probe';
import { Selector, createSelector } from '@ngrx/store';
import { createEntityAdapter, EntityState } from '@loafer/ng-entity';
export interface State {
export const probeListContainerAdapter = createEntityAdapter<ProbeHost, RPCClientError>();
export interface State extends EntityState<ProbeHost, RPCClientError> {
pending: boolean;
}
export const initialState: State = {
export const initialState: State = probeListContainerAdapter.getInitialState({
pending: false,
};
});
export function getSelectors<S>(selector: Selector<any, State>) {
return {
...probeListContainerAdapter.getSelectors(selector),
selectPending: createSelector(selector, (state: State) => state.pending),
};
}

View File

@ -1,4 +1,2 @@
export * from './probe.action';
export * from './probe.effect';
export * from './probe.reducer';
export * from './probe.state';

View File

@ -1,65 +0,0 @@
import {
ActionType,
Actions,
} from './probe.action';
import {
State,
initialState,
probeAdapter,
} from './probe.state';
import { Probe } from '@overflow/commons-typescript/model/probe';
export function reducer(state = initialState, action: Actions): State {
switch (action.type) {
case ActionType.ReadAllByDomainID: {
return {
...state,
error: null,
};
}
case ActionType.ReadAllByDomainIDSuccess: {
return probeAdapter.setAll(action.payload, state);
}
case ActionType.ReadAllByDomainIDFailure: {
return probeAdapter.setError(action.payload, state);
}
case ActionType.Read: {
return {
...state,
error: null,
};
}
case ActionType.ReadSuccess: {
return probeAdapter.setOne(action.payload, state);
}
case ActionType.ReadFailure: {
return probeAdapter.setError(action.payload, state);
}
case ActionType.Modify: {
return {
...state,
error: null,
};
}
case ActionType.ModifySuccess: {
return probeAdapter.upsertOne(action.payload, state);
}
case ActionType.ModifyFailure: {
return probeAdapter.setError(action.payload, state);
}
default: {
return state;
}
}
}

View File

@ -1,14 +0,0 @@
import { RPCClientError } from '@loafer/ng-rpc';
import { ProbeHost } from '@overflow/commons-typescript/model/probe';
import { Selector, createSelector } from '@ngrx/store';
import { createEntityAdapter, EntityState } from '@loafer/ng-entity';
export const probeAdapter = createEntityAdapter<ProbeHost, RPCClientError>();
export interface State extends EntityState<ProbeHost, RPCClientError> {
}
export const initialState: State = probeAdapter.getInitialState();
export function getSelectors<S>(selector: Selector<any, State>) {
return probeAdapter.getSelectors(selector);
}

View File

@ -13,13 +13,11 @@ import * as ProbeListContainerStore from './container/probe-list';
import * as ProbeDetailContainerStore from './container/probe-detail';
export interface State {
probe: ProbeEntityStore.State;
probe_list_container: ProbeListContainerStore.State;
probe_detail_container: ProbeDetailContainerStore.State;
}
export const REDUCERS = {
probe: ProbeEntityStore.reducer,
probe_list_container: ProbeListContainerStore.reducer,
probe_detail_container: ProbeDetailContainerStore.reducer
};
@ -30,11 +28,6 @@ export const EFFECTS = [
export const selectState = createFeatureSelector<State>(MODULE.name);
export const ProbeEntitySelector = ProbeEntityStore.getSelectors(createSelector(
selectState,
(state: State) => state.probe
));
export const ProbeListContainerSelector = ProbeListContainerStore.getSelectors(createSelector(
selectState,
(state: State) => state.probe_list_container

View File

@ -1,4 +1,5 @@
<div *ngIf="sensor">
SENSOR_DETAIL_COMPONENT
<!-- <div *ngIf="sensor">
<h1>{{sensor.crawler.name}}</h1>
<div class="ui-g">
@ -52,4 +53,4 @@
</div>
<p-confirmDialog header="Confirmation" icon="fa ui-icon-warning" width="425"></p-confirmDialog>
</div>
-->

View File

@ -77,7 +77,7 @@
<div class="ui-g-10">
<div *ngFor="let sensor of item.sensors" class="ui-g-12">
<i class="fa ui-icon-stop ui-status-icon ui-status-warn"></i>
<a href="javascript:void(0)" (click)="onSensorClick(sensor)">{{sensor.crawler.name}} | {{sensor.itemCount}} items | {{sensor.status.name}}</a>
<a href="javascript:void(0)" (click)="select.emit(sensor)">{{sensor.crawler.name}} | {{sensor.itemCount}} items | {{sensor.status.name}}</a>
</div>
</div>
<div class="ui-g-2" style="text-align: center !important">

View File

@ -11,6 +11,7 @@ export class SensorListComponent implements OnChanges {
@Input() page: Page<Sensor>;
@Output() addSensor = new EventEmitter();
@Output() select = new EventEmitter<Sensor>();
totalLength: number;
targetSensors: Object;

View File

@ -1 +1 @@
<of-sensor-list [page]="page$ | async" (addSensor)="addSensor.emit($event)"></of-sensor-list>
<of-sensor-list [page]="page$ | async" (addSensor)="addSensor.emit($event)" (select)="select.emit($event)"></of-sensor-list>

View File

@ -6,55 +6,60 @@ import {
RouterStateSnapshot,
Router,
} from '@angular/router';
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/take';
import 'rxjs/add/operator/map';
import { Store, select } from '@ngrx/store';
import { Observable } from 'rxjs';
import { map, take } from 'rxjs/operators';
import { CookieService } from 'ngx-cookie-service';
import * as AuthStore from '@overflow/member/store/auth';
import { AuthSelector } from '@overflow/member/store';
import { AuthContainerSelector } from '@overflow/shared/auth/store';
import * as MemberEntityStore from '@overflow/member/store/entity/member';
import * as SigninContaifnerStore from '../store/container/signin';
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(
private store: Store<AuthStore.State>,
private store: Store<any>,
private router: Router,
private cookieService: CookieService,
) { }
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.store
.select(AuthSelector.select('signined'))
.map(signined => {
return this.store.pipe(
select(AuthContainerSelector.selectSignined),
map(signined => {
if (!signined) {
if (this.cookieService.check('authToken')) {
this.store.dispatch(new AuthStore.SigninCookie({authToken: this.cookieService.get('authToken'), returnURL: state.url}));
this.store.dispatch(new MemberEntityStore.SigninCookie({authToken: this.cookieService.get('authToken'), returnURL: state.url}));
} else {
// this.store.dispatch(new AuthStore.SigninRedirect(state.url));
this.router.navigateByUrl(state.url);
this.store.dispatch(new SigninContaifnerStore.SigninRedirect({returnURL: state.url}));
}
return false;
}
return true;
})
.take(1);
}),
take(1)
);
}
canActivateChild(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.store
.select(AuthSelector.select('signined'))
.map(signined => {
return this.store.pipe(
select(AuthContainerSelector.selectSignined),
map(signined => {
if (!signined) {
this.store.dispatch(new AuthStore.SigninRedirect(state.url));
if (this.cookieService.check('authToken')) {
this.store.dispatch(new MemberEntityStore.SigninCookie({authToken: this.cookieService.get('authToken'), returnURL: state.url}));
} else {
this.store.dispatch(new SigninContaifnerStore.SigninRedirect({returnURL: state.url}));
}
return false;
}
return true;
})
.take(1);
}),
take(1)
);
}
}

View File

@ -0,0 +1,15 @@
import { Action } from '@ngrx/store';
export enum ActionType {
SigninRedirect = '[app.signin] SigninRedirect',
}
export class SigninRedirect implements Action {
readonly type = ActionType.SigninRedirect;
constructor(public payload: {returnURL: string}) {}
}
export type Actions =
| SigninRedirect
;

View File

@ -1,8 +1,8 @@
import { TestBed, inject } from '@angular/core/testing';
import { Effects } from './signin-init.effect';
import { Effects } from './app-signin.effect';
describe('SigninInit.Effects', () => {
describe('app-signin-container.Effects', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [Effects]

View File

@ -0,0 +1,72 @@
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Effect, Actions, ofType } from '@ngrx/effects';
import { map, tap } from 'rxjs/operators';
import { CookieService } from 'ngx-cookie-service';
import { RPCService } from '@loafer/ng-rpc';
import {
SigninSuccess,
SigninCookieSuccess,
ActionType as AuthActionType,
} from '@overflow/shared/auth/store/container/auth';
import {
SigninRedirect,
ActionType,
} from './app-signin.action';
import { DomainMember } from '@overflow/commons-typescript/model/domain';
@Injectable()
export class Effects {
constructor(
private actions$: Actions,
private rpcService: RPCService,
private cookieService: CookieService,
private router: Router
) { }
@Effect({ dispatch: false })
signinSuccess$ = this.actions$.pipe(
ofType(AuthActionType.SigninSuccess),
map((action: SigninSuccess) => action.payload),
tap((info: {authToken: string, domainMember: DomainMember, returnURL: string}) => {
const expires = new Date();
expires.setDate(expires.getDate() + 1);
this.cookieService.set('authToken', info.authToken, expires, '/');
const queryString = `authToken=${info.authToken}`;
this.rpcService.connect(queryString);
this.router.navigateByUrl(info.returnURL);
})
);
@Effect({ dispatch: false })
signinCookieSuccess$ = this.actions$.pipe(
ofType(AuthActionType.SigninCookieSuccess),
map((action: SigninCookieSuccess) => action.payload),
tap((info: {domainMember: DomainMember, returnURL: string}) => {
const authToken = this.cookieService.get('authToken');
const queryString = `authToken=${authToken}`;
this.rpcService.connect(queryString);
this.router.navigateByUrl(info.returnURL);
})
);
@Effect({ dispatch: false })
signinRedirect$ = this.actions$.pipe(
ofType(ActionType.SigninRedirect),
map((action: SigninRedirect) => action.payload),
tap((info: {returnURL: string}) => {
this.router.navigate(['/auth/signin'], {queryParams: {returnURL: info.returnURL}});
})
);
}

View File

@ -0,0 +1,2 @@
export * from './app-signin.action';
export * from './app-signin.effect';

View File

@ -1,6 +1,6 @@
import { ActionReducerMap } from '@ngrx/store';
import * as SigninInitStore from './signin-init';
import * as SigninContainerStore from './container/signin';
export interface State {
}
@ -9,5 +9,5 @@ export const REDUCERS: ActionReducerMap<State> = {
};
export const EFFECTS = [
SigninInitStore.Effects,
SigninContainerStore.Effects,
];

View File

@ -1 +0,0 @@
export * from './signin-init.effect';

View File

@ -1,68 +0,0 @@
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Effect, Actions, ofType } from '@ngrx/effects';
import { Action } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/exhaustMap';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/take';
import { CookieService } from 'ngx-cookie-service';
import { RPCService } from '@loafer/ng-rpc';
import {
SigninSuccess,
SigninCookieSuccess,
ActionType,
} from '@overflow/member/store/auth';
@Injectable()
export class Effects {
constructor(
private actions$: Actions,
private rpcService: RPCService,
private cookieService: CookieService,
) { }
@Effect({ dispatch: false })
signinSuccess$ = this.actions$
.ofType(ActionType.SigninSuccess)
.map((action: SigninSuccess) => action.payload)
.do(
(result) => {
const authToken = result.authToken;
// console.log(`authToken: ${authToken}`);
const expires = new Date();
expires.setDate(expires.getDate() + 1);
this.cookieService.set('authToken', authToken, expires, '/');
const queryString = `authToken=${authToken}`;
this.rpcService.connect(queryString);
}
);
@Effect({ dispatch: false })
signinCookieSuccess$ = this.actions$
.ofType(ActionType.SigninCookieSuccess)
.map((action: SigninCookieSuccess) => action.payload)
.do(
(result) => {
const authToken = this.cookieService.get('authToken');
// console.log(`authToken: ${authToken}`);
const queryString = `authToken=${authToken}`;
this.rpcService.connect(queryString);
}
);
}

View File

@ -3,7 +3,7 @@
<div class="ui-g-12">
<div class="card no-margin">
<!--<of-discovery></of-discovery>-->
<of-discovery-container (hostID)="hostId"></of-discovery-container>
<of-discovery-container [probeHostID]="probeHostID"></of-discovery-container>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@ import { ActivatedRoute } from '@angular/router';
})
export class DiscoveryPageComponent implements OnInit {
hostId: number;
probeHostID: number;
constructor(
private route: ActivatedRoute
@ -15,8 +15,7 @@ export class DiscoveryPageComponent implements OnInit {
ngOnInit() {
this.route.params.subscribe((params: any) => {
this.hostId = params['probeHostID'];
// console.log('probeHostID : ' + probeHostID);
this.probeHostID = params['probeHostID'];
});
}
}

View File

@ -2,7 +2,6 @@ import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { NoAuthProbePageComponent } from './noauth-probe-page.component';
import { ProbeListComponent } from '@overflow/probe/component/list/list.component';
import { NoAuthProbeListComponent } from '@overflow/noauth-probe/component/list/list.component';
import { ProbeDownloadComponent } from '@overflow/probe/component/download/download.component';
const routes: Routes = [

View File

@ -1,8 +1,4 @@
<div *ngIf="!isDetail; else detailView">
<of-sensor-list-container *ngIf="router.url === '/sensor/list'" (select)="onSensorSelect($event)" (addSensor)="onAddSensor($event)"> </of-sensor-list-container>
<of-sensor-setting-container *ngIf="router.url === '/sensor/setting'"></of-sensor-setting-container>
</div>
<ng-template #detailView>
<of-sensor-detail-container></of-sensor-detail-container>
</ng-template>
<of-sensor-list-container *ngIf="containerType === 1" (select)="onSensorSelect($event)" (addSensor)="onAddSensor($event)">
</of-sensor-list-container>
<of-sensor-detail-container *ngIf="containerType === 2"></of-sensor-detail-container>
<of-sensor-setting-container *ngIf="containerType === 3"></of-sensor-setting-container>

View File

@ -4,13 +4,19 @@ import { Sensor } from '@overflow/commons-typescript/model/sensor';
import { BreadcrumbService } from '@app/commons/service/breadcrumb.service';
import { Target } from '@overflow/commons-typescript/model/target';
enum CONTAINER_TYPES {
List = 1,
Detail,
Setting,
}
@Component({
selector: 'of-pages-sensor',
templateUrl: './sensor-page.component.html',
})
export class SensorPageComponent {
isDetail: boolean;
containerType: CONTAINER_TYPES;
sensorID: string;
constructor(
@ -31,7 +37,11 @@ export class SensorPageComponent {
this.breadcrumbService.setItems([
{ label: 'Sensor', routerLink: ['/sensor/list'], }
]);
this.isDetail = false;
if (this.router.url === '/sensor/list') {
this.containerType = CONTAINER_TYPES.List;
} else {
this.containerType = CONTAINER_TYPES.Setting;
}
}
onDetailContainer(sensorID: string) {
@ -40,7 +50,7 @@ export class SensorPageComponent {
{ label: 'Sensor', routerLink: ['/sensor/list'] },
{ label: this.sensorID }
]);
this.isDetail = true;
this.containerType = CONTAINER_TYPES.Detail;
}
onSensorSelect(sensor: Sensor) {