@flusys/ng-localization 9.1.0-rc.1 → 9.1.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.
@@ -0,0 +1,660 @@
1
+ import { LanguageApiService } from "./flusys-ng-localization.mjs";
2
+ import * as i0 from "@angular/core";
3
+ import { Component, DestroyRef, inject } from "@angular/core";
4
+ import { HasPermissionDirective, LANGUAGE_PERMISSIONS, TranslatePipe, TranslateService } from "@flusys/ng-shared";
5
+ import { from } from "rxjs";
6
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
7
+ import { ConfirmationService, FButtonDirective, IconFieldComponent, InputIconComponent, InputTextDirective, MessageService, TableComponent, TagComponent, TooltipDirective, UiIconComponent } from "@flusys/ng-ui";
8
+ import * as i1 from "@angular/forms";
9
+ import { FormsModule } from "@angular/forms";
10
+ import { Router } from "@angular/router";
11
+ var LanguageListPage = class LanguageListPage {
12
+ LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;
13
+ router = inject(Router);
14
+ languageService = inject(LanguageApiService);
15
+ confirmationService = inject(ConfirmationService);
16
+ messageService = inject(MessageService);
17
+ translateService = inject(TranslateService);
18
+ destroyRef = inject(DestroyRef);
19
+ ngOnInit() {
20
+ this.languageService.fetchList("", {
21
+ pagination: {
22
+ currentPage: 0,
23
+ pageSize: 100
24
+ },
25
+ filter: {},
26
+ sort: {
27
+ serial: "ASC",
28
+ name: "ASC"
29
+ }
30
+ });
31
+ }
32
+ onCreate() {
33
+ this.router.navigate(["/localization/languages/new"]);
34
+ }
35
+ onSearchChange(term) {
36
+ this.languageService.fetchList(term, {
37
+ pagination: {
38
+ currentPage: 0,
39
+ pageSize: 100
40
+ },
41
+ filter: {},
42
+ sort: {
43
+ serial: "ASC",
44
+ name: "ASC"
45
+ }
46
+ });
47
+ }
48
+ onEdit(id) {
49
+ this.router.navigate(["/localization/languages", id]);
50
+ }
51
+ onSetDefault(lang) {
52
+ this.confirmationService.confirm({
53
+ message: this.translateService.translate("localization.language.confirm.set.default", { name: lang.name }),
54
+ header: this.translateService.translate("localization.language.set.default"),
55
+ icon: "star",
56
+ accept: () => {
57
+ this.languageService.setDefault(lang.id).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ next: (response) => {
58
+ if (response.success) {
59
+ this.messageService.add({
60
+ severity: "success",
61
+ summary: this.translateService.translate("shared.success"),
62
+ detail: response.messageKey ? this.translateService.translate(response.messageKey, response.messageVariables) : response.message ?? ""
63
+ });
64
+ this.languageService.reload();
65
+ }
66
+ } });
67
+ }
68
+ });
69
+ }
70
+ onDelete(lang) {
71
+ this.confirmationService.confirm({
72
+ message: this.translateService.translate("shared.confirm.delete"),
73
+ header: this.translateService.translate("localization.language.delete.title"),
74
+ icon: "exclamation-triangle",
75
+ acceptButtonStyleClass: "p-button-danger",
76
+ accept: () => {
77
+ from(this.languageService.delete({
78
+ id: lang.id,
79
+ type: "delete"
80
+ })).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ next: (response) => {
81
+ if (response.success) {
82
+ this.messageService.add({
83
+ severity: "success",
84
+ summary: this.translateService.translate("shared.success"),
85
+ detail: response.messageKey ? this.translateService.translate(response.messageKey, response.messageVariables) : response.message ?? ""
86
+ });
87
+ this.languageService.reload();
88
+ }
89
+ } });
90
+ }
91
+ });
92
+ }
93
+ static ɵfac = i0.ɵɵngDeclareFactory({
94
+ minVersion: "12.0.0",
95
+ version: "22.2.1",
96
+ ngImport: i0,
97
+ type: LanguageListPage,
98
+ deps: [],
99
+ target: i0.ɵɵFactoryTarget.Component
100
+ });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({
102
+ minVersion: "17.0.0",
103
+ version: "22.2.1",
104
+ type: LanguageListPage,
105
+ isStandalone: true,
106
+ selector: "lib-language-list-page",
107
+ ngImport: i0,
108
+ template: `
109
+ <div class="card">
110
+ <div
111
+ class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4"
112
+ >
113
+ <div>
114
+ <h3 class="text-lg sm:text-xl font-semibold m-0">
115
+ {{ 'localization.language.title' | translate }}
116
+ </h3>
117
+ <p class="text-sm text-muted-color mt-1">
118
+ {{ 'localization.language.subtitle' | translate }}
119
+ </p>
120
+ </div>
121
+ <div
122
+ class="flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto"
123
+ >
124
+ <f-iconfield class="w-full sm:w-64">
125
+ <f-inputicon icon="search" />
126
+ <input
127
+ fInputText
128
+ type="text"
129
+ [ngModel]="languageService.searchTerm()"
130
+ (ngModelChange)="onSearchChange($event)"
131
+ [ngModelOptions]="{ standalone: true }"
132
+ [placeholder]="'shared.search' | translate"
133
+ class="w-full"
134
+ />
135
+ </f-iconfield>
136
+ <button
137
+ fButton
138
+ *hasPermission="LANGUAGE_PERMISSIONS.CREATE"
139
+ (click)="onCreate()"
140
+ class="w-full sm:w-auto"
141
+ >
142
+ <ui-icon pButtonIcon name="plus"></ui-icon>
143
+ <span pButtonLabel>{{
144
+ 'localization.language.new' | translate
145
+ }}</span>
146
+ </button>
147
+ </div>
148
+ </div>
149
+
150
+ <div class="overflow-x-auto -mx-4 sm:mx-0">
151
+ <f-table
152
+ [value]="languageService.data()"
153
+ [loading]="languageService.isLoading()"
154
+ [tableStyle]="{ 'min-width': '40rem' }"
155
+ >
156
+ <ng-template #header>
157
+ <tr>
158
+ <th>{{ 'localization.language.code' | translate }}</th>
159
+ <th>{{ 'localization.language.name' | translate }}</th>
160
+ <th>{{ 'localization.language.native.name' | translate }}</th>
161
+ <th>{{ 'localization.language.direction' | translate }}</th>
162
+ <th>{{ 'shared.status' | translate }}</th>
163
+ <th class="w-[150px]">{{ 'shared.actions' | translate }}</th>
164
+ </tr>
165
+ </ng-template>
166
+
167
+ <ng-template #body let-lang>
168
+ <tr>
169
+ <td>
170
+ <span class="uppercase font-semibold">{{ lang.code }}</span>
171
+ </td>
172
+ <td>{{ lang.name }}</td>
173
+ <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>
174
+ <td>
175
+ <f-tag
176
+ [value]="
177
+ lang.direction === 'rtl'
178
+ ? ('localization.language.rtl' | translate)
179
+ : ('localization.language.ltr' | translate)
180
+ "
181
+ [severity]="lang.direction === 'rtl' ? 'warn' : 'info'"
182
+ />
183
+ </td>
184
+ <td>
185
+ <div class="flex gap-1 items-center">
186
+ <f-tag
187
+ [value]="
188
+ lang.isActive
189
+ ? ('shared.active' | translate)
190
+ : ('shared.inactive' | translate)
191
+ "
192
+ [severity]="lang.isActive ? 'success' : 'secondary'"
193
+ />
194
+ @if (lang.isDefault) {
195
+ <f-tag
196
+ [value]="'localization.language.default' | translate"
197
+ severity="contrast"
198
+ />
199
+ }
200
+ @if (lang.isReadonly) {
201
+ <f-tag
202
+ [value]="'shared.read.only' | translate"
203
+ severity="warn"
204
+ />
205
+ }
206
+ </div>
207
+ </td>
208
+ <td>
209
+ <div class="flex gap-1">
210
+ @if (!lang.isDefault) {
211
+ <button
212
+ fButton
213
+ *hasPermission="LANGUAGE_PERMISSIONS.UPDATE"
214
+ [text]="true"
215
+ size="small"
216
+ [fTooltip]="
217
+ 'localization.language.set.default' | translate
218
+ "
219
+ (click)="onSetDefault(lang)"
220
+ >
221
+ <ui-icon pButtonIcon name="star"></ui-icon>
222
+ </button>
223
+ }
224
+ <button
225
+ fButton
226
+ *hasPermission="LANGUAGE_PERMISSIONS.UPDATE"
227
+ [text]="true"
228
+ severity="secondary"
229
+ size="small"
230
+ [fTooltip]="'shared.edit' | translate"
231
+ (click)="onEdit(lang.id)"
232
+ >
233
+ <ui-icon pButtonIcon name="pencil"></ui-icon>
234
+ </button>
235
+ <button
236
+ fButton
237
+ *hasPermission="LANGUAGE_PERMISSIONS.DELETE"
238
+ [text]="true"
239
+ severity="danger"
240
+ size="small"
241
+ [fTooltip]="
242
+ (lang.isDefault
243
+ ? 'localization.language.default.delete.forbidden'
244
+ : lang.isReadonly
245
+ ? 'localization.language.readonly.delete.forbidden'
246
+ : 'shared.delete'
247
+ ) | translate
248
+ "
249
+ [disabled]="lang.isDefault || lang.isReadonly"
250
+ (click)="onDelete(lang)"
251
+ >
252
+ <ui-icon pButtonIcon name="trash"></ui-icon>
253
+ </button>
254
+ </div>
255
+ </td>
256
+ </tr>
257
+ </ng-template>
258
+
259
+ <ng-template #emptymessage>
260
+ <tr>
261
+ <td colspan="6" class="text-center py-4 text-muted-color">
262
+ {{ 'localization.language.empty' | translate }}
263
+ </td>
264
+ </tr>
265
+ </ng-template>
266
+ </f-table>
267
+ </div>
268
+ </div>
269
+ `,
270
+ isInline: true,
271
+ dependencies: [
272
+ {
273
+ kind: "directive",
274
+ type: FButtonDirective,
275
+ selector: "[fButton]",
276
+ inputs: [
277
+ "severity",
278
+ "text",
279
+ "outlined",
280
+ "link",
281
+ "variant",
282
+ "rounded",
283
+ "raised",
284
+ "fluid",
285
+ "disabled",
286
+ "loading",
287
+ "loadingIcon",
288
+ "size",
289
+ "label",
290
+ "icon",
291
+ "iconPos",
292
+ "ariaLabel",
293
+ "plain"
294
+ ]
295
+ },
296
+ {
297
+ kind: "component",
298
+ type: UiIconComponent,
299
+ selector: "ui-icon",
300
+ inputs: [
301
+ "name",
302
+ "size",
303
+ "spin",
304
+ "fill",
305
+ "severity"
306
+ ]
307
+ },
308
+ {
309
+ kind: "component",
310
+ type: TableComponent,
311
+ selector: "f-table",
312
+ inputs: [
313
+ "value",
314
+ "lazy",
315
+ "loading",
316
+ "rows",
317
+ "totalRecords",
318
+ "rowHover",
319
+ "dataKey",
320
+ "scrollable",
321
+ "scrollHeight",
322
+ "paginator",
323
+ "first",
324
+ "rowsPerPageOptions",
325
+ "showCurrentPageReport",
326
+ "currentPageReportTemplate",
327
+ "tableStyle",
328
+ "styleClass",
329
+ "globalFilterFields",
330
+ "filterDelay",
331
+ "responsiveLayout",
332
+ "selectionMode",
333
+ "sortMode",
334
+ "rowExpandMode",
335
+ "resizableColumns",
336
+ "rowStyleClass",
337
+ "virtualScroll",
338
+ "virtualScrollItemSize",
339
+ "sortField",
340
+ "sortOrder",
341
+ "multiSortMeta",
342
+ "filters",
343
+ "selection",
344
+ "expandedRowKeys",
345
+ "contextMenuSelection"
346
+ ],
347
+ outputs: [
348
+ "sortFieldChange",
349
+ "sortOrderChange",
350
+ "multiSortMetaChange",
351
+ "filtersChange",
352
+ "selectionChange",
353
+ "expandedRowKeysChange",
354
+ "contextMenuSelectionChange",
355
+ "onLazyLoad",
356
+ "onSort",
357
+ "onFilter",
358
+ "onRowSelect",
359
+ "onRowUnselect",
360
+ "onSelectAllChange",
361
+ "onRowExpand",
362
+ "onRowCollapse",
363
+ "onColResize",
364
+ "onRowContextMenu"
365
+ ]
366
+ },
367
+ {
368
+ kind: "component",
369
+ type: TagComponent,
370
+ selector: "f-tag",
371
+ inputs: [
372
+ "value",
373
+ "severity",
374
+ "icon",
375
+ "rounded",
376
+ "color",
377
+ "styleClass",
378
+ "style"
379
+ ]
380
+ },
381
+ {
382
+ kind: "directive",
383
+ type: TooltipDirective,
384
+ selector: "[fTooltip]",
385
+ inputs: [
386
+ "fTooltip",
387
+ "tooltipPosition",
388
+ "positionStyle",
389
+ "tooltipStyleClass",
390
+ "disabled",
391
+ "tooltipEvent",
392
+ "showDelay",
393
+ "hideDelay",
394
+ "life",
395
+ "autoHide",
396
+ "positionTop",
397
+ "positionLeft",
398
+ "escape"
399
+ ]
400
+ },
401
+ {
402
+ kind: "directive",
403
+ type: HasPermissionDirective,
404
+ selector: "[hasPermission]",
405
+ inputs: ["hasPermission"]
406
+ },
407
+ {
408
+ kind: "ngmodule",
409
+ type: FormsModule
410
+ },
411
+ {
412
+ kind: "directive",
413
+ type: i1.DefaultValueAccessor,
414
+ selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
415
+ },
416
+ {
417
+ kind: "directive",
418
+ type: i1.NgControlStatus,
419
+ selector: "[formControlName],[ngModel],[formControl]"
420
+ },
421
+ {
422
+ kind: "directive",
423
+ type: i1.NgModel,
424
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
425
+ inputs: [
426
+ "name",
427
+ "disabled",
428
+ "ngModel",
429
+ "ngModelOptions"
430
+ ],
431
+ outputs: ["ngModelChange"],
432
+ exportAs: ["ngModel"]
433
+ },
434
+ {
435
+ kind: "component",
436
+ type: IconFieldComponent,
437
+ selector: "f-iconfield",
438
+ inputs: ["iconPosition", "styleClass"]
439
+ },
440
+ {
441
+ kind: "component",
442
+ type: InputIconComponent,
443
+ selector: "f-inputicon",
444
+ inputs: [
445
+ "icon",
446
+ "position",
447
+ "styleClass",
448
+ "style"
449
+ ]
450
+ },
451
+ {
452
+ kind: "directive",
453
+ type: InputTextDirective,
454
+ selector: "[fInputText]",
455
+ inputs: [
456
+ "invalid",
457
+ "touched",
458
+ "variant",
459
+ "size",
460
+ "fluid"
461
+ ]
462
+ },
463
+ {
464
+ kind: "pipe",
465
+ type: TranslatePipe,
466
+ name: "translate"
467
+ }
468
+ ]
469
+ });
470
+ };
471
+ i0.ɵɵngDeclareClassMetadata({
472
+ minVersion: "12.0.0",
473
+ version: "22.2.1",
474
+ ngImport: i0,
475
+ type: LanguageListPage,
476
+ decorators: [{
477
+ type: Component,
478
+ args: [{
479
+ selector: "lib-language-list-page",
480
+ imports: [
481
+ FButtonDirective,
482
+ UiIconComponent,
483
+ TableComponent,
484
+ TagComponent,
485
+ TooltipDirective,
486
+ HasPermissionDirective,
487
+ TranslatePipe,
488
+ FormsModule,
489
+ IconFieldComponent,
490
+ InputIconComponent,
491
+ InputTextDirective
492
+ ],
493
+ template: `
494
+ <div class="card">
495
+ <div
496
+ class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4"
497
+ >
498
+ <div>
499
+ <h3 class="text-lg sm:text-xl font-semibold m-0">
500
+ {{ 'localization.language.title' | translate }}
501
+ </h3>
502
+ <p class="text-sm text-muted-color mt-1">
503
+ {{ 'localization.language.subtitle' | translate }}
504
+ </p>
505
+ </div>
506
+ <div
507
+ class="flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto"
508
+ >
509
+ <f-iconfield class="w-full sm:w-64">
510
+ <f-inputicon icon="search" />
511
+ <input
512
+ fInputText
513
+ type="text"
514
+ [ngModel]="languageService.searchTerm()"
515
+ (ngModelChange)="onSearchChange($event)"
516
+ [ngModelOptions]="{ standalone: true }"
517
+ [placeholder]="'shared.search' | translate"
518
+ class="w-full"
519
+ />
520
+ </f-iconfield>
521
+ <button
522
+ fButton
523
+ *hasPermission="LANGUAGE_PERMISSIONS.CREATE"
524
+ (click)="onCreate()"
525
+ class="w-full sm:w-auto"
526
+ >
527
+ <ui-icon pButtonIcon name="plus"></ui-icon>
528
+ <span pButtonLabel>{{
529
+ 'localization.language.new' | translate
530
+ }}</span>
531
+ </button>
532
+ </div>
533
+ </div>
534
+
535
+ <div class="overflow-x-auto -mx-4 sm:mx-0">
536
+ <f-table
537
+ [value]="languageService.data()"
538
+ [loading]="languageService.isLoading()"
539
+ [tableStyle]="{ 'min-width': '40rem' }"
540
+ >
541
+ <ng-template #header>
542
+ <tr>
543
+ <th>{{ 'localization.language.code' | translate }}</th>
544
+ <th>{{ 'localization.language.name' | translate }}</th>
545
+ <th>{{ 'localization.language.native.name' | translate }}</th>
546
+ <th>{{ 'localization.language.direction' | translate }}</th>
547
+ <th>{{ 'shared.status' | translate }}</th>
548
+ <th class="w-[150px]">{{ 'shared.actions' | translate }}</th>
549
+ </tr>
550
+ </ng-template>
551
+
552
+ <ng-template #body let-lang>
553
+ <tr>
554
+ <td>
555
+ <span class="uppercase font-semibold">{{ lang.code }}</span>
556
+ </td>
557
+ <td>{{ lang.name }}</td>
558
+ <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>
559
+ <td>
560
+ <f-tag
561
+ [value]="
562
+ lang.direction === 'rtl'
563
+ ? ('localization.language.rtl' | translate)
564
+ : ('localization.language.ltr' | translate)
565
+ "
566
+ [severity]="lang.direction === 'rtl' ? 'warn' : 'info'"
567
+ />
568
+ </td>
569
+ <td>
570
+ <div class="flex gap-1 items-center">
571
+ <f-tag
572
+ [value]="
573
+ lang.isActive
574
+ ? ('shared.active' | translate)
575
+ : ('shared.inactive' | translate)
576
+ "
577
+ [severity]="lang.isActive ? 'success' : 'secondary'"
578
+ />
579
+ @if (lang.isDefault) {
580
+ <f-tag
581
+ [value]="'localization.language.default' | translate"
582
+ severity="contrast"
583
+ />
584
+ }
585
+ @if (lang.isReadonly) {
586
+ <f-tag
587
+ [value]="'shared.read.only' | translate"
588
+ severity="warn"
589
+ />
590
+ }
591
+ </div>
592
+ </td>
593
+ <td>
594
+ <div class="flex gap-1">
595
+ @if (!lang.isDefault) {
596
+ <button
597
+ fButton
598
+ *hasPermission="LANGUAGE_PERMISSIONS.UPDATE"
599
+ [text]="true"
600
+ size="small"
601
+ [fTooltip]="
602
+ 'localization.language.set.default' | translate
603
+ "
604
+ (click)="onSetDefault(lang)"
605
+ >
606
+ <ui-icon pButtonIcon name="star"></ui-icon>
607
+ </button>
608
+ }
609
+ <button
610
+ fButton
611
+ *hasPermission="LANGUAGE_PERMISSIONS.UPDATE"
612
+ [text]="true"
613
+ severity="secondary"
614
+ size="small"
615
+ [fTooltip]="'shared.edit' | translate"
616
+ (click)="onEdit(lang.id)"
617
+ >
618
+ <ui-icon pButtonIcon name="pencil"></ui-icon>
619
+ </button>
620
+ <button
621
+ fButton
622
+ *hasPermission="LANGUAGE_PERMISSIONS.DELETE"
623
+ [text]="true"
624
+ severity="danger"
625
+ size="small"
626
+ [fTooltip]="
627
+ (lang.isDefault
628
+ ? 'localization.language.default.delete.forbidden'
629
+ : lang.isReadonly
630
+ ? 'localization.language.readonly.delete.forbidden'
631
+ : 'shared.delete'
632
+ ) | translate
633
+ "
634
+ [disabled]="lang.isDefault || lang.isReadonly"
635
+ (click)="onDelete(lang)"
636
+ >
637
+ <ui-icon pButtonIcon name="trash"></ui-icon>
638
+ </button>
639
+ </div>
640
+ </td>
641
+ </tr>
642
+ </ng-template>
643
+
644
+ <ng-template #emptymessage>
645
+ <tr>
646
+ <td colspan="6" class="text-center py-4 text-muted-color">
647
+ {{ 'localization.language.empty' | translate }}
648
+ </td>
649
+ </tr>
650
+ </ng-template>
651
+ </f-table>
652
+ </div>
653
+ </div>
654
+ `
655
+ }]
656
+ }]
657
+ });
658
+ export { LanguageListPage };
659
+
660
+ //# sourceMappingURL=flusys-ng-localization-language-list.page-B8wnYNNd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-localization-language-list.page-B8wnYNNd.mjs","names":[],"sources":["../../../projects/ng-localization/pages/language-list/language-list.page.ts"],"sourcesContent":["import { Component, DestroyRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n HasPermissionDirective,\n LANGUAGE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { from } from 'rxjs';\nimport { ILanguage } from '../../interfaces/language.interface';\nimport { LanguageApiService } from '../../services/language-api.service';\n\n@Component({\n selector: 'lib-language-list-page',\n imports: [\n FButtonDirective,\n UiIconComponent,\n TableComponent,\n TagComponent,\n TooltipDirective,\n HasPermissionDirective,\n TranslatePipe,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\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 m-0\">\n {{ 'localization.language.title' | translate }}\n </h3>\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'localization.language.subtitle' | translate }}\n </p>\n </div>\n <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"languageService.searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'localization.language.new' | translate\n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"languageService.data()\"\n [loading]=\"languageService.isLoading()\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'localization.language.code' | translate }}</th>\n <th>{{ 'localization.language.name' | translate }}</th>\n <th>{{ 'localization.language.native.name' | translate }}</th>\n <th>{{ 'localization.language.direction' | translate }}</th>\n <th>{{ 'shared.status' | translate }}</th>\n <th class=\"w-[150px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n\n <ng-template #body let-lang>\n <tr>\n <td>\n <span class=\"uppercase font-semibold\">{{ lang.code }}</span>\n </td>\n <td>{{ lang.name }}</td>\n <td>{{ lang.nativeName || ('shared.na' | translate) }}</td>\n <td>\n <f-tag\n [value]=\"\n lang.direction === 'rtl'\n ? ('localization.language.rtl' | translate)\n : ('localization.language.ltr' | translate)\n \"\n [severity]=\"lang.direction === 'rtl' ? 'warn' : 'info'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1 items-center\">\n <f-tag\n [value]=\"\n lang.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"lang.isActive ? 'success' : 'secondary'\"\n />\n @if (lang.isDefault) {\n <f-tag\n [value]=\"'localization.language.default' | translate\"\n severity=\"contrast\"\n />\n }\n @if (lang.isReadonly) {\n <f-tag\n [value]=\"'shared.read.only' | translate\"\n severity=\"warn\"\n />\n }\n </div>\n </td>\n <td>\n <div class=\"flex gap-1\">\n @if (!lang.isDefault) {\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n size=\"small\"\n [fTooltip]=\"\n 'localization.language.set.default' | translate\n \"\n (click)=\"onSetDefault(lang)\"\n >\n <ui-icon pButtonIcon name=\"star\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(lang.id)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"LANGUAGE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"\n (lang.isDefault\n ? 'localization.language.default.delete.forbidden'\n : lang.isReadonly\n ? 'localization.language.readonly.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n [disabled]=\"lang.isDefault || lang.isReadonly\"\n (click)=\"onDelete(lang)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center py-4 text-muted-color\">\n {{ 'localization.language.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class LanguageListPage implements OnInit {\n readonly LANGUAGE_PERMISSIONS = LANGUAGE_PERMISSIONS;\n\n private readonly router = inject(Router);\n readonly languageService = inject(LanguageApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateService = inject(TranslateService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.languageService.fetchList('', {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onCreate(): void {\n this.router.navigate(['/localization/languages/new']);\n }\n\n onSearchChange(term: string): void {\n this.languageService.fetchList(term, {\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n sort: { serial: 'ASC', name: 'ASC' },\n });\n }\n\n onEdit(id: string): void {\n this.router.navigate(['/localization/languages', id]);\n }\n\n onSetDefault(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'localization.language.confirm.set.default',\n { name: lang.name },\n ),\n header: this.translateService.translate(\n 'localization.language.set.default',\n ),\n icon: 'star',\n accept: () => {\n this.languageService\n .setDefault(lang.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n\n onDelete(lang: ILanguage): void {\n this.confirmationService.confirm({\n message: this.translateService.translate('shared.confirm.delete'),\n header: this.translateService.translate(\n 'localization.language.delete.title',\n ),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(this.languageService.delete({ id: lang.id, type: 'delete' }))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success) {\n this.messageService.add({\n severity: 'success',\n summary: this.translateService.translate('shared.success'),\n detail: response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (response.message ?? ''),\n });\n this.languageService.reload();\n }\n },\n });\n },\n });\n }\n}\n"],"mappings":"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"}