@brggroup/share-lib 0.1.64 → 0.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/fesm2022/brggroup-share-lib.mjs +842 -347
  2. package/fesm2022/brggroup-share-lib.mjs.map +1 -1
  3. package/lib/admin/component/file/list/file-list.d.ts +0 -1
  4. package/lib/admin/component/file/list/file-list.d.ts.map +1 -1
  5. package/lib/admin/component/index.d.ts +1 -0
  6. package/lib/admin/component/index.d.ts.map +1 -1
  7. package/lib/admin/component/menu/list/menu-list.d.ts.map +1 -1
  8. package/lib/admin/component/org/list/org-list.d.ts.map +1 -1
  9. package/lib/admin/component/permission/permission.component.d.ts.map +1 -1
  10. package/lib/admin/component/permission/permission.model.d.ts +2 -0
  11. package/lib/admin/component/permission/permission.model.d.ts.map +1 -1
  12. package/lib/admin/component/permission/role-menu/role-menu.d.ts +5 -6
  13. package/lib/admin/component/permission/role-menu/role-menu.d.ts.map +1 -1
  14. package/lib/admin/component/permission/role-permission/role-permission.component.d.ts +6 -3
  15. package/lib/admin/component/permission/role-permission/role-permission.component.d.ts.map +1 -1
  16. package/lib/admin/component/permission/role-permission/role-permission.model.d.ts +8 -3
  17. package/lib/admin/component/permission/role-permission/role-permission.model.d.ts.map +1 -1
  18. package/lib/admin/component/permission/user-role/user-role.d.ts +5 -6
  19. package/lib/admin/component/permission/user-role/user-role.d.ts.map +1 -1
  20. package/lib/admin/component/synology/synology.d.ts +39 -0
  21. package/lib/admin/component/synology/synology.d.ts.map +1 -0
  22. package/lib/admin/component/synology/synology.service.d.ts +14 -0
  23. package/lib/admin/component/synology/synology.service.d.ts.map +1 -0
  24. package/lib/admin/component/user/detail/user-detail.d.ts.map +1 -1
  25. package/lib/admin/model/dic-domain.model.d.ts +1 -3
  26. package/lib/admin/model/dic-domain.model.d.ts.map +1 -1
  27. package/lib/admin/model/file.model.d.ts +1 -0
  28. package/lib/admin/model/file.model.d.ts.map +1 -1
  29. package/lib/admin/model/menu.model.d.ts +4 -2
  30. package/lib/admin/model/menu.model.d.ts.map +1 -1
  31. package/lib/admin/model/org.model.d.ts +1 -0
  32. package/lib/admin/model/org.model.d.ts.map +1 -1
  33. package/lib/admin/model/role.model.d.ts +1 -0
  34. package/lib/admin/model/role.model.d.ts.map +1 -1
  35. package/lib/admin/model/setting.model.d.ts +1 -0
  36. package/lib/admin/model/setting.model.d.ts.map +1 -1
  37. package/lib/admin/model/user.model.d.ts +1 -2
  38. package/lib/admin/model/user.model.d.ts.map +1 -1
  39. package/lib/admin/service/file.service.d.ts.map +1 -1
  40. package/lib/admin/service/index.d.ts +1 -0
  41. package/lib/admin/service/index.d.ts.map +1 -1
  42. package/lib/admin/service/mail-template.service.d.ts +30 -0
  43. package/lib/admin/service/mail-template.service.d.ts.map +1 -0
  44. package/lib/components/base.component.d.ts.map +1 -1
  45. package/lib/components/extend/extend-checkbox-3-value/extend-checkbox.d.ts +27 -0
  46. package/lib/components/extend/extend-checkbox-3-value/extend-checkbox.d.ts.map +1 -0
  47. package/lib/components/index.d.ts +1 -0
  48. package/lib/components/index.d.ts.map +1 -1
  49. package/lib/components/layout/layout.component.d.ts.map +1 -1
  50. package/lib/components/layout/menu/side-menu/side-menu.d.ts +11 -0
  51. package/lib/components/layout/menu/side-menu/side-menu.d.ts.map +1 -0
  52. package/lib/helper/date.helper.d.ts +1 -1
  53. package/lib/model.d.ts +5 -1
  54. package/lib/model.d.ts.map +1 -1
  55. package/lib/pipe/index.d.ts +1 -0
  56. package/lib/pipe/index.d.ts.map +1 -1
  57. package/lib/services/setting.service.d.ts +1 -0
  58. package/lib/services/setting.service.d.ts.map +1 -1
  59. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Injectable, InjectionToken, NgZone, DestroyRef, Component, HostListener, ViewContainerRef, EventEmitter, Input, Output, ViewChild, Directive, Optional, Self, HostBinding, Pipe, ChangeDetectorRef, forwardRef, ChangeDetectionStrategy } from '@angular/core';
3
3
  import * as i1$4 from '@angular/router';
4
- import { Router, ActivatedRoute, NavigationEnd, RouterModule, RouterLink, RouterOutlet } from '@angular/router';
4
+ import { Router, ActivatedRoute, NavigationEnd, RouterModule, RouterOutlet, RouterLink } from '@angular/router';
5
5
  import * as i1$8 from '@angular/common/http';
6
6
  import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
7
7
  import * as i3 from '@ngx-translate/core';
@@ -15,7 +15,7 @@ import { switchMap, distinctUntilChanged, filter as filter$1, takeUntil } from '
15
15
  import * as i2 from '@angular/forms';
16
16
  import { FormGroup, FormsModule, ReactiveFormsModule, Validators, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms';
17
17
  import * as i1$1 from '@angular/common';
18
- import { Location, CommonModule, NgTemplateOutlet, DecimalPipe } from '@angular/common';
18
+ import { Location, CommonModule, NgTemplateOutlet, DecimalPipe, DatePipe } from '@angular/common';
19
19
  import { Overlay } from '@angular/cdk/overlay';
20
20
  import { TemplatePortal } from '@angular/cdk/portal';
21
21
  import * as i5 from 'ng-zorro-antd/form';
@@ -435,7 +435,7 @@ class NotiService {
435
435
  }
436
436
  handleError(err) {
437
437
  if (err?.status == 0) {
438
- this.notification.error(this.translate.instant('NO_CONNECT_TO_SERVER'), '', { duration: 20 * 1000 });
438
+ this.notification.error(this.translate.instant('NO_CONNECT_TO_SERVER'), '', { duration: 15 * 1000 });
439
439
  return;
440
440
  }
441
441
  let _data = null;
@@ -630,7 +630,7 @@ class TokenStorage {
630
630
  }
631
631
  }
632
632
 
633
- const URLs$d = {
633
+ const URLs$e = {
634
634
  login: '/api/Auth/Login',
635
635
  register: '/api/Auth/Register',
636
636
  pingAuth: '/api/Auth/PingAuth',
@@ -699,7 +699,7 @@ class AuthService extends HTTPService {
699
699
  }
700
700
  }
701
701
  async sendSignIn(body) {
702
- return firstValueFrom(this.httpClient.post(AppGlobals.apiEndpoint + URLs$d.login, body, {
702
+ return firstValueFrom(this.httpClient.post(AppGlobals.apiEndpoint + URLs$e.login, body, {
703
703
  headers: new HttpHeaders().set('Content-Type', 'application/json').set('No-Loading-Mark', '1'),
704
704
  }));
705
705
  }
@@ -719,7 +719,7 @@ class AuthService extends HTTPService {
719
719
  ---------------------------------------- */
720
720
  async pingAuth() {
721
721
  try {
722
- const res = await this.get(AppGlobals.apiEndpoint + URLs$d.pingAuth, true);
722
+ const res = await this.get(AppGlobals.apiEndpoint + URLs$e.pingAuth, true);
723
723
  return res?.IsSuccess;
724
724
  }
725
725
  catch {
@@ -751,10 +751,10 @@ class AuthService extends HTTPService {
751
751
  PASSWORD
752
752
  ---------------------------------------- */
753
753
  changePassword(data) {
754
- return this.postData(AppGlobals.apiEndpoint + URLs$d.changePassword, data);
754
+ return this.postData(AppGlobals.apiEndpoint + URLs$e.changePassword, data);
755
755
  }
756
756
  setPass(data) {
757
- return this.postData(AppGlobals.apiEndpoint + URLs$d.setPass, data);
757
+ return this.postData(AppGlobals.apiEndpoint + URLs$e.setPass, data);
758
758
  }
759
759
  /* ----------------------------------------
760
760
  REGISTER
@@ -775,7 +775,7 @@ class AuthService extends HTTPService {
775
775
  }
776
776
  }
777
777
  async sendSignUp(d) {
778
- return this.postData(AppGlobals.apiEndpoint + URLs$d.register, d);
778
+ return this.postData(AppGlobals.apiEndpoint + URLs$e.register, d);
779
779
  }
780
780
  /* ----------------------------------------
781
781
  CHANGE ORG
@@ -797,7 +797,7 @@ class AuthService extends HTTPService {
797
797
  }
798
798
  async sendChangeOrg(App_Org_Id) {
799
799
  let params = new HttpParams().append('App_Org_Id', App_Org_Id);
800
- return this.postParams(AppGlobals.apiEndpoint + URLs$d.changeOrgLogin, params);
800
+ return this.postParams(AppGlobals.apiEndpoint + URLs$e.changeOrgLogin, params);
801
801
  }
802
802
  static pingInterVal;
803
803
  startPingAuth(intervalTime) {
@@ -1421,6 +1421,11 @@ class BaseComponent {
1421
1421
  goto(url, isNewTab = false) {
1422
1422
  if (!url)
1423
1423
  return;
1424
+ let hasHash = false;
1425
+ if (url.startsWith('/#')) {
1426
+ hasHash = true;
1427
+ url = url.replace('/#', '');
1428
+ }
1424
1429
  if (url.startsWith('/')) {
1425
1430
  let currentRoute = this.router.routerState.root.snapshot;
1426
1431
  let currentProjectId = null;
@@ -1470,6 +1475,9 @@ class BaseComponent {
1470
1475
  if (url === '')
1471
1476
  url = '/';
1472
1477
  }
1478
+ if (hasHash) {
1479
+ url = '/#' + url;
1480
+ }
1473
1481
  console.log('goto: ', url, isNewTab);
1474
1482
  if (isNewTab) {
1475
1483
  window.open(url, '_blank');
@@ -1841,11 +1849,11 @@ class ExtendInput {
1841
1849
  }
1842
1850
  }
1843
1851
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ExtendInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
1844
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: ExtendInput, isStandalone: true, selector: "extend-input", inputs: { label: "label", floatingLabel: "floatingLabel", placeHolder: "placeHolder", labelAlign: "labelAlign", inputClass: "inputClass", labelSpan: "labelSpan", labelFlex: "labelFlex", inputFlex: "inputFlex", showClear: "showClear", disabled: "disabled", readOnly: "readOnly", required: "required", noBottom: "noBottom", selectModeType: "selectModeType", autocomplete: "autocomplete", autofocus: "autofocus", inputWidth: "inputWidth", inputHeight: "inputHeight", borderBottomOnly: "borderBottomOnly", displayInline: "displayInline", size: "size", displayField: "displayField", valueField: "valueField", formData: "formData", controlName: "controlName", _ngModel: "_ngModel", isSubmited: "isSubmited" }, outputs: { _ngModelChange: "_ngModelChange", onclickClearIcon: "onclickClearIcon", onenter: "onenter" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"extend-input-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [formControlName]=\"controlName\"\r\n [autocomplete]=\"autocomplete\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n [autocomplete]=\"autocomplete\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [autocomplete]=\"autocomplete\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass + ' ' + (borderBottomOnly ? 'border-bottom-only' : '')\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #clearIcon>\r\n <i\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"twotone\"\r\n nzTwotoneColor=\"#999\"\r\n *ngIf=\"_ngModel\"\r\n (click)=\"_onclickClearIcon()\"\r\n style=\"cursor: pointer; font-size: 13px\"\r\n ></i>\r\n</ng-template>\r\n", styles: ["::ng-deep .extend-input-wrapper.floating-label{position:relative;padding-top:14px}::ng-deep .extend-input-wrapper nz-form-item nz-form-label{position:absolute;top:12px;left:10px;transform:translateY(-50%);background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 80%,#ffffff 80%);z-index:2;height:auto;line-height:normal;padding:0 4px}::ng-deep .extend-input-wrapper nz-form-item nz-form-label label{font-size:12px;color:var(--darkgray, #565656);font-weight:700;height:auto;line-height:normal;padding:0;display:flex;align-items:center}::ng-deep .extend-input-wrapper .full-width{width:100%}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label{background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 60%,#f5f5f5 50%)}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label label{color:#bfbfbf}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }] });
1852
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: ExtendInput, isStandalone: true, selector: "extend-input", inputs: { label: "label", floatingLabel: "floatingLabel", placeHolder: "placeHolder", labelAlign: "labelAlign", inputClass: "inputClass", labelSpan: "labelSpan", labelFlex: "labelFlex", inputFlex: "inputFlex", showClear: "showClear", disabled: "disabled", readOnly: "readOnly", required: "required", noBottom: "noBottom", selectModeType: "selectModeType", autocomplete: "autocomplete", autofocus: "autofocus", inputWidth: "inputWidth", inputHeight: "inputHeight", borderBottomOnly: "borderBottomOnly", displayInline: "displayInline", size: "size", displayField: "displayField", valueField: "valueField", formData: "formData", controlName: "controlName", _ngModel: "_ngModel", isSubmited: "isSubmited" }, outputs: { _ngModelChange: "_ngModelChange", onclickClearIcon: "onclickClearIcon", onenter: "onenter" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"extend-input-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [formControlName]=\"controlName\"\r\n [autocomplete]=\"autocomplete\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n [autocomplete]=\"autocomplete\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [autocomplete]=\"autocomplete\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass + ' ' + (borderBottomOnly ? 'border-bottom-only' : '')\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #clearIcon>\r\n <i\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"twotone\"\r\n nzTwotoneColor=\"#999\"\r\n *ngIf=\"_ngModel\"\r\n (click)=\"_onclickClearIcon()\"\r\n style=\"cursor: pointer; font-size: 13px\"\r\n ></i>\r\n</ng-template>\r\n", styles: ["::ng-deep .extend-input-wrapper.floating-label{position:relative;padding-top:14px}::ng-deep .extend-input-wrapper.floating-label nz-form-item nz-form-label{position:absolute;top:12px;left:10px;transform:translateY(-50%);background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 80%,#ffffff 80%);z-index:2;height:auto;line-height:normal;padding:0 4px}::ng-deep .extend-input-wrapper.floating-label nz-form-item nz-form-label label{font-size:12px;color:var(--darkgray, #565656);font-weight:700;height:auto;line-height:normal;padding:0;display:flex;align-items:center}::ng-deep .extend-input-wrapper .full-width{width:100%}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label{background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 60%,#f5f5f5 50%)}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label label{color:#bfbfbf}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }] });
1845
1853
  }
1846
1854
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ExtendInput, decorators: [{
1847
1855
  type: Component,
1848
- args: [{ selector: 'extend-input', imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzInputModule, NzIconModule], template: "<div\r\n class=\"extend-input-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [formControlName]=\"controlName\"\r\n [autocomplete]=\"autocomplete\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n [autocomplete]=\"autocomplete\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [autocomplete]=\"autocomplete\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass + ' ' + (borderBottomOnly ? 'border-bottom-only' : '')\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #clearIcon>\r\n <i\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"twotone\"\r\n nzTwotoneColor=\"#999\"\r\n *ngIf=\"_ngModel\"\r\n (click)=\"_onclickClearIcon()\"\r\n style=\"cursor: pointer; font-size: 13px\"\r\n ></i>\r\n</ng-template>\r\n", styles: ["::ng-deep .extend-input-wrapper.floating-label{position:relative;padding-top:14px}::ng-deep .extend-input-wrapper nz-form-item nz-form-label{position:absolute;top:12px;left:10px;transform:translateY(-50%);background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 80%,#ffffff 80%);z-index:2;height:auto;line-height:normal;padding:0 4px}::ng-deep .extend-input-wrapper nz-form-item nz-form-label label{font-size:12px;color:var(--darkgray, #565656);font-weight:700;height:auto;line-height:normal;padding:0;display:flex;align-items:center}::ng-deep .extend-input-wrapper .full-width{width:100%}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label{background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 60%,#f5f5f5 50%)}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label label{color:#bfbfbf}\n"] }]
1856
+ args: [{ selector: 'extend-input', imports: [CommonModule, FormsModule, ReactiveFormsModule, TranslateModule, NzFormModule, NzInputModule, NzIconModule], template: "<div\r\n class=\"extend-input-wrapper\"\r\n [ngClass]=\"[floatingLabel && label ? 'floating-label' : '']\"\r\n [ngStyle]=\"{ display: displayInline ? 'inline' : null }\"\r\n>\r\n @if (controlName) {\r\n <div [formGroup]=\"formData\">\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [formControlName]=\"controlName\"\r\n [autocomplete]=\"autocomplete\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n } @else {\r\n @if (label) {\r\n <nz-form-item>\r\n <nz-form-label\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : labelSpan\"\r\n [nzFlex]=\"labelFlex\"\r\n [nzLabelAlign]=\"labelAlign\"\r\n [nzRequired]=\"required\"\r\n [nzFor]=\"controlName\"\r\n nzNoColon\r\n nzLabelWrap\r\n >\r\n {{ label }}\r\n </nz-form-label>\r\n <nz-form-control\r\n [nzSpan]=\"floatingLabel || labelFlex ? null : 24 - labelSpan\"\r\n [nzFlex]=\"inputFlex\"\r\n [ngClass]=\"{ 'full-width': floatingLabel }\"\r\n [nzValidateStatus]=\"customValidateStatus\"\r\n [nzErrorTip]=\"'REQUIRED_FIELD' | translate\"\r\n >\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n [autocomplete]=\"autocomplete\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n } @else {\r\n <nz-input-group [nzSize]=\"size\" [nzSuffix]=\"showClear ? clearIcon : undefined\">\r\n <input\r\n #inputElement\r\n nz-input\r\n [nzSize]=\"size\"\r\n [ngStyle]=\"{\r\n width: inputWidth,\r\n height: inputHeight,\r\n }\"\r\n [id]=\"controlName\"\r\n [name]=\"controlName\"\r\n [(ngModel)]=\"_ngModel\"\r\n (ngModelChange)=\"_onNgModelChange()\"\r\n [autocomplete]=\"autocomplete\"\r\n [disabled]=\"disabled\"\r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"inputClass + ' ' + (borderBottomOnly ? 'border-bottom-only' : '')\"\r\n (keyup.enter)=\"onenter.emit()\"\r\n />\r\n </nz-input-group>\r\n }\r\n }\r\n</div>\r\n\r\n<ng-template #clearIcon>\r\n <i\r\n nz-icon\r\n nzType=\"close-circle\"\r\n nzTheme=\"twotone\"\r\n nzTwotoneColor=\"#999\"\r\n *ngIf=\"_ngModel\"\r\n (click)=\"_onclickClearIcon()\"\r\n style=\"cursor: pointer; font-size: 13px\"\r\n ></i>\r\n</ng-template>\r\n", styles: ["::ng-deep .extend-input-wrapper.floating-label{position:relative;padding-top:14px}::ng-deep .extend-input-wrapper.floating-label nz-form-item nz-form-label{position:absolute;top:12px;left:10px;transform:translateY(-50%);background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 80%,#ffffff 80%);z-index:2;height:auto;line-height:normal;padding:0 4px}::ng-deep .extend-input-wrapper.floating-label nz-form-item nz-form-label label{font-size:12px;color:var(--darkgray, #565656);font-weight:700;height:auto;line-height:normal;padding:0;display:flex;align-items:center}::ng-deep .extend-input-wrapper .full-width{width:100%}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label{background:linear-gradient(to bottom,var(--form-bg-color, #ffffff) 60%,#f5f5f5 50%)}.extend-input-wrapper.floating-label nz-form-item:has(.ant-select-disabled) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(input[disabled]) nz-form-label label,.extend-input-wrapper.floating-label nz-form-item:has(.ant-input-disabled) nz-form-label label{color:#bfbfbf}\n"] }]
1849
1857
  }], propDecorators: { label: [{
1850
1858
  type: Input
1851
1859
  }], floatingLabel: [{
@@ -2038,6 +2046,126 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
2038
2046
  type: Output
2039
2047
  }] } });
2040
2048
 
2049
+ class ExtendCheckbox3Value {
2050
+ label = '';
2051
+ labelSpan = 8;
2052
+ labelFlex = null;
2053
+ paddingTop = '0px';
2054
+ disabled = false;
2055
+ formData;
2056
+ controlName;
2057
+ /**
2058
+ * default: boolean
2059
+ */
2060
+ valueType = 'boolean';
2061
+ get _ngModel() {
2062
+ if (this.checked === null)
2063
+ return null;
2064
+ if (this.valueType === 'boolean')
2065
+ return this.checked;
2066
+ if (this.valueType === 'number')
2067
+ return this.checked ? 1 : 0;
2068
+ if (this.valueType === 'string')
2069
+ return this.checked ? 'Y' : 'N';
2070
+ return null;
2071
+ }
2072
+ set _ngModel(val) {
2073
+ if (!this.controlName) {
2074
+ this.parseValueToChecked(val);
2075
+ }
2076
+ }
2077
+ _ngModelChange = new EventEmitter();
2078
+ checked = null; // Khởi tạo với null
2079
+ ngOnInit() {
2080
+ if (this.controlName && this.formData?.controls[this.controlName]) {
2081
+ const rawVal = this.formData.controls[this.controlName].getRawValue();
2082
+ this.parseValueToChecked(rawVal);
2083
+ this.formData.controls[this.controlName].valueChanges.subscribe((x) => {
2084
+ this.parseValueToChecked(x);
2085
+ });
2086
+ }
2087
+ }
2088
+ // Hàm mapping giá trị từ form sang trạng thái checked
2089
+ parseValueToChecked(val) {
2090
+ if (val === null || val === undefined || val === '') {
2091
+ this.checked = null;
2092
+ return;
2093
+ }
2094
+ if (this.valueType === 'boolean') {
2095
+ this.checked = val === true ? true : val === false ? false : null;
2096
+ }
2097
+ else if (this.valueType === 'number') {
2098
+ this.checked = val === 1 ? true : val === 0 ? false : null;
2099
+ }
2100
+ else {
2101
+ this.checked = val === 'Y' ? true : val === 'N' ? false : null;
2102
+ }
2103
+ }
2104
+ // Hàm xử lý xoay vòng 3 trạng thái khi click
2105
+ cycleState() {
2106
+ if (this.disabled)
2107
+ return;
2108
+ // Vòng lặp: null -> true -> false -> null
2109
+ if (this.checked === null) {
2110
+ this.checked = true;
2111
+ }
2112
+ else if (this.checked === true) {
2113
+ this.checked = false;
2114
+ }
2115
+ else {
2116
+ this.checked = null;
2117
+ }
2118
+ this.emitValue();
2119
+ }
2120
+ emitValue() {
2121
+ let emitVal = null;
2122
+ if (this.checked !== null) {
2123
+ if (this.valueType === 'boolean') {
2124
+ emitVal = this.checked;
2125
+ }
2126
+ else if (this.valueType === 'number') {
2127
+ emitVal = this.checked ? 1 : 0;
2128
+ }
2129
+ else if (this.valueType === 'string') {
2130
+ emitVal = this.checked ? 'Y' : 'N';
2131
+ }
2132
+ }
2133
+ // Cập nhật giá trị ra form hoặc ngModel
2134
+ if (this.controlName && this.formData?.controls[this.controlName]) {
2135
+ this.formData.controls[this.controlName].setValue(emitVal);
2136
+ }
2137
+ else {
2138
+ this._ngModelChange.emit(emitVal);
2139
+ }
2140
+ }
2141
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ExtendCheckbox3Value, deps: [], target: i0.ɵɵFactoryTarget.Component });
2142
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: ExtendCheckbox3Value, isStandalone: true, selector: "extend-checkbox-3-value", inputs: { label: "label", labelSpan: "labelSpan", labelFlex: "labelFlex", paddingTop: "paddingTop", disabled: "disabled", formData: "formData", controlName: "controlName", valueType: "valueType", _ngModel: "_ngModel" }, outputs: { _ngModelChange: "_ngModelChange" }, ngImport: i0, template: "@if (label) {\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"!labelFlex ? labelSpan : null\" [nzFlex]=\"labelFlex\"></div>\r\n <div nz-col nzFlex=\"auto\" [ngStyle]=\"{ 'padding-top': paddingTop }\">\r\n <span\r\n (click)=\"cycleState()\"\r\n [style.cursor]=\"disabled ? 'not-allowed' : 'pointer'\"\r\n [style.opacity]=\"disabled ? '0.5' : '1'\"\r\n style=\"display: inline-flex; align-items: center; gap: 8px; position: relative; top: 5px; user-select: none\"\r\n >\r\n <!-- Tr\u1EA1ng th\u00E1i 1: Ch\u01B0a t\u00EDch (null) -->\r\n @if (checked === null) {\r\n <div\r\n style=\"\r\n width: 16px;\r\n height: 16px;\r\n border: 1px solid #d9d9d9;\r\n border-radius: 4px;\r\n background-color: #fff;\r\n box-sizing: border-box;\r\n \"\r\n ></div>\r\n }\r\n <!-- Tr\u1EA1ng th\u00E1i 2: T\u00EDch l\u1EA7n 1 (true) -->\r\n @else if (checked === true) {\r\n <span\r\n nz-icon\r\n nzType=\"check-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #52c41a; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n }\r\n <!-- Tr\u1EA1ng th\u00E1i 3: T\u00EDch l\u1EA7n 2 (false) -->\r\n @else {\r\n <span\r\n nz-icon\r\n nzType=\"close-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #ff4d4f; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n }\r\n\r\n <span>{{ label }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n} @else {\r\n <span\r\n (click)=\"cycleState()\"\r\n [style.cursor]=\"disabled ? 'not-allowed' : 'pointer'\"\r\n [style.opacity]=\"disabled ? '0.5' : '1'\"\r\n style=\"display: inline-flex; align-items: center; user-select: none; width: 16px; height: 16px\"\r\n >\r\n @if (checked === null) {\r\n <div\r\n style=\"\r\n width: 16px;\r\n height: 16px;\r\n border: 1px solid #d9d9d9;\r\n border-radius: 4px;\r\n background-color: #fff;\r\n box-sizing: border-box;\r\n \"\r\n ></div>\r\n } @else if (checked === true) {\r\n <span\r\n nz-icon\r\n nzType=\"check-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #52c41a; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n } @else {\r\n <span\r\n nz-icon\r\n nzType=\"close-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #ff4d4f; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n }\r\n </span>\r\n}\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }] });
2143
+ }
2144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ExtendCheckbox3Value, decorators: [{
2145
+ type: Component,
2146
+ args: [{ selector: 'extend-checkbox-3-value', imports: [CommonModule, FormsModule, ReactiveFormsModule, NzFormModule, NzIconModule], template: "@if (label) {\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"!labelFlex ? labelSpan : null\" [nzFlex]=\"labelFlex\"></div>\r\n <div nz-col nzFlex=\"auto\" [ngStyle]=\"{ 'padding-top': paddingTop }\">\r\n <span\r\n (click)=\"cycleState()\"\r\n [style.cursor]=\"disabled ? 'not-allowed' : 'pointer'\"\r\n [style.opacity]=\"disabled ? '0.5' : '1'\"\r\n style=\"display: inline-flex; align-items: center; gap: 8px; position: relative; top: 5px; user-select: none\"\r\n >\r\n <!-- Tr\u1EA1ng th\u00E1i 1: Ch\u01B0a t\u00EDch (null) -->\r\n @if (checked === null) {\r\n <div\r\n style=\"\r\n width: 16px;\r\n height: 16px;\r\n border: 1px solid #d9d9d9;\r\n border-radius: 4px;\r\n background-color: #fff;\r\n box-sizing: border-box;\r\n \"\r\n ></div>\r\n }\r\n <!-- Tr\u1EA1ng th\u00E1i 2: T\u00EDch l\u1EA7n 1 (true) -->\r\n @else if (checked === true) {\r\n <span\r\n nz-icon\r\n nzType=\"check-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #52c41a; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n }\r\n <!-- Tr\u1EA1ng th\u00E1i 3: T\u00EDch l\u1EA7n 2 (false) -->\r\n @else {\r\n <span\r\n nz-icon\r\n nzType=\"close-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #ff4d4f; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n }\r\n\r\n <span>{{ label }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n} @else {\r\n <span\r\n (click)=\"cycleState()\"\r\n [style.cursor]=\"disabled ? 'not-allowed' : 'pointer'\"\r\n [style.opacity]=\"disabled ? '0.5' : '1'\"\r\n style=\"display: inline-flex; align-items: center; user-select: none; width: 16px; height: 16px\"\r\n >\r\n @if (checked === null) {\r\n <div\r\n style=\"\r\n width: 16px;\r\n height: 16px;\r\n border: 1px solid #d9d9d9;\r\n border-radius: 4px;\r\n background-color: #fff;\r\n box-sizing: border-box;\r\n \"\r\n ></div>\r\n } @else if (checked === true) {\r\n <span\r\n nz-icon\r\n nzType=\"check-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #52c41a; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n } @else {\r\n <span\r\n nz-icon\r\n nzType=\"close-square\"\r\n nzTheme=\"fill\"\r\n style=\"color: #ff4d4f; font-size: 16px; display: inline-flex\"\r\n ></span>\r\n }\r\n </span>\r\n}\r\n" }]
2147
+ }], propDecorators: { label: [{
2148
+ type: Input
2149
+ }], labelSpan: [{
2150
+ type: Input
2151
+ }], labelFlex: [{
2152
+ type: Input
2153
+ }], paddingTop: [{
2154
+ type: Input
2155
+ }], disabled: [{
2156
+ type: Input
2157
+ }], formData: [{
2158
+ type: Input
2159
+ }], controlName: [{
2160
+ type: Input
2161
+ }], valueType: [{
2162
+ type: Input
2163
+ }], _ngModel: [{
2164
+ type: Input
2165
+ }], _ngModelChange: [{
2166
+ type: Output
2167
+ }] } });
2168
+
2041
2169
  class DateTimeHelper {
2042
2170
  static lstDay = Array.from({ length: 31 }, (_, i) => i + 1);
2043
2171
  static lstMonth = Array.from({ length: 12 }, (_, i) => i + 1);
@@ -3186,7 +3314,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
3186
3314
  }]
3187
3315
  }] });
3188
3316
 
3189
- const URLs$c = {
3317
+ const URLs$d = {
3190
3318
  getById: '/api/App_Dic_Domain/GetById',
3191
3319
  getAll: '/api/App_Dic_Domain/GetAll',
3192
3320
  getList: '/api/App_Dic_Domain/GetList',
@@ -3198,21 +3326,21 @@ const URLs$c = {
3198
3326
  class DicDomainService extends HTTPService {
3199
3327
  getById(id) {
3200
3328
  let pr = new HttpParams().append('id', id);
3201
- return this.postParams(AppGlobals.apiEndpoint + URLs$c.getById, pr);
3329
+ return this.postParams(AppGlobals.apiEndpoint + URLs$d.getById, pr);
3202
3330
  }
3203
3331
  getPaging(filter) {
3204
- return this.postData(AppGlobals.apiEndpoint + URLs$c.getPaging, filter);
3332
+ return this.postData(AppGlobals.apiEndpoint + URLs$d.getPaging, filter);
3205
3333
  }
3206
3334
  addOrEdit(obj) {
3207
- return this.postData(AppGlobals.apiEndpoint + URLs$c.addOrEdit, obj);
3335
+ return this.postData(AppGlobals.apiEndpoint + URLs$d.addOrEdit, obj);
3208
3336
  }
3209
3337
  delete(id) {
3210
3338
  const params = new HttpParams().append('id', id);
3211
- return this.postParams(AppGlobals.apiEndpoint + URLs$c.delete, params);
3339
+ return this.postParams(AppGlobals.apiEndpoint + URLs$d.delete, params);
3212
3340
  }
3213
3341
  async getByDomain(DomainCode) {
3214
3342
  var pr = new HttpParams().append('DomainCode', DomainCode);
3215
- const ret = await this.postParams(AppGlobals.apiEndpoint + URLs$c.getByDomain, pr);
3343
+ const ret = await this.postParams(AppGlobals.apiEndpoint + URLs$d.getByDomain, pr);
3216
3344
  return ret.Data;
3217
3345
  }
3218
3346
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DicDomainService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
@@ -3254,6 +3382,9 @@ class GridFilter extends PagingModel {
3254
3382
  }
3255
3383
  class OrderOption {
3256
3384
  FieldName = null;
3385
+ /**
3386
+ * 'ascend' | 'descend'
3387
+ */
3257
3388
  Direction = null;
3258
3389
  }
3259
3390
  class PagingData {
@@ -4517,7 +4648,7 @@ class DicDomainListComponent extends BaseComponent {
4517
4648
  this.getData();
4518
4649
  }
4519
4650
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DicDomainListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
4520
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: DicDomainListComponent, isStandalone: true, selector: "app-dic-domain-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"data?.LstItem || []\" [nzBordered]=\"true\" [nzSize]=\"'small'\" [nzFrontPagination]=\"false\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Domain Code</th>\r\n <th>Item Code</th>\r\n <th>Item Value</th>\r\n <th nzWidth=\"100px\">Order Value</th>\r\n <th nzWidth=\"150px\">Child Domain Code</th>\r\n <th nzWidth=\"150px\">Parent Item Code</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\" nzRight>Action</th>\r\n </tr>\r\n <tr (keyup.enter)=\"search()\" class=\"tr-search\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.DomainCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemValue\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.DomainCode }}</td>\r\n <td>{{ row.ItemCode }}</td>\r\n <td>{{ row.ItemValue }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ChildDomainCode }}</td>\r\n <td>{{ row.ParentItemCode }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.DomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ItemCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-textarea\r\n [minRows]=\"1\"\r\n [formItemNoButtom]=\"true\"\r\n [(_ngModel)]=\"selectedRow.ItemValue\"\r\n ></extend-textarea>\r\n </td>\r\n <td>\r\n <extend-input-number [(_ngModel)]=\"selectedRow.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ChildDomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ParentItemCode\"></extend-input>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NzTagModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconAdd, selector: "icon-add", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconSave, selector: "icon-save", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendInputNumber, selector: "extend-input-number", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "hiddenUpDown", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "size", "min", "max", "precision", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "isSubmited", "separatorType", "formData", "controlName", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "component", type: ExtendTextArea, selector: "extend-textarea", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "displayInline", "formItemNoButtom", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "selectModeType", "inputClass", "size", "isSubmited", "minRows", "maxRows", "lstItem", "displayField", "valueField", "formData", "controlName", "_ngModel", "isTouched", "inputErrorMessage", "errorMessages"], outputs: ["_ngModelChange"] }] });
4651
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: DicDomainListComponent, isStandalone: true, selector: "app-dic-domain-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 195px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'DomainCode' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'DomainCode'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Domain Code\r\n </th>\r\n <th>Item Code</th>\r\n <th>Item Value</th>\r\n <th nzWidth=\"100px\">Order Value</th>\r\n <th nzWidth=\"150px\">Child Domain Code</th>\r\n <th nzWidth=\"150px\">Parent Item Code</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\" nzRight>Action</th>\r\n </tr>\r\n <tr (keyup.enter)=\"search()\" class=\"tr-search\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.DomainCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemValue\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.DomainCode }}</td>\r\n <td>{{ row.ItemCode }}</td>\r\n <td>{{ row.ItemValue }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ChildDomainCode }}</td>\r\n <td>{{ row.ParentItemCode }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.DomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ItemCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-textarea\r\n [minRows]=\"1\"\r\n [formItemNoButtom]=\"true\"\r\n [(_ngModel)]=\"selectedRow.ItemValue\"\r\n ></extend-textarea>\r\n </td>\r\n <td>\r\n <extend-input-number [(_ngModel)]=\"selectedRow.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ChildDomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ParentItemCode\"></extend-input>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NzTagModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconAdd, selector: "icon-add", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconSave, selector: "icon-save", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendInputNumber, selector: "extend-input-number", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "hiddenUpDown", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "size", "min", "max", "precision", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "isSubmited", "separatorType", "formData", "controlName", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "component", type: ExtendTextArea, selector: "extend-textarea", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "displayInline", "formItemNoButtom", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "selectModeType", "inputClass", "size", "isSubmited", "minRows", "maxRows", "lstItem", "displayField", "valueField", "formData", "controlName", "_ngModel", "isTouched", "inputErrorMessage", "errorMessages"], outputs: ["_ngModelChange"] }] });
4521
4652
  }
4522
4653
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DicDomainListComponent, decorators: [{
4523
4654
  type: Component,
@@ -4541,7 +4672,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
4541
4672
  NzButtonModule,
4542
4673
  Box,
4543
4674
  ExtendTextArea,
4544
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"data?.LstItem || []\" [nzBordered]=\"true\" [nzSize]=\"'small'\" [nzFrontPagination]=\"false\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Domain Code</th>\r\n <th>Item Code</th>\r\n <th>Item Value</th>\r\n <th nzWidth=\"100px\">Order Value</th>\r\n <th nzWidth=\"150px\">Child Domain Code</th>\r\n <th nzWidth=\"150px\">Parent Item Code</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\" nzRight>Action</th>\r\n </tr>\r\n <tr (keyup.enter)=\"search()\" class=\"tr-search\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.DomainCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemValue\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.DomainCode }}</td>\r\n <td>{{ row.ItemCode }}</td>\r\n <td>{{ row.ItemValue }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ChildDomainCode }}</td>\r\n <td>{{ row.ParentItemCode }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.DomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ItemCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-textarea\r\n [minRows]=\"1\"\r\n [formItemNoButtom]=\"true\"\r\n [(_ngModel)]=\"selectedRow.ItemValue\"\r\n ></extend-textarea>\r\n </td>\r\n <td>\r\n <extend-input-number [(_ngModel)]=\"selectedRow.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ChildDomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ParentItemCode\"></extend-input>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
4675
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 195px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'DomainCode' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'DomainCode'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Domain Code\r\n </th>\r\n <th>Item Code</th>\r\n <th>Item Value</th>\r\n <th nzWidth=\"100px\">Order Value</th>\r\n <th nzWidth=\"150px\">Child Domain Code</th>\r\n <th nzWidth=\"150px\">Parent Item Code</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\" nzRight>Action</th>\r\n </tr>\r\n <tr (keyup.enter)=\"search()\" class=\"tr-search\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.DomainCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemCode\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ItemValue\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.DomainCode }}</td>\r\n <td>{{ row.ItemCode }}</td>\r\n <td>{{ row.ItemValue }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ChildDomainCode }}</td>\r\n <td>{{ row.ParentItemCode }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.DomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ItemCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-textarea\r\n [minRows]=\"1\"\r\n [formItemNoButtom]=\"true\"\r\n [(_ngModel)]=\"selectedRow.ItemValue\"\r\n ></extend-textarea>\r\n </td>\r\n <td>\r\n <extend-input-number [(_ngModel)]=\"selectedRow.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ChildDomainCode\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.ParentItemCode\"></extend-input>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
4545
4676
  }] });
4546
4677
 
4547
4678
  let DicDomainSelectComponent$1 = class DicDomainSelectComponent {
@@ -4662,6 +4793,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
4662
4793
  type: Input
4663
4794
  }] } });
4664
4795
 
4796
+ class FormatBytesPipe {
4797
+ transform(bytes, decimals = 2) {
4798
+ if (bytes === null || bytes === undefined || isNaN(bytes))
4799
+ return '0 B';
4800
+ if (bytes === 0)
4801
+ return '0 B';
4802
+ const k = 1024;
4803
+ const dm = decimals < 0 ? 0 : decimals;
4804
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
4805
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
4806
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
4807
+ }
4808
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FormatBytesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
4809
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: FormatBytesPipe, isStandalone: true, name: "formatBytes" });
4810
+ }
4811
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FormatBytesPipe, decorators: [{
4812
+ type: Pipe,
4813
+ args: [{
4814
+ name: 'formatBytes',
4815
+ standalone: true,
4816
+ }]
4817
+ }] });
4818
+
4665
4819
  class FileListComponent extends BaseComponent {
4666
4820
  service = inject(FileService);
4667
4821
  data;
@@ -4698,14 +4852,6 @@ class FileListComponent extends BaseComponent {
4698
4852
  this.data = res.Data;
4699
4853
  }, (err) => this.handleError(err));
4700
4854
  }
4701
- edit(item) {
4702
- if (item) {
4703
- this.goto(`/admin/file/${item.App_File_Id}`);
4704
- }
4705
- else {
4706
- this.goto(`/admin/file/new`);
4707
- }
4708
- }
4709
4855
  download(file) {
4710
4856
  if (file.App_File_Id) {
4711
4857
  this.service.downloadFile(file.App_File_Id).then((res) => {
@@ -4758,7 +4904,7 @@ class FileListComponent extends BaseComponent {
4758
4904
  }
4759
4905
  }
4760
4906
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FileListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
4761
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: FileListComponent, isStandalone: true, selector: "app-file-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"18\">\r\n <div nz-row [nzGutter]=\"[8, 0]\">\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"edit(null)\">{{ TranslateKey.ADD | translate }}</button>\r\n </div>\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.SEARCH | translate }}</button>\r\n </div>\r\n <nz-upload\r\n [nzAction]=\"\r\n AppGlobals.apiEndpoint +\r\n '/api/file/UploadFile?SaveToDB=' +\r\n (SaveTo == 'DB' ? 'true' : 'false') +\r\n '&FileCode=' +\r\n FileCode\r\n \"\r\n (nzChange)=\"handleChange($event)\"\r\n >\r\n <button nz-button>\r\n <nz-icon nzType=\"upload\" />\r\n T\u1EA3i file\r\n </button>\r\n </nz-upload>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"3\"\r\n [placeHolder]=\"'Save To'\"\r\n [lstItem]=\"[\r\n {\r\n Code: 'DB',\r\n Name: 'DB',\r\n },\r\n {\r\n Code: 'DISC',\r\n Name: 'DISC',\r\n },\r\n ]\"\r\n [valueField]=\"'Code'\"\r\n [displayField]=\"'Name'\"\r\n [(_ngModel)]=\"SaveTo\"\r\n ></extend-select>\r\n <div nz-col [nzSpan]=\"8\">\r\n <input nz-input placeholder=\"File Code\" [(ngModel)]=\"FileCode\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n @for (item of this.data?.LstHeader; track $index) {\r\n @if (item.Code == \"Code\") {\r\n <th [nzWidth]=\"item.Width\" nzCustomFilter>\r\n {{ item.Code }}\r\n <nz-filter-trigger\r\n [nzActive]=\"filter.Code ? true : false\"\r\n [nzDropdownMenu]=\"searchCodeMenu\"\r\n (nzVisibleChange)=\"isDropdownCodeVisible = $event\"\r\n >\r\n <nz-icon nzType=\"search\" />\r\n </nz-filter-trigger>\r\n </th>\r\n } @else {\r\n <th [nzWidth]=\"item.Width\">{{ item.Name }}</th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (row != selectedItem) {\r\n <tr (click)=\"selectedItem = row\">\r\n @for (col of this.data?.LstHeader; track $index) {\r\n <td [class]=\"col.Class\" [nzBreakWord]=\"col.Class && col.Class.includes('BreakWord')\">\r\n @if (col.Code == \"NO\") {\r\n {{ i + 1 + filter.PageIndex * filter.PageSize }}\r\n } @else if (col.Code == \"ACTION\") {\r\n <!-- <i\r\n nz-icon\r\n nzType=\"download\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"download(row)\"\r\n ></i>\r\n &nbsp;\r\n <a\r\n nz-popconfirm\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n nzPopconfirmPlacement=\"top\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n nzOkDanger\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a> -->\r\n } @else {\r\n @if (col.Type == \"CHECKBOX\") {\r\n @if (row[col.Code]) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n } @else {\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" class=\"color-warn\" />\r\n }\r\n } @else {\r\n {{ row[col.Code] }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n } @else {\r\n <tr>\r\n @for (col of this.data?.LstHeader; track $index) {\r\n <td [class]=\"col.Class\" [nzBreakWord]=\"col.Class && col.Class.includes('BreakWord')\">\r\n @if (col.Code == \"NO\") {\r\n {{ i + 1 + filter.PageIndex * filter.PageSize }}\r\n } @else if (col.Code == \"ACTION\") {\r\n <i\r\n *ngIf=\"row.IsContentOnly\"\r\n nz-tooltip=\"Move to disk\"\r\n nz-icon\r\n nzType=\"file\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"moveFileToDisk(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"save(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"download\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"download(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <a\r\n nz-popconfirm\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n nzPopconfirmPlacement=\"top\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n nzOkDanger\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n } @else if (col.Code == \"Code\") {\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"row.Code\"></extend-input>\r\n } @else if (col.Code == \"IsTemp\") {\r\n <extend-checkbox [(_ngModel)]=\"row.IsTemp\"></extend-checkbox>\r\n } @else if (col.Code == \"FileName\") {\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"row.FileName\"></extend-input>\r\n } @else {\r\n @if (col.Type == \"CHECKBOX\") {\r\n @if (row[col.Code]) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n } @else {\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" class=\"color-warn\" />\r\n }\r\n } @else {\r\n {{ row[col.Code] }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n\r\n<nz-dropdown-menu #searchCodeMenu=\"nzDropdownMenu\">\r\n <div class=\"ant-table-filter-dropdown\">\r\n <div class=\"search-box\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n [(ngModel)]=\"filter.Code\"\r\n [appAutoFocus]=\"isDropdownCodeVisible\"\r\n (keyup.enter)=\"search()\"\r\n />\r\n <button nz-button nzSize=\"small\" nzType=\"primary\" (click)=\"search()\" class=\"search-button\">\r\n {{ \"SEARCH\" | translate }}\r\n </button>\r\n <button nz-button nzSize=\"small\" (click)=\"filter.Code = ''; search()\">{{ \"RESET\" | translate }}</button>\r\n </div>\r\n </div>\r\n</nz-dropdown-menu>\r\n", dependencies: [{ kind: "ngmodule", type: NzUploadModule }, { kind: "component", type: i1$6.NzUploadComponent, selector: "nz-upload", inputs: ["nzType", "nzLimit", "nzSize", "nzFileType", "nzAccept", "nzAction", "nzDirectory", "nzOpenFileDialogOnClick", "nzBeforeUpload", "nzCustomRequest", "nzData", "nzFilter", "nzFileList", "nzDisabled", "nzHeaders", "nzListType", "nzMultiple", "nzName", "nzShowUploadList", "nzShowButton", "nzWithCredentials", "nzRemove", "nzPreview", "nzPreviewFile", "nzPreviewIsImage", "nzTransformFile", "nzDownload", "nzIconRender", "nzFileListRender"], outputs: ["nzChange", "nzFileListChange"], exportAs: ["nzUpload"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: ExtendSelectComponent, selector: "extend-select", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "dropdownMatchSelectWidth", "labelSpan", "labelFlex", "disabled", "required", "noBottom", "multiple", "showSelectAll", "maxTagCount", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "lstItem", "displayField", "displayFields", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "itemChange", "onFocus"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "component", type: i6$2.NzFilterTriggerComponent, selector: "nz-filter-trigger", inputs: ["nzActive", "nzDropdownMenu", "nzVisible", "nzBackdrop"], outputs: ["nzVisibleChange"], exportAs: ["nzFilterTrigger"] }, { kind: "directive", type: i6$2.NzCellBreakWordDirective, selector: "th[nzBreakWord],td[nzBreakWord]", inputs: ["nzBreakWord"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "directive", type: i9.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nzPopconfirmTitleContext", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDisabled", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "component", type: i5$4.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: AutoFocusDirective, selector: "[appAutoFocus]", inputs: ["appAutoFocus"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }] });
4907
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: FileListComponent, isStandalone: true, selector: "app-file-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row [nzGutter]=\"[8, 0]\">\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.SEARCH | translate }}</button>\r\n </div>\r\n <nz-upload\r\n [nzAction]=\"\r\n AppGlobals.apiEndpoint +\r\n '/api/file/Upload?SaveToDB=' +\r\n (SaveTo == 'DB' ? 'true' : 'false') +\r\n '&FileCode=' +\r\n FileCode\r\n \"\r\n (nzChange)=\"handleChange($event)\"\r\n >\r\n <button nz-button>\r\n <nz-icon nzType=\"upload\" />\r\n T\u1EA3i file\r\n </button>\r\n </nz-upload>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"3\"\r\n [placeHolder]=\"'Save To'\"\r\n [lstItem]=\"[\r\n {\r\n Code: 'DB',\r\n Name: 'DB',\r\n },\r\n {\r\n Code: 'DISC',\r\n Name: 'DISC',\r\n },\r\n ]\"\r\n [valueField]=\"'Code'\"\r\n [displayField]=\"'Name'\"\r\n [(_ngModel)]=\"SaveTo\"\r\n ></extend-select>\r\n <div nz-col [nzSpan]=\"8\">\r\n <input nz-input placeholder=\"File Code\" [(ngModel)]=\"FileCode\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 225px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th>Temp file</th>\r\n <th>Content only</th>\r\n <th>FileName</th>\r\n <th class=\"right\">FileSize</th>\r\n <th>FileId</th>\r\n <th nzWidth=\"100px\">Action</th>\r\n </tr>\r\n <tr (keyup.enter)=\"search()\" class=\"tr-search\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Code\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.Code }}</td>\r\n <td class=\"center\"><extend-checkbox [(_ngModel)]=\"row.IsTemp\"></extend-checkbox></td>\r\n <td class=\"center\"><extend-checkbox [(_ngModel)]=\"row.IsContentOnly\"></extend-checkbox></td>\r\n <td>{{ row.FileName }}</td>\r\n <td class=\"right\">{{ row.FileSize || 0 | formatBytes }}</td>\r\n <td>\r\n {{ row.App_File_Id }}\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <i\r\n *ngIf=\"row.IsContentOnly\"\r\n nz-tooltip=\"Move to disk\"\r\n nz-icon\r\n nzType=\"file\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"moveFileToDisk(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"save(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"download\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"download(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <a\r\n nz-popconfirm\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n nzPopconfirmPlacement=\"top\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n nzOkDanger\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: NzUploadModule }, { kind: "component", type: i1$6.NzUploadComponent, selector: "nz-upload", inputs: ["nzType", "nzLimit", "nzSize", "nzFileType", "nzAccept", "nzAction", "nzDirectory", "nzOpenFileDialogOnClick", "nzBeforeUpload", "nzCustomRequest", "nzData", "nzFilter", "nzFileList", "nzDisabled", "nzHeaders", "nzListType", "nzMultiple", "nzName", "nzShowUploadList", "nzShowButton", "nzWithCredentials", "nzRemove", "nzPreview", "nzPreviewFile", "nzPreviewIsImage", "nzTransformFile", "nzDownload", "nzIconRender", "nzFileListRender"], outputs: ["nzChange", "nzFileListChange"], exportAs: ["nzUpload"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: ExtendSelectComponent, selector: "extend-select", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "dropdownMatchSelectWidth", "labelSpan", "labelFlex", "disabled", "required", "noBottom", "multiple", "showSelectAll", "maxTagCount", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "lstItem", "displayField", "displayFields", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "itemChange", "onFocus"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "directive", type: i9.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nzPopconfirmTitleContext", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDisabled", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "pipe", type: FormatBytesPipe, name: "formatBytes" }] });
4762
4908
  }
4763
4909
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FileListComponent, decorators: [{
4764
4910
  type: Component,
@@ -4777,11 +4923,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
4777
4923
  ExtendInput,
4778
4924
  ExtendCheckbox,
4779
4925
  NzDropDownModule,
4780
- AutoFocusDirective,
4926
+ NzFlexModule,
4781
4927
  NzButtonModule,
4782
4928
  NzInputModule,
4783
4929
  NzToolTipModule,
4784
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"18\">\r\n <div nz-row [nzGutter]=\"[8, 0]\">\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"edit(null)\">{{ TranslateKey.ADD | translate }}</button>\r\n </div>\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.SEARCH | translate }}</button>\r\n </div>\r\n <nz-upload\r\n [nzAction]=\"\r\n AppGlobals.apiEndpoint +\r\n '/api/file/UploadFile?SaveToDB=' +\r\n (SaveTo == 'DB' ? 'true' : 'false') +\r\n '&FileCode=' +\r\n FileCode\r\n \"\r\n (nzChange)=\"handleChange($event)\"\r\n >\r\n <button nz-button>\r\n <nz-icon nzType=\"upload\" />\r\n T\u1EA3i file\r\n </button>\r\n </nz-upload>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"3\"\r\n [placeHolder]=\"'Save To'\"\r\n [lstItem]=\"[\r\n {\r\n Code: 'DB',\r\n Name: 'DB',\r\n },\r\n {\r\n Code: 'DISC',\r\n Name: 'DISC',\r\n },\r\n ]\"\r\n [valueField]=\"'Code'\"\r\n [displayField]=\"'Name'\"\r\n [(_ngModel)]=\"SaveTo\"\r\n ></extend-select>\r\n <div nz-col [nzSpan]=\"8\">\r\n <input nz-input placeholder=\"File Code\" [(ngModel)]=\"FileCode\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"6\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n @for (item of this.data?.LstHeader; track $index) {\r\n @if (item.Code == \"Code\") {\r\n <th [nzWidth]=\"item.Width\" nzCustomFilter>\r\n {{ item.Code }}\r\n <nz-filter-trigger\r\n [nzActive]=\"filter.Code ? true : false\"\r\n [nzDropdownMenu]=\"searchCodeMenu\"\r\n (nzVisibleChange)=\"isDropdownCodeVisible = $event\"\r\n >\r\n <nz-icon nzType=\"search\" />\r\n </nz-filter-trigger>\r\n </th>\r\n } @else {\r\n <th [nzWidth]=\"item.Width\">{{ item.Name }}</th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (row != selectedItem) {\r\n <tr (click)=\"selectedItem = row\">\r\n @for (col of this.data?.LstHeader; track $index) {\r\n <td [class]=\"col.Class\" [nzBreakWord]=\"col.Class && col.Class.includes('BreakWord')\">\r\n @if (col.Code == \"NO\") {\r\n {{ i + 1 + filter.PageIndex * filter.PageSize }}\r\n } @else if (col.Code == \"ACTION\") {\r\n <!-- <i\r\n nz-icon\r\n nzType=\"download\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"download(row)\"\r\n ></i>\r\n &nbsp;\r\n <a\r\n nz-popconfirm\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n nzPopconfirmPlacement=\"top\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n (click)=\"$event.stopPropagation()\"\r\n nzOkDanger\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a> -->\r\n } @else {\r\n @if (col.Type == \"CHECKBOX\") {\r\n @if (row[col.Code]) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n } @else {\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" class=\"color-warn\" />\r\n }\r\n } @else {\r\n {{ row[col.Code] }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n } @else {\r\n <tr>\r\n @for (col of this.data?.LstHeader; track $index) {\r\n <td [class]=\"col.Class\" [nzBreakWord]=\"col.Class && col.Class.includes('BreakWord')\">\r\n @if (col.Code == \"NO\") {\r\n {{ i + 1 + filter.PageIndex * filter.PageSize }}\r\n } @else if (col.Code == \"ACTION\") {\r\n <i\r\n *ngIf=\"row.IsContentOnly\"\r\n nz-tooltip=\"Move to disk\"\r\n nz-icon\r\n nzType=\"file\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"moveFileToDisk(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"save(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"download\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"download(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <a\r\n nz-popconfirm\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n nzPopconfirmPlacement=\"top\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n nzOkDanger\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n } @else if (col.Code == \"Code\") {\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"row.Code\"></extend-input>\r\n } @else if (col.Code == \"IsTemp\") {\r\n <extend-checkbox [(_ngModel)]=\"row.IsTemp\"></extend-checkbox>\r\n } @else if (col.Code == \"FileName\") {\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"row.FileName\"></extend-input>\r\n } @else {\r\n @if (col.Type == \"CHECKBOX\") {\r\n @if (row[col.Code]) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n } @else {\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" class=\"color-warn\" />\r\n }\r\n } @else {\r\n {{ row[col.Code] }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n\r\n<nz-dropdown-menu #searchCodeMenu=\"nzDropdownMenu\">\r\n <div class=\"ant-table-filter-dropdown\">\r\n <div class=\"search-box\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n [(ngModel)]=\"filter.Code\"\r\n [appAutoFocus]=\"isDropdownCodeVisible\"\r\n (keyup.enter)=\"search()\"\r\n />\r\n <button nz-button nzSize=\"small\" nzType=\"primary\" (click)=\"search()\" class=\"search-button\">\r\n {{ \"SEARCH\" | translate }}\r\n </button>\r\n <button nz-button nzSize=\"small\" (click)=\"filter.Code = ''; search()\">{{ \"RESET\" | translate }}</button>\r\n </div>\r\n </div>\r\n</nz-dropdown-menu>\r\n" }]
4930
+ FormatBytesPipe,
4931
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row [nzGutter]=\"[8, 0]\">\r\n <div nz-col>\r\n <button nz-button nzType=\"primary\" (click)=\"getData()\">{{ TranslateKey.SEARCH | translate }}</button>\r\n </div>\r\n <nz-upload\r\n [nzAction]=\"\r\n AppGlobals.apiEndpoint +\r\n '/api/file/Upload?SaveToDB=' +\r\n (SaveTo == 'DB' ? 'true' : 'false') +\r\n '&FileCode=' +\r\n FileCode\r\n \"\r\n (nzChange)=\"handleChange($event)\"\r\n >\r\n <button nz-button>\r\n <nz-icon nzType=\"upload\" />\r\n T\u1EA3i file\r\n </button>\r\n </nz-upload>\r\n <extend-select\r\n nz-col\r\n nzSpan=\"3\"\r\n [placeHolder]=\"'Save To'\"\r\n [lstItem]=\"[\r\n {\r\n Code: 'DB',\r\n Name: 'DB',\r\n },\r\n {\r\n Code: 'DISC',\r\n Name: 'DISC',\r\n },\r\n ]\"\r\n [valueField]=\"'Code'\"\r\n [displayField]=\"'Name'\"\r\n [(_ngModel)]=\"SaveTo\"\r\n ></extend-select>\r\n <div nz-col [nzSpan]=\"8\">\r\n <input nz-input placeholder=\"File Code\" [(ngModel)]=\"FileCode\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 225px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th>Temp file</th>\r\n <th>Content only</th>\r\n <th>FileName</th>\r\n <th class=\"right\">FileSize</th>\r\n <th>FileId</th>\r\n <th nzWidth=\"100px\">Action</th>\r\n </tr>\r\n <tr (keyup.enter)=\"search()\" class=\"tr-search\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Code\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.Code }}</td>\r\n <td class=\"center\"><extend-checkbox [(_ngModel)]=\"row.IsTemp\"></extend-checkbox></td>\r\n <td class=\"center\"><extend-checkbox [(_ngModel)]=\"row.IsContentOnly\"></extend-checkbox></td>\r\n <td>{{ row.FileName }}</td>\r\n <td class=\"right\">{{ row.FileSize || 0 | formatBytes }}</td>\r\n <td>\r\n {{ row.App_File_Id }}\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <i\r\n *ngIf=\"row.IsContentOnly\"\r\n nz-tooltip=\"Move to disk\"\r\n nz-icon\r\n nzType=\"file\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"moveFileToDisk(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"save(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <i\r\n nz-icon\r\n nzType=\"download\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"download(row)\"\r\n ></i>\r\n <box [width]=\"5\"></box>\r\n <a\r\n nz-popconfirm\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n nzPopconfirmPlacement=\"top\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n nzOkDanger\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
4785
4932
  }] });
4786
4933
 
4787
4934
  let App_Menu$1 = class App_Menu {
@@ -4840,6 +4987,7 @@ let App_Menu$1 = class App_Menu {
4840
4987
  class MenuFilter extends GridFilter {
4841
4988
  Name = '';
4842
4989
  ParentName = '';
4990
+ IsHeaderMenu = null;
4843
4991
  }
4844
4992
  // Model cho bảng trung gian Role-Menu
4845
4993
  class App_Role_Menu_Ref {
@@ -4849,8 +4997,9 @@ class App_Role_Menu_Ref {
4849
4997
  CreatedUser;
4850
4998
  App_Role_Id;
4851
4999
  App_Menu_Id;
4852
- HasViewPermission;
4853
- HasEditPermission;
5000
+ CanCreate;
5001
+ CanUpdate;
5002
+ CanDelete;
4854
5003
  // For display - join với App_Role
4855
5004
  RoleCode;
4856
5005
  RoleName;
@@ -4863,8 +5012,9 @@ class App_Role_Menu_Ref {
4863
5012
  this.CreatedUser = obj.CreatedUser || '';
4864
5013
  this.App_Role_Id = obj.App_Role_Id || '';
4865
5014
  this.App_Menu_Id = obj.App_Menu_Id || '';
4866
- this.HasViewPermission = obj.HasViewPermission !== undefined ? obj.HasViewPermission : false;
4867
- this.HasEditPermission = obj.HasEditPermission !== undefined ? obj.HasEditPermission : false;
5015
+ this.CanCreate = obj.CanCreate || false;
5016
+ this.CanUpdate = obj.CanUpdate || false;
5017
+ this.CanDelete = obj.CanDelete || false;
4868
5018
  this.RoleCode = obj.RoleCode || '';
4869
5019
  this.RoleName = obj.RoleName || '';
4870
5020
  this.RoleDescription = obj.RoleDescription || '';
@@ -5012,7 +5162,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
5012
5162
  }]
5013
5163
  }] });
5014
5164
 
5015
- const URLs$b = {
5165
+ const URLs$c = {
5016
5166
  getById: '/api/App_Menu/GetById',
5017
5167
  getAll: '/api/App_Menu/GetAll',
5018
5168
  getList: '/api/App_Menu/GetList',
@@ -5025,29 +5175,29 @@ const URLs$b = {
5025
5175
  class MenuService extends HTTPService {
5026
5176
  getById(id) {
5027
5177
  let pr = new HttpParams().append('id', id);
5028
- return this.postParams(AppGlobals.apiEndpoint + URLs$b.getById, pr);
5178
+ return this.postParams(AppGlobals.apiEndpoint + URLs$c.getById, pr);
5029
5179
  }
5030
5180
  getAll() {
5031
- return this.post(AppGlobals.apiEndpoint + URLs$b.getAll);
5181
+ return this.post(AppGlobals.apiEndpoint + URLs$c.getAll);
5032
5182
  }
5033
5183
  getList(filter) {
5034
- return this.postData(AppGlobals.apiEndpoint + URLs$b.getList, filter);
5184
+ return this.postData(AppGlobals.apiEndpoint + URLs$c.getList, filter);
5035
5185
  }
5036
5186
  getPaging(filter) {
5037
- return this.postData(AppGlobals.apiEndpoint + URLs$b.getPaging, filter);
5187
+ return this.postData(AppGlobals.apiEndpoint + URLs$c.getPaging, filter);
5038
5188
  }
5039
5189
  addOrEdit(obj) {
5040
- return this.postData(AppGlobals.apiEndpoint + URLs$b.addOrEdit, obj);
5190
+ return this.postData(AppGlobals.apiEndpoint + URLs$c.addOrEdit, obj);
5041
5191
  }
5042
5192
  addOrEditInListComponent(obj) {
5043
- return this.postData(AppGlobals.apiEndpoint + URLs$b.addOrEditInListComponent, obj);
5193
+ return this.postData(AppGlobals.apiEndpoint + URLs$c.addOrEditInListComponent, obj);
5044
5194
  }
5045
5195
  delete(id) {
5046
5196
  const params = new HttpParams().append('id', id);
5047
- return this.postParams(AppGlobals.apiEndpoint + URLs$b.delete, params);
5197
+ return this.postParams(AppGlobals.apiEndpoint + URLs$c.delete, params);
5048
5198
  }
5049
5199
  getTree() {
5050
- return this.post(AppGlobals.apiEndpoint + URLs$b.getTree);
5200
+ return this.post(AppGlobals.apiEndpoint + URLs$c.getTree);
5051
5201
  }
5052
5202
  getRoleMenuRefByMenuId(menuId) {
5053
5203
  let pr = new HttpParams().append('menuId', menuId);
@@ -5156,7 +5306,7 @@ class MenuListComponent extends BaseComponent {
5156
5306
  }
5157
5307
  }
5158
5308
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5159
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: MenuListComponent, isStandalone: true, selector: "app-menu-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>T\u00EAn</th>\r\n <th>URL</th>\r\n <th nzWidth=\"90px\">Icon</th>\r\n <th nzWidth=\"90px\">Order</th>\r\n <th>Menu cha</th>\r\n <th nzWidth=\"110px\">Header menu</th>\r\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n @if (selectedMenu != row) {\r\n <tr (click)=\"selectedMenu = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.TreeNodeName }}</td>\r\n <td>{{ row.Url }}</td>\r\n <td>{{ row.Icon }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td class=\"center\">\r\n @if (row.IsHeaderMenu) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n [nzSize]=\"'small'\"\r\n [nzDropdownMatchSelectWidth]=\"false\"\r\n [(ngModel)]=\"selectedMenu.ParentId\"\r\n ></nz-tree-select>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NzTreeSelectModule }, { kind: "component", type: i3$4.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckboxChange"], exportAs: ["nzTreeSelect"] }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconAdd, selector: "icon-add", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconSave, selector: "icon-save", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendInputNumber, selector: "extend-input-number", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "hiddenUpDown", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "size", "min", "max", "precision", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "isSubmited", "separatorType", "formData", "controlName", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }] });
5309
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: MenuListComponent, isStandalone: true, selector: "app-menu-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>T\u00EAn</th>\r\n <th>URL</th>\r\n <th nzWidth=\"90px\">Icon</th>\r\n <th nzWidth=\"90px\">Order</th>\r\n <th>Menu cha</th>\r\n <th nzWidth=\"110px\">Header menu</th>\r\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th class=\"center\">\r\n <extend-checkbox-3-value\r\n [(_ngModel)]=\"filter.IsHeaderMenu\"\r\n (_ngModelChange)=\"search()\"\r\n ></extend-checkbox-3-value>\r\n </th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n @if (selectedMenu != row) {\r\n <tr (click)=\"selectedMenu = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.TreeNodeName }}</td>\r\n <td>{{ row.Url }}</td>\r\n <td>{{ row.Icon }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td class=\"center\">\r\n @if (row.IsHeaderMenu) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n [nzSize]=\"'small'\"\r\n [nzDropdownMatchSelectWidth]=\"false\"\r\n [(ngModel)]=\"selectedMenu.ParentId\"\r\n ></nz-tree-select>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: NzTreeSelectModule }, { kind: "component", type: i3$4.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckboxChange"], exportAs: ["nzTreeSelect"] }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconAdd, selector: "icon-add", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconSave, selector: "icon-save", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendInputNumber, selector: "extend-input-number", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "hiddenUpDown", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "size", "min", "max", "precision", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "isSubmited", "separatorType", "formData", "controlName", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "component", type: ExtendCheckbox3Value, selector: "extend-checkbox-3-value", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }] });
5160
5310
  }
5161
5311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuListComponent, decorators: [{
5162
5312
  type: Component,
@@ -5180,10 +5330,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
5180
5330
  ExtendInputNumber,
5181
5331
  ExtendCheckbox,
5182
5332
  Box,
5183
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>T\u00EAn</th>\r\n <th>URL</th>\r\n <th nzWidth=\"90px\">Icon</th>\r\n <th nzWidth=\"90px\">Order</th>\r\n <th>Menu cha</th>\r\n <th nzWidth=\"110px\">Header menu</th>\r\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n @if (selectedMenu != row) {\r\n <tr (click)=\"selectedMenu = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.TreeNodeName }}</td>\r\n <td>{{ row.Url }}</td>\r\n <td>{{ row.Icon }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td class=\"center\">\r\n @if (row.IsHeaderMenu) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n [nzSize]=\"'small'\"\r\n [nzDropdownMatchSelectWidth]=\"false\"\r\n [(ngModel)]=\"selectedMenu.ParentId\"\r\n ></nz-tree-select>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
5333
+ ExtendCheckbox3Value,
5334
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>T\u00EAn</th>\r\n <th>URL</th>\r\n <th nzWidth=\"90px\">Icon</th>\r\n <th nzWidth=\"90px\">Order</th>\r\n <th>Menu cha</th>\r\n <th nzWidth=\"110px\">Header menu</th>\r\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th class=\"center\">\r\n <extend-checkbox-3-value\r\n [(_ngModel)]=\"filter.IsHeaderMenu\"\r\n (_ngModelChange)=\"search()\"\r\n ></extend-checkbox-3-value>\r\n </th>\r\n <th></th>\r\n <th class=\"center\" nzRight>\r\n <icon-add (click)=\"add()\"></icon-add>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n @if (selectedMenu != row) {\r\n <tr (click)=\"selectedMenu = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.TreeNodeName }}</td>\r\n <td>{{ row.Url }}</td>\r\n <td>{{ row.Icon }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td class=\"center\">\r\n @if (row.IsHeaderMenu) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\" class=\"selected\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\r\n </td>\r\n <td>\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n [nzSize]=\"'small'\"\r\n [nzDropdownMatchSelectWidth]=\"false\"\r\n [(ngModel)]=\"selectedMenu.ParentId\"\r\n ></nz-tree-select>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"center\">\r\n <icon-save (click)=\"save()\"></icon-save>\r\n <box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
5184
5335
  }] });
5185
5336
 
5186
- const URLs$a = {
5337
+ const URLs$b = {
5187
5338
  getById: '/api/App_Role/GetById',
5188
5339
  getAll: '/api/App_Role/GetAll',
5189
5340
  getList: '/api/App_Role/GetList',
@@ -5195,23 +5346,23 @@ class RoleService extends HTTPService {
5195
5346
  commonService = inject(CommonService);
5196
5347
  getById(id) {
5197
5348
  let pr = new HttpParams().append('id', id);
5198
- return this.postParams(AppGlobals.apiEndpoint + URLs$a.getById, pr);
5349
+ return this.postParams(AppGlobals.apiEndpoint + URLs$b.getById, pr);
5199
5350
  }
5200
5351
  getAll() {
5201
- return this.post(AppGlobals.apiEndpoint + URLs$a.getAll);
5352
+ return this.post(AppGlobals.apiEndpoint + URLs$b.getAll);
5202
5353
  }
5203
5354
  getList(filter) {
5204
- return this.postData(AppGlobals.apiEndpoint + URLs$a.getList, filter);
5355
+ return this.postData(AppGlobals.apiEndpoint + URLs$b.getList, filter);
5205
5356
  }
5206
5357
  getPaging(filter) {
5207
- return this.postData(AppGlobals.apiEndpoint + URLs$a.getPaging, filter);
5358
+ return this.postData(AppGlobals.apiEndpoint + URLs$b.getPaging, filter);
5208
5359
  }
5209
5360
  addOrEdit(obj) {
5210
- return this.postData(AppGlobals.apiEndpoint + URLs$a.addOrEdit, obj);
5361
+ return this.postData(AppGlobals.apiEndpoint + URLs$b.addOrEdit, obj);
5211
5362
  }
5212
5363
  delete(id) {
5213
5364
  const params = new HttpParams().append('id', id);
5214
- return this.postParams(AppGlobals.apiEndpoint + URLs$a.delete, params);
5365
+ return this.postParams(AppGlobals.apiEndpoint + URLs$b.delete, params);
5215
5366
  }
5216
5367
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RoleService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
5217
5368
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RoleService, providedIn: 'root' });
@@ -5422,7 +5573,7 @@ class MenuDetailComponent extends BaseComponent {
5422
5573
  this.lstRoleMenu = [...this.lstRoleMenu.filter((x) => x != roleMenu)];
5423
5574
  }
5424
5575
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5425
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: MenuDetailComponent, isStandalone: true, selector: "app-menu-detail", usesInheritance: true, ngImport: i0, template: "<form nz-form [formGroup]=\"formData\">\r\n <!-- BUTTONS -->\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-delete *ngIf=\"formData.controls.App_Menu_Id.value\" (click)=\"delete()\"></button-delete>\r\n <button-back (click)=\"goto('/admin/menu')\"></button-back>\r\n </div>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"['0', '16']\">\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Menu cha </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <!-- <nz-select #parentSelect nzShowSearch nzAllowClear formControlName=\"ParentId\">\r\n @for (item of allMenu; track $index) {\r\n <nz-option [nzLabel]=\"item.TreeNodeName\" [nzValue]=\"item.App_Menu_Id\"></nz-option>\r\n }\r\n </nz-select> -->\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n formControlName=\"ParentId\"\r\n ></nz-tree-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Name\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired> T\u00EAn </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Name\" id=\"Name\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Url\" nzLabelAlign=\"left\" nzNoColon=\"true\"> URL </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Url\" id=\"Url\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Icon\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Icon </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Icon\" id=\"Icon\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"OrderValue\" nzLabelAlign=\"left\" nzNoColon=\"true\">Order value</nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-input-number formControlName=\"OrderValue\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: QU\u1EA2N L\u00DD ROLE -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <div style=\"border: 1px solid #d9d9d9; border-radius: 4px; padding: 16px; height: 100%; margin-left: 10px\">\r\n <h4 style=\"margin-top: 0; margin-bottom: 16px\">\r\n <span nz-icon nzType=\"team\" style=\"margin-right: 8px\"></span>\r\n Qu\u1EA3n l\u00FD Role\r\n </h4>\r\n\r\n <!-- Hi\u1EC3n th\u1ECB khi \u0110ANG T\u1EA0O M\u1EDAI (ch\u01B0a c\u00F3 App_Menu_Id) -->\r\n <nz-alert\r\n *ngIf=\"!formData.controls.App_Menu_Id.value\"\r\n nzType=\"info\"\r\n nzMessage=\"Vui l\u00F2ng l\u01B0u Menu tr\u01B0\u1EDBc\"\r\n nzDescription=\"B\u1EA1n c\u1EA7n l\u01B0u Menu tr\u01B0\u1EDBc, sau \u0111\u00F3 m\u1EDBi c\u00F3 th\u1EC3 th\u00EAm Role.\"\r\n nzShowIcon\r\n ></nz-alert>\r\n\r\n <!-- Hi\u1EC3n th\u1ECB khi \u0110ANG C\u1EACP NH\u1EACT (\u0111\u00E3 c\u00F3 App_Menu_Id) -->\r\n <div *ngIf=\"formData.controls.App_Menu_Id.value\">\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleMenu.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 400px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleMenu\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"false\"\r\n [nzLoading]=\"isLoadingRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"Xem\">\r\n <span nz-icon nzType=\"eye\" nzTheme=\"outline\"></span>\r\n </th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"S\u1EEDa\">\r\n <span nz-icon nzType=\"edit\" nzTheme=\"outline\"></span>\r\n </th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.RoleName }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.RoleCode }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.HasViewPermission\" [ngModelOptions]=\"{ standalone: true }\">\r\n </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.HasEditPermission\" [ngModelOptions]=\"{ standalone: true }\">\r\n </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <icon-delete (click)=\"deleteRoleFromMenu(item)\"></icon-delete>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o Menu\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToMenu()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearch\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearch>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3 Role</th>\r\n <th>T\u00EAn Role</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nz-flex nzJustify=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i5.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzSpinModule }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: NzInputNumberModule }, { kind: "component", type: i6.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzId", "nzSize", "nzPlaceHolder", "nzStatus", "nzStep", "nzMin", "nzMax", "nzPrecision", "nzParser", "nzFormatter", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBordered", "nzKeyboard", "nzControls"], outputs: ["nzOnStep"], exportAs: ["nzInputNumber"] }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: NzSelectModule }, { kind: "ngmodule", type: NzTreeSelectModule }, { kind: "component", type: i3$4.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckboxChange"], exportAs: ["nzTreeSelect"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i6$2.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzLabel", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i15.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i15.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "ngmodule", type: NzEmptyModule }, { kind: "ngmodule", type: NzAlertModule }, { kind: "component", type: i16.NzAlertComponent, selector: "nz-alert", inputs: ["nzAction", "nzCloseText", "nzIconType", "nzMessage", "nzDescription", "nzType", "nzCloseable", "nzShowIcon", "nzBanner", "nzNoAnimation", "nzIcon"], outputs: ["nzOnClose"], exportAs: ["nzAlert"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzDividerModule }, { kind: "component", type: i8$1.NzDividerComponent, selector: "nz-divider", inputs: ["nzText", "nzType", "nzOrientation", "nzVariant", "nzDashed", "nzPlain"], exportAs: ["nzDivider"] }, { kind: "component", type: ButtonDelete, selector: "button-delete" }, { kind: "component", type: ButtonSave, selector: "button-save" }, { kind: "component", type: ButtonBack, selector: "button-back" }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }] });
5576
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.7", type: MenuDetailComponent, isStandalone: true, selector: "app-menu-detail", usesInheritance: true, ngImport: i0, template: "<form nz-form [formGroup]=\"formData\">\r\n <!-- BUTTONS -->\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-delete *ngIf=\"formData.controls.App_Menu_Id.value\" (click)=\"delete()\"></button-delete>\r\n <button-back (click)=\"goto('/admin/menu')\"></button-back>\r\n </div>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"['0', '16']\">\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Menu cha </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n formControlName=\"ParentId\"\r\n ></nz-tree-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Name\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired> T\u00EAn </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Name\" id=\"Name\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Url\" nzLabelAlign=\"left\" nzNoColon=\"true\"> URL </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Url\" id=\"Url\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Icon\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Icon </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Icon\" id=\"Icon\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"OrderValue\" nzLabelAlign=\"left\" nzNoColon=\"true\">Order value</nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-input-number formControlName=\"OrderValue\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: QU\u1EA2N L\u00DD ROLE -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <div style=\"border: 1px solid #d9d9d9; border-radius: 4px; padding: 16px; height: 100%; margin-left: 10px\">\r\n <h4 style=\"margin-top: 0; margin-bottom: 16px\">\r\n <span nz-icon nzType=\"team\" style=\"margin-right: 8px\"></span>\r\n Qu\u1EA3n l\u00FD Role\r\n </h4>\r\n\r\n <nz-alert\r\n *ngIf=\"!formData.controls.App_Menu_Id.value\"\r\n nzType=\"info\"\r\n nzMessage=\"Vui l\u00F2ng l\u01B0u Menu tr\u01B0\u1EDBc\"\r\n nzDescription=\"B\u1EA1n c\u1EA7n l\u01B0u Menu tr\u01B0\u1EDBc, sau \u0111\u00F3 m\u1EDBi c\u00F3 th\u1EC3 th\u00EAm Role.\"\r\n nzShowIcon\r\n ></nz-alert>\r\n\r\n <div *ngIf=\"formData.controls.App_Menu_Id.value\">\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleMenu.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 400px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleMenu\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"false\"\r\n [nzLoading]=\"isLoadingRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"Xem\">C</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"S\u1EEDa\">U</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"S\u1EEDa\">D</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.RoleName }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.RoleCode }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.CanCreate\" [ngModelOptions]=\"{ standalone: true }\"> </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.CanUpdate\" [ngModelOptions]=\"{ standalone: true }\"> </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.CanDelete\" [ngModelOptions]=\"{ standalone: true }\"> </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <icon-delete (click)=\"deleteRoleFromMenu(item)\"></icon-delete>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o Menu\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToMenu()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearch\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearch>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3 Role</th>\r\n <th>T\u00EAn Role</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nz-flex nzJustify=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i5.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzSpinModule }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: NzInputNumberModule }, { kind: "component", type: i6.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzId", "nzSize", "nzPlaceHolder", "nzStatus", "nzStep", "nzMin", "nzMax", "nzPrecision", "nzParser", "nzFormatter", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBordered", "nzKeyboard", "nzControls"], outputs: ["nzOnStep"], exportAs: ["nzInputNumber"] }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: NzSelectModule }, { kind: "ngmodule", type: NzTreeSelectModule }, { kind: "component", type: i3$4.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckboxChange"], exportAs: ["nzTreeSelect"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i6$2.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzLabel", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i15.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i15.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "ngmodule", type: NzEmptyModule }, { kind: "ngmodule", type: NzAlertModule }, { kind: "component", type: i16.NzAlertComponent, selector: "nz-alert", inputs: ["nzAction", "nzCloseText", "nzIconType", "nzMessage", "nzDescription", "nzType", "nzCloseable", "nzShowIcon", "nzBanner", "nzNoAnimation", "nzIcon"], outputs: ["nzOnClose"], exportAs: ["nzAlert"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzDividerModule }, { kind: "component", type: i8$1.NzDividerComponent, selector: "nz-divider", inputs: ["nzText", "nzType", "nzOrientation", "nzVariant", "nzDashed", "nzPlain"], exportAs: ["nzDivider"] }, { kind: "component", type: ButtonDelete, selector: "button-delete" }, { kind: "component", type: ButtonSave, selector: "button-save" }, { kind: "component", type: ButtonBack, selector: "button-back" }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }] });
5426
5577
  }
5427
5578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuDetailComponent, decorators: [{
5428
5579
  type: Component,
@@ -5452,10 +5603,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
5452
5603
  ButtonSave,
5453
5604
  ButtonBack,
5454
5605
  IconDelete,
5455
- ], template: "<form nz-form [formGroup]=\"formData\">\r\n <!-- BUTTONS -->\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-delete *ngIf=\"formData.controls.App_Menu_Id.value\" (click)=\"delete()\"></button-delete>\r\n <button-back (click)=\"goto('/admin/menu')\"></button-back>\r\n </div>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"['0', '16']\">\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Menu cha </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <!-- <nz-select #parentSelect nzShowSearch nzAllowClear formControlName=\"ParentId\">\r\n @for (item of allMenu; track $index) {\r\n <nz-option [nzLabel]=\"item.TreeNodeName\" [nzValue]=\"item.App_Menu_Id\"></nz-option>\r\n }\r\n </nz-select> -->\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n formControlName=\"ParentId\"\r\n ></nz-tree-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Name\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired> T\u00EAn </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Name\" id=\"Name\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Url\" nzLabelAlign=\"left\" nzNoColon=\"true\"> URL </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Url\" id=\"Url\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Icon\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Icon </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Icon\" id=\"Icon\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"OrderValue\" nzLabelAlign=\"left\" nzNoColon=\"true\">Order value</nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-input-number formControlName=\"OrderValue\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: QU\u1EA2N L\u00DD ROLE -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <div style=\"border: 1px solid #d9d9d9; border-radius: 4px; padding: 16px; height: 100%; margin-left: 10px\">\r\n <h4 style=\"margin-top: 0; margin-bottom: 16px\">\r\n <span nz-icon nzType=\"team\" style=\"margin-right: 8px\"></span>\r\n Qu\u1EA3n l\u00FD Role\r\n </h4>\r\n\r\n <!-- Hi\u1EC3n th\u1ECB khi \u0110ANG T\u1EA0O M\u1EDAI (ch\u01B0a c\u00F3 App_Menu_Id) -->\r\n <nz-alert\r\n *ngIf=\"!formData.controls.App_Menu_Id.value\"\r\n nzType=\"info\"\r\n nzMessage=\"Vui l\u00F2ng l\u01B0u Menu tr\u01B0\u1EDBc\"\r\n nzDescription=\"B\u1EA1n c\u1EA7n l\u01B0u Menu tr\u01B0\u1EDBc, sau \u0111\u00F3 m\u1EDBi c\u00F3 th\u1EC3 th\u00EAm Role.\"\r\n nzShowIcon\r\n ></nz-alert>\r\n\r\n <!-- Hi\u1EC3n th\u1ECB khi \u0110ANG C\u1EACP NH\u1EACT (\u0111\u00E3 c\u00F3 App_Menu_Id) -->\r\n <div *ngIf=\"formData.controls.App_Menu_Id.value\">\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleMenu.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 400px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleMenu\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"false\"\r\n [nzLoading]=\"isLoadingRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"Xem\">\r\n <span nz-icon nzType=\"eye\" nzTheme=\"outline\"></span>\r\n </th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"S\u1EEDa\">\r\n <span nz-icon nzType=\"edit\" nzTheme=\"outline\"></span>\r\n </th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.RoleName }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.RoleCode }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.HasViewPermission\" [ngModelOptions]=\"{ standalone: true }\">\r\n </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.HasEditPermission\" [ngModelOptions]=\"{ standalone: true }\">\r\n </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <icon-delete (click)=\"deleteRoleFromMenu(item)\"></icon-delete>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o Menu\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToMenu()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearch\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearch>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3 Role</th>\r\n <th>T\u00EAn Role</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nz-flex nzJustify=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n" }]
5606
+ ], template: "<form nz-form [formGroup]=\"formData\">\r\n <!-- BUTTONS -->\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-delete *ngIf=\"formData.controls.App_Menu_Id.value\" (click)=\"delete()\"></button-delete>\r\n <button-back (click)=\"goto('/admin/menu')\"></button-back>\r\n </div>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"['0', '16']\">\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Menu cha </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-tree-select\r\n class=\"full-width\"\r\n [nzNodes]=\"treeMenu\"\r\n nzShowSearch\r\n nzPlaceHolder=\" \"\r\n formControlName=\"ParentId\"\r\n ></nz-tree-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Name\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired> T\u00EAn </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Name\" id=\"Name\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Url\" nzLabelAlign=\"left\" nzNoColon=\"true\"> URL </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Url\" id=\"Url\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Icon\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Icon </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Icon\" id=\"Icon\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"OrderValue\" nzLabelAlign=\"left\" nzNoColon=\"true\">Order value</nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-input-number formControlName=\"OrderValue\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: QU\u1EA2N L\u00DD ROLE -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <div style=\"border: 1px solid #d9d9d9; border-radius: 4px; padding: 16px; height: 100%; margin-left: 10px\">\r\n <h4 style=\"margin-top: 0; margin-bottom: 16px\">\r\n <span nz-icon nzType=\"team\" style=\"margin-right: 8px\"></span>\r\n Qu\u1EA3n l\u00FD Role\r\n </h4>\r\n\r\n <nz-alert\r\n *ngIf=\"!formData.controls.App_Menu_Id.value\"\r\n nzType=\"info\"\r\n nzMessage=\"Vui l\u00F2ng l\u01B0u Menu tr\u01B0\u1EDBc\"\r\n nzDescription=\"B\u1EA1n c\u1EA7n l\u01B0u Menu tr\u01B0\u1EDBc, sau \u0111\u00F3 m\u1EDBi c\u00F3 th\u1EC3 th\u00EAm Role.\"\r\n nzShowIcon\r\n ></nz-alert>\r\n\r\n <div *ngIf=\"formData.controls.App_Menu_Id.value\">\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleMenu.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 400px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleMenu\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"false\"\r\n [nzLoading]=\"isLoadingRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"Xem\">C</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"S\u1EEDa\">U</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\" nz-tooltip nzTooltipTitle=\"S\u1EEDa\">D</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.RoleName }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.RoleCode }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.CanCreate\" [ngModelOptions]=\"{ standalone: true }\"> </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.CanUpdate\" [ngModelOptions]=\"{ standalone: true }\"> </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.CanDelete\" [ngModelOptions]=\"{ standalone: true }\"> </label>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <icon-delete (click)=\"deleteRoleFromMenu(item)\"></icon-delete>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o Menu\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToMenu()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearch\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearch>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3 Role</th>\r\n <th>T\u00EAn Role</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nz-flex nzJustify=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n" }]
5456
5607
  }] });
5457
5608
 
5458
- const URLs$9 = {
5609
+ const URLs$a = {
5459
5610
  getById: '/api/App_Org/GetById',
5460
5611
  getAll: '/api/App_Org/GetAll',
5461
5612
  getList: '/api/App_Org/GetList',
@@ -5467,23 +5618,23 @@ class OrgService extends HTTPService {
5467
5618
  cms = inject(CommonService);
5468
5619
  getById(id) {
5469
5620
  let pr = new HttpParams().append('id', id);
5470
- return this.postParams(AppGlobals.apiEndpoint + URLs$9.getById, pr);
5621
+ return this.postParams(AppGlobals.apiEndpoint + URLs$a.getById, pr);
5471
5622
  }
5472
5623
  getAll() {
5473
- return this.post(AppGlobals.apiEndpoint + URLs$9.getAll);
5624
+ return this.post(AppGlobals.apiEndpoint + URLs$a.getAll);
5474
5625
  }
5475
5626
  getList(filter) {
5476
- return this.postData(AppGlobals.apiEndpoint + URLs$9.getList, filter);
5627
+ return this.postData(AppGlobals.apiEndpoint + URLs$a.getList, filter);
5477
5628
  }
5478
5629
  getPaging(filter) {
5479
- return this.postData(AppGlobals.apiEndpoint + URLs$9.getPaging, filter);
5630
+ return this.postData(AppGlobals.apiEndpoint + URLs$a.getPaging, filter);
5480
5631
  }
5481
5632
  addOrEdit(obj) {
5482
- return this.postData(AppGlobals.apiEndpoint + URLs$9.addOrEdit, obj);
5633
+ return this.postData(AppGlobals.apiEndpoint + URLs$a.addOrEdit, obj);
5483
5634
  }
5484
5635
  delete(id) {
5485
5636
  const params = new HttpParams().append('id', id);
5486
- return this.postParams(AppGlobals.apiEndpoint + URLs$9.delete, params);
5637
+ return this.postParams(AppGlobals.apiEndpoint + URLs$a.delete, params);
5487
5638
  }
5488
5639
  getAllForLogin(UserName) {
5489
5640
  const params = new HttpParams().append('UserName', UserName);
@@ -5531,6 +5682,11 @@ class OrgFilter extends GridFilter {
5531
5682
  Code;
5532
5683
  Name;
5533
5684
  ParentName;
5685
+ constructor() {
5686
+ super();
5687
+ this.OrderOption.FieldName = 'Code';
5688
+ this.OrderOption.Direction = 'ascend';
5689
+ }
5534
5690
  }
5535
5691
 
5536
5692
  class OrgListComponent extends BaseComponent {
@@ -5592,7 +5748,7 @@ class OrgListComponent extends BaseComponent {
5592
5748
  this.getData();
5593
5749
  }
5594
5750
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: OrgListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5595
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: OrgListComponent, isStandalone: true, selector: "app-org-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th>T\u00EAn \u0111\u01A1n v\u1ECB cha</th>\r\n <th>Th\u1EE9 t\u1EF1</th>\r\n <th>Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Name\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td nz-flex nzGap=\"small\" nzJustify=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }] });
5751
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: OrgListComponent, isStandalone: true, selector: "app-org-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th nzWidth=\"200px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th nzWidth=\"250px\">T\u00EAn \u0111\u01A1n v\u1ECB cha</th>\r\n <th nzWidth=\"75px\">Th\u1EE9 t\u1EF1</th>\r\n <th nzWidth=\"75px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Name\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th nzRight></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }] });
5596
5752
  }
5597
5753
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: OrgListComponent, decorators: [{
5598
5754
  type: Component,
@@ -5608,10 +5764,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
5608
5764
  IconDelete,
5609
5765
  IconCheck,
5610
5766
  ExtendInput,
5611
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th>T\u00EAn \u0111\u01A1n v\u1ECB cha</th>\r\n <th>Th\u1EE9 t\u1EF1</th>\r\n <th>Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Name\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td nz-flex nzGap=\"small\" nzJustify=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
5767
+ Box,
5768
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th nzWidth=\"200px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th nzWidth=\"250px\">T\u00EAn \u0111\u01A1n v\u1ECB cha</th>\r\n <th nzWidth=\"75px\">Th\u1EE9 t\u1EF1</th>\r\n <th nzWidth=\"75px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.Name\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [(_ngModel)]=\"filter.ParentName\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th nzRight></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.ParentName }}</td>\r\n <td>{{ row.OrderValue }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
5612
5769
  }] });
5613
5770
 
5614
- const URLs$8 = {
5771
+ const URLs$9 = {
5615
5772
  getById: '/api/App_User/GetById',
5616
5773
  getByIdEx: '/api/App_User/GetByIdEx',
5617
5774
  getAll: '/api/App_User/GetAll',
@@ -5624,27 +5781,27 @@ class UserService extends HTTPService {
5624
5781
  cms = inject(CommonService);
5625
5782
  getById(id) {
5626
5783
  const params = new HttpParams().append('id', id);
5627
- return this.postParams(AppGlobals.apiEndpoint + URLs$8.getById, params);
5784
+ return this.postParams(AppGlobals.apiEndpoint + URLs$9.getById, params);
5628
5785
  }
5629
5786
  getByIdEx(id) {
5630
5787
  const params = new HttpParams().append('id', id);
5631
- return this.postParams(AppGlobals.apiEndpoint + URLs$8.getByIdEx, params);
5788
+ return this.postParams(AppGlobals.apiEndpoint + URLs$9.getByIdEx, params);
5632
5789
  }
5633
5790
  getAll() {
5634
- return this.post(AppGlobals.apiEndpoint + URLs$8.getAll);
5791
+ return this.post(AppGlobals.apiEndpoint + URLs$9.getAll);
5635
5792
  }
5636
5793
  getList(filter) {
5637
- return this.postData(AppGlobals.apiEndpoint + URLs$8.getList, filter);
5794
+ return this.postData(AppGlobals.apiEndpoint + URLs$9.getList, filter);
5638
5795
  }
5639
5796
  getPaging(filter) {
5640
- return this.postData(AppGlobals.apiEndpoint + URLs$8.getPaging, filter);
5797
+ return this.postData(AppGlobals.apiEndpoint + URLs$9.getPaging, filter);
5641
5798
  }
5642
5799
  addOrEdit(obj) {
5643
- return this.postData(AppGlobals.apiEndpoint + URLs$8.addOrEdit, obj);
5800
+ return this.postData(AppGlobals.apiEndpoint + URLs$9.addOrEdit, obj);
5644
5801
  }
5645
5802
  delete(id) {
5646
5803
  const params = new HttpParams().append('id', id);
5647
- return this.postParams(AppGlobals.apiEndpoint + URLs$8.delete, params);
5804
+ return this.postParams(AppGlobals.apiEndpoint + URLs$9.delete, params);
5648
5805
  }
5649
5806
  importUser(data) {
5650
5807
  return this.postData(`${AppGlobals.apiEndpoint}/api/App_User/ImportUser`, data);
@@ -5970,6 +6127,11 @@ class App_Role {
5970
6127
  class RoleFilter extends GridFilter {
5971
6128
  Code;
5972
6129
  Name;
6130
+ constructor() {
6131
+ super();
6132
+ this.OrderOption.FieldName = 'Code';
6133
+ this.OrderOption.Direction = 'ascend';
6134
+ }
5973
6135
  }
5974
6136
 
5975
6137
  class RoleMenuPermission extends BaseComponent {
@@ -5981,13 +6143,12 @@ class RoleMenuPermission extends BaseComponent {
5981
6143
  lstRoleMenuRef = [];
5982
6144
  roleFilter = new RoleFilter();
5983
6145
  menuFilter = new MenuFilter();
5984
- // Mapping quyền: RoleId -> MenuId -> boolean
5985
6146
  roleMenuMap = {};
5986
- // Quản lý trạng thái Checkbox của từng cột (Role) trên Thead
6147
+ originalRefMap = new Map();
5987
6148
  roleColumnState = {};
5988
- ngOnInit() {
5989
- // this.getData();
5990
- }
6149
+ pendingInserts = new Map();
6150
+ pendingDeletes = new Map();
6151
+ ngOnInit() { }
5991
6152
  getData() {
5992
6153
  Promise.all([
5993
6154
  this.roleService.getList(this.roleFilter),
@@ -6003,22 +6164,24 @@ class RoleMenuPermission extends BaseComponent {
6003
6164
  .catch((err) => this.handleError(err));
6004
6165
  }
6005
6166
  initializeRoleMenuMap() {
6167
+ this.pendingInserts.clear();
6168
+ this.pendingDeletes.clear();
6006
6169
  this.roleMenuMap = {};
6007
- // 1. Dùng Set để tra cứu O(1) thay vì dùng Array.find()
6008
- const roleMenuSet = new Set(this.lstRoleMenuRef.map((x) => `${x.App_Role_Id}_${x.App_Menu_Id}`));
6170
+ this.originalRefMap.clear();
6171
+ this.lstRoleMenuRef.forEach((x) => {
6172
+ this.originalRefMap.set(`${x.App_Role_Id}_${x.App_Menu_Id}`, x.App_Role_Menu_Ref_Id);
6173
+ });
6009
6174
  this.lstRole.forEach((role) => {
6010
6175
  const roleId = role.App_Role_Id;
6011
6176
  this.roleMenuMap[roleId] = {};
6012
6177
  this.lstMenu.forEach((menu) => {
6013
6178
  const menuId = menu.App_Menu_Id;
6014
- // 2. Lookup siêu tốc bằng Set.has()
6015
- this.roleMenuMap[roleId][menuId] = roleMenuSet.has(`${roleId}_${menuId}`);
6179
+ const key = `${roleId}_${menuId}`;
6180
+ this.roleMenuMap[roleId][menuId] = this.originalRefMap.has(key);
6016
6181
  });
6017
- // 3. Tính toán sẵn trạng thái Select All cho cột Role hiện tại
6018
6182
  this.updateRoleColumnState(roleId);
6019
6183
  });
6020
6184
  }
6021
- // Cập nhật trạng thái Checked / Indeterminate cho cột Role
6022
6185
  updateRoleColumnState(roleId) {
6023
6186
  if (!this.lstMenu.length) {
6024
6187
  this.roleColumnState[roleId] = { checked: false, indeterminate: false };
@@ -6035,45 +6198,59 @@ class RoleMenuPermission extends BaseComponent {
6035
6198
  indeterminate: checkedCount > 0 && checkedCount < this.lstMenu.length,
6036
6199
  };
6037
6200
  }
6038
- // Khi click vào Checkbox All trên Thead
6201
+ trackChange(roleId, menuId, isChecked) {
6202
+ const key = `${roleId}_${menuId}`;
6203
+ const originalRefId = this.originalRefMap.get(key);
6204
+ if (isChecked) {
6205
+ if (originalRefId) {
6206
+ this.pendingDeletes.delete(key);
6207
+ }
6208
+ else {
6209
+ this.pendingInserts.set(key, { App_Role_Id: roleId, App_Menu_Id: menuId });
6210
+ }
6211
+ }
6212
+ else {
6213
+ if (originalRefId) {
6214
+ this.pendingDeletes.set(key, {
6215
+ App_Role_Menu_Ref_Id: originalRefId,
6216
+ App_Role_Id: roleId,
6217
+ App_Menu_Id: menuId,
6218
+ });
6219
+ }
6220
+ else {
6221
+ this.pendingInserts.delete(key);
6222
+ }
6223
+ }
6224
+ }
6039
6225
  toggleRolePermissions(roleId, checked) {
6040
6226
  this.lstMenu.forEach((menu) => {
6041
- this.roleMenuMap[roleId][menu.App_Menu_Id] = checked;
6227
+ const menuId = menu.App_Menu_Id;
6228
+ this.roleMenuMap[roleId][menuId] = checked;
6229
+ this.trackChange(roleId, menuId, checked);
6042
6230
  });
6043
- // Tính lại trạng thái của cột này
6044
6231
  this.updateRoleColumnState(roleId);
6045
6232
  }
6046
- // Khi click vào từng Checkbox lẻ trong Tbody
6047
- onSinglePermissionChange(roleId) {
6233
+ onSinglePermissionChange(roleId, menuId, isChecked) {
6234
+ this.trackChange(roleId, menuId, isChecked);
6048
6235
  this.updateRoleColumnState(roleId);
6049
6236
  }
6050
- convertRoleMenuMapToArray() {
6051
- const result = [];
6052
- Object.keys(this.roleMenuMap).forEach((roleId) => {
6053
- Object.keys(this.roleMenuMap[roleId]).forEach((menuId) => {
6054
- result.push({
6055
- RoleId: roleId,
6056
- MenuId: menuId,
6057
- IsChecked: this.roleMenuMap[roleId][menuId],
6058
- });
6059
- });
6060
- });
6061
- return result;
6062
- }
6063
6237
  saveRoleMenuMap() {
6064
- const map = this.convertRoleMenuMapToArray();
6065
- const payload = map
6066
- .filter((x) => x.IsChecked)
6067
- .map((x) => {
6068
- return {
6069
- App_Role_Id: x.RoleId,
6070
- App_Menu_Id: x.MenuId,
6071
- };
6072
- });
6073
- this.permissionService.updateRoleMenuRef(payload).then(() => this.success(), (err) => this.handleError(err));
6238
+ const listInsert = Array.from(this.pendingInserts.values());
6239
+ const listDelete = Array.from(this.pendingDeletes.values());
6240
+ if (listInsert.length === 0 && listDelete.length === 0) {
6241
+ return;
6242
+ }
6243
+ const payload = {
6244
+ InsertList: listInsert,
6245
+ DeleteList: listDelete,
6246
+ };
6247
+ this.permissionService.updateRoleMenuRef(payload).then(() => {
6248
+ this.success();
6249
+ this.getData();
6250
+ }, (err) => this.handleError(err));
6074
6251
  }
6075
6252
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RoleMenuPermission, deps: null, target: i0.ɵɵFactoryTarget.Component });
6076
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: RoleMenuPermission, isStandalone: true, selector: "app-role-menu-permission", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveRoleMenuMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"lstMenu\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\">\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Menu ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"menuFilter.Name\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"roleColumnState[role.App_Role_Id!].checked\"\r\n [nzIndeterminate]=\"roleColumnState[role.App_Role_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleRolePermissions(role.App_Role_Id!, $event)\"\r\n ></label>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (menu of lstMenu; track menu.App_Menu_Id) {\r\n <tr>\r\n <td>{{ menu.TreeNodeName }}</td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"roleMenuMap[role.App_Role_Id!][menu.App_Menu_Id]\"\r\n (ngModelChange)=\"onSinglePermissionChange(role.App_Role_Id!)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: NzSpinModule }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzButtonModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonSave, selector: "button-save" }, { kind: "component", type: ButtonReload, selector: "button-reload" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }] });
6253
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: RoleMenuPermission, isStandalone: true, selector: "app-role-menu-permission", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveRoleMenuMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"lstMenu\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\">\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Menu ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"menuFilter.Name\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"roleColumnState[role.App_Role_Id!].checked\"\r\n [nzIndeterminate]=\"roleColumnState[role.App_Role_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleRolePermissions(role.App_Role_Id!, $event)\"\r\n ></label>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (menu of lstMenu; track menu.App_Menu_Id) {\r\n <tr>\r\n <td>{{ menu.TreeNodeName }}</td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"roleMenuMap[role.App_Role_Id!][menu.App_Menu_Id]\"\r\n (ngModelChange)=\"onSinglePermissionChange(role.App_Role_Id!, menu.App_Menu_Id!, $event)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: NzSpinModule }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzButtonModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonSave, selector: "button-save" }, { kind: "component", type: ButtonReload, selector: "button-reload" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }] });
6077
6254
  }
6078
6255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RoleMenuPermission, decorators: [{
6079
6256
  type: Component,
@@ -6089,7 +6266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
6089
6266
  ButtonSave,
6090
6267
  ButtonReload,
6091
6268
  ExtendInput,
6092
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveRoleMenuMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"lstMenu\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\">\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Menu ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"menuFilter.Name\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"roleColumnState[role.App_Role_Id!].checked\"\r\n [nzIndeterminate]=\"roleColumnState[role.App_Role_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleRolePermissions(role.App_Role_Id!, $event)\"\r\n ></label>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (menu of lstMenu; track menu.App_Menu_Id) {\r\n <tr>\r\n <td>{{ menu.TreeNodeName }}</td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"roleMenuMap[role.App_Role_Id!][menu.App_Menu_Id]\"\r\n (ngModelChange)=\"onSinglePermissionChange(role.App_Role_Id!)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n" }]
6269
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveRoleMenuMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table [nzData]=\"lstMenu\" nzShowPagination=\"false\" [nzBordered]=\"true\" [nzSize]=\"'small'\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\">\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Menu ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"menuFilter.Name\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n <tr>\r\n <th nzWidth=\"200px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"roleColumnState[role.App_Role_Id!].checked\"\r\n [nzIndeterminate]=\"roleColumnState[role.App_Role_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleRolePermissions(role.App_Role_Id!, $event)\"\r\n ></label>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (menu of lstMenu; track menu.App_Menu_Id) {\r\n <tr>\r\n <td>{{ menu.TreeNodeName }}</td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"roleMenuMap[role.App_Role_Id!][menu.App_Menu_Id]\"\r\n (ngModelChange)=\"onSinglePermissionChange(role.App_Role_Id!, menu.App_Menu_Id!, $event)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n" }]
6093
6270
  }] });
6094
6271
 
6095
6272
  class App_User {
@@ -6127,8 +6304,11 @@ class UserFilter extends GridFilter {
6127
6304
  UserName;
6128
6305
  FullName;
6129
6306
  OrgName;
6130
- isUserNameSearch = false;
6131
- isOrgNameSearch = false;
6307
+ constructor() {
6308
+ super();
6309
+ this.OrderOption.FieldName = 'UserName';
6310
+ this.OrderOption.Direction = 'ascend';
6311
+ }
6132
6312
  }
6133
6313
 
6134
6314
  class UserRolePermission extends BaseComponent {
@@ -6140,13 +6320,12 @@ class UserRolePermission extends BaseComponent {
6140
6320
  lstUserRoleRef = [];
6141
6321
  roleFilter = new RoleFilter();
6142
6322
  userFilter = new UserFilter();
6143
- // Lưu trữ mapping quyền
6144
6323
  userRoleMap = {};
6145
- // Lưu trữ trạng thái Checkbox của cột "Chọn tất cả" cho từng User để tránh gọi hàm trong HTML
6324
+ originalRefMap = new Map();
6146
6325
  userRowState = {};
6147
- ngOnInit() {
6148
- // this.getData();
6149
- }
6326
+ pendingInserts = new Map();
6327
+ pendingDeletes = new Map();
6328
+ ngOnInit() { }
6150
6329
  getData() {
6151
6330
  Promise.all([
6152
6331
  this.roleService.getList(this.roleFilter),
@@ -6162,7 +6341,12 @@ class UserRolePermission extends BaseComponent {
6162
6341
  .catch((err) => this.handleError(err));
6163
6342
  }
6164
6343
  initializeRoleMenuMap() {
6165
- const userRoleSet = new Set(this.lstUserRoleRef.map((x) => `${x.App_User_Id}_${x.App_Role_Id}`));
6344
+ this.pendingInserts.clear();
6345
+ this.pendingDeletes.clear();
6346
+ this.originalRefMap.clear();
6347
+ this.lstUserRoleRef.forEach((x) => {
6348
+ this.originalRefMap.set(`${x.App_User_Id}_${x.App_Role_Id}`, x.App_User_Role_Ref_Id);
6349
+ });
6166
6350
  this.lstUser.forEach((user) => {
6167
6351
  const userId = user.App_User_Id;
6168
6352
  if (!this.userRoleMap[userId]) {
@@ -6170,8 +6354,9 @@ class UserRolePermission extends BaseComponent {
6170
6354
  }
6171
6355
  this.lstRole.forEach((role) => {
6172
6356
  const roleId = role.App_Role_Id;
6357
+ const key = `${userId}_${roleId}`;
6173
6358
  if (this.userRoleMap[userId][roleId] === undefined) {
6174
- this.userRoleMap[userId][roleId] = userRoleSet.has(`${userId}_${roleId}`);
6359
+ this.userRoleMap[userId][roleId] = this.originalRefMap.has(key);
6175
6360
  }
6176
6361
  });
6177
6362
  this.updateUserRowState(userId);
@@ -6193,45 +6378,59 @@ class UserRolePermission extends BaseComponent {
6193
6378
  indeterminate: checkedCount > 0 && checkedCount < this.lstRole.length,
6194
6379
  };
6195
6380
  }
6196
- // Xử lý khi click vào Checkbox chọn tất cả của một dòng
6197
- toggleUserPermissions(userId, checked) {
6198
- this.lstRole.forEach((role) => {
6199
- this.userRoleMap[userId][role.App_Role_Id] = checked;
6200
- });
6201
- // Cập nhật lại state của dòng
6202
- this.updateUserRowState(userId);
6381
+ trackChange(userId, roleId, isChecked) {
6382
+ const key = `${userId}_${roleId}`;
6383
+ const originalRefId = this.originalRefMap.get(key);
6384
+ if (isChecked) {
6385
+ if (originalRefId) {
6386
+ this.pendingDeletes.delete(key);
6387
+ }
6388
+ else {
6389
+ this.pendingInserts.set(key, { App_User_Id: userId, App_Role_Id: roleId });
6390
+ }
6391
+ }
6392
+ else {
6393
+ if (originalRefId) {
6394
+ this.pendingDeletes.set(key, {
6395
+ App_User_Role_Ref_Id: originalRefId,
6396
+ App_User_Id: userId,
6397
+ App_Role_Id: roleId,
6398
+ });
6399
+ }
6400
+ else {
6401
+ this.pendingInserts.delete(key);
6402
+ }
6403
+ }
6203
6404
  }
6204
- // Xử lý khi click vào Checkbox của từng quyền lẻ
6205
- onSinglePermissionChange(userId) {
6405
+ onSinglePermissionChange(userId, roleId, isChecked) {
6406
+ this.trackChange(userId, roleId, isChecked);
6206
6407
  this.updateUserRowState(userId);
6207
6408
  }
6208
- convertUserRoleMapToArray() {
6209
- const result = [];
6210
- Object.keys(this.userRoleMap).forEach((userId) => {
6211
- Object.keys(this.userRoleMap[userId]).forEach((roleId) => {
6212
- result.push({
6213
- UserId: userId,
6214
- RoleId: roleId,
6215
- IsChecked: this.userRoleMap[userId][roleId],
6216
- });
6217
- });
6409
+ toggleUserPermissions(userId, checked) {
6410
+ this.lstRole.forEach((role) => {
6411
+ const roleId = role.App_Role_Id;
6412
+ this.userRoleMap[userId][roleId] = checked;
6413
+ this.trackChange(userId, roleId, checked);
6218
6414
  });
6219
- return result;
6415
+ this.updateUserRowState(userId);
6220
6416
  }
6221
6417
  saveUserRoleMap() {
6222
- const userRoleMap = this.convertUserRoleMapToArray();
6223
- const payload = userRoleMap
6224
- .filter((x) => x.IsChecked)
6225
- .map((x) => {
6226
- return {
6227
- App_User_Id: x.UserId,
6228
- App_Role_Id: x.RoleId,
6229
- };
6230
- });
6231
- this.permissionService.updateUserRoleRef(payload).then(() => this.success(), (err) => this.handleError(err));
6418
+ const listInsert = Array.from(this.pendingInserts.values());
6419
+ const listDelete = Array.from(this.pendingDeletes.values());
6420
+ if (listInsert.length === 0 && listDelete.length === 0) {
6421
+ return;
6422
+ }
6423
+ const payload = {
6424
+ InsertList: listInsert,
6425
+ DeleteList: listDelete,
6426
+ };
6427
+ this.permissionService.updateUserRoleRef(payload).then(() => {
6428
+ this.success();
6429
+ this.getData();
6430
+ }, (err) => this.handleError(err));
6232
6431
  }
6233
6432
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: UserRolePermission, deps: null, target: i0.ɵɵFactoryTarget.Component });
6234
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: UserRolePermission, isStandalone: true, selector: "app-user-role-permission", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveUserRoleMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"lstUser\"\r\n nzShowPagination=\"false\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzScroll]=\"{ x: 'auto' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\">\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search User ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"userFilter.FullName\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n <th nzWidth=\"40px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (user of lstUser; track user.App_User_Id) {\r\n <tr>\r\n <td>{{ user.FullName }}</td>\r\n <td>\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"userRowState[user.App_User_Id!].checked\"\r\n [nzIndeterminate]=\"userRowState[user.App_User_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleUserPermissions(user.App_User_Id!, $event)\"\r\n ></label>\r\n </td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"userRoleMap[user.App_User_Id!][role.App_Role_Id!]\"\r\n (ngModelChange)=\"onSinglePermissionChange(user.App_User_Id!)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: NzSpinModule }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzButtonModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonSave, selector: "button-save" }, { kind: "component", type: ButtonReload, selector: "button-reload" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }] });
6433
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: UserRolePermission, isStandalone: true, selector: "app-user-role-permission", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveUserRoleMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"lstUser\"\r\n nzShowPagination=\"false\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzScroll]=\"{ x: 'auto' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\" nzLeft>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search User ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"userFilter.FullName\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n <th nzWidth=\"50px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (user of lstUser; track user.App_User_Id) {\r\n <tr>\r\n <td nzLeft>{{ user.FullName }}</td>\r\n <td>\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"userRowState[user.App_User_Id!].checked\"\r\n [nzIndeterminate]=\"userRowState[user.App_User_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleUserPermissions(user.App_User_Id!, $event)\"\r\n ></label>\r\n </td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"userRoleMap[user.App_User_Id!][role.App_Role_Id!]\"\r\n (ngModelChange)=\"onSinglePermissionChange(user.App_User_Id!, role.App_Role_Id!, $event)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: NzSpinModule }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzButtonModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonSave, selector: "button-save" }, { kind: "component", type: ButtonReload, selector: "button-reload" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }] });
6235
6434
  }
6236
6435
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: UserRolePermission, decorators: [{
6237
6436
  type: Component,
@@ -6247,7 +6446,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
6247
6446
  ButtonSave,
6248
6447
  ButtonReload,
6249
6448
  ExtendInput,
6250
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveUserRoleMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"lstUser\"\r\n nzShowPagination=\"false\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzScroll]=\"{ x: 'auto' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\">\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search User ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"userFilter.FullName\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n <th nzWidth=\"40px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (user of lstUser; track user.App_User_Id) {\r\n <tr>\r\n <td>{{ user.FullName }}</td>\r\n <td>\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"userRowState[user.App_User_Id!].checked\"\r\n [nzIndeterminate]=\"userRowState[user.App_User_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleUserPermissions(user.App_User_Id!, $event)\"\r\n ></label>\r\n </td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"userRoleMap[user.App_User_Id!][role.App_Role_Id!]\"\r\n (ngModelChange)=\"onSinglePermissionChange(user.App_User_Id!)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n" }]
6449
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-save (click)=\"saveUserRoleMap()\"></button-save>\r\n <button-reload (click)=\"getData()\"></button-reload>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n [nzData]=\"lstUser\"\r\n nzShowPagination=\"false\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzScroll]=\"{ x: 'auto' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"200px\" nzLeft>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search Role ...'\"\r\n [(_ngModel)]=\"roleFilter.Name\"\r\n [showClear]=\"true\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [placeHolder]=\"'Search User ...'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"userFilter.FullName\"\r\n (keyup.enter)=\"getData()\"\r\n (onclickClearIcon)=\"getData()\"\r\n ></extend-input>\r\n </th>\r\n <th nzWidth=\"50px\"></th>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <th style=\"text-align: center\">{{ role.Name }}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (user of lstUser; track user.App_User_Id) {\r\n <tr>\r\n <td nzLeft>{{ user.FullName }}</td>\r\n <td>\r\n <label\r\n nz-checkbox\r\n [nzChecked]=\"userRowState[user.App_User_Id!].checked\"\r\n [nzIndeterminate]=\"userRowState[user.App_User_Id!].indeterminate\"\r\n (nzCheckedChange)=\"toggleUserPermissions(user.App_User_Id!, $event)\"\r\n ></label>\r\n </td>\r\n @for (role of lstRole; track role.App_Role_Id) {\r\n <td class=\"text-center\">\r\n <label\r\n nz-checkbox\r\n [(ngModel)]=\"userRoleMap[user.App_User_Id!][role.App_Role_Id!]\"\r\n (ngModelChange)=\"onSinglePermissionChange(user.App_User_Id!, role.App_Role_Id!, $event)\"\r\n ></label>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</div>\r\n" }]
6251
6450
  }] });
6252
6451
 
6253
6452
  class RolePermissionComponent extends BaseComponent {
@@ -6255,41 +6454,77 @@ class RolePermissionComponent extends BaseComponent {
6255
6454
  permissionService = inject(PermissionService);
6256
6455
  lstRole = [];
6257
6456
  resourceGroups = [];
6258
- // Lưu trữ danh sách PermissionCode đang được tích chọn cho Role hiện tại
6259
6457
  selectedPermissionIds = new Set();
6458
+ originalPermissionMap = new Map();
6459
+ pendingInserts = new Map();
6460
+ pendingDeletes = new Map();
6260
6461
  ngOnInit() {
6261
- // this.loadRoles();
6262
- // this.loadAllResources(); // Load khung Matrix (danh mục Module & Actions)
6263
- }
6264
- // --- 1. Gọi API lấy danh sách Role động ---
6265
- loadRoles() {
6266
- this.roleService.getAll().then((res) => (this.lstRole = res.Data || []));
6267
- }
6268
- // --- 2. Gọi API lấy danh mục Resource và Permission (Ma trận tĩnh) ---
6269
- loadAllResources() {
6270
- this.permissionService.getPermissionGroupByCode().then((res) => (this.resourceGroups = res.Data), (err) => this.handleError(err));
6462
+ this.isLoading = true;
6463
+ Promise.all([this.roleService.getAll(), this.permissionService.getPermissionGroupByCode()])
6464
+ .then(([roleRes, resourceRes]) => {
6465
+ this.lstRole = roleRes.Data || [];
6466
+ this.resourceGroups = resourceRes.Data || [];
6467
+ })
6468
+ .catch((err) => {
6469
+ this.handleError(err);
6470
+ })
6471
+ .finally(() => {
6472
+ this.isLoading = false;
6473
+ });
6271
6474
  }
6272
- // --- 3. Xử lý khi User đổi Role ---
6273
6475
  onRoleChange(roleId) {
6274
- if (!roleId)
6476
+ if (!roleId) {
6477
+ this.resetStates();
6275
6478
  return;
6479
+ }
6276
6480
  this.isLoading = true;
6277
- // Xóa state cũ
6278
- this.selectedPermissionIds.clear();
6279
- let activePermsFromDb = [];
6481
+ this.resetStates();
6280
6482
  this.permissionService
6281
6483
  .getRolePermissions(roleId)
6282
6484
  .then((res) => {
6283
- activePermsFromDb = res.Data || [];
6284
- this.selectedPermissionIds = new Set(activePermsFromDb);
6485
+ const activePermsFromDb = res.Data || [];
6486
+ activePermsFromDb.forEach((item) => {
6487
+ this.selectedPermissionIds.add(item.App_Permission_Id);
6488
+ if (item.App_Role_Permission_Ref_Id) {
6489
+ this.originalPermissionMap.set(item.App_Permission_Id, item.App_Role_Permission_Ref_Id);
6490
+ }
6491
+ });
6285
6492
  }, (err) => this.handleError(err))
6286
6493
  .finally(() => (this.isLoading = false));
6287
- this.loadAllResources();
6288
6494
  }
6289
- // --- 4. Logic UI: Thao tác Check/Uncheck ---
6495
+ resetStates() {
6496
+ this.selectedPermissionIds.clear();
6497
+ this.originalPermissionMap.clear();
6498
+ this.pendingInserts.clear();
6499
+ this.pendingDeletes.clear();
6500
+ }
6290
6501
  isPermissionChecked(id) {
6291
6502
  return this.selectedPermissionIds.has(id);
6292
6503
  }
6504
+ trackChange(permissionId, isChecked) {
6505
+ const originalRefId = this.originalPermissionMap.get(permissionId);
6506
+ const roleId = this.selectedId + '';
6507
+ if (isChecked) {
6508
+ if (originalRefId) {
6509
+ this.pendingDeletes.delete(permissionId);
6510
+ }
6511
+ else {
6512
+ this.pendingInserts.set(permissionId, { App_Role_Id: roleId, App_Permission_Id: permissionId });
6513
+ }
6514
+ }
6515
+ else {
6516
+ if (originalRefId) {
6517
+ this.pendingDeletes.set(permissionId, {
6518
+ App_Role_Permission_Ref_Id: originalRefId,
6519
+ App_Role_Id: roleId,
6520
+ App_Permission_Id: permissionId,
6521
+ });
6522
+ }
6523
+ else {
6524
+ this.pendingInserts.delete(permissionId);
6525
+ }
6526
+ }
6527
+ }
6293
6528
  onCheckChange(id, isChecked) {
6294
6529
  if (isChecked) {
6295
6530
  this.selectedPermissionIds.add(id);
@@ -6297,20 +6532,27 @@ class RolePermissionComponent extends BaseComponent {
6297
6532
  else {
6298
6533
  this.selectedPermissionIds.delete(id);
6299
6534
  }
6535
+ this.trackChange(id, isChecked);
6300
6536
  }
6301
- // --- 5. Lưu xuống DB ---
6302
6537
  savePermissions() {
6303
6538
  if (!this.selectedId)
6304
6539
  return;
6540
+ const listInsert = Array.from(this.pendingInserts.values());
6541
+ const listDelete = Array.from(this.pendingDeletes.values());
6542
+ if (listInsert.length === 0 && listDelete.length === 0) {
6543
+ return;
6544
+ }
6305
6545
  this.isSaving = true;
6306
6546
  const payload = {
6307
- roleId: this.selectedId + '',
6308
- // Chuyển Set về lại Array để gửi API
6309
- permissionIds: Array.from(this.selectedPermissionIds),
6547
+ InsertList: listInsert,
6548
+ DeleteList: listDelete,
6310
6549
  };
6311
6550
  this.permissionService
6312
- .addRoleResourcePermissionRef({ roleId: payload.roleId, lstPermissionId: payload.permissionIds })
6313
- .then((res) => this.notiService.success('Đã lưu cấu hình phân quyền thành công!'), (err) => this.handleError(err))
6551
+ .addRoleResourcePermissionRef(payload)
6552
+ .then((res) => {
6553
+ this.success();
6554
+ this.onRoleChange(this.selectedId + '');
6555
+ }, (err) => this.handleError(err))
6314
6556
  .finally(() => (this.isSaving = false));
6315
6557
  }
6316
6558
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RolePermissionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
@@ -6639,7 +6881,6 @@ class PermissionComponent extends BaseComponent {
6639
6881
  ];
6640
6882
  }
6641
6883
  else if (tabIndex == 3) {
6642
- this.roleResource.loadRoles();
6643
6884
  Breadcrumb.lstBreadcrumb = [
6644
6885
  {
6645
6886
  Name: 'Permission',
@@ -6723,7 +6964,7 @@ class RoleListComponent extends BaseComponent {
6723
6964
  this.getData();
6724
6965
  }
6725
6966
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RoleListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
6726
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: RoleListComponent, isStandalone: true, selector: "app-role-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"getData()\"></button-search>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Code</th>\r\n <th>Name</th>\r\n <th>Description</th>\r\n <th>Active</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Code\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }] });
6967
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: RoleListComponent, isStandalone: true, selector: "app-role-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"getData()\"></button-search>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n nzWidth=\"250px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Name' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Name'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Name\r\n </th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Description' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Description'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Description\r\n </th>\r\n <th\r\n nzWidth=\"75px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'IsActive' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'IsActive'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Active\r\n </th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Code\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }] });
6727
6968
  }
6728
6969
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: RoleListComponent, decorators: [{
6729
6970
  type: Component,
@@ -6740,7 +6981,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
6740
6981
  IconDelete,
6741
6982
  ExtendInput,
6742
6983
  Box,
6743
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"getData()\"></button-search>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Code</th>\r\n <th>Name</th>\r\n <th>Description</th>\r\n <th>Active</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Code\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
6984
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"getData()\"></button-search>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n nzWidth=\"250px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Name' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Name'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Name\r\n </th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Description' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Description'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Description\r\n </th>\r\n <th\r\n nzWidth=\"75px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'IsActive' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'IsActive'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Active\r\n </th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Code\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th>\r\n <extend-input\r\n [size]=\"'small'\"\r\n [showClear]=\"true\"\r\n [(_ngModel)]=\"filter.Name\"\r\n (onclickClearIcon)=\"search()\"\r\n ></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Name }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\r\n <icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
6744
6985
  }] });
6745
6986
 
6746
6987
  class RoleDetailComponent extends BaseComponent {
@@ -7172,7 +7413,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7172
7413
  args: ['parentSelect', { static: false }]
7173
7414
  }] } });
7174
7415
 
7175
- const URLs$7 = {
7416
+ const URLs$8 = {
7176
7417
  getById: '/api/App_Setting/GetById',
7177
7418
  getAll: '/api/App_Setting/GetAll',
7178
7419
  getList: '/api/App_Setting/GetList',
@@ -7188,34 +7429,34 @@ let SettingService$1 = class SettingService extends HTTPService {
7188
7429
  commonService = inject(CommonService);
7189
7430
  getById(id) {
7190
7431
  const params = new HttpParams().append('id', id);
7191
- return this.postParams(AppGlobals.apiEndpoint + URLs$7.getById, params);
7432
+ return this.postParams(AppGlobals.apiEndpoint + URLs$8.getById, params);
7192
7433
  }
7193
7434
  getPaging(filter) {
7194
- return this.postData(AppGlobals.apiEndpoint + URLs$7.getPaging, filter);
7435
+ return this.postData(AppGlobals.apiEndpoint + URLs$8.getPaging, filter);
7195
7436
  }
7196
7437
  addOrEdit(obj) {
7197
- return this.postData(AppGlobals.apiEndpoint + URLs$7.addOrEdit, obj);
7438
+ return this.postData(AppGlobals.apiEndpoint + URLs$8.addOrEdit, obj);
7198
7439
  }
7199
7440
  delete(id) {
7200
7441
  const params = new HttpParams().append('id', id);
7201
- return this.postParams(AppGlobals.apiEndpoint + URLs$7.delete, params);
7442
+ return this.postParams(AppGlobals.apiEndpoint + URLs$8.delete, params);
7202
7443
  }
7203
7444
  getByCodeAnonymous(code) {
7204
7445
  const params = new HttpParams().append('Code', code);
7205
- return this.getParams(AppGlobals.apiEndpoint + URLs$7.getByCodeAnonymous, params);
7446
+ return this.getParams(AppGlobals.apiEndpoint + URLs$8.getByCodeAnonymous, params);
7206
7447
  }
7207
7448
  // getGroupByCodeAnonymous(code: string) {
7208
7449
  // const params = new HttpParams().append('Code', code);
7209
7450
  // return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);
7210
7451
  // }
7211
7452
  getAllConfig() {
7212
- return this.post(AppGlobals.apiEndpoint + URLs$7.GetAllConfig);
7453
+ return this.post(AppGlobals.apiEndpoint + URLs$8.GetAllConfig);
7213
7454
  }
7214
7455
  applyConfig(config) {
7215
- return this.postData(AppGlobals.apiEndpoint + URLs$7.ApplyConfig, config);
7456
+ return this.postData(AppGlobals.apiEndpoint + URLs$8.ApplyConfig, config);
7216
7457
  }
7217
7458
  getDbInfo() {
7218
- return this.post(AppGlobals.apiEndpoint + URLs$7.GetDbInfo);
7459
+ return this.post(AppGlobals.apiEndpoint + URLs$8.GetDbInfo);
7219
7460
  }
7220
7461
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7221
7462
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingService, providedIn: 'root' });
@@ -7259,6 +7500,11 @@ class App_SettingFilter extends GridFilter {
7259
7500
  Value;
7260
7501
  Description;
7261
7502
  IsActive;
7503
+ constructor() {
7504
+ super();
7505
+ this.OrderOption.FieldName = 'Code';
7506
+ this.OrderOption.Direction = 'ascend';
7507
+ }
7262
7508
  }
7263
7509
 
7264
7510
  class SettingListComponent extends BaseComponent {
@@ -7335,7 +7581,7 @@ class SettingListComponent extends BaseComponent {
7335
7581
  this.getData();
7336
7582
  }
7337
7583
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7338
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SettingListComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Code</th>\r\n <th>Value</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\">Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Value\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Description\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"filter.IsActive\"></extend-checkbox>\r\n </th>\r\n <th class=\"center\">\r\n <nz-icon\r\n nzType=\"plus\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); add()\"\r\n ></nz-icon>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.Code }}</td>\r\n <td>{{ row.Value }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"text-center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n <a\r\n nz-popconfirm\r\n nzOkDanger\r\n nzPopconfirmPlacement=\"top\"\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n (click)=\"$event.stopPropagation()\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [required]=\"true\" [(_ngModel)]=\"selectedRow.Code\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.Value\"></extend-input>\r\n </td>\r\n <td class=\"form-item-no-bottom\">\r\n <extend-textarea [minRows]=\"1\" [(_ngModel)]=\"selectedRow.Description\"></extend-textarea>\r\n </td>\r\n <td class=\"text-center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"text-center\">\r\n <nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); save()\"\r\n ></nz-icon>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "directive", type: i9.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nzPopconfirmTitleContext", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDisabled", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: ExtendTextArea, selector: "extend-textarea", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "displayInline", "formItemNoButtom", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "selectModeType", "inputClass", "size", "isSubmited", "minRows", "maxRows", "lstItem", "displayField", "valueField", "formData", "controlName", "_ngModel", "isTouched", "inputErrorMessage", "errorMessages"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }] });
7584
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SettingListComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th>Value</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\">Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Value\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Description\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"filter.IsActive\"></extend-checkbox>\r\n </th>\r\n <th class=\"center\">\r\n <nz-icon\r\n nzType=\"plus\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); add()\"\r\n ></nz-icon>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.Code }}</td>\r\n <td>{{ row.Value }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"text-center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n <a\r\n nz-popconfirm\r\n nzOkDanger\r\n nzPopconfirmPlacement=\"top\"\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n (click)=\"$event.stopPropagation()\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [required]=\"true\" [(_ngModel)]=\"selectedRow.Code\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.Value\"></extend-input>\r\n </td>\r\n <td class=\"form-item-no-bottom\">\r\n <extend-textarea [minRows]=\"1\" [(_ngModel)]=\"selectedRow.Description\"></extend-textarea>\r\n </td>\r\n <td class=\"text-center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"text-center\">\r\n <nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); save()\"\r\n ></nz-icon>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "directive", type: i9.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nzPopconfirmTitleContext", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDisabled", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: ExtendTextArea, selector: "extend-textarea", inputs: ["label", "placeHolder", "labelAlign", "floatingLabel", "displayInline", "formItemNoButtom", "labelSpan", "labelFlex", "inputFlex", "disabled", "required", "noBottom", "selectModeType", "inputClass", "size", "isSubmited", "minRows", "maxRows", "lstItem", "displayField", "valueField", "formData", "controlName", "_ngModel", "isTouched", "inputErrorMessage", "errorMessages"], outputs: ["_ngModelChange"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }] });
7339
7585
  }
7340
7586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingListComponent, decorators: [{
7341
7587
  type: Component,
@@ -7353,10 +7599,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7353
7599
  NzPaginationModule,
7354
7600
  NzGridModule,
7355
7601
  NzFlexModule,
7356
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Code</th>\r\n <th>Value</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\">Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Value\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Description\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"filter.IsActive\"></extend-checkbox>\r\n </th>\r\n <th class=\"center\">\r\n <nz-icon\r\n nzType=\"plus\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); add()\"\r\n ></nz-icon>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.Code }}</td>\r\n <td>{{ row.Value }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"text-center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n <a\r\n nz-popconfirm\r\n nzOkDanger\r\n nzPopconfirmPlacement=\"top\"\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n (click)=\"$event.stopPropagation()\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [required]=\"true\" [(_ngModel)]=\"selectedRow.Code\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.Value\"></extend-input>\r\n </td>\r\n <td class=\"form-item-no-bottom\">\r\n <extend-textarea [minRows]=\"1\" [(_ngModel)]=\"selectedRow.Description\"></extend-textarea>\r\n </td>\r\n <td class=\"text-center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"text-center\">\r\n <nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); save()\"\r\n ></nz-icon>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
7602
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data?.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th>Value</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\">Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Value\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Description\" (onclickClearIcon)=\"search()\"></extend-input>\r\n </th>\r\n <th class=\"center\">\r\n <extend-checkbox [(_ngModel)]=\"filter.IsActive\"></extend-checkbox>\r\n </th>\r\n <th class=\"center\">\r\n <nz-icon\r\n nzType=\"plus\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); add()\"\r\n ></nz-icon>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of data?.LstItem; track $index; let i = $index) {\r\n @if (selectedRow != row) {\r\n <tr (click)=\"selectedRow = row\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>{{ row.Code }}</td>\r\n <td>{{ row.Value }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"text-center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n <a\r\n nz-popconfirm\r\n nzOkDanger\r\n nzPopconfirmPlacement=\"top\"\r\n [nzPopconfirmTitle]=\"TranslateKey.CONFIRM_DELETE | translate\"\r\n (click)=\"$event.stopPropagation()\"\r\n (nzOnConfirm)=\"delete(row)\"\r\n >\r\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\" class=\"color-warn cursor-pointer icon-size-16\"></i>\r\n </a>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr (keyup.enter)=\"save()\">\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td>\r\n <extend-input [required]=\"true\" [(_ngModel)]=\"selectedRow.Code\"></extend-input>\r\n </td>\r\n <td>\r\n <extend-input [(_ngModel)]=\"selectedRow.Value\"></extend-input>\r\n </td>\r\n <td class=\"form-item-no-bottom\">\r\n <extend-textarea [minRows]=\"1\" [(_ngModel)]=\"selectedRow.Description\"></extend-textarea>\r\n </td>\r\n <td class=\"text-center\">\r\n <extend-checkbox [(_ngModel)]=\"selectedRow.IsActive\"></extend-checkbox>\r\n </td>\r\n <td class=\"text-center\">\r\n <nz-icon\r\n nzType=\"save\"\r\n nzTheme=\"outline\"\r\n class=\"color-primary cursor-pointer icon-size-16\"\r\n (click)=\"$event.stopPropagation(); save()\"\r\n ></nz-icon>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data?.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
7357
7603
  }] });
7358
7604
 
7359
- const URLs$6 = {
7605
+ const URLs$7 = {
7360
7606
  getById: '/api/file/GetById',
7361
7607
  getAll: '/api/file/GetAll',
7362
7608
  getList: '/api/file/GetList',
@@ -7370,27 +7616,30 @@ class FileService extends HTTPService {
7370
7616
  commonService = inject(CommonService);
7371
7617
  getById(id) {
7372
7618
  const params = new HttpParams().append('id', id);
7373
- return this.postParams(AppGlobals.apiEndpoint + URLs$6.getById, params);
7619
+ return this.postParams(AppGlobals.apiEndpoint + URLs$7.getById, params);
7374
7620
  }
7375
7621
  getAll() {
7376
- return this.post(AppGlobals.apiEndpoint + URLs$6.getAll);
7622
+ return this.post(AppGlobals.apiEndpoint + URLs$7.getAll);
7377
7623
  }
7378
7624
  getList(filter) {
7379
- return this.postData(AppGlobals.apiEndpoint + URLs$6.getList, filter);
7625
+ return this.postData(AppGlobals.apiEndpoint + URLs$7.getList, filter);
7380
7626
  }
7381
7627
  getPaging(filter) {
7382
- return this.postData(AppGlobals.apiEndpoint + URLs$6.getPaging, filter);
7628
+ return this.postData(AppGlobals.apiEndpoint + URLs$7.getPaging, filter);
7383
7629
  }
7384
7630
  addOrEdit(obj) {
7385
- return this.postData(AppGlobals.apiEndpoint + URLs$6.addOrEdit, obj);
7631
+ return this.postData(AppGlobals.apiEndpoint + URLs$7.addOrEdit, obj);
7386
7632
  }
7387
7633
  delete(id) {
7388
7634
  const params = new HttpParams().append('id', id);
7389
- return this.postParams(AppGlobals.apiEndpoint + URLs$6.delete, params);
7635
+ return this.postParams(AppGlobals.apiEndpoint + URLs$7.delete, params);
7390
7636
  }
7391
7637
  downloadFile(id) {
7392
7638
  const params = new HttpParams().append('id', id);
7393
- return firstValueFrom(this.httpClient.post(`${AppGlobals.apiEndpoint}/api/file/downloadFile`, {}, { responseType: ENUM_ResponseType.ARRAYBUFFER, params: params }));
7639
+ return firstValueFrom(this.httpClient.get(`${AppGlobals.apiEndpoint}/api/file/Download`, {
7640
+ responseType: ENUM_ResponseType.ARRAYBUFFER,
7641
+ params: params,
7642
+ }));
7394
7643
  }
7395
7644
  downloadFileByCode(Code) {
7396
7645
  const params = new HttpParams().append('Code', Code);
@@ -7428,7 +7677,7 @@ class FileService extends HTTPService {
7428
7677
  });
7429
7678
  }
7430
7679
  addFileWithRef(obj) {
7431
- return this.postData(AppGlobals.apiEndpoint + URLs$6.addFileWithRef, obj);
7680
+ return this.postData(AppGlobals.apiEndpoint + URLs$7.addFileWithRef, obj);
7432
7681
  }
7433
7682
  getAnhWithRef(Ref_Table, Ref_Id) {
7434
7683
  return this.commonService.ESP({
@@ -7437,7 +7686,7 @@ class FileService extends HTTPService {
7437
7686
  });
7438
7687
  }
7439
7688
  moveFileToDisk(obj) {
7440
- return this.postData(AppGlobals.apiEndpoint + URLs$6.moveFileToDisk, obj);
7689
+ return this.postData(AppGlobals.apiEndpoint + URLs$7.moveFileToDisk, obj);
7441
7690
  }
7442
7691
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FileService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7443
7692
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FileService, providedIn: 'root' });
@@ -7707,7 +7956,7 @@ class UserListComponent extends BaseComponent {
7707
7956
  }
7708
7957
  }
7709
7958
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: UserListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7710
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: UserListComponent, isStandalone: true, selector: "app-user-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n <button nz-button nz-dropdown [nzDropdownMenu]=\"menuAction\" nzTrigger=\"click\">\r\n <nz-icon nzType=\"more\" nzTheme=\"outline\" />\r\n <!-- {{ TranslateKey.ACTION | translate }} -->\r\n </button>\r\n <nz-dropdown-menu #menuAction=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n <li nz-menu-item (click)=\"import()\">Import</li>\r\n </ul>\r\n </nz-dropdown-menu>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>T\u00EAn \u0111\u0103ng nh\u1EADp</th>\r\n <th>T\u00EAn ng\u01B0\u1EDDi d\u00F9ng</th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th nzWidth=\"75px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"100px\">\u0110ang online</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.UserName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.FullName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.OrgName\"></extend-input></th>\r\n <th></th>\r\n <th class=\"center\"><extend-checkbox [(_ngModel)]=\"showOnlineOnly\"></extend-checkbox></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of getLstUser(); track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.UserName }}</td>\r\n <td>{{ row.FullName }}</td>\r\n <td>\r\n {{ row.OrgName }}\r\n <div *ngIf=\"row.LstOrgName\" [innerHtml]=\"row.LstOrgName\"></div>\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n @if (SignalRService.connection?.state == HubConnectionState.Connected && row.LoginStatus) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box><icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\" nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\r\n <div class=\"ant-table-filter-dropdown\">\r\n <div class=\"search-box\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n [(ngModel)]=\"filter.UserName\"\r\n [appAutoFocus]=\"filter.isUserNameSearch\"\r\n (keyup.enter)=\"search()\"\r\n />\r\n <button nz-button nzSize=\"small\" nzType=\"primary\" (click)=\"search()\" class=\"search-button\">\r\n {{ \"SEARCH\" | translate }}\r\n </button>\r\n <button nz-button nzSize=\"small\" (click)=\"filter.UserName = ''; search()\">{{ \"RESET\" | translate }}</button>\r\n </div>\r\n </div>\r\n</nz-dropdown-menu>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i4$1.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$1.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i5$4.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i5$4.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i5$4.NzDropdownButtonDirective, selector: "[nz-button][nz-dropdown]" }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AutoFocusDirective, selector: "[appAutoFocus]", inputs: ["appAutoFocus"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }] });
7959
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: UserListComponent, isStandalone: true, selector: "app-user-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n <button nz-button nz-dropdown [nzDropdownMenu]=\"menuAction\" nzTrigger=\"click\">\r\n <nz-icon nzType=\"more\" nzTheme=\"outline\" />\r\n <!-- {{ TranslateKey.ACTION | translate }} -->\r\n </button>\r\n <nz-dropdown-menu #menuAction=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n <li nz-menu-item (click)=\"import()\">Import</li>\r\n </ul>\r\n </nz-dropdown-menu>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n nzWidth=\"200px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'UserName' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'UserName'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </th>\r\n <th\r\n nzWidth=\"250px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'FullName' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'FullName'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n T\u00EAn ng\u01B0\u1EDDi d\u00F9ng\r\n </th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th\r\n nzWidth=\"90px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'IsActive' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'IsActive'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Hi\u1EC7u l\u1EF1c\r\n </th>\r\n <th nzWidth=\"100px\">\u0110ang online</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.UserName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.FullName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.OrgName\"></extend-input></th>\r\n <th></th>\r\n <th class=\"center\"><extend-checkbox [(_ngModel)]=\"showOnlineOnly\"></extend-checkbox></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of getLstUser(); track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.UserName }}</td>\r\n <td>{{ row.FullName }}</td>\r\n <td>\r\n {{ row.OrgName }}\r\n <div *ngIf=\"row.LstOrgName\" [innerHtml]=\"row.LstOrgName\"></div>\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n @if (SignalRService.connection?.state == HubConnectionState.Connected && row.LoginStatus) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box><icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\" nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "component", type: IconCheck, selector: "icon-check", inputs: ["size"], outputs: ["click"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i4$1.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$1.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i5$4.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i5$4.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i5$4.NzDropdownButtonDirective, selector: "[nz-button][nz-dropdown]" }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "component", type: ExtendCheckbox, selector: "extend-checkbox", inputs: ["label", "labelSpan", "labelFlex", "paddingTop", "disabled", "formData", "controlName", "valueType", "_ngModel"], outputs: ["_ngModelChange"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }] });
7711
7960
  }
7712
7961
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: UserListComponent, decorators: [{
7713
7962
  type: Component,
@@ -7733,7 +7982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7733
7982
  NzGridModule,
7734
7983
  NzFlexModule,
7735
7984
  NzButtonModule,
7736
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n <button nz-button nz-dropdown [nzDropdownMenu]=\"menuAction\" nzTrigger=\"click\">\r\n <nz-icon nzType=\"more\" nzTheme=\"outline\" />\r\n <!-- {{ TranslateKey.ACTION | translate }} -->\r\n </button>\r\n <nz-dropdown-menu #menuAction=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n <li nz-menu-item (click)=\"import()\">Import</li>\r\n </ul>\r\n </nz-dropdown-menu>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>T\u00EAn \u0111\u0103ng nh\u1EADp</th>\r\n <th>T\u00EAn ng\u01B0\u1EDDi d\u00F9ng</th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th nzWidth=\"75px\">Hi\u1EC7u l\u1EF1c</th>\r\n <th nzWidth=\"100px\">\u0110ang online</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.UserName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.FullName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.OrgName\"></extend-input></th>\r\n <th></th>\r\n <th class=\"center\"><extend-checkbox [(_ngModel)]=\"showOnlineOnly\"></extend-checkbox></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of getLstUser(); track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.UserName }}</td>\r\n <td>{{ row.FullName }}</td>\r\n <td>\r\n {{ row.OrgName }}\r\n <div *ngIf=\"row.LstOrgName\" [innerHtml]=\"row.LstOrgName\"></div>\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n @if (SignalRService.connection?.state == HubConnectionState.Connected && row.LoginStatus) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box><icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\" nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\r\n <div class=\"ant-table-filter-dropdown\">\r\n <div class=\"search-box\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n [(ngModel)]=\"filter.UserName\"\r\n [appAutoFocus]=\"filter.isUserNameSearch\"\r\n (keyup.enter)=\"search()\"\r\n />\r\n <button nz-button nzSize=\"small\" nzType=\"primary\" (click)=\"search()\" class=\"search-button\">\r\n {{ \"SEARCH\" | translate }}\r\n </button>\r\n <button nz-button nzSize=\"small\" (click)=\"filter.UserName = ''; search()\">{{ \"RESET\" | translate }}</button>\r\n </div>\r\n </div>\r\n</nz-dropdown-menu>\r\n" }]
7985
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n <button nz-button nz-dropdown [nzDropdownMenu]=\"menuAction\" nzTrigger=\"click\">\r\n <nz-icon nzType=\"more\" nzTheme=\"outline\" />\r\n <!-- {{ TranslateKey.ACTION | translate }} -->\r\n </button>\r\n <nz-dropdown-menu #menuAction=\"nzDropdownMenu\">\r\n <ul nz-menu>\r\n <li nz-menu-item (click)=\"import()\">Import</li>\r\n </ul>\r\n </nz-dropdown-menu>\r\n </div>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"this.data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n nzWidth=\"200px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'UserName' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'UserName'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </th>\r\n <th\r\n nzWidth=\"250px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'FullName' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'FullName'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n T\u00EAn ng\u01B0\u1EDDi d\u00F9ng\r\n </th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th\r\n nzWidth=\"90px\"\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'IsActive' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'IsActive'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Hi\u1EC7u l\u1EF1c\r\n </th>\r\n <th nzWidth=\"100px\">\u0110ang online</th>\r\n <th nzWidth=\"75px\">Thao t\u00E1c</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.UserName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.FullName\"></extend-input></th>\r\n <th><extend-input [size]=\"'small'\" [(_ngModel)]=\"filter.OrgName\"></extend-input></th>\r\n <th></th>\r\n <th class=\"center\"><extend-checkbox [(_ngModel)]=\"showOnlineOnly\"></extend-checkbox></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of getLstUser(); track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.UserName }}</td>\r\n <td>{{ row.FullName }}</td>\r\n <td>\r\n {{ row.OrgName }}\r\n <div *ngIf=\"row.LstOrgName\" [innerHtml]=\"row.LstOrgName\"></div>\r\n </td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"text-center\">\r\n @if (SignalRService.connection?.state == HubConnectionState.Connected && row.LoginStatus) {\r\n <icon-check></icon-check>\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box><icon-delete (click)=\"delete(row)\"></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex nzJustify=\"end\" nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
7737
7986
  }] });
7738
7987
 
7739
7988
  class ResetPassComponent extends BaseComponent {
@@ -7797,7 +8046,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7797
8046
  ], template: "<form nz-form [formGroup]=\"formData\">\r\n <div nz-row>\r\n <div nz-col nzSpan=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"UserName\" nzLabelAlign=\"left\" nzNoColon=\"true\">\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <input nz-input formControlName=\"UserName\" autocomplete=\"off\" nzDisabled />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Password\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group [nzSuffix]=\"visiblePass ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\">\r\n <input type=\"{{ passwordType }}\" nz-input formControlName=\"Password\" autocomplete=\"new-password\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"RetypePassword\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n Nh\u1EADp l\u1EA1i M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"M\u1EADt kh\u1EA9u kh\u00F4ng kh\u1EDBp\">\r\n <nz-input-group [nzSuffix]=\"visibleRePass ? suffixTemplateHiddenRePassword : suffixTemplateShowRePassword\">\r\n <input type=\"{{ rePasswordType }}\" nz-input formControlName=\"RetypePassword\" autocomplete=\"new-password\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowRePassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenRePassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\" nzGap=\"small\">\r\n <button nz-button nzType=\"default\" (click)=\"close()\">{{ TranslateKey.CLOSE | translate }}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"submit()\" nzDanger>{{ TranslateKey.OK | translate }}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n" }]
7798
8047
  }] });
7799
8048
 
7800
- const URLs$5 = {
8049
+ const URLs$6 = {
7801
8050
  getById: '/api/App_Setting/GetById',
7802
8051
  getAll: '/api/App_Setting/GetAll',
7803
8052
  getList: '/api/App_Setting/GetList',
@@ -7808,6 +8057,7 @@ const URLs$5 = {
7808
8057
  GetAllConfig: '/api/App_Setting/GetAllConfig',
7809
8058
  ApplyConfig: '/api/Setting/ApplyConfig',
7810
8059
  GetDbInfo: '/api/App_Setting/GetDbInfo',
8060
+ ConfigTheme: '/api/public/ConfigTheme',
7811
8061
  };
7812
8062
  class SettingService extends HTTPService {
7813
8063
  cms = inject(CommonService);
@@ -7818,10 +8068,10 @@ class SettingService extends HTTPService {
7818
8068
  });
7819
8069
  }
7820
8070
  getAll() {
7821
- return this.post(AppGlobals.apiEndpoint + URLs$5.getAll);
8071
+ return this.post(AppGlobals.apiEndpoint + URLs$6.getAll);
7822
8072
  }
7823
8073
  getList(filter) {
7824
- return this.postData(AppGlobals.apiEndpoint + URLs$5.getList, filter);
8074
+ return this.postData(AppGlobals.apiEndpoint + URLs$6.getList, filter);
7825
8075
  }
7826
8076
  getPaging(filter) {
7827
8077
  return this.cms.ESP({
@@ -7837,29 +8087,27 @@ class SettingService extends HTTPService {
7837
8087
  }
7838
8088
  delete(id) {
7839
8089
  const params = new HttpParams().append('id', id);
7840
- return this.postParams(AppGlobals.apiEndpoint + URLs$5.delete, params);
8090
+ return this.postParams(AppGlobals.apiEndpoint + URLs$6.delete, params);
7841
8091
  }
7842
8092
  getByCodeAnonymous(code) {
7843
8093
  const params = new HttpParams().append('Code', code);
7844
- return this.getParams(AppGlobals.apiEndpoint + URLs$5.getByCodeAnonymous, params);
8094
+ return this.getParams(AppGlobals.apiEndpoint + URLs$6.getByCodeAnonymous, params);
7845
8095
  }
7846
8096
  // getGroupByCodeAnonymous(code: string) {
7847
8097
  // const params = new HttpParams().append('Code', code);
7848
8098
  // return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);
7849
8099
  // }
7850
8100
  getAllConfig() {
7851
- return this.post(AppGlobals.apiEndpoint + URLs$5.GetAllConfig);
8101
+ return this.post(AppGlobals.apiEndpoint + URLs$6.GetAllConfig);
7852
8102
  }
7853
8103
  applyConfig(config) {
7854
- return this.postData(AppGlobals.apiEndpoint + URLs$5.ApplyConfig, config);
8104
+ return this.postData(AppGlobals.apiEndpoint + URLs$6.ApplyConfig, config);
7855
8105
  }
7856
8106
  getDbInfo() {
7857
- return this.post(AppGlobals.apiEndpoint + URLs$5.GetDbInfo);
8107
+ return this.post(AppGlobals.apiEndpoint + URLs$6.GetDbInfo);
7858
8108
  }
7859
8109
  loadConfigTheme() {
7860
- return this.cms.ESP({
7861
- SPN: 'App_Setting_getConfigTheme',
7862
- });
8110
+ return this.get(AppGlobals.apiEndpoint + URLs$6.ConfigTheme);
7863
8111
  }
7864
8112
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7865
8113
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingService, providedIn: 'root' });
@@ -7871,59 +8119,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7871
8119
  }]
7872
8120
  }] });
7873
8121
 
7874
- class App_JobTitle {
7875
- // #region properties
7876
- App_JobTitle_Id;
7877
- App_Org_Id;
7878
- CreatedUser;
7879
- CreatedDate;
7880
- UpdatedUser;
7881
- UpdatedDate;
7882
- IsActive;
7883
- Code;
7884
- Name;
7885
- // #endregion properties
7886
- constructor(obj) {
7887
- obj = obj || {};
7888
- this.App_JobTitle_Id = obj.App_JobTitle_Id || null;
7889
- this.App_Org_Id = obj.App_Org_Id || '';
7890
- this.CreatedUser = obj.CreatedUser || '';
7891
- this.CreatedDate = obj.CreatedDate || null;
7892
- this.UpdatedUser = obj.UpdatedUser || '';
7893
- this.UpdatedDate = obj.UpdatedDate || null;
7894
- this.IsActive = obj.IsActive || false;
7895
- this.Code = obj.Code || '';
7896
- this.Name = obj.Name || '';
7897
- }
7898
- }
7899
- class App_JobTitleFilter extends GridFilter {
7900
- App_JobTitle_Id;
7901
- App_Org_Id;
7902
- CreatedUser;
7903
- CreatedDate;
7904
- UpdatedUser;
7905
- UpdatedDate;
7906
- IsActive;
7907
- Code;
7908
- Name;
7909
- CodeVisible;
7910
- NameVisible;
7911
- constructor(obj) {
7912
- super();
7913
- obj = obj || {};
7914
- this.App_JobTitle_Id = obj.App_JobTitle_Id || null;
7915
- this.App_Org_Id = obj.App_Org_Id || null;
7916
- this.CreatedUser = obj.CreatedUser || null;
7917
- this.CreatedDate = obj.CreatedDate || null;
7918
- this.UpdatedUser = obj.UpdatedUser || null;
7919
- this.UpdatedDate = obj.UpdatedDate || null;
7920
- this.IsActive = obj.IsActive || null;
7921
- this.Code = obj.Code || null;
7922
- this.Name = obj.Name || null;
7923
- }
7924
- }
7925
-
7926
- const URLs$4 = {
8122
+ const URLs$5 = {
7927
8123
  getById: '/api/App_JobTitle/GetById',
7928
8124
  getByIdEx: '/api/App_JobTitle/getByIdEx',
7929
8125
  getAll: '/api/App_JobTitle/GetAll',
@@ -7935,27 +8131,27 @@ const URLs$4 = {
7935
8131
  class JobTitleService extends HTTPService {
7936
8132
  getById(id) {
7937
8133
  const params = new HttpParams().append('id', id);
7938
- return this.postParams(AppGlobals.apiEndpoint + URLs$4.getById, params);
8134
+ return this.postParams(AppGlobals.apiEndpoint + URLs$5.getById, params);
7939
8135
  }
7940
8136
  getByIdEx(id) {
7941
8137
  const params = new HttpParams().append('id', id);
7942
- return this.postParams(AppGlobals.apiEndpoint + URLs$4.getByIdEx, params);
8138
+ return this.postParams(AppGlobals.apiEndpoint + URLs$5.getByIdEx, params);
7943
8139
  }
7944
8140
  getAll() {
7945
- return this.post(AppGlobals.apiEndpoint + URLs$4.getAll);
8141
+ return this.post(AppGlobals.apiEndpoint + URLs$5.getAll);
7946
8142
  }
7947
8143
  getList(filter) {
7948
- return this.postData(AppGlobals.apiEndpoint + URLs$4.getList, filter);
8144
+ return this.postData(AppGlobals.apiEndpoint + URLs$5.getList, filter);
7949
8145
  }
7950
8146
  getPaging(filter) {
7951
- return this.postData(AppGlobals.apiEndpoint + URLs$4.getPaging, filter);
8147
+ return this.postData(AppGlobals.apiEndpoint + URLs$5.getPaging, filter);
7952
8148
  }
7953
8149
  addOrEdit(obj) {
7954
- return this.postData(AppGlobals.apiEndpoint + URLs$4.addOrEdit, obj);
8150
+ return this.postData(AppGlobals.apiEndpoint + URLs$5.addOrEdit, obj);
7955
8151
  }
7956
8152
  delete(id) {
7957
8153
  const params = new HttpParams().append('id', id);
7958
- return this.postParams(AppGlobals.apiEndpoint + URLs$4.delete, params);
8154
+ return this.postParams(AppGlobals.apiEndpoint + URLs$5.delete, params);
7959
8155
  }
7960
8156
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: JobTitleService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7961
8157
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: JobTitleService, providedIn: 'root' });
@@ -8097,14 +8293,12 @@ class UserDetailComponent extends BaseComponent {
8097
8293
  }
8098
8294
  }
8099
8295
  async getAllJobTitle() {
8100
- try {
8101
- const filter = new App_JobTitleFilter();
8102
- const res = await this.jobTitleService.getList(filter);
8103
- this.lstJobTitle = res.Data || [];
8104
- }
8105
- catch (err) {
8106
- this.handleError(err);
8107
- }
8296
+ // try {
8297
+ // const res = await this.jobTitleService.getAll( );
8298
+ // this.lstJobTitle = res.Data || [];
8299
+ // } catch (err) {
8300
+ // this.handleError(err);
8301
+ // }
8108
8302
  }
8109
8303
  updateBreadcrumb() {
8110
8304
  Breadcrumb.lstBreadcrumb = [
@@ -8404,7 +8598,7 @@ class UserDetailComponent extends BaseComponent {
8404
8598
  this.notiService.success('Đã xóa Chức danh khỏi danh sách');
8405
8599
  }
8406
8600
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: UserDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8407
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: UserDetailComponent, isStandalone: true, selector: "app-user-detail", usesInheritance: true, ngImport: i0, template: "<form nz-form [formGroup]=\"formData\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n @if (item?.App_User_Id) {\r\n <button nz-button nzType=\"primary\" type=\"button\" (click)=\"resetPassword()\">\r\n {{ TranslateKey.RESET_PASSWORD | translate }}\r\n </button>\r\n <button nz-button nzType=\"primary\" type=\"button\" nzDanger (click)=\"delete()\">\r\n {{ TranslateKey.DELETE | translate }}\r\n </button>\r\n }\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-back (click)=\"goto('/admin/user')\"></button-back>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"[16, 16]\">\r\n <!-- C\u1ED8T TR\u00C1I: FORM USER -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"UserName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"UserName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"FullName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn ng\u01B0\u1EDDi d\u00F9ng\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"FullName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Email\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Email </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'Ch\u01B0a \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng email'\">\r\n <input nz-input formControlName=\"Email\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <div *ngIf=\"!item?.App_User_Id\" nz-row [nzGutter]=\"16\">\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Password\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group [nzSuffix]=\"visiblePass ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\">\r\n <input type=\"{{ passwordType }}\" nz-input formControlName=\"Password\" autocomplete=\"new-password\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"RetypePassword\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n Nh\u1EADp l\u1EA1i M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"M\u1EADt kh\u1EA9u kh\u00F4ng kh\u1EDBp\">\r\n <nz-input-group\r\n [nzSuffix]=\"visibleRePass ? suffixTemplateHiddenRePassword : suffixTemplateShowRePassword\"\r\n >\r\n <input\r\n type=\"{{ rePasswordType }}\"\r\n nz-input\r\n formControlName=\"RetypePassword\"\r\n autocomplete=\"new-password\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowRePassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenRePassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: TABS ORG & ROLE -->\r\n <div nz-col [nzSpan]=\"12\">\r\n <nz-tabset nzType=\"card\" nzSize=\"small\">\r\n <!-- TAB ORG -->\r\n <nz-tab nzTitle=\"\u0110\u01A1n v\u1ECB\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch \u0110\u01A1n v\u1ECB</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">\u0110\u01A1n v\u1ECB ({{ lstOrgInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddOrgModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm \u0110\u01A1n v\u1ECB\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgTable\r\n [nzData]=\"lstOrgInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstOrgInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a \u0110\u01A1n v\u1ECB n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteOrgFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <nz-tab nzTitle=\"Ch\u1EE9c danh\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Ch\u1EE9c danh</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Ch\u1EE9c danh ({{ lstJobTitleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddJobTitleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Ch\u1EE9c danh\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgJobTilte\r\n [nzData]=\"lstJobTitleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstJobTitleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Ch\u1EE9c danh</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgJobTilte.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a ch\u1EE9c danh n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteJobTitleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <!-- TAB ROLE -->\r\n <nz-tab nzTitle=\"Nh\u00F3m quy\u1EC1n\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Nh\u00F3m quy\u1EC1n</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Role\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstRoleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a Role n\u00E0y?\"\r\n (nzOnConfirm)=\"deleteRoleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n </nz-tabset>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Org -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddOrgModalVisible\"\r\n nzTitle=\"Th\u00EAm \u0110\u01A1n v\u1ECB v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddOrgModal()\"\r\n (nzOnOk)=\"addOrgsToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiOrgs\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 \u0110\u01A1n v\u1ECB\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchOrg\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm \u0110\u01A1n v\u1ECB...\"\r\n [(ngModel)]=\"searchOrgText\"\r\n (ngModelChange)=\"filterAvailableOrgs()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchOrg>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addOrgTable\r\n [nzData]=\"lstFilteredOrg\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableOrgs\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiOrgs\"\r\n [(nzChecked)]=\"isAllOrgChecked\"\r\n (nzCheckedChange)=\"onAllOrgChecked($event)\"\r\n [nzIndeterminate]=\"isOrgIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addOrgTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onOrgChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.TreeNodeName || item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchRole\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchRole>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn JobTitle -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddJobTitleModalVisible\"\r\n nzTitle=\"Th\u00EAm Ch\u1EE9c danh v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddJobTitleModal()\"\r\n (nzOnOk)=\"addJobTitlesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiJobTitles\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 Ch\u1EE9c danh\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchJobTitle\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Ch\u1EE9c danh...\"\r\n [(ngModel)]=\"searchJobTitleText\"\r\n (ngModelChange)=\"filterAvailableJobTitles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchJobTitle>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addJobTitleTable\r\n [nzData]=\"lstFilteredJobTitle\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableJobTitles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiJobTitles\"\r\n [(nzChecked)]=\"isAllJobTitleChecked\"\r\n (nzCheckedChange)=\"onAllJobTitleChecked($event)\"\r\n [nzIndeterminate]=\"isJobTitleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addJobTitleTable.data\">\r\n <td>\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onJobTitleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i5.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzSelectModule }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i6$2.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzLabel", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i15.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i15.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "directive", type: i9.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nzPopconfirmTitleContext", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDisabled", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "ngmodule", type: NzEmptyModule }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzDividerModule }, { kind: "component", type: i8$1.NzDividerComponent, selector: "nz-divider", inputs: ["nzText", "nzType", "nzOrientation", "nzVariant", "nzDashed", "nzPlain"], exportAs: ["nzDivider"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "ngmodule", type: NzTabsModule }, { kind: "component", type: i1$7.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact", "nzDestroyInactiveTabPane"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i1$7.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "component", type: NzAlertComponent, selector: "nz-alert", inputs: ["nzAction", "nzCloseText", "nzIconType", "nzMessage", "nzDescription", "nzType", "nzCloseable", "nzShowIcon", "nzBanner", "nzNoAnimation", "nzIcon"], outputs: ["nzOnClose"], exportAs: ["nzAlert"] }, { kind: "component", type: ButtonBack, selector: "button-back" }, { kind: "component", type: ButtonSave, selector: "button-save" }] });
8601
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: UserDetailComponent, isStandalone: true, selector: "app-user-detail", usesInheritance: true, ngImport: i0, template: "<form nz-form [formGroup]=\"formData\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n @if (item?.App_User_Id) {\r\n <button nz-button nzType=\"primary\" type=\"button\" (click)=\"resetPassword()\">\r\n {{ TranslateKey.RESET_PASSWORD | translate }}\r\n </button>\r\n <button nz-button nzType=\"primary\" type=\"button\" nzDanger (click)=\"delete()\">\r\n {{ TranslateKey.DELETE | translate }}\r\n </button>\r\n }\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-back (click)=\"goto('/admin/user')\"></button-back>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"[16, 16]\">\r\n <!-- C\u1ED8T TR\u00C1I: FORM USER -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"UserName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"UserName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"FullName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn ng\u01B0\u1EDDi d\u00F9ng\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"FullName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Email\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Email </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'Ch\u01B0a \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng email'\">\r\n <input nz-input formControlName=\"Email\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <div *ngIf=\"!item?.App_User_Id\" nz-row [nzGutter]=\"16\">\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Password\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group [nzSuffix]=\"visiblePass ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\">\r\n <input type=\"{{ passwordType }}\" nz-input formControlName=\"Password\" autocomplete=\"new-password\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"RetypePassword\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n Nh\u1EADp l\u1EA1i M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"M\u1EADt kh\u1EA9u kh\u00F4ng kh\u1EDBp\">\r\n <nz-input-group\r\n [nzSuffix]=\"visibleRePass ? suffixTemplateHiddenRePassword : suffixTemplateShowRePassword\"\r\n >\r\n <input\r\n type=\"{{ rePasswordType }}\"\r\n nz-input\r\n formControlName=\"RetypePassword\"\r\n autocomplete=\"new-password\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowRePassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenRePassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: TABS ORG & ROLE -->\r\n <div nz-col [nzSpan]=\"12\">\r\n <nz-tabset nzType=\"card\" nzSize=\"small\">\r\n <!-- TAB ORG -->\r\n <nz-tab nzTitle=\"\u0110\u01A1n v\u1ECB\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch \u0110\u01A1n v\u1ECB</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">\u0110\u01A1n v\u1ECB ({{ lstOrgInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddOrgModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm \u0110\u01A1n v\u1ECB\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgTable\r\n [nzData]=\"lstOrgInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstOrgInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a \u0110\u01A1n v\u1ECB n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteOrgFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <!-- TAB ROLE -->\r\n <nz-tab nzTitle=\"Nh\u00F3m quy\u1EC1n\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Nh\u00F3m quy\u1EC1n</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Role\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstRoleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a Role n\u00E0y?\"\r\n (nzOnConfirm)=\"deleteRoleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <!-- ch\u1EE9c danh -->\r\n <nz-tab nzTitle=\"Ch\u1EE9c danh\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Ch\u1EE9c danh</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Ch\u1EE9c danh ({{ lstJobTitleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddJobTitleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Ch\u1EE9c danh\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgJobTilte\r\n [nzData]=\"lstJobTitleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstJobTitleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Ch\u1EE9c danh</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgJobTilte.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a ch\u1EE9c danh n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteJobTitleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n </nz-tabset>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Org -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddOrgModalVisible\"\r\n nzTitle=\"Th\u00EAm \u0110\u01A1n v\u1ECB v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddOrgModal()\"\r\n (nzOnOk)=\"addOrgsToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiOrgs\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 \u0110\u01A1n v\u1ECB\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchOrg\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm \u0110\u01A1n v\u1ECB...\"\r\n [(ngModel)]=\"searchOrgText\"\r\n (ngModelChange)=\"filterAvailableOrgs()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchOrg>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addOrgTable\r\n [nzData]=\"lstFilteredOrg\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableOrgs\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiOrgs\"\r\n [(nzChecked)]=\"isAllOrgChecked\"\r\n (nzCheckedChange)=\"onAllOrgChecked($event)\"\r\n [nzIndeterminate]=\"isOrgIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addOrgTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onOrgChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.TreeNodeName || item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchRole\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchRole>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn JobTitle -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddJobTitleModalVisible\"\r\n nzTitle=\"Th\u00EAm Ch\u1EE9c danh v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddJobTitleModal()\"\r\n (nzOnOk)=\"addJobTitlesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiJobTitles\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 Ch\u1EE9c danh\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchJobTitle\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Ch\u1EE9c danh...\"\r\n [(ngModel)]=\"searchJobTitleText\"\r\n (ngModelChange)=\"filterAvailableJobTitles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchJobTitle>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addJobTitleTable\r\n [nzData]=\"lstFilteredJobTitle\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableJobTitles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiJobTitles\"\r\n [(nzChecked)]=\"isAllJobTitleChecked\"\r\n (nzCheckedChange)=\"onAllJobTitleChecked($event)\"\r\n [nzIndeterminate]=\"isJobTitleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addJobTitleTable.data\">\r\n <td>\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onJobTitleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzFormModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i5.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "ngmodule", type: NzSelectModule }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "ngmodule", type: NzCheckboxModule }, { kind: "component", type: i3$1.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId", "nzName"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i6$2.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzLabel", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i15.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i15.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzPopconfirmModule }, { kind: "directive", type: i9.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nzPopconfirmTitleContext", "nz-popconfirm", "nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDisabled", "nzOkDanger", "nzCancelText", "nzBeforeConfirm", "nzIcon", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { kind: "ngmodule", type: NzEmptyModule }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzDividerModule }, { kind: "component", type: i8$1.NzDividerComponent, selector: "nz-divider", inputs: ["nzText", "nzType", "nzOrientation", "nzVariant", "nzDashed", "nzPlain"], exportAs: ["nzDivider"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "ngmodule", type: NzTabsModule }, { kind: "component", type: i1$7.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact", "nzDestroyInactiveTabPane"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i1$7.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "component", type: NzAlertComponent, selector: "nz-alert", inputs: ["nzAction", "nzCloseText", "nzIconType", "nzMessage", "nzDescription", "nzType", "nzCloseable", "nzShowIcon", "nzBanner", "nzNoAnimation", "nzIcon"], outputs: ["nzOnClose"], exportAs: ["nzAlert"] }, { kind: "component", type: ButtonBack, selector: "button-back" }, { kind: "component", type: ButtonSave, selector: "button-save" }] });
8408
8602
  }
8409
8603
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: UserDetailComponent, decorators: [{
8410
8604
  type: Component,
@@ -8432,7 +8626,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
8432
8626
  NzAlertComponent,
8433
8627
  ButtonBack,
8434
8628
  ButtonSave,
8435
- ], template: "<form nz-form [formGroup]=\"formData\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n @if (item?.App_User_Id) {\r\n <button nz-button nzType=\"primary\" type=\"button\" (click)=\"resetPassword()\">\r\n {{ TranslateKey.RESET_PASSWORD | translate }}\r\n </button>\r\n <button nz-button nzType=\"primary\" type=\"button\" nzDanger (click)=\"delete()\">\r\n {{ TranslateKey.DELETE | translate }}\r\n </button>\r\n }\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-back (click)=\"goto('/admin/user')\"></button-back>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"[16, 16]\">\r\n <!-- C\u1ED8T TR\u00C1I: FORM USER -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"UserName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"UserName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"FullName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn ng\u01B0\u1EDDi d\u00F9ng\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"FullName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Email\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Email </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'Ch\u01B0a \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng email'\">\r\n <input nz-input formControlName=\"Email\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <div *ngIf=\"!item?.App_User_Id\" nz-row [nzGutter]=\"16\">\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Password\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group [nzSuffix]=\"visiblePass ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\">\r\n <input type=\"{{ passwordType }}\" nz-input formControlName=\"Password\" autocomplete=\"new-password\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"RetypePassword\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n Nh\u1EADp l\u1EA1i M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"M\u1EADt kh\u1EA9u kh\u00F4ng kh\u1EDBp\">\r\n <nz-input-group\r\n [nzSuffix]=\"visibleRePass ? suffixTemplateHiddenRePassword : suffixTemplateShowRePassword\"\r\n >\r\n <input\r\n type=\"{{ rePasswordType }}\"\r\n nz-input\r\n formControlName=\"RetypePassword\"\r\n autocomplete=\"new-password\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowRePassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenRePassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: TABS ORG & ROLE -->\r\n <div nz-col [nzSpan]=\"12\">\r\n <nz-tabset nzType=\"card\" nzSize=\"small\">\r\n <!-- TAB ORG -->\r\n <nz-tab nzTitle=\"\u0110\u01A1n v\u1ECB\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch \u0110\u01A1n v\u1ECB</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">\u0110\u01A1n v\u1ECB ({{ lstOrgInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddOrgModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm \u0110\u01A1n v\u1ECB\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgTable\r\n [nzData]=\"lstOrgInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstOrgInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a \u0110\u01A1n v\u1ECB n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteOrgFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <nz-tab nzTitle=\"Ch\u1EE9c danh\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Ch\u1EE9c danh</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Ch\u1EE9c danh ({{ lstJobTitleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddJobTitleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Ch\u1EE9c danh\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgJobTilte\r\n [nzData]=\"lstJobTitleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstJobTitleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Ch\u1EE9c danh</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgJobTilte.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a ch\u1EE9c danh n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteJobTitleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <!-- TAB ROLE -->\r\n <nz-tab nzTitle=\"Nh\u00F3m quy\u1EC1n\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Nh\u00F3m quy\u1EC1n</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Role\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstRoleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a Role n\u00E0y?\"\r\n (nzOnConfirm)=\"deleteRoleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n </nz-tabset>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Org -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddOrgModalVisible\"\r\n nzTitle=\"Th\u00EAm \u0110\u01A1n v\u1ECB v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddOrgModal()\"\r\n (nzOnOk)=\"addOrgsToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiOrgs\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 \u0110\u01A1n v\u1ECB\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchOrg\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm \u0110\u01A1n v\u1ECB...\"\r\n [(ngModel)]=\"searchOrgText\"\r\n (ngModelChange)=\"filterAvailableOrgs()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchOrg>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addOrgTable\r\n [nzData]=\"lstFilteredOrg\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableOrgs\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiOrgs\"\r\n [(nzChecked)]=\"isAllOrgChecked\"\r\n (nzCheckedChange)=\"onAllOrgChecked($event)\"\r\n [nzIndeterminate]=\"isOrgIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addOrgTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onOrgChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.TreeNodeName || item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchRole\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchRole>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn JobTitle -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddJobTitleModalVisible\"\r\n nzTitle=\"Th\u00EAm Ch\u1EE9c danh v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddJobTitleModal()\"\r\n (nzOnOk)=\"addJobTitlesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiJobTitles\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 Ch\u1EE9c danh\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchJobTitle\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Ch\u1EE9c danh...\"\r\n [(ngModel)]=\"searchJobTitleText\"\r\n (ngModelChange)=\"filterAvailableJobTitles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchJobTitle>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addJobTitleTable\r\n [nzData]=\"lstFilteredJobTitle\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableJobTitles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiJobTitles\"\r\n [(nzChecked)]=\"isAllJobTitleChecked\"\r\n (nzCheckedChange)=\"onAllJobTitleChecked($event)\"\r\n [nzIndeterminate]=\"isJobTitleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addJobTitleTable.data\">\r\n <td>\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onJobTitleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n" }]
8629
+ ], template: "<form nz-form [formGroup]=\"formData\">\r\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\r\n @if (item?.App_User_Id) {\r\n <button nz-button nzType=\"primary\" type=\"button\" (click)=\"resetPassword()\">\r\n {{ TranslateKey.RESET_PASSWORD | translate }}\r\n </button>\r\n <button nz-button nzType=\"primary\" type=\"button\" nzDanger (click)=\"delete()\">\r\n {{ TranslateKey.DELETE | translate }}\r\n </button>\r\n }\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-back (click)=\"goto('/admin/user')\"></button-back>\r\n </div>\r\n\r\n <nz-divider></nz-divider>\r\n\r\n <div nz-row [nzGutter]=\"[16, 16]\">\r\n <!-- C\u1ED8T TR\u00C1I: FORM USER -->\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"UserName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn \u0111\u0103ng nh\u1EADp\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"UserName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"FullName\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n T\u00EAn ng\u01B0\u1EDDi d\u00F9ng\r\n </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"FullName\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Email\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Email </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'Ch\u01B0a \u0111\u00FAng \u0111\u1ECBnh d\u1EA1ng email'\">\r\n <input nz-input formControlName=\"Email\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <div *ngIf=\"!item?.App_User_Id\" nz-row [nzGutter]=\"16\">\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Password\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\r\n <nz-input-group [nzSuffix]=\"visiblePass ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\">\r\n <input type=\"{{ passwordType }}\" nz-input formControlName=\"Password\" autocomplete=\"new-password\" />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visiblePass = !visiblePass; passwordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col [nzSpan]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"RetypePassword\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired>\r\n Nh\u1EADp l\u1EA1i M\u1EADt kh\u1EA9u\r\n </nz-form-label>\r\n <nz-form-control nzErrorTip=\"M\u1EADt kh\u1EA9u kh\u00F4ng kh\u1EDBp\">\r\n <nz-input-group\r\n [nzSuffix]=\"visibleRePass ? suffixTemplateHiddenRePassword : suffixTemplateShowRePassword\"\r\n >\r\n <input\r\n type=\"{{ rePasswordType }}\"\r\n nz-input\r\n formControlName=\"RetypePassword\"\r\n autocomplete=\"new-password\"\r\n />\r\n </nz-input-group>\r\n </nz-form-control>\r\n <ng-template #suffixTemplateShowRePassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenRePassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"visibleRePass = !visibleRePass; rePasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1ED8T PH\u1EA2I: TABS ORG & ROLE -->\r\n <div nz-col [nzSpan]=\"12\">\r\n <nz-tabset nzType=\"card\" nzSize=\"small\">\r\n <!-- TAB ORG -->\r\n <nz-tab nzTitle=\"\u0110\u01A1n v\u1ECB\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch \u0110\u01A1n v\u1ECB</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">\u0110\u01A1n v\u1ECB ({{ lstOrgInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddOrgModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm \u0110\u01A1n v\u1ECB\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgTable\r\n [nzData]=\"lstOrgInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstOrgInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>\u0110\u01A1n v\u1ECB</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a \u0110\u01A1n v\u1ECB n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteOrgFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <!-- TAB ROLE -->\r\n <nz-tab nzTitle=\"Nh\u00F3m quy\u1EC1n\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Nh\u00F3m quy\u1EC1n</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Roles ({{ lstRoleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddRoleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Role\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #roleTable\r\n [nzData]=\"lstRoleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstRoleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n [nzBordered]=\"true\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Role</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of roleTable.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a Role n\u00E0y?\"\r\n (nzOnConfirm)=\"deleteRoleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n\r\n <!-- ch\u1EE9c danh -->\r\n <nz-tab nzTitle=\"Ch\u1EE9c danh\">\r\n <div style=\"padding: 8px\">\r\n <h3 style=\"margin-bottom: 16px\">Danh s\u00E1ch Ch\u1EE9c danh</h3>\r\n\r\n <div nz-flex [nzJustify]=\"'space-between'\" [nzAlign]=\"'center'\" style=\"margin-bottom: 12px\">\r\n <span style=\"font-weight: 500\">Ch\u1EE9c danh ({{ lstJobTitleInUser.length }})</span>\r\n <button nz-button nzType=\"primary\" nzSize=\"small\" (click)=\"openAddJobTitleModal()\">\r\n <span nz-icon nzType=\"plus\"></span>\r\n Th\u00EAm Ch\u1EE9c danh\r\n </button>\r\n </div>\r\n\r\n <div style=\"max-height: 450px; overflow-y: auto\">\r\n <nz-table\r\n #orgJobTilte\r\n [nzData]=\"lstJobTitleInUser\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"lstJobTitleInUser.length > 20\"\r\n [nzPageSize]=\"20\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40px\">STT</th>\r\n <th>Ch\u1EE9c danh</th>\r\n <th nzWidth=\"50px\" nzAlign=\"center\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of orgJobTilte.data; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>\r\n <div style=\"font-weight: 500\">{{ item.Name }}</div>\r\n <div style=\"font-size: 12px; color: #888\">{{ item.Code }}</div>\r\n </td>\r\n <td nzAlign=\"center\">\r\n <button\r\n nz-button\r\n nzType=\"link\"\r\n nzDanger\r\n nzSize=\"small\"\r\n nz-popconfirm\r\n nzPopconfirmTitle=\"X\u00F3a ch\u1EE9c danh n\u00E0y?\"\r\n nzAutofocus=\"ok\"\r\n (nzOnConfirm)=\"deleteJobTitleFromUser(item)\"\r\n >\r\n <span nz-icon nzType=\"delete\" nzTheme=\"outline\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n </nz-tabset>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<!-- Modal ch\u1ECDn Org -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddOrgModalVisible\"\r\n nzTitle=\"Th\u00EAm \u0110\u01A1n v\u1ECB v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddOrgModal()\"\r\n (nzOnOk)=\"addOrgsToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiOrgs\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 \u0110\u01A1n v\u1ECB\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchOrg\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm \u0110\u01A1n v\u1ECB...\"\r\n [(ngModel)]=\"searchOrgText\"\r\n (ngModelChange)=\"filterAvailableOrgs()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchOrg>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addOrgTable\r\n [nzData]=\"lstFilteredOrg\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableOrgs\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiOrgs\"\r\n [(nzChecked)]=\"isAllOrgChecked\"\r\n (nzCheckedChange)=\"onAllOrgChecked($event)\"\r\n [nzIndeterminate]=\"isOrgIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addOrgTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onOrgChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.TreeNodeName || item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn Role -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddRoleModalVisible\"\r\n nzTitle=\"Th\u00EAm Role v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddRoleModal()\"\r\n (nzOnOk)=\"addRolesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchRole\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Role...\"\r\n [(ngModel)]=\"searchRoleText\"\r\n (ngModelChange)=\"filterAvailableRoles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchRole>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addRoleTable\r\n [nzData]=\"lstFilteredRole\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableRoles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n nzShowCheckbox\r\n [(nzChecked)]=\"isAllRoleChecked\"\r\n (nzCheckedChange)=\"onAllRoleChecked($event)\"\r\n [nzIndeterminate]=\"isRoleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n <th>M\u00F4 t\u1EA3</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addRoleTable.data\">\r\n <td nzAlign=\"center\">\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onRoleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n <td>{{ item.Description }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- Modal ch\u1ECDn JobTitle -->\r\n<nz-modal\r\n [(nzVisible)]=\"isAddJobTitleModalVisible\"\r\n nzTitle=\"Th\u00EAm Ch\u1EE9c danh v\u00E0o User\"\r\n [nzWidth]=\"700\"\r\n (nzOnCancel)=\"closeAddJobTitleModal()\"\r\n (nzOnOk)=\"addJobTitlesToUser()\"\r\n nzOkText=\"Th\u00EAm\"\r\n nzCancelText=\"H\u1EE7y\"\r\n>\r\n <ng-container *nzModalContent>\r\n <nz-alert\r\n *ngIf=\"!isOneUserMultiJobTitles\"\r\n nzType=\"info\"\r\n nzMessage=\"Ch\u1EC9 \u0111\u01B0\u1EE3c ch\u1ECDn 1 Ch\u1EE9c danh\"\r\n nzShowIcon\r\n style=\"margin-bottom: 16px\"\r\n ></nz-alert>\r\n <!-- Search box -->\r\n <nz-input-group [nzPrefix]=\"prefixIconSearchJobTitle\" style=\"margin-bottom: 16px\">\r\n <input\r\n type=\"text\"\r\n nz-input\r\n placeholder=\"T\u00ECm ki\u1EBFm Ch\u1EE9c danh...\"\r\n [(ngModel)]=\"searchJobTitleText\"\r\n (ngModelChange)=\"filterAvailableJobTitles()\"\r\n />\r\n </nz-input-group>\r\n <ng-template #prefixIconSearchJobTitle>\r\n <span nz-icon nzType=\"search\"></span>\r\n </ng-template>\r\n\r\n <nz-table\r\n #addJobTitleTable\r\n [nzData]=\"lstFilteredJobTitle\"\r\n [nzSize]=\"'small'\"\r\n [nzShowPagination]=\"true\"\r\n [nzPageSize]=\"10\"\r\n [nzLoading]=\"isLoadingAvailableJobTitles\"\r\n >\r\n <thead>\r\n <tr>\r\n <th\r\n nzWidth=\"60px\"\r\n [nzShowCheckbox]=\"isOneUserMultiJobTitles\"\r\n [(nzChecked)]=\"isAllJobTitleChecked\"\r\n (nzCheckedChange)=\"onAllJobTitleChecked($event)\"\r\n [nzIndeterminate]=\"isJobTitleIndeterminate\"\r\n ></th>\r\n <th nzWidth=\"150px\">M\u00E3</th>\r\n <th>T\u00EAn</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of addJobTitleTable.data\">\r\n <td>\r\n <label nz-checkbox [(ngModel)]=\"item.checked\" (ngModelChange)=\"onJobTitleChecked(item, $event)\"></label>\r\n </td>\r\n <td>{{ item.Code }}</td>\r\n <td>{{ item.Name }}</td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n </ng-container>\r\n</nz-modal>\r\n" }]
8436
8630
  }] });
8437
8631
 
8438
8632
  class UserProfileService {
@@ -8641,7 +8835,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
8641
8835
  ], template: "<!-- <h3>User Profile</h3> -->\r\n<nz-tabset [nzSize]=\"'small'\" [nzType]=\"'card'\" (nzSelectedIndexChange)=\"nzSelectedIndexChange($event)\">\r\n <nz-tab [nzTitle]=\"'\u0110\u1ED5i m\u1EADt kh\u1EA9u'\">\r\n <form [formGroup]=\"formData\" (ngSubmit)=\"onSubmit()\" nz-form>\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"10\" [nzFor]=\"'CurrentPassword'\" nzNoColon nzLabelWrap nzRequired>\r\n M\u1EADt kh\u1EA9u hi\u1EC7n t\u1EA1i\r\n </nz-form-label>\r\n <nz-form-control [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <nz-input-group\r\n [nzSuffix]=\"\r\n !CurrentPasswordVisible ? suffixTemplateShowCurrentPassword : suffixTemplateHiddenCurrentPassword\r\n \"\r\n >\r\n <input\r\n nz-input\r\n type=\"{{ CurrentPasswordType }}\"\r\n formControlName=\"CurrentPassword\"\r\n id=\"CurrentPassword\"\r\n />\r\n </nz-input-group>\r\n <ng-template #suffixTemplateShowCurrentPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"CurrentPasswordVisible = !CurrentPasswordVisible; CurrentPasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenCurrentPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"CurrentPasswordVisible = !CurrentPasswordVisible; CurrentPasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"10\" [nzFor]=\"'NewPassword'\" nzNoColon nzLabelWrap nzRequired>\r\n M\u1EADt kh\u1EA9u m\u1EDBi\r\n </nz-form-label>\r\n <nz-form-control [nzErrorTip]=\"NewPasswordErrorTpl\">\r\n <nz-input-group\r\n [nzSuffix]=\"!NewPasswordVisible ? suffixTemplateShowNewPassword : suffixTemplateHiddenNewPassword\"\r\n >\r\n <input nz-input type=\"{{ NewPasswordType }}\" formControlName=\"NewPassword\" id=\"NewPassword\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplateShowNewPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"NewPasswordVisible = !NewPasswordVisible; NewPasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenNewPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"NewPasswordVisible = !NewPasswordVisible; NewPasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n <ng-template #NewPasswordErrorTpl let-control>\r\n @if (control.errors?.[\"required\"]) {\r\n {{ \"REQUIRED_FIELD\" | translate }}\r\n }\r\n @if (control.errors?.[\"minlength\"]) {\r\n M\u1EADt kh\u1EA9u d\u00E0i t\u1ED1i thi\u1EC3u 6 k\u00FD t\u1EF1\r\n }\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"10\" [nzFor]=\"'ConfirmPassword'\" nzNoColon nzLabelWrap nzRequired>\r\n X\u00E1c nh\u1EADn m\u1EADt kh\u1EA9u m\u1EDBi\r\n </nz-form-label>\r\n <nz-form-control [nzErrorTip]=\"ConfirmPasswordErrorTpl\">\r\n <nz-input-group\r\n [nzSuffix]=\"\r\n !ConfirmPasswordVisible ? suffixTemplateShowConfirmPassword : suffixTemplateHiddenConfirmPassword\r\n \"\r\n >\r\n <input\r\n nz-input\r\n type=\"{{ ConfirmPasswordType }}\"\r\n formControlName=\"ConfirmPassword\"\r\n id=\"ConfirmPassword\"\r\n />\r\n </nz-input-group>\r\n <ng-template #suffixTemplateShowConfirmPassword>\r\n <nz-icon\r\n nzType=\"eye\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"ConfirmPasswordVisible = !ConfirmPasswordVisible; ConfirmPasswordType = 'text'\"\r\n />\r\n </ng-template>\r\n <ng-template #suffixTemplateHiddenConfirmPassword>\r\n <nz-icon\r\n nzType=\"eye-invisible\"\r\n nzTheme=\"outline\"\r\n nz-tooltip\r\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\r\n nzTooltipPlacement=\"right\"\r\n (click)=\"ConfirmPasswordVisible = !ConfirmPasswordVisible; ConfirmPasswordType = 'password'\"\r\n />\r\n </ng-template>\r\n <ng-template #ConfirmPasswordErrorTpl let-control>\r\n @if (control.errors?.[\"required\"]) {\r\n {{ \"REQUIRED_FIELD\" | translate }}\r\n }\r\n @if (control.errors?.[\"passwordMismatch\"]) {\r\n M\u1EADt kh\u1EA9u kh\u00F4ng kh\u1EDBp\r\n }\r\n </ng-template>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <button nz-button nzType=\"primary\">\u0110\u1ED5i m\u1EADt kh\u1EA9u</button>\r\n </form>\r\n </nz-tab>\r\n\r\n <nz-tab [nzTitle]=\"'Giao di\u1EC7n'\">\r\n <div nz-row>\r\n <extend-checkbox\r\n nz-col\r\n [nzSpan]=\"6\"\r\n [label]=\"'High contrast'\"\r\n [labelSpan]=\"0\"\r\n [(_ngModel)]=\"isHighContrast\"\r\n (_ngModelChange)=\"onChangeHighContrast()\"\r\n ></extend-checkbox>\r\n\r\n <extend-input\r\n nz-col\r\n [nzSpan]=\"6\"\r\n [label]=\"'Side width'\"\r\n [(_ngModel)]=\"sideWidth\"\r\n (_ngModelChange)=\"onChangeSideWidth()\"\r\n ></extend-input>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"16\">\r\n <div nz-col>\r\n Theme color:\r\n <nz-color-picker\r\n nzShowText\r\n [ngModel]=\"\r\n profileService.userProfile[profileService.KEY_THEME_COLOR] ||\r\n profileService.themecf[profileService.KEY_THEME_COLOR] ||\r\n profileService.DEFAULT_THEME_COLOR\r\n \"\r\n (ngModelChange)=\"\r\n profileService.updateUserProfile(profileService.KEY_THEME_COLOR, $event); profileService.loadTheme()\r\n \"\r\n ></nz-color-picker>\r\n </div>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"16\">\r\n <div nz-col>\r\n Theme menu color:\r\n <nz-color-picker\r\n nzShowText\r\n [ngModel]=\"\r\n profileService.userProfile[profileService.KEY_THEME_MENU_COLOR] ||\r\n profileService.themecf[profileService.KEY_THEME_MENU_COLOR] ||\r\n profileService.DEFAULT_THEME_MENU_COLOR\r\n \"\r\n (ngModelChange)=\"\r\n profileService.updateUserProfile(profileService.KEY_THEME_MENU_COLOR, $event); profileService.loadTheme()\r\n \"\r\n ></nz-color-picker>\r\n </div>\r\n </div>\r\n\r\n <div nz-row [nzGutter]=\"16\">\r\n <div nz-col>\r\n <button type=\"button\" nz-button nzType=\"primary\" nzDanger (click)=\"profileService.resetTheme()\">\r\n Reset Theme\r\n </button>\r\n </div>\r\n </div>\r\n </nz-tab>\r\n <!-- <nz-tab [nzTitle]=\"'Tab3'\"> Tab3 </nz-tab> -->\r\n</nz-tabset>\r\n" }]
8642
8836
  }] });
8643
8837
 
8644
- const URLs$3 = {
8838
+ const URLs$4 = {
8645
8839
  getById: '/api/App_Sequence/GetById',
8646
8840
  getAll: '/api/App_Sequence/GetAll',
8647
8841
  getList: '/api/App_Sequence/GetList',
@@ -8653,13 +8847,13 @@ class SequenceService extends HTTPService {
8653
8847
  commonService = inject(CommonService);
8654
8848
  getById(id) {
8655
8849
  const params = new HttpParams().append('id', id);
8656
- return this.postParams(AppGlobals.apiEndpoint + URLs$3.getById, params);
8850
+ return this.postParams(AppGlobals.apiEndpoint + URLs$4.getById, params);
8657
8851
  }
8658
8852
  getAll() {
8659
- return this.post(AppGlobals.apiEndpoint + URLs$3.getAll);
8853
+ return this.post(AppGlobals.apiEndpoint + URLs$4.getAll);
8660
8854
  }
8661
8855
  getList(filter) {
8662
- return this.postData(AppGlobals.apiEndpoint + URLs$3.getList, filter);
8856
+ return this.postData(AppGlobals.apiEndpoint + URLs$4.getList, filter);
8663
8857
  }
8664
8858
  getPaging(filter) {
8665
8859
  return this.commonService.ESP({
@@ -8675,7 +8869,7 @@ class SequenceService extends HTTPService {
8675
8869
  }
8676
8870
  delete(id) {
8677
8871
  const params = new HttpParams().append('id', id);
8678
- return this.postParams(AppGlobals.apiEndpoint + URLs$3.delete, params);
8872
+ return this.postParams(AppGlobals.apiEndpoint + URLs$4.delete, params);
8679
8873
  }
8680
8874
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SequenceService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
8681
8875
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SequenceService, providedIn: 'root' });
@@ -8777,7 +8971,7 @@ class SequenceListComponent extends BaseComponent {
8777
8971
  this.getData();
8778
8972
  }
8779
8973
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SequenceListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8780
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SequenceListComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Code</th>\r\n <th nzWidth=\"75px\">Type</th>\r\n <th nzWidth=\"75px\">Prefix</th>\r\n <th nzWidth=\"75px\">Suffix</th>\r\n <th nzWidth=\"75px\">Length</th>\r\n <th nzWidth=\"75px\">Start at</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\" nzRight>Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\"></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th nzRight></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Type }}</td>\r\n <td>{{ row.Prefix }}</td>\r\n <td>{{ row.Suffix }}</td>\r\n <td>{{ row.Length }}</td>\r\n <td>{{ row.SeqStartAt }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }] });
8974
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SequenceListComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th nzWidth=\"75px\">Type</th>\r\n <th nzWidth=\"75px\">Prefix</th>\r\n <th nzWidth=\"75px\">Suffix</th>\r\n <th nzWidth=\"75px\">Length</th>\r\n <th nzWidth=\"75px\">Start at</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\">Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\"></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Type }}</td>\r\n <td>{{ row.Prefix }}</td>\r\n <td>{{ row.Suffix }}</td>\r\n <td>{{ row.Length }}</td>\r\n <td>{{ row.SeqStartAt }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "component", type: ButtonSearch, selector: "button-search" }, { kind: "component", type: ButtonAdd, selector: "button-add" }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i6$2.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "component", type: ExtendInput, selector: "extend-input", inputs: ["label", "floatingLabel", "placeHolder", "labelAlign", "inputClass", "labelSpan", "labelFlex", "inputFlex", "showClear", "disabled", "readOnly", "required", "noBottom", "selectModeType", "autocomplete", "autofocus", "inputWidth", "inputHeight", "borderBottomOnly", "displayInline", "size", "displayField", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "onclickClearIcon", "onenter"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: IconEdit, selector: "icon-edit", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$3.NzPaginationComponent, selector: "nz-pagination", inputs: ["nzShowTotal", "nzItemRender", "nzSize", "nzPageSizeOptions", "nzShowSizeChanger", "nzShowQuickJumper", "nzSimple", "nzDisabled", "nzResponsive", "nzHideOnSinglePage", "nzTotal", "nzPageIndex", "nzPageSize"], outputs: ["nzPageSizeChange", "nzPageIndexChange"], exportAs: ["nzPagination"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }] });
8781
8975
  }
8782
8976
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SequenceListComponent, decorators: [{
8783
8977
  type: Component,
@@ -8794,7 +8988,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
8794
8988
  IconDelete,
8795
8989
  NzPaginationModule,
8796
8990
  CommonModule,
8797
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th>Code</th>\r\n <th nzWidth=\"75px\">Type</th>\r\n <th nzWidth=\"75px\">Prefix</th>\r\n <th nzWidth=\"75px\">Suffix</th>\r\n <th nzWidth=\"75px\">Length</th>\r\n <th nzWidth=\"75px\">Start at</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\" nzRight>Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\"></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th nzRight></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Type }}</td>\r\n <td>{{ row.Prefix }}</td>\r\n <td>{{ row.Suffix }}</td>\r\n <td>{{ row.Length }}</td>\r\n <td>{{ row.SeqStartAt }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"center\" nzRight>\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
8991
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-flex nzJustify=\"end\">\r\n <div nz-flex nzGap=\"small\">\r\n <button-add (click)=\"edit(null)\"></button-add>\r\n <button-search (click)=\"search()\"></button-search>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\">\r\n <nz-table\r\n #table\r\n [nzData]=\"data.LstItem || []\"\r\n [nzBordered]=\"true\"\r\n [nzSize]=\"'small'\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzFrontPagination]=\"false\"\r\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\r\n >\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\">#</th>\r\n <th\r\n [nzShowSort]=\"true\"\r\n [nzSortOrder]=\"filter.OrderOption.FieldName == 'Code' ? filter.OrderOption.Direction : null\"\r\n [nzSortDirections]=\"['ascend', 'descend']\"\r\n (nzSortOrderChange)=\"\r\n filter.OrderOption.FieldName = 'Code'; filter.OrderOption.Direction = $event; getData()\r\n \"\r\n >\r\n Code\r\n </th>\r\n <th nzWidth=\"75px\">Type</th>\r\n <th nzWidth=\"75px\">Prefix</th>\r\n <th nzWidth=\"75px\">Suffix</th>\r\n <th nzWidth=\"75px\">Length</th>\r\n <th nzWidth=\"75px\">Start at</th>\r\n <th>Description</th>\r\n <th nzWidth=\"75px\">Active</th>\r\n <th nzWidth=\"75px\">Action</th>\r\n </tr>\r\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\r\n <th></th>\r\n <th>\r\n <extend-input size=\"small\" [(_ngModel)]=\"filter.Code\"></extend-input>\r\n </th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of table.data; track $index; let i = $index) {\r\n <tr>\r\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\r\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Code }}</td>\r\n <td>{{ row.Type }}</td>\r\n <td>{{ row.Prefix }}</td>\r\n <td>{{ row.Suffix }}</td>\r\n <td>{{ row.Length }}</td>\r\n <td>{{ row.SeqStartAt }}</td>\r\n <td>{{ row.Description }}</td>\r\n <td class=\"center\">\r\n @if (row.IsActive) {\r\n <nz-icon nzType=\"check-circle\" nzTheme=\"outline\" class=\"color-primary\" />\r\n }\r\n </td>\r\n <td class=\"center\">\r\n <icon-edit (click)=\"edit(row)\"></icon-edit>\r\n <box [width]=\"4\"></box>\r\n <icon-delete></icon-delete>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n <div nz-col nzSpan=\"24\">\r\n <div nz-row nzJustify=\"end\">\r\n <nz-pagination\r\n [nzSize]=\"'small'\"\r\n [nzPageIndex]=\"filter.PageIndex + 1\"\r\n [nzPageSize]=\"filter.PageSize\"\r\n [nzTotal]=\"data.TotalCount || 0\"\r\n [nzShowSizeChanger]=\"true\"\r\n [nzShowTotal]=\"showTotalTpl\"\r\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\r\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\r\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\r\n >\r\n </nz-pagination>\r\n\r\n <ng-template #showTotalTpl let-total let-range=\"range\">\r\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
8798
8992
  }] });
8799
8993
 
8800
8994
  class SequenceDetailComponent extends BaseComponent {
@@ -8902,7 +9096,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
8902
9096
  ], template: "<form nz-form [formGroup]=\"formData\">\r\n <div nz-row [nzGutter]=\"[32, 16]\">\r\n <div nz-col [nzSpan]=\"24\">\r\n <div nz-flex [nzGap]=\"'small'\" nzJustify=\"end\">\r\n <button-save (click)=\"save()\"></button-save>\r\n <button-delete (click)=\"delete()\"></button-delete>\r\n <button-back (click)=\"goback()\"></button-back>\r\n </div>\r\n </div>\r\n\r\n <nz-divider style=\"margin: 8px\"></nz-divider>\r\n\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Code\" nzLabelAlign=\"left\" nzNoColon=\"true\" nzRequired> M\u00E3 </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\" [nzErrorTip]=\"'REQUIRED_FIELD' | translate\">\r\n <input nz-input formControlName=\"Code\" id=\"Code\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Name\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Lo\u1EA1i </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-select formControlName=\"Type\" nzAllowClear>\r\n <nz-option nzValue=\"daily\" nzLabel=\"Daily\"></nz-option>\r\n <nz-option nzValue=\"monthly\" nzLabel=\"Monthly\"></nz-option>\r\n <nz-option nzValue=\"yearly\" nzLabel=\"Yearly\"></nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Prefix\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Prefix </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <input nz-input formControlName=\"Prefix\" id=\"Prefix\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Suffix\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Suffix </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <input nz-input formControlName=\"Suffix\" id=\"Suffix\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <div nz-row>\r\n <div nz-col [nzSpan]=\"8\"></div>\r\n <div nz-col [nzSpan]=\"16\">\r\n <label nz-checkbox formControlName=\"IsActive\">Active</label>\r\n </div>\r\n </div>\r\n\r\n <box [height]=\"16\"></box>\r\n\r\n <nz-alert\r\n nzShowIcon\r\n nzType=\"info\"\r\n nzMessage=\"\uD83D\uDCA1 H\u01B0\u1EDBng d\u1EABn Prefix, Suffix\"\r\n [nzDescription]=\"descriptionTemplate2\"\r\n ></nz-alert>\r\n <ng-template #descriptionTemplate2>\r\n <div>{{ \"{ORG_CODE}\" }}</div>\r\n <div>{{ \"{yyyy}\" }}</div>\r\n <div>{{ \"{yy}\" }}</div>\r\n </ng-template>\r\n </div>\r\n\r\n <div nz-col [nzMd]=\"12\" [nzSm]=\"24\">\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"Length\" nzLabelAlign=\"left\" nzNoColon=\"true\"> Length </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-input-number id=\"Length\" formControlName=\"Length\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label [nzSpan]=\"8\" nzFor=\"SeqStartAt\" nzLabelAlign=\"left\" nzNoColon=\"true\"> SeqStartAt </nz-form-label>\r\n <nz-form-control [nzSpan]=\"16\">\r\n <nz-input-number id=\"SeqStartAt\" formControlName=\"SeqStartAt\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <extend-textarea [label]=\"'M\u00F4 t\u1EA3'\" [formData]=\"formData\" [controlName]=\"'Description'\"></extend-textarea>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"24\"></div>\r\n </div>\r\n</form>\r\n" }]
8903
9097
  }] });
8904
9098
 
8905
- const URLs$2 = {
9099
+ const URLs$3 = {
8906
9100
  getPaging: '/api/Cache/paging',
8907
9101
  remove: '/api/Cache/remove',
8908
9102
  removeStartWith: '/api/Cache/remove-start-with',
@@ -8912,22 +9106,22 @@ const URLs$2 = {
8912
9106
  };
8913
9107
  class CacheService extends HTTPService {
8914
9108
  getPaging(filter) {
8915
- return this.postData(AppGlobals.apiEndpoint + URLs$2.getPaging, filter);
9109
+ return this.postData(AppGlobals.apiEndpoint + URLs$3.getPaging, filter);
8916
9110
  }
8917
9111
  getValue(key) {
8918
9112
  const params = new HttpParams().append('key', key);
8919
- return this.postParams(AppGlobals.apiEndpoint + URLs$2.getValue, params);
9113
+ return this.postParams(AppGlobals.apiEndpoint + URLs$3.getValue, params);
8920
9114
  }
8921
9115
  remove(key) {
8922
9116
  const params = new HttpParams().append('key', key);
8923
- return this.postParams(AppGlobals.apiEndpoint + URLs$2.remove, params);
9117
+ return this.postParams(AppGlobals.apiEndpoint + URLs$3.remove, params);
8924
9118
  }
8925
9119
  removeStartWith(prefix) {
8926
9120
  const params = new HttpParams().append('prefix', prefix);
8927
- return this.postParams(AppGlobals.apiEndpoint + URLs$2.removeStartWith, params);
9121
+ return this.postParams(AppGlobals.apiEndpoint + URLs$3.removeStartWith, params);
8928
9122
  }
8929
9123
  clearAll() {
8930
- return this.post(AppGlobals.apiEndpoint + URLs$2.clearAll);
9124
+ return this.post(AppGlobals.apiEndpoint + URLs$3.clearAll);
8931
9125
  }
8932
9126
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: CacheService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
8933
9127
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: CacheService, providedIn: 'root' });
@@ -8998,29 +9192,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
8998
9192
  }]
8999
9193
  }] });
9000
9194
 
9001
- class FormatBytesPipe {
9002
- transform(bytes, decimals = 2) {
9003
- if (bytes === null || bytes === undefined || isNaN(bytes))
9004
- return '0 B';
9005
- if (bytes === 0)
9006
- return '0 B';
9007
- const k = 1024;
9008
- const dm = decimals < 0 ? 0 : decimals;
9009
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
9010
- const i = Math.floor(Math.log(bytes) / Math.log(k));
9011
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
9012
- }
9013
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FormatBytesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
9014
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.7", ngImport: i0, type: FormatBytesPipe, isStandalone: true, name: "formatBytes" });
9015
- }
9016
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FormatBytesPipe, decorators: [{
9017
- type: Pipe,
9018
- args: [{
9019
- name: 'formatBytes',
9020
- standalone: true,
9021
- }]
9022
- }] });
9023
-
9024
9195
  class CacheFilter {
9025
9196
  CacheKey = '';
9026
9197
  PageIndex = 0;
@@ -9454,7 +9625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
9454
9625
  args: [{ imports: [NzButtonModule], template: "<div style=\"overflow: auto\">\r\n <pre>\r\n {{ _data }}\r\n </pre>\r\n</div>\r\n<button nz-button nzType=\"primary\" (click)=\"load()\" style=\"position: fixed; right: 80px; bottom: 45px\">Reload</button>\r\n" }]
9455
9626
  }] });
9456
9627
 
9457
- const URLs$1 = {
9628
+ const URLs$2 = {
9458
9629
  getById: '/api/App_Log/GetById',
9459
9630
  getAll: '/api/App_Log/GetAll',
9460
9631
  getList: '/api/App_Log/GetList',
@@ -9466,13 +9637,13 @@ class LogAppService extends HTTPService {
9466
9637
  commonService = inject(CommonService);
9467
9638
  getById(id) {
9468
9639
  const params = new HttpParams().append('id', id);
9469
- return this.postParams(AppGlobals.apiEndpoint + URLs$1.getById, params);
9640
+ return this.postParams(AppGlobals.apiEndpoint + URLs$2.getById, params);
9470
9641
  }
9471
9642
  getAll() {
9472
- return this.post(AppGlobals.apiEndpoint + URLs$1.getAll);
9643
+ return this.post(AppGlobals.apiEndpoint + URLs$2.getAll);
9473
9644
  }
9474
9645
  getList(filter) {
9475
- return this.postData(AppGlobals.apiEndpoint + URLs$1.getList, filter);
9646
+ return this.postData(AppGlobals.apiEndpoint + URLs$2.getList, filter);
9476
9647
  }
9477
9648
  getPaging(filter) {
9478
9649
  return this.commonService.ESP({
@@ -9481,11 +9652,11 @@ class LogAppService extends HTTPService {
9481
9652
  });
9482
9653
  }
9483
9654
  addOrEdit(obj) {
9484
- return this.postData(AppGlobals.apiEndpoint + URLs$1.addOrEdit, obj);
9655
+ return this.postData(AppGlobals.apiEndpoint + URLs$2.addOrEdit, obj);
9485
9656
  }
9486
9657
  delete(id) {
9487
9658
  const params = new HttpParams().append('id', id);
9488
- return this.postParams(AppGlobals.apiEndpoint + URLs$1.delete, params);
9659
+ return this.postParams(AppGlobals.apiEndpoint + URLs$2.delete, params);
9489
9660
  }
9490
9661
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LogAppService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
9491
9662
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LogAppService, providedIn: 'root' });
@@ -9629,7 +9800,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
9629
9800
  args: [{ selector: 'app-version', imports: [NzButtonModule, ButtonReload], template: "<div style=\"padding: 16px\">\r\n <button nz-button nzType=\"primary\" (click)=\"refresh()\">Refresh</button>&nbsp;\r\n\r\n <pre>\r\nFrontend Client Version: {{ VscService.feClientVersion }}\r\nFrontend Server Version: {{ VscService.feServerVersion }}\r\n\r\nBackend Version: {{ JSON.stringify(VscService.beVersion, null, 2) }}\r\n\r\n\r\n</pre\r\n >\r\n</div>\r\n" }]
9630
9801
  }], ctorParameters: () => [{ type: VscService }] });
9631
9802
 
9632
- const URLs = {
9803
+ const URLs$1 = {
9633
9804
  systemResourseInfo: '/api/monitor/SystemResourseInfo',
9634
9805
  };
9635
9806
  class MonitorService extends HTTPService {
@@ -9641,7 +9812,7 @@ class MonitorService extends HTTPService {
9641
9812
  });
9642
9813
  }
9643
9814
  getResourseInfo() {
9644
- return this.get(AppGlobals.apiEndpoint + URLs.systemResourseInfo, true);
9815
+ return this.get(AppGlobals.apiEndpoint + URLs$1.systemResourseInfo, true);
9645
9816
  }
9646
9817
  getLstDbMonitorType() {
9647
9818
  return this.cms.ESP({
@@ -9812,6 +9983,239 @@ class MonitorFilter extends GridFilter {
9812
9983
  ExcuteTimeVisible;
9813
9984
  }
9814
9985
 
9986
+ class SynologyService extends HTTPService {
9987
+ getBasePath() {
9988
+ return this.get(AppGlobals.apiEndpoint + '/api/synology/getBasePath', true);
9989
+ }
9990
+ createFolder(path, name) {
9991
+ const pr = new HttpParams().append('path', path).append('name', name);
9992
+ return this.postParams(AppGlobals.apiEndpoint + '/api/synology/CreateFolder', pr, true);
9993
+ }
9994
+ renameItem(path, newName) {
9995
+ const pr = new HttpParams().append('path', path).append('newName', newName);
9996
+ return this.postParams(AppGlobals.apiEndpoint + '/api/synology/Rename', pr, true);
9997
+ }
9998
+ getListFile(path) {
9999
+ const pr = new HttpParams().append('path', path);
10000
+ return this.postParams(AppGlobals.apiEndpoint + '/api/synology/ListFiles', pr, true);
10001
+ }
10002
+ uploadFile(path, file) {
10003
+ const formData = new FormData();
10004
+ formData.append('path', path);
10005
+ formData.append('file', file);
10006
+ return this.httpClient.post(AppGlobals.apiEndpoint + '/api/synology/Upload', formData);
10007
+ }
10008
+ downloadFile(path) {
10009
+ const pr = new HttpParams().append('path', path);
10010
+ return this.httpClient.get(AppGlobals.apiEndpoint + '/api/synology/Download', {
10011
+ params: pr,
10012
+ responseType: 'blob',
10013
+ });
10014
+ }
10015
+ deleteItem(path) {
10016
+ const pr = new HttpParams().append('path', path);
10017
+ return this.httpClient.delete(AppGlobals.apiEndpoint + '/api/synology/Delete', { params: pr });
10018
+ }
10019
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SynologyService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
10020
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SynologyService, providedIn: 'root' });
10021
+ }
10022
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SynologyService, decorators: [{
10023
+ type: Injectable,
10024
+ args: [{
10025
+ providedIn: 'root',
10026
+ }]
10027
+ }] });
10028
+
10029
+ class SynologyComponent extends BaseComponent {
10030
+ service = inject(SynologyService);
10031
+ datePipe = inject(DatePipe);
10032
+ currentPath = '/';
10033
+ fileList = [];
10034
+ selectedRow;
10035
+ async ngOnInit() {
10036
+ Breadcrumb.lstBreadcrumb = [];
10037
+ await this.getCurrentPath();
10038
+ this.getListFile();
10039
+ }
10040
+ async getCurrentPath() {
10041
+ await this.service.getBasePath().then((res) => (this.currentPath = res.Data));
10042
+ }
10043
+ createFolder() {
10044
+ const folderName = prompt('New Floder:');
10045
+ if (!folderName || folderName.trim() === '')
10046
+ return;
10047
+ this.isLoading = true;
10048
+ this.service.createFolder(this.currentPath, folderName.trim()).then((res) => {
10049
+ this.isLoading = false;
10050
+ if (res.IsSuccess) {
10051
+ this.success('Create Folder successful!');
10052
+ this.getListFile();
10053
+ }
10054
+ else {
10055
+ this.error(res.ErrorMessage);
10056
+ }
10057
+ }, (err) => {
10058
+ this.isLoading = false;
10059
+ this.handleError(err);
10060
+ });
10061
+ }
10062
+ renameItem(item) {
10063
+ this.selectedRow = item;
10064
+ // trễ một chút cho hiện mầu row selected
10065
+ setTimeout(() => {
10066
+ const newName = prompt('New Name:', item.name);
10067
+ if (!newName || newName.trim() === '' || newName.trim() === item.name)
10068
+ return;
10069
+ this.isLoading = true;
10070
+ this.service.renameItem(item.path, newName.trim()).then((res) => {
10071
+ this.isLoading = false;
10072
+ if (res.IsSuccess) {
10073
+ this.success('Rename successful!');
10074
+ this.getListFile();
10075
+ }
10076
+ else {
10077
+ this.error(res.ErrorMessage);
10078
+ }
10079
+ }, (err) => {
10080
+ this.isLoading = false;
10081
+ this.handleError(err);
10082
+ });
10083
+ }, 100);
10084
+ }
10085
+ getListFile(path) {
10086
+ if (path) {
10087
+ this.currentPath = path;
10088
+ }
10089
+ this.isLoading = true;
10090
+ this.service.getListFile(this.currentPath).then((res) => {
10091
+ this.isLoading = false;
10092
+ if (res.IsSuccess && res.Data) {
10093
+ this.fileList = res.Data.files || [];
10094
+ }
10095
+ else {
10096
+ this.error(res.ErrorMessage);
10097
+ }
10098
+ }, (err) => {
10099
+ this.isLoading = false;
10100
+ this.handleError(err);
10101
+ });
10102
+ }
10103
+ openItem(item) {
10104
+ if (item.isdir) {
10105
+ this.getListFile(item.path);
10106
+ }
10107
+ }
10108
+ canGoUp() {
10109
+ const segments = this.currentPath.split('/').filter((p) => p.trim() !== '');
10110
+ return segments.length > 1;
10111
+ }
10112
+ goUpLevel() {
10113
+ if (!this.canGoUp())
10114
+ return;
10115
+ const segments = this.currentPath.split('/').filter((p) => p.trim() !== '');
10116
+ segments.pop();
10117
+ const newPath = '/' + segments.join('/');
10118
+ this.getListFile(newPath);
10119
+ }
10120
+ onFileSelected(event) {
10121
+ const file = event.target.files[0];
10122
+ if (file) {
10123
+ this.isLoading = true;
10124
+ this.service.uploadFile(this.currentPath, file).subscribe({
10125
+ next: (res) => {
10126
+ this.isLoading = false;
10127
+ if (res.IsSuccess) {
10128
+ this.success('Upload file successful!');
10129
+ this.getListFile();
10130
+ }
10131
+ else {
10132
+ this.error(res.ErrorMessage);
10133
+ }
10134
+ event.target.value = '';
10135
+ },
10136
+ error: (err) => {
10137
+ this.isLoading = false;
10138
+ this.handleError(err);
10139
+ event.target.value = '';
10140
+ },
10141
+ });
10142
+ }
10143
+ }
10144
+ downloadFile(item) {
10145
+ this.selectedRow = item;
10146
+ this.isLoading = true;
10147
+ this.service.downloadFile(item.path).subscribe({
10148
+ next: (blob) => {
10149
+ this.isLoading = false;
10150
+ const url = window.URL.createObjectURL(blob);
10151
+ const a = document.createElement('a');
10152
+ a.href = url;
10153
+ a.download = item.name;
10154
+ document.body.appendChild(a);
10155
+ a.click();
10156
+ document.body.removeChild(a);
10157
+ window.URL.revokeObjectURL(url);
10158
+ },
10159
+ error: (err) => {
10160
+ this.isLoading = false;
10161
+ this.handleError(err);
10162
+ },
10163
+ });
10164
+ }
10165
+ async deleteItem(item) {
10166
+ this.selectedRow = item;
10167
+ const typeStr = item.isdir ? 'folder' : 'file';
10168
+ if (await this.confirm(`Delete ${typeStr} "${item.name}"?`)) {
10169
+ this.isLoading = true;
10170
+ this.service.deleteItem(item.path).subscribe({
10171
+ next: (res) => {
10172
+ this.isLoading = false;
10173
+ if (res.IsSuccess) {
10174
+ this.success(`Delete successful!`);
10175
+ this.getListFile();
10176
+ }
10177
+ else {
10178
+ this.error(res.ErrorMessage);
10179
+ }
10180
+ },
10181
+ error: (err) => {
10182
+ this.isLoading = false;
10183
+ this.handleError(err);
10184
+ },
10185
+ });
10186
+ }
10187
+ }
10188
+ formatBytes(bytes) {
10189
+ if (!bytes || bytes === 0)
10190
+ return '-';
10191
+ const k = 1024;
10192
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
10193
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
10194
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
10195
+ }
10196
+ formatDate(timestamp) {
10197
+ if (!timestamp)
10198
+ return '-';
10199
+ const date = new Date(timestamp * 1000);
10200
+ return this.datePipe.transform(date, 'dd/MM/yyyy HH:mm:ss') || '-';
10201
+ }
10202
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SynologyComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
10203
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SynologyComponent, isStandalone: true, selector: "ng-component", providers: [DatePipe], usesInheritance: true, ngImport: i0, template: "<div nz-row nzGutter=\"32\">\r\n <div nz-col nzSpan=\"24\" style=\"display: flex; justify-content: flex-end; gap: 8px\">\r\n <input type=\"file\" #fileInput style=\"display: none\" (change)=\"onFileSelected($event)\" />\r\n <button nz-button nzType=\"primary\" (click)=\"getListFile()\" nz-tooltip=\"Reload\" nzTooltipPlacement=\"bottom\">\r\n <i nz-icon nzType=\"reload\"></i>\r\n </button>\r\n <button nz-button nzType=\"primary\" (click)=\"fileInput.click()\" nz-tooltip=\"Upload\" nzTooltipPlacement=\"bottom\">\r\n <i nz-icon nzType=\"upload\"></i>\r\n </button>\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n (click)=\"createFolder()\"\r\n nz-tooltip=\"New Folder\"\r\n nzTooltipPlacement=\"bottomRight\"\r\n >\r\n <i nz-icon nzType=\"folder-add\"></i>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div nz-row nzGutter=\"32\">\r\n <div nz-col nzSpan=\"24\">\r\n <strong>{{ currentPath }}</strong>\r\n </div>\r\n</div>\r\n\r\n<nz-table #fileTable [nzData]=\"fileList\" [nzLoading]=\"isLoading\" nzSize=\"small\" nzBordered>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\" nzAlign=\"center\">Type</th>\r\n <th>Name</th>\r\n <!-- <th>Path</th> -->\r\n <th nzWidth=\"100px\">Size</th>\r\n <th nzWidth=\"180px\">Modified Date</th>\r\n <th nzWidth=\"100px\" nzAlign=\"right\">Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngIf=\"canGoUp()\" (dblclick)=\"goUpLevel()\" style=\"cursor: pointer\">\r\n <td nzAlign=\"center\">\r\n <i nz-icon nzType=\"folder\" nzTheme=\"fill\" [style.color]=\"'#faad14'\"></i>\r\n </td>\r\n <td><strong>..</strong></td>\r\n <!-- <td></td> -->\r\n <td></td>\r\n <td></td>\r\n <td nzAlign=\"center\"></td>\r\n </tr>\r\n\r\n @for (item of fileTable.data; track $index) {\r\n <tr\r\n [class.selected]=\"item == selectedRow\"\r\n (click)=\"selectedRow = item\"\r\n (dblclick)=\"openItem(item)\"\r\n style=\"cursor: pointer\"\r\n >\r\n <td nzAlign=\"center\">\r\n <i\r\n nz-icon\r\n [nzType]=\"item.isdir ? 'folder' : 'file'\"\r\n [nzTheme]=\"item.isdir ? 'fill' : 'outline'\"\r\n [style.color]=\"item.isdir ? '#faad14' : '#1890ff'\"\r\n ></i>\r\n </td>\r\n <td>\r\n <strong>{{ item.name }}</strong>\r\n </td>\r\n <!-- <td>{{ item.path }}</td> -->\r\n <td nzAlign=\"right\">{{ item.isdir ? \"-\" : formatBytes(item.additional?.size) }}</td>\r\n <td nzAlign=\"right\">{{ formatDate(item.additional?.time?.mtime) }}</td>\r\n <td nzAlign=\"right\">\r\n <button\r\n *ngIf=\"!item.isdir\"\r\n nz-button\r\n nzType=\"link\"\r\n nzSize=\"small\"\r\n (click)=\"downloadFile(item); $event.stopPropagation()\"\r\n >\r\n <nz-icon nzType=\"download\" nzTheme=\"outline\"></nz-icon>\r\n </button>\r\n <button nz-button nzType=\"link\" nzDanger nzSize=\"small\" (click)=\"deleteItem(item); $event.stopPropagation()\">\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\"></nz-icon>\r\n </button>\r\n <button nz-button nzType=\"link\" nzSize=\"small\" (click)=\"renameItem(item); $event.stopPropagation()\">\r\n <nz-icon nzType=\"retweet\" nzTheme=\"outline\" />\r\n </button>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n</nz-table>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i6$2.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "noDataVirtualHeight", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "directive", type: i6$2.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i6$2.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i6$2.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i6$2.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i6$2.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i6$2.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }] });
10204
+ }
10205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SynologyComponent, decorators: [{
10206
+ type: Component,
10207
+ args: [{ standalone: true, imports: [
10208
+ CommonModule,
10209
+ FormsModule,
10210
+ NzGridModule,
10211
+ NzButtonModule,
10212
+ NzTableModule,
10213
+ NzIconModule,
10214
+ NzFlexModule,
10215
+ NzToolTipModule,
10216
+ ], providers: [DatePipe], template: "<div nz-row nzGutter=\"32\">\r\n <div nz-col nzSpan=\"24\" style=\"display: flex; justify-content: flex-end; gap: 8px\">\r\n <input type=\"file\" #fileInput style=\"display: none\" (change)=\"onFileSelected($event)\" />\r\n <button nz-button nzType=\"primary\" (click)=\"getListFile()\" nz-tooltip=\"Reload\" nzTooltipPlacement=\"bottom\">\r\n <i nz-icon nzType=\"reload\"></i>\r\n </button>\r\n <button nz-button nzType=\"primary\" (click)=\"fileInput.click()\" nz-tooltip=\"Upload\" nzTooltipPlacement=\"bottom\">\r\n <i nz-icon nzType=\"upload\"></i>\r\n </button>\r\n <button\r\n nz-button\r\n nzType=\"primary\"\r\n (click)=\"createFolder()\"\r\n nz-tooltip=\"New Folder\"\r\n nzTooltipPlacement=\"bottomRight\"\r\n >\r\n <i nz-icon nzType=\"folder-add\"></i>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div nz-row nzGutter=\"32\">\r\n <div nz-col nzSpan=\"24\">\r\n <strong>{{ currentPath }}</strong>\r\n </div>\r\n</div>\r\n\r\n<nz-table #fileTable [nzData]=\"fileList\" [nzLoading]=\"isLoading\" nzSize=\"small\" nzBordered>\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"50px\" nzAlign=\"center\">Type</th>\r\n <th>Name</th>\r\n <!-- <th>Path</th> -->\r\n <th nzWidth=\"100px\">Size</th>\r\n <th nzWidth=\"180px\">Modified Date</th>\r\n <th nzWidth=\"100px\" nzAlign=\"right\">Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngIf=\"canGoUp()\" (dblclick)=\"goUpLevel()\" style=\"cursor: pointer\">\r\n <td nzAlign=\"center\">\r\n <i nz-icon nzType=\"folder\" nzTheme=\"fill\" [style.color]=\"'#faad14'\"></i>\r\n </td>\r\n <td><strong>..</strong></td>\r\n <!-- <td></td> -->\r\n <td></td>\r\n <td></td>\r\n <td nzAlign=\"center\"></td>\r\n </tr>\r\n\r\n @for (item of fileTable.data; track $index) {\r\n <tr\r\n [class.selected]=\"item == selectedRow\"\r\n (click)=\"selectedRow = item\"\r\n (dblclick)=\"openItem(item)\"\r\n style=\"cursor: pointer\"\r\n >\r\n <td nzAlign=\"center\">\r\n <i\r\n nz-icon\r\n [nzType]=\"item.isdir ? 'folder' : 'file'\"\r\n [nzTheme]=\"item.isdir ? 'fill' : 'outline'\"\r\n [style.color]=\"item.isdir ? '#faad14' : '#1890ff'\"\r\n ></i>\r\n </td>\r\n <td>\r\n <strong>{{ item.name }}</strong>\r\n </td>\r\n <!-- <td>{{ item.path }}</td> -->\r\n <td nzAlign=\"right\">{{ item.isdir ? \"-\" : formatBytes(item.additional?.size) }}</td>\r\n <td nzAlign=\"right\">{{ formatDate(item.additional?.time?.mtime) }}</td>\r\n <td nzAlign=\"right\">\r\n <button\r\n *ngIf=\"!item.isdir\"\r\n nz-button\r\n nzType=\"link\"\r\n nzSize=\"small\"\r\n (click)=\"downloadFile(item); $event.stopPropagation()\"\r\n >\r\n <nz-icon nzType=\"download\" nzTheme=\"outline\"></nz-icon>\r\n </button>\r\n <button nz-button nzType=\"link\" nzDanger nzSize=\"small\" (click)=\"deleteItem(item); $event.stopPropagation()\">\r\n <nz-icon nzType=\"delete\" nzTheme=\"outline\"></nz-icon>\r\n </button>\r\n <button nz-button nzType=\"link\" nzSize=\"small\" (click)=\"renameItem(item); $event.stopPropagation()\">\r\n <nz-icon nzType=\"retweet\" nzTheme=\"outline\" />\r\n </button>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n</nz-table>\r\n" }]
10217
+ }] });
10218
+
9815
10219
  class App_Dic_Domain {
9816
10220
  // #region properties
9817
10221
  App_Dic_Domain_Id;
@@ -9852,9 +10256,11 @@ class App_Dic_DomainFilter extends GridFilter {
9852
10256
  DomainCode;
9853
10257
  ItemCode;
9854
10258
  ItemValue;
9855
- DomainCodeVisible;
9856
- ItemCodeVisible;
9857
- ItemValueVisible;
10259
+ constructor() {
10260
+ super();
10261
+ this.OrderOption.FieldName = 'DomainCode';
10262
+ this.OrderOption.Direction = 'ascend';
10263
+ }
9858
10264
  }
9859
10265
 
9860
10266
  class App_File {
@@ -9884,7 +10290,72 @@ class App_File {
9884
10290
  }
9885
10291
  class FileFilter extends GridFilter {
9886
10292
  Code;
10293
+ constructor() {
10294
+ super();
10295
+ this.OrderOption.FieldName = 'Code';
10296
+ this.OrderOption.Direction = 'ascend';
10297
+ }
10298
+ }
10299
+
10300
+ const URLs = {
10301
+ getById: '/api/App_MailTemplate/GetById',
10302
+ getAll: '/api/App_MailTemplate/GetAll',
10303
+ getList: '/api/App_MailTemplate/GetList',
10304
+ getPaging: '/api/App_MailTemplate/GetPaging',
10305
+ addOrEdit: '/api/App_MailTemplate/AddOrEdit',
10306
+ delete: '/api/App_MailTemplate/Delete',
10307
+ sendTestEmail: '/api/App_MailTemplate/SendTestEmail',
10308
+ cronJobScheduler_RefreshJobs: '/api/App_MailTemplate/CronJobScheduler_RefreshJobs',
10309
+ };
10310
+ class MailTemplateService extends HTTPService {
10311
+ cmservice = inject(CommonService);
10312
+ getById(id) {
10313
+ const params = new HttpParams().append('id', id);
10314
+ return this.postParams(AppGlobals.apiEndpoint + URLs.getById, params);
10315
+ }
10316
+ getAll() {
10317
+ return this.cmservice.ESP({
10318
+ SPN: 'App_MailTemplate_getAll',
10319
+ });
10320
+ }
10321
+ getList(filter) {
10322
+ return this.postData(AppGlobals.apiEndpoint + URLs.getList, filter);
10323
+ }
10324
+ getPaging(filter) {
10325
+ return this.cmservice.ESP({
10326
+ SPN: 'App_MailTemplate_getPaging',
10327
+ Params: [filter],
10328
+ });
10329
+ }
10330
+ addOrEdit(obj) {
10331
+ return this.postData(AppGlobals.apiEndpoint + URLs.addOrEdit, obj);
10332
+ }
10333
+ delete(id) {
10334
+ const params = new HttpParams().append('id', id);
10335
+ return this.postParams(AppGlobals.apiEndpoint + URLs.delete, params);
10336
+ }
10337
+ getSettingsByTemplateId(templateId) {
10338
+ return this.cmservice.ESP({
10339
+ SPN: 'App_MailSendSetting_getByTemplateId',
10340
+ Params: [templateId],
10341
+ });
10342
+ }
10343
+ sendTestEmail(payload) {
10344
+ return this.postData(AppGlobals.apiEndpoint + URLs.sendTestEmail, payload);
10345
+ }
10346
+ testFillData(id) {
10347
+ return this.post(AppGlobals.apiEndpoint + '/api/App_MailTemplate/testFillData?id=' + id);
10348
+ }
10349
+ cronJobScheduler_RefreshJobs() {
10350
+ return this.post(AppGlobals.apiEndpoint + URLs.cronJobScheduler_RefreshJobs);
10351
+ }
10352
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MailTemplateService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
10353
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MailTemplateService, providedIn: 'root' });
9887
10354
  }
10355
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MailTemplateService, decorators: [{
10356
+ type: Injectable,
10357
+ args: [{ providedIn: 'root' }]
10358
+ }] });
9888
10359
 
9889
10360
  // import {
9890
10361
  // Box,
@@ -13305,6 +13776,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
13305
13776
  type: Output
13306
13777
  }] } });
13307
13778
 
13779
+ class SideMenuComponent extends BaseComponent {
13780
+ isCollapsed = false;
13781
+ filteredLstMenu = [];
13782
+ currentHeaderId = '';
13783
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SideMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
13784
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SideMenuComponent, isStandalone: true, selector: "side-menu", inputs: { isCollapsed: "isCollapsed", filteredLstMenu: "filteredLstMenu", currentHeaderId: "currentHeaderId" }, usesInheritance: true, ngImport: i0, template: "<ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineIndent]=\"12\" [nzInlineCollapsed]=\"isCollapsed\">\r\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv4.Open\" [nzTitle]=\"menuLv4.Name\" [nzIcon]=\"menuLv4.Icon\">\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon>\r\n <box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\">\r\n {{ menuLv4.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\">\r\n {{ menuLv3.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\">\r\n {{ menuLv2.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\">\r\n {{ menuLv1.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n</ul>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NzMenuModule }, { kind: "directive", type: i4$1.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$1.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$1.NzSubMenuComponent, selector: "[nz-submenu]", inputs: ["nzMenuClassName", "nzPaddingLeft", "nzTitle", "nzIcon", "nzTriggerSubMenuAction", "nzOpen", "nzDisabled", "nzPlacement"], outputs: ["nzOpenChange"], exportAs: ["nzSubmenu"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
13785
+ }
13786
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SideMenuComponent, decorators: [{
13787
+ type: Component,
13788
+ args: [{ selector: 'side-menu', imports: [CommonModule, NzMenuModule, NzIconModule, Box, RouterModule], template: "<ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineIndent]=\"12\" [nzInlineCollapsed]=\"isCollapsed\">\r\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv4.Open\" [nzTitle]=\"menuLv4.Name\" [nzIcon]=\"menuLv4.Icon\">\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon>\r\n <box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\">\r\n {{ menuLv4.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\">\r\n {{ menuLv3.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\">\r\n {{ menuLv2.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\">\r\n {{ menuLv1.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n</ul>\r\n" }]
13789
+ }], propDecorators: { isCollapsed: [{
13790
+ type: Input
13791
+ }], filteredLstMenu: [{
13792
+ type: Input
13793
+ }], currentHeaderId: [{
13794
+ type: Input
13795
+ }] } });
13796
+
13308
13797
  class App_Menu {
13309
13798
  // #region properties
13310
13799
  App_Menu_Id;
@@ -13414,9 +13903,14 @@ class LayoutComponent extends BaseComponent {
13414
13903
  SignalRService.initNoti();
13415
13904
  this.authService.getUserHeaderMenu().then((res) => {
13416
13905
  this.lstHeaderMenu = res.Data || [];
13417
- setTimeout(() => {
13418
- this.calculateMenuOverflow();
13419
- }, 0);
13906
+ if (this.lstHeaderMenu.length == 0) {
13907
+ this.getUserMenu();
13908
+ }
13909
+ else {
13910
+ setTimeout(() => {
13911
+ this.calculateMenuOverflow();
13912
+ }, 0);
13913
+ }
13420
13914
  });
13421
13915
  await this.settingService.getByCodeAnonymous('MENU_TYPE').then((res) => {
13422
13916
  if (res?.Data) {
@@ -13472,20 +13966,20 @@ class LayoutComponent extends BaseComponent {
13472
13966
  handleHeaderMenu() {
13473
13967
  const headerId = this.route.snapshot.firstChild?.params['headerMenuId'];
13474
13968
  this._handleHeaderMenu(headerId);
13475
- this._router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
13476
- const updatedHeaderId = this.route.snapshot.firstChild?.params['headerMenuId'];
13477
- this._handleHeaderMenu(updatedHeaderId);
13478
- });
13969
+ // this._router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
13970
+ // const updatedHeaderId = this.route.snapshot.firstChild?.params['headerMenuId'];
13971
+ // this._handleHeaderMenu(updatedHeaderId);
13972
+ // });
13479
13973
  }
13480
13974
  _handleHeaderMenu(menuId) {
13481
13975
  this.getUserMenu(menuId);
13482
13976
  }
13483
- getUserMenu(headerMenuId = '') {
13977
+ getUserMenu(headerMenuId) {
13484
13978
  if (headerMenuId === this.currentHeaderId) {
13485
13979
  return;
13486
13980
  }
13487
- this.currentHeaderId = headerMenuId;
13488
- this.authService.getUserMenu(headerMenuId).then((res) => {
13981
+ this.currentHeaderId = headerMenuId || '';
13982
+ this.authService.getUserMenu(this.currentHeaderId).then((res) => {
13489
13983
  this.lstMenu = res.Data || [];
13490
13984
  this.nodes = this.buildNzTreeFromSubMenu(this.lstMenu);
13491
13985
  this.updateOpenMenus();
@@ -13730,7 +14224,7 @@ class LayoutComponent extends BaseComponent {
13730
14224
  this.cdr.detectChanges();
13731
14225
  }
13732
14226
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LayoutComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
13733
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: LayoutComponent, isStandalone: true, selector: "layout", viewQueries: [{ propertyName: "menuContainer", first: true, predicate: ["menuContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nz-layout class=\"app-layout\">\r\n <nz-header class=\"app-header\">\r\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\r\n @if (isCollapsed) {\r\n <div @fadeInOut>\r\n &nbsp;\r\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\r\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"header-logo\"\r\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\r\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\r\n >\r\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\r\n <img\r\n *ngIf=\"logoUrl$ | async as url\"\r\n [src]=\"url\"\r\n style=\"padding: 4px; height: var(--app-header-height)\"\r\n hideIfError\r\n />\r\n @if (SYSTEM_NAME) {\r\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\r\n } @else {\r\n -- o0o --\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- header menu -->\r\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\r\n <ul\r\n nz-menu\r\n nzTheme=\"light\"\r\n nzMode=\"horizontal\"\r\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\r\n >\r\n @for (item of visibleMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n\r\n @if (hiddenMenus.length > 0) {\r\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\r\n <ul>\r\n @for (item of hiddenMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\r\n <header-search></header-search>\r\n <app-notification-center></app-notification-center>\r\n <header-user></header-user>\r\n </div>\r\n </div>\r\n </nz-header>\r\n <nz-layout class=\"body-layout\">\r\n <nz-sider\r\n *ngIf=\"!LayoutComponent.noShowSideMenu\"\r\n class=\"menu-sidebar\"\r\n nzCollapsible\r\n [nzWidth]=\"siderWidth\"\r\n [nzCollapsedWidth]=\"0\"\r\n [(nzCollapsed)]=\"isCollapsed\"\r\n [nzTrigger]=\"null\"\r\n [nzTheme]=\"'dark'\"\r\n >\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper\">\r\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineIndent]=\"12\" [nzInlineCollapsed]=\"isCollapsed\">\r\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu?.length) {\r\n <ul\r\n nz-submenu\r\n [nzOpen]=\"menuLv4.Open\"\r\n [nzTitle]=\"menuLv4.Name\"\r\n [nzIcon]=\"menuLv4.Icon\"\r\n >\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon\r\n ><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"\r\n (currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\r\n \"\r\n >\r\n {{ menuLv4.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"\r\n (currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\r\n \"\r\n >\r\n {{ menuLv3.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\">\r\n {{ menuLv2.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\">\r\n {{ menuLv1.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\r\n\r\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\r\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\r\n </span>\r\n </div>\r\n </div>\r\n </nz-sider>\r\n <nz-layout class=\"main-layout\">\r\n <nz-content class=\"content\">\r\n <div class=\"inner-content\">\r\n @if (!LayoutComponent.noShowBreadcrumb) {\r\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\r\n }\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\r\n </div>\r\n </div>\r\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\r\n </nz-content>\r\n </nz-layout>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n<nz-drawer\r\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\r\n [nzWidth]=\"350\"\r\n [nzClosable]=\"false\"\r\n [(nzVisible)]=\"visibleMenuDrawer\"\r\n [nzMaskClosable]=\"true\"\r\n nzPlacement=\"left\"\r\n nzTitle=\"\"\r\n (nzOnClose)=\"closeMenuDrawer()\"\r\n>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineIndent]=\"12\">\r\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu?.length) {\r\n <ul\r\n nz-submenu\r\n [nzOpen]=\"menuLv4.Open\"\r\n [nzTitle]=\"menuLv4.Name\"\r\n [nzIcon]=\"menuLv4.Icon\"\r\n >\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon\r\n ><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"\r\n (currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\r\n \"\r\n >\r\n {{ menuLv4.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\"\r\n >\r\n {{ menuLv3.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\">\r\n {{ menuLv2.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\">\r\n {{ menuLv1.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n <ng-template #afterTemplate>\r\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\r\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html,body,app-root{height:100%;margin:0}.app-layout{display:flex;flex-direction:column;height:100vh}.app-header{position:fixed;top:0;left:0;width:100%;height:var(--app-header-height);background:var(--theme-color);color:var(--theme-text-color);box-shadow:0 1px 4px #00152914;z-index:1000;display:flex;align-items:center;padding:0}.header-content{width:100%;flex-wrap:nowrap!important}.header-logo{height:var(--app-header-height);text-align:center;color:var(--theme-text-color);transition:width .3s;flex-shrink:0;overflow:hidden}.body-layout{display:flex;flex:1;margin-top:var(--app-header-height);height:calc(100vh - var(--app-header-height));overflow:hidden}.menu-sidebar{width:256px;background:#f0f2f5;overflow-y:auto;min-height:calc(100vh - var(--app-header-height))}.menu-wapper{min-height:calc(100% - var(--app-footer-height))}.main-layout{display:flex;flex-direction:column;flex:1;overflow:hidden}.content{flex:1;background:#fff;overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:#fff;min-height:calc(100% - var(--app-footer-height));padding:8px}.content-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:center}.sider-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:right}.trigger{margin-right:8px}.menu-sidebar .ant-menu-inline .ant-menu-item{margin-top:0;margin-bottom:0}::ng-deep .menu-wapper .anticon-file{display:none}:host ::ng-deep .ant-back-top{right:30px;bottom:40px}::ng-deep .same-theme-color .ant-drawer-content{background:var(--theme-menu-color)}.nz-tree-wapper{height:calc(100vh - var(--app-header-height) - var(--app-footer-height) - 32px);overflow-y:auto}.nz-tree-wapper.in-drawer{height:calc(100vh - 32px);overflow-y:auto}::ng-deep .menu-drawer .ant-drawer-body{padding:0}::ng-deep .ant-breadcrumb-link{cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-link{color:var(--theme-text-color);cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item:not(.ant-segmented-item-selected){color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item{border-left:1px solid}::ng-deep .header-menu .ant-segmented-item:last-child{border-right:1px solid}.suffix-wrap{position:relative;width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center}.suffix-icon{position:absolute;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .16s ease,transform .18s cubic-bezier(.4,0,.2,1);transform:scale(.6) translate(4px)}.suffix-icon.show{opacity:1;pointer-events:auto;transform:scale(1) translate(0)}.search{color:#00000073}.delete{color:#bfbfbf}.delete.show{animation:popIn .18s ease}::ng-deep .header-menu .ant-menu-horizontal{background-color:transparent!important;border-bottom:none!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu{color:var(--theme-text-color)!important;opacity:.85;font-weight:600}::ng-deep .header-menu .ant-menu-submenu-title .anticon{color:var(--theme-text-color)!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected{color:var(--theme-text-color)!important;opacity:1;background-color:#ffffff1a!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected:after{border-bottom-color:#40a9ff!important}@keyframes popIn{0%{transform:scale(.5)}70%{transform:scale(1.15)}to{transform:scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzLayoutModule }, { kind: "component", type: i2$5.NzLayoutComponent, selector: "nz-layout", exportAs: ["nzLayout"] }, { kind: "component", type: i2$5.NzHeaderComponent, selector: "nz-header", exportAs: ["nzHeader"] }, { kind: "component", type: i2$5.NzContentComponent, selector: "nz-content", exportAs: ["nzContent"] }, { kind: "component", type: i2$5.NzSiderComponent, selector: "nz-sider", inputs: ["nzWidth", "nzTheme", "nzCollapsedWidth", "nzBreakpoint", "nzZeroTrigger", "nzTrigger", "nzReverseArrow", "nzCollapsible", "nzCollapsed"], outputs: ["nzCollapsedChange"], exportAs: ["nzSider"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i4$1.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$1.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$1.NzSubMenuComponent, selector: "[nz-submenu]", inputs: ["nzMenuClassName", "nzPaddingLeft", "nzTitle", "nzIcon", "nzTriggerSubMenuAction", "nzOpen", "nzDisabled", "nzPlacement"], outputs: ["nzOpenChange"], exportAs: ["nzSubmenu"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: Breadcrumb, selector: "app-breadcrumb" }, { kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i6$3.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckboxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "ngmodule", type: NzBackTopModule }, { kind: "ngmodule", type: NzDrawerModule }, { kind: "component", type: i4$2.NzDrawerComponent, selector: "nz-drawer", inputs: ["nzContent", "nzCloseIcon", "nzClosable", "nzMaskClosable", "nzMask", "nzCloseOnNavigation", "nzNoAnimation", "nzKeyboard", "nzTitle", "nzExtra", "nzFooter", "nzPlacement", "nzSize", "nzMaskStyle", "nzBodyStyle", "nzWrapClassName", "nzWidth", "nzHeight", "nzZIndex", "nzOffsetX", "nzOffsetY", "nzVisible"], outputs: ["nzOnViewInit", "nzOnClose", "nzVisibleChange"], exportAs: ["nzDrawer"] }, { kind: "directive", type: i4$2.NzDrawerContentDirective, selector: "[nzDrawerContent]", exportAs: ["nzDrawerContent"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: NzSegmentedModule }, { kind: "component", type: LayoutUser, selector: "header-user" }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconSearch, selector: "icon-search", inputs: ["size"], outputs: ["click"] }, { kind: "directive", type: HideIfErrorDirective, selector: "img[hideIfError]" }, { kind: "component", type: NotificationCenterComponent, selector: "app-notification-center" }, { kind: "component", type: HeaderSearchComponent, selector: "header-search", inputs: ["searchValue"], outputs: ["searchValueChange", "onSearch"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "ngmodule", type: NzMenuModule }], animations: [fadeInOut] });
14227
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: LayoutComponent, isStandalone: true, selector: "layout", viewQueries: [{ propertyName: "menuContainer", first: true, predicate: ["menuContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nz-layout class=\"app-layout\">\r\n <nz-header class=\"app-header\">\r\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\r\n @if (isCollapsed) {\r\n <div @fadeInOut>\r\n &nbsp;\r\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\r\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"header-logo\"\r\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\r\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\r\n >\r\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\r\n <img\r\n *ngIf=\"logoUrl$ | async as url\"\r\n [src]=\"url\"\r\n style=\"padding: 4px; height: var(--app-header-height)\"\r\n hideIfError\r\n />\r\n @if (SYSTEM_NAME) {\r\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\r\n } @else {\r\n -- o0o --\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- header menu -->\r\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\r\n <ul\r\n nz-menu\r\n nzTheme=\"light\"\r\n nzMode=\"horizontal\"\r\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\r\n >\r\n @for (item of visibleMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n\r\n @if (hiddenMenus.length > 0) {\r\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\r\n <ul>\r\n @for (item of hiddenMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\r\n <header-search></header-search>\r\n <app-notification-center></app-notification-center>\r\n <header-user></header-user>\r\n </div>\r\n </div>\r\n </nz-header>\r\n <nz-layout class=\"body-layout\">\r\n <nz-sider\r\n *ngIf=\"!LayoutComponent.noShowSideMenu\"\r\n class=\"menu-sidebar\"\r\n nzCollapsible\r\n [nzWidth]=\"siderWidth\"\r\n [nzCollapsedWidth]=\"0\"\r\n [(nzCollapsed)]=\"isCollapsed\"\r\n [nzTrigger]=\"null\"\r\n [nzTheme]=\"'dark'\"\r\n >\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper\">\r\n <side-menu\r\n [isCollapsed]=\"isCollapsed\"\r\n [filteredLstMenu]=\"filteredLstMenu\"\r\n [currentHeaderId]=\"currentHeaderId\"\r\n ></side-menu>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\r\n\r\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\r\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\r\n </span>\r\n </div>\r\n </div>\r\n </nz-sider>\r\n <nz-layout class=\"main-layout\">\r\n <nz-content class=\"content\">\r\n <div class=\"inner-content\">\r\n @if (!LayoutComponent.noShowBreadcrumb) {\r\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\r\n }\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\r\n </div>\r\n </div>\r\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\r\n </nz-content>\r\n </nz-layout>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n<nz-drawer\r\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\r\n [nzWidth]=\"350\"\r\n [nzClosable]=\"false\"\r\n [(nzVisible)]=\"visibleMenuDrawer\"\r\n [nzMaskClosable]=\"true\"\r\n nzPlacement=\"left\"\r\n nzTitle=\"\"\r\n (nzOnClose)=\"closeMenuDrawer()\"\r\n>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <side-menu\r\n [isCollapsed]=\"isCollapsed\"\r\n [filteredLstMenu]=\"filteredLstMenu\"\r\n [currentHeaderId]=\"currentHeaderId\"\r\n ></side-menu>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n <ng-template #afterTemplate>\r\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\r\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html,body,app-root{height:100%;margin:0}.app-layout{display:flex;flex-direction:column;height:100vh}.app-header{position:fixed;top:0;left:0;width:100%;height:var(--app-header-height);background:var(--theme-color);color:var(--theme-text-color);box-shadow:0 1px 4px #00152914;z-index:1000;display:flex;align-items:center;padding:0}.header-content{width:100%;flex-wrap:nowrap!important}.header-logo{height:var(--app-header-height);text-align:center;color:var(--theme-text-color);transition:width .3s;flex-shrink:0;overflow:hidden}.body-layout{display:flex;flex:1;margin-top:var(--app-header-height);height:calc(100vh - var(--app-header-height));overflow:hidden}.menu-sidebar{width:256px;background:#f0f2f5;overflow-y:auto;min-height:calc(100vh - var(--app-header-height))}.menu-wapper{min-height:calc(100% - var(--app-footer-height))}.main-layout{display:flex;flex-direction:column;flex:1;overflow:hidden}.content{flex:1;background:#fff;overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:#fff;min-height:calc(100% - var(--app-footer-height));padding:8px}.content-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:center}.sider-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:right}.trigger{margin-right:8px}.menu-sidebar .ant-menu-inline .ant-menu-item{margin-top:0;margin-bottom:0}::ng-deep .menu-wapper .anticon-file{display:none}:host ::ng-deep .ant-back-top{right:30px;bottom:40px}::ng-deep .same-theme-color .ant-drawer-content{background:var(--theme-menu-color)}.nz-tree-wapper{height:calc(100vh - var(--app-header-height) - var(--app-footer-height) - 32px);overflow-y:auto}.nz-tree-wapper.in-drawer{height:calc(100vh - 32px);overflow-y:auto}::ng-deep .menu-drawer .ant-drawer-body{padding:0}::ng-deep .ant-breadcrumb-link{cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-link{color:var(--theme-text-color);cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item:not(.ant-segmented-item-selected){color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item{border-left:1px solid}::ng-deep .header-menu .ant-segmented-item:last-child{border-right:1px solid}.suffix-wrap{position:relative;width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center}.suffix-icon{position:absolute;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .16s ease,transform .18s cubic-bezier(.4,0,.2,1);transform:scale(.6) translate(4px)}.suffix-icon.show{opacity:1;pointer-events:auto;transform:scale(1) translate(0)}.search{color:#00000073}.delete{color:#bfbfbf}.delete.show{animation:popIn .18s ease}::ng-deep .header-menu .ant-menu-horizontal{background-color:transparent!important;border-bottom:none!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu{color:var(--theme-text-color)!important;opacity:.85;font-weight:600}::ng-deep .header-menu .ant-menu-submenu-title .anticon{color:var(--theme-text-color)!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected{color:var(--theme-text-color)!important;opacity:1;background-color:#ffffff1a!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected:after{border-bottom-color:#40a9ff!important}@keyframes popIn{0%{transform:scale(.5)}70%{transform:scale(1.15)}to{transform:scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: NzLayoutModule }, { kind: "component", type: i2$5.NzLayoutComponent, selector: "nz-layout", exportAs: ["nzLayout"] }, { kind: "component", type: i2$5.NzHeaderComponent, selector: "nz-header", exportAs: ["nzHeader"] }, { kind: "component", type: i2$5.NzContentComponent, selector: "nz-content", exportAs: ["nzContent"] }, { kind: "component", type: i2$5.NzSiderComponent, selector: "nz-sider", inputs: ["nzWidth", "nzTheme", "nzCollapsedWidth", "nzBreakpoint", "nzZeroTrigger", "nzTrigger", "nzReverseArrow", "nzCollapsible", "nzCollapsed"], outputs: ["nzCollapsedChange"], exportAs: ["nzSider"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i1$2.NzIconDirective, selector: "nz-icon,[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i4$1.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$1.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$1.NzSubMenuComponent, selector: "[nz-submenu]", inputs: ["nzMenuClassName", "nzPaddingLeft", "nzTitle", "nzIcon", "nzTriggerSubMenuAction", "nzOpen", "nzDisabled", "nzPlacement"], outputs: ["nzOpenChange"], exportAs: ["nzSubmenu"] }, { kind: "ngmodule", type: NzGridModule }, { kind: "directive", type: i2$1.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i2$1.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "ngmodule", type: NzFlexModule }, { kind: "directive", type: i3$3.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3$2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], nz-icon, [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: Breadcrumb, selector: "app-breadcrumb" }, { kind: "ngmodule", type: NzTreeModule }, { kind: "component", type: i6$3.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckboxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "ngmodule", type: NzBackTopModule }, { kind: "ngmodule", type: NzDrawerModule }, { kind: "component", type: i4$2.NzDrawerComponent, selector: "nz-drawer", inputs: ["nzContent", "nzCloseIcon", "nzClosable", "nzMaskClosable", "nzMask", "nzCloseOnNavigation", "nzNoAnimation", "nzKeyboard", "nzTitle", "nzExtra", "nzFooter", "nzPlacement", "nzSize", "nzMaskStyle", "nzBodyStyle", "nzWrapClassName", "nzWidth", "nzHeight", "nzZIndex", "nzOffsetX", "nzOffsetY", "nzVisible"], outputs: ["nzOnViewInit", "nzOnClose", "nzVisibleChange"], exportAs: ["nzDrawer"] }, { kind: "directive", type: i4$2.NzDrawerContentDirective, selector: "[nzDrawerContent]", exportAs: ["nzDrawerContent"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NzInputModule }, { kind: "directive", type: i5$1.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5$1.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5$1.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: Box, selector: "box", inputs: ["display", "width", "height"] }, { kind: "ngmodule", type: NzSegmentedModule }, { kind: "component", type: LayoutUser, selector: "header-user" }, { kind: "component", type: IconDelete, selector: "icon-delete", inputs: ["size"], outputs: ["click"] }, { kind: "component", type: IconSearch, selector: "icon-search", inputs: ["size"], outputs: ["click"] }, { kind: "directive", type: HideIfErrorDirective, selector: "img[hideIfError]" }, { kind: "component", type: NotificationCenterComponent, selector: "app-notification-center" }, { kind: "component", type: HeaderSearchComponent, selector: "header-search", inputs: ["searchValue"], outputs: ["searchValueChange", "onSearch"] }, { kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "ngmodule", type: NzMenuModule }, { kind: "component", type: SideMenuComponent, selector: "side-menu", inputs: ["isCollapsed", "filteredLstMenu", "currentHeaderId"] }], animations: [fadeInOut] });
13734
14228
  }
13735
14229
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LayoutComponent, decorators: [{
13736
14230
  type: Component,
@@ -13762,7 +14256,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
13762
14256
  HeaderSearchComponent,
13763
14257
  NzToolTipModule,
13764
14258
  NzMenuModule,
13765
- ], animations: [fadeInOut], template: "<nz-layout class=\"app-layout\">\r\n <nz-header class=\"app-header\">\r\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\r\n @if (isCollapsed) {\r\n <div @fadeInOut>\r\n &nbsp;\r\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\r\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"header-logo\"\r\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\r\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\r\n >\r\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\r\n <img\r\n *ngIf=\"logoUrl$ | async as url\"\r\n [src]=\"url\"\r\n style=\"padding: 4px; height: var(--app-header-height)\"\r\n hideIfError\r\n />\r\n @if (SYSTEM_NAME) {\r\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\r\n } @else {\r\n -- o0o --\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- header menu -->\r\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\r\n <ul\r\n nz-menu\r\n nzTheme=\"light\"\r\n nzMode=\"horizontal\"\r\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\r\n >\r\n @for (item of visibleMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n\r\n @if (hiddenMenus.length > 0) {\r\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\r\n <ul>\r\n @for (item of hiddenMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\r\n <header-search></header-search>\r\n <app-notification-center></app-notification-center>\r\n <header-user></header-user>\r\n </div>\r\n </div>\r\n </nz-header>\r\n <nz-layout class=\"body-layout\">\r\n <nz-sider\r\n *ngIf=\"!LayoutComponent.noShowSideMenu\"\r\n class=\"menu-sidebar\"\r\n nzCollapsible\r\n [nzWidth]=\"siderWidth\"\r\n [nzCollapsedWidth]=\"0\"\r\n [(nzCollapsed)]=\"isCollapsed\"\r\n [nzTrigger]=\"null\"\r\n [nzTheme]=\"'dark'\"\r\n >\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper\">\r\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineIndent]=\"12\" [nzInlineCollapsed]=\"isCollapsed\">\r\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu?.length) {\r\n <ul\r\n nz-submenu\r\n [nzOpen]=\"menuLv4.Open\"\r\n [nzTitle]=\"menuLv4.Name\"\r\n [nzIcon]=\"menuLv4.Icon\"\r\n >\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon\r\n ><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"\r\n (currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\r\n \"\r\n >\r\n {{ menuLv4.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"\r\n (currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\r\n \"\r\n >\r\n {{ menuLv3.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\">\r\n {{ menuLv2.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\">\r\n {{ menuLv1.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\r\n\r\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\r\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\r\n </span>\r\n </div>\r\n </div>\r\n </nz-sider>\r\n <nz-layout class=\"main-layout\">\r\n <nz-content class=\"content\">\r\n <div class=\"inner-content\">\r\n @if (!LayoutComponent.noShowBreadcrumb) {\r\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\r\n }\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\r\n </div>\r\n </div>\r\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\r\n </nz-content>\r\n </nz-layout>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n<nz-drawer\r\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\r\n [nzWidth]=\"350\"\r\n [nzClosable]=\"false\"\r\n [(nzVisible)]=\"visibleMenuDrawer\"\r\n [nzMaskClosable]=\"true\"\r\n nzPlacement=\"left\"\r\n nzTitle=\"\"\r\n (nzOnClose)=\"closeMenuDrawer()\"\r\n>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <ul nz-menu nzTheme=\"light\" nzMode=\"inline\" [nzInlineIndent]=\"12\">\r\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\r\n @if (menuLv1.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\r\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\r\n @if (menuLv2.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\r\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\r\n @if (menuLv3.SubMenu?.length) {\r\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\r\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\r\n @if (menuLv4.SubMenu?.length) {\r\n <ul\r\n nz-submenu\r\n [nzOpen]=\"menuLv4.Open\"\r\n [nzTitle]=\"menuLv4.Name\"\r\n [nzIcon]=\"menuLv4.Icon\"\r\n >\r\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon\r\n ><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"\r\n (currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\r\n \"\r\n >\r\n {{ menuLv4.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a\r\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\"\r\n >\r\n {{ menuLv3.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\">\r\n {{ menuLv2.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n } @else {\r\n <li nz-menu-item nzMatchRouter>\r\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\r\n <a [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\">\r\n {{ menuLv1.Name }}\r\n </a>\r\n </li>\r\n }\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n <ng-template #afterTemplate>\r\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\r\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html,body,app-root{height:100%;margin:0}.app-layout{display:flex;flex-direction:column;height:100vh}.app-header{position:fixed;top:0;left:0;width:100%;height:var(--app-header-height);background:var(--theme-color);color:var(--theme-text-color);box-shadow:0 1px 4px #00152914;z-index:1000;display:flex;align-items:center;padding:0}.header-content{width:100%;flex-wrap:nowrap!important}.header-logo{height:var(--app-header-height);text-align:center;color:var(--theme-text-color);transition:width .3s;flex-shrink:0;overflow:hidden}.body-layout{display:flex;flex:1;margin-top:var(--app-header-height);height:calc(100vh - var(--app-header-height));overflow:hidden}.menu-sidebar{width:256px;background:#f0f2f5;overflow-y:auto;min-height:calc(100vh - var(--app-header-height))}.menu-wapper{min-height:calc(100% - var(--app-footer-height))}.main-layout{display:flex;flex-direction:column;flex:1;overflow:hidden}.content{flex:1;background:#fff;overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:#fff;min-height:calc(100% - var(--app-footer-height));padding:8px}.content-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:center}.sider-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:right}.trigger{margin-right:8px}.menu-sidebar .ant-menu-inline .ant-menu-item{margin-top:0;margin-bottom:0}::ng-deep .menu-wapper .anticon-file{display:none}:host ::ng-deep .ant-back-top{right:30px;bottom:40px}::ng-deep .same-theme-color .ant-drawer-content{background:var(--theme-menu-color)}.nz-tree-wapper{height:calc(100vh - var(--app-header-height) - var(--app-footer-height) - 32px);overflow-y:auto}.nz-tree-wapper.in-drawer{height:calc(100vh - 32px);overflow-y:auto}::ng-deep .menu-drawer .ant-drawer-body{padding:0}::ng-deep .ant-breadcrumb-link{cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-link{color:var(--theme-text-color);cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item:not(.ant-segmented-item-selected){color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item{border-left:1px solid}::ng-deep .header-menu .ant-segmented-item:last-child{border-right:1px solid}.suffix-wrap{position:relative;width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center}.suffix-icon{position:absolute;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .16s ease,transform .18s cubic-bezier(.4,0,.2,1);transform:scale(.6) translate(4px)}.suffix-icon.show{opacity:1;pointer-events:auto;transform:scale(1) translate(0)}.search{color:#00000073}.delete{color:#bfbfbf}.delete.show{animation:popIn .18s ease}::ng-deep .header-menu .ant-menu-horizontal{background-color:transparent!important;border-bottom:none!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu{color:var(--theme-text-color)!important;opacity:.85;font-weight:600}::ng-deep .header-menu .ant-menu-submenu-title .anticon{color:var(--theme-text-color)!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected{color:var(--theme-text-color)!important;opacity:1;background-color:#ffffff1a!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected:after{border-bottom-color:#40a9ff!important}@keyframes popIn{0%{transform:scale(.5)}70%{transform:scale(1.15)}to{transform:scale(1)}}\n"] }]
14259
+ SideMenuComponent,
14260
+ ], animations: [fadeInOut], template: "<nz-layout class=\"app-layout\">\r\n <nz-header class=\"app-header\">\r\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\r\n @if (isCollapsed) {\r\n <div @fadeInOut>\r\n &nbsp;\r\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\r\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\r\n </button>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"header-logo\"\r\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\r\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\r\n >\r\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\r\n <img\r\n *ngIf=\"logoUrl$ | async as url\"\r\n [src]=\"url\"\r\n style=\"padding: 4px; height: var(--app-header-height)\"\r\n hideIfError\r\n />\r\n @if (SYSTEM_NAME) {\r\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\r\n } @else {\r\n -- o0o --\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- header menu -->\r\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\r\n <ul\r\n nz-menu\r\n nzTheme=\"light\"\r\n nzMode=\"horizontal\"\r\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\r\n >\r\n @for (item of visibleMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n\r\n @if (hiddenMenus.length > 0) {\r\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\r\n <ul>\r\n @for (item of hiddenMenus; track item) {\r\n <li\r\n nz-menu-item\r\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\r\n (click)=\"handleValueChangeHeaderMenu(item)\"\r\n >\r\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\r\n <header-search></header-search>\r\n <app-notification-center></app-notification-center>\r\n <header-user></header-user>\r\n </div>\r\n </div>\r\n </nz-header>\r\n <nz-layout class=\"body-layout\">\r\n <nz-sider\r\n *ngIf=\"!LayoutComponent.noShowSideMenu\"\r\n class=\"menu-sidebar\"\r\n nzCollapsible\r\n [nzWidth]=\"siderWidth\"\r\n [nzCollapsedWidth]=\"0\"\r\n [(nzCollapsed)]=\"isCollapsed\"\r\n [nzTrigger]=\"null\"\r\n [nzTheme]=\"'dark'\"\r\n >\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper\">\r\n <side-menu\r\n [isCollapsed]=\"isCollapsed\"\r\n [filteredLstMenu]=\"filteredLstMenu\"\r\n [currentHeaderId]=\"currentHeaderId\"\r\n ></side-menu>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\r\n\r\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\r\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\r\n </span>\r\n </div>\r\n </div>\r\n </nz-sider>\r\n <nz-layout class=\"main-layout\">\r\n <nz-content class=\"content\">\r\n <div class=\"inner-content\">\r\n @if (!LayoutComponent.noShowBreadcrumb) {\r\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\r\n }\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\r\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\r\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\r\n </div>\r\n </div>\r\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\r\n </nz-content>\r\n </nz-layout>\r\n </nz-layout>\r\n</nz-layout>\r\n\r\n<nz-drawer\r\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\r\n [nzWidth]=\"350\"\r\n [nzClosable]=\"false\"\r\n [(nzVisible)]=\"visibleMenuDrawer\"\r\n [nzMaskClosable]=\"true\"\r\n nzPlacement=\"left\"\r\n nzTitle=\"\"\r\n (nzOnClose)=\"closeMenuDrawer()\"\r\n>\r\n <ng-container *nzDrawerContent>\r\n <div class=\"menu-wapper\">\r\n @if (MENU_TYPE == 1) {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <nz-tree\r\n [nzData]=\"nodes\"\r\n [nzSearchValue]=\"searchValue\"\r\n [nzHideUnMatched]=\"true\"\r\n [nzShowLine]=\"true\"\r\n [nzSelectedKeys]=\"selectedKeys\"\r\n [nzExpandedKeys]=\"expandedKeys\"\r\n (nzClick)=\"nzEvent($event)\"\r\n ></nz-tree>\r\n </div>\r\n } @else {\r\n <div class=\"nz-tree-wapper in-drawer\">\r\n <side-menu\r\n [isCollapsed]=\"isCollapsed\"\r\n [filteredLstMenu]=\"filteredLstMenu\"\r\n [currentHeaderId]=\"currentHeaderId\"\r\n ></side-menu>\r\n </div>\r\n }\r\n\r\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\r\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\r\n </nz-input-group>\r\n <ng-template #suffixTemplate>\r\n <span class=\"suffix-wrap\">\r\n <icon-delete\r\n class=\"suffix-icon delete\"\r\n [class.show]=\"searchValue\"\r\n [size]=\"14\"\r\n (click)=\"searchValue = ''\"\r\n ></icon-delete>\r\n\r\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\r\n </span>\r\n </ng-template>\r\n <ng-template #afterTemplate>\r\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\r\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\r\n </button>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</nz-drawer>\r\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html,body,app-root{height:100%;margin:0}.app-layout{display:flex;flex-direction:column;height:100vh}.app-header{position:fixed;top:0;left:0;width:100%;height:var(--app-header-height);background:var(--theme-color);color:var(--theme-text-color);box-shadow:0 1px 4px #00152914;z-index:1000;display:flex;align-items:center;padding:0}.header-content{width:100%;flex-wrap:nowrap!important}.header-logo{height:var(--app-header-height);text-align:center;color:var(--theme-text-color);transition:width .3s;flex-shrink:0;overflow:hidden}.body-layout{display:flex;flex:1;margin-top:var(--app-header-height);height:calc(100vh - var(--app-header-height));overflow:hidden}.menu-sidebar{width:256px;background:#f0f2f5;overflow-y:auto;min-height:calc(100vh - var(--app-header-height))}.menu-wapper{min-height:calc(100% - var(--app-footer-height))}.main-layout{display:flex;flex-direction:column;flex:1;overflow:hidden}.content{flex:1;background:#fff;overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:#fff;min-height:calc(100% - var(--app-footer-height));padding:8px}.content-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:center}.sider-footer{background:var(--theme-color);color:var(--theme-text-color);align-items:center;text-align:right}.trigger{margin-right:8px}.menu-sidebar .ant-menu-inline .ant-menu-item{margin-top:0;margin-bottom:0}::ng-deep .menu-wapper .anticon-file{display:none}:host ::ng-deep .ant-back-top{right:30px;bottom:40px}::ng-deep .same-theme-color .ant-drawer-content{background:var(--theme-menu-color)}.nz-tree-wapper{height:calc(100vh - var(--app-header-height) - var(--app-footer-height) - 32px);overflow-y:auto}.nz-tree-wapper.in-drawer{height:calc(100vh - 32px);overflow-y:auto}::ng-deep .menu-drawer .ant-drawer-body{padding:0}::ng-deep .ant-breadcrumb-link{cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-link{color:var(--theme-text-color);cursor:pointer}::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item:not(.ant-segmented-item-selected){color:var(--theme-text-color)}::ng-deep .header-menu .ant-segmented-item{border-left:1px solid}::ng-deep .header-menu .ant-segmented-item:last-child{border-right:1px solid}.suffix-wrap{position:relative;width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center}.suffix-icon{position:absolute;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity .16s ease,transform .18s cubic-bezier(.4,0,.2,1);transform:scale(.6) translate(4px)}.suffix-icon.show{opacity:1;pointer-events:auto;transform:scale(1) translate(0)}.search{color:#00000073}.delete{color:#bfbfbf}.delete.show{animation:popIn .18s ease}::ng-deep .header-menu .ant-menu-horizontal{background-color:transparent!important;border-bottom:none!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu{color:var(--theme-text-color)!important;opacity:.85;font-weight:600}::ng-deep .header-menu .ant-menu-submenu-title .anticon{color:var(--theme-text-color)!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected{color:var(--theme-text-color)!important;opacity:1;background-color:#ffffff1a!important}::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu:hover:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-item-selected:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-open:after,::ng-deep .header-menu .ant-menu-horizontal>.ant-menu-submenu-selected:after{border-bottom-color:#40a9ff!important}@keyframes popIn{0%{transform:scale(.5)}70%{transform:scale(1.15)}to{transform:scale(1)}}\n"] }]
13766
14261
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { menuContainer: [{
13767
14262
  type: ViewChild,
13768
14263
  args: ['menuContainer']
@@ -13890,5 +14385,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
13890
14385
  * Generated bundle index. Do not edit.
13891
14386
  */
13892
14387
 
13893
- export { ABAC_RULES_TOKEN, ActionRule, ActionRuleLine, AnimatedDigitComponent, AppGlobals, AppStorage, App_Dic_Domain, App_Dic_DomainFilter, App_File, App_Menu$1 as App_Menu, App_Org, App_Role, App_Role_Menu_Ref, App_Setting, App_SettingFilter, App_User, AuthGuard, AuthService, AutoFocusDirective, BarGraphComponent, BaseComponent, BaseGuardChangeComponent, BaseOverlayComponent, Box, Breadcrumb, CacheListComponent, CheckModel, CommonService, ConfigComponent, CustomNotiComponent, CustomNotiService, DashcardComponent, DateInputParserDirective, DateTimeHelper, DicDomainListComponent, DicDomainPipe, DicDomainSelectComponent$1 as DicDomainSelectComponent, DicDomainService, DocTemplate, DoughnutGraphComponent, DownloadHelper, DurationFormatPipe, DynamicBuildFormComponent, ENUM_ResponseType, ExpandableSearchComponent, ExtendCheckbox, ExtendDatePicker, ExtendDateRangePicker, ExtendInput, ExtendInputNumber, ExtendPaginationComponent, ExtendSelectComponent, ExtendTableComponent, ExtendTextArea, FileFilter, FileListComponent, FileService, GlobalSpinnerComponent, GridFilter, H3Icon, HTTPService, HasPermissionDirective, HasPermissionPipe, HideIfErrorDirective, HighlightPipe, IconAdd, IconCheck, IconClose, IconDelete, IconEdit, IconSave, IconSearch, IconView, LayoutComponent, LimitLettersPipe, LimitWordsPipe, LineGraphComponent, LoadingService, LogAppComponent, LogServerComponent, LogServerDetailComponent, LoginComponent, MenuDetailComponent, MenuFilter, MenuListComponent, MenuService, MonitorComponent, NoPermission, Nodata, NotiService, NullIfEmptyDirective, NumberOnlyDirective, OrderOption, OrgDetailComponent, OrgFilter, OrgListComponent, OrgService, PagingData, PagingModel, PdfViewerComponent, PermissionComponent, PermissionService$1 as PermissionService, ReadMoreProComponent, RoleDetailComponent, RoleFilter, RoleListComponent, RoleService, RouteMonitorService, SequenceDetailComponent, SequenceListComponent, SessionManagerService, SettingListComponent, SettingService$1 as SettingService, TableHeader, ThemeService, TokenStorage, TranslateKey, URLs$d as URLs, UnsavedChangesGuard, UpperCaseFirsLetterEachWordDirective, UppercaseDirective, UppercaseFirstLetterDirective, UserDetailComponent, UserFilter, UserListComponent, UserProfileComponent, UserProfileService, UserService, VersionComponent, VscService, WF_TemplateActionRef, WF_TransitionRule, WF_TransitionRuleLine, Workflow, WorkflowAction, WorkflowActionEditorOption, WorkflowActionRef, WorkflowEditorComponent, WorkflowEditorOption, WorkflowStage, WorkflowStageEditorOption, XLSXHelper, authInterceptor };
14388
+ export { ABAC_RULES_TOKEN, ActionRule, ActionRuleLine, AnimatedDigitComponent, AppGlobals, AppStorage, App_Dic_Domain, App_Dic_DomainFilter, App_File, App_Menu$1 as App_Menu, App_Org, App_Role, App_Role_Menu_Ref, App_Setting, App_SettingFilter, App_User, AuthGuard, AuthService, AutoFocusDirective, BarGraphComponent, BaseComponent, BaseGuardChangeComponent, BaseOverlayComponent, Box, Breadcrumb, CacheListComponent, CheckModel, CommonService, ConfigComponent, CustomNotiComponent, CustomNotiService, DashcardComponent, DateInputParserDirective, DateTimeHelper, DicDomainListComponent, DicDomainPipe, DicDomainSelectComponent$1 as DicDomainSelectComponent, DicDomainService, DocTemplate, DoughnutGraphComponent, DownloadHelper, DurationFormatPipe, DynamicBuildFormComponent, ENUM_ResponseType, ExpandableSearchComponent, ExtendCheckbox, ExtendCheckbox3Value, ExtendDatePicker, ExtendDateRangePicker, ExtendInput, ExtendInputNumber, ExtendPaginationComponent, ExtendSelectComponent, ExtendTableComponent, ExtendTextArea, FileFilter, FileListComponent, FileService, FormatBytesPipe, GlobalSpinnerComponent, GridFilter, H3Icon, HTTPService, HasPermissionDirective, HasPermissionPipe, HideIfErrorDirective, HighlightPipe, IconAdd, IconCheck, IconClose, IconDelete, IconEdit, IconSave, IconSearch, IconView, LayoutComponent, LimitLettersPipe, LimitWordsPipe, LineGraphComponent, LoadingService, LogAppComponent, LogServerComponent, LogServerDetailComponent, LoginComponent, MailTemplateService, MenuDetailComponent, MenuFilter, MenuListComponent, MenuService, MonitorComponent, NoPermission, Nodata, NotiService, NullIfEmptyDirective, NumberOnlyDirective, OrderOption, OrgDetailComponent, OrgFilter, OrgListComponent, OrgService, PagingData, PagingModel, PdfViewerComponent, PermissionComponent, PermissionService$1 as PermissionService, ReadMoreProComponent, RoleDetailComponent, RoleFilter, RoleListComponent, RoleService, RouteMonitorService, SequenceDetailComponent, SequenceListComponent, SessionManagerService, SettingListComponent, SettingService$1 as SettingService, SynologyComponent, TableHeader, ThemeService, TokenStorage, TranslateKey, URLs$e as URLs, UnsavedChangesGuard, UpperCaseFirsLetterEachWordDirective, UppercaseDirective, UppercaseFirstLetterDirective, UserDetailComponent, UserFilter, UserListComponent, UserProfileComponent, UserProfileService, UserService, VersionComponent, VscService, WF_TemplateActionRef, WF_TransitionRule, WF_TransitionRuleLine, Workflow, WorkflowAction, WorkflowActionEditorOption, WorkflowActionRef, WorkflowEditorComponent, WorkflowEditorOption, WorkflowStage, WorkflowStageEditorOption, XLSXHelper, authInterceptor };
13894
14389
  //# sourceMappingURL=brggroup-share-lib.mjs.map