@fxlt/common-ui 0.0.1 → 0.0.3-rc1
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/README.md +2 -62
- package/components.css +18 -3
- package/dialogs.css +45 -91
- package/fesm2022/fxlt-common-ui.mjs +378 -94
- package/fesm2022/fxlt-common-ui.mjs.map +1 -1
- package/index.d.ts +105 -34
- package/package.json +4 -2
- package/src/lib/styles/components.css +18 -3
- package/src/lib/styles/dialogs.css +45 -91
- package/src/lib/ui/components/button/button.component.html +1 -1
- package/src/lib/ui/components/checkbox/checkbox.component.html +6 -7
- package/src/lib/ui/components/input/input.component.html +2 -0
- package/src/lib/ui/components/rich-text-area/rich-text-area.component.html +3 -0
- package/src/lib/ui/components/select/select.component.css +22 -0
- package/src/lib/ui/components/select/select.component.html +14 -1
- package/src/lib/ui/components/skeleton-table-loading/skeleton-table-loading.component.html +21 -0
- package/src/lib/ui/components/switch/switch.component.html +1 -1
- package/src/lib/ui/components/toast/toast.component.html +1 -1
- package/src/lib/ui/dialogs/confirmation/confirmation.component.html +4 -4
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Directive, Input, Component, createComponent, Injectable, ViewChild, Inject, EventEmitter, NgModule,
|
|
3
|
-
import * as
|
|
2
|
+
import { Directive, Input, Component, createComponent, Injectable, ViewChild, Inject, EventEmitter, NgModule, HostListener, PLATFORM_ID, Output, Optional, Self, ChangeDetectionStrategy, TemplateRef, ContentChildren, importProvidersFrom } from '@angular/core';
|
|
3
|
+
import * as i28 from '@angular/material/paginator';
|
|
4
4
|
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
|
|
5
|
-
import * as
|
|
5
|
+
import * as i29 from '@angular/material/table';
|
|
6
6
|
import { MatTableDataSource, MatTable, MatTableModule } from '@angular/material/table';
|
|
7
7
|
import * as i2 from '@angular/common';
|
|
8
|
-
import { CommonModule } from '@angular/common';
|
|
8
|
+
import { isPlatformBrowser, CommonModule } from '@angular/common';
|
|
9
9
|
import * as i1 from '@dimaslz/ng-heroicons';
|
|
10
10
|
import { NgHeroiconsModule } from '@dimaslz/ng-heroicons';
|
|
11
11
|
import _, { clamp } from 'lodash';
|
|
12
|
-
import { Observable, firstValueFrom,
|
|
12
|
+
import { Observable, firstValueFrom, Subject, debounceTime, BehaviorSubject, throwError, distinctUntilChanged } from 'rxjs';
|
|
13
13
|
import * as i1$1 from '@angular/material/dialog';
|
|
14
14
|
import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
|
15
15
|
import * as i2$1 from '@angular/common/http';
|
|
@@ -17,33 +17,33 @@ import { HttpClient } from '@angular/common/http';
|
|
|
17
17
|
import * as i1$2 from '@ngx-translate/core';
|
|
18
18
|
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
|
19
19
|
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
|
20
|
-
import * as i2$2 from '@angular/router';
|
|
21
|
-
import { catchError } from 'rxjs/operators';
|
|
22
20
|
import * as i1$3 from '@angular/forms';
|
|
23
21
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
22
|
+
import * as i2$2 from '@angular/router';
|
|
23
|
+
import { catchError } from 'rxjs/operators';
|
|
24
24
|
import * as i3$1 from '@angular/material/select';
|
|
25
25
|
import { MatSelectModule } from '@angular/material/select';
|
|
26
|
-
import * as
|
|
26
|
+
import * as i25 from '@angular/material/radio';
|
|
27
27
|
import { MatRadioModule } from '@angular/material/radio';
|
|
28
|
-
import * as
|
|
28
|
+
import * as i26 from '@angular/material/button';
|
|
29
29
|
import { MatButtonModule } from '@angular/material/button';
|
|
30
|
-
import * as
|
|
30
|
+
import * as i27 from '@angular/material/icon';
|
|
31
31
|
import { MatIconModule } from '@angular/material/icon';
|
|
32
|
-
import * as
|
|
32
|
+
import * as i30 from '@angular/material/snack-bar';
|
|
33
33
|
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
|
34
|
-
import * as
|
|
34
|
+
import * as i32 from '@angular/material/checkbox';
|
|
35
35
|
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
36
|
-
import * as
|
|
36
|
+
import * as i33 from '@angular/material/card';
|
|
37
37
|
import { MatCardModule } from '@angular/material/card';
|
|
38
|
-
import * as
|
|
38
|
+
import * as i34 from '@angular/material/datepicker';
|
|
39
39
|
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
40
|
-
import * as
|
|
40
|
+
import * as i35 from '@angular/material/timepicker';
|
|
41
41
|
import { MatTimepickerModule } from '@angular/material/timepicker';
|
|
42
|
-
import * as
|
|
42
|
+
import * as i36 from '@angular/material/badge';
|
|
43
43
|
import { MatBadgeModule } from '@angular/material/badge';
|
|
44
|
-
import * as
|
|
44
|
+
import * as i37 from '@angular/material/expansion';
|
|
45
45
|
import { MatExpansionModule } from '@angular/material/expansion';
|
|
46
|
-
import * as
|
|
46
|
+
import * as i38 from '@angular/material/form-field';
|
|
47
47
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
48
48
|
import * as i3 from '@danielmoncada/angular-datetime-picker';
|
|
49
49
|
import { OwlDateTimeModule, OwlNativeDateTimeModule } from '@danielmoncada/angular-datetime-picker';
|
|
@@ -99,11 +99,11 @@ class ToastComponent {
|
|
|
99
99
|
message = '';
|
|
100
100
|
type;
|
|
101
101
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
102
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ToastComponent, isStandalone: false, selector: "fx-ui-toast", inputs: { toastId: "toastId", title: "title", message: "message", type: "type" }, ngImport: i0, template: "<div\n animate.enter=\"horizontal-fade-in-animation\"\n animate.leave=\"horizontal-fade-out-animation\"\n class=\"flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[
|
|
102
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ToastComponent, isStandalone: false, selector: "fx-ui-toast", inputs: { toastId: "toastId", title: "title", message: "message", type: "type" }, ngImport: i0, template: "<div\n animate.enter=\"horizontal-fade-in-animation\"\n animate.leave=\"horizontal-fade-out-animation\"\n class=\"flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[400px] px-large py-semi rounded shadow-lg transition-all duration-300 ease-in-out transform opacity-100 translate-y-0\"\n [ngClass]=\"{\n 'border-success': type === 'success',\n 'border-critical': type === 'error',\n 'border-warning': type === 'warning',\n 'border-information': type === 'info'\n }\"\n>\n <div class=\"\">\n @switch (type) { @case('success') {\n <fx-ui-hero-icon\n icon=\"check-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-success\"\n ></fx-ui-hero-icon>\n } @case('error') {\n <fx-ui-hero-icon\n icon=\"exclamation-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-critical\"\n ></fx-ui-hero-icon>\n } @case('warning') {\n <fx-ui-hero-icon\n icon=\"exclamation-triangle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-warning\"\n ></fx-ui-hero-icon>\n } @default {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-information\"\n ></fx-ui-hero-icon>\n } }\n </div>\n\n <div class=\"flex flex-col\">\n <strong *ngIf=\"title\" class=\"txt-field-label\">{{ title }}</strong>\n <p class=\"txt-default\">{{ message }}</p>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: HeroIconComponent, selector: "fx-ui-hero-icon", inputs: ["icon", "solid", "outline", "size", "color", "class"] }] });
|
|
103
103
|
}
|
|
104
104
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ToastComponent, decorators: [{
|
|
105
105
|
type: Component,
|
|
106
|
-
args: [{ selector: 'fx-ui-toast', standalone: false, template: "<div\n animate.enter=\"horizontal-fade-in-animation\"\n animate.leave=\"horizontal-fade-out-animation\"\n class=\"flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[
|
|
106
|
+
args: [{ selector: 'fx-ui-toast', standalone: false, template: "<div\n animate.enter=\"horizontal-fade-in-animation\"\n animate.leave=\"horizontal-fade-out-animation\"\n class=\"flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[400px] px-large py-semi rounded shadow-lg transition-all duration-300 ease-in-out transform opacity-100 translate-y-0\"\n [ngClass]=\"{\n 'border-success': type === 'success',\n 'border-critical': type === 'error',\n 'border-warning': type === 'warning',\n 'border-information': type === 'info'\n }\"\n>\n <div class=\"\">\n @switch (type) { @case('success') {\n <fx-ui-hero-icon\n icon=\"check-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-success\"\n ></fx-ui-hero-icon>\n } @case('error') {\n <fx-ui-hero-icon\n icon=\"exclamation-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-critical\"\n ></fx-ui-hero-icon>\n } @case('warning') {\n <fx-ui-hero-icon\n icon=\"exclamation-triangle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-warning\"\n ></fx-ui-hero-icon>\n } @default {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"text-information\"\n ></fx-ui-hero-icon>\n } }\n </div>\n\n <div class=\"flex flex-col\">\n <strong *ngIf=\"title\" class=\"txt-field-label\">{{ title }}</strong>\n <p class=\"txt-default\">{{ message }}</p>\n </div>\n</div>\n" }]
|
|
107
107
|
}], propDecorators: { toastId: [{
|
|
108
108
|
type: Input
|
|
109
109
|
}], title: [{
|
|
@@ -342,6 +342,10 @@ class FxUtils {
|
|
|
342
342
|
const isEmail = emailRegex.test(value);
|
|
343
343
|
return isEmail;
|
|
344
344
|
}
|
|
345
|
+
static isStrongPassword(password) {
|
|
346
|
+
const regex = /^(?=.{6,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9]).*$/;
|
|
347
|
+
return regex.test(password);
|
|
348
|
+
}
|
|
345
349
|
}
|
|
346
350
|
|
|
347
351
|
class HttpWrapper {
|
|
@@ -427,12 +431,13 @@ class BaseTableComponent extends BaseComponent {
|
|
|
427
431
|
cols = [];
|
|
428
432
|
total = 0;
|
|
429
433
|
page = 1;
|
|
430
|
-
pageSize =
|
|
434
|
+
pageSize = 10;
|
|
431
435
|
filters = {};
|
|
432
436
|
loading = false;
|
|
433
437
|
expandedElement;
|
|
434
438
|
toastr;
|
|
435
439
|
_lock = false;
|
|
440
|
+
keywordChange$ = new Subject();
|
|
436
441
|
config;
|
|
437
442
|
paginator;
|
|
438
443
|
table;
|
|
@@ -444,6 +449,9 @@ class BaseTableComponent extends BaseComponent {
|
|
|
444
449
|
this.toastr = injector.get(FxToastrService);
|
|
445
450
|
}
|
|
446
451
|
ngOnInit() {
|
|
452
|
+
this.keywordChange$.pipe(debounceTime(300)).subscribe(async (keyword) => {
|
|
453
|
+
await this.refresh();
|
|
454
|
+
});
|
|
447
455
|
this.init();
|
|
448
456
|
}
|
|
449
457
|
init() { }
|
|
@@ -465,13 +473,13 @@ class BaseTableComponent extends BaseComponent {
|
|
|
465
473
|
const params = { page: this.page, pageSize: this.pageSize, ...this.filters };
|
|
466
474
|
const result = await this.api.search(params);
|
|
467
475
|
this.setDataSource(result);
|
|
468
|
-
this.ref.detectChanges();
|
|
469
476
|
}
|
|
470
477
|
catch (err) {
|
|
471
|
-
this.toastr.error(FxUtils.parseError(err)
|
|
478
|
+
this.toastr.error(FxUtils.parseError(err));
|
|
472
479
|
}
|
|
473
480
|
finally {
|
|
474
481
|
this.loading = false;
|
|
482
|
+
this.ref.detectChanges();
|
|
475
483
|
}
|
|
476
484
|
}
|
|
477
485
|
async onPageChange(event) {
|
|
@@ -485,6 +493,9 @@ class BaseTableComponent extends BaseComponent {
|
|
|
485
493
|
empty() {
|
|
486
494
|
return {};
|
|
487
495
|
}
|
|
496
|
+
onKeywordChange(keyword) {
|
|
497
|
+
this.keywordChange$.next(keyword);
|
|
498
|
+
}
|
|
488
499
|
async create() {
|
|
489
500
|
const conf = _.get(this.config, 'create');
|
|
490
501
|
const dialog = _.get(conf, 'dialog');
|
|
@@ -506,6 +517,7 @@ class BaseTableComponent extends BaseComponent {
|
|
|
506
517
|
width: size,
|
|
507
518
|
disableClose: true,
|
|
508
519
|
data: {
|
|
520
|
+
method: 'create',
|
|
509
521
|
data: this.empty(),
|
|
510
522
|
title: conf.title,
|
|
511
523
|
message: conf.message,
|
|
@@ -540,6 +552,7 @@ class BaseTableComponent extends BaseComponent {
|
|
|
540
552
|
width: size,
|
|
541
553
|
disableClose: true,
|
|
542
554
|
data: {
|
|
555
|
+
method: 'update',
|
|
543
556
|
data: model,
|
|
544
557
|
title: conf.title,
|
|
545
558
|
message: conf.message,
|
|
@@ -590,32 +603,36 @@ class BaseTableComponent extends BaseComponent {
|
|
|
590
603
|
return;
|
|
591
604
|
}
|
|
592
605
|
this._lock = true;
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
606
|
+
try {
|
|
607
|
+
const conf = _.get(this.config, 'delete');
|
|
608
|
+
const dialog = _.get(conf, 'dialog');
|
|
609
|
+
const dialogRef = this.modal.open(dialog, {
|
|
610
|
+
panelClass: 'fx-dialog',
|
|
611
|
+
autoFocus: false,
|
|
612
|
+
width: '400px',
|
|
613
|
+
data: {
|
|
614
|
+
title: _.get(conf, 'title'),
|
|
615
|
+
message: _.get(conf, 'message'),
|
|
616
|
+
cancelLabel: _.get(conf, 'cancelTitle'),
|
|
617
|
+
confirmLabel: _.get(conf, 'confirmTitle'),
|
|
618
|
+
callback: async () => {
|
|
619
|
+
await this.remove(model);
|
|
620
|
+
},
|
|
621
|
+
},
|
|
622
|
+
});
|
|
623
|
+
const state = await firstValueFrom(dialogRef.afterClosed());
|
|
607
624
|
if (state) {
|
|
608
625
|
try {
|
|
609
|
-
await this.
|
|
610
|
-
this.refresh();
|
|
626
|
+
await this.refresh();
|
|
611
627
|
}
|
|
612
628
|
catch (err) {
|
|
613
|
-
this.toastr.error(FxUtils.parseError(err)
|
|
629
|
+
this.toastr.error(FxUtils.parseError(err));
|
|
614
630
|
}
|
|
615
|
-
return;
|
|
616
631
|
}
|
|
632
|
+
}
|
|
633
|
+
finally {
|
|
617
634
|
this._lock = false;
|
|
618
|
-
}
|
|
635
|
+
}
|
|
619
636
|
}
|
|
620
637
|
async remove(model) {
|
|
621
638
|
try {
|
|
@@ -631,6 +648,18 @@ class BaseTableComponent extends BaseComponent {
|
|
|
631
648
|
toggleExpand(element) {
|
|
632
649
|
this.expandedElement = this.expandedElement === element ? null : element;
|
|
633
650
|
}
|
|
651
|
+
async updateStatus(params) {
|
|
652
|
+
try {
|
|
653
|
+
await this.api.updateStatus(params);
|
|
654
|
+
this.toastr.success(_.get(this.config, 'updateStatus.message', 'Update Success'));
|
|
655
|
+
}
|
|
656
|
+
catch (err) {
|
|
657
|
+
this.toastr.success(FxUtils.parseError(err));
|
|
658
|
+
}
|
|
659
|
+
finally {
|
|
660
|
+
await this.refresh();
|
|
661
|
+
}
|
|
662
|
+
}
|
|
634
663
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: BaseTableComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
|
|
635
664
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.4", type: BaseTableComponent, isStandalone: true, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }], usesInheritance: true, ngImport: i0 });
|
|
636
665
|
}
|
|
@@ -651,6 +680,7 @@ class BaseDialogComponent extends BaseComponent {
|
|
|
651
680
|
api;
|
|
652
681
|
dialog;
|
|
653
682
|
ngForm;
|
|
683
|
+
method;
|
|
654
684
|
title;
|
|
655
685
|
model;
|
|
656
686
|
disabled;
|
|
@@ -667,6 +697,7 @@ class BaseDialogComponent extends BaseComponent {
|
|
|
667
697
|
this.api = api;
|
|
668
698
|
this.dialog = dialog;
|
|
669
699
|
this.model = _.clone(_.get(bindings, 'data'));
|
|
700
|
+
this.method = _.get(bindings, 'method');
|
|
670
701
|
this.title = _.get(bindings, 'title');
|
|
671
702
|
this.disabled = _.get(bindings, 'disabled');
|
|
672
703
|
this.message = _.get(bindings, 'message');
|
|
@@ -676,12 +707,13 @@ class BaseDialogComponent extends BaseComponent {
|
|
|
676
707
|
ngOnInit() { }
|
|
677
708
|
accept(form, params = null) {
|
|
678
709
|
if (form.invalid) {
|
|
710
|
+
FxUtils.checkInvalidField(form);
|
|
679
711
|
return;
|
|
680
712
|
}
|
|
681
713
|
if (!this.disabled) {
|
|
682
714
|
if (!this.validate())
|
|
683
715
|
return;
|
|
684
|
-
if (
|
|
716
|
+
if (this.method === 'create') {
|
|
685
717
|
this.create(params);
|
|
686
718
|
return;
|
|
687
719
|
}
|
|
@@ -703,31 +735,13 @@ class BaseDialogComponent extends BaseComponent {
|
|
|
703
735
|
this.toastr.success(this.message);
|
|
704
736
|
this.ref.close(true);
|
|
705
737
|
}, (error) => {
|
|
706
|
-
this.toastr.error(error);
|
|
738
|
+
this.toastr.error(FxUtils.parseError(error));
|
|
707
739
|
})
|
|
708
740
|
.then(() => {
|
|
709
741
|
this.loading = false;
|
|
710
742
|
});
|
|
711
743
|
}
|
|
712
744
|
update(params = null) {
|
|
713
|
-
if (this.loading) {
|
|
714
|
-
return;
|
|
715
|
-
}
|
|
716
|
-
this.loading = true;
|
|
717
|
-
let code = _.get(this.model, 'code');
|
|
718
|
-
this.api
|
|
719
|
-
.update(code, { ...this.model, ...params })
|
|
720
|
-
.then(() => {
|
|
721
|
-
this.toastr.success(this.message);
|
|
722
|
-
this.ref.close(true);
|
|
723
|
-
}, (error) => {
|
|
724
|
-
this.toastr.error(error);
|
|
725
|
-
})
|
|
726
|
-
.then(() => {
|
|
727
|
-
this.loading = false;
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
updateData(params = null) {
|
|
731
745
|
if (this.loading) {
|
|
732
746
|
return;
|
|
733
747
|
}
|
|
@@ -738,7 +752,7 @@ class BaseDialogComponent extends BaseComponent {
|
|
|
738
752
|
this.toastr.success(this.message);
|
|
739
753
|
this.ref.close(true);
|
|
740
754
|
}, (error) => {
|
|
741
|
-
this.toastr.error(error);
|
|
755
|
+
this.toastr.error(FxUtils.parseError(error));
|
|
742
756
|
})
|
|
743
757
|
.then(() => {
|
|
744
758
|
this.loading = false;
|
|
@@ -944,6 +958,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
944
958
|
type: Input
|
|
945
959
|
}] } });
|
|
946
960
|
|
|
961
|
+
class TrimOnBlurDirective {
|
|
962
|
+
el;
|
|
963
|
+
ngControl;
|
|
964
|
+
collapseWhitespace = false;
|
|
965
|
+
constructor(el, ngControl) {
|
|
966
|
+
this.el = el;
|
|
967
|
+
this.ngControl = ngControl;
|
|
968
|
+
}
|
|
969
|
+
onBlur() {
|
|
970
|
+
const native = this.el.nativeElement;
|
|
971
|
+
if (!native)
|
|
972
|
+
return;
|
|
973
|
+
let value = native.value ?? '';
|
|
974
|
+
if (this.collapseWhitespace) {
|
|
975
|
+
value = value.replace(/\s+/g, ' ').trim();
|
|
976
|
+
}
|
|
977
|
+
else {
|
|
978
|
+
value = value.trim();
|
|
979
|
+
}
|
|
980
|
+
if (native.value === value)
|
|
981
|
+
return;
|
|
982
|
+
native.value = value;
|
|
983
|
+
if (this.ngControl && this.ngControl.control) {
|
|
984
|
+
this.ngControl.control.setValue(value);
|
|
985
|
+
}
|
|
986
|
+
else {
|
|
987
|
+
const ev = new Event('input', { bubbles: true });
|
|
988
|
+
native.dispatchEvent(ev);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TrimOnBlurDirective, deps: [{ token: i0.ElementRef }, { token: i1$3.NgControl }], target: i0.ɵɵFactoryTarget.Directive });
|
|
992
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.4", type: TrimOnBlurDirective, isStandalone: true, selector: "[appTrimOnBlur]", inputs: { collapseWhitespace: ["appTrimOnBlurCollapse", "collapseWhitespace"] }, host: { listeners: { "blur": "onBlur()" } }, ngImport: i0 });
|
|
993
|
+
}
|
|
994
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TrimOnBlurDirective, decorators: [{
|
|
995
|
+
type: Directive,
|
|
996
|
+
args: [{
|
|
997
|
+
selector: '[appTrimOnBlur]'
|
|
998
|
+
}]
|
|
999
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1$3.NgControl }], propDecorators: { collapseWhitespace: [{
|
|
1000
|
+
type: Input,
|
|
1001
|
+
args: ['appTrimOnBlurCollapse']
|
|
1002
|
+
}], onBlur: [{
|
|
1003
|
+
type: HostListener,
|
|
1004
|
+
args: ['blur']
|
|
1005
|
+
}] } });
|
|
1006
|
+
|
|
947
1007
|
class PermissionGuard {
|
|
948
1008
|
permissionService;
|
|
949
1009
|
router;
|
|
@@ -991,19 +1051,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
991
1051
|
}] });
|
|
992
1052
|
|
|
993
1053
|
class AuthStateService {
|
|
994
|
-
_isLoggedIn$ = new BehaviorSubject(
|
|
1054
|
+
_isLoggedIn$ = new BehaviorSubject(null);
|
|
995
1055
|
isLoggedIn$ = this._isLoggedIn$.asObservable();
|
|
996
1056
|
unauthorized$ = new Subject();
|
|
997
|
-
constructor() {
|
|
998
|
-
const saved = localStorage.getItem('isLoggedIn') === 'true';
|
|
999
|
-
this._isLoggedIn$.next(saved);
|
|
1000
|
-
}
|
|
1057
|
+
constructor() { }
|
|
1001
1058
|
setLoggedIn(value) {
|
|
1002
1059
|
this._isLoggedIn$.next(value);
|
|
1003
|
-
localStorage.setItem('isLoggedIn', String(value));
|
|
1004
1060
|
}
|
|
1005
1061
|
get isLoggedIn() {
|
|
1006
|
-
return this._isLoggedIn$.value;
|
|
1062
|
+
return this._isLoggedIn$.value === true;
|
|
1007
1063
|
}
|
|
1008
1064
|
handleUnauthorized() {
|
|
1009
1065
|
this.setLoggedIn(false);
|
|
@@ -1059,6 +1115,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
1059
1115
|
}]
|
|
1060
1116
|
}] });
|
|
1061
1117
|
|
|
1118
|
+
class QuillStyleLoaderService {
|
|
1119
|
+
platformId;
|
|
1120
|
+
loaded = false;
|
|
1121
|
+
loadingPromise = null;
|
|
1122
|
+
constructor(platformId) {
|
|
1123
|
+
this.platformId = platformId;
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* Load Quill CSS (only in browser). Returns a promise that resolves when
|
|
1127
|
+
* the CSS links have been appended.
|
|
1128
|
+
*/
|
|
1129
|
+
load() {
|
|
1130
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
1131
|
+
// Server: do nothing and resolve immediately.
|
|
1132
|
+
return Promise.resolve();
|
|
1133
|
+
}
|
|
1134
|
+
if (this.loaded)
|
|
1135
|
+
return Promise.resolve();
|
|
1136
|
+
if (this.loadingPromise)
|
|
1137
|
+
return this.loadingPromise;
|
|
1138
|
+
this.loadingPromise = new Promise((resolve) => {
|
|
1139
|
+
const cssUrls = [
|
|
1140
|
+
// Using CDN is simplest — no consumer angular.json edits needed.
|
|
1141
|
+
'https://cdn.jsdelivr.net/npm/quill/dist/quill.core.css',
|
|
1142
|
+
'https://cdn.jsdelivr.net/npm/quill/dist/quill.snow.css'
|
|
1143
|
+
];
|
|
1144
|
+
let remaining = cssUrls.length;
|
|
1145
|
+
const onLoad = () => {
|
|
1146
|
+
remaining -= 1;
|
|
1147
|
+
if (remaining === 0) {
|
|
1148
|
+
this.loaded = true;
|
|
1149
|
+
resolve();
|
|
1150
|
+
}
|
|
1151
|
+
};
|
|
1152
|
+
cssUrls.forEach((href) => {
|
|
1153
|
+
// Do not add duplicate links
|
|
1154
|
+
if (document.querySelector(`link[href="${href}"]`)) {
|
|
1155
|
+
onLoad();
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
const link = document.createElement('link');
|
|
1159
|
+
link.rel = 'stylesheet';
|
|
1160
|
+
link.href = href;
|
|
1161
|
+
link.onload = () => onLoad();
|
|
1162
|
+
link.onerror = () => {
|
|
1163
|
+
// still count it as loaded to avoid hanging if CDN fails
|
|
1164
|
+
console.warn(`[QuillStyleLoader] failed to load: ${href}`);
|
|
1165
|
+
onLoad();
|
|
1166
|
+
};
|
|
1167
|
+
document.head.appendChild(link);
|
|
1168
|
+
});
|
|
1169
|
+
});
|
|
1170
|
+
return this.loadingPromise;
|
|
1171
|
+
}
|
|
1172
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QuillStyleLoaderService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1173
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QuillStyleLoaderService, providedIn: 'root' });
|
|
1174
|
+
}
|
|
1175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: QuillStyleLoaderService, decorators: [{
|
|
1176
|
+
type: Injectable,
|
|
1177
|
+
args: [{ providedIn: 'root' }]
|
|
1178
|
+
}], ctorParameters: () => [{ type: Object, decorators: [{
|
|
1179
|
+
type: Inject,
|
|
1180
|
+
args: [PLATFORM_ID]
|
|
1181
|
+
}] }] });
|
|
1182
|
+
|
|
1062
1183
|
const MATERIAL_MODULE = [
|
|
1063
1184
|
MatSelectModule,
|
|
1064
1185
|
MatRadioModule,
|
|
@@ -1090,11 +1211,11 @@ class ButtonComponent {
|
|
|
1090
1211
|
this.clicked.emit();
|
|
1091
1212
|
}
|
|
1092
1213
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1093
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ButtonComponent, isStandalone: false, selector: "fx-ui-button", inputs: { label: "label", disabled: "disabled", buttonVariant: "buttonVariant", icon: "icon", class: "class", loading: "loading" }, outputs: { clicked: "clicked" }, ngImport: i0, template: "<button\n [class]=\"class\"\n [ngClass]=\"{\n 'btn-default': buttonVariant === 'default',\n 'btn-primary': buttonVariant === 'primary',\n 'btn-alternative': buttonVariant === 'alternative',\n }\"\n [disabled]=\"disabled || loading\"\n (click)=\"onClick()\"\n>\n @if (loading) {\n <div class=\"flex w-full items-center justify-center\">\n <svg\n [attr.fill]=\"\n buttonVariant !== 'alternative' ? 'rgb(var(--text-primary))' : 'rgb(var(--primary))'\n \"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_lo66\"\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_z0Or\"\n begin=\"spinner_lo66.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_JsnR\"\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_Aguh\"\n begin=\"spinner_JsnR.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_hSjk\"\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_UHR2\"\n begin=\"spinner_hSjk.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate\n id=\"spinner_4v5M\"\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_OLMs\"\n begin=\"spinner_4v5M.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n </circle>\n </svg>\n </div>\n } @else {\n <ng-container>\n <div class=\"flex items-center justify-center gap-small\">\n @if(icon) {<fx-ui-hero-icon [icon]=\"icon\" [size]=\"20\" class=\"flex\" [ngClass]=\"{\n 'text-text-inverse': buttonVariant !== 'default',\n 'text-text-primary': buttonVariant === 'alternative'\n }\"></fx-ui-hero-icon>}\n <div>{{ label }}</div
|
|
1214
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: ButtonComponent, isStandalone: false, selector: "fx-ui-button", inputs: { label: "label", disabled: "disabled", buttonVariant: "buttonVariant", icon: "icon", class: "class", loading: "loading" }, outputs: { clicked: "clicked" }, ngImport: i0, template: "<button\n [class]=\"class\"\n [ngClass]=\"{\n 'btn-default': buttonVariant === 'default',\n 'btn-primary': buttonVariant === 'primary',\n 'btn-alternative': buttonVariant === 'alternative',\n }\"\n [disabled]=\"disabled || loading\"\n (click)=\"onClick()\"\n>\n @if (loading) {\n <div class=\"flex w-full items-center justify-center\">\n <svg\n [attr.fill]=\"\n buttonVariant !== 'alternative' ? 'rgb(var(--text-primary))' : 'rgb(var(--primary))'\n \"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_lo66\"\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_z0Or\"\n begin=\"spinner_lo66.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_JsnR\"\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_Aguh\"\n begin=\"spinner_JsnR.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_hSjk\"\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_UHR2\"\n begin=\"spinner_hSjk.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate\n id=\"spinner_4v5M\"\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_OLMs\"\n begin=\"spinner_4v5M.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n </circle>\n </svg>\n </div>\n } @else {\n <ng-container>\n <div class=\"flex items-center justify-center gap-small\">\n @if(icon) {<fx-ui-hero-icon [icon]=\"icon\" [size]=\"20\" class=\"flex\" [ngClass]=\"{\n 'text-text-inverse': buttonVariant !== 'default',\n 'text-text-primary': buttonVariant === 'alternative'\n }\"></fx-ui-hero-icon>}\n @if(label){<div>{{ label }}</div>}\n </div>\n </ng-container>\n }\n</button>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: HeroIconComponent, selector: "fx-ui-hero-icon", inputs: ["icon", "solid", "outline", "size", "color", "class"] }] });
|
|
1094
1215
|
}
|
|
1095
1216
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ButtonComponent, decorators: [{
|
|
1096
1217
|
type: Component,
|
|
1097
|
-
args: [{ selector: 'fx-ui-button', standalone: false, template: "<button\n [class]=\"class\"\n [ngClass]=\"{\n 'btn-default': buttonVariant === 'default',\n 'btn-primary': buttonVariant === 'primary',\n 'btn-alternative': buttonVariant === 'alternative',\n }\"\n [disabled]=\"disabled || loading\"\n (click)=\"onClick()\"\n>\n @if (loading) {\n <div class=\"flex w-full items-center justify-center\">\n <svg\n [attr.fill]=\"\n buttonVariant !== 'alternative' ? 'rgb(var(--text-primary))' : 'rgb(var(--primary))'\n \"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_lo66\"\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_z0Or\"\n begin=\"spinner_lo66.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_JsnR\"\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_Aguh\"\n begin=\"spinner_JsnR.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_hSjk\"\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_UHR2\"\n begin=\"spinner_hSjk.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate\n id=\"spinner_4v5M\"\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_OLMs\"\n begin=\"spinner_4v5M.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n </circle>\n </svg>\n </div>\n } @else {\n <ng-container>\n <div class=\"flex items-center justify-center gap-small\">\n @if(icon) {<fx-ui-hero-icon [icon]=\"icon\" [size]=\"20\" class=\"flex\" [ngClass]=\"{\n 'text-text-inverse': buttonVariant !== 'default',\n 'text-text-primary': buttonVariant === 'alternative'\n }\"></fx-ui-hero-icon>}\n <div>{{ label }}</div
|
|
1218
|
+
args: [{ selector: 'fx-ui-button', standalone: false, template: "<button\n [class]=\"class\"\n [ngClass]=\"{\n 'btn-default': buttonVariant === 'default',\n 'btn-primary': buttonVariant === 'primary',\n 'btn-alternative': buttonVariant === 'alternative',\n }\"\n [disabled]=\"disabled || loading\"\n (click)=\"onClick()\"\n>\n @if (loading) {\n <div class=\"flex w-full items-center justify-center\">\n <svg\n [attr.fill]=\"\n buttonVariant !== 'alternative' ? 'rgb(var(--text-primary))' : 'rgb(var(--primary))'\n \"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_lo66\"\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_z0Or\"\n begin=\"spinner_lo66.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_JsnR\"\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_Aguh\"\n begin=\"spinner_JsnR.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_hSjk\"\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_UHR2\"\n begin=\"spinner_hSjk.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate\n id=\"spinner_4v5M\"\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_OLMs\"\n begin=\"spinner_4v5M.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n </circle>\n </svg>\n </div>\n } @else {\n <ng-container>\n <div class=\"flex items-center justify-center gap-small\">\n @if(icon) {<fx-ui-hero-icon [icon]=\"icon\" [size]=\"20\" class=\"flex\" [ngClass]=\"{\n 'text-text-inverse': buttonVariant !== 'default',\n 'text-text-primary': buttonVariant === 'alternative'\n }\"></fx-ui-hero-icon>}\n @if(label){<div>{{ label }}</div>}\n </div>\n </ng-container>\n }\n</button>\n" }]
|
|
1098
1219
|
}], propDecorators: { label: [{
|
|
1099
1220
|
type: Input
|
|
1100
1221
|
}], disabled: [{
|
|
@@ -1438,7 +1559,15 @@ let FxComponent = class FxComponent {
|
|
|
1438
1559
|
const control = this.ngControl?.control;
|
|
1439
1560
|
if (!control)
|
|
1440
1561
|
return;
|
|
1441
|
-
control.
|
|
1562
|
+
const errors = control.errors || {};
|
|
1563
|
+
const builtInErrorKeys = ['required', 'minlength', 'maxlength', 'email', 'pattern'];
|
|
1564
|
+
const remaining = {};
|
|
1565
|
+
for (const key of builtInErrorKeys) {
|
|
1566
|
+
if (errors[key] !== undefined) {
|
|
1567
|
+
remaining[key] = errors[key];
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
control.setErrors(Object.keys(remaining).length ? remaining : null);
|
|
1442
1571
|
}
|
|
1443
1572
|
getErrorMessage(label) {
|
|
1444
1573
|
if (!this.errors)
|
|
@@ -1447,6 +1576,7 @@ let FxComponent = class FxComponent {
|
|
|
1447
1576
|
const defaultMessages = {
|
|
1448
1577
|
required: `${displayLabel} is required`,
|
|
1449
1578
|
minlength: `${displayLabel} minimum length is ${this.errors['minlength']?.requiredLength}`,
|
|
1579
|
+
email: "Please enter a valid email"
|
|
1450
1580
|
};
|
|
1451
1581
|
const messages = { ...defaultMessages, ...this.validationError, ...this.errorMessages };
|
|
1452
1582
|
const firstKey = Object.keys(this.errors)[0];
|
|
@@ -1462,8 +1592,7 @@ class CheckboxComponent extends FxComponent {
|
|
|
1462
1592
|
ref;
|
|
1463
1593
|
label = '';
|
|
1464
1594
|
disabled = false;
|
|
1465
|
-
rounded
|
|
1466
|
-
size = 'normal';
|
|
1595
|
+
rounded;
|
|
1467
1596
|
valueChange = new EventEmitter();
|
|
1468
1597
|
constructor(ngControl, ref) {
|
|
1469
1598
|
super(ngControl);
|
|
@@ -1485,19 +1614,17 @@ class CheckboxComponent extends FxComponent {
|
|
|
1485
1614
|
this.onTouched();
|
|
1486
1615
|
}
|
|
1487
1616
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CheckboxComponent, deps: [{ token: i1$3.NgControl }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1488
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
1617
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: CheckboxComponent, isStandalone: false, selector: "fx-ui-checkbox", inputs: { label: "label", disabled: "disabled", rounded: "rounded" }, outputs: { valueChange: "valueChange" }, usesInheritance: true, ngImport: i0, template: "<label\n class=\"flex items-center gap-normal cursor-pointer select-none\"\n [class.opacity-50]=\"disabled\"\n [class.cursor-not-allowed]=\"disabled\"\n>\n <input\n type=\"checkbox\"\n class=\"hidden\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n <span\n class=\"relative w-4 h-4 border rounded-full transition-colors duration-150 shrink-0\"\n [ngClass]=\"{\n 'rounded-full': rounded,\n 'rounded-sm': !rounded,\n 'border-border-strong bg-transparent': !value,\n 'border-border-selected bg-border-selected': value\n }\"\n >\n <!-- Keep SVG space reserved always -->\n <span class=\"absolute inset-0 flex items-center justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-bg-primary w-4 h-4 transition-opacity duration-150\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.opacity]=\"value ? 1 : 0\"\n >\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n </span>\n </span>\n\n @if(label){<span class=\"mb-0 txt-field-label\">{{ label }}</span>}\n</label>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
1489
1618
|
}
|
|
1490
1619
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CheckboxComponent, decorators: [{
|
|
1491
1620
|
type: Component,
|
|
1492
|
-
args: [{ selector: 'fx-ui-checkbox', standalone: false, template: "<label\n class=\"
|
|
1621
|
+
args: [{ selector: 'fx-ui-checkbox', standalone: false, template: "<label\n class=\"flex items-center gap-normal cursor-pointer select-none\"\n [class.opacity-50]=\"disabled\"\n [class.cursor-not-allowed]=\"disabled\"\n>\n <input\n type=\"checkbox\"\n class=\"hidden\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n <span\n class=\"relative w-4 h-4 border rounded-full transition-colors duration-150 shrink-0\"\n [ngClass]=\"{\n 'rounded-full': rounded,\n 'rounded-sm': !rounded,\n 'border-border-strong bg-transparent': !value,\n 'border-border-selected bg-border-selected': value\n }\"\n >\n <!-- Keep SVG space reserved always -->\n <span class=\"absolute inset-0 flex items-center justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-bg-primary w-4 h-4 transition-opacity duration-150\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.opacity]=\"value ? 1 : 0\"\n >\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n </span>\n </span>\n\n @if(label){<span class=\"mb-0 txt-field-label\">{{ label }}</span>}\n</label>\n" }]
|
|
1493
1622
|
}], ctorParameters: () => [{ type: i1$3.NgControl }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
|
|
1494
1623
|
type: Input
|
|
1495
1624
|
}], disabled: [{
|
|
1496
1625
|
type: Input
|
|
1497
1626
|
}], rounded: [{
|
|
1498
1627
|
type: Input
|
|
1499
|
-
}], size: [{
|
|
1500
|
-
type: Input
|
|
1501
1628
|
}], valueChange: [{
|
|
1502
1629
|
type: Output
|
|
1503
1630
|
}] } });
|
|
@@ -1724,11 +1851,11 @@ class InputComponent extends FxComponent {
|
|
|
1724
1851
|
return this.type;
|
|
1725
1852
|
}
|
|
1726
1853
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: InputComponent, deps: [{ token: i1$3.NgControl }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1727
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: InputComponent, isStandalone: false, selector: "fx-ui-input", inputs: { label: "label", type: "type", placeholder: "placeholder", errorMessages: "errorMessages", required: "required", disabled: "disabled", iconClass: "iconClass", suffixIcon: "suffixIcon", class: "class", maxlength: "maxlength", validateFn: "validateFn" }, outputs: { blurred: "blurred", focused: "focused", suffixClick: "suffixClick" }, usesInheritance: true, ngImport: i0, template: "<div class=\"mb-4 text-left w-full text-text-primary\" [class]=\"class\">\n @if(label){<label class=\"block txt-field-label\">\n {{ label }}\n @if (required) {<span class=\"txt-required\">*</span>}\n </label>\n }\n\n <div class=\"relative\">\n <input\n [type]=\"displayType\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.maxlength]=\"maxlength\"\n [class]=\"type === 'otp' ? 'input-otp' : 'input-default'\"\n [ngClass]=\"{\n 'input-invalid': invalid,\n 'pr-8': type === 'password' || suffixIcon,\n 'txt-otp-input': type === 'otp'\n }\"\n />\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"onSuffixClick()\"\n [disabled]=\"disabled\"\n >\n @if (type === 'password') {\n <i class=\"material-symbols-outlined text-lg select-none\">{{\n showPassword ? 'visibility_off' : 'visibility'\n }}</i>\n } @else if (suffixIcon) {\n <i [class]=\"iconClass\" class=\"text-lg select-none\">{{ suffixIcon }}</i>\n }\n </button>\n </div>\n\n @if (invalid){\n <div class=\"txt-invalid\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
1854
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: InputComponent, isStandalone: false, selector: "fx-ui-input", inputs: { label: "label", type: "type", placeholder: "placeholder", errorMessages: "errorMessages", required: "required", disabled: "disabled", iconClass: "iconClass", suffixIcon: "suffixIcon", class: "class", maxlength: "maxlength", validateFn: "validateFn" }, outputs: { blurred: "blurred", focused: "focused", suffixClick: "suffixClick" }, usesInheritance: true, ngImport: i0, template: "<div class=\"mb-4 text-left w-full text-text-primary\" [class]=\"class\">\n @if(label){<label class=\"block txt-field-label\">\n {{ label }}\n @if (required) {<span class=\"txt-required\">*</span>}\n </label>\n }\n\n <div class=\"relative\">\n <input\n appTrimOnBlur\n [appTrimOnBlurCollapse]=\"true\"\n [type]=\"displayType\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.maxlength]=\"maxlength\"\n [class]=\"type === 'otp' ? 'input-otp' : 'input-default'\"\n [ngClass]=\"{\n 'input-invalid': invalid,\n 'pr-8': type === 'password' || suffixIcon,\n 'txt-otp-input': type === 'otp'\n }\"\n />\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"onSuffixClick()\"\n [disabled]=\"disabled\"\n >\n @if (type === 'password') {\n <i class=\"material-symbols-outlined text-lg select-none\">{{\n showPassword ? 'visibility_off' : 'visibility'\n }}</i>\n } @else if (suffixIcon) {\n <i [class]=\"iconClass\" class=\"text-lg select-none\">{{ suffixIcon }}</i>\n }\n </button>\n </div>\n\n @if (invalid){\n <div class=\"txt-invalid\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: TrimOnBlurDirective, selector: "[appTrimOnBlur]", inputs: ["appTrimOnBlurCollapse"] }] });
|
|
1728
1855
|
}
|
|
1729
1856
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: InputComponent, decorators: [{
|
|
1730
1857
|
type: Component,
|
|
1731
|
-
args: [{ selector: 'fx-ui-input', standalone: false, template: "<div class=\"mb-4 text-left w-full text-text-primary\" [class]=\"class\">\n @if(label){<label class=\"block txt-field-label\">\n {{ label }}\n @if (required) {<span class=\"txt-required\">*</span>}\n </label>\n }\n\n <div class=\"relative\">\n <input\n [type]=\"displayType\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.maxlength]=\"maxlength\"\n [class]=\"type === 'otp' ? 'input-otp' : 'input-default'\"\n [ngClass]=\"{\n 'input-invalid': invalid,\n 'pr-8': type === 'password' || suffixIcon,\n 'txt-otp-input': type === 'otp'\n }\"\n />\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"onSuffixClick()\"\n [disabled]=\"disabled\"\n >\n @if (type === 'password') {\n <i class=\"material-symbols-outlined text-lg select-none\">{{\n showPassword ? 'visibility_off' : 'visibility'\n }}</i>\n } @else if (suffixIcon) {\n <i [class]=\"iconClass\" class=\"text-lg select-none\">{{ suffixIcon }}</i>\n }\n </button>\n </div>\n\n @if (invalid){\n <div class=\"txt-invalid\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n" }]
|
|
1858
|
+
args: [{ selector: 'fx-ui-input', standalone: false, template: "<div class=\"mb-4 text-left w-full text-text-primary\" [class]=\"class\">\n @if(label){<label class=\"block txt-field-label\">\n {{ label }}\n @if (required) {<span class=\"txt-required\">*</span>}\n </label>\n }\n\n <div class=\"relative\">\n <input\n appTrimOnBlur\n [appTrimOnBlurCollapse]=\"true\"\n [type]=\"displayType\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.maxlength]=\"maxlength\"\n [class]=\"type === 'otp' ? 'input-otp' : 'input-default'\"\n [ngClass]=\"{\n 'input-invalid': invalid,\n 'pr-8': type === 'password' || suffixIcon,\n 'txt-otp-input': type === 'otp'\n }\"\n />\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"onSuffixClick()\"\n [disabled]=\"disabled\"\n >\n @if (type === 'password') {\n <i class=\"material-symbols-outlined text-lg select-none\">{{\n showPassword ? 'visibility_off' : 'visibility'\n }}</i>\n } @else if (suffixIcon) {\n <i [class]=\"iconClass\" class=\"text-lg select-none\">{{ suffixIcon }}</i>\n }\n </button>\n </div>\n\n @if (invalid){\n <div class=\"txt-invalid\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n" }]
|
|
1732
1859
|
}], ctorParameters: () => [{ type: i1$3.NgControl }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
|
|
1733
1860
|
type: Input
|
|
1734
1861
|
}], type: [{
|
|
@@ -1864,6 +1991,96 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
1864
1991
|
type: Input
|
|
1865
1992
|
}] } });
|
|
1866
1993
|
|
|
1994
|
+
class RichTextAreaComponent extends FxComponent {
|
|
1995
|
+
cdr;
|
|
1996
|
+
styleLoader;
|
|
1997
|
+
platformId;
|
|
1998
|
+
editorContainer;
|
|
1999
|
+
placeholder = 'Write something...';
|
|
2000
|
+
toolbarOptions = [
|
|
2001
|
+
// ['undo', 'redo'],
|
|
2002
|
+
[{ 'header': [1, 2, 3, 4, 5, 6, false] }],
|
|
2003
|
+
[{ 'font': [] }],
|
|
2004
|
+
[{ 'size': ['small', false, 'large', 'huge'] }],
|
|
2005
|
+
[{ 'align': [] }],
|
|
2006
|
+
[{ 'color': [] }, { 'background': [] }],
|
|
2007
|
+
['bold', 'italic', 'underline', 'strike'],
|
|
2008
|
+
['blockquote', 'code-block'],
|
|
2009
|
+
[{ 'list': 'ordered' }, { 'list': 'bullet' }],
|
|
2010
|
+
[{ 'indent': '-1' }, { 'indent': '+1' }],
|
|
2011
|
+
['link', 'image'],
|
|
2012
|
+
['clean']
|
|
2013
|
+
];
|
|
2014
|
+
contentChange = new EventEmitter();
|
|
2015
|
+
quillInstance;
|
|
2016
|
+
constructor(ngControl, cdr, styleLoader, platformId) {
|
|
2017
|
+
super(ngControl);
|
|
2018
|
+
this.cdr = cdr;
|
|
2019
|
+
this.styleLoader = styleLoader;
|
|
2020
|
+
this.platformId = platformId;
|
|
2021
|
+
}
|
|
2022
|
+
async ngAfterViewInit() {
|
|
2023
|
+
if (!isPlatformBrowser(this.platformId))
|
|
2024
|
+
return;
|
|
2025
|
+
await this.styleLoader.load();
|
|
2026
|
+
const QuillModule = await import('quill');
|
|
2027
|
+
const Quill = QuillModule.default || QuillModule;
|
|
2028
|
+
const icons = Quill.import('ui/icons');
|
|
2029
|
+
// icons['undo'] = `<svg viewBox="0 0 18 18"><path d="M6.4 5.2H3L6.8 1l3.8 4.2H7.9C10.2 5.4 12 7.4 12 9.8c0 2.7-2.2 4.9-4.9 4.9S2.2 12.5 2.2 9.8H0c0 3.8 3.1 6.9 6.9 6.9s6.9-3.1 6.9-6.9S10.7 3 7 3v2.2z"></path></svg>`;
|
|
2030
|
+
// icons['redo'] = `<svg viewBox="0 0 18 18"><path d="M11.6 5.2H15L11.2 1 7.4 5.2h2.7C7.8 5.4 6 7.4 6 9.8c0 2.7 2.2 4.9 4.9 4.9s4.9-2.2 4.9-4.9H18c0 3.8-3.1 6.9-6.9 6.9S4.2 13.6 4.2 9.8 7.3 3 11 3v2.2z"></path></svg>`;
|
|
2031
|
+
this.quillInstance = new Quill(this.editorContainer.nativeElement, {
|
|
2032
|
+
theme: 'snow',
|
|
2033
|
+
placeholder: this.placeholder,
|
|
2034
|
+
modules: {
|
|
2035
|
+
history: true,
|
|
2036
|
+
toolbar: this.toolbarOptions,
|
|
2037
|
+
}
|
|
2038
|
+
});
|
|
2039
|
+
this.quillInstance.root.style.color = FxUtils.convertColorFromVariable('--text-primary');
|
|
2040
|
+
const toolbar = this.quillInstance.getModule('toolbar');
|
|
2041
|
+
toolbar.addHandler('undo', () => this.quillInstance.history.undo());
|
|
2042
|
+
toolbar.addHandler('redo', () => this.quillInstance.history.redo());
|
|
2043
|
+
if (this.value) {
|
|
2044
|
+
this.quillInstance.root.innerHTML = this.value;
|
|
2045
|
+
}
|
|
2046
|
+
this.quillInstance.on('text-change', () => {
|
|
2047
|
+
const html = this.quillInstance.root.innerHTML || '';
|
|
2048
|
+
this.value = html;
|
|
2049
|
+
this.onChange(html);
|
|
2050
|
+
this.contentChange.emit(html);
|
|
2051
|
+
});
|
|
2052
|
+
}
|
|
2053
|
+
writeValue(value) {
|
|
2054
|
+
this.value = value || '';
|
|
2055
|
+
if (this.quillInstance) {
|
|
2056
|
+
this.quillInstance.root.innerHTML = this.value;
|
|
2057
|
+
}
|
|
2058
|
+
}
|
|
2059
|
+
setDisabledState(isDisabled) {
|
|
2060
|
+
if (this.quillInstance) {
|
|
2061
|
+
this.quillInstance.enable(!isDisabled);
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RichTextAreaComponent, deps: [{ token: i1$3.NgControl }, { token: i0.ChangeDetectorRef }, { token: QuillStyleLoaderService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
2065
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: RichTextAreaComponent, isStandalone: false, selector: "fx-ui-rich-text-area", inputs: { placeholder: "placeholder", toolbarOptions: "toolbarOptions" }, outputs: { contentChange: "contentChange" }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"w-full rounded-2xl shadow-sm p-1 bg-bg-primary\">\n <div #editorContainer class=\"min-h-[200px] text-base\"></div>\n</div>", styles: [":host{display:block}.ql-toolbar{border-top-left-radius:.25rem;border-top-right-radius:.25rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--border-default) / var(--tw-border-opacity, 1));padding:.5rem}.ql-container{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.ql-editor{min-height:200px;padding:.75rem;font-size:1rem;line-height:1.5rem}\n"] });
|
|
2066
|
+
}
|
|
2067
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: RichTextAreaComponent, decorators: [{
|
|
2068
|
+
type: Component,
|
|
2069
|
+
args: [{ selector: 'fx-ui-rich-text-area', standalone: false, template: "<div class=\"w-full rounded-2xl shadow-sm p-1 bg-bg-primary\">\n <div #editorContainer class=\"min-h-[200px] text-base\"></div>\n</div>", styles: [":host{display:block}.ql-toolbar{border-top-left-radius:.25rem;border-top-right-radius:.25rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--border-default) / var(--tw-border-opacity, 1));padding:.5rem}.ql-container{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.ql-editor{min-height:200px;padding:.75rem;font-size:1rem;line-height:1.5rem}\n"] }]
|
|
2070
|
+
}], ctorParameters: () => [{ type: i1$3.NgControl }, { type: i0.ChangeDetectorRef }, { type: QuillStyleLoaderService }, { type: Object, decorators: [{
|
|
2071
|
+
type: Inject,
|
|
2072
|
+
args: [PLATFORM_ID]
|
|
2073
|
+
}] }], propDecorators: { editorContainer: [{
|
|
2074
|
+
type: ViewChild,
|
|
2075
|
+
args: ['editorContainer', { static: true }]
|
|
2076
|
+
}], placeholder: [{
|
|
2077
|
+
type: Input
|
|
2078
|
+
}], toolbarOptions: [{
|
|
2079
|
+
type: Input
|
|
2080
|
+
}], contentChange: [{
|
|
2081
|
+
type: Output
|
|
2082
|
+
}] } });
|
|
2083
|
+
|
|
1867
2084
|
class SearchBarComponent extends FxComponent {
|
|
1868
2085
|
ref;
|
|
1869
2086
|
placeholder = 'Search...';
|
|
@@ -1918,13 +2135,49 @@ class SelectComponent extends FxComponent {
|
|
|
1918
2135
|
errorMessages = {};
|
|
1919
2136
|
required = false;
|
|
1920
2137
|
class;
|
|
2138
|
+
enableSearch = false;
|
|
2139
|
+
searchFn;
|
|
2140
|
+
searchTerm = '';
|
|
2141
|
+
filteredOptions = [];
|
|
2142
|
+
search$ = new Subject();
|
|
1921
2143
|
constructor(ngControl, ref) {
|
|
1922
2144
|
super(ngControl);
|
|
1923
2145
|
this.ref = ref;
|
|
1924
2146
|
}
|
|
2147
|
+
ngOnInit() {
|
|
2148
|
+
this.filteredOptions = this.options;
|
|
2149
|
+
this.search$
|
|
2150
|
+
.pipe(debounceTime(300), distinctUntilChanged())
|
|
2151
|
+
.subscribe((term) => this.performSearch(term));
|
|
2152
|
+
}
|
|
1925
2153
|
ngAfterViewInit() {
|
|
1926
2154
|
this.ref.detectChanges();
|
|
1927
2155
|
}
|
|
2156
|
+
onOpened(open) {
|
|
2157
|
+
if (open) {
|
|
2158
|
+
this.filteredOptions = this.options;
|
|
2159
|
+
if (this.enableSearch)
|
|
2160
|
+
this.searchTerm = '';
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
onSearchChange(value) {
|
|
2164
|
+
if (!this.enableSearch)
|
|
2165
|
+
return;
|
|
2166
|
+
this.search$.next(value);
|
|
2167
|
+
}
|
|
2168
|
+
async performSearch(term) {
|
|
2169
|
+
if (!this.enableSearch)
|
|
2170
|
+
return;
|
|
2171
|
+
if (!this.searchFn) {
|
|
2172
|
+
this.filteredOptions = this.options.filter((o) => o.label?.toLowerCase().includes(term.toLowerCase()));
|
|
2173
|
+
this.ref.detectChanges();
|
|
2174
|
+
return;
|
|
2175
|
+
}
|
|
2176
|
+
const result = await this.searchFn(term);
|
|
2177
|
+
this.filteredOptions = result;
|
|
2178
|
+
console.log(this.filteredOptions);
|
|
2179
|
+
Promise.resolve().then(() => this.ref.detectChanges());
|
|
2180
|
+
}
|
|
1928
2181
|
onSelectionChange(value) {
|
|
1929
2182
|
this.value = value;
|
|
1930
2183
|
this.onChange(this.value);
|
|
@@ -1936,11 +2189,11 @@ class SelectComponent extends FxComponent {
|
|
|
1936
2189
|
return this.value === value;
|
|
1937
2190
|
}
|
|
1938
2191
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SelectComponent, deps: [{ token: i1$3.NgControl }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1939
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: SelectComponent, isStandalone: false, selector: "fx-ui-select", inputs: { label: "label", placeholder: "placeholder", options: "options", multiple: "multiple", disabled: "disabled", errorMessages: "errorMessages", required: "required", class: "class" }, usesInheritance: true, ngImport: i0, template: "<div class=\"mb-4 text-left w-full\" [class]=\"class\">\n <label *ngIf=\"label\" class=\"block txt-field-label\">\n {{ label }}\n @if(required) {<span class=\"txt-required\">*</span>}\n </label>\n\n <mat-form-field class=\"fx-select-field w-full shadow-sm\" appearance=\"fill\">\n <mat-select\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event.value)\"\n (blur)=\"onTouched()\"\n >\n <mat-option *ngFor=\"let option of
|
|
2192
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: SelectComponent, isStandalone: false, selector: "fx-ui-select", inputs: { label: "label", placeholder: "placeholder", options: "options", multiple: "multiple", disabled: "disabled", errorMessages: "errorMessages", required: "required", class: "class", enableSearch: "enableSearch", searchFn: "searchFn" }, usesInheritance: true, ngImport: i0, template: "<div class=\"mb-4 text-left w-full\" [class]=\"class\">\n <label *ngIf=\"label\" class=\"block txt-field-label\">\n {{ label }}\n @if(required) {<span class=\"txt-required\">*</span>}\n </label>\n\n <mat-form-field class=\"fx-select-field w-full shadow-sm\" appearance=\"fill\">\n <mat-select\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event.value)\"\n (openedChange)=\"onOpened($event)\"\n (blur)=\"onTouched()\"\n >\n @if(enableSearch){\n <div class=\"px-semi w-full\">\n <input\n type=\"text\"\n [placeholder]=\"'Search'\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n (click)=\"$event.stopPropagation()\"\n class=\"text-text-primary placeholder:text-text-placeholder w-full bg-bg-primary border-b px-semi py-normal border-border-default focus:outline-none focus:border-border-interactive text-sm text-text-primary tracking-normal ring-0 transition-colors duration-500 ease-in-out\"\n />\n </div>\n }\n <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option.value\">\n <span class=\"txt-default\">{{ option.label }}</span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div *ngIf=\"invalid\" class=\"txt-invalid text-left\">\n {{ getErrorMessage(label) }}\n </div>\n</div>\n", styles: ["::ng-deep .fx-select-field{display:block!important;width:100%!important;margin:0!important;padding:0!important;border-radius:.75rem;box-shadow:0 1px 1px rgb(var(--border-default))}::ng-deep .fx-select-field .mat-mdc-form-field-wrapper,::ng-deep .fx-select-field .mat-mdc-text-field-wrapper{padding:0!important;margin:0!important;width:100%!important}::ng-deep .fx-select-field .mdc-text-field{width:100%!important;margin:0!important;padding:0!important;--mdc-shape-small: 0 !important}::ng-deep .fx-select-field .mat-mdc-form-field-flex{width:100%!important;margin:0!important;padding:0 .75rem!important;border:1px solid rgb(var(--border-default));border-radius:.5rem;height:36px!important;align-items:center;background-color:rgb(var(--bg-primary))}::ng-deep .fx-select-field .mdc-notched-outline,::ng-deep .fx-select-field .mat-mdc-form-field-subscript-wrapper{display:none!important}::ng-deep .fx-select-field.mat-focused .mat-mdc-form-field-flex{border:2px solid rgb(var(--border-interactive))!important;outline:none!important;border-radius:.5rem}::ng-deep .fx-select-field.mat-form-field-invalid .mat-mdc-form-field-flex{border-color:#ef4444!important;box-shadow:none!important}::ng-deep .fx-select-field .mat-mdc-select-trigger{padding:0!important;margin:0!important}::ng-deep .fx-select-field .mat-mdc-select-arrow-wrapper{margin-right:0!important}::ng-deep .fx-select-field .mat-mdc-select-arrow-wrapper{color:rgb(var(--text-primary))}::ng-deep .mat-mdc-select-panel{background-color:rgb(var(--bg-primary))!important;border:1px solid rgb(var(--border-default))!important;border-radius:.5rem!important;box-shadow:0 2px 4px #0000001a!important}::ng-deep .fx-select-field .mat-mdc-select-placeholder{color:rgb(var(--text-placeholder))!important;font-size:14px}::ng-deep .fx-select-field .mat-mdc-select-value{color:rgb(var(--text-primary))!important;font-size:14px;font-weight:400}.mat-select-panel .search-option-full-width{padding-left:0!important;padding-right:0!important;display:block;pointer-events:none;line-height:initial;height:auto}.mat-select-panel .search-option-full-width .search-bar{width:100%;padding:8px 16px;border:none;border-bottom:1px solid #ddd;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i3$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] });
|
|
1940
2193
|
}
|
|
1941
2194
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SelectComponent, decorators: [{
|
|
1942
2195
|
type: Component,
|
|
1943
|
-
args: [{ selector: 'fx-ui-select', standalone: false, template: "<div class=\"mb-4 text-left w-full\" [class]=\"class\">\n <label *ngIf=\"label\" class=\"block txt-field-label\">\n {{ label }}\n @if(required) {<span class=\"txt-required\">*</span>}\n </label>\n\n <mat-form-field class=\"fx-select-field w-full shadow-sm\" appearance=\"fill\">\n <mat-select\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event.value)\"\n (blur)=\"onTouched()\"\n >\n <mat-option *ngFor=\"let option of
|
|
2196
|
+
args: [{ selector: 'fx-ui-select', standalone: false, template: "<div class=\"mb-4 text-left w-full\" [class]=\"class\">\n <label *ngIf=\"label\" class=\"block txt-field-label\">\n {{ label }}\n @if(required) {<span class=\"txt-required\">*</span>}\n </label>\n\n <mat-form-field class=\"fx-select-field w-full shadow-sm\" appearance=\"fill\">\n <mat-select\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event.value)\"\n (openedChange)=\"onOpened($event)\"\n (blur)=\"onTouched()\"\n >\n @if(enableSearch){\n <div class=\"px-semi w-full\">\n <input\n type=\"text\"\n [placeholder]=\"'Search'\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n (click)=\"$event.stopPropagation()\"\n class=\"text-text-primary placeholder:text-text-placeholder w-full bg-bg-primary border-b px-semi py-normal border-border-default focus:outline-none focus:border-border-interactive text-sm text-text-primary tracking-normal ring-0 transition-colors duration-500 ease-in-out\"\n />\n </div>\n }\n <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option.value\">\n <span class=\"txt-default\">{{ option.label }}</span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div *ngIf=\"invalid\" class=\"txt-invalid text-left\">\n {{ getErrorMessage(label) }}\n </div>\n</div>\n", styles: ["::ng-deep .fx-select-field{display:block!important;width:100%!important;margin:0!important;padding:0!important;border-radius:.75rem;box-shadow:0 1px 1px rgb(var(--border-default))}::ng-deep .fx-select-field .mat-mdc-form-field-wrapper,::ng-deep .fx-select-field .mat-mdc-text-field-wrapper{padding:0!important;margin:0!important;width:100%!important}::ng-deep .fx-select-field .mdc-text-field{width:100%!important;margin:0!important;padding:0!important;--mdc-shape-small: 0 !important}::ng-deep .fx-select-field .mat-mdc-form-field-flex{width:100%!important;margin:0!important;padding:0 .75rem!important;border:1px solid rgb(var(--border-default));border-radius:.5rem;height:36px!important;align-items:center;background-color:rgb(var(--bg-primary))}::ng-deep .fx-select-field .mdc-notched-outline,::ng-deep .fx-select-field .mat-mdc-form-field-subscript-wrapper{display:none!important}::ng-deep .fx-select-field.mat-focused .mat-mdc-form-field-flex{border:2px solid rgb(var(--border-interactive))!important;outline:none!important;border-radius:.5rem}::ng-deep .fx-select-field.mat-form-field-invalid .mat-mdc-form-field-flex{border-color:#ef4444!important;box-shadow:none!important}::ng-deep .fx-select-field .mat-mdc-select-trigger{padding:0!important;margin:0!important}::ng-deep .fx-select-field .mat-mdc-select-arrow-wrapper{margin-right:0!important}::ng-deep .fx-select-field .mat-mdc-select-arrow-wrapper{color:rgb(var(--text-primary))}::ng-deep .mat-mdc-select-panel{background-color:rgb(var(--bg-primary))!important;border:1px solid rgb(var(--border-default))!important;border-radius:.5rem!important;box-shadow:0 2px 4px #0000001a!important}::ng-deep .fx-select-field .mat-mdc-select-placeholder{color:rgb(var(--text-placeholder))!important;font-size:14px}::ng-deep .fx-select-field .mat-mdc-select-value{color:rgb(var(--text-primary))!important;font-size:14px;font-weight:400}.mat-select-panel .search-option-full-width{padding-left:0!important;padding-right:0!important;display:block;pointer-events:none;line-height:initial;height:auto}.mat-select-panel .search-option-full-width .search-bar{width:100%;padding:8px 16px;border:none;border-bottom:1px solid #ddd;box-sizing:border-box}\n"] }]
|
|
1944
2197
|
}], ctorParameters: () => [{ type: i1$3.NgControl }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
|
|
1945
2198
|
type: Input
|
|
1946
2199
|
}], placeholder: [{
|
|
@@ -1957,6 +2210,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
1957
2210
|
type: Input
|
|
1958
2211
|
}], class: [{
|
|
1959
2212
|
type: Input
|
|
2213
|
+
}], enableSearch: [{
|
|
2214
|
+
type: Input
|
|
2215
|
+
}], searchFn: [{
|
|
2216
|
+
type: Input
|
|
2217
|
+
}] } });
|
|
2218
|
+
|
|
2219
|
+
class SkeletonTableLoadingComponent {
|
|
2220
|
+
columns = 5;
|
|
2221
|
+
rows = 5;
|
|
2222
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SkeletonTableLoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2223
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: SkeletonTableLoadingComponent, isStandalone: false, selector: "fx-ui-skeleton-table-loading", inputs: { columns: "columns", rows: "rows" }, ngImport: i0, template: "<div class=\"w-full animate-pulse space-y-normal\">\n <div\n class=\"grid gap-small\"\n [ngStyle]=\"{ 'grid-template-columns': 'repeat(' + columns + ', minmax(0, 1fr))' }\"\n >\n @for(col of [].constructor(columns); track col) {\n <div class=\"h-6 bg-bg-hover rounded\"></div>\n }\n </div>\n\n @for(row of [].constructor(rows); track row) {\n <div\n class=\"grid gap-small\"\n [ngStyle]=\"{ 'grid-template-columns': 'repeat(' + columns + ', minmax(0, 1fr))' }\"\n >\n @for(col of [].constructor(columns); track col) {\n <div class=\"h-7 bg-bg-hover rounded\"></div>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
2224
|
+
}
|
|
2225
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SkeletonTableLoadingComponent, decorators: [{
|
|
2226
|
+
type: Component,
|
|
2227
|
+
args: [{ selector: 'fx-ui-skeleton-table-loading', standalone: false, template: "<div class=\"w-full animate-pulse space-y-normal\">\n <div\n class=\"grid gap-small\"\n [ngStyle]=\"{ 'grid-template-columns': 'repeat(' + columns + ', minmax(0, 1fr))' }\"\n >\n @for(col of [].constructor(columns); track col) {\n <div class=\"h-6 bg-bg-hover rounded\"></div>\n }\n </div>\n\n @for(row of [].constructor(rows); track row) {\n <div\n class=\"grid gap-small\"\n [ngStyle]=\"{ 'grid-template-columns': 'repeat(' + columns + ', minmax(0, 1fr))' }\"\n >\n @for(col of [].constructor(columns); track col) {\n <div class=\"h-7 bg-bg-hover rounded\"></div>\n }\n </div>\n }\n</div>\n" }]
|
|
2228
|
+
}], propDecorators: { columns: [{
|
|
2229
|
+
type: Input
|
|
2230
|
+
}], rows: [{
|
|
2231
|
+
type: Input
|
|
1960
2232
|
}] } });
|
|
1961
2233
|
|
|
1962
2234
|
class SliderComponent extends FxComponent {
|
|
@@ -2137,11 +2409,11 @@ class SwitchComponent extends FxComponent {
|
|
|
2137
2409
|
this.onTouched();
|
|
2138
2410
|
}
|
|
2139
2411
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SwitchComponent, deps: [{ token: i1$3.NgControl }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2140
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: SwitchComponent, isStandalone: false, selector: "fx-ui-switch", inputs: { disabled: "disabled" }, outputs: { onSwitch: "onSwitch" }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"relative
|
|
2412
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: SwitchComponent, isStandalone: false, selector: "fx-ui-switch", inputs: { disabled: "disabled" }, outputs: { onSwitch: "onSwitch" }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"relative flex items-center w-10 h-5 rounded-full transition-colors duration-300 cursor-pointer\"\n [ngClass]=\"{\n 'bg-success': value && !disabled,\n 'bg-button-default': !value && !disabled,\n 'bg-bg-hover': disabled\n }\"\n (click)=\"toggle()\"\n>\n @if(value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute left-0.5 top-0 text-text-inverse\">check</i>\n \n }\n @if(!value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute right-0.5 top-0 text-text-inverse\">close</i>\n }\n <div\n class=\"absolute top-0.5 left-0.5 w-4 h-4 bg-text-inverse rounded-full shadow-md transform transition-transform duration-300\"\n [ngClass]=\"{ 'translate-x-5': value }\"\n ></div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
2141
2413
|
}
|
|
2142
2414
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: SwitchComponent, decorators: [{
|
|
2143
2415
|
type: Component,
|
|
2144
|
-
args: [{ selector: 'fx-ui-switch', standalone: false, template: "<div\n class=\"relative
|
|
2416
|
+
args: [{ selector: 'fx-ui-switch', standalone: false, template: "<div\n class=\"relative flex items-center w-10 h-5 rounded-full transition-colors duration-300 cursor-pointer\"\n [ngClass]=\"{\n 'bg-success': value && !disabled,\n 'bg-button-default': !value && !disabled,\n 'bg-bg-hover': disabled\n }\"\n (click)=\"toggle()\"\n>\n @if(value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute left-0.5 top-0 text-text-inverse\">check</i>\n \n }\n @if(!value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute right-0.5 top-0 text-text-inverse\">close</i>\n }\n <div\n class=\"absolute top-0.5 left-0.5 w-4 h-4 bg-text-inverse rounded-full shadow-md transform transition-transform duration-300\"\n [ngClass]=\"{ 'translate-x-5': value }\"\n ></div>\n</div>\n" }]
|
|
2145
2417
|
}], ctorParameters: () => [{ type: i1$3.NgControl }, { type: i0.ChangeDetectorRef }], propDecorators: { disabled: [{
|
|
2146
2418
|
type: Input
|
|
2147
2419
|
}], onSwitch: [{
|
|
@@ -2313,34 +2585,44 @@ const FX_COMPONENTS = [
|
|
|
2313
2585
|
TagComponent,
|
|
2314
2586
|
ChartComponent,
|
|
2315
2587
|
SliderComponent,
|
|
2316
|
-
SwitchComponent
|
|
2588
|
+
SwitchComponent,
|
|
2589
|
+
RichTextAreaComponent,
|
|
2590
|
+
SkeletonTableLoadingComponent
|
|
2317
2591
|
];
|
|
2318
2592
|
|
|
2319
2593
|
class ConfirmationDialogComponent {
|
|
2320
2594
|
ref;
|
|
2595
|
+
bindings;
|
|
2596
|
+
loading = false;
|
|
2321
2597
|
title = '';
|
|
2322
2598
|
message = '';
|
|
2323
2599
|
cancelLabel = 'Cancel';
|
|
2324
2600
|
confirmLabel = 'Submit';
|
|
2325
2601
|
constructor(ref, bindings) {
|
|
2326
2602
|
this.ref = ref;
|
|
2603
|
+
this.bindings = bindings;
|
|
2327
2604
|
this.title = _.get(bindings, 'title');
|
|
2328
2605
|
this.message = _.get(bindings, 'message');
|
|
2329
2606
|
this.cancelLabel = _.get(bindings, 'cancelLabel');
|
|
2330
2607
|
this.confirmLabel = _.get(bindings, 'confirmLabel');
|
|
2331
2608
|
}
|
|
2332
|
-
accept() {
|
|
2609
|
+
async accept() {
|
|
2610
|
+
this.loading = true;
|
|
2611
|
+
if (_.get(this.bindings, 'callback')) {
|
|
2612
|
+
await this.bindings.callback();
|
|
2613
|
+
this.loading = false;
|
|
2614
|
+
}
|
|
2333
2615
|
this.ref.close(true);
|
|
2334
2616
|
}
|
|
2335
2617
|
cancel() {
|
|
2336
2618
|
this.ref.close(false);
|
|
2337
2619
|
}
|
|
2338
2620
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ConfirmationDialogComponent, deps: [{ token: i1$1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
2339
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ConfirmationDialogComponent, isStandalone: false, selector: "ui-confirmation", ngImport: i0, template: "<div animate.enter=\"fade-in-animation\">\n <div class=\"txt-
|
|
2621
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ConfirmationDialogComponent, isStandalone: false, selector: "fx-ui-confirmation-dialog", ngImport: i0, template: "<div animate.enter=\"fade-in-animation\" class=\"dialog-container\">\n <div class=\"txt-dialog-header\">{{ title }}</div>\n <mat-dialog-content>\n <div class=\"txt-default\">{{ message }}</div>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <fx-ui-button class=\"mr-1\" [label]=\"cancelLabel\" (clicked)=\"cancel()\"></fx-ui-button>\n <fx-ui-button buttonVariant=\"primary\" class=\"mr-1\" [label]=\"confirmLabel\" (clicked)=\"accept()\" [loading]=\"loading\" class=\"min-w-[100px]\"></fx-ui-button>\n </mat-dialog-actions>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: ButtonComponent, selector: "fx-ui-button", inputs: ["label", "disabled", "buttonVariant", "icon", "class", "loading"], outputs: ["clicked"] }] });
|
|
2340
2622
|
}
|
|
2341
2623
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
|
|
2342
2624
|
type: Component,
|
|
2343
|
-
args: [{ selector: 'ui-confirmation', standalone: false, template: "<div animate.enter=\"fade-in-animation\">\n <div class=\"txt-
|
|
2625
|
+
args: [{ selector: 'fx-ui-confirmation-dialog', standalone: false, template: "<div animate.enter=\"fade-in-animation\" class=\"dialog-container\">\n <div class=\"txt-dialog-header\">{{ title }}</div>\n <mat-dialog-content>\n <div class=\"txt-default\">{{ message }}</div>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <fx-ui-button class=\"mr-1\" [label]=\"cancelLabel\" (clicked)=\"cancel()\"></fx-ui-button>\n <fx-ui-button buttonVariant=\"primary\" class=\"mr-1\" [label]=\"confirmLabel\" (clicked)=\"accept()\" [loading]=\"loading\" class=\"min-w-[100px]\"></fx-ui-button>\n </mat-dialog-actions>\n</div>\n" }]
|
|
2344
2626
|
}], ctorParameters: () => [{ type: i1$1.MatDialogRef }, { type: undefined, decorators: [{
|
|
2345
2627
|
type: Inject,
|
|
2346
2628
|
args: [MAT_DIALOG_DATA]
|
|
@@ -2361,20 +2643,21 @@ const MY_FORMATS = {
|
|
|
2361
2643
|
};
|
|
2362
2644
|
class UiModule {
|
|
2363
2645
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
2364
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: UiModule, declarations: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, ConfirmationDialogComponent], imports: [CommonModule,
|
|
2646
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: UiModule, declarations: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, RichTextAreaComponent, SkeletonTableLoadingComponent, ConfirmationDialogComponent], imports: [CommonModule,
|
|
2365
2647
|
FormsModule,
|
|
2366
2648
|
ReactiveFormsModule,
|
|
2367
2649
|
OwlDateTimeModule,
|
|
2368
2650
|
OwlNativeDateTimeModule,
|
|
2369
2651
|
HasPermissionDirective,
|
|
2370
|
-
|
|
2652
|
+
TrimOnBlurDirective,
|
|
2653
|
+
NgHeroiconsModule, i2$3.NgxEchartsModule, i3$1.MatSelectModule, i25.MatRadioModule, i26.MatButtonModule, i27.MatIconModule, i28.MatPaginatorModule, i29.MatTableModule, i30.MatSnackBarModule, i1$1.MatDialogModule, i32.MatCheckboxModule, i33.MatCardModule, i34.MatDatepickerModule, i35.MatTimepickerModule, i36.MatBadgeModule, i37.MatExpansionModule, i38.MatFormFieldModule], exports: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, RichTextAreaComponent, SkeletonTableLoadingComponent, ConfirmationDialogComponent,
|
|
2371
2654
|
// Module
|
|
2372
2655
|
FormsModule,
|
|
2373
2656
|
ReactiveFormsModule,
|
|
2374
2657
|
OwlDateTimeModule,
|
|
2375
2658
|
OwlNativeDateTimeModule,
|
|
2376
2659
|
HasPermissionDirective,
|
|
2377
|
-
NgHeroiconsModule, i3$1.MatSelectModule,
|
|
2660
|
+
NgHeroiconsModule, i3$1.MatSelectModule, i25.MatRadioModule, i26.MatButtonModule, i27.MatIconModule, i28.MatPaginatorModule, i29.MatTableModule, i30.MatSnackBarModule, i1$1.MatDialogModule, i32.MatCheckboxModule, i33.MatCardModule, i34.MatDatepickerModule, i35.MatTimepickerModule, i36.MatBadgeModule, i37.MatExpansionModule, i38.MatFormFieldModule] });
|
|
2378
2661
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, providers: [
|
|
2379
2662
|
importProvidersFrom(NgHeroiconsModule.forRoot()),
|
|
2380
2663
|
// { provide: OWL_DATE_TIME_FORMATS, useValue: MY_FORMATS },
|
|
@@ -2390,7 +2673,7 @@ class UiModule {
|
|
|
2390
2673
|
ReactiveFormsModule,
|
|
2391
2674
|
OwlDateTimeModule,
|
|
2392
2675
|
OwlNativeDateTimeModule,
|
|
2393
|
-
NgHeroiconsModule, i3$1.MatSelectModule,
|
|
2676
|
+
NgHeroiconsModule, i3$1.MatSelectModule, i25.MatRadioModule, i26.MatButtonModule, i27.MatIconModule, i28.MatPaginatorModule, i29.MatTableModule, i30.MatSnackBarModule, i1$1.MatDialogModule, i32.MatCheckboxModule, i33.MatCardModule, i34.MatDatepickerModule, i35.MatTimepickerModule, i36.MatBadgeModule, i37.MatExpansionModule, i38.MatFormFieldModule] });
|
|
2394
2677
|
}
|
|
2395
2678
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, decorators: [{
|
|
2396
2679
|
type: NgModule,
|
|
@@ -2403,6 +2686,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
2403
2686
|
OwlDateTimeModule,
|
|
2404
2687
|
OwlNativeDateTimeModule,
|
|
2405
2688
|
HasPermissionDirective,
|
|
2689
|
+
TrimOnBlurDirective,
|
|
2406
2690
|
NgHeroiconsModule,
|
|
2407
2691
|
NgxEchartsModule.forRoot({ echarts: () => import('echarts') }),
|
|
2408
2692
|
...MATERIAL_MODULE,
|
|
@@ -2435,5 +2719,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
|
|
|
2435
2719
|
* Generated bundle index. Do not edit.
|
|
2436
2720
|
*/
|
|
2437
2721
|
|
|
2438
|
-
export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, ChartComponent, CheckboxComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, FxLoadingService, FxStorageService, FxToastrService, FxUtils, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InputComponent, LoadingPanel, MY_FORMATS, PermissionGuard, PermissionService, RadioButtonComponent, RadioButtonToggleComponent, SearchBarComponent, SelectComponent, SliderComponent, SwitchComponent, TabComponent, TabGroupComponent, TagComponent, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, UiModule };
|
|
2722
|
+
export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, ChartComponent, CheckboxComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, FxLoadingService, FxStorageService, FxToastrService, FxUtils, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InputComponent, LoadingPanel, MY_FORMATS, PermissionGuard, PermissionService, QuillStyleLoaderService, RadioButtonComponent, RadioButtonToggleComponent, RichTextAreaComponent, SearchBarComponent, SelectComponent, SkeletonTableLoadingComponent, SliderComponent, SwitchComponent, TabComponent, TabGroupComponent, TagComponent, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TrimOnBlurDirective, UiModule };
|
|
2439
2723
|
//# sourceMappingURL=fxlt-common-ui.mjs.map
|