mirror of
https://github.com/andwati/zitadel.git
synced 2026-10-25 16:52:17 +00:00
+6








07ce3b6905
This PR summarizes multiple changes specifically only available with ZITADEL v3: - feat: Web Keys management (https://github.com/zitadel/zitadel/pull/9526) - fix(cmd): ensure proper working of mirror (https://github.com/zitadel/zitadel/pull/9509) - feat(Authz): system user support for permission check v2 (https://github.com/zitadel/zitadel/pull/9640) - chore(license): change from Apache to AGPL (https://github.com/zitadel/zitadel/pull/9597) - feat(console): list v2 sessions (https://github.com/zitadel/zitadel/pull/9539) - fix(console): add loginV2 feature flag (https://github.com/zitadel/zitadel/pull/9682) - fix(feature flags): allow reading "own" flags (https://github.com/zitadel/zitadel/pull/9649) - feat(console): add Actions V2 UI (https://github.com/zitadel/zitadel/pull/9591) BREAKING CHANGE - feat(webkey): migrate to v2beta API (https://github.com/zitadel/zitadel/pull/9445) - chore!: remove CockroachDB Support (https://github.com/zitadel/zitadel/pull/9444) - feat(actions): migrate to v2beta API (https://github.com/zitadel/zitadel/pull/9489) --------- Co-authored-by: Livio Spring <[email protected]> Co-authored-by: Stefan Benz <[email protected]> Co-authored-by: Silvan <[email protected]> Co-authored-by: Ramon <[email protected]> Co-authored-by: Elio Bischof <[email protected]> Co-authored-by: Kenta Yamaguchi <[email protected]> Co-authored-by: Harsha Reddy <[email protected]> Co-authored-by: Livio Spring <[email protected]> Co-authored-by: Max Peintner <[email protected]> Co-authored-by: Iraq <[email protected]> Co-authored-by: Florian Forster <[email protected]> Co-authored-by: Tim Möhlmann <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: Max Peintner <[email protected]>
143 lines
5.5 KiB
HTML
143 lines
5.5 KiB
HTML
<cnsl-refresh-table
|
|
[showSelectionActionButton]="showSelectionActionButton"
|
|
*ngIf="projectId"
|
|
(refreshed)="refreshPage()"
|
|
[emitRefreshOnPreviousRoutes]="['/projects/' + projectId + '/roles/create']"
|
|
[selection]="selection"
|
|
[loading]="dataSource.loading$ | async"
|
|
[timestamp]="dataSource.viewTimestamp"
|
|
>
|
|
<ng-template cnslHasRole [hasRole]="['project.role.write:' + projectId, 'project.role.write']" actions>
|
|
<a
|
|
*ngIf="actionsVisible"
|
|
[disabled]="disabled"
|
|
[routerLink]="['/projects', projectId, 'roles', 'create']"
|
|
color="primary"
|
|
mat-raised-button
|
|
data-e2e="create-project-role-button"
|
|
>
|
|
<div class="cnsl-action-button">
|
|
<mat-icon data-e2e="add-new-role" class="icon">add</mat-icon>
|
|
<span>{{ 'ACTIONS.NEW' | translate }}</span>
|
|
<cnsl-action-keys (actionTriggered)="gotoRouterLink(['/projects', projectId, 'roles', 'create'])">
|
|
</cnsl-action-keys>
|
|
</div>
|
|
</a>
|
|
</ng-template>
|
|
|
|
<div class="table-wrapper">
|
|
<table [dataSource]="dataSource" mat-table class="table" matSort aria-label="Elements">
|
|
<ng-container matColumnDef="select">
|
|
<th mat-header-cell *matHeaderCellDef>
|
|
<div class="selection">
|
|
<mat-checkbox
|
|
[disabled]="disabled"
|
|
color="primary"
|
|
(change)="$event ? masterToggle() : null"
|
|
[checked]="isAnySelected() && isAllSelected()"
|
|
[indeterminate]="isAnySelected() && !isAllSelected()"
|
|
>
|
|
</mat-checkbox>
|
|
</div>
|
|
</th>
|
|
<td mat-cell *matCellDef="let row">
|
|
<div class="selection">
|
|
<mat-checkbox
|
|
color="primary"
|
|
[disabled]="disabled"
|
|
(click)="$event.stopPropagation()"
|
|
(change)="$event ? selection.toggle(row.key) : null"
|
|
[checked]="selection.isSelected(row.key)"
|
|
>
|
|
</mat-checkbox>
|
|
</div>
|
|
</td>
|
|
</ng-container>
|
|
|
|
<ng-container matColumnDef="key">
|
|
<th mat-header-cell *matHeaderCellDef>{{ 'PROJECT.ROLE.KEY' | translate }}</th>
|
|
<td class="pointer" (click)="openDetailDialog(role)" mat-cell *matCellDef="let role">
|
|
<div class="role-key">
|
|
<cnsl-project-role-chip [roleName]="role.key">{{ role.key }}</cnsl-project-role-chip>
|
|
</div>
|
|
</td>
|
|
</ng-container>
|
|
|
|
<ng-container matColumnDef="displayname">
|
|
<th mat-header-cell *matHeaderCellDef>{{ 'PROJECT.ROLE.DISPLAY_NAME' | translate }}</th>
|
|
<td class="pointer" (click)="openDetailDialog(role)" mat-cell *matCellDef="let role">{{ role.displayName }}</td>
|
|
</ng-container>
|
|
|
|
<ng-container matColumnDef="group">
|
|
<th mat-header-cell *matHeaderCellDef>{{ 'PROJECT.ROLE.GROUP' | translate }}</th>
|
|
<td mat-cell *matCellDef="let role" class="pointer">
|
|
<span
|
|
class="role state"
|
|
[ngClass]="{ 'no-selection': !selectionAllowed }"
|
|
*ngIf="role.group"
|
|
(click)="selectionAllowed ? groupMasterToggle(role.group) : openDetailDialog(role)"
|
|
[matTooltip]="selectionAllowed ? ('PROJECT.ROLE.SELECTGROUPTOOLTIP' | translate: role) : null"
|
|
>{{ role.group }}</span
|
|
>
|
|
</td>
|
|
</ng-container>
|
|
|
|
<ng-container matColumnDef="creationDate">
|
|
<th mat-header-cell *matHeaderCellDef>{{ 'PROJECT.ROLE.CREATIONDATE' | translate }}</th>
|
|
<td class="pointer" (click)="openDetailDialog(role)" mat-cell *matCellDef="let role">
|
|
<span *ngIf="role?.details?.creationDate">{{
|
|
role.details.creationDate | timestampToDate | localizedDate: 'dd. MMM, HH:mm'
|
|
}}</span>
|
|
</td>
|
|
</ng-container>
|
|
|
|
<ng-container matColumnDef="changeDate">
|
|
<th mat-header-cell *matHeaderCellDef>{{ 'PROJECT.ROLE.CHANGEDATE' | translate }}</th>
|
|
<td class="pointer" (click)="openDetailDialog(role)" mat-cell *matCellDef="let role">
|
|
<span *ngIf="role?.details?.changeDate">{{
|
|
role.details.changeDate | timestampToDate | localizedDate: 'dd. MMM, HH:mm'
|
|
}}</span>
|
|
</td>
|
|
</ng-container>
|
|
|
|
<ng-container matColumnDef="actions" stickyEnd>
|
|
<th mat-header-cell *matHeaderCellDef class="role-table-actions"></th>
|
|
<td mat-cell *matCellDef="let role" class="role-table-actions">
|
|
<cnsl-table-actions>
|
|
<button
|
|
actions
|
|
[disabled]="
|
|
disabled || (['project.role.delete', 'project.role.delete:' + projectId] | hasRole | async) === false
|
|
"
|
|
mat-icon-button
|
|
color="warn"
|
|
matTooltip="{{ 'ACTIONS.DELETE' | translate }}"
|
|
(click)="deleteRole(role)"
|
|
>
|
|
<i class="las la-trash"></i>
|
|
</button>
|
|
</cnsl-table-actions>
|
|
</td>
|
|
</ng-container>
|
|
|
|
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
|
<tr class="highlight" mat-row *matRowDef="let role; columns: displayedColumns"></tr>
|
|
</table>
|
|
</div>
|
|
|
|
<div *ngIf="(dataSource.loading$ | async) === false && !dataSource?.totalResult" class="no-content-row">
|
|
<i class="las la-exclamation"></i>
|
|
<span>{{ 'PROJECT.ROLE.EMPTY' | translate }}</span>
|
|
</div>
|
|
|
|
<cnsl-paginator
|
|
#paginator
|
|
[timestamp]="dataSource.viewTimestamp"
|
|
[length]="dataSource.totalResult"
|
|
[pageSize]="INITIAL_PAGE_SIZE"
|
|
(page)="changePage()"
|
|
[pageSizeOptions]="[25, 50, 100, 250]"
|
|
>
|
|
</cnsl-paginator>
|
|
</cnsl-refresh-table>
|