Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
b00a5f060ee4690c7173491ceb2116c39f93ebb7
47d44c74207f3d773d1ffa718dc102fa887f1cab
7 changes: 1 addition & 6 deletions .sync-history
Original file line number Diff line number Diff line change
@@ -1,6 +1 @@
9259609ee 2024-02-16 Merged PR 64916: 445342 - Fix hyperivew navigation
4fd65a01d 2024-02-15 Merged PR 64883: 444602-account-sidesheet-filtering
102e1446b 2024-02-14 Merged PR 64891: 446290 - Fix edit fk autocomplete data loading
7675877fb 2024-02-13 Merged PR 64855: 446162 - Fix history comparison datepicker
ef7cca96b 2024-02-13 Merged PR 64848: 446188 - Fix history timeline bug
fcca26d50 2024-02-12 Merged PR 64833: Develop hyerpview navigation
41487b63c 2024-02-29 Merged PR 65170: #446439 - Develop new request url params
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,19 @@
# Identity Manager HTML5 applications

## Change log
### March 11, 2024
The v92 branch has been updated with fixes for the following issues.

- 447996: In DataSource Toolbar, opening a view which has custom filters, adds custom filters to the GET, but not the UI
- 447997: In DataSource Toolbar, Reset view removes custom filters from GET, but not from the UI
- 447702: Filtering: Canceling defining a filter does not reset filters (reappearing)
- 446439: Portal should support pre-selections by URL parameter
- 442023: Add configuration to globally enable HyperView navigation
- 446435: Attestation case details: Object picker in hyperview tab shows user-friendly display names
- 448406: Not all entitlements were visible in the product request details for a role
- 446478: The number of pending requests and shopping cart items were not being updated correctly.
- 447474: Fixed masthead color when applying a custom theme

### February 28, 2024
The v92 branch has been updated with fixes for the following issues.

Expand Down
5 changes: 2 additions & 3 deletions imxweb/custom-theme/custom-theme.scss
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ $theme_font_family: 'Source Sans Pro, "Helvetica Neue", sans-serif' !default;

@use 'sass:math';
@use '@angular/material' as mat;
@use '@elemental-ui/core/src/styles/theming/theme' as theme;

@import '@elemental-ui/core/src/styles/functions/to_number';

Expand Down Expand Up @@ -38,6 +39,4 @@ $theme: mat.define-light-theme(
)
);

.custom-theme {
@include mat.all-component-themes($theme);
}
@include theme.theme('custom-theme', $theme);
Binary file modified imxweb/imx-modules/imx-api-aad.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-aob.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-apc.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-att.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-cpl.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-dpr.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-hds.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-o3e.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-o3t.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-olg.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-pol.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-qbm.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-qer.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-rmb.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-rms.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-rps.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-sac.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-tsb.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-uci.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-qbm-dbts.tgz
Binary file not shown.
20 changes: 15 additions & 5 deletions imxweb/projects/att/src/lib/decision/attestation-case.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import {
BaseReadonlyCdr,
ClassloggerService,
ColumnDependentReference,
MetadataService,
SnackBarService,
SystemInfoService,
} from 'qbm';
Expand Down Expand Up @@ -107,6 +108,7 @@ export class AttestationCaseComponent implements OnDestroy, OnInit {
private readonly busyService: EuiLoadingService,
private readonly systemInfoService: SystemInfoService,
private readonly logger: ClassloggerService,
private readonly metadataService: MetadataService,
authentication: AuthenticationService
) {
this.case = data.case;
Expand Down Expand Up @@ -228,12 +230,20 @@ export class AttestationCaseComponent implements OnDestroy, OnInit {
});
}

public setRelatedOptions(): void {
public async setRelatedOptions(): Promise<void> {
this.relatedOptions =
this.data.case.data?.RelatedObjects.map((relatedObject) => {
const objectType = DbObjectKey.FromXml(relatedObject.ObjectKey);
return { ObjectKey: relatedObject.ObjectKey, Display: `${relatedObject.Display} - ${objectType.TableName}` };
}) || [];
(await Promise.all(
this.data.case.data?.RelatedObjects.map(async (relatedObject) => {
const objectType = DbObjectKey.FromXml(relatedObject.ObjectKey);
if (!this.metadataService.tables[objectType.TableName]) {
await this.metadataService.update([objectType.TableName]);
}
return {
ObjectKey: relatedObject.ObjectKey,
Display: `${relatedObject.Display} - ${this.metadataService.tables[objectType.TableName].DisplaySingular}`,
};
})
)) || [];
}

public setHyperviewObject(selectedRelatedObject: AttestationRelatedObject): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -480,16 +480,8 @@ export class DataSourceToolbarComponent implements OnChanges, OnInit, OnDestroy
this.addSearchFilter(filter);
});

const tree = config?.Filter?.find((elem) => elem.ColumnName === this.columnForTree);
if (tree) {
const display = this.filterTreeItems.Elements.find((elem) => elem.Filter.Value1 === tree.Value1)?.Display;
this.currentFilterData = [{ display, filter: tree }];
if (this.settings.navigationState.filter) {
this.settings.navigationState.filter.push(tree);
} else {
this.settings.navigationState.filter = [tree];
}
}
this.addTreeFilterFromConfig(config);
this.addCustomFilterFromConfig(config);

if (config?.GroupBy) {
this.applyGroupBy(config);
Expand Down Expand Up @@ -1277,7 +1269,7 @@ export class DataSourceToolbarComponent implements OnChanges, OnInit, OnDestroy
if (filterdata) {
//Get all filter, that were not associaed with the tree filter
const otherFilter = (this.settings.navigationState.filter ?? []).filter(
(elem) => elem.ColumnName !== filterdata[0].filter.ColumnName
(elem) => elem.ColumnName !== filterdata[0].filter.ColumnName,
);
this.currentFilterData = filterdata;
this.filterTreeSelectionChanged.emit(this.currentFilterData.map((filter) => filter.filter).concat(otherFilter)); // combine the two filter again
Expand Down Expand Up @@ -1334,6 +1326,8 @@ export class DataSourceToolbarComponent implements OnChanges, OnInit, OnDestroy
if (this.filtersCurrentlyApplied) {
this.clearFilters(false);
}

this.filterWizardExpression = null;
if (emit) {
this.navigationStateChanged.emit(this.settings.navigationState);
}
Expand All @@ -1348,7 +1342,7 @@ export class DataSourceToolbarComponent implements OnChanges, OnInit, OnDestroy
this.currentFilterData = [];
if (emit) {
this.filterTreeSelectionChanged.emit(
this.settings.navigationState.filter?.filter((elem) => elem.ColumnName != currentTree.ColumnName)
this.settings.navigationState.filter?.filter((elem) => elem.ColumnName != currentTree.ColumnName),
);
}
}
Expand Down Expand Up @@ -1600,6 +1594,43 @@ export class DataSourceToolbarComponent implements OnChanges, OnInit, OnDestroy
this.settingsChanged.emit(this.settings);
}

/**
* @ignore Used internally
* Checks, if there is a tree filter defined in the config.
* If a tree filter is defined, it initializes the currentFilterData object and adds the parameter to the navigation.
* @param config the configuration, that should be loaded.
*/
private addTreeFilterFromConfig(config: DSTViewConfig): void {
const tree = config?.Filter?.find((elem) => elem.ColumnName === this.columnForTree);
if (tree) {
const display = this.filterTreeItems.Elements.find((elem) => elem.Filter.Value1 === tree.Value1)?.Display;
this.currentFilterData = [{ display, filter: tree }];
if (this.settings.navigationState.filter) {
this.settings.navigationState.filter.push(tree);
} else {
this.settings.navigationState.filter = [tree];
}
}
}

/**
* @ignore Used internally
* Checks, if there is a custom filter defined in the config.
* If a custom filter is defined, it initializes the filterWizardExpression object and adds the parameter to the navigation.
* @param config the configuration, that should be loaded.
*/
private addCustomFilterFromConfig(config: DSTViewConfig): void {
const expression = config?.Filter?.find((elem) => elem.Expression != null);
if (expression) {
this.filterWizardExpression = { Expression: expression.Expression };
if (this.settings.navigationState.filter) {
this.settings.navigationState.filter.push(expression);
} else {
this.settings.navigationState.filter = [expression];
}
}
}

/**
* @ignore Used internally
* Sets any initial values for the supplied filters and makes a call to update the navigation state
Expand Down Expand Up @@ -1720,6 +1751,7 @@ export class DataSourceToolbarComponent implements OnChanges, OnInit, OnDestroy
if (
this.isEnterDisabled ||
filter?.ColumnName === this.columnForTree ||
filter?.Expression != null ||
(!filter && (!this.searchControl.value || (!!this.searchControl.value && this.searchControl.value?.length === 0)))
) {
// Here we return early if there is nothing to search over
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<ng-container *ngFor="let filter of settings?.filters">
<ng-container *ngFor="let filter of filters">
<mat-card class="mat-elevation-z2" *ngIf="!hiddenFilterSet.has(filter.Name)">
<mat-card-content>
<h1 *ngIf="filter.Options.length > 1" class="imx-filter-title">{{ filter.Description || filter.Name }}</h1>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
*/

import { AfterViewInit, Component, EventEmitter, Inject, Input, NgZone, OnDestroy, OnInit, Output, QueryList, ViewChildren } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { MatCardContent } from '@angular/material/card';
import { MatCheckboxChange } from '@angular/material/checkbox';
import { MatSelectChange } from '@angular/material/select';
import { MatTableDataSource } from '@angular/material/table';
Expand All @@ -38,7 +36,7 @@ import { DataSourceToolbarSettings } from '../../data-source-toolbar-settings';
import { DSTViewConfig } from '../../data-source-toolbar-view-config.interface';
import { FilterFormState, FilterTypeIdentifier, FilterWizardSidesheetData } from '../filter-wizard.interfaces';
import { FilterWizardService } from '../filter-wizard.service';

import * as _ from 'lodash';
@Component({
selector: 'imx-predefined-filter',
templateUrl: './predefined-filter.component.html',
Expand Down Expand Up @@ -103,6 +101,8 @@ export class PredefinedFilterComponent implements OnInit, AfterViewInit, OnDestr
public hiddenFilterSet: Set<string> = new Set([]);
public filterOptionLengthThreshold = 5;

public filters: DataSourceToolbarFilter[] = [];

/**
* This is the mat table datasource.
*/
Expand Down Expand Up @@ -130,8 +130,9 @@ export class PredefinedFilterComponent implements OnInit, AfterViewInit, OnDestr
constructor(private readonly filterService: FilterWizardService, @Inject(EUI_SIDESHEET_DATA) public data?: FilterWizardSidesheetData) {
// this.hiddenFilters = ['namespace'];
this.id = data.id;
this.settings = data.settings;
this.settings = Object.create(data.settings);
this.selectedFilters = data.selectedFilters;
this.filters = _.cloneDeep(data.settings.filters);
this.internalSelectedFilters = Object.create(this.selectedFilters);
this.formState = { canClearFilters: this.selectedFilters.length > 0, dirty: false, filterIdentifier: FilterTypeIdentifier.Predefined };

Expand Down Expand Up @@ -241,7 +242,7 @@ export class PredefinedFilterComponent implements OnInit, AfterViewInit, OnDestr
* @returns the filter with the selected option
*/
public getSelectedFilterFromName(filterName: string, value: string): DataSourceToolbarSelectedFilter {
const filter = this.settings.filters?.find((filter) => filter.Name === filterName);
const filter = this.filters?.find((filter) => filter.Name === filterName);
if (filter) {
filter.CurrentValue = value;
const selectedOption = this.findFilterOptionFromValue(value, filter);
Expand Down Expand Up @@ -286,7 +287,7 @@ export class PredefinedFilterComponent implements OnInit, AfterViewInit, OnDestr
* Clears all selected filter values and updates and emits the new navigationState
*/
private clearFilters(emit = true): void {
this.settings.filters?.forEach((filter) => (filter.CurrentValue = undefined));
this.filters?.forEach((filter) => (filter.CurrentValue = undefined));
const containsCustomFilters = this.selectedFiltersContainsCustomFilters();
if (containsCustomFilters) {
this.customSelectedFilterRemoved.emit();
Expand Down Expand Up @@ -321,15 +322,17 @@ export class PredefinedFilterComponent implements OnInit, AfterViewInit, OnDestr
*/
private updateNavigateStateWithFilters(emit = true): void {
this.selectedFilters = Object.create(this.internalSelectedFilters);
this.settings.filters?.forEach((filter) => {
this.filters?.forEach((filter) => {
if (filter.CurrentValue) {
this.settings.navigationState[filter.Name] = filter.CurrentValue;
this.settings.filters.find(elem=>elem.Name === filter.Name).CurrentValue = filter.CurrentValue;
if (filter?.Column) {
// This is a local filter and we must filter over this column
this.localFilterState.filterColumns[filter.Column] = filter.CurrentValue;
}
} else {
delete this.settings.navigationState[filter.Name];
delete this.settings.filters.find((elem) => elem.Name === filter.Name).CurrentValue;
if (filter?.Column) {
delete this.localFilterState.filterColumns[filter.Column];
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
<mat-card [@expandDiv]="{ value: expandState, params: { expandWidth: expandWidth } }" class="snavigation" [ngClass]="{ 'snavigation--expanded': sideNavExpanded, 'mat-card--hidden': !showSidenavHeader}">
<mat-card
[@expandDiv]="{ value: expandState, params: { expandWidth: expandWidth } }"
class="snavigation"
[ngClass]="{ 'snavigation--expanded': sideNavExpanded, 'mat-card--hidden': !showSidenavHeader }"
>
<mat-sidenav-container>
<mat-sidenav mode="side" opened disableClose="true" [ngClass]="{ 'snavigation-side--expanded': sideNavExpanded }">
<div class="snavigation-side">
Expand All @@ -16,16 +20,17 @@ <h3 class="snavigation-side-toggle-header">{{ headerText }}</h3>
>
<eui-icon icon="search"></eui-icon>
</button>
<imx-data-source-toolbar #dst
*ngIf="dynamicDataSource?.dstSettings"
[@expandSearch]="{ value: searchState, params: { expandWidth: expandWidth } }"
[alwaysVisible]="true"
[settings]="dynamicDataSource.dstSettings"
[options]="['search']"
[searchBoxText]="'#LDS#Search' | translate"
[useThemedStyle]="true"
(search)="onSearch($event)"
(navigationStateChanged)="onSearch()"
<imx-data-source-toolbar
#dst
*ngIf="dynamicDataSource?.dstSettings"
[@expandSearch]="{ value: searchState, params: { expandWidth: expandWidth } }"
[alwaysVisible]="true"
[settings]="dynamicDataSource.dstSettings"
[options]="['search', 'filter']"
[searchBoxText]="'#LDS#Search' | translate"
[useThemedStyle]="true"
(search)="onSearch($event)"
(navigationStateChanged)="onSearch()"
></imx-data-source-toolbar>
<button
*ngIf="sideNavExpanded"
Expand Down Expand Up @@ -59,7 +64,7 @@ <h3 class="rotate-90">{{ headerText }}</h3>
<mat-card *ngIf="dataSource" class="snavigation-side-content">
<mat-tree *ngIf="!initializingData" [dataSource]="dataSource" [treeControl]="treeControl" class="tree">
<mat-tree-node *matTreeNodeDef="let node">
<div class="mat-tree-node" [ngClass]="{'mat-tree-node--selected': isSelected(node)}">
<div class="mat-tree-node" [ngClass]="{ 'mat-tree-node--selected': isSelected(node) }">
<button mat-icon-button disabled>
<eui-icon size="s"></eui-icon>
</button>
Expand All @@ -70,33 +75,27 @@ <h3 class="rotate-90">{{ headerText }}</h3>
</mat-tree-node>

<mat-nested-tree-node *matTreeNodeDef="let node; when: hasChild">
<div class="mat-tree-node" [ngClass]="{'mat-tree-node--selected': isSelected(node)}">
<button
mat-button
matTreeNodeToggle
class="mat-icon-button"
[attr.aria-label]="'#LDS#Expand' | translate"
data-imx-identifier="sidenav-tree-parent-toggle"
>
<eui-icon size="s" [icon]="treeControl.isExpanded(node) ? 'chevrondown' : 'chevronright'"></eui-icon>
</button>
<button mat-button class="tree-item-button" data-imx-identifier="sidenav-tree-parent-select" (click)="selectNode(node)">
<ng-container *ngTemplateOutlet="treeNodeTemplate; context: { $implicit: node, selected: isSelected(node)}"></ng-container>
</button>
</div>
<div [class.tree-invisible]="!treeControl.isExpanded(node)" role="group">
<ng-container matTreeNodeOutlet></ng-container>
</div>
<div class="mat-tree-node" [ngClass]="{ 'mat-tree-node--selected': isSelected(node) }">
<button mat-button matTreeNodeToggle class="mat-icon-button" [attr.aria-label]="'#LDS#Expand' | translate" data-imx-identifier="sidenav-tree-parent-toggle">
<eui-icon size="s" [icon]="treeControl.isExpanded(node) ? 'chevrondown' : 'chevronright'"></eui-icon>
</button>
<button mat-button class="tree-item-button" data-imx-identifier="sidenav-tree-parent-select" (click)="selectNode(node)">
<ng-container *ngTemplateOutlet="treeNodeTemplate; context: { $implicit: node, selected: isSelected(node) }"></ng-container>
</button>
</div>
<div [class.tree-invisible]="!treeControl.isExpanded(node)" role="group">
<ng-container matTreeNodeOutlet></ng-container>
</div>
</mat-nested-tree-node>
</mat-tree>
</mat-card>

<!-- Dynamic tree -->
<mat-card *ngIf="dynamicDataSource" class="snavigation-side-content" [ngClass]="{ 'snavigation-side-content--center': initializingData || !hasData}">
<mat-card *ngIf="dynamicDataSource && sideNavExpanded" class="snavigation-side-content" [ngClass]="{ 'snavigation-side-content--center': initializingData || !hasData }">
<mat-spinner *ngIf="initializingData" [diameter]="100" [attr.aria-label]="'#LDS#Loading...' | translate"></mat-spinner>
<div *ngIf="!initializingData && !hasData" class="imx-no-data">
<eui-icon icon="content-alert"></eui-icon>
<span>{{noResultText | translate}}</span>
<span>{{ noResultText | translate }}</span>
</div>
<mat-tree *ngIf="!initializingData" [dataSource]="dynamicDataSource" [treeControl]="treeControl" class="tree">
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding matTreeNodePaddingIndent="20">
Expand All @@ -112,13 +111,7 @@ <h3 class="rotate-90">{{ headerText }}</h3>

<mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding matTreeNodePaddingIndent="20">
<div class="mat-tree-node" [ngClass]="{ 'mat-tree-node--selected': isSelected(node) }">
<button
mat-button
matTreeNodeToggle
class="mat-icon-button"
[attr.aria-label]="'#LDS#Expand' | translate"
data-imx-identifier="sidenav-tree-parent-toggle"
>
<button mat-button matTreeNodeToggle class="mat-icon-button" [attr.aria-label]="'#LDS#Expand' | translate" data-imx-identifier="sidenav-tree-parent-toggle">
<eui-icon size="s" [icon]="treeControl.isExpanded(node) ? 'chevrondown' : 'chevronright'"></eui-icon>
</button>
<button mat-button color="primary" class="tree-item-button" data-imx-identifier="sidenav-tree-parent-select" (click)="selectNode(node)">
Expand Down
4 changes: 2 additions & 2 deletions imxweb/projects/qbm/src/lib/sqlwizard/sqlwizard.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ import { MatButtonToggleChange } from '@angular/material/button-toggle';
selector: 'imx-sqlwizard',
})
export class SqlWizardComponent implements OnInit, OnChanges, AfterViewInit {
public readonly andConditionLabel = '#LDS#ALL';
public readonly orConditionLabel = '#LDS#ANY';
public readonly andConditionLabel = '#LDS#Condition_And';
public readonly orConditionLabel = '#LDS#Condition_Or';

public LogOp = _logOp;
public viewSettings: SqlViewSettings;
Expand Down
Loading