@brggroup/share-lib 0.1.79 → 0.1.80

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 (37) hide show
  1. package/fesm2022/brggroup-share-lib.mjs +462 -112
  2. package/fesm2022/brggroup-share-lib.mjs.map +1 -1
  3. package/lib/WF/wf.routes.d.ts +3 -0
  4. package/lib/WF/wf.routes.d.ts.map +1 -0
  5. package/lib/admin/admin.routes.d.ts +3 -0
  6. package/lib/admin/admin.routes.d.ts.map +1 -0
  7. package/lib/admin/component/menu/list/menu-list.d.ts +4 -7
  8. package/lib/admin/component/menu/list/menu-list.d.ts.map +1 -1
  9. package/lib/admin/component/module/app-module-list.d.ts +24 -0
  10. package/lib/admin/component/module/app-module-list.d.ts.map +1 -0
  11. package/lib/admin/component/module/app-module.model.d.ts +19 -0
  12. package/lib/admin/component/module/app-module.model.d.ts.map +1 -0
  13. package/lib/admin/component/module/app-module.service.d.ts +19 -0
  14. package/lib/admin/component/module/app-module.service.d.ts.map +1 -0
  15. package/lib/admin/model/menu.model.d.ts +2 -0
  16. package/lib/admin/model/menu.model.d.ts.map +1 -1
  17. package/lib/auth/auth.service.d.ts +3 -3
  18. package/lib/auth/auth.service.d.ts.map +1 -1
  19. package/lib/auth/session-manager.service.d.ts +1 -1
  20. package/lib/auth/session-manager.service.d.ts.map +1 -1
  21. package/lib/components/base.component.d.ts.map +1 -1
  22. package/lib/components/layout/layout.component.d.ts +7 -1
  23. package/lib/components/layout/layout.component.d.ts.map +1 -1
  24. package/lib/components/layout/menu/side-menu/side-menu.d.ts +3 -2
  25. package/lib/components/layout/menu/side-menu/side-menu.d.ts.map +1 -1
  26. package/lib/components/login/login.component.d.ts +1 -0
  27. package/lib/components/login/login.component.d.ts.map +1 -1
  28. package/lib/components/login-1/login.component.d.ts +1 -0
  29. package/lib/components/login-1/login.component.d.ts.map +1 -1
  30. package/lib/components/login-2/login.component.d.ts +1 -0
  31. package/lib/components/login-2/login.component.d.ts.map +1 -1
  32. package/lib/components/module-select/module-select.d.ts +17 -0
  33. package/lib/components/module-select/module-select.d.ts.map +1 -0
  34. package/lib/services/router-monitor.service.d.ts.map +1 -1
  35. package/package.json +1 -1
  36. package/public-api.d.ts +4 -0
  37. package/public-api.d.ts.map +1 -1
@@ -94,6 +94,7 @@ import * as i4$3 from 'ng-zorro-antd/menu';
94
94
  import { NzMenuModule } from 'ng-zorro-antd/menu';
95
95
  import * as i11 from 'ng-zorro-antd/switch';
96
96
  import { NzSwitchModule } from 'ng-zorro-antd/switch';
97
+ import { NzTypographyModule } from 'ng-zorro-antd/typography';
97
98
  import * as i7$1 from 'ng-zorro-antd/tag';
98
99
  import { NzTagModule } from 'ng-zorro-antd/tag';
99
100
  import * as i1$6 from 'ng-zorro-antd/upload';
@@ -705,7 +706,7 @@ class TokenStorage {
705
706
  }
706
707
  }
707
708
 
708
- const URLs$j = {
709
+ const URLs$k = {
709
710
  login: '/api/Auth/Login',
710
711
  register: '/api/Auth/Register',
711
712
  pingAuth: '/api/Auth/PingAuth',
@@ -750,7 +751,7 @@ class AuthService extends HTTPService {
750
751
  /* ----------------------------------------
751
752
  LOGIN
752
753
  ---------------------------------------- */
753
- async _signIn(username, password, orgid, returnUrl) {
754
+ async _signIn(username, password, orgid, returnUrl, MODULE_IN_USE) {
754
755
  try {
755
756
  const body = {
756
757
  UserName: username,
@@ -764,9 +765,15 @@ class AuthService extends HTTPService {
764
765
  }
765
766
  this.notiService.success('Đăng nhập thành công');
766
767
  TokenStorage.saveToken(res);
767
- if (returnUrl) {
768
+ console.log('go to module select: ', MODULE_IN_USE);
769
+ if (returnUrl && returnUrl != '/') {
770
+ console.log('go to returnUrl: ', returnUrl);
768
771
  this.router.navigateByUrl(returnUrl);
769
772
  }
773
+ else if (MODULE_IN_USE) {
774
+ console.log('go to module select');
775
+ this.router.navigateByUrl('/module');
776
+ }
770
777
  return true;
771
778
  }
772
779
  catch (err) {
@@ -775,7 +782,7 @@ class AuthService extends HTTPService {
775
782
  }
776
783
  }
777
784
  async sendSignIn(body) {
778
- return firstValueFrom(this.http.post(AppGlobals.apiEndpoint + URLs$j.login, body, {
785
+ return firstValueFrom(this.http.post(AppGlobals.apiEndpoint + URLs$k.login, body, {
779
786
  headers: new HttpHeaders().set('Content-Type', 'application/json').set('No-Loading-Mark', '1'),
780
787
  }));
781
788
  }
@@ -798,7 +805,7 @@ class AuthService extends HTTPService {
798
805
  ---------------------------------------- */
799
806
  async pingAuth() {
800
807
  try {
801
- const res = await this.get(AppGlobals.apiEndpoint + URLs$j.pingAuth, true);
808
+ const res = await this.get(AppGlobals.apiEndpoint + URLs$k.pingAuth, true);
802
809
  return res?.IsSuccess;
803
810
  }
804
811
  catch {
@@ -807,7 +814,7 @@ class AuthService extends HTTPService {
807
814
  }
808
815
  async getUserPermission() {
809
816
  try {
810
- const res = await this.get(AppGlobals.apiEndpoint + URLs$j.getUserPermission, true);
817
+ const res = await this.get(AppGlobals.apiEndpoint + URLs$k.getUserPermission, true);
811
818
  return res.Data;
812
819
  }
813
820
  catch {
@@ -817,12 +824,13 @@ class AuthService extends HTTPService {
817
824
  /* ----------------------------------------
818
825
  MENU
819
826
  ---------------------------------------- */
820
- getUserMenu(headerMenuId) {
821
- let pr = new HttpParams().append('headerMenuId', headerMenuId);
827
+ getUserMenu(moduleId, headerMenuId) {
828
+ let pr = new HttpParams().append('moduleId', moduleId || '').append('headerMenuId', headerMenuId || '');
822
829
  return this.postParams(AppGlobals.apiEndpoint + '/api/Auth/getUserMenu', pr);
823
830
  }
824
- getUserHeaderMenu() {
825
- return this.post(AppGlobals.apiEndpoint + '/api/Auth/getUserHeaderMenu');
831
+ getUserHeaderMenu(moduleId) {
832
+ let pr = new HttpParams().append('moduleId', moduleId || '');
833
+ return this.getParams(AppGlobals.apiEndpoint + '/api/Auth/getUserHeaderMenu', pr);
826
834
  }
827
835
  async checkUserMenu(url) {
828
836
  try {
@@ -839,10 +847,10 @@ class AuthService extends HTTPService {
839
847
  PASSWORD
840
848
  ---------------------------------------- */
841
849
  changePassword(data) {
842
- return this.postData(AppGlobals.apiEndpoint + URLs$j.changePassword, data);
850
+ return this.postData(AppGlobals.apiEndpoint + URLs$k.changePassword, data);
843
851
  }
844
852
  setPass(data) {
845
- return this.postData(AppGlobals.apiEndpoint + URLs$j.setPass, data);
853
+ return this.postData(AppGlobals.apiEndpoint + URLs$k.setPass, data);
846
854
  }
847
855
  /* ----------------------------------------
848
856
  REGISTER
@@ -863,7 +871,7 @@ class AuthService extends HTTPService {
863
871
  }
864
872
  }
865
873
  async sendSignUp(d) {
866
- return this.postData(AppGlobals.apiEndpoint + URLs$j.register, d);
874
+ return this.postData(AppGlobals.apiEndpoint + URLs$k.register, d);
867
875
  }
868
876
  /* ----------------------------------------
869
877
  CHANGE ORG
@@ -885,7 +893,7 @@ class AuthService extends HTTPService {
885
893
  }
886
894
  async sendChangeOrg(App_Org_Id) {
887
895
  let params = new HttpParams().append('App_Org_Id', App_Org_Id);
888
- return this.postParams(AppGlobals.apiEndpoint + URLs$j.changeOrgLogin, params);
896
+ return this.postParams(AppGlobals.apiEndpoint + URLs$k.changeOrgLogin, params);
889
897
  }
890
898
  static pingInterVal;
891
899
  startPingAuth(intervalTime) {
@@ -1242,8 +1250,8 @@ class SessionManagerService {
1242
1250
  // clearTimeout(this.refreshTimer);
1243
1251
  // clearInterval(this.heartbeatTimer);
1244
1252
  // }
1245
- async login(username, password, orgid, returnUrl) {
1246
- var ret = await this.authService._signIn(username, password, orgid, returnUrl);
1253
+ async login(username, password, orgid, returnUrl, MODULE_IN_USE) {
1254
+ var ret = await this.authService._signIn(username, password, orgid, returnUrl, MODULE_IN_USE);
1247
1255
  if (ret) {
1248
1256
  console.log('SessionManagerService > broadcast LOGIN');
1249
1257
  this.broadcast(this.LOGIN_EVENT);
@@ -1587,6 +1595,7 @@ class BaseComponent {
1587
1595
  let currentRoute = this.router.routerState.root.snapshot;
1588
1596
  let currentProjectId = null;
1589
1597
  let currentHeaderMenuId = null;
1598
+ let currentModuleId = null;
1590
1599
  // 1. Lấy ID từ URL hiện tại đang đứng (State hiện tại)
1591
1600
  while (currentRoute) {
1592
1601
  if (currentRoute.params) {
@@ -1596,6 +1605,9 @@ class BaseComponent {
1596
1605
  if (currentRoute.params['headerMenuId'] && !currentHeaderMenuId) {
1597
1606
  currentHeaderMenuId = currentRoute.params['headerMenuId'];
1598
1607
  }
1608
+ if (currentRoute.params['moduleId'] && !currentModuleId) {
1609
+ currentModuleId = currentRoute.params['moduleId'];
1610
+ }
1599
1611
  }
1600
1612
  currentRoute = currentRoute.firstChild;
1601
1613
  }
@@ -1603,15 +1615,24 @@ class BaseComponent {
1603
1615
  currentProjectId = this.getUrlParam('projectId');
1604
1616
  if (!currentHeaderMenuId)
1605
1617
  currentHeaderMenuId = this.getUrlParam('headerMenuId');
1618
+ if (!currentModuleId)
1619
+ currentModuleId = this.getUrlParam('moduleId');
1606
1620
  // 2. Ưu tiên ID từ URL truyền vào (nếu người dùng click menu khác)
1621
+ let targetModuleId = currentModuleId;
1607
1622
  let targetHeaderMenuId = currentHeaderMenuId;
1608
1623
  let targetProjectId = currentProjectId;
1609
1624
  // Regex bóc tách ID, dừng lại trước dấu "/" hoặc "?" (query param)
1610
- const headerMenuRegex = /\/headermenuid\/([^\/\?]+)/i;
1625
+ const headerModuleRegex = /\/module\/([^\/\?]+)/i;
1626
+ const headerModuleMatch = url.match(headerModuleRegex);
1627
+ if (headerModuleMatch) {
1628
+ targetHeaderMenuId = headerModuleMatch[1]; // Ghi đè bằng ID của menu mới click
1629
+ url = url.replace(headerModuleMatch[0], ''); // Xóa phần /headermenu/... ra khỏi url
1630
+ }
1631
+ const headerMenuRegex = /\/headermenu\/([^\/\?]+)/i;
1611
1632
  const headerMatch = url.match(headerMenuRegex);
1612
1633
  if (headerMatch) {
1613
1634
  targetHeaderMenuId = headerMatch[1]; // Ghi đè bằng ID của menu mới click
1614
- url = url.replace(headerMatch[0], ''); // Xóa phần /headermenuid/... ra khỏi url
1635
+ url = url.replace(headerMatch[0], ''); // Xóa phần /headermenu/... ra khỏi url
1615
1636
  }
1616
1637
  const projectRegex = /\/projectid\/([^\/\?]+)/i;
1617
1638
  const projectMatch = url.match(projectRegex);
@@ -1627,7 +1648,10 @@ class BaseComponent {
1627
1648
  url = `/projectid/${targetProjectId}${url}`;
1628
1649
  }
1629
1650
  if (targetHeaderMenuId) {
1630
- url = `/headermenuid/${targetHeaderMenuId}${url}`;
1651
+ url = `/headermenu/${targetHeaderMenuId}${url}`;
1652
+ }
1653
+ if (targetModuleId) {
1654
+ url = `/module/${targetModuleId}${url}`;
1631
1655
  }
1632
1656
  if (url === '')
1633
1657
  url = '/';
@@ -3502,7 +3526,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
3502
3526
  }]
3503
3527
  }] });
3504
3528
 
3505
- const URLs$i = {
3529
+ const URLs$j = {
3506
3530
  getById: '/api/App_Dic_Domain/GetById',
3507
3531
  getAll: '/api/App_Dic_Domain/GetAll',
3508
3532
  getList: '/api/App_Dic_Domain/GetList',
@@ -3514,21 +3538,21 @@ const URLs$i = {
3514
3538
  class DicDomainService extends HTTPService {
3515
3539
  getById(id) {
3516
3540
  let pr = new HttpParams().append('id', id);
3517
- return this.postParams(AppGlobals.apiEndpoint + URLs$i.getById, pr);
3541
+ return this.postParams(AppGlobals.apiEndpoint + URLs$j.getById, pr);
3518
3542
  }
3519
3543
  getPaging(filter) {
3520
- return this.postData(AppGlobals.apiEndpoint + URLs$i.getPaging, filter);
3544
+ return this.postData(AppGlobals.apiEndpoint + URLs$j.getPaging, filter);
3521
3545
  }
3522
3546
  addOrEdit(obj) {
3523
- return this.postData(AppGlobals.apiEndpoint + URLs$i.addOrEdit, obj);
3547
+ return this.postData(AppGlobals.apiEndpoint + URLs$j.addOrEdit, obj);
3524
3548
  }
3525
3549
  delete(id) {
3526
3550
  const params = new HttpParams().append('id', id);
3527
- return this.postParams(AppGlobals.apiEndpoint + URLs$i.delete, params);
3551
+ return this.postParams(AppGlobals.apiEndpoint + URLs$j.delete, params);
3528
3552
  }
3529
3553
  async getByDomain(DomainCode) {
3530
3554
  var pr = new HttpParams().append('DomainCode', DomainCode);
3531
- const ret = await this.postParams(AppGlobals.apiEndpoint + URLs$i.getByDomain, pr);
3555
+ const ret = await this.postParams(AppGlobals.apiEndpoint + URLs$j.getByDomain, pr);
3532
3556
  return ret.Data;
3533
3557
  }
3534
3558
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: DicDomainService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
@@ -5436,7 +5460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
5436
5460
  }]
5437
5461
  }] });
5438
5462
 
5439
- const URLs$h = {
5463
+ const URLs$i = {
5440
5464
  getById: '/api/App_Setting/GetById',
5441
5465
  getAll: '/api/App_Setting/GetAll',
5442
5466
  getList: '/api/App_Setting/GetList',
@@ -5458,10 +5482,10 @@ let SettingService$1 = class SettingService extends HTTPService {
5458
5482
  });
5459
5483
  }
5460
5484
  getAll() {
5461
- return this.post(AppGlobals.apiEndpoint + URLs$h.getAll);
5485
+ return this.post(AppGlobals.apiEndpoint + URLs$i.getAll);
5462
5486
  }
5463
5487
  getList(filter) {
5464
- return this.postData(AppGlobals.apiEndpoint + URLs$h.getList, filter);
5488
+ return this.postData(AppGlobals.apiEndpoint + URLs$i.getList, filter);
5465
5489
  }
5466
5490
  getPaging(filter) {
5467
5491
  return this.cms.ESP({
@@ -5477,27 +5501,27 @@ let SettingService$1 = class SettingService extends HTTPService {
5477
5501
  }
5478
5502
  delete(id) {
5479
5503
  const params = new HttpParams().append('id', id);
5480
- return this.postParams(AppGlobals.apiEndpoint + URLs$h.delete, params);
5504
+ return this.postParams(AppGlobals.apiEndpoint + URLs$i.delete, params);
5481
5505
  }
5482
5506
  getByCodeAnonymous(code) {
5483
5507
  const params = new HttpParams().append('Code', code);
5484
- return this.getParams(AppGlobals.apiEndpoint + URLs$h.getByCodeAnonymous, params);
5508
+ return this.getParams(AppGlobals.apiEndpoint + URLs$i.getByCodeAnonymous, params);
5485
5509
  }
5486
5510
  // getGroupByCodeAnonymous(code: string) {
5487
5511
  // const params = new HttpParams().append('Code', code);
5488
5512
  // return this.getParams(AppGlobals.apiEndpoint + URLs.getByCodeAnonymous, params);
5489
5513
  // }
5490
5514
  getAllConfig() {
5491
- return this.post(AppGlobals.apiEndpoint + URLs$h.GetAllConfig);
5515
+ return this.post(AppGlobals.apiEndpoint + URLs$i.GetAllConfig);
5492
5516
  }
5493
5517
  applyConfig(config) {
5494
- return this.postData(AppGlobals.apiEndpoint + URLs$h.ApplyConfig, config);
5518
+ return this.postData(AppGlobals.apiEndpoint + URLs$i.ApplyConfig, config);
5495
5519
  }
5496
5520
  getDbInfo() {
5497
- return this.post(AppGlobals.apiEndpoint + URLs$h.GetDbInfo);
5521
+ return this.post(AppGlobals.apiEndpoint + URLs$i.GetDbInfo);
5498
5522
  }
5499
5523
  loadConfigTheme() {
5500
- return this.get(AppGlobals.apiEndpoint + URLs$h.ConfigTheme);
5524
+ return this.get(AppGlobals.apiEndpoint + URLs$i.ConfigTheme);
5501
5525
  }
5502
5526
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
5503
5527
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SettingService, providedIn: 'root' });
@@ -5726,11 +5750,11 @@ class SignalRService {
5726
5750
  let targetHeaderMenuId = currentHeaderMenuId;
5727
5751
  let targetProjectId = currentProjectId;
5728
5752
  // Regex bóc tách ID, dừng lại trước dấu "/" hoặc "?" (query param)
5729
- const headerMenuRegex = /\/headermenuid\/([^\/\?]+)/i;
5753
+ const headerMenuRegex = /\/headermenu\/([^\/\?]+)/i;
5730
5754
  const headerMatch = url.match(headerMenuRegex);
5731
5755
  if (headerMatch) {
5732
5756
  targetHeaderMenuId = headerMatch[1]; // Ghi đè bằng ID của menu mới click
5733
- url = url.replace(headerMatch[0], ''); // Xóa phần /headermenuid/... ra khỏi url
5757
+ url = url.replace(headerMatch[0], ''); // Xóa phần /headermenu/... ra khỏi url
5734
5758
  }
5735
5759
  const projectRegex = /\/projectid\/([^\/\?]+)/i;
5736
5760
  const projectMatch = url.match(projectRegex);
@@ -5746,7 +5770,7 @@ class SignalRService {
5746
5770
  url = `/projectid/${targetProjectId}${url}`;
5747
5771
  }
5748
5772
  if (targetHeaderMenuId) {
5749
- url = `/headermenuid/${targetHeaderMenuId}${url}`;
5773
+ url = `/headermenu/${targetHeaderMenuId}${url}`;
5750
5774
  }
5751
5775
  if (url === '')
5752
5776
  url = '/';
@@ -6131,7 +6155,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
6131
6155
  type: Output
6132
6156
  }] } });
6133
6157
 
6134
- const URLs$g = {
6158
+ const URLs$h = {
6135
6159
  getById: '/api/file/GetById',
6136
6160
  getAll: '/api/file/GetAll',
6137
6161
  getList: '/api/file/GetList',
@@ -6145,23 +6169,23 @@ class FileService extends HTTPService {
6145
6169
  cms = inject(CommonService);
6146
6170
  getById(id) {
6147
6171
  const params = new HttpParams().append('id', id);
6148
- return this.postParams(AppGlobals.apiEndpoint + URLs$g.getById, params);
6172
+ return this.postParams(AppGlobals.apiEndpoint + URLs$h.getById, params);
6149
6173
  }
6150
6174
  getAll() {
6151
- return this.post(AppGlobals.apiEndpoint + URLs$g.getAll);
6175
+ return this.post(AppGlobals.apiEndpoint + URLs$h.getAll);
6152
6176
  }
6153
6177
  getList(filter) {
6154
- return this.postData(AppGlobals.apiEndpoint + URLs$g.getList, filter);
6178
+ return this.postData(AppGlobals.apiEndpoint + URLs$h.getList, filter);
6155
6179
  }
6156
6180
  getPaging(filter) {
6157
- return this.postData(AppGlobals.apiEndpoint + URLs$g.getPaging, filter);
6181
+ return this.postData(AppGlobals.apiEndpoint + URLs$h.getPaging, filter);
6158
6182
  }
6159
6183
  addOrEdit(obj) {
6160
- return this.postData(AppGlobals.apiEndpoint + URLs$g.addOrEdit, obj);
6184
+ return this.postData(AppGlobals.apiEndpoint + URLs$h.addOrEdit, obj);
6161
6185
  }
6162
6186
  delete(id) {
6163
6187
  const params = new HttpParams().append('id', id);
6164
- return this.postParams(AppGlobals.apiEndpoint + URLs$g.delete, params);
6188
+ return this.postParams(AppGlobals.apiEndpoint + URLs$h.delete, params);
6165
6189
  }
6166
6190
  downloadFileById(id) {
6167
6191
  const params = new HttpParams().append('id', id);
@@ -6211,7 +6235,7 @@ class FileService extends HTTPService {
6211
6235
  });
6212
6236
  }
6213
6237
  addFileWithRef(obj) {
6214
- return this.postData(AppGlobals.apiEndpoint + URLs$g.addFileWithRef, obj);
6238
+ return this.postData(AppGlobals.apiEndpoint + URLs$h.addFileWithRef, obj);
6215
6239
  }
6216
6240
  getAnhWithRef(Ref_Table, Ref_Id) {
6217
6241
  return this.cms.ESP({
@@ -6220,7 +6244,7 @@ class FileService extends HTTPService {
6220
6244
  });
6221
6245
  }
6222
6246
  moveFileToDisk(obj) {
6223
- return this.postData(AppGlobals.apiEndpoint + URLs$g.moveFileToDisk, obj);
6247
+ return this.postData(AppGlobals.apiEndpoint + URLs$h.moveFileToDisk, obj);
6224
6248
  }
6225
6249
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FileService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
6226
6250
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: FileService, providedIn: 'root' });
@@ -6234,17 +6258,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
6234
6258
 
6235
6259
  class SideMenuComponent extends BaseComponent {
6236
6260
  filteredLstMenu = [];
6237
- currentHeaderId = '';
6261
+ moduleId = '';
6262
+ headerMenuId = '';
6238
6263
  onClickToMenu = new EventEmitter();
6239
6264
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SideMenuComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
6240
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SideMenuComponent, isStandalone: true, selector: "side-menu", inputs: { filteredLstMenu: "filteredLstMenu", currentHeaderId: "currentHeaderId" }, outputs: { onClickToMenu: "onClickToMenu" }, usesInheritance: true, ngImport: i0, template: "<ul class=\"side-menu-wrapper\" nz-menu nzMode=\"inline\" [nzInlineIndent]=\"12\">\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\n @if (menuLv1.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\n @if (menuLv2.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\n @if (menuLv3.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\n @if (menuLv4.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv4.Open\" [nzTitle]=\"menuLv4.Name\" [nzIcon]=\"menuLv4.Icon\">\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon>\n <box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv4.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv3.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv2.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv1.Name }}\n </a>\n </li>\n }\n }\n</ul>\n", styles: ["@charset \"UTF-8\";.side-menu-wrapper .ant-menu-item{margin:0;font-weight:500}.side-menu-wrapper .ant-menu-item a{color:var(--app-text)}\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$3.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$3.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$3.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: i4$4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
6265
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: SideMenuComponent, isStandalone: true, selector: "side-menu", inputs: { filteredLstMenu: "filteredLstMenu", moduleId: "moduleId", headerMenuId: "headerMenuId" }, outputs: { onClickToMenu: "onClickToMenu" }, usesInheritance: true, ngImport: i0, template: "<ul class=\"side-menu-wrapper\" nz-menu nzMode=\"inline\" [nzInlineIndent]=\"12\">\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\n @if (menuLv1.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\n @if (menuLv2.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\n @if (menuLv3.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\n @if (menuLv4.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv4.Open\" [nzTitle]=\"menuLv4.Name\" [nzIcon]=\"menuLv4.Icon\">\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon>\n <box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') +\n (headerMenuId ? '/headermenu/' + headerMenuId : '') +\n menuLv4.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv4.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') +\n (headerMenuId ? '/headermenu/' + headerMenuId : '') +\n menuLv3.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv3.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') +\n (headerMenuId ? '/headermenu/' + headerMenuId : '') +\n menuLv2.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv2.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') + (headerMenuId ? '/headermenu/' + headerMenuId : '') + menuLv1.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv1.Name }}\n </a>\n </li>\n }\n }\n</ul>\n", styles: ["@charset \"UTF-8\";.side-menu-wrapper .ant-menu-item{margin:0;font-weight:500}.side-menu-wrapper .ant-menu-item a{color:var(--app-text)}\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$3.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$3.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$3.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: i4$4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
6241
6266
  }
6242
6267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: SideMenuComponent, decorators: [{
6243
6268
  type: Component,
6244
- args: [{ selector: 'side-menu', imports: [CommonModule, NzMenuModule, NzIconModule, Box, RouterModule], template: "<ul class=\"side-menu-wrapper\" nz-menu nzMode=\"inline\" [nzInlineIndent]=\"12\">\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\n @if (menuLv1.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\n @if (menuLv2.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\n @if (menuLv3.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\n @if (menuLv4.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv4.Open\" [nzTitle]=\"menuLv4.Name\" [nzIcon]=\"menuLv4.Icon\">\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon>\n <box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv4.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv4.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv3.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv3.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv2.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv2.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"(currentHeaderId ? '/headermenuid/' + currentHeaderId : '') + menuLv1.Url\"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv1.Name }}\n </a>\n </li>\n }\n }\n</ul>\n", styles: ["@charset \"UTF-8\";.side-menu-wrapper .ant-menu-item{margin:0;font-weight:500}.side-menu-wrapper .ant-menu-item a{color:var(--app-text)}\n"] }]
6269
+ args: [{ selector: 'side-menu', imports: [CommonModule, NzMenuModule, NzIconModule, Box, RouterModule], template: "<ul class=\"side-menu-wrapper\" nz-menu nzMode=\"inline\" [nzInlineIndent]=\"12\">\n @for (menuLv1 of filteredLstMenu; track menuLv1.App_Menu_Id) {\n @if (menuLv1.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv1.Open\" [nzTitle]=\"menuLv1.Name\" [nzIcon]=\"menuLv1.Icon\">\n @for (menuLv2 of menuLv1.SubMenu; track menuLv2.App_Menu_Id) {\n @if (menuLv2.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv2.Open\" [nzTitle]=\"menuLv2.Name\" [nzIcon]=\"menuLv2.Icon\">\n @for (menuLv3 of menuLv2.SubMenu; track menuLv3.App_Menu_Id) {\n @if (menuLv3.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv3.Open\" [nzTitle]=\"menuLv3.Name\" [nzIcon]=\"menuLv3.Icon\">\n @for (menuLv4 of menuLv3.SubMenu; track menuLv4.App_Menu_Id) {\n @if (menuLv4.SubMenu?.length) {\n <ul nz-submenu [nzOpen]=\"menuLv4.Open\" [nzTitle]=\"menuLv4.Name\" [nzIcon]=\"menuLv4.Icon\">\n @for (menuLv5 of menuLv4.SubMenu; track menuLv5.App_Menu_Id) {}\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv4.Icon\" [nzType]=\"menuLv4.Icon\"></nz-icon>\n <box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') +\n (headerMenuId ? '/headermenu/' + headerMenuId : '') +\n menuLv4.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv4.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv3.Icon\" [nzType]=\"menuLv3.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') +\n (headerMenuId ? '/headermenu/' + headerMenuId : '') +\n menuLv3.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv3.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv2.Icon\" [nzType]=\"menuLv2.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') +\n (headerMenuId ? '/headermenu/' + headerMenuId : '') +\n menuLv2.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv2.Name }}\n </a>\n </li>\n }\n }\n </ul>\n } @else {\n <li nz-menu-item nzMatchRouter>\n <nz-icon *ngIf=\"menuLv1.Icon\" [nzType]=\"menuLv1.Icon\"></nz-icon><box [width]=\"2\"></box>\n <a\n [routerLink]=\"\n (moduleId ? '/module/' + moduleId : '') + (headerMenuId ? '/headermenu/' + headerMenuId : '') + menuLv1.Url\n \"\n (click)=\"onClickToMenu.emit()\"\n >\n {{ menuLv1.Name }}\n </a>\n </li>\n }\n }\n</ul>\n", styles: ["@charset \"UTF-8\";.side-menu-wrapper .ant-menu-item{margin:0;font-weight:500}.side-menu-wrapper .ant-menu-item a{color:var(--app-text)}\n"] }]
6245
6270
  }], propDecorators: { filteredLstMenu: [{
6246
6271
  type: Input
6247
- }], currentHeaderId: [{
6272
+ }], moduleId: [{
6273
+ type: Input
6274
+ }], headerMenuId: [{
6248
6275
  type: Input
6249
6276
  }], onClickToMenu: [{
6250
6277
  type: Output
@@ -6319,10 +6346,12 @@ class LayoutComponent extends BaseComponent {
6319
6346
  LayoutComponent = LayoutComponent;
6320
6347
  static noShowSideMenu = false;
6321
6348
  static noShowBreadcrumb = false;
6349
+ static noShowHeaderMenu = false;
6322
6350
  MENU_TYPE = 0;
6323
6351
  SYSTEM_NAME = '';
6324
6352
  SYSTEM_SUB_NAME_LEFT = '';
6325
6353
  SYSTEM_SUB_NAME_RIGHT = '';
6354
+ MODULE_IN_USE = false;
6326
6355
  isCollapsed = false; // đóng mở menu, true là đóng
6327
6356
  isXSmall = false;
6328
6357
  nodes = [];
@@ -6350,6 +6379,7 @@ class LayoutComponent extends BaseComponent {
6350
6379
  }
6351
6380
  lstHeaderMenu = [];
6352
6381
  currentHeaderId = '';
6382
+ currentModuleId = '';
6353
6383
  logoUrl$ = this.fileService
6354
6384
  .getFileVersion('LOGO')
6355
6385
  .pipe(map((res) => `${AppGlobals.apiEndpoint}/api/file/image?code=LOGO&v=${res || ''}`));
@@ -6361,20 +6391,44 @@ class LayoutComponent extends BaseComponent {
6361
6391
  else {
6362
6392
  document.body.classList.remove('dark-theme');
6363
6393
  }
6394
+ await this.settingService
6395
+ .getByCodeAnonymous('SYSTEM_MODULE_IN_USE')
6396
+ .then((res) => (this.MODULE_IN_USE = res?.Data == 1));
6364
6397
  this.handleHeaderMenu();
6398
+ if (this.MODULE_IN_USE) {
6399
+ // Lần chạy đầu tiên
6400
+ this.currentModuleId = this.getParamFromRoute('moduleId') || '';
6401
+ if (this.currentModuleId) {
6402
+ this.handleUserHeaderMenu(this.currentModuleId);
6403
+ }
6404
+ // Khi chuyển trang
6405
+ this._router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
6406
+ // Cố gắng lấy moduleId mới
6407
+ const newModuleId = this.getParamFromRoute('moduleId') || '';
6408
+ // Nếu ID thay đổi (hoặc từ có thành không có)
6409
+ if (newModuleId !== this.currentModuleId) {
6410
+ this.currentModuleId = newModuleId;
6411
+ if (this.currentModuleId) {
6412
+ // Đã vào trong 1 module cụ thể -> gọi API lấy menu
6413
+ this.handleUserHeaderMenu(this.currentModuleId);
6414
+ }
6415
+ else {
6416
+ // Đang ở màn hình ngoài (chọn module) -> reset menu, KHÔNG gọi API
6417
+ this.lstHeaderMenu = [];
6418
+ this.lstMenu = [];
6419
+ this.nodes = [];
6420
+ this.visibleMenus = [];
6421
+ this.hiddenMenus = [];
6422
+ this.cdr.detectChanges();
6423
+ }
6424
+ }
6425
+ });
6426
+ }
6427
+ else {
6428
+ this.handleUserHeaderMenu();
6429
+ }
6365
6430
  this.vscService.initVersionCheck();
6366
6431
  this.signalrService.initNoti();
6367
- this.authService.getUserHeaderMenu().then((res) => {
6368
- this.lstHeaderMenu = res.Data || [];
6369
- if (this.lstHeaderMenu.length == 0) {
6370
- this.getUserMenu();
6371
- }
6372
- else {
6373
- setTimeout(() => {
6374
- this.calculateMenuOverflow();
6375
- }, 0);
6376
- }
6377
- });
6378
6432
  await this.settingService.getByCodeAnonymous('MENU_TYPE').then((res) => {
6379
6433
  if (res?.Data) {
6380
6434
  this.MENU_TYPE = res.Data;
@@ -6426,13 +6480,31 @@ class LayoutComponent extends BaseComponent {
6426
6480
  this.resizeObserver.disconnect(); // Hủy observe khi component bị destroy
6427
6481
  }
6428
6482
  }
6483
+ handleUserHeaderMenu(moduleId = '') {
6484
+ this.authService.getUserHeaderMenu(moduleId).then((res) => {
6485
+ this.lstHeaderMenu = res.Data || [];
6486
+ if (this.lstHeaderMenu.length == 0) {
6487
+ this.getUserMenu();
6488
+ }
6489
+ else {
6490
+ setTimeout(() => {
6491
+ this.calculateMenuOverflow();
6492
+ }, 0);
6493
+ }
6494
+ });
6495
+ }
6429
6496
  handleHeaderMenu() {
6430
- const headerId = this.route.snapshot.firstChild?.params['headerMenuId'];
6431
- this._handleHeaderMenu(headerId);
6432
- // this._router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
6433
- // const updatedHeaderId = this.route.snapshot.firstChild?.params['headerMenuId'];
6434
- // this._handleHeaderMenu(updatedHeaderId);
6435
- // });
6497
+ const headerId = this.getParamFromRoute('headerMenuId');
6498
+ console.log('headerId: ', headerId);
6499
+ if (headerId) {
6500
+ this._handleHeaderMenu(headerId);
6501
+ }
6502
+ this._router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
6503
+ const updatedHeaderId = this.getParamFromRoute('headerMenuId');
6504
+ if (updatedHeaderId) {
6505
+ this._handleHeaderMenu(updatedHeaderId);
6506
+ }
6507
+ });
6436
6508
  }
6437
6509
  _handleHeaderMenu(menuId) {
6438
6510
  this.getUserMenu(menuId);
@@ -6442,7 +6514,8 @@ class LayoutComponent extends BaseComponent {
6442
6514
  return;
6443
6515
  }
6444
6516
  this.currentHeaderId = headerMenuId || '';
6445
- this.authService.getUserMenu(this.currentHeaderId).then((res) => {
6517
+ this.currentModuleId = this.getParamFromRoute('moduleId') || this.currentModuleId;
6518
+ this.authService.getUserMenu(this.currentModuleId, this.currentHeaderId).then((res) => {
6446
6519
  this.lstMenu = res.Data || [];
6447
6520
  this.nodes = this.buildNzTreeFromSubMenu(this.lstMenu);
6448
6521
  this.updateOpenMenus();
@@ -6460,6 +6533,16 @@ class LayoutComponent extends BaseComponent {
6460
6533
  const keyword = this._searchValue.toLowerCase();
6461
6534
  this.filteredLstMenu = this.filterMenuRecursive(this.lstMenu, keyword);
6462
6535
  }
6536
+ getParamFromRoute(paramName) {
6537
+ let currentRoute = this._router.routerState.root.snapshot;
6538
+ while (currentRoute) {
6539
+ if (currentRoute.params && currentRoute.params[paramName]) {
6540
+ return currentRoute.params[paramName];
6541
+ }
6542
+ currentRoute = currentRoute.firstChild;
6543
+ }
6544
+ return null;
6545
+ }
6463
6546
  filterMenuRecursive(menus, keyword) {
6464
6547
  const result = [];
6465
6548
  for (const menu of menus) {
@@ -6613,10 +6696,10 @@ class LayoutComponent extends BaseComponent {
6613
6696
  }
6614
6697
  this._handleHeaderMenu(menu.App_Menu_Id);
6615
6698
  if (menu.Url) {
6616
- this.goto(`/headermenuid/${menu.App_Menu_Id}${menu.Url}`);
6699
+ this.goto(`/headermenu/${menu.App_Menu_Id}${menu.Url}`);
6617
6700
  }
6618
6701
  else {
6619
- // this.goto('/headermenuid/' + menu.App_Menu_Id);
6702
+ // this.goto('/headermenu/' + menu.App_Menu_Id);
6620
6703
  }
6621
6704
  }
6622
6705
  openMenuDrawer() {
@@ -6689,8 +6772,16 @@ class LayoutComponent extends BaseComponent {
6689
6772
  this.hiddenMenus = tempHidden;
6690
6773
  this.cdr.detectChanges();
6691
6774
  }
6775
+ gotoSelectModule() {
6776
+ if (this.MODULE_IN_USE) {
6777
+ this._router.navigateByUrl('/module');
6778
+ }
6779
+ else {
6780
+ this._router.navigateByUrl('/');
6781
+ }
6782
+ }
6692
6783
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LayoutComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
6693
- 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\">\n <nz-header class=\"app-header\">\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\n @if (isCollapsed) {\n <div @fadeInOut>\n &nbsp;\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\n </button>\n </div>\n }\n\n <div\n class=\"header-logo\"\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\n >\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\n <img\n *ngIf=\"logoUrl$ | async as url\"\n [src]=\"url\"\n style=\"padding: 4px; height: var(--app-header-height)\"\n hideIfError\n />\n @if (SYSTEM_NAME) {\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\n } @else {\n -- o0o --\n }\n </div>\n </div>\n\n <!-- header menu -->\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\n <ul\n nz-menu\n nzTheme=\"light\"\n nzMode=\"horizontal\"\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\n >\n @for (item of visibleMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n\n @if (hiddenMenus.length > 0) {\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\n <ul>\n @for (item of hiddenMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n </ul>\n </li>\n }\n </ul>\n </div>\n\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\n <header-search></header-search>\n <app-notification-center></app-notification-center>\n <header-user></header-user>\n </div>\n </div>\n </nz-header>\n <nz-layout class=\"body-layout\">\n <nz-sider\n [class.hide-side-menu]=\"LayoutComponent.noShowSideMenu\"\n class=\"menu-sidebar\"\n nzCollapsible\n [nzWidth]=\"siderWidth\"\n [nzCollapsedWidth]=\"0\"\n [(nzCollapsed)]=\"isCollapsed\"\n [nzTrigger]=\"null\"\n [nzTheme]=\"'dark'\"\n >\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper\">\n <side-menu [filteredLstMenu]=\"filteredLstMenu\" [currentHeaderId]=\"currentHeaderId\"></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n </div>\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\n\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\n </span>\n </div>\n </div>\n </nz-sider>\n <nz-layout class=\"main-layout\">\n <nz-content class=\"content\">\n <div class=\"inner-content\">\n @if (!LayoutComponent.noShowBreadcrumb) {\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\n }\n <router-outlet></router-outlet>\n </div>\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\n </div>\n </div>\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\n </nz-content>\n </nz-layout>\n </nz-layout>\n</nz-layout>\n\n<nz-drawer\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\n [nzWidth]=\"350\"\n [nzClosable]=\"false\"\n [(nzVisible)]=\"visibleMenuDrawer\"\n [nzMaskClosable]=\"true\"\n nzPlacement=\"left\"\n nzTitle=\"\"\n (nzOnClose)=\"closeMenuDrawer()\"\n>\n <ng-container *nzDrawerContent>\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper in-drawer\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper in-drawer\">\n <side-menu\n [filteredLstMenu]=\"filteredLstMenu\"\n [currentHeaderId]=\"currentHeaderId\"\n (onClickToMenu)=\"visibleMenuDrawer = false\"\n ></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n <ng-template #afterTemplate>\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\n </button>\n </ng-template>\n </div>\n </ng-container>\n</nz-drawer>\n<app-global-spinner></app-global-spinner>\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--bg-sidebar: #f0f2f5;--bg-content: #fff;--bg-inner: #fff;--border-color: transparent;--text-main: rgba(0, 0, 0, .85)}:host-context(.dark-theme),:host(.dark-theme){--theme-color: #303030 !important;--theme-text-color: #e1e1e1 !important;--bg-sidebar: #262626;--bg-content: #1f1f1f;--bg-inner: #1f1f1f;--border-color: #424242;--text-main: #e1e1e1}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;border-bottom:1px solid var(--border-color);transition:background-color .3s ease}.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;overflow-x:hidden;transition:all .3s cubic-bezier(.25,.8,.25,1)!important;min-height:calc(100vh - var(--app-header-height))}.menu-sidebar.hide-side-menu{flex:0 0 0px!important;max-width:0px!important;min-width:0px!important;width:0px!important}.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:var(--bg-content);overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:var(--bg-inner);color:var(--text-main);min-height:calc(100% - var(--app-footer-height));padding:8px;box-sizing:border-box}.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)}}:host-context(.dark-theme) .content-footer,:host-context(.dark-theme) .sider-footer{background-color:var(--bg-sidebar);border-top:1px solid var(--border-color)}:host-context(.dark-theme) ::ng-deep .menu-sidebar .ant-tree,:host-context(.dark-theme) ::ng-deep .menu-drawer .ant-tree{background:transparent;color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .ant-tree-node-content-wrapper:hover{background-color:#ffffff14!important}:host-context(.dark-theme) ::ng-deep .ant-tree-node-selected{background-color:#ffffff1f!important;color:#fff!important}:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input,:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input-group-addon{background-color:var(--bg-content);border-color:var(--border-color);color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .menu-wapper .search,:host-context(.dark-theme) ::ng-deep .menu-wapper .delete{color:#8c8c8c}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link,:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:#8c8c8c!important}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link:hover{color:var(--text-main)!important}\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$3.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$3.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$3.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$5.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$2.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$1.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: i10$1.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: i3$4.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: i3$4.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: i6.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i6.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i6.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: ["filteredLstMenu", "currentHeaderId"], outputs: ["onClickToMenu"] }, { kind: "component", type: GlobalSpinnerComponent, selector: "app-global-spinner" }], animations: [fadeInOut] });
6784
+ 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\">\n <nz-header class=\"app-header\">\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\n @if (isCollapsed) {\n <div @fadeInOut>\n &nbsp;\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\n </button>\n </div>\n }\n\n <div\n class=\"header-logo\"\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\n >\n <div\n nz-flex\n nzJustify=\"center\"\n nzGap=\"small\"\n style=\"line-height: var(--app-header-height); cursor: pointer\"\n (click)=\"gotoSelectModule()\"\n >\n <img\n *ngIf=\"logoUrl$ | async as url\"\n [src]=\"url\"\n style=\"padding: 4px; height: var(--app-header-height)\"\n hideIfError\n />\n @if (SYSTEM_NAME) {\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\n } @else {\n -- o0o --\n }\n </div>\n </div>\n\n <!-- header menu -->\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\n <ul\n *ngIf=\"!LayoutComponent.noShowHeaderMenu\"\n nz-menu\n nzTheme=\"light\"\n nzMode=\"horizontal\"\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\n >\n @for (item of visibleMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n\n @if (hiddenMenus.length > 0) {\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\n <ul>\n @for (item of hiddenMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n </ul>\n </li>\n }\n </ul>\n </div>\n\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\n <header-search></header-search>\n <app-notification-center></app-notification-center>\n <header-user></header-user>\n </div>\n </div>\n </nz-header>\n <nz-layout class=\"body-layout\">\n <nz-sider\n [class.hide-side-menu]=\"LayoutComponent.noShowSideMenu\"\n class=\"menu-sidebar\"\n nzCollapsible\n [nzWidth]=\"siderWidth\"\n [nzCollapsedWidth]=\"0\"\n [(nzCollapsed)]=\"isCollapsed\"\n [nzTrigger]=\"null\"\n [nzTheme]=\"'dark'\"\n >\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper\">\n <side-menu\n [filteredLstMenu]=\"filteredLstMenu\"\n [moduleId]=\"currentModuleId\"\n [headerMenuId]=\"currentHeaderId\"\n ></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n </div>\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\n\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\n </span>\n </div>\n </div>\n </nz-sider>\n <nz-layout class=\"main-layout\">\n <nz-content class=\"content\">\n <div class=\"inner-content\">\n @if (!LayoutComponent.noShowBreadcrumb) {\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\n }\n <router-outlet></router-outlet>\n </div>\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\n </div>\n </div>\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\n </nz-content>\n </nz-layout>\n </nz-layout>\n</nz-layout>\n\n<nz-drawer\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\n [nzWidth]=\"350\"\n [nzClosable]=\"false\"\n [(nzVisible)]=\"visibleMenuDrawer\"\n [nzMaskClosable]=\"true\"\n nzPlacement=\"left\"\n nzTitle=\"\"\n (nzOnClose)=\"closeMenuDrawer()\"\n>\n <ng-container *nzDrawerContent>\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper in-drawer\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper in-drawer\">\n <side-menu\n [filteredLstMenu]=\"filteredLstMenu\"\n [moduleId]=\"currentModuleId\"\n [headerMenuId]=\"currentHeaderId\"\n (onClickToMenu)=\"visibleMenuDrawer = false\"\n ></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n <ng-template #afterTemplate>\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\n </button>\n </ng-template>\n </div>\n </ng-container>\n</nz-drawer>\n<app-global-spinner></app-global-spinner>\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--bg-sidebar: #f0f2f5;--bg-content: #fff;--bg-inner: #fff;--border-color: transparent;--text-main: rgba(0, 0, 0, .85)}:host-context(.dark-theme),:host(.dark-theme){--theme-color: #303030 !important;--theme-text-color: #e1e1e1 !important;--bg-sidebar: #262626;--bg-content: #1f1f1f;--bg-inner: #1f1f1f;--border-color: #424242;--text-main: #e1e1e1}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;border-bottom:1px solid var(--border-color);transition:background-color .3s ease}.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;overflow-x:hidden;transition:all .3s cubic-bezier(.25,.8,.25,1)!important;min-height:calc(100vh - var(--app-header-height))}.menu-sidebar.hide-side-menu{flex:0 0 0px!important;max-width:0px!important;min-width:0px!important;width:0px!important}.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:var(--bg-content);overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:var(--bg-inner);color:var(--text-main);min-height:calc(100% - var(--app-footer-height));padding:8px;box-sizing:border-box}.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)}}:host-context(.dark-theme) .content-footer,:host-context(.dark-theme) .sider-footer{background-color:var(--bg-sidebar);border-top:1px solid var(--border-color)}:host-context(.dark-theme) ::ng-deep .menu-sidebar .ant-tree,:host-context(.dark-theme) ::ng-deep .menu-drawer .ant-tree{background:transparent;color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .ant-tree-node-content-wrapper:hover{background-color:#ffffff14!important}:host-context(.dark-theme) ::ng-deep .ant-tree-node-selected{background-color:#ffffff1f!important;color:#fff!important}:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input,:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input-group-addon{background-color:var(--bg-content);border-color:var(--border-color);color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .menu-wapper .search,:host-context(.dark-theme) ::ng-deep .menu-wapper .delete{color:#8c8c8c}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link,:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:#8c8c8c!important}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link:hover{color:var(--text-main)!important}\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$3.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i4$3.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "component", type: i4$3.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$5.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$2.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$1.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: i10$1.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: i3$4.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: i3$4.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: i6.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i6.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i6.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: ["filteredLstMenu", "moduleId", "headerMenuId"], outputs: ["onClickToMenu"] }, { kind: "component", type: GlobalSpinnerComponent, selector: "app-global-spinner" }], animations: [fadeInOut] });
6694
6785
  }
6695
6786
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: LayoutComponent, decorators: [{
6696
6787
  type: Component,
@@ -6723,13 +6814,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
6723
6814
  NzMenuModule,
6724
6815
  SideMenuComponent,
6725
6816
  GlobalSpinnerComponent,
6726
- ], animations: [fadeInOut], template: "<nz-layout class=\"app-layout\">\n <nz-header class=\"app-header\">\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\n @if (isCollapsed) {\n <div @fadeInOut>\n &nbsp;\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\n </button>\n </div>\n }\n\n <div\n class=\"header-logo\"\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\n >\n <div nz-flex nzJustify=\"center\" nzGap=\"small\" style=\"line-height: var(--app-header-height)\">\n <img\n *ngIf=\"logoUrl$ | async as url\"\n [src]=\"url\"\n style=\"padding: 4px; height: var(--app-header-height)\"\n hideIfError\n />\n @if (SYSTEM_NAME) {\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\n } @else {\n -- o0o --\n }\n </div>\n </div>\n\n <!-- header menu -->\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\n <ul\n nz-menu\n nzTheme=\"light\"\n nzMode=\"horizontal\"\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\n >\n @for (item of visibleMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n\n @if (hiddenMenus.length > 0) {\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\n <ul>\n @for (item of hiddenMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n </ul>\n </li>\n }\n </ul>\n </div>\n\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\n <header-search></header-search>\n <app-notification-center></app-notification-center>\n <header-user></header-user>\n </div>\n </div>\n </nz-header>\n <nz-layout class=\"body-layout\">\n <nz-sider\n [class.hide-side-menu]=\"LayoutComponent.noShowSideMenu\"\n class=\"menu-sidebar\"\n nzCollapsible\n [nzWidth]=\"siderWidth\"\n [nzCollapsedWidth]=\"0\"\n [(nzCollapsed)]=\"isCollapsed\"\n [nzTrigger]=\"null\"\n [nzTheme]=\"'dark'\"\n >\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper\">\n <side-menu [filteredLstMenu]=\"filteredLstMenu\" [currentHeaderId]=\"currentHeaderId\"></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n </div>\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\n\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\n </span>\n </div>\n </div>\n </nz-sider>\n <nz-layout class=\"main-layout\">\n <nz-content class=\"content\">\n <div class=\"inner-content\">\n @if (!LayoutComponent.noShowBreadcrumb) {\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\n }\n <router-outlet></router-outlet>\n </div>\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\n </div>\n </div>\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\n </nz-content>\n </nz-layout>\n </nz-layout>\n</nz-layout>\n\n<nz-drawer\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\n [nzWidth]=\"350\"\n [nzClosable]=\"false\"\n [(nzVisible)]=\"visibleMenuDrawer\"\n [nzMaskClosable]=\"true\"\n nzPlacement=\"left\"\n nzTitle=\"\"\n (nzOnClose)=\"closeMenuDrawer()\"\n>\n <ng-container *nzDrawerContent>\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper in-drawer\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper in-drawer\">\n <side-menu\n [filteredLstMenu]=\"filteredLstMenu\"\n [currentHeaderId]=\"currentHeaderId\"\n (onClickToMenu)=\"visibleMenuDrawer = false\"\n ></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n <ng-template #afterTemplate>\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\n </button>\n </ng-template>\n </div>\n </ng-container>\n</nz-drawer>\n<app-global-spinner></app-global-spinner>\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--bg-sidebar: #f0f2f5;--bg-content: #fff;--bg-inner: #fff;--border-color: transparent;--text-main: rgba(0, 0, 0, .85)}:host-context(.dark-theme),:host(.dark-theme){--theme-color: #303030 !important;--theme-text-color: #e1e1e1 !important;--bg-sidebar: #262626;--bg-content: #1f1f1f;--bg-inner: #1f1f1f;--border-color: #424242;--text-main: #e1e1e1}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;border-bottom:1px solid var(--border-color);transition:background-color .3s ease}.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;overflow-x:hidden;transition:all .3s cubic-bezier(.25,.8,.25,1)!important;min-height:calc(100vh - var(--app-header-height))}.menu-sidebar.hide-side-menu{flex:0 0 0px!important;max-width:0px!important;min-width:0px!important;width:0px!important}.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:var(--bg-content);overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:var(--bg-inner);color:var(--text-main);min-height:calc(100% - var(--app-footer-height));padding:8px;box-sizing:border-box}.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)}}:host-context(.dark-theme) .content-footer,:host-context(.dark-theme) .sider-footer{background-color:var(--bg-sidebar);border-top:1px solid var(--border-color)}:host-context(.dark-theme) ::ng-deep .menu-sidebar .ant-tree,:host-context(.dark-theme) ::ng-deep .menu-drawer .ant-tree{background:transparent;color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .ant-tree-node-content-wrapper:hover{background-color:#ffffff14!important}:host-context(.dark-theme) ::ng-deep .ant-tree-node-selected{background-color:#ffffff1f!important;color:#fff!important}:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input,:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input-group-addon{background-color:var(--bg-content);border-color:var(--border-color);color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .menu-wapper .search,:host-context(.dark-theme) ::ng-deep .menu-wapper .delete{color:#8c8c8c}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link,:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:#8c8c8c!important}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link:hover{color:var(--text-main)!important}\n"] }]
6817
+ ], animations: [fadeInOut], template: "<nz-layout class=\"app-layout\">\n <nz-header class=\"app-header\">\n <div nz-row nzAlign=\"middle\" class=\"header-content\">\n @if (isCollapsed) {\n <div @fadeInOut>\n &nbsp;\n <button nz-button nzType=\"text\" style=\"color: var(--theme-text-color)\" (click)=\"visibleMenuDrawer = true\">\n <nz-icon nzType=\"menu\" nzTheme=\"outline\" />\n </button>\n </div>\n }\n\n <div\n class=\"header-logo\"\n [style.width]=\"!isCollapsed ? siderWidthStorage : 'auto'\"\n [style.padding-right]=\"!isCollapsed ? '0' : '16px'\"\n >\n <div\n nz-flex\n nzJustify=\"center\"\n nzGap=\"small\"\n style=\"line-height: var(--app-header-height); cursor: pointer\"\n (click)=\"gotoSelectModule()\"\n >\n <img\n *ngIf=\"logoUrl$ | async as url\"\n [src]=\"url\"\n style=\"padding: 4px; height: var(--app-header-height)\"\n hideIfError\n />\n @if (SYSTEM_NAME) {\n <h2 style=\"color: whitesmoke; margin-bottom: 0\">{{ SYSTEM_NAME }}</h2>\n } @else {\n -- o0o --\n }\n </div>\n </div>\n\n <!-- header menu -->\n <div nz-col nzFlex=\"auto\" class=\"header-menu\" style=\"min-width: 0\" #menuContainer>\n <ul\n *ngIf=\"!LayoutComponent.noShowHeaderMenu\"\n nz-menu\n nzTheme=\"light\"\n nzMode=\"horizontal\"\n style=\"display: flex; flex-wrap: nowrap; border-bottom: none; line-height: var(--app-header-height)\"\n >\n @for (item of visibleMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n\n @if (hiddenMenus.length > 0) {\n <li nz-submenu nzTitle=\". . .\" style=\"padding: 0 16px\">\n <ul>\n @for (item of hiddenMenus; track item) {\n <li\n nz-menu-item\n [nzSelected]=\"this.currentHeaderId === item.App_Menu_Id\"\n (click)=\"handleValueChangeHeaderMenu(item)\"\n >\n <nz-icon *ngIf=\"item.Icon\" [nzType]=\"item.Icon\"></nz-icon><box [width]=\"4\"></box>{{ item.Name }}\n </li>\n }\n </ul>\n </li>\n }\n </ul>\n </div>\n\n <div style=\"display: flex; align-items: center; flex-shrink: 0; gap: 8px; padding-right: 16px\">\n <header-search></header-search>\n <app-notification-center></app-notification-center>\n <header-user></header-user>\n </div>\n </div>\n </nz-header>\n <nz-layout class=\"body-layout\">\n <nz-sider\n [class.hide-side-menu]=\"LayoutComponent.noShowSideMenu\"\n class=\"menu-sidebar\"\n nzCollapsible\n [nzWidth]=\"siderWidth\"\n [nzCollapsedWidth]=\"0\"\n [(nzCollapsed)]=\"isCollapsed\"\n [nzTrigger]=\"null\"\n [nzTheme]=\"'dark'\"\n >\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper\">\n <side-menu\n [filteredLstMenu]=\"filteredLstMenu\"\n [moduleId]=\"currentModuleId\"\n [headerMenuId]=\"currentHeaderId\"\n ></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n </div>\n <div class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_LEFT || \"-- o0o --\" }}\n\n <span style=\"float: right\" (click)=\"triggerCollapse()\">\n <nz-icon class=\"trigger\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" nz-tooltip=\"\u1EA8n menu\" />\n </span>\n </div>\n </div>\n </nz-sider>\n <nz-layout class=\"main-layout\">\n <nz-content class=\"content\">\n <div class=\"inner-content\">\n @if (!LayoutComponent.noShowBreadcrumb) {\n <app-breadcrumb [@fadeInOut] nz-col nzFlex=\"auto\"></app-breadcrumb>\n }\n <router-outlet></router-outlet>\n </div>\n <div nz-row class=\"sider-footer\" style=\"height: var(--app-footer-height)\">\n <div nz-col nzFlex=\"auto\" class=\"content-footer text-italic\" style=\"font-size: 10px; color: lightgray\">\n {{ SYSTEM_SUB_NAME_RIGHT || \"-- o0o --\" }}\n </div>\n </div>\n <!-- <nz-back-top [nzTarget]=\"'.content'\" [nzVisibilityHeight]=\"500\"></nz-back-top> -->\n </nz-content>\n </nz-layout>\n </nz-layout>\n</nz-layout>\n\n<nz-drawer\n [nzWrapClassName]=\"'same-theme-color menu-drawer'\"\n [nzWidth]=\"350\"\n [nzClosable]=\"false\"\n [(nzVisible)]=\"visibleMenuDrawer\"\n [nzMaskClosable]=\"true\"\n nzPlacement=\"left\"\n nzTitle=\"\"\n (nzOnClose)=\"closeMenuDrawer()\"\n>\n <ng-container *nzDrawerContent>\n <div class=\"menu-wapper\">\n @if (MENU_TYPE == 1) {\n <div class=\"nz-tree-wapper in-drawer\">\n <nz-tree\n [nzData]=\"nodes\"\n [nzSearchValue]=\"searchValue\"\n [nzHideUnMatched]=\"true\"\n [nzShowLine]=\"true\"\n [nzSelectedKeys]=\"selectedKeys\"\n [nzExpandedKeys]=\"expandedKeys\"\n (nzClick)=\"nzEvent($event)\"\n ></nz-tree>\n </div>\n } @else {\n <div class=\"nz-tree-wapper in-drawer\">\n <side-menu\n [filteredLstMenu]=\"filteredLstMenu\"\n [moduleId]=\"currentModuleId\"\n [headerMenuId]=\"currentHeaderId\"\n (onClickToMenu)=\"visibleMenuDrawer = false\"\n ></side-menu>\n </div>\n }\n\n <nz-input-group [nzSuffix]=\"suffixTemplate\" [nzAddOnAfter]=\"afterTemplate\">\n <input nz-input placeholder=\"T\u00ECm menu\" [(ngModel)]=\"searchValue\" />\n </nz-input-group>\n <ng-template #suffixTemplate>\n <span class=\"suffix-wrap\">\n <icon-delete\n class=\"suffix-icon delete\"\n [class.show]=\"searchValue\"\n [size]=\"14\"\n (click)=\"searchValue = ''\"\n ></icon-delete>\n\n <icon-search class=\"suffix-icon search\" [class.show]=\"!searchValue\"></icon-search>\n </span>\n </ng-template>\n <ng-template #afterTemplate>\n <button nz-button (click)=\"triggerCollapse(); this.visibleMenuDrawer = false\">\n <nz-icon *ngIf=\"isCollapsed\" [nzType]=\"isCollapsed ? 'menu-unfold' : 'menu-fold'\" />\n </button>\n </ng-template>\n </div>\n </ng-container>\n</nz-drawer>\n<app-global-spinner></app-global-spinner>\n", styles: ["@charset \"UTF-8\";:host{display:flex;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--bg-sidebar: #f0f2f5;--bg-content: #fff;--bg-inner: #fff;--border-color: transparent;--text-main: rgba(0, 0, 0, .85)}:host-context(.dark-theme),:host(.dark-theme){--theme-color: #303030 !important;--theme-text-color: #e1e1e1 !important;--bg-sidebar: #262626;--bg-content: #1f1f1f;--bg-inner: #1f1f1f;--border-color: #424242;--text-main: #e1e1e1}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;border-bottom:1px solid var(--border-color);transition:background-color .3s ease}.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;overflow-x:hidden;transition:all .3s cubic-bezier(.25,.8,.25,1)!important;min-height:calc(100vh - var(--app-header-height))}.menu-sidebar.hide-side-menu{flex:0 0 0px!important;max-width:0px!important;min-width:0px!important;width:0px!important}.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:var(--bg-content);overflow-x:hidden;overflow-y:auto;height:100%}.inner-content{background:var(--bg-inner);color:var(--text-main);min-height:calc(100% - var(--app-footer-height));padding:8px;box-sizing:border-box}.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)}}:host-context(.dark-theme) .content-footer,:host-context(.dark-theme) .sider-footer{background-color:var(--bg-sidebar);border-top:1px solid var(--border-color)}:host-context(.dark-theme) ::ng-deep .menu-sidebar .ant-tree,:host-context(.dark-theme) ::ng-deep .menu-drawer .ant-tree{background:transparent;color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .ant-tree-node-content-wrapper:hover{background-color:#ffffff14!important}:host-context(.dark-theme) ::ng-deep .ant-tree-node-selected{background-color:#ffffff1f!important;color:#fff!important}:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input,:host-context(.dark-theme) ::ng-deep .menu-wapper .ant-input-group-addon{background-color:var(--bg-content);border-color:var(--border-color);color:var(--text-main)}:host-context(.dark-theme) ::ng-deep .menu-wapper .search,:host-context(.dark-theme) ::ng-deep .menu-wapper .delete{color:#8c8c8c}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link,:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-separator{color:#8c8c8c!important}:host-context(.dark-theme) ::ng-deep .breadcrumb-header .ant-breadcrumb-link:hover{color:var(--text-main)!important}\n"] }]
6727
6818
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { menuContainer: [{
6728
6819
  type: ViewChild,
6729
6820
  args: ['menuContainer']
6730
6821
  }] } });
6731
6822
 
6732
- const URLs$f = {
6823
+ const URLs$g = {
6733
6824
  getById: '/api/App_Org/GetById',
6734
6825
  getAll: '/api/App_Org/GetAll',
6735
6826
  getList: '/api/App_Org/GetList',
@@ -6741,23 +6832,23 @@ class OrgService extends HTTPService {
6741
6832
  cms = inject(CommonService);
6742
6833
  getById(id) {
6743
6834
  let pr = new HttpParams().append('id', id);
6744
- return this.postParams(AppGlobals.apiEndpoint + URLs$f.getById, pr);
6835
+ return this.postParams(AppGlobals.apiEndpoint + URLs$g.getById, pr);
6745
6836
  }
6746
6837
  getAll() {
6747
- return this.post(AppGlobals.apiEndpoint + URLs$f.getAll);
6838
+ return this.post(AppGlobals.apiEndpoint + URLs$g.getAll);
6748
6839
  }
6749
6840
  getList(filter) {
6750
- return this.postData(AppGlobals.apiEndpoint + URLs$f.getList, filter);
6841
+ return this.postData(AppGlobals.apiEndpoint + URLs$g.getList, filter);
6751
6842
  }
6752
6843
  getPaging(filter) {
6753
- return this.postData(AppGlobals.apiEndpoint + URLs$f.getPaging, filter);
6844
+ return this.postData(AppGlobals.apiEndpoint + URLs$g.getPaging, filter);
6754
6845
  }
6755
6846
  addOrEdit(obj) {
6756
- return this.postData(AppGlobals.apiEndpoint + URLs$f.addOrEdit, obj);
6847
+ return this.postData(AppGlobals.apiEndpoint + URLs$g.addOrEdit, obj);
6757
6848
  }
6758
6849
  delete(id) {
6759
6850
  const params = new HttpParams().append('id', id);
6760
- return this.postParams(AppGlobals.apiEndpoint + URLs$f.delete, params);
6851
+ return this.postParams(AppGlobals.apiEndpoint + URLs$g.delete, params);
6761
6852
  }
6762
6853
  getAllForLogin(UserName) {
6763
6854
  const params = new HttpParams().append('UserName', UserName);
@@ -6795,6 +6886,7 @@ class LoginComponent extends BaseComponent {
6795
6886
  lstOrg = [];
6796
6887
  isOneUserMultiOrgs = false;
6797
6888
  SYSTEM_NAME_LOGIN = '';
6889
+ MODULE_IN_USE = false;
6798
6890
  async ngOnInit() {
6799
6891
  this.route.queryParams.subscribe((params) => (this.returnUrl = params['returnUrl'] || '/'));
6800
6892
  if (TokenStorage.getToken() && (await this.authService.pingAuth())) {
@@ -6807,11 +6899,8 @@ class LoginComponent extends BaseComponent {
6807
6899
  orgid: [null],
6808
6900
  langSwitch: [AppStorage.getLang() === 'vn'],
6809
6901
  });
6810
- this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then((res) => {
6811
- if (res?.Data) {
6812
- this.SYSTEM_NAME_LOGIN = res.Data;
6813
- }
6814
- }, (err) => this.handleError(err));
6902
+ this.settingService.getByCodeAnonymous('SYSTEM_MODULE_IN_USE').then((res) => (this.MODULE_IN_USE = res?.Data == 1));
6903
+ this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then((res) => (this.SYSTEM_NAME_LOGIN = res?.Data));
6815
6904
  this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then((res) => {
6816
6905
  if (res?.Data) {
6817
6906
  if (res.Data == '1') {
@@ -6853,7 +6942,7 @@ class LoginComponent extends BaseComponent {
6853
6942
  }
6854
6943
  if (this.loginForm.valid) {
6855
6944
  this.isLoading = true;
6856
- await this.sessionManager.login(this.loginForm.value.username, this.loginForm.value.password, this.loginForm.value.orgid, this.returnUrl);
6945
+ await this.sessionManager.login(this.loginForm.value.username, this.loginForm.value.password, this.loginForm.value.orgid, this.returnUrl, this.MODULE_IN_USE);
6857
6946
  this.isLoading = false;
6858
6947
  }
6859
6948
  this.vscService.checkVersion();
@@ -6914,6 +7003,7 @@ class Login1Component extends BaseComponent {
6914
7003
  lstOrg = [];
6915
7004
  isOneUserMultiOrgs = false;
6916
7005
  SYSTEM_NAME_LOGIN = '';
7006
+ MODULE_IN_USE = false;
6917
7007
  async ngOnInit() {
6918
7008
  this.route.queryParams.subscribe((params) => (this.returnUrl = params['returnUrl'] || '/'));
6919
7009
  if (TokenStorage.getToken() && (await this.authService.pingAuth())) {
@@ -6926,11 +7016,8 @@ class Login1Component extends BaseComponent {
6926
7016
  orgid: [null],
6927
7017
  langSwitch: [AppStorage.getLang() === 'vn'],
6928
7018
  });
6929
- this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then((res) => {
6930
- if (res?.Data) {
6931
- this.SYSTEM_NAME_LOGIN = res.Data;
6932
- }
6933
- }, (err) => this.handleError(err));
7019
+ this.settingService.getByCodeAnonymous('SYSTEM_MODULE_IN_USE').then((res) => (this.MODULE_IN_USE = res?.Data == 1));
7020
+ this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then((res) => (this.SYSTEM_NAME_LOGIN = res?.Data));
6934
7021
  this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then((res) => {
6935
7022
  if (res?.Data) {
6936
7023
  if (res.Data == '1') {
@@ -6972,7 +7059,7 @@ class Login1Component extends BaseComponent {
6972
7059
  }
6973
7060
  if (this.loginForm.valid) {
6974
7061
  this.isLoading = true;
6975
- await this.sessionManager.login(this.loginForm.value.username, this.loginForm.value.password, this.loginForm.value.orgid, this.returnUrl);
7062
+ await this.sessionManager.login(this.loginForm.value.username, this.loginForm.value.password, this.loginForm.value.orgid, this.returnUrl, this.MODULE_IN_USE);
6976
7063
  this.isLoading = false;
6977
7064
  }
6978
7065
  this.vscService.checkVersion();
@@ -7033,6 +7120,7 @@ class Login2Component extends BaseComponent {
7033
7120
  lstOrg = [];
7034
7121
  isOneUserMultiOrgs = false;
7035
7122
  SYSTEM_NAME_LOGIN = '';
7123
+ MODULE_IN_USE = false;
7036
7124
  isDarkMode = false;
7037
7125
  sub;
7038
7126
  async ngOnInit() {
@@ -7047,11 +7135,8 @@ class Login2Component extends BaseComponent {
7047
7135
  orgid: [null],
7048
7136
  langSwitch: [AppStorage.getLang() === 'vn'],
7049
7137
  });
7050
- this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then((res) => {
7051
- if (res?.Data) {
7052
- this.SYSTEM_NAME_LOGIN = res.Data;
7053
- }
7054
- }, (err) => this.handleError(err));
7138
+ this.settingService.getByCodeAnonymous('SYSTEM_MODULE_IN_USE').then((res) => (this.MODULE_IN_USE = res?.Data == 1));
7139
+ this.settingService.getByCodeAnonymous('SYSTEM_NAME_LOGIN').then((res) => (this.SYSTEM_NAME_LOGIN = res?.Data));
7055
7140
  this.settingService.getByCodeAnonymous('ONE_USER_MULTI_ORGS').then((res) => {
7056
7141
  if (res?.Data) {
7057
7142
  if (res.Data == '1') {
@@ -7109,7 +7194,7 @@ class Login2Component extends BaseComponent {
7109
7194
  }
7110
7195
  if (this.loginForm.valid) {
7111
7196
  this.isLoading = true;
7112
- await this.sessionManager.login(this.loginForm.value.username, this.loginForm.value.password, this.loginForm.value.orgid, this.returnUrl);
7197
+ await this.sessionManager.login(this.loginForm.value.username, this.loginForm.value.password, this.loginForm.value.orgid, this.returnUrl, this.MODULE_IN_USE);
7113
7198
  this.isLoading = false;
7114
7199
  }
7115
7200
  this.vscService.checkVersion();
@@ -7157,6 +7242,108 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7157
7242
  ], selector: 'login', template: "<div class=\"login-wrapper\" [class.dark-theme]=\"isDarkMode\">\n <!-- \u0110\u1ED5i \u1EA3nh n\u1EC1n theo Theme -->\n <img *ngIf=\"!isDarkMode && (bgLightUrl$ | async) as url\" class=\"bg-image\" [src]=\"url\" hideIfError />\n <img *ngIf=\"isDarkMode && (bgDarkUrl$ | async) as url\" class=\"bg-image\" [src]=\"url\" hideIfError />\n\n <!-- N\u00FAt chuy\u1EC3n \u0111\u1ED5i Theme -->\n <button nz-button nzType=\"text\" class=\"theme-toggle\" (click)=\"toggleTheme()\">\n <nz-icon [nzType]=\"isDarkMode ? 'sun' : 'moon'\" nzTheme=\"outline\" />\n </button>\n\n <div class=\"form-container\">\n <form nz-flex nzVertical=\"true\" nz-form [formGroup]=\"loginForm\" class=\"login-form\" (ngSubmit)=\"dologin()\">\n <div>\n <div style=\"text-align: center; margin-bottom: 10px\">\n <img *ngIf=\"logoUrl$ | async as url\" class=\"logo-img\" [src]=\"url\" hideIfError />\n </div>\n <div class=\"form-field\" style=\"text-align: center; margin-bottom: 24px\">\n <h3 class=\"system-title\">{{ SYSTEM_NAME_LOGIN }}</h3>\n </div>\n </div>\n\n <div nz-row [nzJustify]=\"'center'\">\n <div nz-col nzSm=\"24\" nzMd=\"22\">\n <div nz-flex nzVertical=\"true\">\n <nz-form-item>\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\n <nz-input-group nzPrefixIcon=\"user\" nzSize=\"large\">\n <input type=\"text\" nz-input formControlName=\"username\" placeholder=\"{{ 'USERNAME' | translate }}\" />\n </nz-input-group>\n </nz-form-control>\n </nz-form-item>\n\n <nz-form-item>\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\n <nz-input-group\n nzPrefixIcon=\"lock\"\n nzSize=\"large\"\n [nzSuffix]=\"visible ? suffixTemplateHiddenPassword : suffixTemplateShowPassword\"\n >\n <input\n type=\"{{ passwordType }}\"\n nz-input\n formControlName=\"password\"\n placeholder=\"{{ 'PASSWORD' | translate }}\"\n />\n </nz-input-group>\n </nz-form-control>\n <ng-template #suffixTemplateShowPassword>\n <nz-icon\n nzType=\"eye\"\n nzTheme=\"outline\"\n nz-tooltip\n nzTooltipTitle=\"{{ 'SHOW' | translate }}\"\n (click)=\"visible = !visible; passwordType = 'text'\"\n />\n </ng-template>\n <ng-template #suffixTemplateHiddenPassword>\n <nz-icon\n nzType=\"eye-invisible\"\n nzTheme=\"outline\"\n nz-tooltip\n nzTooltipTitle=\"{{ 'HIDDEN' | translate }}\"\n (click)=\"visible = !visible; passwordType = 'password'\"\n />\n </ng-template>\n </nz-form-item>\n\n @if (isOneUserMultiOrgs) {\n <nz-form-item class=\"org-select\">\n <nz-form-control nzErrorTip=\"{{ 'REQUIRED' | translate }}\">\n <nz-input-group nzPrefixIcon=\"cluster\" nzSize=\"large\" nzHasFeedback=\"false\">\n <nz-select\n nzShowSearch\n nzAllowClear\n [nzDropdownMatchSelectWidth]=\"false\"\n [nzBorderless]=\"true\"\n nzPlaceHolder=\"{{ 'ORG' | translate }}\"\n formControlName=\"orgid\"\n class=\"no-error-border\"\n (nzFocus)=\"onFocusOrg()\"\n >\n @for (item of lstOrg; track $index) {\n <nz-option [nzLabel]=\"item.TreeNodeName!\" [nzValue]=\"item.App_Org_Id\"></nz-option>\n }\n </nz-select>\n </nz-input-group>\n </nz-form-control>\n </nz-form-item>\n }\n\n <div nz-flex nzVertical=\"true\" nzGap=\"4px\" style=\"margin-top: 8px\">\n <button nz-button [nzType]=\"'primary'\" nzSize=\"large\" [nzLoading]=\"isLoading\" nzBlock class=\"submit-btn\">\n {{ \"LOGIN\" | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;height:100vh;width:100vw;overflow:hidden}.login-wrapper{--page-bg-light: #f0f2f5;--page-bg-dark: #141414;--form-position: flex-end;--form-offset-x: 10vw;--glass-blur: 10px;--glass-bg-light: rgba(255, 255, 255, .25);--glass-border-light: rgba(255, 255, 255, .5);--glass-bg-dark: rgba(10, 10, 10, .45);--glass-border-dark: rgba(255, 255, 255, .15);display:flex;justify-content:var(--form-position);align-items:center;height:100vh;position:relative;padding:0 var(--form-offset-x);--page-bg: var(--page-bg-light);--form-bg: var(--glass-bg-light);--form-border: var(--glass-border-light);--text-color: #1a1a1a;--input-bg: rgba(255, 255, 255, .6);--input-text: #333333;--input-border: rgba(0, 0, 0, .15);--autofill-bg: #ffffff;--shadow-color: rgba(0, 0, 0, .15);--icon-color: #595959;background-color:var(--page-bg);transition:all .3s ease}.login-wrapper.dark-theme{--page-bg: var(--page-bg-dark);--form-bg: var(--glass-bg-dark);--form-border: var(--glass-border-dark);--text-color: rgba(255, 255, 255, .85);--input-bg: rgba(0, 0, 0, .3);--input-text: rgba(255, 255, 255, .85);--input-border: rgba(255, 255, 255, .2);--autofill-bg: #2a2a2a;--shadow-color: rgba(0, 0, 0, .5);--icon-color: #bfbfbf}.login-wrapper.dark-theme ::ng-deep .ant-input,.login-wrapper.dark-theme ::ng-deep .ant-input-affix-wrapper{background-color:var(--input-bg)!important;color:var(--input-text)!important;border-color:var(--input-border)!important}.login-wrapper.dark-theme ::ng-deep .ant-input::placeholder{color:#fff9}.login-wrapper.dark-theme ::ng-deep .ant-select-selector{background-color:transparent!important;color:var(--input-text)!important}.login-wrapper.dark-theme ::ng-deep .ant-select-selection-placeholder{color:#fff9!important}.login-wrapper.dark-theme ::ng-deep .ant-input-prefix i,.login-wrapper.dark-theme ::ng-deep .ant-input-suffix i{color:var(--icon-color)!important}.login-wrapper.dark-theme .logo-img{filter:brightness(0) invert(1) hue-rotate(180deg) saturate(3);opacity:.85}.form-container{position:relative;z-index:1;width:clamp(320px,90vw,420px);background-color:var(--form-bg);backdrop-filter:blur(var(--glass-blur));-webkit-backdrop-filter:blur(var(--glass-blur));box-shadow:0 12px 40px var(--shadow-color);padding:40px 30px;border-radius:20px;border:1px solid var(--form-border);transition:all .4s cubic-bezier(.25,.8,.25,1)}.theme-toggle{position:absolute;top:24px;right:24px;z-index:10;font-size:22px;color:var(--text-color);background:#fff3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;border:1px solid var(--form-border);cursor:pointer}.theme-toggle:hover{color:#1890ff;background:#ffffff4d;transform:scale(1.05)}.logo-img{max-width:220px;width:100%;object-fit:contain;filter:drop-shadow(0px 4px 6px rgba(0,0,0,.1))}.system-title{font-weight:700;font-size:22px;color:var(--text-color);margin:0;transition:color .3s ease;text-shadow:0px 2px 4px rgba(0,0,0,.1)}.bg-image{position:absolute;top:0;left:0;width:100vw;height:100vh;object-fit:cover;object-position:center;z-index:0;pointer-events:none;animation:fadeIn .8s ease-in-out}@keyframes fadeIn{0%{opacity:.5}to{opacity:1}}::ng-deep .login-form .ant-input-affix-wrapper{background-color:var(--input-bg)!important;border:1px solid var(--input-border)!important;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);border-radius:10px;padding:8px 12px;transition:all .3s ease}::ng-deep .login-form .ant-input-affix-wrapper:focus,::ng-deep .login-form .ant-input-affix-wrapper:focus-within{box-shadow:0 0 0 2px #1890ff33!important;border-color:#1890ff!important}::ng-deep .login-form .ant-input{background-color:transparent!important;border:none!important;box-shadow:none!important;color:var(--input-text)!important}::ng-deep .login-form .ant-input:-webkit-autofill,::ng-deep .login-form .ant-input:-webkit-autofill:hover,::ng-deep .login-form .ant-input:-webkit-autofill:focus,::ng-deep .login-form .ant-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px var(--autofill-bg) inset!important;-webkit-text-fill-color:var(--input-text)!important;font-family:inherit;transition:background-color 5000s ease-in-out 0s}::ng-deep .login-form .ant-btn{border-radius:10px}::ng-deep .login-form .org-select .ant-input-group{display:flex;align-items:center;padding-left:11px}::ng-deep .login-form .submit-btn{font-weight:600;letter-spacing:.5px;margin-top:10px;height:44px;border:none;box-shadow:0 4px 15px #1890ff66;transition:all .3s}::ng-deep .login-form .submit-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #1890ff99}\n"] }]
7158
7243
  }] });
7159
7244
 
7245
+ const URLs$f = {
7246
+ getById: '/api/App_Module/GetById',
7247
+ getList: '/api/App_Module/GetList',
7248
+ getPaging: '/api/App_Module/GetPaging',
7249
+ addOrEdit: '/api/App_Module/AddOrEdit',
7250
+ delete: '/api/App_Module/Delete',
7251
+ };
7252
+ class App_ModuleService extends HTTPService {
7253
+ getById(id) {
7254
+ let pr = new HttpParams().append('id', id);
7255
+ return this.getParams(AppGlobals.apiEndpoint + URLs$f.getById, pr);
7256
+ }
7257
+ getList(filter) {
7258
+ return this.postData(AppGlobals.apiEndpoint + URLs$f.getList, filter);
7259
+ }
7260
+ getPaging(filter) {
7261
+ return this.postData(AppGlobals.apiEndpoint + URLs$f.getPaging, filter);
7262
+ }
7263
+ addOrEdit(obj) {
7264
+ return this.postData(AppGlobals.apiEndpoint + URLs$f.addOrEdit, obj);
7265
+ }
7266
+ delete(id) {
7267
+ const params = new HttpParams().append('id', id);
7268
+ return this.postParams(AppGlobals.apiEndpoint + URLs$f.delete, params);
7269
+ }
7270
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: App_ModuleService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
7271
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: App_ModuleService, providedIn: 'root' });
7272
+ }
7273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: App_ModuleService, decorators: [{
7274
+ type: Injectable,
7275
+ args: [{ providedIn: 'root' }]
7276
+ }] });
7277
+
7278
+ class App_Module {
7279
+ // #region properties
7280
+ App_Module_Id;
7281
+ CreatedDate;
7282
+ CreatedUser;
7283
+ UpdatedDate;
7284
+ UpdatedUser;
7285
+ IsActive;
7286
+ Name;
7287
+ Icon;
7288
+ IconFileId;
7289
+ OrderValue;
7290
+ // #endregion properties
7291
+ constructor(obj) {
7292
+ obj = obj || {};
7293
+ this.App_Module_Id = obj.App_Module_Id || '';
7294
+ this.CreatedDate = obj.CreatedDate || null;
7295
+ this.CreatedUser = obj.CreatedUser || '';
7296
+ this.UpdatedDate = obj.UpdatedDate || null;
7297
+ this.UpdatedUser = obj.UpdatedUser || '';
7298
+ this.IsActive = obj.IsActive || false;
7299
+ this.Name = obj.Name || '';
7300
+ this.Icon = obj.Icon || '';
7301
+ this.IconFileId = obj.IconFileId || '';
7302
+ this.OrderValue = obj.OrderValue || null;
7303
+ }
7304
+ }
7305
+ class App_ModuleFilter extends GridFilter {
7306
+ IsActive;
7307
+ constructor() {
7308
+ super();
7309
+ this.OrderOption.FieldName = 'App_Module_Id';
7310
+ this.OrderOption.Direction = 'ascend';
7311
+ }
7312
+ }
7313
+
7314
+ class ModuleSelectComponent extends BaseComponent {
7315
+ service = inject(App_ModuleService);
7316
+ _router = inject(Router);
7317
+ lstModule = [];
7318
+ ngOnInit() {
7319
+ setTimeout(() => {
7320
+ LayoutComponent.noShowSideMenu = true;
7321
+ LayoutComponent.noShowBreadcrumb = true;
7322
+ LayoutComponent.noShowHeaderMenu = true;
7323
+ });
7324
+ const f = new App_ModuleFilter();
7325
+ f.IsActive = true;
7326
+ this.service.getList(f).then((res) => (this.lstModule = res.Data || []));
7327
+ }
7328
+ ngOnDestroy() {
7329
+ setTimeout(() => {
7330
+ LayoutComponent.noShowSideMenu = false;
7331
+ LayoutComponent.noShowBreadcrumb = false;
7332
+ LayoutComponent.noShowHeaderMenu = false;
7333
+ });
7334
+ }
7335
+ selectModule(module) {
7336
+ console.log(`navigateByUrl: /module/${module.App_Module_Id}`);
7337
+ this._router.navigateByUrl(`/module/${module.App_Module_Id}`);
7338
+ }
7339
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ModuleSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7340
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: ModuleSelectComponent, isStandalone: true, selector: "app-module-select", usesInheritance: true, ngImport: i0, template: "<div class=\"module-select-container\">\n <div class=\"module-select-wrapper\">\n <div nz-row [nzGutter]=\"[24, 24]\" nzJustify=\"center\">\n @for (module of lstModule; track module.App_Module_Id) {\n <div nz-col [nzXs]=\"24\" [nzSm]=\"12\" [nzMd]=\"8\" [nzLg]=\"6\">\n <nz-card nzHoverable class=\"module-card glass-panel\" (click)=\"selectModule(module)\">\n <div class=\"card-content\">\n <!-- Hi\u1EC3n th\u1ECB Icon, n\u1EBFu ch\u01B0a c\u00F3 d\u1EEF li\u1EC7u s\u1EBD fallback v\u1EC1 icon 'appstore' -->\n <nz-icon [nzType]=\"module.Icon || 'appstore'\" nzTheme=\"outline\" class=\"module-icon\"></nz-icon>\n <h3 class=\"module-name\">{{ module.Name }}</h3>\n </div>\n </nz-card>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;--mod-bg-container: linear-gradient(135deg, #e2e8f0 0%, #f1f5f9 100%);--mod-bg-card: #ffffff;--mod-border: #cbd5e1;--mod-primary: #3b82f6;--mod-text-name: #334155;--mod-text-icon: #64748b}.module-select-container{min-height:calc(100vh - 100px);display:flex;align-items:flex-start;padding-top:15vh;justify-content:center;padding-left:24px;padding-right:24px}.module-select-wrapper{width:100%;max-width:1200px}::ng-deep .ant-card.module-card{background:var(--mod-bg-card)!important;border:2px solid var(--mod-border)!important;border-radius:16px!important;box-shadow:0 8px 24px #959da526!important;transition:all .3s cubic-bezier(.25,.8,.25,1)!important;cursor:pointer;overflow:hidden}::ng-deep .ant-card.module-card .ant-card-body{padding:0!important}::ng-deep .ant-card.module-card:hover{transform:translateY(-8px)!important;border-color:var(--mod-primary)!important;box-shadow:0 16px 32px #3b82f640!important}::ng-deep .ant-card.module-card:hover .module-icon,::ng-deep .ant-card.module-card:hover .module-name{color:var(--mod-primary)!important}::ng-deep .ant-card.module-card:hover .module-icon{transform:scale(1.1)}.card-content{padding:24px!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;text-align:center!important;gap:20px!important;width:100%;height:100%}.module-icon{font-size:84px!important;line-height:1!important;color:var(--mod-text-icon);transition:all .3s ease;display:inline-flex}.module-name{margin:0;font-size:18px;font-weight:600;color:var(--mod-text-name);transition:color .3s ease;text-transform:capitalize;line-height:1.4}\n"], dependencies: [{ kind: "ngmodule", type: NzCardModule }, { kind: "component", type: i2$4.NzCardComponent, selector: "nz-card", inputs: ["nzBordered", "nzLoading", "nzHoverable", "nzBodyStyle", "nzCover", "nzActions", "nzType", "nzSize", "nzTitle", "nzExtra"], exportAs: ["nzCard"] }, { 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: NzTypographyModule }] });
7341
+ }
7342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: ModuleSelectComponent, decorators: [{
7343
+ type: Component,
7344
+ args: [{ selector: 'app-module-select', standalone: true, imports: [NzCardModule, NzGridModule, NzIconModule, NzTypographyModule], template: "<div class=\"module-select-container\">\n <div class=\"module-select-wrapper\">\n <div nz-row [nzGutter]=\"[24, 24]\" nzJustify=\"center\">\n @for (module of lstModule; track module.App_Module_Id) {\n <div nz-col [nzXs]=\"24\" [nzSm]=\"12\" [nzMd]=\"8\" [nzLg]=\"6\">\n <nz-card nzHoverable class=\"module-card glass-panel\" (click)=\"selectModule(module)\">\n <div class=\"card-content\">\n <!-- Hi\u1EC3n th\u1ECB Icon, n\u1EBFu ch\u01B0a c\u00F3 d\u1EEF li\u1EC7u s\u1EBD fallback v\u1EC1 icon 'appstore' -->\n <nz-icon [nzType]=\"module.Icon || 'appstore'\" nzTheme=\"outline\" class=\"module-icon\"></nz-icon>\n <h3 class=\"module-name\">{{ module.Name }}</h3>\n </div>\n </nz-card>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;--mod-bg-container: linear-gradient(135deg, #e2e8f0 0%, #f1f5f9 100%);--mod-bg-card: #ffffff;--mod-border: #cbd5e1;--mod-primary: #3b82f6;--mod-text-name: #334155;--mod-text-icon: #64748b}.module-select-container{min-height:calc(100vh - 100px);display:flex;align-items:flex-start;padding-top:15vh;justify-content:center;padding-left:24px;padding-right:24px}.module-select-wrapper{width:100%;max-width:1200px}::ng-deep .ant-card.module-card{background:var(--mod-bg-card)!important;border:2px solid var(--mod-border)!important;border-radius:16px!important;box-shadow:0 8px 24px #959da526!important;transition:all .3s cubic-bezier(.25,.8,.25,1)!important;cursor:pointer;overflow:hidden}::ng-deep .ant-card.module-card .ant-card-body{padding:0!important}::ng-deep .ant-card.module-card:hover{transform:translateY(-8px)!important;border-color:var(--mod-primary)!important;box-shadow:0 16px 32px #3b82f640!important}::ng-deep .ant-card.module-card:hover .module-icon,::ng-deep .ant-card.module-card:hover .module-name{color:var(--mod-primary)!important}::ng-deep .ant-card.module-card:hover .module-icon{transform:scale(1.1)}.card-content{padding:24px!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;text-align:center!important;gap:20px!important;width:100%;height:100%}.module-icon{font-size:84px!important;line-height:1!important;color:var(--mod-text-icon);transition:all .3s ease;display:inline-flex}.module-name{margin:0;font-size:18px;font-weight:600;color:var(--mod-text-name);transition:color .3s ease;text-transform:capitalize;line-height:1.4}\n"] }]
7345
+ }] });
7346
+
7160
7347
  class DicDomainListComponent extends BaseComponent {
7161
7348
  service = inject(DicDomainService);
7162
7349
  data;
@@ -7528,11 +7715,13 @@ class App_Menu {
7528
7715
  TreeNodeName;
7529
7716
  TreeNodeOrder;
7530
7717
  IsHeaderMenu;
7718
+ App_Module_Id;
7531
7719
  // #endregion properties
7532
7720
  Level;
7533
7721
  Open;
7534
7722
  SubMenu;
7535
7723
  ParentName;
7724
+ ModuleName;
7536
7725
  HasEditMenu; // for role menu ref
7537
7726
  AllSubHasEditMenu;
7538
7727
  SomeSubHasEditMenu;
@@ -7553,11 +7742,13 @@ class App_Menu {
7553
7742
  this.IsHidden = obj.IsHidden || false;
7554
7743
  this.TreeNodeOrder = obj.TreeNodeOrder || '';
7555
7744
  this.IsHeaderMenu = obj.IsHeaderMenu || false;
7745
+ this.App_Module_Id = obj.App_Module_Id || '';
7556
7746
  this.TreeNodeName = obj.TreeNodeName;
7557
7747
  this.Level = obj.Level;
7558
7748
  this.Open = obj.Open;
7559
7749
  this.SubMenu = obj.SubMenu;
7560
7750
  this.ParentName = obj.ParentName;
7751
+ this.ModuleName = obj.ModuleName;
7561
7752
  this.HasEditMenu = obj.HasEditMenu;
7562
7753
  this.AllSubHasEditMenu = obj.AllSubHasEditMenu;
7563
7754
  this.SomeSubHasEditMenu = obj.SomeSubHasEditMenu;
@@ -7656,22 +7847,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7656
7847
 
7657
7848
  class MenuListComponent extends BaseComponent {
7658
7849
  service = inject(MenuService);
7850
+ moduleService = inject(App_ModuleService);
7659
7851
  Breadcrumb = Breadcrumb;
7660
7852
  data;
7661
7853
  filter = new MenuFilter();
7662
7854
  selectedMenu;
7663
- listOfData = Array.from({ length: 100 }).map((_, i) => ({
7664
- name: `Edward King ${i}`,
7665
- age: 32,
7666
- address: `London`,
7667
- }));
7668
7855
  isDropdownVisible = false; // dùng cho ô search domain code để autofocus
7669
7856
  isDropdownParentNameVisible = false;
7670
7857
  treeMenu = [];
7858
+ lstModule = [];
7671
7859
  ngOnInit() {
7672
7860
  this.filter = this.AppGlobals.getFilter(MenuFilter.name) || new MenuFilter();
7673
7861
  this.getData();
7674
7862
  this.getTreeMenu();
7863
+ this.moduleService.getList({}).then((res) => (this.lstModule = res.Data || []));
7675
7864
  Breadcrumb.lstBreadcrumb = [
7676
7865
  {
7677
7866
  Name: 'Menu',
@@ -7747,7 +7936,7 @@ class MenuListComponent extends BaseComponent {
7747
7936
  }
7748
7937
  }
7749
7938
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7750
- 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]\">\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <div nz-flex nzGap=\"small\">\n <button-add (click)=\"edit(null)\"></button-add>\n <button-search (click)=\"search()\"></button-search>\n </div>\n </div>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table\n #table\n [nzData]=\"this.data?.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\n >\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n <thead>\n <tr>\n <th nzWidth=\"50px\">#</th>\n <th>T\u00EAn</th>\n <th>URL</th>\n <th nzWidth=\"90px\">Icon</th>\n <th nzWidth=\"90px\">Order</th>\n <th>Menu cha</th>\n <th nzWidth=\"110px\">Header menu</th>\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\n </tr>\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.Name\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th></th>\n <th></th>\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.ParentName\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th class=\"center\">\n <extend-checkbox-3-value\n [(_ngModel)]=\"filter.IsHeaderMenu\"\n (_ngModelChange)=\"search()\"\n ></extend-checkbox-3-value>\n </th>\n <th></th>\n <th class=\"center\" nzRight>\n <icon-add (click)=\"add()\"></icon-add>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of table.data; track $index; let i = $index) {\n @if (selectedMenu != row) {\n <tr (click)=\"selectedMenu = row\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>{{ row.TreeNodeName }}</td>\n <td>{{ row.Url }}</td>\n <td>{{ row.Icon }}</td>\n <td>{{ row.OrderValue }}</td>\n <td>{{ row.ParentName }}</td>\n <td class=\"center\">\n @if (row.IsHeaderMenu) {\n <icon-check></icon-check>\n }\n </td>\n <td class=\"center\">\n @if (row.IsActive) {\n <icon-check></icon-check>\n }\n </td>\n <td class=\"center\" nzRight>\n <icon-edit (click)=\"edit(row)\"></icon-edit>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n } @else {\n <tr (keyup.enter)=\"save()\" class=\"selected\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\n </td>\n <td>\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\n </td>\n <td>\n <nz-tree-select\n class=\"full-width\"\n [nzNodes]=\"treeMenu\"\n nzShowSearch\n nzPlaceHolder=\" \"\n [nzSize]=\"'small'\"\n [nzDropdownMatchSelectWidth]=\"false\"\n [(ngModel)]=\"selectedMenu.ParentId\"\n ></nz-tree-select>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\n </td>\n <td class=\"center\">\n <icon-save (click)=\"save()\"></icon-save>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n }\n }\n </tbody>\n </nz-table>\n </div>\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"data?.TotalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\n >\n </nz-pagination>\n\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n </div>\n </div>\n</div>\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$6.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", inputs: ["size"] }, { kind: "component", type: ButtonAdd, selector: "button-add", inputs: ["size"] }, { 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$5.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i4.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: i4.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i4.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i4.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i4.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i4.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: i4.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$2.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"] }] });
7939
+ 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]\">\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <div nz-flex nzGap=\"small\">\n <button-add (click)=\"edit(null)\"></button-add>\n <button-search (click)=\"search()\"></button-search>\n </div>\n </div>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table\n #table\n [nzData]=\"this.data?.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\n >\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n <thead>\n <tr>\n <th nzWidth=\"50px\">#</th>\n <th>T\u00EAn</th>\n <th>URL</th>\n <th nzWidth=\"90px\">Icon</th>\n <th nzWidth=\"90px\">Order</th>\n <th>Menu cha</th>\n <th nzWidth=\"110px\">Header menu</th>\n <th nzWidth=\"110px\">Module</th>\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\n </tr>\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.Name\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th></th>\n <th></th>\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.ParentName\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th class=\"center\">\n <extend-checkbox-3-value\n [(_ngModel)]=\"filter.IsHeaderMenu\"\n (_ngModelChange)=\"search()\"\n ></extend-checkbox-3-value>\n </th>\n <th></th>\n <th></th>\n <th class=\"center\" nzRight>\n <icon-add (click)=\"add()\"></icon-add>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of table.data; track $index; let i = $index) {\n @if (selectedMenu != row) {\n <tr (click)=\"selectedMenu = row\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>{{ row.TreeNodeName }}</td>\n <td>{{ row.Url }}</td>\n <td>{{ row.Icon }}</td>\n <td>{{ row.OrderValue }}</td>\n <td>{{ row.ParentName }}</td>\n <td class=\"center\">\n @if (row.IsHeaderMenu) {\n <icon-check></icon-check>\n }\n </td>\n <td>{{ row.ModuleName }}</td>\n <td class=\"center\">\n @if (row.IsActive) {\n <icon-check></icon-check>\n }\n </td>\n <td class=\"center\" nzRight>\n <icon-edit (click)=\"edit(row)\"></icon-edit>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n } @else {\n <tr (keyup.enter)=\"save()\" class=\"selected\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\n </td>\n <td>\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\n </td>\n <td>\n <nz-tree-select\n class=\"full-width\"\n [nzNodes]=\"treeMenu\"\n nzShowSearch\n nzPlaceHolder=\" \"\n [nzSize]=\"'small'\"\n [nzDropdownMatchSelectWidth]=\"false\"\n [(ngModel)]=\"selectedMenu.ParentId\"\n ></nz-tree-select>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\n </td>\n <td>\n <extend-select\n [lstItem]=\"lstModule\"\n [valueField]=\"'App_Module_Id'\"\n [displayField]=\"'Name'\"\n [(_ngModel)]=\"selectedMenu.App_Module_Id\"\n ></extend-select>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\n </td>\n <td class=\"center\">\n <icon-save (click)=\"save()\"></icon-save>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n }\n }\n </tbody>\n </nz-table>\n </div>\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"data?.TotalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\n >\n </nz-pagination>\n\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n </div>\n </div>\n</div>\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$6.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", inputs: ["size"] }, { kind: "component", type: ButtonAdd, selector: "button-add", inputs: ["size"] }, { 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$5.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i4.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: i4.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i4.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i4.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i4.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i4.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: i4.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$2.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"] }, { 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", "info", "valueField", "formData", "controlName", "_ngModel", "isSubmited"], outputs: ["_ngModelChange", "itemChange", "onFocus"] }] });
7751
7940
  }
7752
7941
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: MenuListComponent, decorators: [{
7753
7942
  type: Component,
@@ -7772,7 +7961,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
7772
7961
  ExtendCheckbox,
7773
7962
  Box,
7774
7963
  ExtendCheckbox3Value,
7775
- ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <div nz-flex nzGap=\"small\">\n <button-add (click)=\"edit(null)\"></button-add>\n <button-search (click)=\"search()\"></button-search>\n </div>\n </div>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table\n #table\n [nzData]=\"this.data?.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\n >\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n <thead>\n <tr>\n <th nzWidth=\"50px\">#</th>\n <th>T\u00EAn</th>\n <th>URL</th>\n <th nzWidth=\"90px\">Icon</th>\n <th nzWidth=\"90px\">Order</th>\n <th>Menu cha</th>\n <th nzWidth=\"110px\">Header menu</th>\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\n </tr>\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.Name\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th></th>\n <th></th>\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.ParentName\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th class=\"center\">\n <extend-checkbox-3-value\n [(_ngModel)]=\"filter.IsHeaderMenu\"\n (_ngModelChange)=\"search()\"\n ></extend-checkbox-3-value>\n </th>\n <th></th>\n <th class=\"center\" nzRight>\n <icon-add (click)=\"add()\"></icon-add>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of table.data; track $index; let i = $index) {\n @if (selectedMenu != row) {\n <tr (click)=\"selectedMenu = row\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>{{ row.TreeNodeName }}</td>\n <td>{{ row.Url }}</td>\n <td>{{ row.Icon }}</td>\n <td>{{ row.OrderValue }}</td>\n <td>{{ row.ParentName }}</td>\n <td class=\"center\">\n @if (row.IsHeaderMenu) {\n <icon-check></icon-check>\n }\n </td>\n <td class=\"center\">\n @if (row.IsActive) {\n <icon-check></icon-check>\n }\n </td>\n <td class=\"center\" nzRight>\n <icon-edit (click)=\"edit(row)\"></icon-edit>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n } @else {\n <tr (keyup.enter)=\"save()\" class=\"selected\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\n </td>\n <td>\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\n </td>\n <td>\n <nz-tree-select\n class=\"full-width\"\n [nzNodes]=\"treeMenu\"\n nzShowSearch\n nzPlaceHolder=\" \"\n [nzSize]=\"'small'\"\n [nzDropdownMatchSelectWidth]=\"false\"\n [(ngModel)]=\"selectedMenu.ParentId\"\n ></nz-tree-select>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\n </td>\n <td class=\"center\">\n <icon-save (click)=\"save()\"></icon-save>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n }\n }\n </tbody>\n </nz-table>\n </div>\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"data?.TotalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\n >\n </nz-pagination>\n\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n </div>\n </div>\n</div>\n" }]
7964
+ ExtendSelectComponent,
7965
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <div nz-flex nzGap=\"small\">\n <button-add (click)=\"edit(null)\"></button-add>\n <button-search (click)=\"search()\"></button-search>\n </div>\n </div>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table\n #table\n [nzData]=\"this.data?.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\n >\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n <thead>\n <tr>\n <th nzWidth=\"50px\">#</th>\n <th>T\u00EAn</th>\n <th>URL</th>\n <th nzWidth=\"90px\">Icon</th>\n <th nzWidth=\"90px\">Order</th>\n <th>Menu cha</th>\n <th nzWidth=\"110px\">Header menu</th>\n <th nzWidth=\"110px\">Module</th>\n <th nzWidth=\"80px\">Hi\u1EC7u l\u1EF1c</th>\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\n </tr>\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.Name\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th></th>\n <th></th>\n <th></th>\n <th>\n <extend-input\n [size]=\"'small'\"\n [showClear]=\"true\"\n [(_ngModel)]=\"filter.ParentName\"\n (onclickClearIcon)=\"search()\"\n ></extend-input>\n </th>\n <th class=\"center\">\n <extend-checkbox-3-value\n [(_ngModel)]=\"filter.IsHeaderMenu\"\n (_ngModelChange)=\"search()\"\n ></extend-checkbox-3-value>\n </th>\n <th></th>\n <th></th>\n <th class=\"center\" nzRight>\n <icon-add (click)=\"add()\"></icon-add>\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of table.data; track $index; let i = $index) {\n @if (selectedMenu != row) {\n <tr (click)=\"selectedMenu = row\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>{{ row.TreeNodeName }}</td>\n <td>{{ row.Url }}</td>\n <td>{{ row.Icon }}</td>\n <td>{{ row.OrderValue }}</td>\n <td>{{ row.ParentName }}</td>\n <td class=\"center\">\n @if (row.IsHeaderMenu) {\n <icon-check></icon-check>\n }\n </td>\n <td>{{ row.ModuleName }}</td>\n <td class=\"center\">\n @if (row.IsActive) {\n <icon-check></icon-check>\n }\n </td>\n <td class=\"center\" nzRight>\n <icon-edit (click)=\"edit(row)\"></icon-edit>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n } @else {\n <tr (keyup.enter)=\"save()\" class=\"selected\">\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Name\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Url\"></extend-input>\n </td>\n <td>\n <extend-input [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.Icon\"></extend-input>\n </td>\n <td>\n <extend-input-number [size]=\"'small'\" [(_ngModel)]=\"selectedMenu.OrderValue\"></extend-input-number>\n </td>\n <td>\n <nz-tree-select\n class=\"full-width\"\n [nzNodes]=\"treeMenu\"\n nzShowSearch\n nzPlaceHolder=\" \"\n [nzSize]=\"'small'\"\n [nzDropdownMatchSelectWidth]=\"false\"\n [(ngModel)]=\"selectedMenu.ParentId\"\n ></nz-tree-select>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsHeaderMenu\"></extend-checkbox>\n </td>\n <td>\n <extend-select\n [lstItem]=\"lstModule\"\n [valueField]=\"'App_Module_Id'\"\n [displayField]=\"'Name'\"\n [(_ngModel)]=\"selectedMenu.App_Module_Id\"\n ></extend-select>\n </td>\n <td class=\"center\">\n <extend-checkbox [(_ngModel)]=\"selectedMenu.IsActive\"></extend-checkbox>\n </td>\n <td class=\"center\">\n <icon-save (click)=\"save()\"></icon-save>\n <box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n }\n }\n </tbody>\n </nz-table>\n </div>\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzJustify=\"end\">\n <nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"data?.TotalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\n >\n </nz-pagination>\n\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n </div>\n </div>\n</div>\n" }]
7776
7966
  }] });
7777
7967
 
7778
7968
  const URLs$d = {
@@ -12891,6 +13081,140 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
12891
13081
  args: ['myTree']
12892
13082
  }] } });
12893
13083
 
13084
+ class App_ModuleListComponent extends BaseComponent {
13085
+ service = inject(App_ModuleService);
13086
+ data = new PagingData();
13087
+ filter = new App_ModuleFilter();
13088
+ drawerVisible = false;
13089
+ editItem = new App_Module();
13090
+ ngOnInit() {
13091
+ this.filter = this.AppGlobals.getFilter(App_ModuleFilter.name) || new App_ModuleFilter();
13092
+ this.getData();
13093
+ Breadcrumb.lstBreadcrumb = [
13094
+ {
13095
+ Name: 'App_Module',
13096
+ Click: () => this.getData(),
13097
+ },
13098
+ {
13099
+ Name: 'Danh sách',
13100
+ Click: () => this.getData(),
13101
+ },
13102
+ ];
13103
+ }
13104
+ ngOnDestroy() {
13105
+ this.AppGlobals.setFilter(App_ModuleFilter.name, this.filter);
13106
+ Breadcrumb.lstBreadcrumb = [];
13107
+ }
13108
+ search() {
13109
+ this.filter.PageIndex = 0;
13110
+ this.getData();
13111
+ }
13112
+ getData() {
13113
+ this.service.getPaging(this.filter).then((res) => {
13114
+ this.data = new PagingData(res.Data);
13115
+ }, (err) => this.handleError(err));
13116
+ }
13117
+ edit(item) {
13118
+ if (item?.App_Module_Id) {
13119
+ this.service.getById(item?.App_Module_Id).then((res) => {
13120
+ this.editItem = new App_Module(res.Data);
13121
+ this.drawerVisible = true;
13122
+ }, (err) => this.handleError(err));
13123
+ }
13124
+ else {
13125
+ this.editItem = new App_Module();
13126
+ this.drawerVisible = true;
13127
+ }
13128
+ }
13129
+ async delete(item) {
13130
+ if (await this.confirmDelete()) {
13131
+ if (item.App_Module_Id) {
13132
+ try {
13133
+ await this.service.delete(item.App_Module_Id);
13134
+ this.notiService.success(this.translate.instant(this.TranslateKey.DELETE_SUCCESS));
13135
+ this.getData();
13136
+ }
13137
+ catch (err) {
13138
+ this.handleError(err);
13139
+ }
13140
+ }
13141
+ }
13142
+ }
13143
+ onQueryParamsChange(pageIndex, pageSize) {
13144
+ this.filter.PageIndex = pageIndex;
13145
+ this.filter.PageSize = pageSize;
13146
+ this.getData();
13147
+ }
13148
+ save() {
13149
+ this.service.addOrEdit(this.editItem).then((res) => {
13150
+ this.success();
13151
+ this.getData();
13152
+ this.drawerVisible = false;
13153
+ }, (err) => this.handleError(err));
13154
+ }
13155
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: App_ModuleListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
13156
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.7", type: App_ModuleListComponent, isStandalone: true, selector: "app-app-module-list", usesInheritance: true, ngImport: i0, template: "<div nz-row [nzGutter]=\"[0, 8]\">\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\n <button-add (click)=\"edit(null)\"></button-add>\n <button-search (click)=\"search()\"></button-search>\n </div>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table\n #table\n [nzData]=\"this.data.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\n >\n <thead>\n <tr>\n <th nzWidth=\"50px\">#</th>\n <th>Name</th>\n <th>Icon</th>\n <th>Order Value</th>\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\n </tr>\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th nzRight></th>\n </tr>\n </thead>\n <tbody>\n @for (row of table.data; track $index; let i = $index) {\n <tr>\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Name }}</td>\n <td>{{ row.Icon }}</td>\n <td>{{ row.OrderValue }}</td>\n <td class=\"center\" nzRight>\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n }\n </tbody>\n </nz-table>\n </div>\n\n <div nz-col [nzSpan]=\"24\">\n <div nz-flex nzJustify=\"end\">\n <nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"data.TotalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\n >\n </nz-pagination>\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n </div>\n </div>\n</div>\n\n<nz-drawer\n [nzBodyStyle]=\"{ overflow: 'auto' }\"\n [nzMaskClosable]=\"false\"\n [nzWidth]=\"720\"\n [nzVisible]=\"drawerVisible\"\n [nzTitle]=\"editItem.App_Module_Id ? 'C\u1EADp nh\u1EADt' : 'Th\u00EAm m\u1EDBi'\"\n [nzContent]=\"contentTpl\"\n [nzFooter]=\"footerTpl\"\n (nzOnClose)=\"drawerVisible = false\"\n>\n <ng-template #contentTpl>\n <div nz-row nzGutter=\"16\">\n <extend-input nz-col nzSpan=\"24\" label=\"Name\" [floatingLabel]=\"false\" [(_ngModel)]=\"editItem.Name\"></extend-input>\n <extend-input nz-col nzSpan=\"24\" label=\"Icon\" [floatingLabel]=\"false\" [(_ngModel)]=\"editItem.Icon\"></extend-input>\n <extend-input-number\n nz-col\n nzSpan=\"24\"\n label=\"Order Value\"\n [floatingLabel]=\"false\"\n [(_ngModel)]=\"editItem.OrderValue\"\n ></extend-input-number>\n </div>\n </ng-template>\n <ng-template #footerTpl>\n <div style=\"float: right\">\n <button nz-button style=\"margin-right: 8px\" nzType=\"primary\" (click)=\"save()\">L\u01B0u</button>\n <button nz-button (click)=\"drawerVisible = false\">\u0110\u00F3ng</button>\n </div>\n </ng-template>\n</nz-drawer>\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$5.NzFlexDirective, selector: "[nz-flex],nz-flex", inputs: ["nzVertical", "nzJustify", "nzAlign", "nzGap", "nzWrap", "nzFlex"], exportAs: ["nzFlex"] }, { kind: "ngmodule", type: NzDrawerModule }, { kind: "component", type: i3$4.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: "ngmodule", type: NzButtonModule }, { kind: "component", type: i2$2.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$1.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: ButtonAdd, selector: "button-add", inputs: ["size"] }, { kind: "component", type: ButtonSearch, selector: "button-search", inputs: ["size"] }, { kind: "ngmodule", type: NzTableModule }, { kind: "component", type: i4.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: i4.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i4.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i4.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i4.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i4.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: i4.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "ngmodule", type: NzPaginationModule }, { kind: "component", type: i5$2.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: 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"] }, { 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"] }] });
13157
+ }
13158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImport: i0, type: App_ModuleListComponent, decorators: [{
13159
+ type: Component,
13160
+ args: [{ selector: 'app-app-module-list', imports: [
13161
+ CommonModule,
13162
+ NzGridModule,
13163
+ NzFlexModule,
13164
+ NzDrawerModule,
13165
+ NzButtonModule,
13166
+ ButtonAdd,
13167
+ ButtonSearch,
13168
+ NzTableModule,
13169
+ NzPaginationModule,
13170
+ IconEdit,
13171
+ IconDelete,
13172
+ IconCheck,
13173
+ ExtendInput,
13174
+ Box,
13175
+ ExtendInputNumber,
13176
+ ExtendDatePicker,
13177
+ DicDomainSelectComponent,
13178
+ ExtendTextArea,
13179
+ ], template: "<div nz-row [nzGutter]=\"[0, 8]\">\n <div nz-col nzSpan=\"24\">\n <div nz-flex nzGap=\"small\" nzJustify=\"end\">\n <button-add (click)=\"edit(null)\"></button-add>\n <button-search (click)=\"search()\"></button-search>\n </div>\n </div>\n <div nz-col nzSpan=\"24\">\n <nz-table\n #table\n [nzData]=\"this.data.LstItem || []\"\n [nzBordered]=\"true\"\n [nzSize]=\"'small'\"\n [nzShowPagination]=\"false\"\n [nzFrontPagination]=\"false\"\n [nzScroll]=\"{ x: 'auto', y: 'calc(100vh - 235px)' }\"\n >\n <thead>\n <tr>\n <th nzWidth=\"50px\">#</th>\n <th>Name</th>\n <th>Icon</th>\n <th>Order Value</th>\n <th nzWidth=\"75px\" nzRight>Thao t\u00E1c</th>\n </tr>\n <tr class=\"tr-search\" (keyup.enter)=\"search()\">\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th nzRight></th>\n </tr>\n </thead>\n <tbody>\n @for (row of table.data; track $index; let i = $index) {\n <tr>\n <td>{{ i + 1 + filter.PageIndex * filter.PageSize }}</td>\n <td class=\"link-detail\" (click)=\"edit(row)\">{{ row.Name }}</td>\n <td>{{ row.Icon }}</td>\n <td>{{ row.OrderValue }}</td>\n <td class=\"center\" nzRight>\n <icon-edit (click)=\"edit(row)\"></icon-edit><box [width]=\"4\"></box>\n <icon-delete (click)=\"delete(row)\"></icon-delete>\n </td>\n </tr>\n }\n </tbody>\n </nz-table>\n </div>\n\n <div nz-col [nzSpan]=\"24\">\n <div nz-flex nzJustify=\"end\">\n <nz-pagination\n [nzSize]=\"'small'\"\n [nzPageIndex]=\"filter.PageIndex + 1\"\n [nzPageSize]=\"filter.PageSize\"\n [nzTotal]=\"data.TotalCount || 0\"\n [nzShowSizeChanger]=\"true\"\n [nzShowTotal]=\"showTotalTpl\"\n [nzPageSizeOptions]=\"AppGlobals.pageSizeOptions\"\n (nzPageIndexChange)=\"onQueryParamsChange($event - 1, filter.PageSize)\"\n (nzPageSizeChange)=\"onQueryParamsChange(filter.PageIndex, $event)\"\n >\n </nz-pagination>\n <ng-template #showTotalTpl let-total let-range=\"range\">\n {{ range[0] | number }} - {{ range[1] | number }} / {{ total | number }}\n </ng-template>\n </div>\n </div>\n</div>\n\n<nz-drawer\n [nzBodyStyle]=\"{ overflow: 'auto' }\"\n [nzMaskClosable]=\"false\"\n [nzWidth]=\"720\"\n [nzVisible]=\"drawerVisible\"\n [nzTitle]=\"editItem.App_Module_Id ? 'C\u1EADp nh\u1EADt' : 'Th\u00EAm m\u1EDBi'\"\n [nzContent]=\"contentTpl\"\n [nzFooter]=\"footerTpl\"\n (nzOnClose)=\"drawerVisible = false\"\n>\n <ng-template #contentTpl>\n <div nz-row nzGutter=\"16\">\n <extend-input nz-col nzSpan=\"24\" label=\"Name\" [floatingLabel]=\"false\" [(_ngModel)]=\"editItem.Name\"></extend-input>\n <extend-input nz-col nzSpan=\"24\" label=\"Icon\" [floatingLabel]=\"false\" [(_ngModel)]=\"editItem.Icon\"></extend-input>\n <extend-input-number\n nz-col\n nzSpan=\"24\"\n label=\"Order Value\"\n [floatingLabel]=\"false\"\n [(_ngModel)]=\"editItem.OrderValue\"\n ></extend-input-number>\n </div>\n </ng-template>\n <ng-template #footerTpl>\n <div style=\"float: right\">\n <button nz-button style=\"margin-right: 8px\" nzType=\"primary\" (click)=\"save()\">L\u01B0u</button>\n <button nz-button (click)=\"drawerVisible = false\">\u0110\u00F3ng</button>\n </div>\n </ng-template>\n</nz-drawer>\n" }]
13180
+ }] });
13181
+
13182
+ const ROUTES$1 = [
13183
+ { path: 'module', component: App_ModuleListComponent },
13184
+ { path: 'menu', component: MenuListComponent },
13185
+ { path: 'menu/:id', component: MenuDetailComponent },
13186
+ { path: 'user', component: UserListComponent },
13187
+ { path: 'user/:id', component: UserDetailComponent },
13188
+ { path: 'user_profile', component: UserProfileComponent },
13189
+ { path: 'dicdomain', component: DicDomainListComponent },
13190
+ { path: 'role', component: RoleListComponent },
13191
+ { path: 'role/:id', component: RoleDetailComponent },
13192
+ { path: 'org', component: OrgListComponent },
13193
+ { path: 'org/:id', component: OrgDetailComponent },
13194
+ { path: 'permission', component: PermissionComponent },
13195
+ { path: 'file', component: FileListComponent },
13196
+ { path: 'setting', component: SettingListComponent },
13197
+ { path: 'config', component: ConfigComponent },
13198
+ { path: 'sequence', component: SequenceListComponent },
13199
+ { path: 'sequence/:id', component: SequenceDetailComponent },
13200
+ { path: 'doc-template', component: DocTemplate },
13201
+ { path: 'appdata', component: AppDataComponent },
13202
+ { path: 'log-server', component: LogServerComponent },
13203
+ { path: 'log-server/:file', component: LogServerDetailComponent },
13204
+ { path: 'log-app', component: LogAppComponent },
13205
+ // { path: 'mail-template', component: MailTemplateListComponent },
13206
+ // { path: 'mail-template/template/new', component: MailTemplateDetailComponent },
13207
+ // { path: 'mail-template/template/:id', component: MailTemplateDetailComponent },
13208
+ // { path: 'mail-template/setting/new', component: MailSendSettingDetailComponent },
13209
+ // { path: 'mail-template/setting/:id', component: MailSendSettingDetailComponent },
13210
+ { path: 'version', component: VersionComponent },
13211
+ { path: 'monitor', component: MonitorComponent },
13212
+ { path: 'cache', component: CacheListComponent },
13213
+ // { path: 'test-app', component: TestAppComponent },
13214
+ { path: 'synology', component: SynologyComponent },
13215
+ { path: 'dynamic-form', component: DynamicBuildFormComponent },
13216
+ ];
13217
+
12894
13218
  class App_Dic_Domain {
12895
13219
  // #region properties
12896
13220
  App_Dic_Domain_Id;
@@ -13536,20 +13860,33 @@ class RouteMonitorService {
13536
13860
  return;
13537
13861
  }
13538
13862
  let currentRoute = this.router.routerState.root.snapshot;
13863
+ let moduleId = null;
13539
13864
  let headerMenuId = null;
13865
+ // 1. Quét toàn bộ route tree để tìm cả moduleId và headerMenuId
13540
13866
  while (currentRoute) {
13541
- if (currentRoute.params && currentRoute.params['headerMenuId']) {
13542
- headerMenuId = currentRoute.params['headerMenuId'];
13543
- break;
13867
+ if (currentRoute.params) {
13868
+ if (currentRoute.params['moduleId']) {
13869
+ moduleId = currentRoute.params['moduleId'];
13870
+ }
13871
+ if (currentRoute.params['headerMenuId']) {
13872
+ headerMenuId = currentRoute.params['headerMenuId'];
13873
+ }
13544
13874
  }
13875
+ // Chuyển xuống route con tiếp theo
13545
13876
  currentRoute = currentRoute.firstChild;
13546
13877
  }
13547
13878
  let urlToCheck = url;
13879
+ // 2. Loại bỏ moduleId khỏi URL (Giả sử tiền tố trên URL là /module/)
13880
+ if (moduleId) {
13881
+ urlToCheck = urlToCheck.replace(`/module/${moduleId}`, '');
13882
+ }
13883
+ // 3. Loại bỏ headerMenuId khỏi URL như cũ
13548
13884
  if (headerMenuId) {
13549
- urlToCheck = urlToCheck.replace(`/headermenuid/${headerMenuId}`, '');
13550
- if (urlToCheck === '') {
13551
- urlToCheck = '/';
13552
- }
13885
+ urlToCheck = urlToCheck.replace(`/headermenu/${headerMenuId}`, '');
13886
+ }
13887
+ // Xử lý nếu url sau khi cắt bị rỗng
13888
+ if (urlToCheck === '') {
13889
+ urlToCheck = '/';
13553
13890
  }
13554
13891
  if (urlToCheck === '/' || urlToCheck === '/no-permission') {
13555
13892
  return;
@@ -20145,9 +20482,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.7", ngImpor
20145
20482
  args: ['inputElement', { static: false }]
20146
20483
  }] } });
20147
20484
 
20485
+ const ROUTES = [
20486
+ { path: 'template', component: WF_TemplateList },
20487
+ { path: 'template/:id', component: WF_TemplateDetail$1 },
20488
+ { path: 'doc-list', component: WF_DocListComponent },
20489
+ { path: 'doc-list/:id', component: WF_DocDetailComponent },
20490
+ { path: 'doc-list/:id/process', component: WF_DocProcessComponent },
20491
+ { path: 'doc-list/:id/doc-swimlane', component: WFDocSwimlaneComponent },
20492
+ { path: 'rpt-config', component: RptConfigList },
20493
+ { path: 'rpt-config/:id', component: RptConfigDetail },
20494
+ { path: 'wf-combine', component: WF_Template_CombineListComponent },
20495
+ { path: 'wf-combine/:id', component: WF_Template_CombineDetailComponent },
20496
+ ];
20497
+
20148
20498
  /**
20149
20499
  * Generated bundle index. Do not edit.
20150
20500
  */
20151
20501
 
20152
- export { ABAC_RULES_TOKEN, ActionRule, ActionRuleLine, AnimatedDigitComponent, AppDataComponent, AppGlobals, AppStorage, App_CacheItem, App_Dic_Domain, App_Dic_DomainFilter, App_File, 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, ButtonAdd, ButtonBack, ButtonDelete, ButtonEdit, ButtonReload, ButtonSave, ButtonSearch, ButtonUpload, CacheFilter, CacheListComponent, CheckModel, CommonService, ConfigComponent, CustomNotiComponent, CustomNotiService, DashcardComponent, DateInputParserDirective, DateTimeHelper, DicDomainListComponent, DicDomainPipe, 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, HeaderSearchComponent, HideIfErrorDirective, HighlightPipe, IconAdd, IconCheck, IconClose, IconCopy, IconDelete, IconEdit, IconInfo, IconSave, IconSearch, IconView, LayoutComponent, LayoutUser, LimitLettersPipe, LimitWordsPipe, LineGraphComponent, LoadingService, LogAppComponent, LogServerComponent, LogServerDetailComponent, Login1Component, Login2Component, LoginComponent, MailTemplateService, MenuDetailComponent, MenuFilter, MenuListComponent, MenuService, MonitorComponent, MonitorFilter, NoPermission, Nodata, NotiService, NotificationCenterComponent, NullIfEmptyDirective, NumberOnlyDirective, OrderOption, OrgDetailComponent, OrgFilter, OrgListComponent, OrgService, PagingData, PagingModel, PdfViewerComponent, PermissionComponent, PermissionService$1 as PermissionService, ReadMoreProComponent, RegisterComponent, RoleDetailComponent, RoleFilter, RoleListComponent, RoleService, RouteMonitorService, RptConfigDetail, RptConfigList, SequenceDetailComponent, SequenceListComponent, SessionManagerService, SettingListComponent, SettingService, SynologyComponent, TableHeader, ThemeService, TokenStorage, TranslateKey, URLs$j as URLs, UnsavedChangesGuard, UpperCaseFirsLetterEachWordDirective, UppercaseDirective, UppercaseFirstLetterDirective, UserDetailComponent, UserFilter, UserListComponent, UserProfileComponent, UserProfileService, UserService, VersionComponent, VscService, WFDocSwimlaneComponent, WF_DocDetailComponent, WF_DocListComponent, WF_DocProcessComponent, WF_TemplateActionRef, WF_TemplateDetail$1 as WF_TemplateDetail, WF_TemplateList, WF_Template_CombineDetailComponent, WF_Template_CombineListComponent, WF_TransitionRule, WF_TransitionRuleLine, Workflow, WorkflowAction, WorkflowActionEditorOption, WorkflowActionRef, WorkflowEditorComponent, WorkflowEditorOption, WorkflowStage, WorkflowStageEditorOption, XLSXHelper, authInterceptor, checkPermission, checkRole };
20502
+ export { ABAC_RULES_TOKEN, ROUTES$1 as ADMIN_ROUTES, ActionRule, ActionRuleLine, AnimatedDigitComponent, AppDataComponent, AppGlobals, AppStorage, App_CacheItem, App_Dic_Domain, App_Dic_DomainFilter, App_File, App_Menu, App_ModuleListComponent, App_Org, App_Role, App_Role_Menu_Ref, App_Setting, App_SettingFilter, App_User, AuthGuard, AuthService, AutoFocusDirective, BarGraphComponent, BaseComponent, BaseGuardChangeComponent, BaseOverlayComponent, Box, Breadcrumb, ButtonAdd, ButtonBack, ButtonDelete, ButtonEdit, ButtonReload, ButtonSave, ButtonSearch, ButtonUpload, CacheFilter, CacheListComponent, CheckModel, CommonService, ConfigComponent, CustomNotiComponent, CustomNotiService, DashcardComponent, DateInputParserDirective, DateTimeHelper, DicDomainListComponent, DicDomainPipe, 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, HeaderSearchComponent, HideIfErrorDirective, HighlightPipe, IconAdd, IconCheck, IconClose, IconCopy, IconDelete, IconEdit, IconInfo, IconSave, IconSearch, IconView, LayoutComponent, LayoutUser, LimitLettersPipe, LimitWordsPipe, LineGraphComponent, LoadingService, LogAppComponent, LogServerComponent, LogServerDetailComponent, Login1Component, Login2Component, LoginComponent, MailTemplateService, MenuDetailComponent, MenuFilter, MenuListComponent, MenuService, ModuleSelectComponent, MonitorComponent, MonitorFilter, NoPermission, Nodata, NotiService, NotificationCenterComponent, NullIfEmptyDirective, NumberOnlyDirective, OrderOption, OrgDetailComponent, OrgFilter, OrgListComponent, OrgService, PagingData, PagingModel, PdfViewerComponent, PermissionComponent, PermissionService$1 as PermissionService, ReadMoreProComponent, RegisterComponent, RoleDetailComponent, RoleFilter, RoleListComponent, RoleService, RouteMonitorService, RptConfigDetail, RptConfigList, SequenceDetailComponent, SequenceListComponent, SessionManagerService, SettingListComponent, SettingService, SynologyComponent, TableHeader, ThemeService, TokenStorage, TranslateKey, URLs$k as URLs, UnsavedChangesGuard, UpperCaseFirsLetterEachWordDirective, UppercaseDirective, UppercaseFirstLetterDirective, UserDetailComponent, UserFilter, UserListComponent, UserProfileComponent, UserProfileService, UserService, VersionComponent, VscService, WFDocSwimlaneComponent, WF_DocDetailComponent, WF_DocListComponent, WF_DocProcessComponent, ROUTES as WF_ROUTES, WF_TemplateActionRef, WF_TemplateDetail$1 as WF_TemplateDetail, WF_TemplateList, WF_Template_CombineDetailComponent, WF_Template_CombineListComponent, WF_TransitionRule, WF_TransitionRuleLine, Workflow, WorkflowAction, WorkflowActionEditorOption, WorkflowActionRef, WorkflowEditorComponent, WorkflowEditorOption, WorkflowStage, WorkflowStageEditorOption, XLSXHelper, authInterceptor, checkPermission, checkRole };
20153
20503
  //# sourceMappingURL=brggroup-share-lib.mjs.map