@flusys/ng-iam 5.0.1 → 5.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/fesm2022/{flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs → flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs} +156 -54
  2. package/fesm2022/flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs.map +1 -0
  3. package/fesm2022/{flusys-ng-iam-action-list-page.component-DRK79zUR.mjs → flusys-ng-iam-action-list-page.component-BIA9UpeH.mjs} +110 -40
  4. package/fesm2022/flusys-ng-iam-action-list-page.component-BIA9UpeH.mjs.map +1 -0
  5. package/fesm2022/{flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs → flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs} +50 -27
  6. package/fesm2022/flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs.map +1 -0
  7. package/fesm2022/{flusys-ng-iam-iam-container.component-CQA2B6cU.mjs → flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs} +34 -9
  8. package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs.map +1 -0
  9. package/fesm2022/{flusys-ng-iam-permission-page.component-CZebeUhC.mjs → flusys-ng-iam-permission-page.component-BFZCb8Md.mjs} +2 -2
  10. package/fesm2022/{flusys-ng-iam-permission-page.component-CZebeUhC.mjs.map → flusys-ng-iam-permission-page.component-BFZCb8Md.mjs.map} +1 -1
  11. package/fesm2022/{flusys-ng-iam-role-form-page.component-49dKMKOj.mjs → flusys-ng-iam-role-form-page.component-TfZDInlN.mjs} +85 -31
  12. package/fesm2022/flusys-ng-iam-role-form-page.component-TfZDInlN.mjs.map +1 -0
  13. package/fesm2022/{flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs → flusys-ng-iam-role-list-page.component-CuHewjjr.mjs} +5 -5
  14. package/fesm2022/flusys-ng-iam-role-list-page.component-CuHewjjr.mjs.map +1 -0
  15. package/fesm2022/flusys-ng-iam.mjs +1 -1
  16. package/package.json +4 -4
  17. package/types/flusys-ng-iam.d.ts +2 -3
  18. package/fesm2022/flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-iam-action-list-page.component-DRK79zUR.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-iam-iam-container.component-CQA2B6cU.mjs.map +0 -1
  22. package/fesm2022/flusys-ng-iam-role-form-page.component-49dKMKOj.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs.map +0 -1
@@ -3,10 +3,9 @@ import { inject, signal, computed, effect, Component } from '@angular/core';
3
3
  import { toSignal } from '@angular/core/rxjs-interop';
4
4
  import { form, required, FormField } from '@angular/forms/signals';
5
5
  import { ActivatedRoute, Router } from '@angular/router';
6
- import { TRANSLATE_ADAPTER } from '@flusys/ng-core';
7
- import { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';
6
+ import { TranslateService, AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';
8
7
  import { MessageService } from 'primeng/api';
9
- import { A as ActionApiService, a as ActionType, L as LogicBuilderComponent } from './flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs';
8
+ import { A as ActionApiService, a as ActionType, L as LogicBuilderComponent } from './flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs';
10
9
  import * as i1 from '@angular/forms';
11
10
  import * as i2 from 'primeng/button';
12
11
  import * as i3 from 'primeng/checkbox';
@@ -17,7 +16,9 @@ class ActionFormPageComponent {
17
16
  router = inject(Router);
18
17
  actionApi = inject(ActionApiService);
19
18
  messageService = inject(MessageService);
20
- translateAdapter = inject(TRANSLATE_ADAPTER, { optional: true });
19
+ translateAdapter = inject(TranslateService, {
20
+ optional: true,
21
+ });
21
22
  routeParams = toSignal(this.route.paramMap);
22
23
  initialized = false;
23
24
  translate(key, vars) {
@@ -45,12 +46,25 @@ class ActionFormPageComponent {
45
46
  isActive: true,
46
47
  }, ...(ngDevMode ? [{ debugName: "formModel" }] : []));
47
48
  actionTypes = computed(() => [
48
- { label: this.translate('iam.action.type.backend.label'), value: ActionType.BACKEND },
49
- { label: this.translate('iam.action.type.frontend.label'), value: ActionType.FRONTEND },
50
- { label: this.translate('iam.action.type.both.label'), value: ActionType.BOTH },
49
+ {
50
+ label: this.translate('iam.action.type.backend.label'),
51
+ value: ActionType.BACKEND,
52
+ },
53
+ {
54
+ label: this.translate('iam.action.type.frontend.label'),
55
+ value: ActionType.FRONTEND,
56
+ },
57
+ {
58
+ label: this.translate('iam.action.type.both.label'),
59
+ value: ActionType.BOTH,
60
+ },
51
61
  ], ...(ngDevMode ? [{ debugName: "actionTypes" }] : []));
52
62
  actionForm = form(this.formModel, (f) => {
53
- required(f.name, { message: this.translate('shared.validation.required', { field: this.translate('iam.action.name') }) });
63
+ required(f.name, {
64
+ message: this.translate('shared.validation.required', {
65
+ field: this.translate('iam.action.name'),
66
+ }),
67
+ });
54
68
  });
55
69
  isFormValid = computed(() => {
56
70
  const model = this.formModel();
@@ -72,7 +86,10 @@ class ActionFormPageComponent {
72
86
  select: ['id', 'name', 'code', 'actionType', 'permissionLogic'],
73
87
  });
74
88
  if (response?.success && response.data) {
75
- this.allActionsForLogic.set(response.data.map((a) => ({ id: a.id, name: a.name ?? this.translate('shared.unnamed') })));
89
+ this.allActionsForLogic.set(response.data.map((a) => ({
90
+ id: a.id,
91
+ name: a.name ?? this.translate('shared.unnamed'),
92
+ })));
76
93
  this.allActions.set(response.data);
77
94
  }
78
95
  }
@@ -87,8 +104,15 @@ class ActionFormPageComponent {
87
104
  this.isLoading.set(true);
88
105
  try {
89
106
  const response = await this.actionApi.findById(id, [
90
- 'id', 'name', 'description', 'code', 'actionType',
91
- 'permissionLogic', 'parentId', 'serial', 'isActive',
107
+ 'id',
108
+ 'name',
109
+ 'description',
110
+ 'code',
111
+ 'actionType',
112
+ 'permissionLogic',
113
+ 'parentId',
114
+ 'serial',
115
+ 'isActive',
92
116
  ]);
93
117
  if (response?.success && response.data) {
94
118
  const action = response.data;
@@ -142,7 +166,9 @@ class ActionFormPageComponent {
142
166
  this.messageService.add({
143
167
  severity: 'success',
144
168
  summary: this.translate('shared.success'),
145
- detail: response.messageKey ? this.translate(response.messageKey, response.messageVariables) : (response.message ?? ''),
169
+ detail: response.messageKey
170
+ ? this.translate(response.messageKey, response.messageVariables)
171
+ : (response.message ?? ''),
146
172
  });
147
173
  this.router.navigate(['/iam/actions']);
148
174
  }
@@ -163,47 +189,66 @@ class ActionFormPageComponent {
163
189
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: ActionFormPageComponent, isStandalone: true, selector: "lib-action-form-page", ngImport: i0, template: `
164
190
  <div class="card">
165
191
  <h3 class="text-lg sm:text-xl font-semibold mb-4">
166
- {{ isEditMode() ? ('iam.action.edit' | translate) : ('iam.action.new' | translate) }}
192
+ {{
193
+ isEditMode()
194
+ ? ('iam.action.edit' | translate)
195
+ : ('iam.action.new' | translate)
196
+ }}
167
197
  </h3>
168
198
 
169
- <form (ngSubmit)="onSubmit()" class="grid grid-cols-1 md:grid-cols-2 gap-4">
199
+ <form
200
+ (ngSubmit)="onSubmit()"
201
+ class="grid grid-cols-1 md:grid-cols-2 gap-4"
202
+ >
170
203
  <!-- Name -->
171
204
  <div class="flex flex-col gap-2">
172
- <label for="name" class="font-medium">{{ 'iam.action.name' | translate }} *</label>
205
+ <label for="name" class="font-medium"
206
+ >{{ 'iam.action.name' | translate }} *</label
207
+ >
173
208
  <input
174
209
  pInputText
175
210
  id="name"
176
211
  [formField]="actionForm.name"
177
- [placeholder]="'iam.action.name.placeholder' | translate" />
212
+ [placeholder]="'iam.action.name.placeholder' | translate"
213
+ />
178
214
  </div>
179
215
 
180
216
  <!-- Code -->
181
217
  <div class="flex flex-col gap-2">
182
- <label for="code" class="font-medium">{{ 'iam.action.code' | translate }}</label>
218
+ <label for="code" class="font-medium">{{
219
+ 'iam.action.code' | translate
220
+ }}</label>
183
221
  <input
184
222
  pInputText
185
223
  id="code"
186
224
  [formField]="actionForm.code"
187
- [placeholder]="'iam.action.code.placeholder' | translate" />
225
+ [placeholder]="'iam.action.code.placeholder' | translate"
226
+ />
188
227
  </div>
189
228
 
190
229
  <!-- Description -->
191
230
  <div class="flex flex-col gap-2">
192
- <label for="description" class="font-medium">{{ 'shared.description' | translate }}</label>
231
+ <label for="description" class="font-medium">{{
232
+ 'shared.description' | translate
233
+ }}</label>
193
234
  <input
194
235
  pInputText
195
236
  id="description"
196
237
  [formField]="actionForm.description"
197
- [placeholder]="'shared.description.placeholder' | translate" />
238
+ [placeholder]="'shared.description.placeholder' | translate"
239
+ />
198
240
  </div>
199
241
 
200
242
  <!-- Action Type -->
201
243
  <div class="flex flex-col gap-2">
202
- <label for="actionType" class="font-medium">{{ 'iam.action.type' | translate }} *</label>
244
+ <label for="actionType" class="font-medium"
245
+ >{{ 'iam.action.type' | translate }} *</label
246
+ >
203
247
  <select
204
248
  id="actionType"
205
249
  class="p-inputtext w-full"
206
- [formField]="actionForm.actionType">
250
+ [formField]="actionForm.actionType"
251
+ >
207
252
  @for (type of actionTypes(); track type.value) {
208
253
  <option [value]="type.value">{{ type.label }}</option>
209
254
  }
@@ -212,12 +257,17 @@ class ActionFormPageComponent {
212
257
 
213
258
  <!-- Parent Action -->
214
259
  <div class="flex flex-col gap-2">
215
- <label for="parentId" class="font-medium">{{ 'iam.action.parent' | translate }}</label>
260
+ <label for="parentId" class="font-medium">{{
261
+ 'iam.action.parent' | translate
262
+ }}</label>
216
263
  <select
217
264
  id="parentId"
218
265
  class="p-inputtext w-full"
219
- [formField]="actionForm.parentId">
220
- <option value="">{{ 'iam.action.select.parent' | translate }}</option>
266
+ [formField]="actionForm.parentId"
267
+ >
268
+ <option value="">
269
+ {{ 'iam.action.select.parent' | translate }}
270
+ </option>
221
271
  @for (action of availableActions(); track action.id) {
222
272
  <option [value]="action.id">{{ action.name }}</option>
223
273
  }
@@ -226,13 +276,16 @@ class ActionFormPageComponent {
226
276
 
227
277
  <!-- Order -->
228
278
  <div class="flex flex-col gap-2">
229
- <label for="serial" class="font-medium">{{ 'shared.display.order' | translate }}</label>
279
+ <label for="serial" class="font-medium">{{
280
+ 'shared.display.order' | translate
281
+ }}</label>
230
282
  <input
231
283
  pInputText
232
284
  id="serial"
233
285
  type="number"
234
286
  [formField]="actionForm.serial"
235
- [placeholder]="'shared.display.order.placeholder' | translate" />
287
+ [placeholder]="'shared.display.order.placeholder' | translate"
288
+ />
236
289
  </div>
237
290
 
238
291
  <!-- Is Active -->
@@ -240,7 +293,8 @@ class ActionFormPageComponent {
240
293
  <p-checkbox
241
294
  [formField]="actionForm.isActive"
242
295
  [binary]="true"
243
- inputId="isActive" />
296
+ inputId="isActive"
297
+ />
244
298
  <label for="isActive">{{ 'shared.active' | translate }}</label>
245
299
  </div>
246
300
 
@@ -249,7 +303,8 @@ class ActionFormPageComponent {
249
303
  <lib-logic-builder
250
304
  [logic]="formModel().permissionLogic"
251
305
  [actions]="allActionsForLogic()"
252
- (logicChange)="onLogicChange($event)" />
306
+ (logicChange)="onLogicChange($event)"
307
+ />
253
308
  </div>
254
309
 
255
310
  <!-- Actions -->
@@ -258,12 +313,18 @@ class ActionFormPageComponent {
258
313
  [label]="'shared.cancel' | translate"
259
314
  severity="secondary"
260
315
  [outlined]="true"
261
- (onClick)="onBack()" />
316
+ (onClick)="onBack()"
317
+ />
262
318
  <p-button
263
- [label]="isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)"
319
+ [label]="
320
+ isEditMode()
321
+ ? ('shared.update' | translate)
322
+ : ('shared.create' | translate)
323
+ "
264
324
  type="submit"
265
325
  [loading]="isLoading()"
266
- [disabled]="!isFormValid() || isLoading()" />
326
+ [disabled]="!isFormValid() || isLoading()"
327
+ />
267
328
  </div>
268
329
  </form>
269
330
  </div>
@@ -273,51 +334,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
273
334
  type: Component,
274
335
  args: [{
275
336
  selector: 'lib-action-form-page',
276
- imports: [AngularModule, PrimeModule, FormField, LogicBuilderComponent, TranslatePipe],
337
+ imports: [
338
+ AngularModule,
339
+ PrimeModule,
340
+ FormField,
341
+ LogicBuilderComponent,
342
+ TranslatePipe,
343
+ ],
277
344
  template: `
278
345
  <div class="card">
279
346
  <h3 class="text-lg sm:text-xl font-semibold mb-4">
280
- {{ isEditMode() ? ('iam.action.edit' | translate) : ('iam.action.new' | translate) }}
347
+ {{
348
+ isEditMode()
349
+ ? ('iam.action.edit' | translate)
350
+ : ('iam.action.new' | translate)
351
+ }}
281
352
  </h3>
282
353
 
283
- <form (ngSubmit)="onSubmit()" class="grid grid-cols-1 md:grid-cols-2 gap-4">
354
+ <form
355
+ (ngSubmit)="onSubmit()"
356
+ class="grid grid-cols-1 md:grid-cols-2 gap-4"
357
+ >
284
358
  <!-- Name -->
285
359
  <div class="flex flex-col gap-2">
286
- <label for="name" class="font-medium">{{ 'iam.action.name' | translate }} *</label>
360
+ <label for="name" class="font-medium"
361
+ >{{ 'iam.action.name' | translate }} *</label
362
+ >
287
363
  <input
288
364
  pInputText
289
365
  id="name"
290
366
  [formField]="actionForm.name"
291
- [placeholder]="'iam.action.name.placeholder' | translate" />
367
+ [placeholder]="'iam.action.name.placeholder' | translate"
368
+ />
292
369
  </div>
293
370
 
294
371
  <!-- Code -->
295
372
  <div class="flex flex-col gap-2">
296
- <label for="code" class="font-medium">{{ 'iam.action.code' | translate }}</label>
373
+ <label for="code" class="font-medium">{{
374
+ 'iam.action.code' | translate
375
+ }}</label>
297
376
  <input
298
377
  pInputText
299
378
  id="code"
300
379
  [formField]="actionForm.code"
301
- [placeholder]="'iam.action.code.placeholder' | translate" />
380
+ [placeholder]="'iam.action.code.placeholder' | translate"
381
+ />
302
382
  </div>
303
383
 
304
384
  <!-- Description -->
305
385
  <div class="flex flex-col gap-2">
306
- <label for="description" class="font-medium">{{ 'shared.description' | translate }}</label>
386
+ <label for="description" class="font-medium">{{
387
+ 'shared.description' | translate
388
+ }}</label>
307
389
  <input
308
390
  pInputText
309
391
  id="description"
310
392
  [formField]="actionForm.description"
311
- [placeholder]="'shared.description.placeholder' | translate" />
393
+ [placeholder]="'shared.description.placeholder' | translate"
394
+ />
312
395
  </div>
313
396
 
314
397
  <!-- Action Type -->
315
398
  <div class="flex flex-col gap-2">
316
- <label for="actionType" class="font-medium">{{ 'iam.action.type' | translate }} *</label>
399
+ <label for="actionType" class="font-medium"
400
+ >{{ 'iam.action.type' | translate }} *</label
401
+ >
317
402
  <select
318
403
  id="actionType"
319
404
  class="p-inputtext w-full"
320
- [formField]="actionForm.actionType">
405
+ [formField]="actionForm.actionType"
406
+ >
321
407
  @for (type of actionTypes(); track type.value) {
322
408
  <option [value]="type.value">{{ type.label }}</option>
323
409
  }
@@ -326,12 +412,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
326
412
 
327
413
  <!-- Parent Action -->
328
414
  <div class="flex flex-col gap-2">
329
- <label for="parentId" class="font-medium">{{ 'iam.action.parent' | translate }}</label>
415
+ <label for="parentId" class="font-medium">{{
416
+ 'iam.action.parent' | translate
417
+ }}</label>
330
418
  <select
331
419
  id="parentId"
332
420
  class="p-inputtext w-full"
333
- [formField]="actionForm.parentId">
334
- <option value="">{{ 'iam.action.select.parent' | translate }}</option>
421
+ [formField]="actionForm.parentId"
422
+ >
423
+ <option value="">
424
+ {{ 'iam.action.select.parent' | translate }}
425
+ </option>
335
426
  @for (action of availableActions(); track action.id) {
336
427
  <option [value]="action.id">{{ action.name }}</option>
337
428
  }
@@ -340,13 +431,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
340
431
 
341
432
  <!-- Order -->
342
433
  <div class="flex flex-col gap-2">
343
- <label for="serial" class="font-medium">{{ 'shared.display.order' | translate }}</label>
434
+ <label for="serial" class="font-medium">{{
435
+ 'shared.display.order' | translate
436
+ }}</label>
344
437
  <input
345
438
  pInputText
346
439
  id="serial"
347
440
  type="number"
348
441
  [formField]="actionForm.serial"
349
- [placeholder]="'shared.display.order.placeholder' | translate" />
442
+ [placeholder]="'shared.display.order.placeholder' | translate"
443
+ />
350
444
  </div>
351
445
 
352
446
  <!-- Is Active -->
@@ -354,7 +448,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
354
448
  <p-checkbox
355
449
  [formField]="actionForm.isActive"
356
450
  [binary]="true"
357
- inputId="isActive" />
451
+ inputId="isActive"
452
+ />
358
453
  <label for="isActive">{{ 'shared.active' | translate }}</label>
359
454
  </div>
360
455
 
@@ -363,7 +458,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
363
458
  <lib-logic-builder
364
459
  [logic]="formModel().permissionLogic"
365
460
  [actions]="allActionsForLogic()"
366
- (logicChange)="onLogicChange($event)" />
461
+ (logicChange)="onLogicChange($event)"
462
+ />
367
463
  </div>
368
464
 
369
465
  <!-- Actions -->
@@ -372,12 +468,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
372
468
  [label]="'shared.cancel' | translate"
373
469
  severity="secondary"
374
470
  [outlined]="true"
375
- (onClick)="onBack()" />
471
+ (onClick)="onBack()"
472
+ />
376
473
  <p-button
377
- [label]="isEditMode() ? ('shared.update' | translate) : ('shared.create' | translate)"
474
+ [label]="
475
+ isEditMode()
476
+ ? ('shared.update' | translate)
477
+ : ('shared.create' | translate)
478
+ "
378
479
  type="submit"
379
480
  [loading]="isLoading()"
380
- [disabled]="!isFormValid() || isLoading()" />
481
+ [disabled]="!isFormValid() || isLoading()"
482
+ />
381
483
  </div>
382
484
  </form>
383
485
  </div>
@@ -386,4 +488,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
386
488
  }], ctorParameters: () => [] });
387
489
 
388
490
  export { ActionFormPageComponent };
389
- //# sourceMappingURL=flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs.map
491
+ //# sourceMappingURL=flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs","sources":["../../../projects/ng-iam/pages/action/action-form-page.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n AngularModule,\n ILogicNode,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { LogicBuilderComponent } from '../../components/logic-builder.component';\nimport { ActionType, IAction } from '../../interfaces/action.interface';\nimport { ActionApiService } from '../../services/action-api.service';\n\ninterface IActionFormModel {\n id: string;\n name: string;\n description: string;\n code: string;\n actionType: ActionType;\n permissionLogic: ILogicNode | null;\n parentId: string;\n serial: string;\n isActive: boolean;\n}\n\n@Component({\n selector: 'lib-action-form-page',\n imports: [\n AngularModule,\n PrimeModule,\n FormField,\n LogicBuilderComponent,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <h3 class=\"text-lg sm:text-xl font-semibold mb-4\">\n {{\n isEditMode()\n ? ('iam.action.edit' | translate)\n : ('iam.action.new' | translate)\n }}\n </h3>\n\n <form\n (ngSubmit)=\"onSubmit()\"\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4\"\n >\n <!-- Name -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"name\" class=\"font-medium\"\n >{{ 'iam.action.name' | translate }} *</label\n >\n <input\n pInputText\n id=\"name\"\n [formField]=\"actionForm.name\"\n [placeholder]=\"'iam.action.name.placeholder' | translate\"\n />\n </div>\n\n <!-- Code -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"code\" class=\"font-medium\">{{\n 'iam.action.code' | translate\n }}</label>\n <input\n pInputText\n id=\"code\"\n [formField]=\"actionForm.code\"\n [placeholder]=\"'iam.action.code.placeholder' | translate\"\n />\n </div>\n\n <!-- Description -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"description\" class=\"font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <input\n pInputText\n id=\"description\"\n [formField]=\"actionForm.description\"\n [placeholder]=\"'shared.description.placeholder' | translate\"\n />\n </div>\n\n <!-- Action Type -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"actionType\" class=\"font-medium\"\n >{{ 'iam.action.type' | translate }} *</label\n >\n <select\n id=\"actionType\"\n class=\"p-inputtext w-full\"\n [formField]=\"actionForm.actionType\"\n >\n @for (type of actionTypes(); track type.value) {\n <option [value]=\"type.value\">{{ type.label }}</option>\n }\n </select>\n </div>\n\n <!-- Parent Action -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"parentId\" class=\"font-medium\">{{\n 'iam.action.parent' | translate\n }}</label>\n <select\n id=\"parentId\"\n class=\"p-inputtext w-full\"\n [formField]=\"actionForm.parentId\"\n >\n <option value=\"\">\n {{ 'iam.action.select.parent' | translate }}\n </option>\n @for (action of availableActions(); track action.id) {\n <option [value]=\"action.id\">{{ action.name }}</option>\n }\n </select>\n </div>\n\n <!-- Order -->\n <div class=\"flex flex-col gap-2\">\n <label for=\"serial\" class=\"font-medium\">{{\n 'shared.display.order' | translate\n }}</label>\n <input\n pInputText\n id=\"serial\"\n type=\"number\"\n [formField]=\"actionForm.serial\"\n [placeholder]=\"'shared.display.order.placeholder' | translate\"\n />\n </div>\n\n <!-- Is Active -->\n <div class=\"flex items-end gap-2 pb-1 md:col-span-2\">\n <p-checkbox\n [formField]=\"actionForm.isActive\"\n [binary]=\"true\"\n inputId=\"isActive\"\n />\n <label for=\"isActive\">{{ 'shared.active' | translate }}</label>\n </div>\n\n <!-- Permission Logic Builder -->\n <div class=\"md:col-span-2\">\n <lib-logic-builder\n [logic]=\"formModel().permissionLogic\"\n [actions]=\"allActionsForLogic()\"\n (logicChange)=\"onLogicChange($event)\"\n />\n </div>\n\n <!-- Actions -->\n <div class=\"flex justify-end gap-2 md:col-span-2 pt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onBack()\"\n />\n <p-button\n [label]=\"\n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n \"\n type=\"submit\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n </div>\n </form>\n </div>\n `,\n})\nexport class ActionFormPageComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly actionApi = inject(ActionApiService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly isLoading = signal(false);\n readonly existingAction = signal<IAction | null>(null);\n readonly isEditMode = computed(() => !!this.existingAction());\n readonly allActionsForLogic = signal<Array<{ id: string; name: string }>>([]);\n readonly allActions = signal<IAction[]>([]);\n\n readonly availableActions = computed(() => {\n const actions = this.allActions();\n const currentId = this.existingAction()?.id;\n return currentId ? actions.filter((a) => a.id !== currentId) : actions;\n });\n\n readonly formModel = signal<IActionFormModel>({\n id: '',\n name: '',\n description: '',\n code: '',\n actionType: ActionType.BACKEND,\n permissionLogic: null,\n parentId: '',\n serial: '',\n isActive: true,\n });\n\n readonly actionTypes = computed(() => [\n {\n label: this.translate('iam.action.type.backend.label'),\n value: ActionType.BACKEND,\n },\n {\n label: this.translate('iam.action.type.frontend.label'),\n value: ActionType.FRONTEND,\n },\n {\n label: this.translate('iam.action.type.both.label'),\n value: ActionType.BOTH,\n },\n ]);\n\n readonly actionForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translate('shared.validation.required', {\n field: this.translate('iam.action.name'),\n }),\n });\n });\n\n readonly isFormValid = computed(() => {\n const model = this.formModel();\n return model.name.trim().length > 0;\n });\n\n constructor() {\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n this.initializeForm(params.get('id'));\n });\n }\n\n private async initializeForm(id: string | null): Promise<void> {\n try {\n const response = await this.actionApi.getAll({\n pagination: { currentPage: 0, pageSize: 10000 },\n select: ['id', 'name', 'code', 'actionType', 'permissionLogic'],\n });\n if (response?.success && response.data) {\n this.allActionsForLogic.set(\n response.data.map((a) => ({\n id: a.id!,\n name: a.name ?? this.translate('shared.unnamed'),\n })),\n );\n this.allActions.set(response.data);\n }\n } catch {\n // Ignored - form will show empty parent dropdown\n }\n\n if (id && id !== 'new') {\n await this.loadAction(id);\n }\n }\n\n async loadAction(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.actionApi.findById(id, [\n 'id',\n 'name',\n 'description',\n 'code',\n 'actionType',\n 'permissionLogic',\n 'parentId',\n 'serial',\n 'isActive',\n ]);\n\n if (response?.success && response.data) {\n const action = response.data;\n this.existingAction.set(action);\n this.formModel.set({\n id: action.id ?? '',\n name: action.name ?? '',\n description: action.description ?? '',\n code: action.code ?? '',\n actionType: action.actionType ?? ActionType.BACKEND,\n permissionLogic: action.permissionLogic ?? null,\n parentId: action.parentId ?? '',\n serial: action.serial?.toString() ?? '',\n isActive: action.isActive ?? true,\n });\n } else {\n this.router.navigate(['/iam/actions']);\n }\n } catch {\n this.router.navigate(['/iam/actions']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(): Promise<void> {\n if (!this.isFormValid()) {\n this.messageService.add({\n severity: 'error',\n summary: this.translate('shared.validation.error'),\n detail: this.translate('shared.fill.required.fields'),\n });\n return;\n }\n\n this.isLoading.set(true);\n\n try {\n const formValue = this.formModel();\n const dto = {\n ...formValue,\n description: formValue.description || undefined,\n code: formValue.code || undefined,\n parentId: formValue.parentId || undefined,\n serial: formValue.serial ? parseInt(formValue.serial, 10) : undefined,\n permissionLogic: formValue.permissionLogic ?? undefined,\n };\n\n const response = this.isEditMode()\n ? await this.actionApi.update(dto)\n : await this.actionApi.insert(dto);\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n });\n\n this.router.navigate(['/iam/actions']);\n } catch {\n // Handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onBack(): void {\n this.router.navigate(['/iam/actions']);\n }\n\n onLogicChange(logic: ILogicNode | null): void {\n this.formModel.update((model) => ({ ...model, permissionLogic: logic }));\n }\n}\n"],"names":[],"mappings":"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"}