From 60e1c15b6abe1012e6631edc0234510684305cb9 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Wed, 29 Aug 2018 11:26:49 -0700 Subject: [PATCH 1/4] SHIBUI-816 Removed validation for entity id --- .../widget/filter-target/filter-target.component.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts b/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts index 2b08949d2..87e84198c 100644 --- a/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts +++ b/ui/src/app/schema-form/widget/filter-target/filter-target.component.ts @@ -25,9 +25,7 @@ export class FilterTargetComponent extends ObjectWidget implements OnDestroy, Af search: FormControl = new FormControl( '', [], - [ - EntityValidators.existsInCollection(this.store.select(fromFilters.getEntityCollection)) - ] + [] ); script: FormControl = new FormControl( From f100f5d004698cd8523e8017911fd1894b26fe1a Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Wed, 29 Aug 2018 12:26:34 -0700 Subject: [PATCH 2/4] SHIBUI-816 Fixed issue with navigation after cancelling filter changes --- ui/src/app/metadata/filter/effect/filter.effect.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/src/app/metadata/filter/effect/filter.effect.ts b/ui/src/app/metadata/filter/effect/filter.effect.ts index 0c0ce98fe..e4a252d6e 100644 --- a/ui/src/app/metadata/filter/effect/filter.effect.ts +++ b/ui/src/app/metadata/filter/effect/filter.effect.ts @@ -60,8 +60,10 @@ export class FilterEffects { @Effect({ dispatch: false }) cancelChanges$ = this.actions$.pipe( ofType(FilterActionTypes.CANCEL_CREATE_FILTER), - combineLatest(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), - tap(([filter, provider]) => this.router.navigate(['/', 'metadata', 'provider', provider, 'filters'])) + withLatestFrom(this.store.select(fromProvider.getSelectedProviderId).pipe(skipWhile(id => !id))), + tap(([filter, provider]) => { + this.router.navigate(['/', 'metadata', 'provider', provider, 'filters']); + }) ); constructor( From ae5601dab5cf7c2c074f097ef15ba48d40f75254 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 30 Aug 2018 20:13:42 +0000 Subject: [PATCH 3/4] Merged in feature/SHIBUI-781 (pull request #184) SHIBUI-781 Implemented Delete filter confirmation modal Approved-by: Shibui Jenkins Approved-by: Ryan Mathis --- .../component/delete-filter.component.html | 10 ++++++++++ .../component/delete-filter.component.ts | 14 +++++++++++++ .../provider-filter-list.component.spec.ts | 9 +++++++-- .../provider-filter-list.component.ts | 20 ++++++++++++++++--- .../app/metadata/provider/provider.module.ts | 12 +++++++---- 5 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 ui/src/app/metadata/provider/component/delete-filter.component.html create mode 100644 ui/src/app/metadata/provider/component/delete-filter.component.ts diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.html b/ui/src/app/metadata/provider/component/delete-filter.component.html new file mode 100644 index 000000000..64d9bab9b --- /dev/null +++ b/ui/src/app/metadata/provider/component/delete-filter.component.html @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/ui/src/app/metadata/provider/component/delete-filter.component.ts b/ui/src/app/metadata/provider/component/delete-filter.component.ts new file mode 100644 index 000000000..b1da35392 --- /dev/null +++ b/ui/src/app/metadata/provider/component/delete-filter.component.ts @@ -0,0 +1,14 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; + +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'delete-filter-dialog', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './delete-filter.component.html' +}) +export class DeleteFilterComponent { + constructor( + public activeModal: NgbActiveModal + ) { } +} diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts b/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts index 7b850fc33..742a056e5 100644 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts +++ b/ui/src/app/metadata/provider/container/provider-filter-list.component.spec.ts @@ -2,13 +2,15 @@ import { Component, ViewChild } from '@angular/core'; import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgbDropdownModule, NgbModalModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { ProviderFilterListComponent } from './provider-filter-list.component'; import * as fromRoot from '../reducer'; import * as fromWizard from '../../../wizard/reducer'; import { ProviderEditorNavComponent } from '../component/provider-editor-nav.component'; import { I18nTextComponent } from '../../../shared/component/i18n-text.component'; import { ValidFormIconComponent } from '../../../shared/component/valid-form-icon.component'; +import { DeleteFilterComponent } from '../component/delete-filter.component'; +import { NgbModalStub } from '../../../../testing/modal.stub'; @Component({ template: ` @@ -42,9 +44,12 @@ describe('Provider Filter List Component', () => { ProviderEditorNavComponent, I18nTextComponent, ValidFormIconComponent, + DeleteFilterComponent, TestHostComponent ], - providers: [] + providers: [ + { provide: NgbModal, useClass: NgbModalStub } + ] }).compileComponents(); store = TestBed.get(Store); diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.ts b/ui/src/app/metadata/provider/container/provider-filter-list.component.ts index 73b59eb8a..81a2b5e98 100644 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.ts +++ b/ui/src/app/metadata/provider/container/provider-filter-list.component.ts @@ -1,7 +1,9 @@ import { Component, OnDestroy } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable, Subject } from 'rxjs'; -import { skipWhile, takeUntil, withLatestFrom } from 'rxjs/operators'; +import { skipWhile, takeUntil } from 'rxjs/operators'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + import * as fromProvider from '../reducer'; import * as fromFilter from '../../filter/reducer'; import { MetadataFilter, MetadataProvider } from '../../domain/model'; @@ -16,6 +18,7 @@ import { RemoveFilterRequest, ClearFilters } from '../../filter/action/collection.action'; +import { DeleteFilterComponent } from '../component/delete-filter.component'; @Component({ selector: 'provider-filter-list', @@ -33,7 +36,8 @@ export class ProviderFilterListComponent implements OnDestroy { formats = NAV_FORMATS; constructor( - private store: Store + private store: Store, + private modalService: NgbModal ) { this.filters$ = this.store.select(fromFilter.getAdditionalFilters) as Observable; this.provider$ = this.store.select(fromProvider.getSelectedProvider).pipe(skipWhile(p => !p)); @@ -63,7 +67,17 @@ export class ProviderFilterListComponent implements OnDestroy { } remove(id: string): void { - this.store.dispatch(new RemoveFilterRequest(id)); + this.modalService + .open(DeleteFilterComponent) + .result + .then( + success => { + this.store.dispatch(new RemoveFilterRequest(id)); + }, + err => { + console.log('Cancelled'); + } + ); } ngOnDestroy(): void { diff --git a/ui/src/app/metadata/provider/provider.module.ts b/ui/src/app/metadata/provider/provider.module.ts index 80360c517..277899b15 100644 --- a/ui/src/app/metadata/provider/provider.module.ts +++ b/ui/src/app/metadata/provider/provider.module.ts @@ -5,7 +5,7 @@ import { RouterModule } from '@angular/router'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgbDropdownModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { ProviderWizardComponent } from './container/provider-wizard.component'; import { ProviderWizardStepComponent } from './container/provider-wizard-step.component'; @@ -30,6 +30,7 @@ import { ProviderFilterListComponent } from './container/provider-filter-list.co import { ProviderEditorNavComponent } from './component/provider-editor-nav.component'; import { UnsavedProviderComponent } from './component/unsaved-provider.dialog'; import { ContentionModule } from '../../contention/contention.module'; +import { DeleteFilterComponent } from './component/delete-filter.component'; @NgModule({ declarations: [ @@ -43,10 +44,12 @@ import { ContentionModule } from '../../contention/contention.module'; ProviderFilterListComponent, SummaryPropertyComponent, ProviderEditorNavComponent, - UnsavedProviderComponent + UnsavedProviderComponent, + DeleteFilterComponent ], entryComponents: [ - UnsavedProviderComponent + UnsavedProviderComponent, + DeleteFilterComponent ], imports: [ ReactiveFormsModule, @@ -57,7 +60,8 @@ import { ContentionModule } from '../../contention/contention.module'; FormModule, RouterModule, ContentionModule, - NgbDropdownModule + NgbDropdownModule, + NgbModalModule ], exports: [] }) From 0ad428491fce8afc955ef814dc9c1070e2407fb3 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 30 Aug 2018 20:31:18 +0000 Subject: [PATCH 4/4] Merged in bugfix/SHIBUI-686 (pull request #186) SHIBUI-686 Fixed validation of cert file Approved-by: Shibui Jenkins Approved-by: Ryan Mathis --- .../service/schema.service.spec.ts | 134 +++++++++++++++++- .../app/schema-form/service/schema.service.ts | 10 +- .../filebacked-http-advanced.schema.json | 2 +- .../filebacked-http-filters.schema.json | 20 ++- 4 files changed, 161 insertions(+), 5 deletions(-) diff --git a/ui/src/app/schema-form/service/schema.service.spec.ts b/ui/src/app/schema-form/service/schema.service.spec.ts index 6d259d6a9..0dad960fe 100644 --- a/ui/src/app/schema-form/service/schema.service.spec.ts +++ b/ui/src/app/schema-form/service/schema.service.spec.ts @@ -36,10 +36,140 @@ describe(`Schema Service`, () => { type: 'string' } }, - required: 'foo' + required: ['foo'] } }, - path: '' + path: '/foo' })).toBe(true); })); + + it(`should return true if the property is currently required based on anyOf`, + inject([SchemaService], (service: SchemaService) => { + expect(service.isRequired({ + parent: { + schema: { + properties: { + foo: { type: 'string' }, + bar: { type: 'string' } + }, + anyOf: [ + { + properties: { + foo: { enum: [ true ] } + }, + required: [ 'bar' ] + }, + { + properties: { + foo: { enum: [ false ] } + } + } + ] + }, + value: { foo: true } + }, + path: '/bar' + })).toBe(true); + }) + ); + + it(`should return true if the property is NOT currently required based on anyOf`, + inject([SchemaService], (service: SchemaService) => { + expect(service.isRequired({ + parent: { + schema: { + properties: { + foo: { type: 'string' }, + bar: { type: 'string' } + }, + anyOf: [ + { + properties: { + foo: { enum: [true] } + }, + required: ['bar'] + }, + { + properties: { + foo: { enum: [false] } + } + } + ] + }, + value: { foo: false } + }, + path: '/bar' + })).toBe(false); + }) + ); + + it(`should return false if the property is NOT currently in any values`, + inject([SchemaService], (service: SchemaService) => { + expect(service.isRequired({ + parent: { + schema: { + properties: { + foo: { type: 'string' }, + bar: { type: 'string' } + }, + anyOf: [ + { + properties: { + foo: { enum: [true] } + }, + required: ['bar'] + }, + { + properties: { + foo: { enum: [false] } + } + } + ] + }, + value: {} + }, + path: '/bar' + })).toBe(false); + }) + ); + + it(`should return true if dependant on multiple values and any is true`, + inject([SchemaService], (service: SchemaService) => { + expect(service.isRequired({ + parent: { + schema: { + properties: { + foo: { type: 'string' }, + bar: { type: 'string' }, + baz: { type: 'string' } + }, + anyOf: [ + { + properties: { + foo: { enum: [true] } + }, + required: ['bar'] + }, + { + properties: { + baz: { enum: [true] } + }, + required: ['bar'] + }, + { + properties: { + foo: { enum: [false] } + } + } + ] + }, + value: { + foo: true, + baz: true + } + }, + path: '/bar' + })).toBe(true); + }) + ); }); }); diff --git a/ui/src/app/schema-form/service/schema.service.ts b/ui/src/app/schema-form/service/schema.service.ts index e041528b1..c9c9ea4ca 100644 --- a/ui/src/app/schema-form/service/schema.service.ts +++ b/ui/src/app/schema-form/service/schema.service.ts @@ -25,7 +25,15 @@ export class SchemaService { if (!required) { const conditions = formProperty.parent.schema.anyOf || []; - conditions.forEach(el => { + const values = formProperty.parent.value; + const currentConditions = conditions.filter(condition => + Object + .keys(condition.properties) + .some( + key => values.hasOwnProperty(key) ? condition.properties[key].enum[0] === values[key] : false + ) + ); + currentConditions.forEach(el => { requiredFields = el.required || []; required = !required ? requiredFields.indexOf(controlName) > -1 : required; }); diff --git a/ui/src/assets/schema/provider/filebacked-http-advanced.schema.json b/ui/src/assets/schema/provider/filebacked-http-advanced.schema.json index fc79a9481..6602e1844 100644 --- a/ui/src/assets/schema/provider/filebacked-http-advanced.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-advanced.schema.json @@ -43,7 +43,7 @@ ] }, { - "title": "Unused Attributes", + "title": "", "type": "hidden", "fields": [ "tlsTrustEngineRef", diff --git a/ui/src/assets/schema/provider/filebacked-http-filters.schema.json b/ui/src/assets/schema/provider/filebacked-http-filters.schema.json index 0def9721c..8df58d619 100644 --- a/ui/src/assets/schema/provider/filebacked-http-filters.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-filters.schema.json @@ -58,7 +58,25 @@ "default": "" } }, - "required": ["certificateFile"] + "anyOf": [ + { + "properties": { + "requireSignedRoot": { + "enum": [ true ] + } + }, + "required": [ + "certificateFile" + ] + }, + { + "properties": { + "requireSignedRoot": { + "enum": [ false ] + } + } + } + ] }, "EntityRoleWhiteList": { "title": "Entity Role Whitelist Filter",