Skip to content

Commit

Permalink
SHIBUI-996 Added name unique validation
Browse files Browse the repository at this point in the history
  • Loading branch information
rmathis committed Nov 29, 2018
1 parent b098b62 commit bfceb8c
Show file tree
Hide file tree
Showing 12 changed files with 91 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<sf-form
[schema]="schema$ | async"
[model]="model$ | async"
[validators]="definition.getValidators()"
[validators]="validators$ | async"
[actions]="actions"
(onChange)="valueChangeSubject.next($event)"
(onErrorChange)="statusChangeSubject.next($event)"></sf-form>
Expand Down
13 changes: 12 additions & 1 deletion ui/src/app/metadata/filter/container/edit-filter.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { UpdateFilterRequest } from '../action/collection.action';
import { CancelCreateFilter, UpdateFilterChanges } from '../action/filter.action';
import { PreviewEntity } from '../../domain/action/entity.action';
import { EntityAttributesFilterEntity } from '../../domain/entity';
import { shareReplay } from 'rxjs/operators';
import { shareReplay, map, withLatestFrom } from 'rxjs/operators';

@Component({
selector: 'edit-filter-page',
Expand All @@ -33,6 +33,8 @@ export class EditFilterComponent {
filter: MetadataFilter;
isValid: boolean;

validators$: Observable<{ [key: string]: any }>;

actions: any;

constructor(
Expand All @@ -50,6 +52,15 @@ export class EditFilterComponent {
this.isValid = valid.value ? valid.value.length === 0 : true;
});

this.validators$ = this.store.select(fromFilter.getFilterNames).pipe(
withLatestFrom(
this.store.select(fromFilter.getSelectedFilter)
),
map(([names, provider]) => this.definition.getValidators(
names.filter(n => n !== provider.name)
))
);

this.store
.select(fromFilter.getFilter)
.subscribe(filter => this.filter = filter);
Expand Down
2 changes: 1 addition & 1 deletion ui/src/app/metadata/filter/container/filter.component.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<ng-container *ngIf="filter$ | async">
<ng-container>
<router-outlet></router-outlet>
</ng-container>
Empty file.
16 changes: 6 additions & 10 deletions ui/src/app/metadata/filter/container/filter.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,31 @@ import { ActivatedRoute } from '@angular/router';
import { Observable, Subscription } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap';

import { MetadataFilter } from '../../domain/model/metadata-filter';
import { SelectFilter } from '../action/collection.action';
import { LoadFilterRequest } from '../action/collection.action';
import * as fromFilter from '../reducer';


@Component({
selector: 'filter-page',
templateUrl: './filter.component.html',
styleUrls: ['./filter.component.scss'],
providers: [NgbPopoverConfig]
styleUrls: [],
providers: []
})
export class FilterComponent implements OnDestroy {
actionsSubscription: Subscription;
filter$: Observable<MetadataFilter>;
filters$: Observable<MetadataFilter[]>;

constructor(
private store: Store<fromFilter.State>,
private route: ActivatedRoute
) {
this.actionsSubscription = this.route.params.pipe(
this.actionsSubscription = this.route.parent.params.pipe(
distinctUntilChanged(),
map(params => {
return new SelectFilter(params.id);
return new LoadFilterRequest(params.providerId);
})
).subscribe(store);

this.filter$ = this.store.select(fromFilter.getSelectedFilter);
}

ngOnDestroy() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<sf-form
[schema]="schema$ | async"
[model]="model$ | async"
[validators]="definition.getValidators()"
[validators]="validators$ | async"
(onChange)="valueChangeSubject.next($event)"
(onErrorChange)="statusChangeSubject.next($event)"></sf-form>
</div>
Expand Down
8 changes: 7 additions & 1 deletion ui/src/app/metadata/filter/container/new-filter.component.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';
import { Subject, Observable, of } from 'rxjs';
import { takeUntil, shareReplay } from 'rxjs/operators';
import { takeUntil, shareReplay, withLatestFrom, map, filter } from 'rxjs/operators';

import * as fromFilter from '../reducer';
import { MetadataFilterTypes } from '../model';
Expand Down Expand Up @@ -33,6 +33,8 @@ export class NewFilterComponent implements OnDestroy, OnInit {
filter: MetadataFilter;
isValid: boolean;

validators$: Observable<{ [key: string]: any }>;

constructor(
private store: Store<fromFilter.State>,
private schemaService: SchemaService
Expand All @@ -42,6 +44,10 @@ export class NewFilterComponent implements OnDestroy, OnInit {
this.schema$ = this.schemaService.get(this.definition.schema).pipe(shareReplay());
this.isSaving$ = this.store.select(fromFilter.getCollectionSaving);
this.model$ = of(<MetadataFilter>{});

this.validators$ = this.store.select(fromFilter.getFilterNames).pipe(
map((names) => this.definition.getValidators(names))
);
}

ngOnInit(): void {
Expand Down
8 changes: 5 additions & 3 deletions ui/src/app/metadata/filter/filter.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,23 @@ import { NgbPopoverModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap';
import { SearchDialogComponent } from './component/search-dialog.component';
import { SharedModule } from '../../shared/shared.module';
import { EditFilterComponent } from './container/edit-filter.component';
import { FilterComponent } from './container/filter.component';
import { SelectFilterComponent } from './container/select-filter.component';
import { SearchIdEffects } from './effect/search.effect';
import { FilterExistsGuard } from './guard/filter-exists.guard';
import { DomainModule } from '../domain/domain.module';
import { ModuleWithProviders } from '@angular/compiler/src/core';
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';

@NgModule({
declarations: [
NewFilterComponent,
EditFilterComponent,
FilterComponent,
SearchDialogComponent
SelectFilterComponent,
SearchDialogComponent,
FilterComponent
],
entryComponents: [
SearchDialogComponent
Expand Down
30 changes: 28 additions & 2 deletions ui/src/app/metadata/filter/model/entity-attributes.filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,34 @@ export const EntityAttributesFilter: FormDefinition<MetadataFilter> = {
label: 'EntityAttributes',
type: 'EntityAttributes',
schema: '/api/ui/EntityAttributesFilters',
getValidators(): any {
const validators = {};
getValidators(namesList: string[] = []): any {
const validators = {
'/': (value, property, form_current) => {
let errors;
// iterate all customer
Object.keys(value).forEach((key) => {
const item = value[key];
const validatorKey = `/${key}`;
const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null;
const error = validator ? validator(item, { path: `/${key}` }, form_current) : null;
if (error) {
errors = errors || [];
errors.push(error);
}
});
return errors;
},
'/name': (value, property, form) => {
console.log(namesList);
const err = namesList.indexOf(value) > -1 ? {
code: 'INVALID_NAME',
path: `#${property.path}`,
message: 'message.name-must-be-unique',
params: [value]
} : null;
return err;
}
};
return validators;
},
parser: (changes: any): MetadataFilter => changes,
Expand Down
3 changes: 3 additions & 0 deletions ui/src/app/metadata/filter/reducer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import * as fromFilter from './filter.reducer';
import * as fromSearch from './search.reducer';
import * as fromCollection from './collection.reducer';
import * as utils from '../../domain/domain.util';
import { MetadataFilter } from '../../domain/model';

export interface FilterState {
filter: fromFilter.FilterState;
Expand Down Expand Up @@ -71,6 +72,8 @@ export const getAdditionalFilterOrder = createSelector(getFilterEntities, getCol
export const getAdditionalFilters = createSelector(getFilterList, getAdditionalFilterOrder, utils.mergeOrderFn);
export const getPluginFilterOrder = createSelector(getFilterEntities, getCollectionOrder, pluginOrderFn);

export const getFilterNames = createSelector(getAllFilters, (filters: MetadataFilter[]) => filters.map(f => f.name).filter(f => !!f));

/*
* Combine pieces of State
*/
Expand Down
7 changes: 0 additions & 7 deletions ui/src/app/metadata/filter/service/filter-resolver.service.ts

This file was deleted.

47 changes: 27 additions & 20 deletions ui/src/app/metadata/provider/provider.routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import { ProviderEditStepComponent } from './container/provider-edit-step.compon
import { ProviderSelectComponent } from './container/provider-select.component';
import { ProviderFilterListComponent } from './container/provider-filter-list.component';
import { NewFilterComponent } from '../filter/container/new-filter.component';
import { FilterComponent } from '../filter/container/filter.component';
import { SelectFilterComponent } from '../filter/container/select-filter.component';
import { EditFilterComponent } from '../filter/container/edit-filter.component';
import { CanDeactivateGuard } from '../../core/service/can-deactivate.guard';
import { FilterComponent } from '../filter/container/filter.component';

export const ProviderRoutes: Routes = [
{
Expand All @@ -36,6 +37,31 @@ export const ProviderRoutes: Routes = [
path: ':providerId',
component: ProviderSelectComponent,
children: [
{
path: '',
component: FilterComponent,
children: [
{
path: 'filters',
component: ProviderFilterListComponent
},
{
path: 'filter/new',
component: NewFilterComponent
},
{
path: 'filter/:id',
component: SelectFilterComponent,
canActivate: [],
children: [
{
path: 'edit',
component: EditFilterComponent
}
]
}
]
},
{
path: 'edit',
component: ProviderEditComponent,
Expand All @@ -49,25 +75,6 @@ export const ProviderRoutes: Routes = [
canDeactivate: [
CanDeactivateGuard
]
},
{
path: 'filters',
component: ProviderFilterListComponent
},
{
path: 'filter/new',
component: NewFilterComponent
},
{
path: 'filter/:id',
component: FilterComponent,
canActivate: [],
children: [
{
path: 'edit',
component: EditFilterComponent
}
]
}
]
}
Expand Down

0 comments on commit bfceb8c

Please sign in to comment.