Skip to content

Commit

Permalink
Merge branch 'master' into feature/SHIBUI-1385-QA
Browse files Browse the repository at this point in the history
  • Loading branch information
Bill Smith committed Sep 11, 2019
2 parents 33b23c6 + c6cad10 commit 188f6af
Show file tree
Hide file tree
Showing 23 changed files with 257 additions and 25 deletions.
2 changes: 2 additions & 0 deletions backend/src/main/resources/i18n/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,8 @@ message.no-filters-added=No filters have been added to this Metadata Provider
message.create-new-version-from-version=Create New Version from Previous Settings
message.restoring-this-version-will-copy=Restoring this version will copy the Version ({ date }) configuration and create a new Version from the selected version settings. You can then edit the configuration before saving the new version.

message.invalid-regex-pattern=Invalid Regular Expression

tooltip.entity-id=Entity ID
tooltip.service-provider-name=Service Provider Name (Dashboard Display Only)
tooltip.force-authn=Disallows use (or reuse) of authentication results and login flows that don\u0027t provide a real-time proof of user presence in the login process
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<span [translate]="property.items.properties[prop].title">{{ property.items.properties[prop].title }}</span>
</div>
<ng-container *ngFor="let version of property.value">
<div *ngIf="version[i]"
<div *ngIf="version && version[i]"
[ngbPopover]="version[i][prop]"
triggers="mouseenter:mouseleave"
container="body"
Expand All @@ -16,7 +16,7 @@
popoverClass="popover-lg popover-info">
{{ version[i][prop] }}
</div>
<div *ngIf="!version[i]" [ngStyle]="{'width': width}">
<div *ngIf="!version || !version[i]" [ngStyle]="{'width': width}">
-
</div>
</ng-container>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ <h2 class="mb-4" [ngSwitch]="type$ | async">
<metadata-configuration [configuration]="configuration$ | async" id="configuration"></metadata-configuration>
</ng-container>
<ng-container *ngIf="!(configuration$ | async)">
<metadata-configuration [configuration]="configuration$ | async" id="configuration"></metadata-configuration>
<div class="d-flex justify-content-center">
<i class="fa fa-spinner fa-pulse fa-4x fa-fw"></i>
<span class="sr-only">Loading...</span>
Expand Down
11 changes: 11 additions & 0 deletions ui/src/app/metadata/configuration/effect/restore.effect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import {
import { SetMetadata } from '../action/configuration.action';
import { removeNulls } from '../../../shared/util';
import { getModel } from '../../../wizard/reducer';
import { ClearProviderSelection } from '../../provider/action/collection.action';
import { ClearResolverSelection } from '../../resolver/action/collection.action';


@Injectable()
Expand Down Expand Up @@ -107,6 +109,15 @@ export class RestoreEffects {
)
);

@Effect()
restoreVersionSuccessClear$ = this.actions$.pipe(
ofType<RestoreVersionSuccess>(RestoreActionTypes.RESTORE_VERSION_SUCCESS),
map(action => action.payload),
map(({ id, type }) =>
type === 'provider' ? new ClearProviderSelection() : new ClearResolverSelection()
)
);

@Effect()
restoreVersionSuccessReload$ = this.actions$.pipe(
ofType<RestoreVersionSuccess>(RestoreActionTypes.RESTORE_VERSION_SUCCESS),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ describe('EntityAttributesFilter Entity', () => {
expect(entity.resourceId).toBe('foo');
expect(entity.enabled).toBe(entity.filterEnabled);
expect(entity.id).toBe(entity.resourceId);
expect(entity.getId()).toBe(entity.entityId);
expect(entity.getDisplayId()).toBe(entity.entityId);
expect(entity.getId()).toBe(entity.resourceId);
expect(entity.getDisplayId()).toBe(entity.resourceId);
expect(entity.isDraft()).toBe(false);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ export class EntityAttributesFilterEntity implements MetadataFilter, MetadataEnt
}

getId(): string {
return this.entityId;
return this.resourceId;
}

getDisplayId(): string {
return this.entityId;
return this.resourceId;
}

isDraft(): boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { NameIDFormatFilterEntity } from './nameid-format-filter';

describe('NameIDFormatFilterEntity Entity', () => {
let entity: NameIDFormatFilterEntity;
beforeEach(() => {
entity = new NameIDFormatFilterEntity({
resourceId: 'foo',
filterEnabled: false
});
});

it('should be an instance', () => {
expect(entity).toBeDefined();
expect(entity.resourceId).toBe('foo');
expect(entity.enabled).toBe(entity.filterEnabled);
expect(entity.id).toBe(entity.resourceId);
expect(entity.getId()).toBe(entity.resourceId);
expect(entity.getDisplayId()).toBe(entity.resourceId);
expect(entity.isDraft()).toBe(false);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ describe('Entity Attributes filter form', () => {
it('should return an empty object for validators', () => {
expect(Object.keys(EntityAttributesFilter.getValidators())).toEqual([
'/',
'/name'
'/name',
'/entityAttributesFilterTarget'
]);
});

Expand Down
16 changes: 16 additions & 0 deletions ui/src/app/metadata/filter/model/entity-attributes.filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { FormDefinition } from '../../../wizard/model';
import { MetadataFilter } from '../../domain/model';
import { removeNulls } from '../../../shared/util';
import { EntityAttributesFilterEntity } from '../../domain/entity';
import { RegexValidator } from '../../../shared/validation/regex.validator';
import { getFilterNames } from '../reducer';
import { memoize } from '../../../shared/memo';

const checkRegex = memoize(RegexValidator.isValidRegex);

export const EntityAttributesFilter: FormDefinition<MetadataFilter> = {
label: 'EntityAttributes',
Expand Down Expand Up @@ -37,6 +41,18 @@ export const EntityAttributesFilter: FormDefinition<MetadataFilter> = {
params: [value]
} : null;
return err;
},
'/entityAttributesFilterTarget': (value, property, form) => {
if (!form || !form.value || !form.value.entityAttributesFilterTarget ||
form.value.entityAttributesFilterTarget.entityAttributesFilterTargetType !== 'REGEX') {
return null;
}
return checkRegex(value.value[0]) ? null : {
code: 'INVALID_REGEX',
path: `#${property.path}`,
message: 'message.invalid-regex-pattern',
params: [value.value[0]]
};
}
};
return validators;
Expand Down
3 changes: 2 additions & 1 deletion ui/src/app/metadata/filter/model/nameid.filter.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ describe('NameID Format filter form', () => {
it('should return an empty object for validators', () => {
expect(Object.keys(NameIDFilter.getValidators())).toEqual([
'/',
'/name'
'/name',
'/nameIdFormatFilterTarget'
]);
});

Expand Down
16 changes: 16 additions & 0 deletions ui/src/app/metadata/filter/model/nameid.filter.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { FormDefinition } from '../../../wizard/model';
import { MetadataFilter } from '../../domain/model';
import { NameIDFormatFilterEntity } from '../../domain/entity/filter/nameid-format-filter';
import { RegexValidator } from '../../../shared/validation/regex.validator';
import { getFilterNames } from '../reducer';
import { memoize } from '../../../shared/memo';

const checkRegex = memoize(RegexValidator.isValidRegex);

export const NameIDFilter: FormDefinition<MetadataFilter> = {
label: 'NameIDFormat',
Expand Down Expand Up @@ -36,6 +40,18 @@ export const NameIDFilter: FormDefinition<MetadataFilter> = {
params: [value]
} : null;
return err;
},
'/nameIdFormatFilterTarget': (value, property, form) => {
if (!form || !form.value || !form.value.nameIdFormatFilterTarget ||
form.value.nameIdFormatFilterTarget.nameIdFormatFilterTargetType !== 'REGEX') {
return null;
}
return checkRegex(value.value[0]) ? null : {
code: 'INVALID_REGEX',
path: `#${property.path}`,
message: 'message.invalid-regex-pattern',
params: [value.value[0]]
};
}
};
return validators;
Expand Down
24 changes: 24 additions & 0 deletions ui/src/app/metadata/provider/reducer/index.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { getFilteredListFn } from './';

describe('Provider Reducer selectors', () => {
describe(`getFilteredListFn method`, () => {
it('should return a list without the provider`s property', () => {

const fn = getFilteredListFn('name');
const name = 'foo';
const collection = ['foo', 'bar', 'baz'];
const provider = { name };

expect(fn(collection, provider)).toEqual(['bar', 'baz']);
});

it('should return the list if the provider passed is null', () => {

const fn = getFilteredListFn('name');
const name = 'foo';
const collection = ['foo', 'bar', 'baz'];

expect(fn(collection, null)).toEqual(['foo', 'bar', 'baz']);
});
});
});
13 changes: 5 additions & 8 deletions ui/src/app/metadata/provider/reducer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,19 +66,16 @@ export const getProviderIds = createSelector(getCollectionState, fromCollection.
export const getProviderCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded);

export const getProviderNames = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.name));
export const getFilteredProviderNames = createSelector(
getProviderNames,
getSelectedProvider, (names, provider) => names.filter(name => name !== provider.name)
);

export const getFilteredListFn = (property: string) =>
(collection, provider) => !provider ? collection : collection.filter(val => val !== provider[property]);

export const getFilteredProviderNames = createSelector(getProviderNames, getSelectedProvider, getFilteredListFn('name'));

export const getProviderFilters = createSelector(getSelectedProvider, provider => provider.metadataFilters);

export const getProviderXmlIds = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.xmlId));
export const getOrderedProviders = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn);
export const getOrderedProvidersInSearch = createSelector(getAllProviders, getProviderOrder, utils.mergeOrderFn);

export const getFilteredProviderXmlIds = createSelector(
getProviderXmlIds,
getSelectedProvider, (ids, provider) => ids.filter(id => id !== provider.xmlId)
);
export const getFilteredProviderXmlIds = createSelector(getProviderXmlIds, getSelectedProvider, getFilteredListFn('xmlId'));
9 changes: 8 additions & 1 deletion ui/src/app/metadata/resolver/action/collection.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export enum ResolverCollectionActionTypes {
SELECT = '[Metadata Resolver] Select',
SELECT_SUCCESS = '[Metadata Resolver] Select Success',

CLEAR_SELECTION = '[Metadata Resolver] Selection Clear',

UPDATE_RESOLVER_REQUEST = '[Metadata Resolver] Update Request',
UPDATE_RESOLVER_SUCCESS = '[Metadata Resolver] Update Success',
UPDATE_RESOLVER_FAIL = '[Metadata Resolver] Update Fail',
Expand Down Expand Up @@ -143,6 +145,10 @@ export class CreateResolverFromUrlRequest implements Action {
constructor(public payload: { name: string, url: string }) { }
}

export class ClearResolverSelection implements Action {
readonly type = ResolverCollectionActionTypes.CLEAR_SELECTION;
}

export type ResolverCollectionActionsUnion =
| LoadResolverRequest
| LoadResolverSuccess
Expand All @@ -162,4 +168,5 @@ export type ResolverCollectionActionsUnion =
| UpdateResolverFail
| UpdateResolverConflict
| UploadResolverRequest
| CreateResolverFromUrlRequest;
| CreateResolverFromUrlRequest
| ClearResolverSelection;
16 changes: 16 additions & 0 deletions ui/src/app/metadata/resolver/effect/collection.effects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import { I18nService } from '../../../i18n/service/i18n.service';
import * as fromRoot from '../../../app.reducer';
import * as fromI18n from '../../../i18n/reducer';
import { FileBackedHttpMetadataResolver } from '../../domain/entity';
import { UpdateSaving } from '../action/entity.action';


/* istanbul ignore next */
Expand Down Expand Up @@ -79,6 +80,21 @@ export class ResolverCollectionEffects {
})
);

@Effect()
updateResolverSavingOnRequest$ = this.actions$.pipe(
ofType<UpdateResolverRequest>(ResolverCollectionActionTypes.UPDATE_RESOLVER_REQUEST),
map(action => new UpdateSaving(true)),
);

@Effect()
updateResolverSavingOnResult$ = this.actions$.pipe(
ofType<UpdateResolverSuccess | UpdateResolverFail>(
ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS,
ResolverCollectionActionTypes.UPDATE_RESOLVER_FAIL
),
map(action => new UpdateSaving(false)),
);

@Effect({ dispatch: false })
updateResolverSuccessRedirect$ = this.actions$.pipe(
ofType<UpdateResolverSuccess>(ResolverCollectionActionTypes.UPDATE_RESOLVER_SUCCESS),
Expand Down
7 changes: 7 additions & 0 deletions ui/src/app/metadata/resolver/reducer/collection.reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ export function reducer(state = initialState, action: ResolverCollectionActionsU
});
}

case ResolverCollectionActionTypes.CLEAR_SELECTION: {
return {
...state,
selectedResolverId: null
};
}

default: {
return state;
}
Expand Down
4 changes: 2 additions & 2 deletions ui/src/app/schema-form/widget/array/array.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ export interface FormError {
code: string;
description: string;
message: string;
params: any[];
params?: any[];
path: string;
schemaId: any;
schemaId?: any;
}

@Component({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,21 @@
</small>
</ng-container>
<ng-container *ngSwitchCase="'REGEX'">
<input [id]="formProperty._canonicalPath + '.target'" class="form-control" type="text" [formControl]="script" name="script" />
<small id="regex-help" class="form-text text-secondary">
<input [id]="formProperty._canonicalPath + '.target'"
class="form-control"
type="text"
[formControl]="script"
name="script" />
<small id="regex-help" class="form-text text-secondary" *ngIf="!(hasErrors$ | async)">
<translate-i18n key="message.required-for-regex">Required for Regex</translate-i18n>
&nbsp;
</small>
<small class="form-text text-danger px-2" *ngIf="hasErrors$ | async">
<ng-container *ngFor="let error of errors$ | async; let first=first;">
<ng-container *ngIf="!first">, </ng-container>
<translate-i18n [key]="error.message">{{ error.message }}</translate-i18n>
</ng-container>
</small>
</ng-container>
</div>
<div class="ml-2" *ngIf="targetType === 'ENTITY'">
Expand Down
Loading

0 comments on commit 188f6af

Please sign in to comment.