Fixed api key permission descriptions
All checks were successful
Build on push / prepare (push) Successful in 7s
Build on push / build-api (push) Successful in 30s
Build on push / build-redirector (push) Successful in 31s
Build on push / build-web (push) Successful in 55s

This commit is contained in:
Sven Heidemann 2025-03-15 11:52:57 +01:00
parent 09f11cb6b0
commit f154cf5324
6 changed files with 96 additions and 76 deletions

View File

@ -1,9 +1,10 @@
import { DbModel } from "src/app/model/entities/db-model"; import { DbModel } from 'src/app/model/entities/db-model';
import { Permission } from "src/app/model/entities/role"; import { Permission } from 'src/app/model/entities/role';
export interface ApiKey extends DbModel { export interface ApiKey extends DbModel {
identifier?: string; identifier?: string;
key?: string; key?: string;
description?: string;
permissions?: Permission[]; permissions?: Permission[];
} }

View File

@ -91,14 +91,16 @@ export class ApiKeysDataService
.query<{ apiKeys: QueryResult<ApiKey> }>({ .query<{ apiKeys: QueryResult<ApiKey> }>({
query: gql` query: gql`
query getApiKey($id: Int) { query getApiKey($id: Int) {
apiKey(filter: { id: { equal: $id } }) { apiKeys(filter: { id: { equal: $id } }) {
id nodes {
identifier id
permissions { identifier
name permissions {
} name
}
...DB_MODEL ...DB_MODEL
}
} }
} }

View File

@ -1,63 +1,65 @@
<app-form-page <app-form-page
*ngIf="node" *ngIf="node"
[formGroup]="form" [formGroup]="form"
[isUpdate]="isUpdate" [isUpdate]="isUpdate"
(onSave)="save()" (onSave)="save()"
(onClose)="close()"> (onClose)="close()">
<ng-template formPageHeader let-isUpdate> <ng-template formPageHeader let-isUpdate>
<h2> <h2>
{{ 'common.api_key' | translate }} {{ 'common.role' | translate }}
{{ {{
(isUpdate ? 'sidebar.header.update' : 'sidebar.header.create') (isUpdate ? 'sidebar.header.update' : 'sidebar.header.create')
| translate | translate
}} }}
</h2> </h2>
</ng-template> </ng-template>
<ng-template formPageContent> <ng-template formPageContent>
<div class="form-page-input"> <div class="form-page-input">
<p class="label">{{ 'common.id' | translate }}</p> <p class="label">{{ 'common.id' | translate }}</p>
<input pInputText class="value" type="number" formControlName="id" /> <input pInputText class="value" type="number" formControlName="id"/>
</div>
<div class="form-page-input">
<p class="label">{{ 'common.identifier' | translate }}</p>
<input
pInputText
class="value"
type="text"
formControlName="identifier" />
</div>
<div class="divider"></div>
<div class="flex flex-col gap-5">
<div *ngFor="let group of Object.keys(permissionGroups)">
<div class="flex flex-col">
<div class="flex justify-between">
<label class="flex-1" for="apiKeys.permission_groups.{{ group }}">
<h3>
{{ 'permissions.' + group | translate }}
</h3>
</label>
<form #form="ngForm">
<p-inputSwitch
name="apiKeys.permission_groups.{{ group }}"
(onChange)="toggleGroup($event, group)"
[ngModel]="isGroupChecked(group)"></p-inputSwitch>
</form>
</div>
<div
*ngFor="let permission of permissionGroups[group]"
class="flex items-center justify-between w-full">
<label class="flex-1" for="{{ permission.name }}">
{{ 'permissions.' + permission.name | translate }}
</label>
<p-inputSwitch [formControlName]="permission.name">
>
</p-inputSwitch>
</div>
</div> </div>
</div> <div class="form-page-input">
</div> <p class="label">{{ 'common.identifier' | translate }}</p>
</ng-template> <input pInputText class="value" type="text" formControlName="identifier"/>
</div>
<div class="divider"></div>
<div class="flex flex-col gap-5">
<div *ngFor="let group of Object.keys(permissionGroups)">
<div class="flex flex-col gap-2">
<div class="flex justify-between">
<label class="flex-1" for="roles.permission_groups.{{ group }}">
<h3>
{{ 'permissions.' + group | translate }}
</h3>
</label>
<form #form="ngForm">
<p-inputSwitch
name="roles.permission_groups.{{ group }}"
(onChange)="toggleGroup($event, group)"
[ngModel]="isGroupChecked(group)"></p-inputSwitch>
</form>
</div>
<div
*ngFor="let permission of permissionGroups[group]"
class="flex flex-col">
<div class="flex items-center justify-between w-full">
<label class="flex-1" for="{{ permission.name }}">
{{ 'permissions.' + permission.name | translate }}
</label>
<p-inputSwitch class="flex items-center justify-center" [formControlName]="permission.name">
</p-inputSwitch>
</div>
<div *ngIf="permission.description">
<p class="text-sm text-gray-500">
{{ permission.description }}
</p>
</div>
</div>
</div>
</div>
</div>
</ng-template>
</app-form-page> </app-form-page>

View File

@ -11,6 +11,7 @@ import {
ApiKeyUpdateInput, ApiKeyUpdateInput,
} from 'src/app/model/entities/api-key'; } from 'src/app/model/entities/api-key';
import { ApiKeysDataService } from 'src/app/modules/admin/administration/api-keys/api-keys.data.service'; import { ApiKeysDataService } from 'src/app/modules/admin/administration/api-keys/api-keys.data.service';
import { TranslateService } from '@ngx-translate/core';
@Component({ @Component({
selector: 'app-api-key-form-page', selector: 'app-api-key-form-page',
@ -26,7 +27,10 @@ export class ApiKeyFormPageComponent extends FormPageBase<
permissionGroups: { [key: string]: Permission[] } = {}; permissionGroups: { [key: string]: Permission[] } = {};
allPermissions: Permission[] = []; allPermissions: Permission[] = [];
constructor(private toast: ToastService) { constructor(
private toast: ToastService,
private translate: TranslateService
) {
super(); super();
this.initializePermissions().then(() => { this.initializePermissions().then(() => {
if (!this.nodeId) { if (!this.nodeId) {
@ -36,12 +40,10 @@ export class ApiKeyFormPageComponent extends FormPageBase<
return; return;
} }
this.dataService this.dataService.loadById(this.nodeId).subscribe(apiKey => {
.load([{ id: { equal: this.nodeId } }]) this.node = apiKey;
.subscribe(apiKey => { this.setForm(this.node);
this.node = apiKey.nodes[0]; });
this.setForm(this.node);
});
}); });
} }
@ -49,7 +51,12 @@ export class ApiKeyFormPageComponent extends FormPageBase<
const permissions = await firstValueFrom( const permissions = await firstValueFrom(
this.dataService.getAllPermissions() this.dataService.getAllPermissions()
); );
this.allPermissions = permissions; this.allPermissions = permissions.map(x => {
const key = `permission_descriptions.${x.name}`;
const description = this.translate.instant(key);
x.description = description === key ? undefined : description;
return x;
});
this.permissionGroups = permissions.reduce( this.permissionGroups = permissions.reduce(
(acc, p) => { (acc, p) => {
const group = p.name.includes('.') ? p.name.split('.')[0] : p.name; const group = p.name.includes('.') ? p.name.split('.')[0] : p.name;

View File

@ -101,6 +101,10 @@
"ip_list.create": "Erstellen", "ip_list.create": "Erstellen",
"ip_list.delete": "Löschen", "ip_list.delete": "Löschen",
"ip_list.update": "Bearbeiten", "ip_list.update": "Bearbeiten",
"news": "Nachrichten",
"news.create": "Erstellen",
"news.delete": "Löschen",
"news.update": "Bearbeiten",
"roles": "Rollen", "roles": "Rollen",
"roles.create": "Erstellen", "roles.create": "Erstellen",
"roles.delete": "Löschen", "roles.delete": "Löschen",

View File

@ -101,6 +101,10 @@
"ip_list.create": "Create", "ip_list.create": "Create",
"ip_list.delete": "Delete", "ip_list.delete": "Delete",
"ip_list.update": "Update", "ip_list.update": "Update",
"news": "News",
"news.create": "Create",
"news.delete": "Delete",
"news.update": "Update",
"roles": "Roles", "roles": "Roles",
"roles.create": "Create", "roles.create": "Create",
"roles.delete": "Delete", "roles.delete": "Delete",