From f357ea488f28b5fa00bab7b041059cc73699829b Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 5 Jul 2018 11:54:45 -0700 Subject: [PATCH] SHIBUI-580 Fixed issues with saving provider --- ui/src/app/metadata/domain/domain.module.ts | 4 +- .../domain/model/metadata-provider.ts | 10 +- .../metadata/domain/service/filter.service.ts | 32 +++++ .../domain/service/provider.service.ts | 22 ++-- .../filter/effect/collection.effect.ts | 13 +- .../provider/action/collection.action.ts | 112 ++++++++++++++++++ .../metadata/provider/action/entity.action.ts | 33 ------ .../container/provider-wizard.component.ts | 17 ++- .../provider/effect/collection.effect.ts | 55 +++++++++ .../model/file-backed-http.provider.form.ts | 19 ++- .../app/metadata/provider/provider.module.ts | 3 +- .../provider/reducer/collection.reducer.ts | 52 ++++++++ .../provider/reducer/entity.reducer.ts | 20 +--- ui/src/app/metadata/provider/reducer/index.ts | 23 +++- .../wizard/component/wizard.component.html | 2 +- .../filebacked-http-common.schema.json | 7 +- .../filebacked-http-filters.schema.json | 12 +- .../filebacked-http-reloading.schema.json | 12 +- .../provider/metadata-provider.schema.json | 2 +- 19 files changed, 354 insertions(+), 96 deletions(-) create mode 100644 ui/src/app/metadata/domain/service/filter.service.ts create mode 100644 ui/src/app/metadata/provider/action/collection.action.ts create mode 100644 ui/src/app/metadata/provider/effect/collection.effect.ts create mode 100644 ui/src/app/metadata/provider/reducer/collection.reducer.ts diff --git a/ui/src/app/metadata/domain/domain.module.ts b/ui/src/app/metadata/domain/domain.module.ts index 3349342d9..c51bbb260 100644 --- a/ui/src/app/metadata/domain/domain.module.ts +++ b/ui/src/app/metadata/domain/domain.module.ts @@ -12,6 +12,7 @@ import { EntityDraftService } from './service/draft.service'; import { MetadataProviderService } from './service/provider.service'; import { EntityEffects } from './effect/entity.effect'; import { PreviewDialogComponent } from './component/preview-dialog.component'; +import { MetadataFilterService } from './service/filter.service'; export const COMPONENTS = [ PreviewDialogComponent @@ -42,7 +43,8 @@ export class DomainModule { ListValuesService, ProviderStatusEmitter, ProviderValueEmitter, - MetadataProviderService + MetadataProviderService, + MetadataFilterService ] }; } diff --git a/ui/src/app/metadata/domain/model/metadata-provider.ts b/ui/src/app/metadata/domain/model/metadata-provider.ts index 3239bd4b0..4dc283368 100644 --- a/ui/src/app/metadata/domain/model/metadata-provider.ts +++ b/ui/src/app/metadata/domain/model/metadata-provider.ts @@ -1,16 +1,10 @@ import { MetadataBase, - Organization, - Contact, - MDUI, - SecurityInfo, - SsoService, - IdpSsoDescriptor, - LogoutEndpoint, - RelyingPartyOverrides } from '../model'; export interface MetadataProvider extends MetadataBase { name: string; '@type': string; + enabled: boolean; + resourceId: string; } diff --git a/ui/src/app/metadata/domain/service/filter.service.ts b/ui/src/app/metadata/domain/service/filter.service.ts new file mode 100644 index 000000000..b96907eca --- /dev/null +++ b/ui/src/app/metadata/domain/service/filter.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { MetadataFilter } from '../../domain/model'; + +@Injectable() +export class MetadataFilterService { + + readonly endpoint = '/MetadataResolvers'; + readonly base = '/api'; + + constructor( + private http: HttpClient + ) { } + query(): Observable { + return this.http.get(`${this.base}${this.endpoint}`, {}); + } + + find(id: string): Observable { + // console.log(id); + return this.http.get(`${this.base}${this.endpoint}/${id}`); + } + + update(filter: MetadataFilter): Observable { + return this.http.put(`${this.base}${this.endpoint}/${filter.id}`, filter); + } + + save(filter: MetadataFilter): Observable { + return this.http.post(`${this.base}${this.endpoint}`, filter); + } +} diff --git a/ui/src/app/metadata/domain/service/provider.service.ts b/ui/src/app/metadata/domain/service/provider.service.ts index 0644e4ab8..29cc32f36 100644 --- a/ui/src/app/metadata/domain/service/provider.service.ts +++ b/ui/src/app/metadata/domain/service/provider.service.ts @@ -2,31 +2,33 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { MetadataFilter } from '../../domain/model'; +import { MetadataProvider } from '../../domain/model'; +import { FileBackedHttpMetadataProvider } from '../model/providers'; @Injectable() export class MetadataProviderService { - readonly endpoint = '/MetadataResolver/incommon/Filters'; + readonly endpoint = '/MetadataResolvers'; readonly base = '/api'; constructor( private http: HttpClient ) {} - query(): Observable { - return this.http.get(`${this.base}${this.endpoint}`, {}); + query(): Observable { + return this.http.get(`${this.base}${this.endpoint}`, {}); } - find(id: string): Observable { + find(id: string): Observable { // console.log(id); - return this.http.get(`${this.base}${this.endpoint}/${id}`); + return this.http.get(`${this.base}${this.endpoint}/${id}`); } - update(filter: MetadataFilter): Observable { - return this.http.put(`${this.base}${this.endpoint}/${filter.id}`, filter); + update(provider: MetadataProvider): Observable { + return this.http.put(`${this.base}${this.endpoint}/${provider.id}`, provider); } - save(filter: MetadataFilter): Observable { - return this.http.post(`${this.base}${this.endpoint}`, filter); + save(provider: MetadataProvider): Observable { + const { metadataFilters, id, ...pruned } = provider as FileBackedHttpMetadataProvider; + return this.http.post(`${this.base}${this.endpoint}`, pruned); } } diff --git a/ui/src/app/metadata/filter/effect/collection.effect.ts b/ui/src/app/metadata/filter/effect/collection.effect.ts index da2a08a84..5422f2d99 100644 --- a/ui/src/app/metadata/filter/effect/collection.effect.ts +++ b/ui/src/app/metadata/filter/effect/collection.effect.ts @@ -9,11 +9,10 @@ import { switchMap, map, catchError, tap } from 'rxjs/operators'; import * as actions from '../action/collection.action'; import { FilterCollectionActionTypes } from '../action/collection.action'; import * as fromFilter from '../reducer'; - -import { MetadataProviderService } from '../../domain/service/provider.service'; import { MetadataFilter } from '../../domain/model'; import { removeNulls } from '../../../shared/util'; import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; +import { MetadataFilterService } from '../../domain/service/filter.service'; /* istanbul ignore next */ @Injectable() @@ -23,7 +22,7 @@ export class FilterCollectionEffects { loadFilters$ = this.actions$.pipe( ofType(FilterCollectionActionTypes.LOAD_FILTER_REQUEST), switchMap(() => - this.resolverService + this.filterService .query() .pipe( map(filters => new actions.LoadFilterSuccess(filters)), @@ -36,7 +35,7 @@ export class FilterCollectionEffects { ofType(FilterCollectionActionTypes.SELECT_FILTER), map(action => action.payload), switchMap(id => { - return this.resolverService + return this.filterService .find(id) .pipe( map(p => new actions.SelectFilterSuccess(p)), @@ -57,7 +56,7 @@ export class FilterCollectionEffects { }; }), switchMap(unsaved => - this.resolverService + this.filterService .save(unsaved as MetadataFilter) .pipe( map(saved => new actions.AddFilterSuccess(saved)), @@ -86,7 +85,7 @@ export class FilterCollectionEffects { switchMap(filter => { delete filter.modifiedDate; delete filter.createdDate; - return this.resolverService + return this.filterService .update(filter) .pipe( map(p => new actions.UpdateFilterSuccess({ @@ -113,7 +112,7 @@ export class FilterCollectionEffects { constructor( private actions$: Actions, private router: Router, - private resolverService: MetadataProviderService, + private filterService: MetadataFilterService, private store: Store ) { } } diff --git a/ui/src/app/metadata/provider/action/collection.action.ts b/ui/src/app/metadata/provider/action/collection.action.ts new file mode 100644 index 000000000..934fafa46 --- /dev/null +++ b/ui/src/app/metadata/provider/action/collection.action.ts @@ -0,0 +1,112 @@ +import { Action } from '@ngrx/store'; +import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { Update } from '@ngrx/entity'; + +export enum ProviderCollectionActionTypes { + FIND = '[Metadata Provider] Find', + SELECT_PROVIDER = '[Metadata Provider] Select Request', + SELECT_PROVIDER_SUCCESS = '[Metadata Provider] Select Success', + SELECT_PROVIDER_FAIL = '[Metadata Provider] Select Fail', + + UPDATE_PROVIDER_REQUEST = '[Metadata Provider] Update Request', + UPDATE_PROVIDER_SUCCESS = '[Metadata Provider] Update Success', + UPDATE_PROVIDER_FAIL = '[Metadata Provider] Update Fail', + + LOAD_PROVIDER_REQUEST = '[Metadata Provider Collection] Provider REQUEST', + LOAD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Provider SUCCESS', + LOAD_PROVIDER_ERROR = '[Metadata Provider Collection] Provider ERROR', + + ADD_PROVIDER_REQUEST = '[Metadata Provider Collection] Add Provider', + ADD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Add Provider Success', + ADD_PROVIDER_FAIL = '[Metadata Provider Collection] Add Provider Fail', + + REMOVE_PROVIDER_REQUEST = '[Metadata Provider Collection] Remove Provider Request', + REMOVE_PROVIDER_SUCCESS = '[Metadata Provider Collection] Remove Provider Success', + REMOVE_PROVIDER_FAIL = '[Metadata Provider Collection] Remove Provider Fail' +} + +export class LoadProviderRequest implements Action { + readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST; + + constructor() { } +} + +export class LoadProviderSuccess implements Action { + readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS; + + constructor(public payload: MetadataProvider[]) { } +} + +export class LoadProviderError implements Action { + readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_ERROR; + + constructor(public payload: any) { } +} + +export class UpdateProviderRequest implements Action { + readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST; + + constructor(public payload: MetadataProvider) { } +} + +export class UpdateProviderSuccess implements Action { + readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS; + + constructor(public payload: Update) { } +} + +export class UpdateProviderFail implements Action { + readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL; + + constructor(public payload: MetadataProvider) { } +} + +export class AddProviderRequest implements Action { + readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST; + + constructor(public payload: MetadataProvider) { } +} + +export class AddProviderSuccess implements Action { + readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS; + + constructor(public payload: MetadataProvider) { } +} + +export class AddProviderFail implements Action { + readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_FAIL; + + constructor(public payload: any) { } +} + +export class RemoveProviderRequest implements Action { + readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_REQUEST; + + constructor(public payload: MetadataProvider) { } +} + +export class RemoveProviderSuccess implements Action { + readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_SUCCESS; + + constructor(public payload: MetadataProvider) { } +} + +export class RemoveProviderFail implements Action { + readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_FAIL; + + constructor(public payload: MetadataProvider) { } +} + +export type ProviderCollectionActionsUnion = + | LoadProviderRequest + | LoadProviderSuccess + | LoadProviderError + | AddProviderRequest + | AddProviderSuccess + | AddProviderFail + | RemoveProviderRequest + | RemoveProviderSuccess + | RemoveProviderFail + | UpdateProviderRequest + | UpdateProviderSuccess + | UpdateProviderFail; diff --git a/ui/src/app/metadata/provider/action/entity.action.ts b/ui/src/app/metadata/provider/action/entity.action.ts index 12c2efa5f..84f7dbd4a 100644 --- a/ui/src/app/metadata/provider/action/entity.action.ts +++ b/ui/src/app/metadata/provider/action/entity.action.ts @@ -3,12 +3,7 @@ import { MetadataProvider } from '../../domain/model'; export enum EntityActionTypes { SELECT_PROVIDER = '[Provider Entity] Select Provider', - CREATE_PROVIDER = '[Provider Entity] Create Provider', UPDATE_PROVIDER = '[Provider Entity] Update Provider', - SAVE_PROVIDER_REQUEST = '[Provider Entity] Save Provider Request', - SAVE_PROVIDER_SUCCESS = '[Provider Entity] Save Provider Success', - SAVE_PROVIDER_FAIL = '[Provider Entity] Save Provider Fail', - CLEAR_PROVIDER = '[Provider Entity] Clear', RESET_CHANGES = '[Provider Entity] Reset Changes' } @@ -19,36 +14,12 @@ export class SelectProvider implements Action { constructor(public payload: MetadataProvider) { } } -export class CreateProvider implements Action { - readonly type = EntityActionTypes.CREATE_PROVIDER; - - constructor(public payload: MetadataProvider) { } -} - export class UpdateProvider implements Action { readonly type = EntityActionTypes.UPDATE_PROVIDER; constructor(public payload: Partial) { } } -export class SaveProviderRequest implements Action { - readonly type = EntityActionTypes.SAVE_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class SaveProviderSuccess implements Action { - readonly type = EntityActionTypes.SAVE_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class SaveProviderFail implements Action { - readonly type = EntityActionTypes.SAVE_PROVIDER_FAIL; - - constructor(public payload: Error) { } -} - export class ClearProvider implements Action { readonly type = EntityActionTypes.CLEAR_PROVIDER; } @@ -60,9 +31,5 @@ export class ResetChanges implements Action { export type EntityActionUnion = | SelectProvider | UpdateProvider - | SaveProviderRequest - | SaveProviderSuccess - | SaveProviderFail - | CreateProvider | ClearProvider | ResetChanges; diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.ts b/ui/src/app/metadata/provider/container/provider-wizard.component.ts index a9383bd64..ad042590b 100644 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.ts +++ b/ui/src/app/metadata/provider/container/provider-wizard.component.ts @@ -12,6 +12,7 @@ import { MetadataProvider } from '../../domain/model'; import { ClearProvider } from '../action/entity.action'; import { Router, ActivatedRoute } from '@angular/router'; import { map } from 'rxjs/operators'; +import { AddProviderRequest } from '../action/collection.action'; @Component({ @@ -32,6 +33,16 @@ export class ProviderWizardComponent implements OnDestroy { summary$: Observable<{ definition: Wizard, schema: { [id: string]: any }, model: any }>; + provider: MetadataProvider; + + namesList: string[] = []; + + validators = { + '/name': (value, property, form) => { + return this.namesList.indexOf(value) > -1 ? { 'name': { 'expectedValue': 'unique' } } : null; + } + }; + constructor( private store: Store, private router: Router, @@ -62,6 +73,10 @@ export class ProviderWizardComponent implements OnDestroy { ).pipe( map(([ definition, schema, model ]) => ({ definition, schema, model })) ); + + this.changes$.subscribe(c => this.provider = c); + + this.store.select(fromProvider.getProviderNames).subscribe(list => this.namesList = list); } ngOnDestroy() { @@ -81,7 +96,7 @@ export class ProviderWizardComponent implements OnDestroy { } save(): void { - console.log('Save!'); + this.store.dispatch(new AddProviderRequest(this.provider)); } gotoPage(page: string): void { diff --git a/ui/src/app/metadata/provider/effect/collection.effect.ts b/ui/src/app/metadata/provider/effect/collection.effect.ts new file mode 100644 index 000000000..19e521f3c --- /dev/null +++ b/ui/src/app/metadata/provider/effect/collection.effect.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Router } from '@angular/router'; + +import { of } from 'rxjs'; +import { map, catchError, switchMap, tap } from 'rxjs/operators'; +import { + ProviderCollectionActionsUnion, + ProviderCollectionActionTypes, + AddProviderRequest, + AddProviderSuccess, + AddProviderFail +} from '../action/collection.action'; +import { MetadataProviderService } from '../../domain/service/provider.service'; + +/* istanbul ignore next */ +@Injectable() +export class CollectionEffects { + + @Effect() + createProvider$ = this.actions$.pipe( + ofType(ProviderCollectionActionTypes.ADD_PROVIDER_REQUEST), + map(action => action.payload), + switchMap(provider => + this.providerService + .save(provider) + .pipe( + map(p => new AddProviderSuccess(p)), + catchError((e) => of(new AddProviderFail(e))) + ) + ) + ); + + @Effect({ dispatch: false }) + createProviderSuccessRedirect$ = this.actions$.pipe( + ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), + map(action => action.payload), + tap(provider => this.router.navigate(['metadata'])) + ); + + /* + @Effect() + addResolverSuccessReload$ = this.actions$.pipe( + ofType(EntityActionTypes.CREATE_PROVIDER_SUCCESS), + map(action => action.payload), + map(provider => new LoadProviderRequest()) + ); + */ + + constructor( + private actions$: Actions, + private router: Router, + private providerService: MetadataProviderService + ) { } +} /* istanbul ignore next */ diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts index d4bfd143d..5208783c2 100644 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts +++ b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts @@ -3,10 +3,27 @@ import { FileBackedHttpMetadataProvider } from '../../domain/model/providers/fil export const FileBackedHttpMetadataProviderWizard: Wizard = { label: 'FileBackedHttpMetadataProvider', - type: '@FileBackedHttpMetadataProvider', + type: 'FileBackedHttpMetadataResolver', translate: { parser: (changes) => changes.metadataFilters ? ({ ...changes, + httpMetadataResolverAttributes: { + httpClientRef: null, + connectionRequestTimeout: null, + connectionTimeout: null, + socketTimeout: null, + disregardTLSCertificate: false, + tlsTrustEngineRef: null, + httpClientSecurityParametersRef: null, + proxyHost: null, + proxyPort: null, + proxyUser: null, + proxyPassword: null, + httpCaching: null, + httpCacheDirectory: null, + httpMaxCacheEntries: null, + httpMaxCacheEntrySize: null + }, metadataFilters: [ ...Object.keys(changes.metadataFilters).reduce((collection, filterName) => ([ ...collection, diff --git a/ui/src/app/metadata/provider/provider.module.ts b/ui/src/app/metadata/provider/provider.module.ts index 098c8baf1..7d60e47bb 100644 --- a/ui/src/app/metadata/provider/provider.module.ts +++ b/ui/src/app/metadata/provider/provider.module.ts @@ -17,6 +17,7 @@ import { WidgetRegistry} from 'ngx-schema-form'; import { FormModule } from '../../schema-form/schema-form.module'; import { CustomWidgetRegistry } from '../../schema-form/registry'; import { SummaryPropertyComponent } from './component/summary-property.component'; +import { CollectionEffects } from './effect/collection.effect'; @NgModule({ @@ -52,7 +53,7 @@ export class ProviderModule { imports: [ ProviderModule, StoreModule.forFeature('provider', fromProvider.reducers), - EffectsModule.forFeature([EditorEffects]) + EffectsModule.forFeature([EditorEffects, CollectionEffects]) ] }) export class RootProviderModule { } diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.ts new file mode 100644 index 000000000..9a625fa79 --- /dev/null +++ b/ui/src/app/metadata/provider/reducer/collection.reducer.ts @@ -0,0 +1,52 @@ +import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; +import { ProviderCollectionActionTypes, ProviderCollectionActionsUnion } from '../action/collection.action'; +import { MetadataProvider } from '../../domain/model'; + +export interface CollectionState extends EntityState { + selectedProviderId: string | null; + loaded: boolean; +} + +export function sortByDate(a: MetadataProvider, b: MetadataProvider): number { + return a.createdDate.localeCompare(b.createdDate); +} + +export const adapter: EntityAdapter = createEntityAdapter({ + sortComparer: sortByDate, + selectId: (model: MetadataProvider) => model.resourceId +}); + +export const initialState: CollectionState = adapter.getInitialState({ + selectedProviderId: null, + loaded: false +}); + +export function reducer(state = initialState, action: ProviderCollectionActionsUnion): CollectionState { + switch (action.type) { + case ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS: { + let s = adapter.addAll(action.payload, { + ...state, + selectedProviderId: state.selectedProviderId, + loaded: true + }); + return s; + } + + case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: { + return adapter.updateOne(action.payload, state); + } + + default: { + return state; + } + } +} + +export const getSelectedProviderId = (state: CollectionState) => state.selectedProviderId; +export const getIsLoaded = (state: CollectionState) => state.loaded; +export const { + selectIds: selectProviderIds, + selectEntities: selectProviderEntities, + selectAll: selectAllProviders, + selectTotal: selectProviderTotal +} = adapter.getSelectors(); diff --git a/ui/src/app/metadata/provider/reducer/entity.reducer.ts b/ui/src/app/metadata/provider/reducer/entity.reducer.ts index 4207c42a4..5aa7eceb1 100644 --- a/ui/src/app/metadata/provider/reducer/entity.reducer.ts +++ b/ui/src/app/metadata/provider/reducer/entity.reducer.ts @@ -28,8 +28,7 @@ export function reducer(state = initialState, action: EntityActionUnion): Entity } }; } - case EntityActionTypes.SELECT_PROVIDER: - case EntityActionTypes.CREATE_PROVIDER: { + case EntityActionTypes.SELECT_PROVIDER: { return { ...state, base: { @@ -46,23 +45,6 @@ export function reducer(state = initialState, action: EntityActionUnion): Entity } }; } - case EntityActionTypes.SAVE_PROVIDER_REQUEST: { - return { - ...state, - saving: true - }; - } - case EntityActionTypes.SAVE_PROVIDER_SUCCESS: { - return { - ...initialState, - }; - } - case EntityActionTypes.SAVE_PROVIDER_FAIL: { - return { - ...state, - saving: false - }; - } default: { return state; } diff --git a/ui/src/app/metadata/provider/reducer/index.ts b/ui/src/app/metadata/provider/reducer/index.ts index c736201eb..ee98fec25 100644 --- a/ui/src/app/metadata/provider/reducer/index.ts +++ b/ui/src/app/metadata/provider/reducer/index.ts @@ -2,15 +2,20 @@ import { createSelector, createFeatureSelector } from '@ngrx/store'; import * as fromRoot from '../../../app.reducer'; import * as fromEditor from './editor.reducer'; import * as fromEntity from './entity.reducer'; +import * as fromCollection from './collection.reducer'; +import * as utils from '../../domain/domain.util'; +import { MetadataProvider } from '../../domain/model'; export interface ProviderState { editor: fromEditor.EditorState; entity: fromEntity.EntityState; + collection: fromCollection.CollectionState; } export const reducers = { editor: fromEditor.reducer, - entity: fromEntity.reducer + entity: fromEntity.reducer, + collection: fromCollection.reducer }; export interface State extends fromRoot.State { @@ -21,9 +26,11 @@ export const getProviderState = createFeatureSelector('provider') export const getEditorStateFn = (state: ProviderState) => state.editor; export const getEntityStateFn = (state: ProviderState) => state.entity; +export const getCollectionStateFn = (state: ProviderState) => state.collection; export const getEditorState = createSelector(getProviderState, getEditorStateFn); export const getEntityState = createSelector(getProviderState, getEntityStateFn); +export const getCollectionState = createSelector(getProviderState, getCollectionStateFn); /* Editor State @@ -43,4 +50,16 @@ Entity State export const getEntityIsSaved = createSelector(getEntityState, fromEntity.isEntitySaved); export const getEntityChanges = createSelector(getEntityState, fromEntity.getEntityChanges); export const getEntityIsSaving = createSelector(getEntityState, fromEntity.isEditorSaving); -export const getUpdatedEntity = createSelector(getEntityState, fromEntity.getUpdatedEntity); \ No newline at end of file +export const getUpdatedEntity = createSelector(getEntityState, fromEntity.getUpdatedEntity); + +/* + * Select pieces of Provider Collection +*/ +export const getAllProviders = createSelector(getCollectionState, fromCollection.selectAllProviders); +export const getProviderEntities = createSelector(getCollectionState, fromCollection.selectProviderEntities); +export const getSelectedProviderId = createSelector(getCollectionState, fromCollection.getSelectedProviderId); +export const getSelectedProvider = createSelector(getProviderEntities, getSelectedProviderId, utils.getInCollectionFn); +export const getProviderIds = createSelector(getCollectionState, fromCollection.selectProviderIds); +export const getProviderCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); + +export const getProviderNames = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.name)); diff --git a/ui/src/app/wizard/component/wizard.component.html b/ui/src/app/wizard/component/wizard.component.html index a4ae2b75c..3d62f7d7a 100644 --- a/ui/src/app/wizard/component/wizard.component.html +++ b/ui/src/app/wizard/component/wizard.component.html @@ -36,7 +36,7 @@