@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.
- package/fesm2022/{flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs → flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs} +102 -91
- package/fesm2022/flusys-ng-iam-action-form-page.component-DTJT8Dc-.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-action-list-page.component-BJ-tu6vu.mjs → flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs} +71 -64
- package/fesm2022/flusys-ng-iam-action-list-page.component-B1hUE4lD.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs → flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs} +632 -547
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-DzIO0zsO.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs +105 -0
- package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-permission-page.component-D4IHueFW.mjs → flusys-ng-iam-permission-page.component-rcijgKmE.mjs} +33 -28
- package/fesm2022/flusys-ng-iam-permission-page.component-rcijgKmE.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-role-form-page.component-CX8LxsdO.mjs → flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs} +62 -47
- package/fesm2022/flusys-ng-iam-role-form-page.component-DrUQ0taO.mjs.map +1 -0
- package/fesm2022/{flusys-ng-iam-role-list-page.component-CNOsO-gH.mjs → flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs} +77 -65
- package/fesm2022/flusys-ng-iam-role-list-page.component-BcS9_ysT.mjs.map +1 -0
- package/fesm2022/flusys-ng-iam.mjs +1 -1
- package/package.json +10 -11
- package/types/flusys-ng-iam.d.ts +2 -2
- package/fesm2022/flusys-ng-iam-action-form-page.component-BQJkl9pU.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-action-list-page.component-BJ-tu6vu.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-flusys-ng-iam-Bb39q1Bu.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs +0 -118
- package/fesm2022/flusys-ng-iam-iam-container.component-DAiS1Mtk.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-permission-page.component-D4IHueFW.mjs.map +0 -1
- package/fesm2022/flusys-ng-iam-role-form-page.component-CX8LxsdO.mjs.map +0 -1
- 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
|
|
7
|
-
import { MessageService } from '
|
|
8
|
-
import {
|
|
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,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
],
|
|
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
|
-
},
|
|
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: "
|
|
189
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
249
|
-
|
|
254
|
+
<f-select
|
|
255
|
+
inputId="actionType"
|
|
256
|
+
[options]="actionTypes()"
|
|
257
|
+
optionLabel="label"
|
|
258
|
+
optionValue="value"
|
|
250
259
|
[formField]="actionForm.actionType"
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
265
|
-
|
|
269
|
+
<f-select
|
|
270
|
+
inputId="parentId"
|
|
271
|
+
[options]="availableActions()"
|
|
272
|
+
optionLabel="name"
|
|
273
|
+
optionValue="id"
|
|
266
274
|
[formField]="actionForm.parentId"
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
313
|
-
|
|
315
|
+
<button
|
|
316
|
+
fButton
|
|
314
317
|
severity="secondary"
|
|
315
318
|
[outlined]="true"
|
|
316
|
-
(
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
|
|
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.
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
404
|
-
|
|
411
|
+
<f-select
|
|
412
|
+
inputId="actionType"
|
|
413
|
+
[options]="actionTypes()"
|
|
414
|
+
optionLabel="label"
|
|
415
|
+
optionValue="value"
|
|
405
416
|
[formField]="actionForm.actionType"
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
420
|
-
|
|
426
|
+
<f-select
|
|
427
|
+
inputId="parentId"
|
|
428
|
+
[options]="availableActions()"
|
|
429
|
+
optionLabel="name"
|
|
430
|
+
optionValue="id"
|
|
421
431
|
[formField]="actionForm.parentId"
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
468
|
-
|
|
472
|
+
<button
|
|
473
|
+
fButton
|
|
469
474
|
severity="secondary"
|
|
470
475
|
[outlined]="true"
|
|
471
|
-
(
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
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
|
-
|
|
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-
|
|
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":";;;;;;;;;;;MAuLa,uBAAuB,CAAA;AACjB,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACpC,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE;AAC3D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IACe,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IACpD,WAAW,GAAG,KAAK;IAEnB,SAAS,CACf,GAAW,EACX,IAAsC,EAAA;AAEtC,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG;IAC3D;IAES,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;IACzB,cAAc,GAAG,MAAM,CAAiB,IAAI;uFAAC;IAC7C,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE;mFAAC;IACpD,kBAAkB,GAAG,MAAM,CAAsC,EAAE;2FAAC;IACpE,UAAU,GAAG,MAAM,CAAY,EAAE;mFAAC;AAElC,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE;QAC3C,OAAO,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,GAAG,OAAO;IACxE,CAAC;yFAAC;IAEO,SAAS,GAAG,MAAM,CAAmB;AAC5C,QAAA,EAAE,EAAE,EAAE;AACN,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,UAAU,CAAC,OAAO;AAC9B,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA;kFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM;AACpC,QAAA;AACE,YAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,+BAA+B,CAAC;YACtD,KAAK,EAAE,UAAU,CAAC,OAAO;AAC1B,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,gCAAgC,CAAC;YACvD,KAAK,EAAE,UAAU,CAAC,QAAQ;AAC3B,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC;YACnD,KAAK,EAAE,UAAU,CAAC,IAAI;AACvB,SAAA;AACF,KAAA;oFAAC;IAEO,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,KAAI;AAC/C,QAAA,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE;AACf,YAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,4BAA4B,EAAE;AACpD,gBAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;aACzC,CAAC;AACH,SAAA,CAAC;AACJ,IAAA,CAAC,CAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;IACrC,CAAC;oFAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW;gBAAE;AAEjC,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvC,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,cAAc,CAAC,EAAiB,EAAA;AAC5C,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC3C,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;gBAC/C,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,CAAC;AAChE,aAAA,CAAC;YACF,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACtC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACzB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;oBACxB,EAAE,EAAE,CAAC,CAAC,EAAG;oBACT,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;iBACjD,CAAC,CAAC,CACJ;gBACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpC;QACF;AAAE,QAAA,MAAM;;QAER;AAEA,QAAA,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE;AACtB,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B;IACF;IAEA,MAAM,UAAU,CAAC,EAAU,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE;gBACjD,IAAI;gBACJ,MAAM;gBACN,aAAa;gBACb,MAAM;gBACN,YAAY;gBACZ,iBAAiB;gBACjB,UAAU;gBACV,QAAQ;gBACR,UAAU;AACX,aAAA,CAAC;YAEF,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACtC,gBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI;AAC5B,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACjB,oBAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;AACnB,oBAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;AACvB,oBAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;AACrC,oBAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;AACvB,oBAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO;AACnD,oBAAA,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;AAC/C,oBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;oBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;AACvC,oBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;AAClC,iBAAA,CAAC;YACJ;iBAAO;gBACL,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;YACxC;QACF;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;QACxC;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC;AAClD,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC;AACtD,aAAA,CAAC;YACF;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,GAAG,GAAG;AACV,gBAAA,GAAG,SAAS;AACZ,gBAAA,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,SAAS;AAC/C,gBAAA,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS;AACjC,gBAAA,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,SAAS;AACzC,gBAAA,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,SAAS;AACrE,gBAAA,eAAe,EAAE,SAAS,CAAC,eAAe,IAAI,SAAS;aACxD;AAED,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;kBAC5B,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;kBAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;AAEpC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBACzC,MAAM,EAAE,QAAQ,CAAC;AACf,sBAAE,IAAI,CAAC,SAAS,CACZ,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,gBAAmD;AAEhE,uBAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;AAC7B,aAAA,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;QACxC;AAAE,QAAA,MAAM;;QAER;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IACxC;AAEA,IAAA,aAAa,CAAC,KAAwB,EAAA;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E;uGAnMW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlJxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgJT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAtJC,aAAa,ofACb,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,SAAS,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACT,qBAAqB,iHACrB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAoJJ,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA3JnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,OAAO,EAAE;wBACP,aAAa;wBACb,QAAQ;wBACR,SAAS;wBACT,qBAAqB;wBACrB,aAAa;AACd,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgJT,EAAA,CAAA;AACF,iBAAA;;;;;"}
|