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 @@
c2f226527c85033e5dd81f1ba2d4d90a4ced7e8b
93cd074f727575c0538b48b2cc9a89350235f847
1 change: 0 additions & 1 deletion .sync-history
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
31a43b96f 2024-08-23 Merged PR 70361: 271561-cdr-editor-for-bitmask-properties
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@

## Change log

### October 8, 2024
- 465213: Fixes an infinite loop if the an invalid value is set on a basic CDR.
- 466404: Fixes an issue with setting today's date as the start date of a delegation.
- 464909: Fixes an issue with the removal of IT shop assignments from newly created applications.
- 466217: Fixes timing issues that could cause the search result to become out of sync with the search term entered by the user.

### September 9, 2024
- 463113: Fixes an issue, regarding the "Unsubscribed as from" property, that doesn't work as expected.
- 462249: Fixes the "Property not found: UID_UNSRoot" error, when switching to tab "Child System Entitlements" on the Data Explorer's system Entitlements page.
Expand Down
Binary file modified imxweb/imx-modules/imx-api-qbm.tgz
Binary file not shown.
Binary file modified imxweb/imx-modules/imx-api-rms.tgz
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import { PortalApplication, PortalApplicationNew } from 'imx-api-aob';
import { CollectionLoadParameters, TypedEntityCollectionData, TypedEntity } from 'imx-qbm-dbts';
import { BusyService, ClassloggerService, DataSourceToolbarSettings, DataTileBadge, DataTilesComponent, SettingsService } from 'qbm';
import { ApplicationsService } from '../applications.service';
import { UserModelService } from 'qer';
import { AobPermissionsService } from '../../permissions/aob-permissions.service';


Expand Down Expand Up @@ -90,7 +89,6 @@ export class ApplicationNavigationComponent implements OnInit {
private logger: ClassloggerService,
private readonly appService: ApplicationsService,
private readonly settingsService: SettingsService,
private readonly userService: UserModelService,
private readonly route: ActivatedRoute,
private readonly applicationsProvider: ApplicationsService,
private readonly aobPermissionsService: AobPermissionsService,
Expand Down Expand Up @@ -178,6 +176,8 @@ export class ApplicationNavigationComponent implements OnInit {

public async onSearch(keywords: string): Promise<void> {
this.logger.debug(this, `Searching for: ${keywords}`);

this.appService.abortCall();

this.navigationState.StartIndex = 0;
if (keywords == null || keywords.length === 0) {
Expand Down
11 changes: 10 additions & 1 deletion imxweb/projects/aob/src/lib/applications/applications.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ export class ApplicationsService {
public readonly onApplicationDeleted = new Subject<string>();
public applicationRefresh: BehaviorSubject<Boolean> = new BehaviorSubject<Boolean>(false);

public abortController = new AbortController();

private badgePublished: DataTileBadge;
private badgeKpiErrors: DataTileBadge;
private badgeNew: DataTileBadge;
Expand Down Expand Up @@ -93,7 +95,9 @@ export class ApplicationsService {
if (this.aobClient.typedClient == null) {
return new Promise<TypedEntityCollectionData<PortalApplication>>((resolve) => resolve(null));
}
return this.apiProvider.request(() => this.aobClient.typedClient.PortalApplication.Get(parameters));
return this.apiProvider.request(() =>
this.aobClient.typedClient.PortalApplication.Get(parameters, { signal: this.abortController.signal })
);
}

public async reload(uidApplication: string): Promise<PortalApplicationInteractive> {
Expand Down Expand Up @@ -220,6 +224,11 @@ export class ApplicationsService {

this.onApplicationDeleted.next(uid);
}

public abortCall(): void {
this.abortController.abort();
this.abortController = new AbortController();
}

private isPublished(application: PortalApplication): boolean {
if (application.IsInActive == null) {
Expand Down
2 changes: 1 addition & 1 deletion imxweb/projects/aob/src/lib/shops/shops.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ export class ShopsService {
await this.apiProvider.request(async () => {
for (const shop of shops) {
await this.aobClient.client
.portal_applicationinshop_delete(application.UID_AOBApplication.value, shop.UID_ITShopOrg.value, undefined);
.portal_applicationinshop_delete(application.UID_AOBApplication.value, shop.UID_ITShopOrg.value,'');
count++;
}
});
Expand Down
21 changes: 12 additions & 9 deletions imxweb/projects/apc/src/lib/software/software.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export class SoftwareComponent implements OnInit, SideNavigationComponent {
private readonly metadata: MetadataService,
private readonly sidesheet: EuiSidesheetService,
private readonly ldsReplace: LdsReplacePipe,
private readonly translate: TranslateService,
private readonly translate: TranslateService
) {}

public async ngOnInit(): Promise<void> {
Expand Down Expand Up @@ -122,14 +122,17 @@ export class SoftwareComponent implements OnInit, SideNavigationComponent {
private async navigate(): Promise<void> {
const isBusy = this.busyService.beginBusy();
try {
this.dstSettings = {
dataSource: await this.resourceProvider.get(this.navigationState),
entitySchema: this.entitySchema,
navigationState: this.navigationState,
displayedColumns: this.displayColumns,
filters: this.dataModel.Filters,
dataModel: this.dataModel,
};
const dataSource = await this.resourceProvider.get(this.navigationState);
if (dataSource) {
this.dstSettings = {
dataSource: dataSource,
entitySchema: this.entitySchema,
navigationState: this.navigationState,
displayedColumns: this.displayColumns,
filters: this.dataModel.Filters,
dataModel: this.dataModel,
};
}
} finally {
isBusy.endBusy();
}
Expand Down
16 changes: 15 additions & 1 deletion imxweb/projects/apc/src/lib/software/software.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ export class SoftwareService {

protected config: QerProjectConfig & ProjectConfig;

private abortController = new AbortController();

constructor(
protected readonly project: ProjectConfigurationService,
private readonly api: ApcApiService,
Expand All @@ -65,7 +67,13 @@ export class SoftwareService {
accProduct: this.api.typedClient.PortalResourcesApplicationServiceitem,
resp: {
type: PortalRespApplication,
get: async (parameter: any) => this.api.client.portal_resp_application_get(parameter),
get: async (parameter: any) => {
if (parameter?.search !== undefined) {
// abort the request only while searching
this.abortCall();
}
return this.api.client.portal_resp_application_get(parameter, { signal: this.abortController.signal });
},
schema: this.api.typedClient.PortalRespApplication.GetSchema(),
dataModel: async (filter?: FilterData[]) => this.api.client.portal_resp_application_datamodel_get({ filter }),
interactive: this.api.typedClient.PortalRespApplicationInteractive,
Expand Down Expand Up @@ -138,4 +146,10 @@ export class SoftwareService {
public async unsubscribeMembership(item: TypedEntity): Promise<void> {
await this.qerClient.client.portal_itshop_unsubscribe_post({ UidPwo: [item.GetEntity().GetColumn('UID_PersonWantsOrg').GetValue()] });
}


private abortCall(): void {
this.abortController.abort();
this.abortController = new AbortController();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export class AttestationHistoryComponent implements OnInit, OnDestroy {
@Input() public parameters: { objecttable: string; objectuid: string; filter?: FilterData[] };
@Input() public itemStatus: DataSourceItemStatus = { enabled: (__) => true };
@Input() public withAssignmentAnalysis: boolean = false;
@Input() public selectable : boolean = true;
@Input() public selectable: boolean = true;

@ViewChild('attestorFilter', { static: false }) public attestorFilter: AttestationHistoryFilterComponent;

Expand Down Expand Up @@ -197,6 +197,7 @@ export class AttestationHistoryComponent implements OnInit, OnDestroy {
}

public async onSearch(search: string): Promise<void> {
this.historyService.abortCall();
return this.getData({ search });
}

Expand Down Expand Up @@ -251,8 +252,6 @@ export class AttestationHistoryComponent implements OnInit, OnDestroy {
viewConfig: this.viewConfig,
exportMethod,
};
} else {
this.dstSettings = undefined;
}
} finally {
isBusy.endBusy();
Expand Down Expand Up @@ -314,10 +313,8 @@ export class AttestationHistoryComponent implements OnInit, OnDestroy {
}

public async viewAssignmentAnalysis(event: Event, attestationCase: AttestationHistoryCase): Promise<void> {

event.stopPropagation();
const uidPerson = attestationCase.UID_Person.value;

const objectKey = DbObjectKey.FromXml(attestationCase.ObjectKeyBase.value);

const data: SourceDetectiveSidesheetData = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,33 @@ import { DataSourceToolbarExportMethod } from 'qbm';
providedIn: 'root',
})
export class AttestationHistoryService {
public abortController = new AbortController();

constructor(private readonly attClient: ApiService, private readonly parameterDataService: ParameterDataService) {}

public async get(
parameters: AttestationCaseLoadParameters
): Promise<ExtendedTypedEntityCollection<PortalAttestationCase, AttCaseDataRead>> {
return this.attClient.typedClient.PortalAttestationCase.Get(parameters);
return this.attClient.typedClient.PortalAttestationCase.Get(parameters, { signal: this.abortController.signal });
}

public async getAttestations(loadParameters?: AttestationCaseLoadParameters): Promise<TypedEntityCollectionData<AttestationHistoryCase>> {
public async getAttestations(loadParameters?: AttestationCaseLoadParameters): Promise<TypedEntityCollectionData<AttestationHistoryCase> | undefined> {
const collection = await this.get(loadParameters);
if (!collection) {
return undefined;
}
return {
tableName: collection.tableName,
totalCount: collection.totalCount,
Data: collection.Data.map((item: PortalAttestationCase, index: number) => {
tableName: collection?.tableName,
totalCount: collection?.totalCount,
Data: collection?.Data.map((item: PortalAttestationCase, index: number) => {
const parameterDataContainer = this.parameterDataService.createContainer(
item.GetEntity(),
{ ...collection.extendedData, ...{ index } },
{ ...collection?.extendedData, ...{ index } },
(parameters) => this.getParameterCandidates(parameters),
(treefilterparameter) => this.getFilterTree(treefilterparameter)
);

return new AttestationHistoryCase(item, parameterDataContainer, { ...collection.extendedData, ...{ index } });
return new AttestationHistoryCase(item, parameterDataContainer, { ...collection?.extendedData, ...{ index } });
}),
};
}
Expand All @@ -80,13 +85,13 @@ export class AttestationHistoryService {
getMethod: (withProperties: string, PageSize?: number) => {
let method: MethodDescriptor<EntityCollectionData>;
if (PageSize) {
method = factory.portal_attestation_case_get({...loadParameters, withProperties, PageSize, StartIndex: 0})
method = factory.portal_attestation_case_get({ ...loadParameters, withProperties, PageSize, StartIndex: 0 });
} else {
method = factory.portal_attestation_case_get({...loadParameters, withProperties})
method = factory.portal_attestation_case_get({ ...loadParameters, withProperties });
}
return new MethodDefinition(method);
}
}
},
};
}

public async getDataModel(objecttable?: string, objectuid?: string, groupFilter?: FilterData[]): Promise<DataModel> {
Expand All @@ -99,13 +104,18 @@ export class AttestationHistoryService {

public getGroupInfo(parameters: AttestationCaseLoadParameters = {}): Promise<GroupInfoData> {
// remove groupFilter from parameters
const {withProperties, groupFilter, search, OrderBy, ...paramsWithoutGroupFilter } = parameters;
const { withProperties, groupFilter, search, OrderBy, ...paramsWithoutGroupFilter } = parameters;
return this.attClient.client.portal_attestation_case_group_get({
...paramsWithoutGroupFilter,
...{ withcount: true, filter: parameters.groupFilter },
});
}

public abortCall(): void {
this.abortController.abort();
this.abortController = new AbortController();
}

private async getParameterCandidates(parameters: ParameterDataLoadParameters): Promise<EntityCollectionData> {
return this.attClient.client.portal_attestation_case_parameter_candidates_post(
parameters.columnName,
Expand Down
43 changes: 30 additions & 13 deletions imxweb/projects/att/src/lib/decision/attestation-cases.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ import { AttestationCaseLoadParameters } from '../attestation-history/attestatio
})
export class AttestationCasesService {
public isChiefApproval: boolean;
public abortController = new AbortController();

private readonly historyBuilder = new TypedEntityBuilder(PortalAttestationCaseHistory);
private readonly apiClientMethodFactory = new ApiClientMethodFactory();

Expand All @@ -86,23 +88,33 @@ export class AttestationCasesService {
return this.attClient.typedClient.PortalAttestationCase.GetSchema();
}

public async get(attDecisionParameters?: AttestationDecisionLoadParameters, isUserEscalationApprover= false): Promise<TypedEntityCollectionData<AttestationCase>> {
public async get(
attDecisionParameters?: AttestationDecisionLoadParameters,
isUserEscalationApprover = false
): Promise<TypedEntityCollectionData<AttestationCase> | undefined> {
const navigationState = {
...attDecisionParameters,
Escalation: (attDecisionParameters.uid_attestationcase !== '' && isUserEscalationApprover) || attDecisionParameters.Escalation,
};

const navigationState = { ...attDecisionParameters, Escalation: (attDecisionParameters.uid_attestationcase !== '' && isUserEscalationApprover) || attDecisionParameters.Escalation };

const collection = await this.attClient.typedClient.PortalAttestationApprove.Get(navigationState);
const collection = await this.attClient.typedClient.PortalAttestationApprove.Get(navigationState, {
signal: this.abortController.signal,
});
if (!collection) {
return undefined;
}
return {
tableName: collection.tableName,
totalCount: collection.totalCount,
Data: collection.Data.map((item: PortalAttestationApprove, index: number) => {
tableName: collection?.tableName,
totalCount: collection?.totalCount,
Data: collection?.Data.map((item: PortalAttestationApprove, index: number) => {
const parameterDataContainer = this.parameterDataService.createContainer(
item.GetEntity(),
{ ...collection.extendedData, ...{ index } },
{ ...collection?.extendedData, ...{ index } },
(parameters) => this.getParameterCandidates(parameters),
(treefilterparameter) => this.getFilterTree(treefilterparameter)
);

return new AttestationCase(item, this.isChiefApproval, parameterDataContainer, { ...collection.extendedData, ...{ index } });
return new AttestationCase(item, this.isChiefApproval, parameterDataContainer, { ...collection?.extendedData, ...{ index } });
}),
};
}
Expand All @@ -113,13 +125,13 @@ export class AttestationCasesService {
getMethod: (withProperties: string, PageSize?: number) => {
let method: MethodDescriptor<EntityCollectionData>;
if (PageSize) {
method = factory.portal_attestation_approve_get({...attDecisionParameters, withProperties, PageSize, StartIndex: 0})
method = factory.portal_attestation_approve_get({ ...attDecisionParameters, withProperties, PageSize, StartIndex: 0 });
} else {
method = factory.portal_attestation_approve_get({...attDecisionParameters, withProperties})
method = factory.portal_attestation_approve_get({ ...attDecisionParameters, withProperties });
}
return new MethodDefinition(method);
}
}
},
};
}

public async getNumberOfPending(parameters: AttestationCaseLoadParameters): Promise<number> {
Expand Down Expand Up @@ -279,6 +291,11 @@ export class AttestationCasesService {
return this.attClient.client.portal_attestation_denydecision_post(this.getKey(attestationCase), input);
}

public abortCall(): void {
this.abortController.abort();
this.abortController = new AbortController();
}

private getKey(attestationCase: TypedEntity): string {
return attestationCase.GetEntity().GetKeys()[0];
}
Expand Down
Loading