diff --git a/ui/src/app/metadata/configuration/configuration.module.ts b/ui/src/app/metadata/configuration/configuration.module.ts index 05fa99298..35fc8ed6b 100644 --- a/ui/src/app/metadata/configuration/configuration.module.ts +++ b/ui/src/app/metadata/configuration/configuration.module.ts @@ -25,6 +25,7 @@ import { HistoryListComponent } from './component/history-list.component'; import { DomainModule } from '../domain/domain.module'; import { MetadataComparisonComponent } from './container/metadata-comparison.component'; import { CompareVersionEffects } from './effect/compare.effect'; +import { FilterModule } from '../filter/filter.module'; @NgModule({ declarations: [ @@ -47,7 +48,8 @@ import { CompareVersionEffects } from './effect/compare.effect'; I18nModule, NgbPopoverModule, RouterModule, - DomainModule + DomainModule, + FilterModule ], exports: [], providers: [] diff --git a/ui/src/app/metadata/configuration/container/configuration.component.html b/ui/src/app/metadata/configuration/container/configuration.component.html index b0d813546..53f8fa697 100644 --- a/ui/src/app/metadata/configuration/container/configuration.component.html +++ b/ui/src/app/metadata/configuration/container/configuration.component.html @@ -13,7 +13,11 @@ -

Source Configuration

+

+ Source + Provider + Configuration +

diff --git a/ui/src/app/metadata/configuration/container/configuration.component.ts b/ui/src/app/metadata/configuration/container/configuration.component.ts index 17ce4b99c..9fb1cc8cd 100644 --- a/ui/src/app/metadata/configuration/container/configuration.component.ts +++ b/ui/src/app/metadata/configuration/container/configuration.component.ts @@ -20,6 +20,7 @@ export class ConfigurationComponent implements OnDestroy { private ngUnsubscribe: Subject = new Subject(); name$: Observable; + type$: Observable constructor( private store: Store, @@ -53,6 +54,7 @@ export class ConfigurationComponent implements OnDestroy { }); this.name$ = this.store.select(fromReducer.getConfigurationModelName); + this.type$ = this.store.select(fromReducer.getConfigurationModelType); } ngOnDestroy() { diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.html b/ui/src/app/metadata/configuration/container/metadata-options.component.html index 9c4dbb489..19681afcd 100644 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.html +++ b/ui/src/app/metadata/configuration/container/metadata-options.component.html @@ -9,10 +9,19 @@   Version History -
- Options - XML +
+ Options + XML
- + + + \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/metadata-options.component.ts b/ui/src/app/metadata/configuration/container/metadata-options.component.ts index 556aa8805..55abe4634 100644 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.ts +++ b/ui/src/app/metadata/configuration/container/metadata-options.component.ts @@ -1,19 +1,23 @@ import { Store } from '@ngrx/store'; -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Observable } from 'rxjs'; +import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; +import { Observable, Subject } from 'rxjs'; import { ConfigurationState, getConfigurationSections, - getConfigurationModel, getSelectedVersion, getSelectedVersionNumber, getSelectedIsCurrent, - getConfigurationModelEnabled + getConfigurationModelEnabled, + getConfigurationHasXml, + getConfigurationModel } from '../reducer'; import { MetadataConfiguration } from '../model/metadata-configuration'; import { MetadataVersion } from '../model/version'; -import { map } from 'rxjs/operators'; +import { MetadataFilter } from '../../domain/model'; +import { getAdditionalFilters } from '../../filter/reducer'; +import { ClearFilters, LoadFilterRequest } from '../../filter/action/collection.action'; +import { takeUntil, map } from 'rxjs/operators'; import { Metadata } from '../../domain/domain.type'; @Component({ @@ -22,21 +26,44 @@ import { Metadata } from '../../domain/domain.type'; templateUrl: './metadata-options.component.html', styleUrls: [] }) -export class MetadataOptionsComponent { +export class MetadataOptionsComponent implements OnDestroy { + + private ngUnsubscribe: Subject = new Subject(); configuration$: Observable; isEnabled$: Observable; version$: Observable; versionNumber$: Observable; isCurrent$: Observable; + hasXml$: Observable; + filters$: Observable; + model$: Observable; constructor( private store: Store ) { this.configuration$ = this.store.select(getConfigurationSections); + this.model$ = this.store.select(getConfigurationModel); this.isEnabled$ = this.store.select(getConfigurationModelEnabled); this.version$ = this.store.select(getSelectedVersion); this.versionNumber$ = this.store.select(getSelectedVersionNumber); this.isCurrent$ = this.store.select(getSelectedIsCurrent); + this.hasXml$ = this.store.select(getConfigurationHasXml); + this.filters$ = this.store.select(getAdditionalFilters); + + this.model$ + .pipe( + takeUntil(this.ngUnsubscribe) + ) + .subscribe(p => { + this.store.dispatch(new LoadFilterRequest(p.resourceId)); + }); + } + + ngOnDestroy(): void { + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + + this.store.dispatch(new ClearFilters()); } } diff --git a/ui/src/app/metadata/configuration/effect/configuration.effect.ts b/ui/src/app/metadata/configuration/effect/configuration.effect.ts index b9a9c7181..e63b873e7 100644 --- a/ui/src/app/metadata/configuration/effect/configuration.effect.ts +++ b/ui/src/app/metadata/configuration/effect/configuration.effect.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Effect, Actions, ofType } from '@ngrx/effects'; -import { switchMap, catchError, map, tap, withLatestFrom } from 'rxjs/operators'; +import { switchMap, catchError, map, tap, withLatestFrom, filter } from 'rxjs/operators'; import { of, Observable } from 'rxjs'; import * as FileSaver from 'file-saver'; import { Store } from '@ngrx/store'; @@ -53,22 +53,11 @@ export class MetadataConfigurationEffects { @Effect() loadMetadataXml$ = this.actions$.pipe( ofType(ConfigurationActionTypes.LOAD_METADATA_REQUEST), - switchMap(action => { - let loader: Observable; - switch (action.payload.type) { - case 'filter': - loader = this.entityService.preview(action.payload.id); - break; - default: - loader = this.providerService.preview(action.payload.id); - break; - } - - return loader.pipe( - map(xml => new LoadXmlSuccess(xml)), - catchError(error => of(new LoadXmlError(error))) - ); - }) + filter(action => action.payload.type === 'resolver'), + switchMap(action => this.providerService.preview(action.payload.id).pipe( + map(xml => new LoadXmlSuccess(xml)), + catchError(error => of(new LoadXmlError(error))) + )) ); @Effect() diff --git a/ui/src/app/metadata/configuration/reducer/index.ts b/ui/src/app/metadata/configuration/reducer/index.ts index baf934164..d37312323 100644 --- a/ui/src/app/metadata/configuration/reducer/index.ts +++ b/ui/src/app/metadata/configuration/reducer/index.ts @@ -104,9 +104,15 @@ export const getConfigurationModelEnabledFn = export const getConfigurationModelNameFn = (config: Metadata) => config ? ('serviceProviderName' in config) ? config.serviceProviderName : config.name : false; +export const getConfigurationModelTypeFn = + (config: Metadata) => config ? ('@type' in config) ? config['@type'] : 'resolver' : null; + export const getConfigurationModelEnabled = createSelector(getConfigurationModel, getConfigurationModelEnabledFn); export const getConfigurationModelName = createSelector(getConfigurationModel, getConfigurationModelNameFn); +export const getConfigurationModelType = createSelector(getConfigurationModel, getConfigurationModelTypeFn); +export const getConfigurationHasXml = createSelector(getConfigurationXml, xml => !!xml); +export const getConfigurationFilters = createSelector(getConfigurationModel, model => model.metadataFilters); // Version History export const getHistoryState = createSelector(getState, getHistoryStateFn); diff --git a/ui/src/app/metadata/configuration/service/configuration.service.ts b/ui/src/app/metadata/configuration/service/configuration.service.ts index c361037e0..1ee9507d6 100644 --- a/ui/src/app/metadata/configuration/service/configuration.service.ts +++ b/ui/src/app/metadata/configuration/service/configuration.service.ts @@ -8,12 +8,14 @@ import { MetadataProviderEditorTypes } from '../../provider/model'; import { Schema } from '../model/schema'; import { TYPES } from '../configuration.values'; import { ResolverService } from '../../domain/service/resolver.service'; +import { MetadataProviderService } from '../../domain/service/provider.service'; @Injectable() export class MetadataConfigurationService { constructor( private resolverService: ResolverService, + private providerService: MetadataProviderService, private http: HttpClient ) {} @@ -21,6 +23,8 @@ export class MetadataConfigurationService { switch (type) { case TYPES.resolver: return this.resolverService.find(id); + case TYPES.provider: + return this.providerService.find(id); default: return throwError(new Error('Type not supported')); } diff --git a/ui/src/app/metadata/domain/service/entity-id.service.ts b/ui/src/app/metadata/domain/service/entity-id.service.ts index 8daec78df..07009e3d1 100644 --- a/ui/src/app/metadata/domain/service/entity-id.service.ts +++ b/ui/src/app/metadata/domain/service/entity-id.service.ts @@ -14,8 +14,6 @@ export class EntityIdService { readonly entitiesEndpoint = '/entities'; readonly base = '/api'; - private subj: Subject = new Subject(); - constructor( private http: HttpClient ) { } diff --git a/ui/src/app/metadata/filter/container/filter-list.component.html b/ui/src/app/metadata/filter/container/filter-list.component.html new file mode 100644 index 000000000..6eee1d9d9 --- /dev/null +++ b/ui/src/app/metadata/filter/container/filter-list.component.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + +
Filter NameFilter TypeEnabled?EditDelete
+
+ + +
+
{{ i + 1 }}{{ filter.name }}{{ filter['@type'] }} +
+
+ + +
+ +
+
+ + + Edit + + + +
\ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/filter-list.component.scss b/ui/src/app/metadata/filter/container/filter-list.component.scss new file mode 100644 index 000000000..e1a2e17b9 --- /dev/null +++ b/ui/src/app/metadata/filter/container/filter-list.component.scss @@ -0,0 +1,17 @@ +:host { + .table { + .td-sm { + max-width: 100px; + } + .td-xs { + max-width: 20px; + } + .td-lg { + width: 30%; + } + + td { + vertical-align: middle; + } + } +} \ No newline at end of file diff --git a/ui/src/app/metadata/filter/container/filter-list.component.spec.ts b/ui/src/app/metadata/filter/container/filter-list.component.spec.ts new file mode 100644 index 000000000..e69de29bb diff --git a/ui/src/app/metadata/filter/container/filter-list.component.ts b/ui/src/app/metadata/filter/container/filter-list.component.ts new file mode 100644 index 000000000..08491102b --- /dev/null +++ b/ui/src/app/metadata/filter/container/filter-list.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { MetadataFilter } from '../../domain/model'; + +import {} from '../../filter/action/collection.action'; +import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; + +@Component({ + selector: 'filter-list', + templateUrl: './filter-list.component.html', + styleUrls: ['./filter-list.component.scss'] +}) +export class FilterListComponent { + + @Input() filters: MetadataFilter[]; + @Input() disabled: boolean; + + @Output() onUpdateOrderUp: EventEmitter = new EventEmitter(); + @Output() onUpdateOrderDown: EventEmitter = new EventEmitter(); + @Output() onRemove: EventEmitter = new EventEmitter(); + @Output() onToggleEnabled: EventEmitter = new EventEmitter(); + + formats = NAV_FORMATS; + + constructor() {} +} diff --git a/ui/src/app/metadata/filter/filter.module.ts b/ui/src/app/metadata/filter/filter.module.ts index e090745f2..68fdf8b96 100644 --- a/ui/src/app/metadata/filter/filter.module.ts +++ b/ui/src/app/metadata/filter/filter.module.ts @@ -22,6 +22,7 @@ import { FilterCollectionEffects } from './effect/collection.effect'; import { FormModule } from '../../schema-form/schema-form.module'; import { I18nModule } from '../../i18n/i18n.module'; import { FilterComponent } from './container/filter.component'; +import { FilterListComponent } from './container/filter-list.component'; @NgModule({ declarations: [ @@ -29,7 +30,8 @@ import { FilterComponent } from './container/filter.component'; EditFilterComponent, SelectFilterComponent, SearchDialogComponent, - FilterComponent + FilterComponent, + FilterListComponent ], entryComponents: [ SearchDialogComponent @@ -45,6 +47,9 @@ import { FilterComponent } from './container/filter.component'; RouterModule, FormModule, I18nModule + ], + exports: [ + FilterListComponent ] }) export class FilterModule { diff --git a/ui/src/app/metadata/manager/component/provider-search.component.html b/ui/src/app/metadata/manager/component/provider-search.component.html index 381aa8568..d534cea51 100644 --- a/ui/src/app/metadata/manager/component/provider-search.component.html +++ b/ui/src/app/metadata/manager/component/provider-search.component.html @@ -10,7 +10,8 @@ aria-label="To search for a source, enter name then press enter" formControlName="search" role="textbox" - (keyup)="search.emit($event.target.value)"> + (keyup)="search.emit($event.target.value)" + disableValidation="true">
-
- - - - - - - - - - - - - - - - - - - - - - - -
Filter NameFilter TypeEnabled?EditDelete
- - - {{ i + 1 }}{{ filter.name }}{{ filter['@type'] }} - - - - - - Edit - - - -
+
+ +
diff --git a/ui/src/app/metadata/provider/provider.module.ts b/ui/src/app/metadata/provider/provider.module.ts index 38bfecdf1..99e033e74 100644 --- a/ui/src/app/metadata/provider/provider.module.ts +++ b/ui/src/app/metadata/provider/provider.module.ts @@ -26,6 +26,7 @@ import { DeleteFilterComponent } from './component/delete-filter.component'; import { I18nModule } from '../../i18n/i18n.module'; import { DomainModule } from '../domain/domain.module'; import { MetadataProviderPageComponent } from './provider.component'; +import { FilterModule } from '../filter/filter.module'; @NgModule({ declarations: [ @@ -53,7 +54,8 @@ import { MetadataProviderPageComponent } from './provider.component'; NgbDropdownModule, NgbModalModule, I18nModule, - DomainModule + DomainModule, + FilterModule ], exports: [] })