mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 14:47:33 +00:00
fix: Actions V2 improve deleted target handling in executions (#9822)
# Which Problems Are Solved Previously, if a target was deleted but still referenced by an execution, it became impossible to load the executions. # How the Problems Are Solved Missing targets in the execution table are now gracefully ignored, allowing executions to load without errors. # Additional Changes Enhanced permission handling in the settings sidenav to ensure users have the correct access rights.
This commit is contained in:
@@ -24,8 +24,8 @@
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'ACTIONSTWO.EXECUTION.TABLE.TARGET' | translate }}</th>
|
||||
<td mat-cell *cnslCellDef="let row; dataSource: dataSource">
|
||||
<div class="target-key">
|
||||
<cnsl-project-role-chip *ngFor="let target of row.mappedTargets; trackBy: trackTarget" [roleName]="target.name"
|
||||
>{{ target.name }}
|
||||
<cnsl-project-role-chip *ngFor="let target of row.mappedTargets; trackBy: trackTarget" [roleName]="target.name">
|
||||
{{ target.name }}
|
||||
</cnsl-project-role-chip>
|
||||
</div>
|
||||
</td>
|
||||
|
@@ -55,13 +55,9 @@ export class ActionsTwoActionsTableComponent {
|
||||
}
|
||||
|
||||
return executions.map((execution) => {
|
||||
const mappedTargets = execution.targets.map((target) => {
|
||||
const targetType = targetsMap.get(target);
|
||||
if (!targetType) {
|
||||
throw new Error(`Target with id ${target} not found`);
|
||||
}
|
||||
return targetType;
|
||||
});
|
||||
const mappedTargets = execution.targets
|
||||
.map((target) => targetsMap.get(target))
|
||||
.filter((target): target is NonNullable<typeof target> => !!target);
|
||||
return { execution, mappedTargets };
|
||||
});
|
||||
});
|
||||
|
@@ -228,8 +228,7 @@ export const ACTIONS: SidenavSetting = {
|
||||
i18nKey: 'SETTINGS.LIST.ACTIONS',
|
||||
groupI18nKey: 'SETTINGS.GROUPS.ACTIONS',
|
||||
requiredRoles: {
|
||||
// todo: figure out roles
|
||||
[PolicyComponentServiceType.ADMIN]: ['iam.policy.read'],
|
||||
[PolicyComponentServiceType.ADMIN]: ['action.execution.write', 'action.target.write'],
|
||||
},
|
||||
beta: true,
|
||||
};
|
||||
@@ -239,8 +238,7 @@ export const ACTIONS_TARGETS: SidenavSetting = {
|
||||
i18nKey: 'SETTINGS.LIST.TARGETS',
|
||||
groupI18nKey: 'SETTINGS.GROUPS.ACTIONS',
|
||||
requiredRoles: {
|
||||
// todo: figure out roles
|
||||
[PolicyComponentServiceType.ADMIN]: ['iam.policy.read'],
|
||||
[PolicyComponentServiceType.ADMIN]: ['action.execution.write', 'action.target.write'],
|
||||
},
|
||||
beta: true,
|
||||
};
|
||||
|
@@ -1,7 +1,18 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { SortDirection } from '@angular/material/sort';
|
||||
import { OAuthService } from 'angular-oauth2-oidc';
|
||||
import { BehaviorSubject, combineLatestWith, EMPTY, mergeWith, NEVER, Observable, of, shareReplay, Subject } from 'rxjs';
|
||||
import {
|
||||
BehaviorSubject,
|
||||
combineLatestWith,
|
||||
EMPTY,
|
||||
identity,
|
||||
mergeWith,
|
||||
NEVER,
|
||||
Observable,
|
||||
of,
|
||||
shareReplay,
|
||||
Subject,
|
||||
} from 'rxjs';
|
||||
import { catchError, distinctUntilChanged, filter, finalize, map, startWith, switchMap, tap, timeout } from 'rxjs/operators';
|
||||
|
||||
import {
|
||||
@@ -326,7 +337,7 @@ export class GrpcAuthService {
|
||||
return new RegExp(reqRegexp).test(role);
|
||||
});
|
||||
|
||||
const allCheck = requestedRoles.map(test).every((x) => !!x);
|
||||
const allCheck = requestedRoles.map(test).every(identity);
|
||||
const oneCheck = requestedRoles.some(test);
|
||||
|
||||
return requiresAll ? allCheck : oneCheck;
|
||||
|
Reference in New Issue
Block a user