@flusys/ng-iam 5.4.1 → 6.0.0-beta.1

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 (25) hide show
  1. package/fesm2022/{flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs → flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs} +102 -91
  2. package/fesm2022/flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs.map +1 -0
  3. package/fesm2022/{flusys-ng-iam-action-list-page.component-BJ-tu6vu.mjs → flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs} +71 -64
  4. package/fesm2022/flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs.map +1 -0
  5. package/fesm2022/{flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs → flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs} +632 -547
  6. package/fesm2022/flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs.map +1 -0
  7. package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs +105 -0
  8. package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs.map +1 -0
  9. package/fesm2022/{flusys-ng-iam-permission-page.component-D4IHueFW.mjs → flusys-ng-iam-permission-page.component-rcijgKmE.mjs} +33 -28
  10. package/fesm2022/flusys-ng-iam-permission-page.component-rcijgKmE.mjs.map +1 -0
  11. package/fesm2022/{flusys-ng-iam-role-form-page.component-CX8LxsdO.mjs → flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs} +62 -47
  12. package/fesm2022/flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs.map +1 -0
  13. package/fesm2022/{flusys-ng-iam-role-list-page.component-CNOsO-gH.mjs → flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs} +77 -65
  14. package/fesm2022/flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs.map +1 -0
  15. package/fesm2022/flusys-ng-iam.mjs +1 -1
  16. package/package.json +10 -11
  17. package/types/flusys-ng-iam.d.ts +2 -2
  18. package/fesm2022/flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-iam-action-list-page.component-BJ-tu6vu.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs +0 -118
  22. package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-iam-permission-page.component-D4IHueFW.mjs.map +0 -1
  24. package/fesm2022/flusys-ng-iam-role-form-page.component-CX8LxsdO.mjs.map +0 -1
  25. package/fesm2022/flusys-ng-iam-role-list-page.component-CNOsO-gH.mjs.map +0 -1
@@ -3,13 +3,11 @@ 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 { TranslateService, AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';
7
- import { MessageService } from 'primeng/api';
8
- import { A as ActionApiService, a as ActionType, L as LogicBuilderComponent } from './flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs';
6
+ import * as i2 from '@flusys/ng-ui';
7
+ import { MessageService, UiModule } from '@flusys/ng-ui';
8
+ import { TranslateService, AngularModule, TranslatePipe } from '@flusys/ng-shared';
9
+ import { A as ActionApiService, a as ActionType, L as LogicBuilderComponent } from './flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs';
9
10
  import * as i1 from '@angular/forms';
10
- import * as i2 from 'primeng/button';
11
- import * as i3 from 'primeng/checkbox';
12
- import * as i4 from 'primeng/inputtext';
13
11
 
14
12
  class ActionFormPageComponent {
15
13
  route = inject(ActivatedRoute);
@@ -24,16 +22,22 @@ class ActionFormPageComponent {
24
22
  translate(key, vars) {
25
23
  return this.translateAdapter?.translate(key, vars) ?? key;
26
24
  }
27
- isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
28
- existingAction = signal(null, ...(ngDevMode ? [{ debugName: "existingAction" }] : []));
29
- isEditMode = computed(() => !!this.existingAction(), ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
30
- allActionsForLogic = signal([], ...(ngDevMode ? [{ debugName: "allActionsForLogic" }] : []));
31
- allActions = signal([], ...(ngDevMode ? [{ debugName: "allActions" }] : []));
25
+ isLoading = signal(false, /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
27
+ existingAction = signal(null, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "existingAction" }] : /* istanbul ignore next */ []));
29
+ isEditMode = computed(() => !!this.existingAction(), /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
31
+ allActionsForLogic = signal([], /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "allActionsForLogic" }] : /* istanbul ignore next */ []));
33
+ allActions = signal([], /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "allActions" }] : /* istanbul ignore next */ []));
32
35
  availableActions = computed(() => {
33
36
  const actions = this.allActions();
34
37
  const currentId = this.existingAction()?.id;
35
38
  return currentId ? actions.filter((a) => a.id !== currentId) : actions;
36
- }, ...(ngDevMode ? [{ debugName: "availableActions" }] : []));
39
+ }, /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "availableActions" }] : /* istanbul ignore next */ []));
37
41
  formModel = signal({
38
42
  id: '',
39
43
  name: '',
@@ -44,7 +48,8 @@ class ActionFormPageComponent {
44
48
  parentId: '',
45
49
  serial: '',
46
50
  isActive: true,
47
- }, ...(ngDevMode ? [{ debugName: "formModel" }] : []));
51
+ }, /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "formModel" }] : /* istanbul ignore next */ []));
48
53
  actionTypes = computed(() => [
49
54
  {
50
55
  label: this.translate('iam.action.type.backend.label'),
@@ -58,7 +63,8 @@ class ActionFormPageComponent {
58
63
  label: this.translate('iam.action.type.both.label'),
59
64
  value: ActionType.BOTH,
60
65
  },
61
- ], ...(ngDevMode ? [{ debugName: "actionTypes" }] : []));
66
+ ], /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "actionTypes" }] : /* istanbul ignore next */ []));
62
68
  actionForm = form(this.formModel, (f) => {
63
69
  required(f.name, {
64
70
  message: this.translate('shared.validation.required', {
@@ -69,7 +75,8 @@ class ActionFormPageComponent {
69
75
  isFormValid = computed(() => {
70
76
  const model = this.formModel();
71
77
  return model.name.trim().length > 0;
72
- }, ...(ngDevMode ? [{ debugName: "isFormValid" }] : []));
78
+ }, /* @ts-ignore */
79
+ ...(ngDevMode ? [{ debugName: "isFormValid" }] : /* istanbul ignore next */ []));
73
80
  constructor() {
74
81
  effect(() => {
75
82
  const params = this.routeParams();
@@ -185,8 +192,8 @@ class ActionFormPageComponent {
185
192
  onLogicChange(logic) {
186
193
  this.formModel.update((model) => ({ ...model, permissionLogic: logic }));
187
194
  }
188
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: ActionFormPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
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: `
195
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionFormPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
196
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: ActionFormPageComponent, isStandalone: true, selector: "lib-action-form-page", ngImport: i0, template: `
190
197
  <div class="card">
191
198
  <h3 class="text-lg sm:text-xl font-semibold mb-4">
192
199
  {{
@@ -206,7 +213,7 @@ class ActionFormPageComponent {
206
213
  >{{ 'iam.action.name' | translate }} *</label
207
214
  >
208
215
  <input
209
- pInputText
216
+ fInputText
210
217
  id="name"
211
218
  [formField]="actionForm.name"
212
219
  [placeholder]="'iam.action.name.placeholder' | translate"
@@ -219,7 +226,7 @@ class ActionFormPageComponent {
219
226
  'iam.action.code' | translate
220
227
  }}</label>
221
228
  <input
222
- pInputText
229
+ fInputText
223
230
  id="code"
224
231
  [formField]="actionForm.code"
225
232
  [placeholder]="'iam.action.code.placeholder' | translate"
@@ -232,7 +239,7 @@ class ActionFormPageComponent {
232
239
  'shared.description' | translate
233
240
  }}</label>
234
241
  <input
235
- pInputText
242
+ fInputText
236
243
  id="description"
237
244
  [formField]="actionForm.description"
238
245
  [placeholder]="'shared.description.placeholder' | translate"
@@ -244,15 +251,14 @@ class ActionFormPageComponent {
244
251
  <label for="actionType" class="font-medium"
245
252
  >{{ 'iam.action.type' | translate }} *</label
246
253
  >
247
- <select
248
- id="actionType"
249
- class="p-inputtext w-full"
254
+ <f-select
255
+ inputId="actionType"
256
+ [options]="actionTypes()"
257
+ optionLabel="label"
258
+ optionValue="value"
250
259
  [formField]="actionForm.actionType"
251
- >
252
- @for (type of actionTypes(); track type.value) {
253
- <option [value]="type.value">{{ type.label }}</option>
254
- }
255
- </select>
260
+ [placeholder]="'iam.action.type' | translate"
261
+ />
256
262
  </div>
257
263
 
258
264
  <!-- Parent Action -->
@@ -260,18 +266,15 @@ class ActionFormPageComponent {
260
266
  <label for="parentId" class="font-medium">{{
261
267
  'iam.action.parent' | translate
262
268
  }}</label>
263
- <select
264
- id="parentId"
265
- class="p-inputtext w-full"
269
+ <f-select
270
+ inputId="parentId"
271
+ [options]="availableActions()"
272
+ optionLabel="name"
273
+ optionValue="id"
266
274
  [formField]="actionForm.parentId"
267
- >
268
- <option value="">
269
- {{ 'iam.action.select.parent' | translate }}
270
- </option>
271
- @for (action of availableActions(); track action.id) {
272
- <option [value]="action.id">{{ action.name }}</option>
273
- }
274
- </select>
275
+ [placeholder]="'iam.action.select.parent' | translate"
276
+ [filter]="true"
277
+ />
275
278
  </div>
276
279
 
277
280
  <!-- Order -->
@@ -280,7 +283,7 @@ class ActionFormPageComponent {
280
283
  'shared.display.order' | translate
281
284
  }}</label>
282
285
  <input
283
- pInputText
286
+ fInputText
284
287
  id="serial"
285
288
  type="number"
286
289
  [formField]="actionForm.serial"
@@ -290,7 +293,7 @@ class ActionFormPageComponent {
290
293
 
291
294
  <!-- Is Active -->
292
295
  <div class="flex items-end gap-2 pb-1 md:col-span-2">
293
- <p-checkbox
296
+ <f-checkbox
294
297
  [formField]="actionForm.isActive"
295
298
  [binary]="true"
296
299
  inputId="isActive"
@@ -309,34 +312,40 @@ class ActionFormPageComponent {
309
312
 
310
313
  <!-- Actions -->
311
314
  <div class="flex justify-end gap-2 md:col-span-2 pt-4">
312
- <p-button
313
- [label]="'shared.cancel' | translate"
315
+ <button
316
+ fButton
314
317
  severity="secondary"
315
318
  [outlined]="true"
316
- (onClick)="onBack()"
317
- />
318
- <p-button
319
- [label]="
319
+ (click)="onBack()"
320
+ >
321
+ <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
322
+ </button>
323
+ <button
324
+ fButton
325
+ type="submit"
326
+ [disabled]="!isFormValid() || isLoading()"
327
+ >
328
+ @if (isLoading()) {
329
+ <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
330
+ }
331
+ <span pButtonLabel>{{
320
332
  isEditMode()
321
333
  ? ('shared.update' | translate)
322
334
  : ('shared.create' | translate)
323
- "
324
- type="submit"
325
- [loading]="isLoading()"
326
- [disabled]="!isFormValid() || isLoading()"
327
- />
335
+ }}</span>
336
+ </button>
328
337
  </div>
329
338
  </form>
330
339
  </div>
331
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i3.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["hostName", "value", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "inputStyle", "styleClass", "inputClass", "indeterminate", "formControl", "checkboxIcon", "readonly", "autofocus", "trueValue", "falseValue", "variant", "size"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"] }, { kind: "component", type: LogicBuilderComponent, selector: "lib-logic-builder", inputs: ["logic", "actions"], outputs: ["logicChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
340
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "inputId", "invalid", "indeterminate", "touched", "styleClass", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i2.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched"] }, { kind: "component", type: i2.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: LogicBuilderComponent, selector: "lib-logic-builder", inputs: ["logic", "actions"], outputs: ["logicChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
332
341
  }
333
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: ActionFormPageComponent, decorators: [{
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ActionFormPageComponent, decorators: [{
334
343
  type: Component,
335
344
  args: [{
336
345
  selector: 'lib-action-form-page',
337
346
  imports: [
338
347
  AngularModule,
339
- PrimeModule,
348
+ UiModule,
340
349
  FormField,
341
350
  LogicBuilderComponent,
342
351
  TranslatePipe,
@@ -361,7 +370,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
361
370
  >{{ 'iam.action.name' | translate }} *</label
362
371
  >
363
372
  <input
364
- pInputText
373
+ fInputText
365
374
  id="name"
366
375
  [formField]="actionForm.name"
367
376
  [placeholder]="'iam.action.name.placeholder' | translate"
@@ -374,7 +383,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
374
383
  'iam.action.code' | translate
375
384
  }}</label>
376
385
  <input
377
- pInputText
386
+ fInputText
378
387
  id="code"
379
388
  [formField]="actionForm.code"
380
389
  [placeholder]="'iam.action.code.placeholder' | translate"
@@ -387,7 +396,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
387
396
  'shared.description' | translate
388
397
  }}</label>
389
398
  <input
390
- pInputText
399
+ fInputText
391
400
  id="description"
392
401
  [formField]="actionForm.description"
393
402
  [placeholder]="'shared.description.placeholder' | translate"
@@ -399,15 +408,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
399
408
  <label for="actionType" class="font-medium"
400
409
  >{{ 'iam.action.type' | translate }} *</label
401
410
  >
402
- <select
403
- id="actionType"
404
- class="p-inputtext w-full"
411
+ <f-select
412
+ inputId="actionType"
413
+ [options]="actionTypes()"
414
+ optionLabel="label"
415
+ optionValue="value"
405
416
  [formField]="actionForm.actionType"
406
- >
407
- @for (type of actionTypes(); track type.value) {
408
- <option [value]="type.value">{{ type.label }}</option>
409
- }
410
- </select>
417
+ [placeholder]="'iam.action.type' | translate"
418
+ />
411
419
  </div>
412
420
 
413
421
  <!-- Parent Action -->
@@ -415,18 +423,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
415
423
  <label for="parentId" class="font-medium">{{
416
424
  'iam.action.parent' | translate
417
425
  }}</label>
418
- <select
419
- id="parentId"
420
- class="p-inputtext w-full"
426
+ <f-select
427
+ inputId="parentId"
428
+ [options]="availableActions()"
429
+ optionLabel="name"
430
+ optionValue="id"
421
431
  [formField]="actionForm.parentId"
422
- >
423
- <option value="">
424
- {{ 'iam.action.select.parent' | translate }}
425
- </option>
426
- @for (action of availableActions(); track action.id) {
427
- <option [value]="action.id">{{ action.name }}</option>
428
- }
429
- </select>
432
+ [placeholder]="'iam.action.select.parent' | translate"
433
+ [filter]="true"
434
+ />
430
435
  </div>
431
436
 
432
437
  <!-- Order -->
@@ -435,7 +440,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
435
440
  'shared.display.order' | translate
436
441
  }}</label>
437
442
  <input
438
- pInputText
443
+ fInputText
439
444
  id="serial"
440
445
  type="number"
441
446
  [formField]="actionForm.serial"
@@ -445,7 +450,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
445
450
 
446
451
  <!-- Is Active -->
447
452
  <div class="flex items-end gap-2 pb-1 md:col-span-2">
448
- <p-checkbox
453
+ <f-checkbox
449
454
  [formField]="actionForm.isActive"
450
455
  [binary]="true"
451
456
  inputId="isActive"
@@ -464,22 +469,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
464
469
 
465
470
  <!-- Actions -->
466
471
  <div class="flex justify-end gap-2 md:col-span-2 pt-4">
467
- <p-button
468
- [label]="'shared.cancel' | translate"
472
+ <button
473
+ fButton
469
474
  severity="secondary"
470
475
  [outlined]="true"
471
- (onClick)="onBack()"
472
- />
473
- <p-button
474
- [label]="
476
+ (click)="onBack()"
477
+ >
478
+ <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
479
+ </button>
480
+ <button
481
+ fButton
482
+ type="submit"
483
+ [disabled]="!isFormValid() || isLoading()"
484
+ >
485
+ @if (isLoading()) {
486
+ <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
487
+ }
488
+ <span pButtonLabel>{{
475
489
  isEditMode()
476
490
  ? ('shared.update' | translate)
477
491
  : ('shared.create' | translate)
478
- "
479
- type="submit"
480
- [loading]="isLoading()"
481
- [disabled]="!isFormValid() || isLoading()"
482
- />
492
+ }}</span>
493
+ </button>
483
494
  </div>
484
495
  </form>
485
496
  </div>
@@ -488,4 +499,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
488
499
  }], ctorParameters: () => [] });
489
500
 
490
501
  export { ActionFormPageComponent };
491
- //# sourceMappingURL=flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs.map
502
+ //# sourceMappingURL=flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-iam-action-form-page.component-DTJT8Dc-.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 { MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n ILogicNode,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { LogicBuilderComponent } from '../../components/logic-builder.component';\nimport { ActionType, IAction } from '../../interfaces/action.interface';\nimport { ActionApiService } from '../../services/action-api.service';\nimport { UiModule } from '@flusys/ng-ui';\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 UiModule,\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 fInputText\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 fInputText\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 fInputText\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 <f-select\n inputId=\"actionType\"\n [options]=\"actionTypes()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [formField]=\"actionForm.actionType\"\n [placeholder]=\"'iam.action.type' | translate\"\n />\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 <f-select\n inputId=\"parentId\"\n [options]=\"availableActions()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"actionForm.parentId\"\n [placeholder]=\"'iam.action.select.parent' | translate\"\n [filter]=\"true\"\n />\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 fInputText\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 <f-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 <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onBack()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n isEditMode()\n ? ('shared.update' | translate)\n : ('shared.create' | translate)\n }}</span>\n </button>\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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"}