diff --git a/backend/src/main/resources/entity-attributes-filters-ui-schema.json b/backend/src/main/resources/entity-attributes-filters-ui-schema.json index d67364b21..c7bb95b1a 100644 --- a/backend/src/main/resources/entity-attributes-filters-ui-schema.json +++ b/backend/src/main/resources/entity-attributes-filters-ui-schema.json @@ -46,7 +46,7 @@ }, "properties": { "entityAttributesFilterTargetType": { - "title": "", + "title": "label.filter-target-type", "type": "string", "default": "ENTITY", "oneOf": [ @@ -71,6 +71,7 @@ ] }, "value": { + "title": "label.filter-target-value", "type": "array", "buttons": [ { diff --git a/backend/src/main/resources/i18n/messages.properties b/backend/src/main/resources/i18n/messages.properties index 5bf9688c9..90edf9bc7 100644 --- a/backend/src/main/resources/i18n/messages.properties +++ b/backend/src/main/resources/i18n/messages.properties @@ -243,6 +243,9 @@ label.filter-name=Filter Name label.filter-enabled=Filter Enabled label.filter-target=FilterTarget label.filter-type=Filter Type +label.filter-target-type=Filter Target Type +label.filter-target-value=Filter Target Value +label.target=Filter Target label.option=Option label.options=Options label.value=Value @@ -465,6 +468,9 @@ message.required-for-regex=Required for Regex message.file-doesnt-exist=The requested file to be processed does not exist on the server. message.database-constraint=There was a database constraint problem processing the request. Check the request to ensure that fields that must be unique are truly unique. +message.no-filters=No Filters +message.no-filters-added=No filters have been added to this Metadata Provider + 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 diff --git a/ui/src/app/app.routing.ts b/ui/src/app/app.routing.ts index 751b0a36c..34ad45010 100644 --- a/ui/src/app/app.routing.ts +++ b/ui/src/app/app.routing.ts @@ -16,7 +16,7 @@ const routes: Routes = [ @NgModule({ imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules, - anchorScrolling: 'enabled' + scrollOffset: [0, 64] })], exports: [RouterModule] }) diff --git a/ui/src/app/metadata/configuration/component/array-property.component.html b/ui/src/app/metadata/configuration/component/array-property.component.html index 969bd175e..692cb3a5f 100644 --- a/ui/src/app/metadata/configuration/component/array-property.component.html +++ b/ui/src/app/metadata/configuration/component/array-property.component.html @@ -22,7 +22,7 @@ - + @@ -30,32 +30,53 @@ -
- {{ attr.label }} -
- - true - - - false - +
+ +
+
+
+ {{ attr.label }} +
+ + true + + + false + +
-
+
{{ property.name }} -

-
    -
  • +

    + {{ v }} +
      +
    • + +   + {{ item }}
    + +
      +
    • + {{ item }} +
    • +
    +
\ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/array-property.component.scss b/ui/src/app/metadata/configuration/component/array-property.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/ui/src/app/metadata/configuration/component/array-property.component.ts b/ui/src/app/metadata/configuration/component/array-property.component.ts index 35d50dedd..a17ad01da 100644 --- a/ui/src/app/metadata/configuration/component/array-property.component.ts +++ b/ui/src/app/metadata/configuration/component/array-property.component.ts @@ -1,18 +1,21 @@ -import { Component, Input, OnChanges } from '@angular/core'; +import { Component, Input, OnChanges, Output, EventEmitter } from '@angular/core'; import { Property } from '../../domain/model/property'; import { Observable, of } from 'rxjs'; import { AttributesService } from '../../domain/service/attributes.service'; import { ConfigurationPropertyComponent } from './configuration-property.component'; +import UriValidator from '../../../shared/validation/uri.validator'; @Component({ selector: 'array-property', templateUrl: './array-property.component.html', - styleUrls: [] + styleUrls: ['./array-property.component.scss'] }) export class ArrayPropertyComponent extends ConfigurationPropertyComponent implements OnChanges { @Input() property: Property; + @Output() preview: EventEmitter = new EventEmitter(); + range = []; constructor( @@ -26,6 +29,10 @@ export class ArrayPropertyComponent extends ConfigurationPropertyComponent imple this.range = [...Array(keys).keys()]; } + isUrl(str: string): boolean { + return UriValidator.isUri(str); + } + get attributeList$(): Observable<{ key: string, label: string }[]> { if (this.property.widget && this.property.widget.hasOwnProperty('data')) { return of(this.property.widget.data); diff --git a/ui/src/app/metadata/configuration/component/configuration-property.component.ts b/ui/src/app/metadata/configuration/component/configuration-property.component.ts index 001a8235b..04d58ca41 100644 --- a/ui/src/app/metadata/configuration/component/configuration-property.component.ts +++ b/ui/src/app/metadata/configuration/component/configuration-property.component.ts @@ -16,7 +16,8 @@ export class ConfigurationPropertyComponent { return Object.keys(schema.properties); } - getItemType(items: Property): string { + getItemType(property: Property): string { + const items = property.items; return items.widget ? items.widget.id : 'default'; } diff --git a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html b/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html index b35efc1a9..bb04284ac 100644 --- a/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html +++ b/ui/src/app/metadata/configuration/component/filter-configuration-list-item.component.html @@ -20,10 +20,6 @@

- -   - Preview XML -
@@ -40,7 +36,9 @@ + [configuration]="configuration" + [entity]="filter" + [definition]="definition">
+ [configuration]="configuration$ | async" + id="configuration"> \ 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 e962fd310..19051596b 100644 --- a/ui/src/app/metadata/configuration/container/metadata-options.component.ts +++ b/ui/src/app/metadata/configuration/container/metadata-options.component.ts @@ -1,5 +1,5 @@ import { Store } from '@ngrx/store'; -import { Component, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; +import { Component, ChangeDetectionStrategy, OnDestroy, HostListener, ElementRef } from '@angular/core'; import { Observable, Subject } from 'rxjs'; import { @@ -24,11 +24,13 @@ import { ChangeFilterOrderUp, RemoveFilterRequest } from '../../filter/action/collection.action'; -import { takeUntil, map } from 'rxjs/operators'; +import { takeUntil, map, filter, delay } from 'rxjs/operators'; import { Metadata } from '../../domain/domain.type'; import { DeleteFilterComponent } from '../../provider/component/delete-filter.component'; import { ModalService } from '../../../core/service/modal.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { Router, Event, Scroll } from '@angular/router'; +import { ViewportScroller } from '@angular/common'; @Component({ selector: 'metadata-options-page', @@ -51,9 +53,14 @@ export class MetadataOptionsComponent implements OnDestroy { id: string; kind: string; + htmlTags = ['DIV', 'A', 'METADATA-CONFIGURATION', 'METADATA-HEADER']; + currentSection: string; + constructor( private store: Store, - private modalService: NgbModal + private modalService: NgbModal, + private router: Router, + private scroller: ViewportScroller ) { this.configuration$ = this.store.select(getConfigurationSections); this.model$ = this.store.select(getConfigurationModel); @@ -75,6 +82,18 @@ export class MetadataOptionsComponent implements OnDestroy { this.store.dispatch(new LoadFilterRequest(this.id)); } }); + + this.router.events.pipe( + takeUntil(this.ngUnsubscribe), + filter((e: Event): e is Scroll => e instanceof Scroll), + delay(1000) + ).subscribe(e => { + scroller.scrollToAnchor(e.anchor); + }); + } + + onScrollTo(element): void { + this.scroller.scrollToAnchor(element); } updateOrderUp(filter: MetadataFilter): void { diff --git a/ui/src/app/metadata/configuration/model/metadata-configuration.ts b/ui/src/app/metadata/configuration/model/metadata-configuration.ts index a06dda3f5..13886d1a3 100644 --- a/ui/src/app/metadata/configuration/model/metadata-configuration.ts +++ b/ui/src/app/metadata/configuration/model/metadata-configuration.ts @@ -1,4 +1,5 @@ import { Section } from './section'; +import { Metadata } from '../../domain/domain.type'; export interface MetadataConfiguration { sections: Section[]; diff --git a/ui/src/app/metadata/domain/model/property.ts b/ui/src/app/metadata/domain/model/property.ts index dcd5e9f1b..4768de9e4 100644 --- a/ui/src/app/metadata/domain/model/property.ts +++ b/ui/src/app/metadata/domain/model/property.ts @@ -7,6 +7,8 @@ export interface Property { properties: Property[]; widget?: { id: string; + data?: {key: string, label: string}[]; + dataUrl?: string; [propertyName: string]: any; }; } diff --git a/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts b/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts index 944fff229..60d09539f 100644 --- a/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts +++ b/ui/src/app/metadata/filter/model/entity-attributes-configuration.filter.ts @@ -47,17 +47,24 @@ export const EntityAttributesFilterConfiguration: Wizard = { }, formatter: (changes: MetadataFilter): any => changes, steps: [ + { + id: 'target', + label: 'label.target', + index: 1, + fields: [ + 'entityAttributesFilterTarget' + ] + }, { id: 'options', label: 'label.options', - index: 1, + index: 2, initialValues: [], fields: [ 'name', '@type', 'resourceId', 'version', - 'entityAttributesFilterTarget', 'filterEnabled', 'relyingPartyOverrides' ] @@ -65,7 +72,7 @@ export const EntityAttributesFilterConfiguration: Wizard = { { id: 'attributes', label: 'label.attributes', - index: 2, + index: 3, fields: [ 'attributeRelease' ] diff --git a/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts b/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts index 1047bf38e..0452c683f 100644 --- a/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts +++ b/ui/src/app/metadata/filter/model/nameid-configuration.filter.ts @@ -41,6 +41,14 @@ export const NameIDFilterConfiguration: Wizard = { parser: (changes: any): MetadataFilter => changes, formatter: (changes: MetadataFilter): any => changes, steps: [ + { + id: 'target', + label: 'label.target', + index: 1, + fields: [ + 'nameIdFormatFilterTarget' + ] + }, { id: 'options', label: 'label.options', @@ -48,7 +56,6 @@ export const NameIDFilterConfiguration: Wizard = { initialValues: [], fields: [ 'name', - 'nameIdFormatFilterTarget', 'filterEnabled', '@type', 'resourceId', diff --git a/ui/src/theme/modal.scss b/ui/src/theme/modal.scss index d2158f5f1..065d41840 100644 --- a/ui/src/theme/modal.scss +++ b/ui/src/theme/modal.scss @@ -26,3 +26,8 @@ delete-dialog { font-weight: 700; } } + +.popover.popover-lg { + width: auto; + max-width: none; +} \ No newline at end of file