@flusys/ng-iam 1.1.1-beta → 1.2.0-rc.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 (32) hide show
  1. package/README.md +44 -1027
  2. package/fesm2022/flusys-ng-iam-action-form-page.component-Vc5Toouu.mjs +502 -0
  3. package/fesm2022/flusys-ng-iam-action-form-page.component-Vc5Toouu.mjs.map +1 -0
  4. package/fesm2022/flusys-ng-iam-action-list-page.component-UGKclpFx.mjs +348 -0
  5. package/fesm2022/flusys-ng-iam-action-list-page.component-UGKclpFx.mjs.map +1 -0
  6. package/fesm2022/flusys-ng-iam-flusys-ng-iam-CrycDULz.mjs +4561 -0
  7. package/fesm2022/flusys-ng-iam-flusys-ng-iam-CrycDULz.mjs.map +1 -0
  8. package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs +105 -0
  9. package/fesm2022/flusys-ng-iam-iam-container.component-D0m8u6nu.mjs.map +1 -0
  10. package/fesm2022/flusys-ng-iam-permission-page.component-x88X4AgJ.mjs +143 -0
  11. package/fesm2022/flusys-ng-iam-permission-page.component-x88X4AgJ.mjs.map +1 -0
  12. package/fesm2022/flusys-ng-iam-role-form-page.component-InsxdriD.mjs +335 -0
  13. package/fesm2022/flusys-ng-iam-role-form-page.component-InsxdriD.mjs.map +1 -0
  14. package/fesm2022/flusys-ng-iam-role-list-page.component-8NGXCeSZ.mjs +389 -0
  15. package/fesm2022/flusys-ng-iam-role-list-page.component-8NGXCeSZ.mjs.map +1 -0
  16. package/fesm2022/flusys-ng-iam.mjs +1 -1
  17. package/package.json +11 -10
  18. package/types/flusys-ng-iam.d.ts +107 -686
  19. package/fesm2022/flusys-ng-iam-action-form-page.component-C1j10Qhw.mjs +0 -467
  20. package/fesm2022/flusys-ng-iam-action-form-page.component-C1j10Qhw.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-iam-action-list-page.component-BCzSardO.mjs +0 -281
  22. package/fesm2022/flusys-ng-iam-action-list-page.component-BCzSardO.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-iam-flusys-ng-iam-DISrddPh.mjs +0 -4940
  24. package/fesm2022/flusys-ng-iam-flusys-ng-iam-DISrddPh.mjs.map +0 -1
  25. package/fesm2022/flusys-ng-iam-iam-container.component-BkhqmzLi.mjs +0 -97
  26. package/fesm2022/flusys-ng-iam-iam-container.component-BkhqmzLi.mjs.map +0 -1
  27. package/fesm2022/flusys-ng-iam-permission-page.component-BSQFPt_N.mjs +0 -143
  28. package/fesm2022/flusys-ng-iam-permission-page.component-BSQFPt_N.mjs.map +0 -1
  29. package/fesm2022/flusys-ng-iam-role-form-page.component-Cqziu_BM.mjs +0 -314
  30. package/fesm2022/flusys-ng-iam-role-form-page.component-Cqziu_BM.mjs.map +0 -1
  31. package/fesm2022/flusys-ng-iam-role-list-page.component-BObCxHiB.mjs +0 -266
  32. package/fesm2022/flusys-ng-iam-role-list-page.component-BObCxHiB.mjs.map +0 -1
@@ -0,0 +1,389 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, signal, computed, effect, untracked, Component } from '@angular/core';
3
+ import { Router } from '@angular/router';
4
+ import { APP_CONFIG, DEFAULT_APP_NAME, isCompanyFeatureEnabled } from '@flusys/ng-core';
5
+ import { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';
6
+ import * as i2 from '@flusys/ng-ui';
7
+ import { MessageService, ConfirmationService, UiModule } from '@flusys/ng-ui';
8
+ import { ROLE_PERMISSIONS, TranslateService, AngularModule, HasPermissionDirective, TranslatePipe } from '@flusys/ng-shared';
9
+ import { R as RoleApiService } from './flusys-ng-iam-flusys-ng-iam-CrycDULz.mjs';
10
+
11
+ class RoleListPageComponent {
12
+ ROLE_PERMISSIONS = ROLE_PERMISSIONS;
13
+ router = inject(Router);
14
+ appConfig = inject(APP_CONFIG);
15
+ companyContext = inject(LAYOUT_AUTH_STATE);
16
+ roleApi = inject(RoleApiService);
17
+ messageService = inject(MessageService);
18
+ confirmationService = inject(ConfirmationService);
19
+ translateAdapter = inject(TranslateService, {
20
+ optional: true,
21
+ });
22
+ translate(key, vars) {
23
+ return this.translateAdapter?.translate(key, vars) ?? key;
24
+ }
25
+ roles = signal([], /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "roles" }] : /* istanbul ignore next */ []));
27
+ isLoading = signal(false, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
29
+ total = signal(0, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
31
+ pageSize = signal(10, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
33
+ first = signal(0, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "first" }] : /* istanbul ignore next */ []));
35
+ showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature, /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "showCompanyInfo" }] : /* istanbul ignore next */ []));
37
+ currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME, /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "currentCompanyName" }] : /* istanbul ignore next */ []));
39
+ previousCompanyId = undefined;
40
+ constructor() {
41
+ effect(() => {
42
+ const currentCompanyId = this.companyContext.currentCompanyInfo()?.id ?? null;
43
+ if (this.previousCompanyId === undefined) {
44
+ this.previousCompanyId = currentCompanyId;
45
+ return;
46
+ }
47
+ if (this.previousCompanyId === currentCompanyId)
48
+ return;
49
+ this.previousCompanyId = currentCompanyId;
50
+ untracked(() => {
51
+ this.first.set(0);
52
+ this.loadRoles();
53
+ });
54
+ });
55
+ }
56
+ async loadRoles() {
57
+ this.isLoading.set(true);
58
+ try {
59
+ const enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);
60
+ const companyId = enableCompanyFeature
61
+ ? this.companyContext.currentCompanyInfo()?.id || undefined
62
+ : undefined;
63
+ const selectFields = [
64
+ 'id',
65
+ 'name',
66
+ 'description',
67
+ 'isActive',
68
+ 'readOnly',
69
+ 'serial',
70
+ 'createdAt',
71
+ 'deletedAt',
72
+ ];
73
+ if (enableCompanyFeature) {
74
+ selectFields.push('companyId');
75
+ }
76
+ const response = await this.roleApi.getAll({
77
+ filter: companyId ? { companyId } : undefined,
78
+ pagination: {
79
+ currentPage: Math.floor(this.first() / this.pageSize()),
80
+ pageSize: this.pageSize(),
81
+ },
82
+ select: selectFields,
83
+ sort: { id: 'ASC' },
84
+ });
85
+ this.roles.set(response?.data ?? []);
86
+ this.total.set(response?.meta?.total ?? 0);
87
+ }
88
+ catch {
89
+ // Error toast handled by global interceptor
90
+ }
91
+ finally {
92
+ this.isLoading.set(false);
93
+ }
94
+ }
95
+ onCreate() {
96
+ this.router.navigate(['/iam/roles/new']);
97
+ }
98
+ onEdit(role) {
99
+ this.router.navigate(['/iam/roles', role.id]);
100
+ }
101
+ onDelete(role) {
102
+ this.confirmationService.confirm({
103
+ message: this.translate('shared.confirm.delete.item', {
104
+ name: role.name,
105
+ }),
106
+ header: this.translate('iam.role.delete.title'),
107
+ icon: 'exclamation-triangle',
108
+ accept: async () => {
109
+ try {
110
+ const response = await this.roleApi.delete({
111
+ id: role.id,
112
+ type: 'delete',
113
+ });
114
+ this.roles.update((list) => list.filter((r) => r.id !== role.id));
115
+ this.total.update((t) => Math.max(0, t - 1));
116
+ this.messageService.add({
117
+ severity: 'success',
118
+ summary: this.translate('shared.success'),
119
+ detail: response?.messageKey
120
+ ? this.translate(response.messageKey, response.messageVariables)
121
+ : response?.message,
122
+ });
123
+ }
124
+ catch {
125
+ // Error toast handled by global interceptor
126
+ }
127
+ },
128
+ });
129
+ }
130
+ onLazyLoad(event) {
131
+ this.first.set(event.first ?? 0);
132
+ this.pageSize.set(event.rows ?? 10);
133
+ this.loadRoles();
134
+ }
135
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleListPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
136
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: RoleListPageComponent, isStandalone: true, selector: "lib-role-list-page", ngImport: i0, template: `
137
+ <div class="card">
138
+ <div
139
+ class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4"
140
+ >
141
+ <div>
142
+ <h3 class="text-lg sm:text-xl font-semibold">
143
+ {{ 'iam.role.title' | translate }}
144
+ </h3>
145
+ @if (showCompanyInfo()) {
146
+ <p class="text-sm text-muted-color mt-1">
147
+ {{ 'iam.company.title' | translate }}: {{ currentCompanyName() }}
148
+ </p>
149
+ }
150
+ </div>
151
+ <button
152
+ fButton
153
+ *hasPermission="ROLE_PERMISSIONS.CREATE"
154
+ (click)="onCreate()"
155
+ class="w-full sm:w-auto"
156
+ >
157
+ <ui-icon pButtonIcon name="plus"></ui-icon>
158
+ <span pButtonLabel>{{ 'iam.role.new' | translate }}</span>
159
+ </button>
160
+ </div>
161
+
162
+ <div class="overflow-x-auto -mx-4 sm:mx-0">
163
+ <f-table
164
+ [value]="roles()"
165
+ [loading]="isLoading()"
166
+ [paginator]="total() > 0"
167
+ [rows]="pageSize()"
168
+ [first]="first()"
169
+ [totalRecords]="total()"
170
+ [lazy]="true"
171
+ (onLazyLoad)="onLazyLoad($event)"
172
+ [rowsPerPageOptions]="[10, 25, 50]"
173
+ [scrollable]="true"
174
+ [tableStyle]="{ 'min-width': '40rem' }"
175
+ >
176
+ <ng-template #header>
177
+ <tr>
178
+ <th>{{ 'iam.role.name' | translate }}</th>
179
+ <th class="hidden md:table-cell">
180
+ {{ 'shared.description' | translate }}
181
+ </th>
182
+ <th>{{ 'shared.active' | translate }}</th>
183
+ <th class="hidden sm:table-cell">
184
+ {{ 'shared.read.only' | translate }}
185
+ </th>
186
+ <th class="w-[120px]">{{ 'shared.actions' | translate }}</th>
187
+ </tr>
188
+ </ng-template>
189
+ <ng-template #body let-role>
190
+ <tr>
191
+ <td>{{ role.name }}</td>
192
+ <td class="hidden md:table-cell">
193
+ {{ role.description ?? '-' }}
194
+ </td>
195
+ <td>
196
+ <f-tag
197
+ [value]="
198
+ role.isActive
199
+ ? ('shared.active' | translate)
200
+ : ('shared.inactive' | translate)
201
+ "
202
+ [severity]="role.isActive ? 'success' : 'secondary'"
203
+ />
204
+ </td>
205
+ <td class="hidden sm:table-cell">
206
+ <f-tag
207
+ [value]="
208
+ role.readOnly
209
+ ? ('shared.yes' | translate)
210
+ : ('shared.no' | translate)
211
+ "
212
+ [severity]="role.readOnly ? 'warn' : 'secondary'"
213
+ />
214
+ </td>
215
+ <td>
216
+ <div class="flex gap-1">
217
+ <button
218
+ fButton
219
+ *hasPermission="ROLE_PERMISSIONS.UPDATE"
220
+ [text]="true"
221
+ severity="secondary"
222
+ size="small"
223
+ [fTooltip]="'shared.edit' | translate"
224
+ (click)="onEdit(role)"
225
+ >
226
+ <ui-icon pButtonIcon name="pencil"></ui-icon>
227
+ </button>
228
+ <button
229
+ fButton
230
+ *hasPermission="ROLE_PERMISSIONS.DELETE"
231
+ [text]="true"
232
+ severity="danger"
233
+ size="small"
234
+ [fTooltip]="'shared.delete' | translate"
235
+ [disabled]="role.readOnly"
236
+ (click)="onDelete(role)"
237
+ >
238
+ <ui-icon pButtonIcon name="trash"></ui-icon>
239
+ </button>
240
+ </div>
241
+ </td>
242
+ </tr>
243
+ </ng-template>
244
+ <ng-template #emptymessage>
245
+ <tr>
246
+ <td colspan="5" class="text-center py-4 text-muted-color">
247
+ {{ 'iam.role.no.roles' | translate }}
248
+ </td>
249
+ </tr>
250
+ </ng-template>
251
+ </f-table>
252
+ </div>
253
+ </div>
254
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i2.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i2.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "component", type: i2.TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "scrollHeight", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "filterDelay", "responsiveLayout", "selectionMode", "sortMode", "rowExpandMode", "resizableColumns", "rowStyleClass", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "expandedRowKeys", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "expandedRowKeysChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onRowSelect", "onRowUnselect", "onSelectAllChange", "onRowExpand", "onRowCollapse", "onColResize", "onRowContextMenu"] }, { kind: "directive", type: i2.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
255
+ }
256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RoleListPageComponent, decorators: [{
257
+ type: Component,
258
+ args: [{
259
+ selector: 'lib-role-list-page',
260
+ imports: [
261
+ AngularModule,
262
+ UiModule,
263
+ HasPermissionDirective,
264
+ TranslatePipe,
265
+ ],
266
+ template: `
267
+ <div class="card">
268
+ <div
269
+ class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4"
270
+ >
271
+ <div>
272
+ <h3 class="text-lg sm:text-xl font-semibold">
273
+ {{ 'iam.role.title' | translate }}
274
+ </h3>
275
+ @if (showCompanyInfo()) {
276
+ <p class="text-sm text-muted-color mt-1">
277
+ {{ 'iam.company.title' | translate }}: {{ currentCompanyName() }}
278
+ </p>
279
+ }
280
+ </div>
281
+ <button
282
+ fButton
283
+ *hasPermission="ROLE_PERMISSIONS.CREATE"
284
+ (click)="onCreate()"
285
+ class="w-full sm:w-auto"
286
+ >
287
+ <ui-icon pButtonIcon name="plus"></ui-icon>
288
+ <span pButtonLabel>{{ 'iam.role.new' | translate }}</span>
289
+ </button>
290
+ </div>
291
+
292
+ <div class="overflow-x-auto -mx-4 sm:mx-0">
293
+ <f-table
294
+ [value]="roles()"
295
+ [loading]="isLoading()"
296
+ [paginator]="total() > 0"
297
+ [rows]="pageSize()"
298
+ [first]="first()"
299
+ [totalRecords]="total()"
300
+ [lazy]="true"
301
+ (onLazyLoad)="onLazyLoad($event)"
302
+ [rowsPerPageOptions]="[10, 25, 50]"
303
+ [scrollable]="true"
304
+ [tableStyle]="{ 'min-width': '40rem' }"
305
+ >
306
+ <ng-template #header>
307
+ <tr>
308
+ <th>{{ 'iam.role.name' | translate }}</th>
309
+ <th class="hidden md:table-cell">
310
+ {{ 'shared.description' | translate }}
311
+ </th>
312
+ <th>{{ 'shared.active' | translate }}</th>
313
+ <th class="hidden sm:table-cell">
314
+ {{ 'shared.read.only' | translate }}
315
+ </th>
316
+ <th class="w-[120px]">{{ 'shared.actions' | translate }}</th>
317
+ </tr>
318
+ </ng-template>
319
+ <ng-template #body let-role>
320
+ <tr>
321
+ <td>{{ role.name }}</td>
322
+ <td class="hidden md:table-cell">
323
+ {{ role.description ?? '-' }}
324
+ </td>
325
+ <td>
326
+ <f-tag
327
+ [value]="
328
+ role.isActive
329
+ ? ('shared.active' | translate)
330
+ : ('shared.inactive' | translate)
331
+ "
332
+ [severity]="role.isActive ? 'success' : 'secondary'"
333
+ />
334
+ </td>
335
+ <td class="hidden sm:table-cell">
336
+ <f-tag
337
+ [value]="
338
+ role.readOnly
339
+ ? ('shared.yes' | translate)
340
+ : ('shared.no' | translate)
341
+ "
342
+ [severity]="role.readOnly ? 'warn' : 'secondary'"
343
+ />
344
+ </td>
345
+ <td>
346
+ <div class="flex gap-1">
347
+ <button
348
+ fButton
349
+ *hasPermission="ROLE_PERMISSIONS.UPDATE"
350
+ [text]="true"
351
+ severity="secondary"
352
+ size="small"
353
+ [fTooltip]="'shared.edit' | translate"
354
+ (click)="onEdit(role)"
355
+ >
356
+ <ui-icon pButtonIcon name="pencil"></ui-icon>
357
+ </button>
358
+ <button
359
+ fButton
360
+ *hasPermission="ROLE_PERMISSIONS.DELETE"
361
+ [text]="true"
362
+ severity="danger"
363
+ size="small"
364
+ [fTooltip]="'shared.delete' | translate"
365
+ [disabled]="role.readOnly"
366
+ (click)="onDelete(role)"
367
+ >
368
+ <ui-icon pButtonIcon name="trash"></ui-icon>
369
+ </button>
370
+ </div>
371
+ </td>
372
+ </tr>
373
+ </ng-template>
374
+ <ng-template #emptymessage>
375
+ <tr>
376
+ <td colspan="5" class="text-center py-4 text-muted-color">
377
+ {{ 'iam.role.no.roles' | translate }}
378
+ </td>
379
+ </tr>
380
+ </ng-template>
381
+ </f-table>
382
+ </div>
383
+ </div>
384
+ `,
385
+ }]
386
+ }], ctorParameters: () => [] });
387
+
388
+ export { RoleListPageComponent };
389
+ //# sourceMappingURL=flusys-ng-iam-role-list-page.component-8NGXCeSZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-iam-role-list-page.component-8NGXCeSZ.mjs","sources":["../../../projects/ng-iam/pages/role/role-list-page.component.ts"],"sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n isCompanyFeatureEnabled,\n} from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { ConfirmationService, MessageService } from '@flusys/ng-ui';\nimport {\n AngularModule,\n HasPermissionDirective,\n ROLE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IRole } from '../../interfaces/role.interface';\nimport { RoleApiService } from '../../services/role-api.service';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-role-list-page',\n imports: [\n AngularModule,\n UiModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'iam.role.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'iam.company.title' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'iam.role.new' | translate }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"roles()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"pageSize()\"\n [first]=\"first()\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'iam.role.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n <th>{{ 'shared.active' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'shared.read.only' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-role>\n <tr>\n <td>{{ role.name }}</td>\n <td class=\"hidden md:table-cell\">\n {{ role.description ?? '-' }}\n </td>\n <td>\n <f-tag\n [value]=\"\n role.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"role.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td class=\"hidden sm:table-cell\">\n <f-tag\n [value]=\"\n role.readOnly\n ? ('shared.yes' | translate)\n : ('shared.no' | translate)\n \"\n [severity]=\"role.readOnly ? 'warn' : 'secondary'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(role)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"role.readOnly\"\n (click)=\"onDelete(role)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'iam.role.no.roles' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class RoleListPageComponent {\n readonly ROLE_PERMISSIONS = ROLE_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly roleApi = inject(RoleApiService);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\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 roles = signal<IRole[]>([]);\n readonly isLoading = signal(false);\n readonly total = signal(0);\n readonly pageSize = signal(10);\n readonly first = signal(0);\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n private previousCompanyId: string | undefined | null = undefined;\n\n constructor() {\n effect(() => {\n const currentCompanyId =\n this.companyContext.currentCompanyInfo()?.id ?? null;\n if (this.previousCompanyId === undefined) {\n this.previousCompanyId = currentCompanyId;\n return;\n }\n if (this.previousCompanyId === currentCompanyId) return;\n this.previousCompanyId = currentCompanyId;\n untracked(() => {\n this.first.set(0);\n this.loadRoles();\n });\n });\n }\n\n private async loadRoles(): Promise<void> {\n this.isLoading.set(true);\n try {\n const enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n const companyId = enableCompanyFeature\n ? this.companyContext.currentCompanyInfo()?.id || undefined\n : undefined;\n\n const selectFields = [\n 'id',\n 'name',\n 'description',\n 'isActive',\n 'readOnly',\n 'serial',\n 'createdAt',\n 'deletedAt',\n ];\n if (enableCompanyFeature) {\n selectFields.push('companyId');\n }\n\n const response = await this.roleApi.getAll({\n filter: companyId ? { companyId } : undefined,\n pagination: {\n currentPage: Math.floor(this.first() / this.pageSize()),\n pageSize: this.pageSize(),\n },\n select: selectFields,\n sort: { id: 'ASC' },\n });\n\n this.roles.set(response?.data ?? []);\n this.total.set(response?.meta?.total ?? 0);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCreate(): void {\n this.router.navigate(['/iam/roles/new']);\n }\n\n onEdit(role: IRole): void {\n this.router.navigate(['/iam/roles', role.id]);\n }\n\n onDelete(role: IRole): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', {\n name: role.name,\n }),\n header: this.translate('iam.role.delete.title'),\n icon: 'exclamation-triangle',\n accept: async () => {\n try {\n const response = await this.roleApi.delete({\n id: role.id,\n type: 'delete',\n });\n\n this.roles.update((list) => list.filter((r) => r.id !== role.id));\n this.total.update((t) => Math.max(0, t - 1));\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 } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n this.first.set(event.first ?? 0);\n this.pageSize.set(event.rows ?? 10);\n this.loadRoles();\n }\n}\n"],"names":["i1"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { A as ActionApiService, e as ActionPermissionLogicService, a as ActionType, C as CompanyActionSelectorComponent, I as IAM_ROUTES, L as LogicBuilderComponent, M as MAX_DROPDOWN_ITEMS, f as MyPermissionsApiService, P as PermissionApiService, g as PermissionStateService, h as ProfilePermissionProviderAdapter, b as RoleActionSelectorComponent, R as RoleApiService, d as UserActionSelectorComponent, U as UserRoleSelectorComponent, p as provideIamProviders } from './flusys-ng-iam-flusys-ng-iam-DISrddPh.mjs';
1
+ export { A as ActionApiService, e as ActionPermissionLogicService, a as ActionType, C as CompanyActionSelectorComponent, I as IAM_MESSAGES, f as IAM_ROUTES, L as LogicBuilderComponent, M as MAX_DROPDOWN_ITEMS, g as MyPermissionsApiService, P as PermissionApiService, h as PermissionStateService, i as ProfilePermissionProviderAdapter, b as RoleActionSelectorComponent, R as RoleApiService, d as UserActionSelectorComponent, U as UserRoleSelectorComponent, p as provideIamProviders } from './flusys-ng-iam-flusys-ng-iam-CrycDULz.mjs';
2
2
  //# sourceMappingURL=flusys-ng-iam.mjs.map
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@flusys/ng-iam",
3
- "version": "1.1.1-beta",
3
+ "version": "1.2.0-rc.1",
4
4
  "description": "Identity and Access Management (IAM) for Angular - Independent from ng-auth through Provider Interface Pattern",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
- "@angular/common": "^21.0.0",
8
- "@angular/core": "^21.0.0",
9
- "@angular/forms": "^21.0.0",
10
- "@flusys/ng-core": "^1.1.1-beta",
11
- "@flusys/ng-layout": "^1.1.1-beta",
12
- "@flusys/ng-shared": "^1.1.1-beta",
13
- "@primeuix/themes": "^1.0.0",
14
- "primeicons": "^7.0.0",
15
- "primeng": "^21.0.0"
7
+ "@angular/common": ">=22.0.0",
8
+ "@angular/core": ">=22.0.0",
9
+ "@angular/forms": ">=22.0.0",
10
+ "@angular/router": ">=22.0.0",
11
+ "@flusys/ng-core": ">=1.2.0-rc.1",
12
+ "@flusys/ng-layout": ">=1.2.0-rc.1",
13
+ "@flusys/ng-shared": ">=1.2.0-rc.1",
14
+ "@flusys/ng-ui": ">=1.2.0-rc.1",
15
+ "rxjs": "^7.8.0"
16
16
  },
17
17
  "sideEffects": false,
18
18
  "module": "fesm2022/flusys-ng-iam.mjs",
@@ -26,6 +26,7 @@
26
26
  "default": "./fesm2022/flusys-ng-iam.mjs"
27
27
  }
28
28
  },
29
+ "type": "module",
29
30
  "dependencies": {
30
31
  "tslib": "^2.3.0"
31
32
  }