Skip to content

Commit d5d43b6

Browse files
Martina-Graeber-One-Identityimx-sync-bot
andauthored
Sync repo from v93 to v93 20260306062634 (#468)
* Automated sync from source branch v93 * Updates after sync --------- Co-authored-by: imx-sync-bot <imx-sync-bot@oneidentity>
1 parent 6c57b93 commit d5d43b6

15 files changed

Lines changed: 322 additions & 67 deletions

.commit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9f9b41ea6b7a23f1560ad6de21d34a4522812008
1+
194e2d94b8f2cc18b22a25554c2403b02016946c

.sync-history

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
6b9a41936 2026-01-26 Merged PR 88635: #651891 - Fix nested table selection clearing (v9.3)

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
### March 6, 2026
2+
- 696400: Fixes an issue with paging in grouped attestation cases due to a missing StartIndex property.
3+
- 695798: Fixes an issue with direct product access via URL when login is required, and the user has a display language configured.
4+
- 648348 (648345): Adds historical attestation decisions for an object.
5+
16
### Febraury 12, 2026
27
- 6487639 Fixes an issue with unsupported system role creation.
38
- Minor npm audit fix.

imxweb/imx-modules/imx-api-qer.tgz

82 Bytes
Binary file not shown.

imxweb/imx-modules/imx-api-qer.tgz-hash

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ E6573E34E07D56A25D5A5E5AE4B4B8944C02BAC5479D6A7870003C698401BC6E7D3B8FC6E11FA256
22
52822F64AEA2B42445A1A01278F864061078D3E60DF1F530F19FEA5E077643DE3CAC8B4A4F065F238F2ED260EF8A0AEC94E5711DF64D75DC9CEB1A4C35A865D8 rollup.config.js
33
565D30DE7CA344FE6BB6724E1208DEE942D0CEDCE31BDD06F11B8C9E8DA76466100FA64B33FB780C2822F4EAC1B170EF1A2E73BDE93498BCFA185923278A07EE .npmrc
44
CDA6F9710EA704A107981280AEA8D50763ED4203BBBB76228240EF406317A6CA626CDD50E56B24D9F3DF30F0311228022854BDCE81EF57FABB52581A8769667D package-lock.json
5-
CBB15ECCF12D70E8403ADBA3444B6EA40F1D2A0A96E04496BF2BC65B299C2C01F141EC29E78C714BD4C70D10A6912377C90DB9C85F819D7327F5043DA6C3BED2 imx-api-qer.es5.js
6-
323727FAA8685E877CC066053A77BD3FE9E95FC7D560C6D3002529A8625B66BFD0B9171373A960E1F4515BEA1DCFCEE95DA4F95574BBB23E30FADBA77ACA45B1 imx-api-qer.umd.js
5+
1E1970AB55D673074C708E80C34B84466BE55676830EE873CA7F15B9ADD805063C776729BEC6E499D77433866ADCA3F451F01B8AAB5E1D7DA7E6C51114FA756F imx-api-qer.es5.js
6+
4638386E663799DF28E7113E164E6FC2A684954970633BF9D600689D272A8ACF9C3CB976473880D7A47CED637AFB287877D55FDEA47EE3AD29413FE6700CEEAF imx-api-qer.umd.js
77
A9C0B61DDB3B45B9F836C8BF15DA912EC954166DEEC833354ADD50790761401B38B559EDFCF7794D6FD4747F668376F6FF86DC5AB0DE5415BFAC3FC5451815A9 index.d.ts
8-
5C50AE914BAAD469C87F4559D837EEEB105F7FF9CF7350D97F7916C3E728124928537B286A39078C0C15891D0C9B9FC32683E5E046BD438C84B3E4B18432BCA8 TypedClient.d.ts
8+
2A778514E20254638D170F6063C2095FB5CA475A5AE8FF5B1EE637364085AFF042D3A97A4D4FAC0AB2F77B6392FE9E440D739ADB038D8A0EF2607C97C7789550 TypedClient.d.ts
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9.3.56
1+
9.3.57

imxweb/projects/att/src/lib/attestation-history/attestation-history.component.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ export class AttestationHistoryComponent implements OnInit, OnDestroy {
173173
.getGroupInfo({
174174
...params,
175175
...this.parameters,
176-
StartIndex: 0,
177176
def: column,
178177
})
179178
.then((groupInfoData) => {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<imx-data-view-toolbar [dataSource]="dataSource"></imx-data-view-toolbar>
2+
<imx-data-view-auto-table [dataSource]="dataSource" mode="manual" [selectable]="false">
3+
<ng-container [matColumnDef]="entitySchema?.Columns?.AttestationState?.ColumnName ?? 'attestationState'">
4+
<th mat-header-cell *matHeaderCellDef></th>
5+
<td mat-cell *matCellDef="let item" role="gridcell">
6+
<div class="imx-icon-table-container">
7+
@if (item.AttestationState.value === 'denied') {
8+
<div class="imx-icon-table">
9+
<eui-icon icon="warning" class="imx-icon-warning" size="m"></eui-icon>
10+
<span>{{ item.AttestationState.Column.GetDisplayValue() }}</span>
11+
</div>
12+
}
13+
@if (item.AttestationState.value === 'approved') {
14+
<div class="imx-icon-table">
15+
<eui-icon icon="check" class="imx-icon-new" size="m"></eui-icon>
16+
<span>{{ item.AttestationState.Column.GetDisplayValue() }}</span>
17+
</div>
18+
}
19+
@if (item.AttestationState.value === 'pending') {
20+
<div class="imx-icon-table">
21+
<eui-icon icon="clock" class="imx-icon-primary" size="m"></eui-icon>
22+
<span>{{ item.AttestationState.Column.GetDisplayValue() }}</span>
23+
</div>
24+
}
25+
</div>
26+
</td>
27+
</ng-container>
28+
<ng-container [matColumnDef]="entitySchema?.Columns?.XDateInserted?.ColumnName ?? 'xDateInserted'">
29+
<th mat-header-cell *matHeaderCellDef>{{ '#LDS#Date' | translate }}</th>
30+
<td mat-cell *matCellDef="let item" role="gridcell">
31+
{{ item.XDateInserted?.Column?.GetDisplayValue() }}
32+
</td>
33+
</ng-container>
34+
</imx-data-view-auto-table>
35+
36+
<imx-data-view-paginator [dataSource]="dataSource"></imx-data-view-paginator>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
:host {
2+
display: flex;
3+
flex-direction: column;
4+
flex: 1 1 auto;
5+
height: 100%;
6+
}
7+
8+
.imx-attestation-case-history-table {
9+
flex: 1 1 auto;
10+
overflow: auto;
11+
margin-top: 10px;
12+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import { OverlayRef } from '@angular/cdk/overlay';
2+
import { Component, Input, OnInit } from '@angular/core';
3+
import { EuiLoadingService, EuiSidesheetService } from '@elemental-ui/core';
4+
import { PortalAttestationCase } from '@imx-modules/imx-api-att';
5+
import {
6+
CollectionLoadParameters,
7+
CompareOperator,
8+
EntitySchema,
9+
FilterType,
10+
IClientProperty,
11+
TypedEntity,
12+
TypedEntityCollectionData,
13+
} from '@imx-modules/imx-qbm-dbts';
14+
import { TranslateService } from '@ngx-translate/core';
15+
import { BusyService, DataSourceToolbarSettings, DataViewInitParameters, DataViewSource } from 'qbm';
16+
import { AttestationHistoryCase } from '../../attestation-history/attestation-history-case';
17+
import { AttestationHistoryDetailsComponent } from '../../attestation-history/attestation-history-details/attestation-history-details.component';
18+
import { AttestationHistoryService } from '../../attestation-history/attestation-history.service';
19+
import { Approvers } from '../approvers.interface';
20+
import { AttestationCasesService } from '../attestation-cases.service';
21+
import { AttestationCaseHistoryService } from './attestation-case-history.service';
22+
23+
@Component({
24+
selector: 'imx-attestation-case-history',
25+
templateUrl: './attestation-case-history.component.html',
26+
styleUrls: ['./attestation-case-history.component.scss', '../../attestation-history/attestation-history.component.scss'],
27+
providers: [DataViewSource],
28+
})
29+
export class AttestationCaseHistoryComponent implements OnInit {
30+
@Input() case: PortalAttestationCase;
31+
32+
public dstSettings: DataSourceToolbarSettings;
33+
public busyService = new BusyService();
34+
public entitySchema: EntitySchema;
35+
public navigationState: CollectionLoadParameters = {};
36+
public displayedColumns: IClientProperty[];
37+
38+
constructor(
39+
private readonly attestationCaseHistoryService: AttestationCaseHistoryService,
40+
private readonly busyServiceElemental: EuiLoadingService,
41+
private readonly historyService: AttestationHistoryService,
42+
private readonly sideSheet: EuiSidesheetService,
43+
private readonly translator: TranslateService,
44+
private readonly attestationCaseService: AttestationCasesService,
45+
public readonly dataSource: DataViewSource<PortalAttestationCase>,
46+
) {
47+
this.entitySchema = PortalAttestationCase.GetEntitySchema();
48+
this.displayedColumns = [this.entitySchema.Columns.AttestationState, this.entitySchema.Columns.XDateInserted];
49+
this.dstSettings = {
50+
dataSource: { Data: [], totalCount: 0 },
51+
entitySchema: this.entitySchema,
52+
navigationState: this.navigationState,
53+
displayedColumns: this.displayedColumns,
54+
};
55+
}
56+
57+
public async ngOnInit(): Promise<void> {
58+
await this.getData();
59+
}
60+
61+
/**
62+
* Updates the navigation state and reloads the data.
63+
* @param navigationState reloads data based on the new navigation state
64+
*/
65+
public async onNavigationStateChanged(navigationState: CollectionLoadParameters): Promise<void> {
66+
this.navigationState = navigationState;
67+
await this.getData();
68+
}
69+
70+
/**
71+
* Searches attestation cases based on the provided keywords.
72+
* @param keywords The search keywords entered by the user
73+
*/
74+
public async onSearch(keywords: string): Promise<void> {
75+
this.navigationState.StartIndex = 0;
76+
this.navigationState.search = keywords;
77+
await this.getData();
78+
}
79+
80+
/**
81+
* Shows the details of the selected attestation case in a side sheet
82+
* @param selectedItem The item, that was selected from the table
83+
*/
84+
public async onHighlightedEntityChanged(selectedItem: TypedEntity): Promise<void> {
85+
const attestationCase: AttestationHistoryCase = selectedItem as AttestationHistoryCase;
86+
let attestationCaseWithPolicy: AttestationHistoryCase | undefined;
87+
let approvers: Approvers | undefined;
88+
89+
let busyIndicator: OverlayRef;
90+
setTimeout(() => (busyIndicator = this.busyServiceElemental.show()));
91+
92+
try {
93+
attestationCaseWithPolicy = (
94+
await this.historyService.getAttestations({
95+
...{ StartIndex: 0, PageSize: 1 },
96+
uidpolicy: attestationCase.UID_AttestationPolicy.value,
97+
filter: [
98+
{
99+
ColumnName: 'UID_AttestationCase',
100+
Type: FilterType.Compare,
101+
CompareOp: CompareOperator.Equal,
102+
Value1: attestationCase.GetEntity().GetKeys()[0],
103+
},
104+
],
105+
})
106+
).Data[0];
107+
108+
if (attestationCaseWithPolicy && !['approved', 'denied'].includes(attestationCaseWithPolicy.AttestationState.value)) {
109+
approvers = await this.attestationCaseService.getApprovers(attestationCaseWithPolicy);
110+
}
111+
} finally {
112+
setTimeout(() => this.busyServiceElemental.hide(busyIndicator));
113+
}
114+
115+
if (attestationCaseWithPolicy) {
116+
this.sideSheet.open(AttestationHistoryDetailsComponent, {
117+
title: await this.translator.get('#LDS#Heading View Attestation Case Details').toPromise(),
118+
subTitle: attestationCaseWithPolicy.GetEntity().GetDisplay(),
119+
padding: '0',
120+
width: '600px',
121+
testId: 'attestation-history-case-sidesheet',
122+
data: {
123+
case: attestationCaseWithPolicy,
124+
approvers,
125+
showApprovalActions: false,
126+
},
127+
});
128+
}
129+
}
130+
131+
private async getData(): Promise<void> {
132+
const dataViewInitParameters: DataViewInitParameters<PortalAttestationCase> = {
133+
execute: (params: CollectionLoadParameters, signal: AbortSignal): Promise<TypedEntityCollectionData<PortalAttestationCase>> => {
134+
return this.attestationCaseHistoryService.getAttestationCasesForDecision({ ...this.navigationState, ...params }, this.case);
135+
},
136+
schema: this.entitySchema,
137+
columnsToDisplay: this.displayedColumns,
138+
highlightEntity: (attestationCase: PortalAttestationCase) => {
139+
this.onHighlightedEntityChanged(attestationCase);
140+
},
141+
};
142+
await this.dataSource.init(dataViewInitParameters);
143+
}
144+
}

0 commit comments

Comments
 (0)