@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.
- package/fesm2022/{flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs → flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs} +156 -54
- package/fesm2022/flusys-ng-iam-action-form-page.component-DMrFt5MP.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-action-list-page.component-DRK79zUR.mjs → flusys-ng-iam-action-list-page.component-BIA9UpeH.mjs} +110 -40
- package/fesm2022/flusys-ng-iam-action-list-page.component-BIA9UpeH.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs → flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs} +50 -27
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-Cfo9kP14.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-iam-container.component-CQA2B6cU.mjs → flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs} +34 -9
- package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-permission-page.component-CZebeUhC.mjs → flusys-ng-iam-permission-page.component-BFZCb8Md.mjs} +2 -2
- package/fesm2022/{flusys-ng-iam-permission-page.component-CZebeUhC.mjs.map → flusys-ng-iam-permission-page.component-BFZCb8Md.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-iam-role-form-page.component-49dKMKOj.mjs → flusys-ng-iam-role-form-page.component-TfZDInlN.mjs} +85 -31
- package/fesm2022/flusys-ng-iam-role-form-page.component-TfZDInlN.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-role-list-page.component-CT7CvvHj.mjs → flusys-ng-iam-role-list-page.component-CuHewjjr.mjs} +5 -5
- package/fesm2022/flusys-ng-iam-role-list-page.component-CuHewjjr.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam.mjs +1 -1
- package/package.json +4 -4
- package/types/flusys-ng-iam.d.ts +2 -3
- package/fesm2022/flusys-ng-iam-action-form-page.component-D_vwcCjG.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-action-list-page.component-DRK79zUR.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-C6I4k78L.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-iam-container.component-CQA2B6cU.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-form-page.component-49dKMKOj.mjs.map +0 -1
- 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 {
|
|
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-
|
|
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(
|
|
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
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
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, {
|
|
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) => ({
|
|
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',
|
|
91
|
-
'
|
|
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
|
|
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
|
-
{{
|
|
192
|
+
{{
|
|
193
|
+
isEditMode()
|
|
194
|
+
? ('iam.action.edit' | translate)
|
|
195
|
+
: ('iam.action.new' | translate)
|
|
196
|
+
}}
|
|
167
197
|
</h3>
|
|
168
198
|
|
|
169
|
-
<form
|
|
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"
|
|
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">{{
|
|
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">{{
|
|
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"
|
|
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">{{
|
|
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
|
-
|
|
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">{{
|
|
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]="
|
|
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: [
|
|
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
|
-
{{
|
|
347
|
+
{{
|
|
348
|
+
isEditMode()
|
|
349
|
+
? ('iam.action.edit' | translate)
|
|
350
|
+
: ('iam.action.new' | translate)
|
|
351
|
+
}}
|
|
281
352
|
</h3>
|
|
282
353
|
|
|
283
|
-
<form
|
|
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"
|
|
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">{{
|
|
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">{{
|
|
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"
|
|
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">{{
|
|
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
|
-
|
|
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">{{
|
|
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]="
|
|
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-
|
|
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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"}
|