tnx-shared 5.0.68 → 5.0.69

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 (104) hide show
  1. package/bundles/tnx-shared.umd.js +807 -575
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/data-form-base.d.ts +2 -2
  6. package/classes/base/data-form-base.d.ts.map +1 -1
  7. package/classes/base/data-list-base.d.ts +3 -1
  8. package/classes/base/data-list-base.d.ts.map +1 -1
  9. package/classes/constants.d.ts +4 -0
  10. package/classes/constants.d.ts.map +1 -1
  11. package/classes/form-schema.d.ts +38 -4
  12. package/classes/form-schema.d.ts.map +1 -1
  13. package/components/autocomplete-picker/autocomplete-picker.component.d.ts +1 -0
  14. package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
  15. package/components/common-app-component/common-app-component.d.ts +4 -1
  16. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  17. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  18. package/components/crud/crud-list/crud-list.component.d.ts +6 -1
  19. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  20. package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
  21. package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts.map +1 -1
  22. package/components/file-explorer/file-manager/file-manager.component.d.ts +0 -2
  23. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  24. package/components/file-explorer/models/file-settings.d.ts +46 -0
  25. package/components/file-explorer/models/file-settings.d.ts.map +1 -0
  26. package/components/file-explorer/services/download-link.service.d.ts +0 -1
  27. package/components/file-explorer/services/download-link.service.d.ts.map +1 -1
  28. package/components/file-explorer/services/file-explorer.service.d.ts +0 -2
  29. package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
  30. package/components/file-explorer/services/file-object.service.d.ts +0 -1
  31. package/components/file-explorer/services/file-object.service.d.ts.map +1 -1
  32. package/components/mask/mask.component.d.ts +2 -0
  33. package/components/mask/mask.component.d.ts.map +1 -1
  34. package/configs/component-context.constant.d.ts +1 -0
  35. package/configs/component-context.constant.d.ts.map +1 -1
  36. package/esm2015/classes/base/data-form-base.js +5 -5
  37. package/esm2015/classes/base/data-list-base.js +48 -23
  38. package/esm2015/classes/constants.js +6 -1
  39. package/esm2015/classes/form-schema.js +34 -3
  40. package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +72 -16
  41. package/esm2015/components/common-app-component/app.menu.component.js +2 -2
  42. package/esm2015/components/common-app-component/common-app-component.js +26 -3
  43. package/esm2015/components/crud/crud-form/crud-form.component.js +9 -2
  44. package/esm2015/components/crud/crud-list/crud-list.component.js +71 -6
  45. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +29 -3
  46. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +29 -3
  47. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +12 -151
  48. package/esm2015/components/file-explorer/models/file-settings.js +60 -0
  49. package/esm2015/components/file-explorer/services/download-link.service.js +1 -4
  50. package/esm2015/components/file-explorer/services/file-explorer.service.js +8 -22
  51. package/esm2015/components/file-explorer/services/file-object.service.js +1 -15
  52. package/esm2015/components/mask/mask.component.js +8 -4
  53. package/esm2015/components/workflow/services/entity-workflow-history.service.js +3 -3
  54. package/esm2015/components/workflow/services/entity-workflow-setting.service.js +4 -4
  55. package/esm2015/configs/component-context.constant.js +3 -2
  56. package/esm2015/models/grid-info.js +1 -1
  57. package/esm2015/pipes/tn-date.pipe.js +12 -2
  58. package/esm2015/public-api.js +3 -7
  59. package/esm2015/services/base.service.js +16 -1
  60. package/esm2015/services/common.service.js +9 -1
  61. package/esm2015/services/crud.service.js +23 -4
  62. package/esm2015/services/menu.service.js +6 -3
  63. package/esm2015/services/notifier.service.js +2 -2
  64. package/esm2015/services/organization-base.service.js +57 -0
  65. package/esm2015/services/permission.service.js +9 -2
  66. package/esm2015/services/template-text-v4.service.js +1 -1
  67. package/esm2015/services/user-v5.service.js +1 -1
  68. package/esm2015/services/user.service.js +8 -2
  69. package/esm2015/tnx-shared.js +24 -22
  70. package/esm2015/tnx-shared.module.js +2 -4
  71. package/fesm2015/tnx-shared.js +530 -341
  72. package/fesm2015/tnx-shared.js.map +1 -1
  73. package/models/grid-info.d.ts +1 -0
  74. package/models/grid-info.d.ts.map +1 -1
  75. package/package.json +2 -2
  76. package/pipes/tn-date.pipe.d.ts +2 -0
  77. package/pipes/tn-date.pipe.d.ts.map +1 -1
  78. package/public-api.d.ts +2 -6
  79. package/public-api.d.ts.map +1 -1
  80. package/services/base.service.d.ts +1 -0
  81. package/services/base.service.d.ts.map +1 -1
  82. package/services/common.service.d.ts +4 -0
  83. package/services/common.service.d.ts.map +1 -1
  84. package/services/crud.service.d.ts.map +1 -1
  85. package/services/menu.service.d.ts +1 -1
  86. package/services/menu.service.d.ts.map +1 -1
  87. package/services/organization-base.service.d.ts +16 -0
  88. package/services/organization-base.service.d.ts.map +1 -0
  89. package/services/organization-base.service.ngfactory.d.ts.map +1 -0
  90. package/services/permission.service.d.ts +1 -0
  91. package/services/permission.service.d.ts.map +1 -1
  92. package/services/template-text-v4.service.d.ts.map +1 -1
  93. package/services/user.service.d.ts.map +1 -1
  94. package/tnx-shared.d.ts +23 -21
  95. package/tnx-shared.d.ts.map +1 -1
  96. package/tnx-shared.metadata.json +1 -1
  97. package/tnx-shared.module.d.ts +2 -2
  98. package/tnx-shared.module.d.ts.map +1 -1
  99. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
  100. package/components/file-explorer/signature-detail/signature-detail.component.d.ts +0 -8
  101. package/components/file-explorer/signature-detail/signature-detail.component.d.ts.map +0 -1
  102. package/components/file-explorer/signature-detail/signature-detail.component.ngfactory.d.ts.map +0 -1
  103. package/components/file-explorer/signature-detail/signature-detail.component.scss.shim.ngstyle.d.ts.map +0 -1
  104. package/esm2015/components/file-explorer/signature-detail/signature-detail.component.js +0 -66
@@ -28,9 +28,6 @@
28
28
 
29
29
  var stringify__default = /*#__PURE__*/_interopDefaultLegacy(stringify);
30
30
  var moment___namespace = /*#__PURE__*/_interopNamespace(moment_);
31
- var moment___default = /*#__PURE__*/_interopDefaultLegacy(moment_);
32
- var FileSaver__default = /*#__PURE__*/_interopDefaultLegacy(FileSaver);
33
- var printJS___default = /*#__PURE__*/_interopDefaultLegacy(printJS_);
34
31
  var printJS___namespace = /*#__PURE__*/_interopNamespace(printJS_);
35
32
  var JWT___namespace = /*#__PURE__*/_interopNamespace(JWT_);
36
33
  var jQuery___namespace = /*#__PURE__*/_interopNamespace(jQuery_);
@@ -398,7 +395,8 @@
398
395
  MENU_CHANGED: 'MENU_CHANGED',
399
396
  ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER: 'ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER',
400
397
  SHOW_WAIT_BOX: 'SHOW_WAIT_BOX',
401
- SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM'
398
+ SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM',
399
+ NEED_CLEAR_PERMISSION_CACHE: 'NEED_CLEAR_PERMISSION_CACHE'
402
400
  };
403
401
  ComCtxConstants.ROOT_USMART = {
404
402
  SHOW_CONFIG_DATA_DEFAULT: 'SHOW_CONFIG_DATA_DEFAULT',
@@ -910,7 +908,7 @@
910
908
  NotifierService.prototype.showWarningByReponse = function (res) {
911
909
  var message = res.message;
912
910
  if (!message)
913
- message = res.error;
911
+ message = 'Có lỗi xảy ra, vui lòng liên hệ quản trị viên!';
914
912
  this.showWarning(message);
915
913
  };
916
914
  NotifierService.prototype.showBusinessError = function (message, key, header, life) {
@@ -2363,6 +2361,14 @@
2363
2361
  errorDetail: err
2364
2362
  };
2365
2363
  };
2364
+ CommonService.prototype.tryParseJson = function (data) {
2365
+ try {
2366
+ return { valid: true, value: JSON.parse(data) };
2367
+ }
2368
+ catch (e) {
2369
+ return { valid: false, value: data };
2370
+ }
2371
+ };
2366
2372
  return CommonService;
2367
2373
  }());
2368
2374
  CommonService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CommonService_Factory() { return new CommonService(i0.ɵɵinject(ModuleConfigService)); }, token: CommonService, providedIn: "root" });
@@ -3248,7 +3254,11 @@
3248
3254
  EnumWorkflowCoreCodeSettingKey["MAC_DINH"] = "workflowCoreTrinhKy";
3249
3255
  EnumWorkflowCoreCodeSettingKey["PHE_DUYET_2_BUOC"] = "workflowCoreTrinhKy2Buoc";
3250
3256
  EnumWorkflowCoreCodeSettingKey["PHE_DUYET_3_BUOC"] = "workflowCoreTrinhKy3Buoc";
3251
- })(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
3257
+ })(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
3258
+ (function (EnumCoreVersion) {
3259
+ EnumCoreVersion["V4"] = "V4";
3260
+ EnumCoreVersion["V5"] = "V5";
3261
+ })(exports.EnumCoreVersion || (exports.EnumCoreVersion = {}));
3252
3262
 
3253
3263
  var ModelSchema = /** @class */ (function () {
3254
3264
  function ModelSchema(init) {
@@ -3324,6 +3334,7 @@
3324
3334
  this.function = new CrudListCustomFunction();
3325
3335
  this.popupHeader = '';
3326
3336
  this.popupSize = new PopupSize();
3337
+ this.showMenuButtons = true;
3327
3338
  this.getCustomDataTrinhKy = function (rowData) { return ({}); };
3328
3339
  this.getLabelButtonTrinhKy = function (rowData) { return 'Trình ký'; };
3329
3340
  this.checkReadyToTrinhKy = function () { return true; };
@@ -3638,6 +3649,7 @@
3638
3649
  _this.fieldPlus = ''; // Danh sách những trường bổ sung cần lấy thêm ngoài id, ten; Ví dụ ,ma
3639
3650
  _this.fieldValueParent = 'value'; // Trường sử dụng để lấy dữ liệu làm khóa từ bảng cha của item drop down được chọn
3640
3651
  _this.fireCallBackInside = true;
3652
+ _this.coreVersion = exports.EnumCoreVersion.V5;
3641
3653
  _this.funcCompare = function (item, value) { return item[_this.valueField] == value; };
3642
3654
  for (var key in init) {
3643
3655
  _this[key] = init[key];
@@ -3691,6 +3703,7 @@
3691
3703
  _this.prefix = '';
3692
3704
  _this.suffix = '';
3693
3705
  _this.decimalPlaces = 2;
3706
+ _this.thousandSeperator = '.';
3694
3707
  for (var key in init) {
3695
3708
  _this[key] = init[key];
3696
3709
  }
@@ -3870,7 +3883,6 @@
3870
3883
  _this.mode = exports.FileManagerMode.multiple;
3871
3884
  _this.layout = exports.EnumFileLayout.LIST;
3872
3885
  _this.readonly = false;
3873
- _this.uploadOnly = false;
3874
3886
  // Trường hợp ở trong form, dùng trường này để lấy
3875
3887
  // entityKey từ model.data thay vì truyền vào entityKey
3876
3888
  _this.entityKeyField = 'id';
@@ -4485,6 +4497,7 @@
4485
4497
  DataType["decimal"] = "decimal";
4486
4498
  DataType["boolean"] = "boolean";
4487
4499
  DataType["enum"] = "enum";
4500
+ DataType["currency"] = "currency";
4488
4501
  })(exports.DataType || (exports.DataType = {}));
4489
4502
  (function (ControlType) {
4490
4503
  ControlType["dropdown"] = "dropdown";
@@ -4556,7 +4569,34 @@
4556
4569
  (function (ExportAllMode) {
4557
4570
  ExportAllMode[ExportAllMode["ManualGetData"] = 0] = "ManualGetData";
4558
4571
  ExportAllMode[ExportAllMode["AutoGetData"] = 1] = "AutoGetData";
4559
- })(exports.ExportAllMode || (exports.ExportAllMode = {}));
4572
+ })(exports.ExportAllMode || (exports.ExportAllMode = {}));
4573
+ (function (EventType) {
4574
+ EventType["CHANGE"] = "change";
4575
+ EventType["ADJUST_VALUE"] = "adjustValue";
4576
+ EventType["MODEL_CHANGED"] = "modelChanged";
4577
+ EventType["FORM_READY"] = "formReady";
4578
+ EventType["ENTER"] = "enter";
4579
+ EventType["HIDE"] = "hide";
4580
+ EventType["ROW_REORDER"] = "rowReorder";
4581
+ EventType["BLUR"] = "blur";
4582
+ EventType["READY"] = "READY";
4583
+ EventType["DATASOURCE_LOADED"] = "dataSourceLoaded";
4584
+ EventType["CLICK"] = "click";
4585
+ EventType["AUTO_CORRECT"] = "autoCorrect";
4586
+ EventType["VALIDATE"] = "validate";
4587
+ EventType["INIT"] = "init";
4588
+ EventType["ADDING"] = "adding";
4589
+ EventType["ADDED"] = "added";
4590
+ EventType["DELETING"] = "deleting";
4591
+ EventType["DELETED"] = "deleted";
4592
+ EventType["SELECT"] = "select";
4593
+ EventType["TABLE_CHANGED"] = "tableChanged";
4594
+ EventType["SAVE"] = "save";
4595
+ EventType["MESSAGE"] = "message";
4596
+ EventType["ROW_FINISH_INIT"] = "rowFinishInit";
4597
+ EventType["TABLE_FINISH_INIT"] = "tableFinishInit";
4598
+ EventType["UPLOADED"] = "uploaded";
4599
+ })(exports.EventType || (exports.EventType = {}));
4560
4600
 
4561
4601
  var _a;
4562
4602
  (function (WorkflowCoreStatusEnum) {
@@ -5998,14 +6038,24 @@
5998
6038
  if (model.hasOwnProperty(sourceField)) {
5999
6039
  valueFilter = model[sourceField];
6000
6040
  if (canAccessSubField(valueFilter)) {
6001
- valueFilter = valueFilter[subField];
6041
+ if (isArray(valueFilter) && typeof subField === 'string') {
6042
+ valueFilter = valueFilter.map(function (x) { return x[subField]; });
6043
+ }
6044
+ else {
6045
+ valueFilter = valueFilter[subField];
6046
+ }
6002
6047
  }
6003
6048
  }
6004
6049
  else if (rootModel) {
6005
6050
  if (rootModel.hasOwnProperty(sourceField)) {
6006
6051
  valueFilter = rootModel[sourceField];
6007
6052
  if (canAccessSubField(valueFilter)) {
6008
- valueFilter = valueFilter[subField];
6053
+ if (isArray(valueFilter)) {
6054
+ valueFilter = valueFilter.map(function (x) { return x[subField]; });
6055
+ }
6056
+ else {
6057
+ valueFilter = valueFilter[subField];
6058
+ }
6009
6059
  }
6010
6060
  }
6011
6061
  else {
@@ -6031,7 +6081,12 @@
6031
6081
  finally { if (e_1) throw e_1.error; }
6032
6082
  }
6033
6083
  if (canAccessSubField(temp)) {
6034
- valueFilter = temp[subField];
6084
+ if (isArray(temp)) {
6085
+ valueFilter = temp.map(function (x) { return x[subField]; });
6086
+ }
6087
+ else {
6088
+ valueFilter = temp[subField];
6089
+ }
6035
6090
  }
6036
6091
  }
6037
6092
  }
@@ -6044,6 +6099,9 @@
6044
6099
  valueFilter = tmpFilter.funcGetValue(valueFilter);
6045
6100
  }
6046
6101
  tmpFilter.value = JSON.stringify(valueFilter);
6102
+ if (tmpFilter.modifyValue) {
6103
+ valueFilter = tmpFilter.modifyValue(valueFilter);
6104
+ }
6047
6105
  tmpFilter.filters = [];
6048
6106
  if (filter.logic && filter.filters) {
6049
6107
  filter.filters.forEach(function (f) { return _this.deQuyReplaceValue(tmpFilter.filters, f, model, rootModel); });
@@ -6194,6 +6252,7 @@
6194
6252
  });
6195
6253
  };
6196
6254
  CrudService.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
6255
+ data !== null && data !== void 0 ? data : (data = []);
6197
6256
  var field = schema.field;
6198
6257
  var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
6199
6258
  if (schema.funcGetLabel) {
@@ -6486,6 +6545,24 @@
6486
6545
  });
6487
6546
  return this.postGridInfo(apiUrl, gridInfo);
6488
6547
  };
6548
+ BaseService.prototype.getAllByFilter = function (filters, fields, sorts, plusUrl) {
6549
+ if (fields === void 0) { fields = ''; }
6550
+ if (sorts === void 0) { sorts = []; }
6551
+ if (plusUrl === void 0) { plusUrl = ''; }
6552
+ var apiUrl = this.apiGetAll;
6553
+ if (plusUrl != null && plusUrl != '')
6554
+ apiUrl += "/" + plusUrl;
6555
+ var gridInfo = new GridInfo({
6556
+ fields: fields,
6557
+ pageInfo: {
6558
+ page: 1,
6559
+ pageSize: 9999
6560
+ },
6561
+ sorts: sorts,
6562
+ filters: filters ? filters : []
6563
+ });
6564
+ return this.postGridInfo(apiUrl, gridInfo);
6565
+ };
6489
6566
  BaseService.prototype.getAllByGridInfo = function (gridInfo, plusUrl) {
6490
6567
  if (plusUrl === void 0) { plusUrl = ''; }
6491
6568
  var apiUrl = this.apiGetAll;
@@ -6956,7 +7033,7 @@
6956
7033
  }());
6957
7034
 
6958
7035
  // fix for build prod
6959
- var printJS = printJS___default['default'];
7036
+ var printJS = printJS___namespace;
6960
7037
  var FileExplorerService = /** @class */ (function () {
6961
7038
  function FileExplorerService(_http, _moduleConfig, _authenService, _commonSerivce, _moduleConfigService, _notifierService) {
6962
7039
  this._http = _http;
@@ -7166,11 +7243,11 @@
7166
7243
  return this._serviceUri + "/DownloadLink/" + hash;
7167
7244
  };
7168
7245
  FileExplorerService.prototype.getDownloadForSignUrl = function (hash) {
7169
- return this._serviceUri + "/DownloadLink/downloadforsign/" + hash;
7246
+ return this._serviceUri + "/Download/downloadforsign/" + hash;
7170
7247
  };
7171
7248
  FileExplorerService.prototype.generateLinkDownload = function (model) {
7172
7249
  var _this = this;
7173
- var svUrl = this._serviceUri + "/DownloadLink/GenerateDownloadLink";
7250
+ var svUrl = this._serviceUri + "/Download/GenerateDownloadLink";
7174
7251
  if (model.isFileVersion && !model.fileVersionId) {
7175
7252
  model.fileVersionId = model.fileId;
7176
7253
  }
@@ -7200,7 +7277,7 @@
7200
7277
  this._http.get(url, { responseType: 'blob' })
7201
7278
  .toPromise()
7202
7279
  .then(function (rs) {
7203
- FileSaver__default['default'].saveAs(rs, fileName);
7280
+ FileSaver.saveAs(rs, fileName);
7204
7281
  })
7205
7282
  .catch(function (err) {
7206
7283
  _this._notifierService.showWarning('Lỗi tải file');
@@ -7362,13 +7439,13 @@
7362
7439
  return regex.test(ext);
7363
7440
  };
7364
7441
  FileExplorerService.prototype.saveSignedFile = function (data) {
7365
- return this._http.post(this._serviceUri + "/KySoFile/SaveSignedFile", data).toPromise();
7442
+ return this._http.post(this._serviceUri + "/Signature/SaveSignedFile", data).toPromise();
7366
7443
  };
7367
7444
  FileExplorerService.prototype.getSignatureInfoByFileId = function (fileId) {
7368
- return this._http.get(this._serviceUri + "/KySoFile/GetListSignatureByFileId?fileId=" + fileId).toPromise();
7445
+ return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileId?fileId=" + fileId).toPromise();
7369
7446
  };
7370
7447
  FileExplorerService.prototype.getSignatureInfoByFileVersionId = function (fileVersionId) {
7371
- return this._http.get(this._serviceUri + "/KySoFile/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
7448
+ return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
7372
7449
  };
7373
7450
  FileExplorerService.prototype.getUploadFileVersionApiUrl = function () {
7374
7451
  return this._serviceUri + "/FileVersion/SaveVersionOnEdit";
@@ -7426,20 +7503,6 @@
7426
7503
  var svUrl = this._serviceUri + "/FileObject/CreateServiceFileAnonymous";
7427
7504
  return this._http.post(svUrl, serviceFileObjectDTO).pipe(operators.catchError(function (err) { return _this.handleError(err); })).toPromise();
7428
7505
  };
7429
- FileExplorerService.prototype.needConvertBeforeSign = function (fileName) {
7430
- if (fileName.lastIndexOf('.') === -1) {
7431
- return false;
7432
- }
7433
- var fileType = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
7434
- if ((/(doc|docx|dot|dotm|dotx|xls|xlsx|ppt|pptx)$/i).test(fileType)) {
7435
- return true;
7436
- }
7437
- return false;
7438
- };
7439
- FileExplorerService.prototype.changeFileExtension = function (fileName, newExtension) {
7440
- var arr = fileName.split('.');
7441
- return fileName.replace("." + arr[arr.length - 1], "." + newExtension);
7442
- };
7443
7506
  return FileExplorerService;
7444
7507
  }());
7445
7508
  FileExplorerService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FileExplorerService_Factory() { return new FileExplorerService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(AuthenService), i0.ɵɵinject(CommonService), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(NotifierService)); }, token: FileExplorerService, providedIn: "root" });
@@ -7887,9 +7950,6 @@
7887
7950
  });
7888
7951
  return promise;
7889
7952
  };
7890
- DownloadLinkService.prototype.getDownloadForSignUrl = function (hash) {
7891
- return this.serviceUri + "/DownloadForSign/" + hash;
7892
- };
7893
7953
  return DownloadLinkService;
7894
7954
  }(BaseService));
7895
7955
  DownloadLinkService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DownloadLinkService_Factory() { return new DownloadLinkService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(CrudService), i0.ɵɵinject(NotifierService)); }, token: DownloadLinkService, providedIn: "root" });
@@ -8881,6 +8941,7 @@
8881
8941
  }
8882
8942
  else {
8883
8943
  this._applicationContext.getRootContext().replaySubscribeOnce(ComCtxConstants.ROOT.USER_READY, function (rs) {
8944
+ var firstTimeLogin = rs;
8884
8945
  var accessToken = _this._oauthService.getAccessToken();
8885
8946
  var decoded = JWT.default(accessToken);
8886
8947
  // Chuyển đổi sang dùng instanceId nếu đăng nhập bằng identityv4 nhưng phải sử dụng base userOrgv5
@@ -8922,7 +8983,12 @@
8922
8983
  localStorage.setItem(_this.CURRENT_USER_KEY, JSON.stringify(user));
8923
8984
  }
8924
8985
  _this._applicationContext.getRootContext().data.currentUser = user;
8925
- _this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED, true);
8986
+ if (firstTimeLogin) {
8987
+ _this._applicationContext.getRootContext().fireEvent(ComCtxConstants.ROOT.NEED_CLEAR_PERMISSION_CACHE);
8988
+ }
8989
+ else {
8990
+ _this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED, true);
8991
+ }
8926
8992
  }, function (err) {
8927
8993
  });
8928
8994
  });
@@ -9482,9 +9548,12 @@
9482
9548
  _this.delayCheckPermissions = [];
9483
9549
  _this.ignoreAdmin = false;
9484
9550
  _this.appCode = null;
9551
+ if (_moduleConfigService.getConfig().environment.authenticationSettings.coreVersion == 'v4') {
9552
+ _this.serviceUri = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint + "/permission";
9553
+ }
9485
9554
  _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
9486
- _this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
9487
9555
  _this.appCode = _this._moduleConfigService.getConfig().appCode;
9556
+ _this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
9488
9557
  return _this;
9489
9558
  }
9490
9559
  /**
@@ -9706,6 +9775,10 @@
9706
9775
  }
9707
9776
  });
9708
9777
  };
9778
+ PermissionService.prototype.clearPermissionCache = function (lstModule) {
9779
+ var url = this.serviceUri + "/ClearPermissionCache";
9780
+ return this.defaultPost(url, lstModule);
9781
+ };
9709
9782
  return PermissionService;
9710
9783
  }(BaseService));
9711
9784
  PermissionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PermissionService_Factory() { return new PermissionService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(UserService), i0.ɵɵinject(i4.OAuthService), i0.ɵɵinject(ApplicationContextService)); }, token: PermissionService, providedIn: "root" });
@@ -10080,7 +10153,7 @@
10080
10153
  if (service == undefined) {
10081
10154
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
10082
10155
  }
10083
- this.serviceUri = service.endPoint + "/EntityWorkflowHistory";
10156
+ this.serviceUri = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory";
10084
10157
  };
10085
10158
  EntityWorkflowHistoryService.prototype.getLastHistory = function (tableName, filters) {
10086
10159
  if (filters === void 0) { filters = []; }
@@ -10088,7 +10161,7 @@
10088
10161
  if (service == undefined) {
10089
10162
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
10090
10163
  }
10091
- var url = service.endPoint + "/EntityWorkflowHistory/GetLastByFilter";
10164
+ var url = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory/GetLastByFilter";
10092
10165
  var gridInfo = {
10093
10166
  pageInfo: {
10094
10167
  page: 1,
@@ -10245,7 +10318,7 @@
10245
10318
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow setting');
10246
10319
  }
10247
10320
  return new Promise(function (resolve, reject) {
10248
- _this.defaultPost(service.endPoint + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
10321
+ _this.defaultPost(service.endPoint + "/" + _this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
10249
10322
  .then(function (res) {
10250
10323
  if (res.success) {
10251
10324
  var itemSetting = res.data;
@@ -10330,11 +10403,11 @@
10330
10403
  };
10331
10404
  EntityWorkflowSettingService.prototype.saveSetting = function (settingKey, data) {
10332
10405
  var service = this.serviceManagers[settingKey];
10333
- return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
10406
+ return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
10334
10407
  };
10335
10408
  EntityWorkflowSettingService.prototype.removeSetting = function (settingKey) {
10336
10409
  var service = this.serviceManagers[settingKey];
10337
- return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
10410
+ return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
10338
10411
  };
10339
10412
  return EntityWorkflowSettingService;
10340
10413
  }(BaseService));
@@ -11148,25 +11221,37 @@
11148
11221
  });
11149
11222
  });
11150
11223
  };
11224
+ DataListBase.prototype.validateEdit = function (rowData) {
11225
+ return __awaiter(this, void 0, void 0, function () {
11226
+ return __generator(this, function (_a) {
11227
+ return [2 /*return*/, true];
11228
+ });
11229
+ });
11230
+ };
11151
11231
  DataListBase.prototype._edit = function (rowData, scopeDataEdit) {
11152
11232
  if (scopeDataEdit === void 0) { scopeDataEdit = {}; }
11153
11233
  return __awaiter(this, void 0, void 0, function () {
11154
- var flashShow;
11234
+ var resultValidate, flashShow;
11155
11235
  return __generator(this, function (_a) {
11156
11236
  switch (_a.label) {
11157
- case 0:
11237
+ case 0: return [4 /*yield*/, this.validateEdit(rowData)];
11238
+ case 1:
11239
+ resultValidate = _a.sent();
11240
+ if (!resultValidate) {
11241
+ return [2 /*return*/];
11242
+ }
11158
11243
  flashShow = rowData[KeyFlashShow];
11159
11244
  delete rowData[KeyFlashShow];
11160
11245
  this.formModel.formState = exports.FormState.EDIT;
11161
11246
  return [4 /*yield*/, this.beforeEdit()];
11162
- case 1:
11247
+ case 2:
11163
11248
  _a.sent();
11164
11249
  this.setting.popupHeader = "C\u1EADp nh\u1EADt " + this.setting.objectName;
11165
11250
  this.setting.maskClass = flashShow ? 'hide' : null;
11166
11251
  this.scopeDataEdit = scopeDataEdit;
11167
11252
  this.formModel.data = this.cloneData(rowData);
11168
11253
  return [4 /*yield*/, this.modifyEditModel(rowData)];
11169
- case 2:
11254
+ case 3:
11170
11255
  _a.sent();
11171
11256
  this.formModel.data[KeyFlashShow] = flashShow;
11172
11257
  this.showDetailForm = true;
@@ -11197,34 +11282,56 @@
11197
11282
  DataListBase.prototype.getPromiseDeleteItem = function (rowData) {
11198
11283
  return this.setting.baseService.delete(rowData.id);
11199
11284
  };
11285
+ DataListBase.prototype.validateDelete = function (rowData) {
11286
+ return __awaiter(this, void 0, void 0, function () {
11287
+ return __generator(this, function (_a) {
11288
+ return [2 /*return*/, true];
11289
+ });
11290
+ });
11291
+ };
11200
11292
  DataListBase.prototype._delete = function (rowData) {
11201
- var _this = this;
11202
- if (rowData.__disableDelete) {
11203
- return;
11204
- }
11205
- this._notifierService.showDeleteConfirm().then(function (rs) {
11206
- if (!rs) {
11207
- return;
11208
- }
11209
- if (_this.setting.baseService) {
11210
- _this.getPromiseDeleteItem(rowData)
11211
- .then(function (response) {
11212
- if (response.success) {
11213
- if (_this.setting.showVersionButton) {
11214
- _this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
11293
+ return __awaiter(this, void 0, void 0, function () {
11294
+ var resultValidate;
11295
+ var _this = this;
11296
+ return __generator(this, function (_a) {
11297
+ switch (_a.label) {
11298
+ case 0:
11299
+ if (rowData.__disableDelete) {
11300
+ return [2 /*return*/];
11215
11301
  }
11216
- else {
11217
- _this._triggerProcessData();
11302
+ return [4 /*yield*/, this.validateDelete(rowData)];
11303
+ case 1:
11304
+ resultValidate = _a.sent();
11305
+ if (!resultValidate) {
11306
+ return [2 /*return*/];
11218
11307
  }
11219
- _this._notifierService.showDeleteDataSuccess();
11220
- }
11221
- else {
11222
- _this._notifierService.showWarningByReponse(response);
11223
- }
11224
- }, function (error) {
11225
- _this._notifierService.showDeleteDataError();
11226
- });
11227
- }
11308
+ this._notifierService.showDeleteConfirm().then(function (rs) {
11309
+ if (!rs) {
11310
+ return;
11311
+ }
11312
+ if (_this.setting.baseService) {
11313
+ _this.getPromiseDeleteItem(rowData)
11314
+ .then(function (response) {
11315
+ if (response.success) {
11316
+ if (_this.setting.showVersionButton) {
11317
+ _this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
11318
+ }
11319
+ else {
11320
+ _this._triggerProcessData();
11321
+ }
11322
+ _this._notifierService.showDeleteDataSuccess();
11323
+ }
11324
+ else {
11325
+ _this._notifierService.showWarningByReponse(response);
11326
+ }
11327
+ }, function (error) {
11328
+ _this._notifierService.showDeleteDataError();
11329
+ });
11330
+ }
11331
+ });
11332
+ return [2 /*return*/];
11333
+ }
11334
+ });
11228
11335
  });
11229
11336
  };
11230
11337
  DataListBase.prototype.getPromiseDeleteItems = function (items) {
@@ -11565,7 +11672,7 @@
11565
11672
  arrPromiseDontNeedWait = [];
11566
11673
  arrSchemaDontNeedWait = [];
11567
11674
  _loop_1 = function (schema) {
11568
- var field, arrValue_1, promise, result, funcGetLabel_1;
11675
+ var field, arrValue_1, promise, filters, result, funcGetLabel_1;
11569
11676
  return __generator(this, function (_a) {
11570
11677
  switch (_a.label) {
11571
11678
  case 0:
@@ -11600,7 +11707,11 @@
11600
11707
  promise = schema.baseService.getDataDropdown(schema.groupCode, arrValue_1, this_1.createDropdownOptions(schema));
11601
11708
  }
11602
11709
  else {
11603
- promise = schema.baseService.getDataDropdownByFilter([this_1.newFilter(schema.valueField, exports.Operator.in, arrValue_1)], this_1.createDropdownOptions(schema));
11710
+ filters = [this_1.newFilter(schema.valueField, exports.Operator.in, arrValue_1)];
11711
+ if (schema.modifyFilter) {
11712
+ schema.modifyFilter(filters);
11713
+ }
11714
+ promise = schema.baseService.getDataDropdownByFilter(filters, this_1.createDropdownOptions(schema));
11604
11715
  }
11605
11716
  if (!(schema.order != null)) return [3 /*break*/, 2];
11606
11717
  return [4 /*yield*/, promise];
@@ -11678,6 +11789,7 @@
11678
11789
  });
11679
11790
  };
11680
11791
  DataListBase.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
11792
+ data !== null && data !== void 0 ? data : (data = []);
11681
11793
  var field = schema.field;
11682
11794
  var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
11683
11795
  if (schema.funcGetLabel) {
@@ -14726,6 +14838,10 @@
14726
14838
  });
14727
14839
  this.onModelChanged.emit(event);
14728
14840
  }
14841
+ else {
14842
+ this._rootNode = new ControlTreeNode(this._modelData, this.formControls);
14843
+ this._rootNode.setCrudForm(this);
14844
+ }
14729
14845
  },
14730
14846
  enumerable: false,
14731
14847
  configurable: true
@@ -15985,18 +16101,24 @@
15985
16101
  return __generator(this, function (_d) {
15986
16102
  switch (_d.label) {
15987
16103
  case 0:
15988
- if (!control.multiple) return [3 /*break*/, 3];
16104
+ if (!control.multiple) return [3 /*break*/, 5];
15989
16105
  if (!(eventType == 'hide')) return [3 /*break*/, 2];
15990
16106
  return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
15991
16107
  case 1:
15992
16108
  _d.sent();
15993
- _d.label = 2;
15994
- case 2: return [3 /*break*/, 5];
15995
- case 3: return [4 /*yield*/, this.handleFieldValueChange(control, event, eventType, parentModel, parentPath, sourceNode, bubble)];
15996
- case 4:
16109
+ return [3 /*break*/, 4];
16110
+ case 2:
16111
+ if (!(control.bindingFilters && eventType == 'change')) return [3 /*break*/, 4];
16112
+ return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
16113
+ case 3:
15997
16114
  _d.sent();
15998
- _d.label = 5;
15999
- case 5: return [2 /*return*/];
16115
+ _d.label = 4;
16116
+ case 4: return [3 /*break*/, 7];
16117
+ case 5: return [4 /*yield*/, this.handleFieldValueChange(control, event, eventType, parentModel, parentPath, sourceNode, bubble)];
16118
+ case 6:
16119
+ _d.sent();
16120
+ _d.label = 7;
16121
+ case 7: return [2 /*return*/];
16000
16122
  }
16001
16123
  });
16002
16124
  });
@@ -16949,7 +17071,7 @@
16949
17071
  CrudFormComponent.decorators = [
16950
17072
  { type: i0.Component, args: [{
16951
17073
  selector: 'crud-form',
16952
- template: "<div [class]=\"_styleClass\" style=\"padding: 0.5rem 0.5rem 0\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #labelValueViewMode let-data=\"data\" let-control=\"control\" let-path=\"path\" let-parentPath=\"parentPath\"\r\n let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} type-{{control.dataType}} view-mode\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel && control.label\">\r\n <label [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}<span *ngIf=\"control.required\"\r\n class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container *ngIf=\"data[control.field] === null || data[control.field] === undefined\">\r\n <span class=\"no-value\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(data[control.field] === null || data[control.field] === undefined)\">\r\n <ng-container [ngSwitch]=\"control.dataType\">\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: subControl, data: data[control.field], showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\"\r\n [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\"\r\n [attr.label-index]=\"control.indexLabel\" [pTooltip]=\"control.title\" tooltipPosition=\"top\"\r\n tooltipStyleClass=\"wrap\" [escape]=\"false\" [for]=\"control.for\">{{control.text |\r\n translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'text'\">\r\n {{data[control.field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'money'\">\r\n {{data[control.field] | number}} VN\u0110\r\n </span>\r\n <span *ngSwitchCase=\"'date'\">\r\n {{data[control.field] | date:'dd/MM/yyyy'}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\">\r\n {{_crudService.renderDateTime(data[control.field], control.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\">\r\n {{data[control.field] | userFormat | async}}\r\n </span>\r\n <span *ngSwitchCase=\"'hasDataSource'\">\r\n <span *ngIf=\"!control.freeText\">\r\n {{getItemInArrayByValue(data._source[control.field] || control.dataSource,\r\n data[control.field], control)}}\r\n </span>\r\n <span *ngIf=\"control.freeText\">\r\n {{getItemInArrayByTextValue(data._source[control.field] || control.dataSource,\r\n data[control.field])}}\r\n </span>\r\n </span>\r\n <span *ngSwitchCase=\"'colorPicker'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.field]}\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.sourceField]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.sourceField]\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'colorControl'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\">\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <i class=\"{{data[control.field] | booleanFormat}}\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div [innerHTML]=\"data[control.field]\" *ngIf=\"data[control.field]==null?'':data[control.field]\">\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"'mask'\">\r\n <tn-mask [viewMode]=\"true\" [prefix]=\"control.prefix\" [suffix]=\"control.suffix\"\r\n [disabled]=\"checkDisabled(data, control)\" [decimalPlaces]=\"control.decimalPlaces\"\r\n [maskType]=\"control.maskType\" [(ngModel)]=\"data[control.field]\" [min]=\"control.min\"\r\n [max]=\"control.max\">\r\n </tn-mask>\r\n </span>\r\n <span *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-picker>\r\n </span>\r\n <span *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\">\r\n </tn-number-picker-range>\r\n </span>\r\n <span *ngSwitchCase=\"'string'\">{{data[control.field]}}</span>\r\n <span *ngSwitchCase=\"'button'\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\"\r\n [responsive]=\"true\" class=\"new-table scr-table table-control\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\"\r\n tooltipPosition=\"top\" [style.width]=\"subControl.width\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr>\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n class=\"control-inside\" [style]=\"subControl.style\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.viewModedataType)\"\r\n [ngTemplateOutletContext]=\"{data: data, control: control, isViewMode: true}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText type=\"tel\" [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n type=\"tel\" pInputText [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\"\r\n [ngTemplateOutletContext]=\"{crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
17074
+ template: "<div [class]=\"_styleClass\" style=\"padding: 0.5rem 0.5rem 0\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #labelValueViewMode let-data=\"data\" let-control=\"control\" let-path=\"path\" let-parentPath=\"parentPath\"\r\n let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} type-{{control.dataType}} view-mode\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel && control.label\">\r\n <label [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}<span *ngIf=\"control.required\"\r\n class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container *ngIf=\"data[control.field] === null || data[control.field] === undefined\">\r\n <span class=\"no-value\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(data[control.field] === null || data[control.field] === undefined)\">\r\n <ng-container [ngSwitch]=\"control.dataType\">\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: subControl, data: data[control.field], showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\"\r\n [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\"\r\n [attr.label-index]=\"control.indexLabel\" [pTooltip]=\"control.title\" tooltipPosition=\"top\"\r\n tooltipStyleClass=\"wrap\" [escape]=\"false\" [for]=\"control.for\">{{control.text |\r\n translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'text'\">\r\n {{data[control.field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'money'\">\r\n {{data[control.field] | number}} VN\u0110\r\n </span>\r\n <span *ngSwitchCase=\"'date'\">\r\n {{data[control.field] | date:'dd/MM/yyyy'}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\">\r\n {{_crudService.renderDateTime(data[control.field], control.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\">\r\n {{data[control.field] | userFormat | async}}\r\n </span>\r\n <span *ngSwitchCase=\"'hasDataSource'\">\r\n <span *ngIf=\"!control.freeText\">\r\n {{getItemInArrayByValue(data._source[control.field] || control.dataSource,\r\n data[control.field], control)}}\r\n </span>\r\n <span *ngIf=\"control.freeText\">\r\n {{getItemInArrayByTextValue(data._source[control.field] || control.dataSource,\r\n data[control.field])}}\r\n </span>\r\n </span>\r\n <span *ngSwitchCase=\"'colorPicker'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.field]}\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.sourceField]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.sourceField]\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'colorControl'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\">\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <i class=\"{{data[control.field] | booleanFormat}}\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div [innerHTML]=\"data[control.field]\" *ngIf=\"data[control.field]==null?'':data[control.field]\">\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"'mask'\">\r\n <tn-mask [viewMode]=\"true\" [prefix]=\"control.prefix\" [suffix]=\"control.suffix\"\r\n [disabled]=\"checkDisabled(data, control)\" [decimalPlaces]=\"control.decimalPlaces\"\r\n [maskType]=\"control.maskType\" [thousandSeperator]=\"control.thousandSeperator\" [(ngModel)]=\"data[control.field]\" [min]=\"control.min\"\r\n [max]=\"control.max\">\r\n </tn-mask>\r\n </span>\r\n <span *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-picker>\r\n </span>\r\n <span *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\">\r\n </tn-number-picker-range>\r\n </span>\r\n <span *ngSwitchCase=\"'string'\">{{data[control.field]}}</span>\r\n <span *ngSwitchCase=\"'button'\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\"\r\n [responsive]=\"true\" class=\"new-table scr-table table-control\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\"\r\n tooltipPosition=\"top\" [style.width]=\"subControl.width\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr>\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n class=\"control-inside\" [style]=\"subControl.style\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.viewModedataType)\"\r\n [ngTemplateOutletContext]=\"{data: data, control: control, isViewMode: true}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\" [thousandSeperator]=\"control.thousandSeperator\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText type=\"tel\" [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n type=\"tel\" pInputText [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.checkboxLabel ? control.checkboxLabel : control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [parentPath]=\"parentPath\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\"\r\n [ngTemplateOutletContext]=\"{crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
16953
17075
  providers: [ComponentContextService],
16954
17076
  styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;padding-left:.2em;padding-top:.3em;position:absolute}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}::ng-deep .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control){padding:0}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;padding:10px 0 10px 5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#6c757d;font-size:.8rem;margin-bottom:5px;margin-left:10px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9em;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
16955
17077
  },] }
@@ -18132,7 +18254,7 @@
18132
18254
  this.onSaved.emit();
18133
18255
  return [3 /*break*/, 3];
18134
18256
  case 2:
18135
- this.handleInsertError();
18257
+ this.handleInsertError(response);
18136
18258
  _a.label = 3;
18137
18259
  case 3: return [2 /*return*/];
18138
18260
  }
@@ -18152,7 +18274,7 @@
18152
18274
  DataFormBase.prototype.getPromiseActionInsert = function () {
18153
18275
  return this.setting.baseService.post(this.model.data, this.insertPlusUrl);
18154
18276
  };
18155
- DataFormBase.prototype.handleInsertError = function () {
18277
+ DataFormBase.prototype.handleInsertError = function (response) {
18156
18278
  };
18157
18279
  DataFormBase.prototype.onUpdate = function () {
18158
18280
  return __awaiter(this, void 0, void 0, function () {
@@ -18173,7 +18295,7 @@
18173
18295
  this.onSaved.emit();
18174
18296
  return [3 /*break*/, 3];
18175
18297
  case 2:
18176
- this.handleUpdateError();
18298
+ this.handleUpdateError(response);
18177
18299
  _a.label = 3;
18178
18300
  case 3: return [2 /*return*/];
18179
18301
  }
@@ -18190,7 +18312,7 @@
18190
18312
  });
18191
18313
  });
18192
18314
  };
18193
- DataFormBase.prototype.handleUpdateError = function () {
18315
+ DataFormBase.prototype.handleUpdateError = function (response) {
18194
18316
  };
18195
18317
  DataFormBase.prototype.getPromiseActionUpdate = function () {
18196
18318
  return this.setting.baseService.put(this.model.data.id.toString(), this.model.data, this.updatePlusUrl);
@@ -18822,27 +18944,49 @@
18822
18944
  AutoCompletePickerComponent.prototype.buildFilterKeyword = function () {
18823
18945
  var _this = this;
18824
18946
  if (this.fieldSearchText.length == 1) {
18825
- this.getFilterOnSearch = function (value) { return _this.newFilter(_this.control.displayField, exports.Operator.contain, value); };
18947
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
18948
+ this.getFilterOnSearch = function (value) { return _this.newFilterV4(_this.control.displayField, exports.Operator.contain, value.toString()); };
18949
+ }
18950
+ else {
18951
+ this.getFilterOnSearch = function (value) { return _this.newFilter(_this.control.displayField, exports.Operator.contain, value); };
18952
+ }
18826
18953
  }
18827
18954
  else {
18828
18955
  this.getFilterOnSearch = function (value) {
18829
- var e_1, _a;
18956
+ var e_1, _a, e_2, _b;
18830
18957
  var result = new Filter({
18831
18958
  logic: 'or',
18832
18959
  filters: []
18833
18960
  });
18834
- try {
18835
- for (var _b = __values(_this.fieldSearchText), _c = _b.next(); !_c.done; _c = _b.next()) {
18836
- var fieldSearch = _c.value;
18837
- result.filters.push(_this.newFilter(fieldSearch, exports.Operator.contain, value));
18961
+ if (_this.control.coreVersion == exports.EnumCoreVersion.V4) {
18962
+ try {
18963
+ for (var _c = __values(_this.fieldSearchText), _d = _c.next(); !_d.done; _d = _c.next()) {
18964
+ var fieldSearch = _d.value;
18965
+ result.filters.push(_this.newFilterV4(fieldSearch, exports.Operator.contain, value.toString()));
18966
+ }
18967
+ }
18968
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
18969
+ finally {
18970
+ try {
18971
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
18972
+ }
18973
+ finally { if (e_1) throw e_1.error; }
18838
18974
  }
18839
18975
  }
18840
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
18841
- finally {
18976
+ else {
18842
18977
  try {
18843
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
18978
+ for (var _e = __values(_this.fieldSearchText), _f = _e.next(); !_f.done; _f = _e.next()) {
18979
+ var fieldSearch = _f.value;
18980
+ result.filters.push(_this.newFilter(fieldSearch, exports.Operator.contain, value));
18981
+ }
18982
+ }
18983
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
18984
+ finally {
18985
+ try {
18986
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
18987
+ }
18988
+ finally { if (e_2) throw e_2.error; }
18844
18989
  }
18845
- finally { if (e_1) throw e_1.error; }
18846
18990
  }
18847
18991
  return result;
18848
18992
  };
@@ -18918,34 +19062,50 @@
18918
19062
  return __generator(this, function (_a) {
18919
19063
  switch (_a.label) {
18920
19064
  case 0:
19065
+ if (!this.control.modifyInitSearchData) return [3 /*break*/, 2];
19066
+ return [4 /*yield*/, this.control.modifyInitSearchData(this)];
19067
+ case 1:
19068
+ _a.sent();
19069
+ _a.label = 2;
19070
+ case 2:
18921
19071
  filters = [];
18922
19072
  if (this.control.multiple) {
18923
19073
  if (this.value && this.value.length > 0) {
18924
- filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this.value));
19074
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
19075
+ filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notIn, this.value.join(',')));
19076
+ }
19077
+ else {
19078
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this.value));
19079
+ }
18925
19080
  }
18926
19081
  }
18927
19082
  else {
18928
19083
  if (this.value) {
18929
- filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this.value));
19084
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
19085
+ filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notEqual, this.value.toString()));
19086
+ }
19087
+ else {
19088
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this.value));
19089
+ }
18930
19090
  }
18931
19091
  }
18932
19092
  return [4 /*yield*/, appendDefaultFilter(filters, this.control.defaultFilters)];
18933
- case 1:
19093
+ case 3:
18934
19094
  _a.sent();
18935
19095
  if (this.keyword && this.keyword.length > 0) {
18936
19096
  filters.push(this.getFilterOnSearch(this.keyword));
18937
19097
  }
18938
- if (!this.control.modifyFilter) return [3 /*break*/, 3];
19098
+ if (!this.control.modifyFilter) return [3 /*break*/, 5];
18939
19099
  return [4 /*yield*/, this.control.modifyFilter(filters)];
18940
- case 2:
19100
+ case 4:
18941
19101
  allow = _a.sent();
18942
19102
  if (allow === false) {
18943
19103
  this.results = [];
18944
19104
  return [2 /*return*/];
18945
19105
  }
18946
- _a.label = 3;
18947
- case 3: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
18948
- case 4:
19106
+ _a.label = 5;
19107
+ case 5: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
19108
+ case 6:
18949
19109
  dataSource = _a.sent();
18950
19110
  this.fireEventAfterGetDataDropDown(dataSource);
18951
19111
  this.reStructureDataSource(dataSource);
@@ -19126,9 +19286,17 @@
19126
19286
  if (!this.control.multiple) return [3 /*break*/, 5];
19127
19287
  dataSource = [];
19128
19288
  if (!(this.value && this.value.length > 0)) return [3 /*break*/, 4];
19129
- filters = [
19130
- this.newFilter(this.control.valueField, exports.Operator.in, this.value)
19131
- ];
19289
+ filters = [];
19290
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
19291
+ filters = [
19292
+ this.newFilterV4(this.control.valueField, exports.Operator.in, this.value.join(','))
19293
+ ];
19294
+ }
19295
+ else {
19296
+ filters = [
19297
+ this.newFilter(this.control.valueField, exports.Operator.in, this.value)
19298
+ ];
19299
+ }
19132
19300
  if (!this.control.modifyFilter) return [3 /*break*/, 2];
19133
19301
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19134
19302
  case 1:
@@ -19152,9 +19320,17 @@
19152
19320
  case 5:
19153
19321
  dataSource = [];
19154
19322
  if (!this.value) return [3 /*break*/, 9];
19155
- filters = [
19156
- this.newFilter(this.control.valueField, exports.Operator.equal, this.value)
19157
- ];
19323
+ filters = [];
19324
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
19325
+ filters = [
19326
+ this.newFilterV4(this.control.valueField, exports.Operator.equal, this.value.toString())
19327
+ ];
19328
+ }
19329
+ else {
19330
+ filters = [
19331
+ this.newFilter(this.control.valueField, exports.Operator.equal, this.value)
19332
+ ];
19333
+ }
19158
19334
  if (!this.control.modifyFilter) return [3 /*break*/, 7];
19159
19335
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19160
19336
  case 6:
@@ -19199,7 +19375,7 @@
19199
19375
  }
19200
19376
  };
19201
19377
  AutoCompletePickerComponent.prototype.reStructureDataSource = function (sources) {
19202
- var e_2, _a;
19378
+ var e_3, _a;
19203
19379
  if (sources != null && sources.length > 0) {
19204
19380
  var arr = [];
19205
19381
  try {
@@ -19209,12 +19385,12 @@
19209
19385
  arr.push(item);
19210
19386
  }
19211
19387
  }
19212
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
19388
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
19213
19389
  finally {
19214
19390
  try {
19215
19391
  if (sources_1_1 && !sources_1_1.done && (_a = sources_1.return)) _a.call(sources_1);
19216
19392
  }
19217
- finally { if (e_2) throw e_2.error; }
19393
+ finally { if (e_3) throw e_3.error; }
19218
19394
  }
19219
19395
  this.dataSource = arr;
19220
19396
  }
@@ -19244,7 +19420,12 @@
19244
19420
  if (!this.control.multiple) return [3 /*break*/, 6];
19245
19421
  if (!(obj != null && obj.length > 0)) return [3 /*break*/, 4];
19246
19422
  filters = [];
19247
- filters.push(this.newFilter(this.control.valueField, exports.Operator.in, obj));
19423
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
19424
+ filters.push(this.newFilterV4(this.control.valueField, exports.Operator.in, obj.join(',')));
19425
+ }
19426
+ else {
19427
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.in, obj));
19428
+ }
19248
19429
  if (!this.control.modifyFilter) return [3 /*break*/, 2];
19249
19430
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19250
19431
  case 1:
@@ -19269,9 +19450,17 @@
19269
19450
  case 5: return [3 /*break*/, 10];
19270
19451
  case 6:
19271
19452
  if (!(obj != null)) return [3 /*break*/, 9];
19272
- filters = [
19273
- this.newFilter(this.control.valueField, exports.Operator.equal, obj)
19274
- ];
19453
+ filters = [];
19454
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
19455
+ filters = [
19456
+ this.newFilterV4(this.control.valueField, exports.Operator.equal, obj.toString())
19457
+ ];
19458
+ }
19459
+ else {
19460
+ filters = [
19461
+ this.newFilter(this.control.valueField, exports.Operator.equal, obj)
19462
+ ];
19463
+ }
19275
19464
  if (!this.control.modifyFilter) return [3 /*break*/, 8];
19276
19465
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19277
19466
  case 7:
@@ -19347,6 +19536,7 @@
19347
19536
  AutoCompletePickerComponent.propDecorators = {
19348
19537
  control: [{ type: i0.Input }],
19349
19538
  disabled: [{ type: i0.Input }],
19539
+ parentPath: [{ type: i0.Input }],
19350
19540
  popupSize: [{ type: i0.Input }],
19351
19541
  onSelect: [{ type: i0.Output }],
19352
19542
  onUnSelect: [{ type: i0.Output }],
@@ -19465,20 +19655,6 @@
19465
19655
  FileObjectService.prototype.getScanFileUploadEndpoint = function (correlationId) {
19466
19656
  return this.serviceCode + "/CreateScannedFile/" + correlationId;
19467
19657
  };
19468
- FileObjectService.prototype.isTypeFileKySo = function (fileName) {
19469
- var fileExtension = this.getFileExtension(fileName);
19470
- if (fileExtension) {
19471
- fileExtension = fileExtension.toLowerCase();
19472
- if (fileExtension.indexOf('.') > -1) {
19473
- var arr = fileExtension.split('.');
19474
- fileExtension = arr[arr.length - 1];
19475
- }
19476
- if ((/(pdf|doc|docx|xls|xlsm|xlsx)$/i).test(fileExtension)) {
19477
- return true;
19478
- }
19479
- }
19480
- return false;
19481
- };
19482
19658
  return FileObjectService;
19483
19659
  }(BaseService));
19484
19660
  FileObjectService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FileObjectService_Factory() { return new FileObjectService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: FileObjectService, providedIn: "root" });
@@ -20566,13 +20742,16 @@
20566
20742
  });
20567
20743
  });
20568
20744
  };
20569
- MenuService.prototype.renderMenuByAppCode = function (appCode) {
20745
+ MenuService.prototype.renderMenuByAppCode = function (scopeName, appCode) {
20570
20746
  return __awaiter(this, void 0, void 0, function () {
20571
20747
  var menuUrl;
20572
20748
  var _this = this;
20573
20749
  return __generator(this, function (_a) {
20574
20750
  this._menuItems = [];
20575
20751
  menuUrl = "assets/menus/" + appCode.toLocaleLowerCase() + ".json";
20752
+ if (scopeName) {
20753
+ menuUrl = "assets/menus/" + scopeName.toLocaleLowerCase() + "/" + appCode.toLocaleLowerCase() + ".json";
20754
+ }
20576
20755
  fetch(menuUrl).then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
20577
20756
  var menu, _a, _b;
20578
20757
  return __generator(this, function (_c) {
@@ -20726,7 +20905,7 @@
20726
20905
  // Nếu là môi trường triển khai thì cộng thêm tiền tố phân hệ vào router link để có thể chuột phải mở tab mới
20727
20906
  funcSetNewTabLink = function (link) { return "/" + appCodeLowerCase + link; };
20728
20907
  }
20729
- this._menuService.renderMenuByAppCode(appCode);
20908
+ this._menuService.renderMenuByAppCode(this.environment.scopeName, appCode);
20730
20909
  this.model = this._menuService.getMenuItems();
20731
20910
  this._router.events.pipe(operators.filter(function (event) { return event instanceof i3.NavigationEnd; }))
20732
20911
  .subscribe(function (event) {
@@ -23287,7 +23466,7 @@
23287
23466
  };
23288
23467
 
23289
23468
  var CommonAppComponentComponent = /** @class */ (function () {
23290
- function CommonAppComponentComponent(_globalService, _commonService, renderer, translate, _oauthService, _authenService, _userService, _router, _title, _signalRService, _storageUpdatedService, _customRouteService, _applicationContext, _componentContextService, _activatedRoute, _deviceDetectorService, _cd, _tnClientService, _coreConfigService, _notifierService, _entityMetadataService, _moduleConfigService, _translateService, _messageService, _confirmService, _menuService, _primengConfig, _storageService) {
23469
+ function CommonAppComponentComponent(_globalService, _commonService, renderer, translate, _oauthService, _authenService, _userService, _router, _title, _signalRService, _storageUpdatedService, _customRouteService, _applicationContext, _componentContextService, _activatedRoute, _deviceDetectorService, _cd, _tnClientService, _coreConfigService, _notifierService, _entityMetadataService, _moduleConfigService, _translateService, _messageService, _confirmService, _menuService, _primengConfig, _storageService, _permissionService) {
23291
23470
  var _this = this;
23292
23471
  this._globalService = _globalService;
23293
23472
  this._commonService = _commonService;
@@ -23317,6 +23496,7 @@
23317
23496
  this._menuService = _menuService;
23318
23497
  this._primengConfig = _primengConfig;
23319
23498
  this._storageService = _storageService;
23499
+ this._permissionService = _permissionService;
23320
23500
  this.showQuickNote = true;
23321
23501
  this.allowAnonymous = false;
23322
23502
  this._unsubscribeAll = new rxjs.Subject();
@@ -23470,6 +23650,25 @@
23470
23650
  root.data.allowAnonymous = this.allowAnonymous;
23471
23651
  // get current User
23472
23652
  this._userService.populateCurrentUser();
23653
+ this._componentContextService.subscribe(ComCtxConstants.ROOT.NEED_CLEAR_PERMISSION_CACHE, function () { return __awaiter(_this, void 0, void 0, function () {
23654
+ var clear;
23655
+ return __generator(this, function (_a) {
23656
+ switch (_a.label) {
23657
+ case 0:
23658
+ if (!(this.environment.authenticationSettings.coreVersion == 'v4')) return [3 /*break*/, 2];
23659
+ return [4 /*yield*/, this.clearPermissionCacheByModule()];
23660
+ case 1:
23661
+ clear = _a.sent();
23662
+ if (!clear.success) {
23663
+ this._notifierService.showWarning('Có vấn đề trong lúc clear cache quyền');
23664
+ }
23665
+ _a.label = 2;
23666
+ case 2:
23667
+ this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED);
23668
+ return [2 /*return*/];
23669
+ }
23670
+ });
23671
+ }); });
23473
23672
  this._componentContextService.subscribe(ComCtxConstants.ROOT.KEY_DOWN_ARROWLEFT, function (e) {
23474
23673
  if (document.activeElement === _this.cancelButton.nativeElement) {
23475
23674
  _this.okButton.nativeElement.focus();
@@ -23985,6 +24184,17 @@
23985
24184
  }
23986
24185
  }
23987
24186
  };
24187
+ CommonAppComponentComponent.prototype.clearPermissionCacheByModule = function () {
24188
+ var appSwitcher = this._moduleConfigService.getConfig().environment.appMetadata.appSwitcher;
24189
+ if (!appSwitcher || !appSwitcher.length) {
24190
+ appSwitcher = [];
24191
+ }
24192
+ var lstModule = appSwitcher.map(function (x) { return x.code; });
24193
+ if (!lstModule) {
24194
+ lstModule = [];
24195
+ }
24196
+ return this._permissionService.clearPermissionCache(lstModule);
24197
+ };
23988
24198
  return CommonAppComponentComponent;
23989
24199
  }());
23990
24200
  CommonAppComponentComponent.decorators = [
@@ -24023,7 +24233,8 @@
24023
24233
  { type: i1.ConfirmationService },
24024
24234
  { type: MenuService },
24025
24235
  { type: i1.PrimeNGConfig },
24026
- { type: StorageService }
24236
+ { type: StorageService },
24237
+ { type: PermissionService }
24027
24238
  ]; };
24028
24239
  CommonAppComponentComponent.propDecorators = {
24029
24240
  okButton: [{ type: i0.ViewChild, args: ['okButton',] }],
@@ -26180,6 +26391,8 @@
26180
26391
  });
26181
26392
  _this.sourceIcon = {};
26182
26393
  _this.stopCalculatingFunctionColumnWidth = false;
26394
+ _this.FileUploadMode = exports.FileUploadMode;
26395
+ _this.eventType = exports.EventType;
26183
26396
  _this._unSubscribeAll = new rxjs.Subject();
26184
26397
  _this.handleSelectRow = function (evt, data) {
26185
26398
  if (_this.setting.hasCustomHandleClickRow) {
@@ -26362,6 +26575,94 @@
26362
26575
  _this.setting.pageSetting.page = 1;
26363
26576
  _this.getData();
26364
26577
  };
26578
+ _this.handleFieldValueChange = function (control, event, rowData, type) { return __awaiter(_this, void 0, void 0, function () {
26579
+ var eventData, _f, _a_1, _b_1, _c_1, _d_1, _e_1;
26580
+ return __generator(this, function (_g) {
26581
+ switch (_g.label) {
26582
+ case 0:
26583
+ eventData = {
26584
+ event: event,
26585
+ rowData: rowData,
26586
+ type: type
26587
+ };
26588
+ _f = type;
26589
+ switch (_f) {
26590
+ case exports.EventType.CHANGE: return [3 /*break*/, 1];
26591
+ case exports.EventType.INIT: return [3 /*break*/, 6];
26592
+ case exports.EventType.DELETED: return [3 /*break*/, 11];
26593
+ case exports.EventType.SELECT: return [3 /*break*/, 16];
26594
+ case exports.EventType.UPLOADED: return [3 /*break*/, 21];
26595
+ }
26596
+ return [3 /*break*/, 26];
26597
+ case 1:
26598
+ if (!control.onChanged) return [3 /*break*/, 5];
26599
+ _g.label = 2;
26600
+ case 2:
26601
+ _g.trys.push([2, 4, , 5]);
26602
+ return [4 /*yield*/, control.onChanged(eventData)];
26603
+ case 3:
26604
+ _g.sent();
26605
+ return [3 /*break*/, 5];
26606
+ case 4:
26607
+ _a_1 = _g.sent();
26608
+ return [3 /*break*/, 5];
26609
+ case 5: return [3 /*break*/, 26];
26610
+ case 6:
26611
+ if (!control.onInit) return [3 /*break*/, 10];
26612
+ _g.label = 7;
26613
+ case 7:
26614
+ _g.trys.push([7, 9, , 10]);
26615
+ return [4 /*yield*/, control.onInit(eventData)];
26616
+ case 8:
26617
+ _g.sent();
26618
+ return [3 /*break*/, 10];
26619
+ case 9:
26620
+ _b_1 = _g.sent();
26621
+ return [3 /*break*/, 10];
26622
+ case 10: return [3 /*break*/, 26];
26623
+ case 11:
26624
+ if (!control.onRemove) return [3 /*break*/, 15];
26625
+ _g.label = 12;
26626
+ case 12:
26627
+ _g.trys.push([12, 14, , 15]);
26628
+ return [4 /*yield*/, control.onRemove(eventData)];
26629
+ case 13:
26630
+ _g.sent();
26631
+ return [3 /*break*/, 15];
26632
+ case 14:
26633
+ _c_1 = _g.sent();
26634
+ return [3 /*break*/, 15];
26635
+ case 15: return [3 /*break*/, 26];
26636
+ case 16:
26637
+ if (!control.onSelected) return [3 /*break*/, 20];
26638
+ _g.label = 17;
26639
+ case 17:
26640
+ _g.trys.push([17, 19, , 20]);
26641
+ return [4 /*yield*/, control.onSelected(eventData)];
26642
+ case 18:
26643
+ _g.sent();
26644
+ return [3 /*break*/, 20];
26645
+ case 19:
26646
+ _d_1 = _g.sent();
26647
+ return [3 /*break*/, 20];
26648
+ case 20: return [3 /*break*/, 26];
26649
+ case 21:
26650
+ if (!control.onUploaded) return [3 /*break*/, 25];
26651
+ _g.label = 22;
26652
+ case 22:
26653
+ _g.trys.push([22, 24, , 25]);
26654
+ return [4 /*yield*/, control.onUploaded(eventData)];
26655
+ case 23:
26656
+ _g.sent();
26657
+ return [3 /*break*/, 25];
26658
+ case 24:
26659
+ _e_1 = _g.sent();
26660
+ return [3 /*break*/, 25];
26661
+ case 25: return [3 /*break*/, 26];
26662
+ case 26: return [2 /*return*/];
26663
+ }
26664
+ });
26665
+ }); };
26365
26666
  _this._activatedRoute = _this._injector.get(i3.ActivatedRoute);
26366
26667
  _this._router = _this._injector.get(i3.Router);
26367
26668
  _this._customRouterService = _this._injector.get(CustomRouterService);
@@ -26669,7 +26970,7 @@
26669
26970
  });
26670
26971
  };
26671
26972
  CrudListComponent.prototype.formatColumns = function (cols) {
26672
- var e_1, _b;
26973
+ var e_1, _f;
26673
26974
  try {
26674
26975
  for (var cols_1 = __values(cols), cols_1_1 = cols_1.next(); !cols_1_1.done; cols_1_1 = cols_1.next()) {
26675
26976
  var col = cols_1_1.value;
@@ -26681,7 +26982,7 @@
26681
26982
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
26682
26983
  finally {
26683
26984
  try {
26684
- if (cols_1_1 && !cols_1_1.done && (_b = cols_1.return)) _b.call(cols_1);
26985
+ if (cols_1_1 && !cols_1_1.done && (_f = cols_1.return)) _f.call(cols_1);
26685
26986
  }
26686
26987
  finally { if (e_1) throw e_1.error; }
26687
26988
  }
@@ -26880,7 +27181,7 @@
26880
27181
  CrudListComponent.prototype.validatePermission = function (rowData) {
26881
27182
  return __awaiter(this, void 0, void 0, function () {
26882
27183
  var itemStatus, hasPermission, userData, userId, userIdUpper, userGroupIds, userOrgIds, managerTypes, userIdLastUpper_1, donViIdLastUpper_1;
26883
- return __generator(this, function (_b) {
27184
+ return __generator(this, function (_f) {
26884
27185
  this.currentItem = rowData;
26885
27186
  itemStatus = this.setting.workflowSetting.statuses.find(function (p) { return p.trangThaiContainer.ma == rowData.currentStateCode; });
26886
27187
  hasPermission = false;
@@ -26947,12 +27248,12 @@
26947
27248
  };
26948
27249
  CrudListComponent.prototype.showActionWorkflow = function (evt, rowData) {
26949
27250
  return __awaiter(this, void 0, void 0, function () {
26950
- var _b, buttonContexts, hasPermission;
26951
- return __generator(this, function (_c) {
26952
- switch (_c.label) {
27251
+ var _f, buttonContexts, hasPermission;
27252
+ return __generator(this, function (_g) {
27253
+ switch (_g.label) {
26953
27254
  case 0: return [4 /*yield*/, this.getActionWorkflow(rowData)];
26954
27255
  case 1:
26955
- _b = __read.apply(void 0, [_c.sent(), 2]), buttonContexts = _b[0], hasPermission = _b[1];
27256
+ _f = __read.apply(void 0, [_g.sent(), 2]), buttonContexts = _f[0], hasPermission = _f[1];
26956
27257
  this.buttonContexts = buttonContexts;
26957
27258
  rowData.__hasPermission = hasPermission;
26958
27259
  rowData.__actions = this.buttonContexts;
@@ -26966,11 +27267,11 @@
26966
27267
  return __awaiter(this, void 0, void 0, function () {
26967
27268
  var hasPermission, buttonContexts, statusAction, actions;
26968
27269
  var _this = this;
26969
- return __generator(this, function (_b) {
26970
- switch (_b.label) {
27270
+ return __generator(this, function (_f) {
27271
+ switch (_f.label) {
26971
27272
  case 0: return [4 /*yield*/, this.validatePermission(rowData)];
26972
27273
  case 1:
26973
- hasPermission = _b.sent();
27274
+ hasPermission = _f.sent();
26974
27275
  buttonContexts = [];
26975
27276
  if (!hasPermission) {
26976
27277
  buttonContexts = [];
@@ -27036,8 +27337,8 @@
27036
27337
  return __awaiter(this, void 0, void 0, function () {
27037
27338
  var dataProcess_1, validateWf;
27038
27339
  var _this = this;
27039
- return __generator(this, function (_b) {
27040
- switch (_b.label) {
27340
+ return __generator(this, function (_f) {
27341
+ switch (_f.label) {
27041
27342
  case 0:
27042
27343
  if (!(workflowAction.actionOptions && !workflowAction.actionOptions.openDialog)) return [3 /*break*/, 2];
27043
27344
  dataProcess_1 = {
@@ -27047,7 +27348,7 @@
27047
27348
  };
27048
27349
  return [4 /*yield*/, this.setting.baseService.validateProcessWorkflow(this.currentItem.id, workflowAction.ma, dataProcess_1)];
27049
27350
  case 1:
27050
- validateWf = _b.sent();
27351
+ validateWf = _f.sent();
27051
27352
  this.handleResponse(validateWf, '', function (f) {
27052
27353
  _this.setting.baseService.processWorkflow(_this.currentItem.id, workflowAction.ma, dataProcess_1)
27053
27354
  .then(function (res) { return _this.handleResponse(res, workflowAction.ten + " th\u00E0nh c\u00F4ng", function (f) {
@@ -27071,7 +27372,7 @@
27071
27372
  this.actionWorkflow = workflowAction;
27072
27373
  this.headerWorkflow = workflowAction.ten;
27073
27374
  this.showFormWorkflow = true;
27074
- _b.label = 3;
27375
+ _f.label = 3;
27075
27376
  case 3: return [2 /*return*/];
27076
27377
  }
27077
27378
  });
@@ -27174,7 +27475,7 @@
27174
27475
  this.onAdd.emit();
27175
27476
  };
27176
27477
  CrudListComponent.prototype.xuatCacMucDaChon_backup = function () {
27177
- var e_2, _b;
27478
+ var e_2, _f;
27178
27479
  if (this._groupField) {
27179
27480
  this._notifierService.showWarning('Giao diện hiện tại chưa hỗ trợ xuất excel');
27180
27481
  return;
@@ -27216,7 +27517,7 @@
27216
27517
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
27217
27518
  finally {
27218
27519
  try {
27219
- if (rowData_1_1 && !rowData_1_1.done && (_b = rowData_1.return)) _b.call(rowData_1);
27520
+ if (rowData_1_1 && !rowData_1_1.done && (_f = rowData_1.return)) _f.call(rowData_1);
27220
27521
  }
27221
27522
  finally { if (e_2) throw e_2.error; }
27222
27523
  }
@@ -27359,8 +27660,8 @@
27359
27660
  CrudListComponent.prototype.checkHasPermissionInLastStatus = function (rowData) {
27360
27661
  return __awaiter(this, void 0, void 0, function () {
27361
27662
  var statusKetThuc;
27362
- return __generator(this, function (_b) {
27363
- switch (_b.label) {
27663
+ return __generator(this, function (_f) {
27664
+ switch (_f.label) {
27364
27665
  case 0:
27365
27666
  statusKetThuc = this.setting.workflowSetting.statuses.find(function (q) { return q.type == exports.EnumWFNhomTrangThai.KET_THUC; });
27366
27667
  if (statusKetThuc == null) {
@@ -27373,46 +27674,46 @@
27373
27674
  return [4 /*yield*/, this.validatePermission(rowData)];
27374
27675
  case 1:
27375
27676
  // Kiểm tra permission
27376
- return [2 /*return*/, _b.sent()];
27677
+ return [2 /*return*/, _f.sent()];
27377
27678
  }
27378
27679
  });
27379
27680
  });
27380
27681
  };
27381
27682
  CrudListComponent.prototype.showContextMenu = function (evt, rowData) {
27382
27683
  return __awaiter(this, void 0, void 0, function () {
27383
- var _b, _c, _d, _e;
27384
- return __generator(this, function (_f) {
27385
- switch (_f.label) {
27684
+ var _f, _g, _h, _j;
27685
+ return __generator(this, function (_k) {
27686
+ switch (_k.label) {
27386
27687
  case 0:
27387
27688
  this.rowDataCurrent = rowData;
27388
- _b = this;
27689
+ _f = this;
27389
27690
  return [4 /*yield*/, this.menuButtons(rowData)];
27390
27691
  case 1:
27391
- _b.buttonContexts = _f.sent();
27692
+ _f.buttonContexts = _k.sent();
27392
27693
  if (!(!this.setting.hiddenTrinhKy && !rowData.__hiddenTrinhKy)) return [3 /*break*/, 7];
27393
- _d = this.setting.checkReadyToTrinhKy();
27394
- if (!_d) return [3 /*break*/, 3];
27694
+ _h = this.setting.checkReadyToTrinhKy();
27695
+ if (!_h) return [3 /*break*/, 3];
27395
27696
  return [4 /*yield*/, this.setting.checkAllowTrinhKy(rowData)];
27396
27697
  case 2:
27397
- _d = (_f.sent());
27398
- _f.label = 3;
27698
+ _h = (_k.sent());
27699
+ _k.label = 3;
27399
27700
  case 3:
27400
- _c = _d;
27401
- if (!_c) return [3 /*break*/, 6];
27402
- _e = !this.setting.checkPermisionTrinhKy;
27403
- if (_e) return [3 /*break*/, 5];
27701
+ _g = _h;
27702
+ if (!_g) return [3 /*break*/, 6];
27703
+ _j = !this.setting.checkPermisionTrinhKy;
27704
+ if (_j) return [3 /*break*/, 5];
27404
27705
  return [4 /*yield*/, this.checkHasPermissionInLastStatus(rowData)];
27405
27706
  case 4:
27406
- _e = (_f.sent());
27407
- _f.label = 5;
27707
+ _j = (_k.sent());
27708
+ _k.label = 5;
27408
27709
  case 5:
27409
- _c = (_e);
27410
- _f.label = 6;
27710
+ _g = (_j);
27711
+ _k.label = 6;
27411
27712
  case 6:
27412
- if (_c) {
27713
+ if (_g) {
27413
27714
  this.buttonContexts.unshift({ label: this.setting.getLabelButtonTrinhKy(rowData), icon: 'pi pi-send', command: this.trinhKy.bind(this) });
27414
27715
  }
27415
- _f.label = 7;
27716
+ _k.label = 7;
27416
27717
  case 7:
27417
27718
  if (this.buttonContexts.length > 0) {
27418
27719
  this._showContextMenu(evt);
@@ -27989,7 +28290,7 @@
27989
28290
  return col.dataType == exports.DataType.datetime || col.dataType == exports.DataType.date || col.dataType == exports.DataType.boolean || col.dataType == exports.DataType.enum;
27990
28291
  };
27991
28292
  CrudListComponent.prototype.alignRightColumn = function (col) {
27992
- return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal;
28293
+ return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal || col.dataType == exports.DataType.currency;
27993
28294
  };
27994
28295
  CrudListComponent.prototype.ngOnDestroy = function () {
27995
28296
  if (!this.disableKeypressControl) {
@@ -28005,10 +28306,10 @@
28005
28306
  clearTimeout(this.timeout);
28006
28307
  };
28007
28308
  CrudListComponent.prototype.disableMultipleDelete = function () {
28008
- var e_3, _b;
28309
+ var e_3, _f;
28009
28310
  try {
28010
- for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
28011
- var item = _d.value;
28311
+ for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
28312
+ var item = _h.value;
28012
28313
  if (this.disableDelete(item)) {
28013
28314
  return true;
28014
28315
  }
@@ -28017,7 +28318,7 @@
28017
28318
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
28018
28319
  finally {
28019
28320
  try {
28020
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
28321
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
28021
28322
  }
28022
28323
  finally { if (e_3) throw e_3.error; }
28023
28324
  }
@@ -28087,11 +28388,11 @@
28087
28388
  };
28088
28389
  CrudListComponent.prototype.processBaseData = function () {
28089
28390
  return __awaiter(this, void 0, void 0, function () {
28090
- return __generator(this, function (_b) {
28091
- switch (_b.label) {
28391
+ return __generator(this, function (_f) {
28392
+ switch (_f.label) {
28092
28393
  case 0: return [4 /*yield*/, this.preProcessData(this.model.dataSource)];
28093
28394
  case 1:
28094
- _b.sent();
28395
+ _f.sent();
28095
28396
  return [2 /*return*/];
28096
28397
  }
28097
28398
  });
@@ -28100,14 +28401,14 @@
28100
28401
  CrudListComponent.prototype.preProcessData = function (dataSource) {
28101
28402
  return __awaiter(this, void 0, void 0, function () {
28102
28403
  var colHasPipe, _loop_3, this_2, colHasPipe_1, colHasPipe_1_1, col;
28103
- var e_4, _b;
28104
- return __generator(this, function (_c) {
28404
+ var e_4, _f;
28405
+ return __generator(this, function (_g) {
28105
28406
  colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
28106
28407
  _loop_3 = function (col) {
28107
- var e_5, _b;
28408
+ var e_5, _f;
28108
28409
  var _loop_4 = function (item) {
28109
28410
  this_2.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
28110
- item["pipe__" + col.field + " "] = rs;
28411
+ item["pipe__" + col.field] = rs;
28111
28412
  });
28112
28413
  };
28113
28414
  try {
@@ -28119,7 +28420,7 @@
28119
28420
  catch (e_5_1) { e_5 = { error: e_5_1 }; }
28120
28421
  finally {
28121
28422
  try {
28122
- if (dataSource_1_1 && !dataSource_1_1.done && (_b = dataSource_1.return)) _b.call(dataSource_1);
28423
+ if (dataSource_1_1 && !dataSource_1_1.done && (_f = dataSource_1.return)) _f.call(dataSource_1);
28123
28424
  }
28124
28425
  finally { if (e_5) throw e_5.error; }
28125
28426
  }
@@ -28134,7 +28435,7 @@
28134
28435
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
28135
28436
  finally {
28136
28437
  try {
28137
- if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_b = colHasPipe_1.return)) _b.call(colHasPipe_1);
28438
+ if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_f = colHasPipe_1.return)) _f.call(colHasPipe_1);
28138
28439
  }
28139
28440
  finally { if (e_4) throw e_4.error; }
28140
28441
  }
@@ -28145,8 +28446,8 @@
28145
28446
  CrudListComponent.prototype.transform = function (pipe, asyncPipe, value) {
28146
28447
  return __awaiter(this, void 0, void 0, function () {
28147
28448
  var val, val;
28148
- return __generator(this, function (_b) {
28149
- switch (_b.label) {
28449
+ return __generator(this, function (_f) {
28450
+ switch (_f.label) {
28150
28451
  case 0:
28151
28452
  if (this.cachedTransforms[value]) {
28152
28453
  return [2 /*return*/, this.cachedTransforms[value]];
@@ -28154,7 +28455,7 @@
28154
28455
  if (!asyncPipe) return [3 /*break*/, 2];
28155
28456
  return [4 /*yield*/, pipe.transform(value)];
28156
28457
  case 1:
28157
- val = _b.sent();
28458
+ val = _f.sent();
28158
28459
  this.cachedTransforms[value] = val;
28159
28460
  return [2 /*return*/, val];
28160
28461
  case 2:
@@ -28248,7 +28549,7 @@
28248
28549
  return {};
28249
28550
  };
28250
28551
  CrudListComponent.prototype.getMinimizeData = function (model) {
28251
- var e_6, _b;
28552
+ var e_6, _f;
28252
28553
  if (isLiteralObject(model)) {
28253
28554
  if (model._dropdownvalue != null && model._dropdownvalue !== '') {
28254
28555
  return model[model._dropdownvalue];
@@ -28274,7 +28575,7 @@
28274
28575
  catch (e_6_1) { e_6 = { error: e_6_1 }; }
28275
28576
  finally {
28276
28577
  try {
28277
- if (model_1_1 && !model_1_1.done && (_b = model_1.return)) _b.call(model_1);
28578
+ if (model_1_1 && !model_1_1.done && (_f = model_1.return)) _f.call(model_1);
28278
28579
  }
28279
28580
  finally { if (e_6) throw e_6.error; }
28280
28581
  }
@@ -28422,7 +28723,7 @@
28422
28723
  };
28423
28724
  CrudListComponent.prototype.showSettingsPermission = function () {
28424
28725
  return __awaiter(this, void 0, void 0, function () {
28425
- return __generator(this, function (_b) {
28726
+ return __generator(this, function (_f) {
28426
28727
  if (this.creatingSearchInfo)
28427
28728
  return [2 /*return*/];
28428
28729
  this._showSettingsPermission = true;
@@ -28432,10 +28733,10 @@
28432
28733
  };
28433
28734
  CrudListComponent.prototype.createSearchSchema = function () {
28434
28735
  return __awaiter(this, void 0, void 0, function () {
28435
- var searchInfo, _b, _c, col, control, e_7_1, _loop_5, this_3, _d, _e, field;
28436
- var e_7, _f, _g, e_8, _h;
28437
- return __generator(this, function (_j) {
28438
- switch (_j.label) {
28736
+ var searchInfo, _f, _g, col, control, e_7_1, _loop_5, this_3, _h, _j, field;
28737
+ var e_7, _k, _l, e_8, _m;
28738
+ return __generator(this, function (_o) {
28739
+ switch (_o.label) {
28439
28740
  case 0:
28440
28741
  if (this.setting.cols == null) {
28441
28742
  return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
@@ -28445,14 +28746,14 @@
28445
28746
  searchInfo.schema = [];
28446
28747
  searchInfo.fieldDropdown = {};
28447
28748
  searchInfo.fieldSearchText = [];
28448
- _j.label = 1;
28749
+ _o.label = 1;
28449
28750
  case 1:
28450
- _j.trys.push([1, 6, 7, 8]);
28451
- _b = __values(this.setting.cols), _c = _b.next();
28452
- _j.label = 2;
28751
+ _o.trys.push([1, 6, 7, 8]);
28752
+ _f = __values(this.setting.cols), _g = _f.next();
28753
+ _o.label = 2;
28453
28754
  case 2:
28454
- if (!!_c.done) return [3 /*break*/, 5];
28455
- col = _c.value;
28755
+ if (!!_g.done) return [3 /*break*/, 5];
28756
+ col = _g.value;
28456
28757
  if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
28457
28758
  if (col.fullTextSearch) {
28458
28759
  if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
@@ -28465,9 +28766,9 @@
28465
28766
  }
28466
28767
  return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
28467
28768
  case 3:
28468
- control = _j.sent();
28769
+ control = _o.sent();
28469
28770
  if (control != null) {
28470
- (_g = searchInfo.schema).push.apply(_g, __spread(control));
28771
+ (_l = searchInfo.schema).push.apply(_l, __spread(control));
28471
28772
  }
28472
28773
  else {
28473
28774
  if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
@@ -28521,18 +28822,18 @@
28521
28822
  }
28522
28823
  }
28523
28824
  }
28524
- _j.label = 4;
28825
+ _o.label = 4;
28525
28826
  case 4:
28526
- _c = _b.next();
28827
+ _g = _f.next();
28527
28828
  return [3 /*break*/, 2];
28528
28829
  case 5: return [3 /*break*/, 8];
28529
28830
  case 6:
28530
- e_7_1 = _j.sent();
28831
+ e_7_1 = _o.sent();
28531
28832
  e_7 = { error: e_7_1 };
28532
28833
  return [3 /*break*/, 8];
28533
28834
  case 7:
28534
28835
  try {
28535
- if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
28836
+ if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
28536
28837
  }
28537
28838
  finally { if (e_7) throw e_7.error; }
28538
28839
  return [7 /*endfinally*/];
@@ -28552,15 +28853,15 @@
28552
28853
  };
28553
28854
  this_3 = this;
28554
28855
  try {
28555
- for (_d = __values(searchInfo.fieldSearchText), _e = _d.next(); !_e.done; _e = _d.next()) {
28556
- field = _e.value;
28856
+ for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
28857
+ field = _j.value;
28557
28858
  _loop_5(field);
28558
28859
  }
28559
28860
  }
28560
28861
  catch (e_8_1) { e_8 = { error: e_8_1 }; }
28561
28862
  finally {
28562
28863
  try {
28563
- if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
28864
+ if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
28564
28865
  }
28565
28866
  finally { if (e_8) throw e_8.error; }
28566
28867
  }
@@ -28626,15 +28927,19 @@
28626
28927
  }
28627
28928
  }, 20);
28628
28929
  };
28930
+ CrudListComponent.prototype.getTooltip = function (tooltip, field) {
28931
+ var result = tooltip && tooltip[field] ? tooltip[field] : null;
28932
+ return result;
28933
+ };
28629
28934
  return CrudListComponent;
28630
28935
  }(ComponentBase));
28631
28936
  CrudListComponent.decorators = [
28632
28937
  { type: i0.Component, args: [{
28633
28938
  // tslint:disable-next-line: component-selector
28634
28939
  selector: 'crud-list',
28635
- template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" (click)=\"add()\"></button>\r\n <button *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"hasTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <process-workflow-form #formBase [bussinessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\" [style.width]=\"widthCheckbox\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflow()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { 'ui-state-highlight': rowData._checked })\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"fas fa-history\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>",
28940
+ template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" (click)=\"add()\"></button>\r\n <button *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"hasTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <process-workflow-form #formBase [bussinessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\" style=\"z-index: 3 !important;\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.hidden-checkbox]=\"setting.hiddenCheckbox\" style=\"z-index: 3 !important;\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" style=\"z-index: 3 !important;\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.tricheckbox-custom-false]=\"checkedAll === false\"\r\n [style.width]=\"widthCheckbox\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" style=\"z-index: 3 !important;\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.hidden-checkbox]=\"setting.hiddenCheckbox\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileUpload'\">\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n style=\"z-index: 3 !important;\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflow()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" style=\"z-index: 3 !important;\" [class.sticky]=\"setting.stickyColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr class=\"table-row\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { 'ui-state-highlight': rowData._checked })\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.hidden-checkbox]=\"setting.hiddenCheckbox\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"fas fa-history\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n <button *ngIf=\"setting.showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'intWithoutMask'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{rowData[field] | currency:\"VND\"}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <ng-container *ngIf=\"!col.useTriStateCheckbox\">\r\n <p-checkbox class=\"boolean-data-type\" binary=\"true\" [pTooltip]=\"getTooltip(rowData._tooltip, field)\"\r\n tooltipPosition=\"top\" [disabled]=\"col.disableCheckBox\" [(ngModel)]=\"rowData[field]\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"col.useTriStateCheckbox\">\r\n <p-triStateCheckbox class=\"boolean-data-type\" binary=\"true\"\r\n [pTooltip]=\"getTooltip(rowData._tooltip, field)\" tooltipPosition=\"top\"\r\n [disabled]=\"col.disableCheckBox\" [(ngModel)]=\"rowData[field]\">\r\n </p-triStateCheckbox>\r\n </ng-container>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'fileUpload'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>\r\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\"\r\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\r\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\r\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\r\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\r\n </file-upload>\r\n\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\r\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\r\n [(ngModel)]=\"rowData.field\"\r\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\r\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\r\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\r\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [fileDataService]=\"fileSetting.control.fileDataService\" [maxFileSize]=\"fileSetting.control.maxFileSize\"\r\n [(value)]=\"rowData[field]\"\r\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\r\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\r\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\r\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\"\r\n (uploaded)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.UPLOADED)\">\r\n </file-manager>\r\n</ng-template>",
28636
28941
  providers: [i2$1.DecimalPipe, i2$1.DatePipe],
28637
- styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{min-width:80px;padding:0}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem!important;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}::ng-deep crud-list .advance-search-container{display:flex;justify-content:flex-end}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .main-container-search-inner .container-control>div{overflow:hidden}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
28942
+ styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{background-color:#fff;min-width:80px;padding:0;position:sticky!important;right:0!important;z-index:2!important}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.chkbox{left:0!important}.chkbox,.stt{background-color:#fff;position:sticky!important;z-index:2!important}.stt{left:35px!important}.stt.hidden-checkbox,.table-row>td:not(.chkbox) .stt,.title-row>th:not(.sticky):not(.chkbox) .stt{left:0!important}.table-row>tr:has(.ui-state-highlight) .stt{background-color:#a6d5fa}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem!important;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}::ng-deep crud-list .advance-search-container{display:flex;justify-content:flex-end}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .main-container-search-inner .container-control>div{overflow:hidden}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
28638
28943
  },] }
28639
28944
  ];
28640
28945
  CrudListComponent.ctorParameters = function () { return [
@@ -30551,31 +30856,67 @@
30551
30856
  };
30552
30857
  EntityPickerDataComponent.prototype.modifyGridInfo = function (gridInfo) {
30553
30858
  return __awaiter(this, void 0, void 0, function () {
30554
- var allow;
30555
- return __generator(this, function (_a) {
30556
- switch (_a.label) {
30859
+ var _a, _b, filter, value, allow;
30860
+ var e_1, _c;
30861
+ return __generator(this, function (_d) {
30862
+ switch (_d.label) {
30557
30863
  case 0:
30558
30864
  gridInfo.fields = this.advanceData.fields;
30865
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
30866
+ if (gridInfo.filters.length > 0) {
30867
+ try {
30868
+ for (_a = __values(gridInfo.filters), _b = _a.next(); !_b.done; _b = _a.next()) {
30869
+ filter = _b.value;
30870
+ value = this._commonService.tryParseJson(filter.value);
30871
+ if (value.valid) {
30872
+ if (filter.operator == exports.Operator.in) {
30873
+ filter.value = JSON.parse(filter.value).join(',');
30874
+ }
30875
+ else {
30876
+ filter.value = JSON.parse(filter.value).toString();
30877
+ }
30878
+ }
30879
+ }
30880
+ }
30881
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
30882
+ finally {
30883
+ try {
30884
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
30885
+ }
30886
+ finally { if (e_1) throw e_1.error; }
30887
+ }
30888
+ }
30889
+ }
30559
30890
  if (this.control.multiple) {
30560
30891
  if (this._value && this._value.length > 0) {
30561
- gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this._value));
30892
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
30893
+ gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notIn, this._value.join(',')));
30894
+ }
30895
+ else {
30896
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this._value));
30897
+ }
30562
30898
  }
30563
30899
  }
30564
30900
  else {
30565
30901
  if (this._value) {
30566
- gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this._value));
30902
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
30903
+ gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notEqual, this._value.toString()));
30904
+ }
30905
+ else {
30906
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this._value));
30907
+ }
30567
30908
  }
30568
30909
  }
30569
30910
  return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
30570
30911
  case 1:
30571
- _a.sent();
30912
+ _d.sent();
30572
30913
  if (!this.control.modifyFilter) return [3 /*break*/, 3];
30573
30914
  return [4 /*yield*/, this.control.modifyFilter(gridInfo.filters, this)];
30574
30915
  case 2:
30575
- allow = _a.sent();
30916
+ allow = _d.sent();
30576
30917
  if (allow === false)
30577
30918
  return [2 /*return*/, false];
30578
- _a.label = 3;
30919
+ _d.label = 3;
30579
30920
  case 3:
30580
30921
  if (this.setting.columnSetting.sortField) {
30581
30922
  gridInfo.sorts.push({
@@ -30740,13 +31081,45 @@
30740
31081
  };
30741
31082
  EntityPickerSelectedComponent.prototype.modifyGridInfo = function (gridInfo) {
30742
31083
  return __awaiter(this, void 0, void 0, function () {
30743
- return __generator(this, function (_a) {
30744
- switch (_a.label) {
31084
+ var _a, _b, filter, value;
31085
+ var e_1, _c;
31086
+ return __generator(this, function (_d) {
31087
+ switch (_d.label) {
30745
31088
  case 0:
30746
31089
  gridInfo.fields = this.advanceData.fields;
31090
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
31091
+ if (gridInfo.filters.length > 0) {
31092
+ try {
31093
+ for (_a = __values(gridInfo.filters), _b = _a.next(); !_b.done; _b = _a.next()) {
31094
+ filter = _b.value;
31095
+ value = this._commonService.tryParseJson(filter.value);
31096
+ if (value.valid) {
31097
+ if (filter.operator == exports.Operator.in) {
31098
+ filter.value = JSON.parse(filter.value).join(',');
31099
+ }
31100
+ else {
31101
+ filter.value = JSON.parse(filter.value).toString();
31102
+ }
31103
+ }
31104
+ }
31105
+ }
31106
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
31107
+ finally {
31108
+ try {
31109
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
31110
+ }
31111
+ finally { if (e_1) throw e_1.error; }
31112
+ }
31113
+ }
31114
+ }
30747
31115
  if (this.control.multiple) {
30748
31116
  if (this._value != null && this._value.length > 0) {
30749
- gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31117
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
31118
+ gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.in, this._value.join(',')));
31119
+ }
31120
+ else {
31121
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31122
+ }
30750
31123
  }
30751
31124
  else {
30752
31125
  return [2 /*return*/, false];
@@ -30754,7 +31127,12 @@
30754
31127
  }
30755
31128
  else {
30756
31129
  if (this._value != null) {
30757
- gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31130
+ if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
31131
+ gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.in, this._value.toString()));
31132
+ }
31133
+ else {
31134
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31135
+ }
30758
31136
  }
30759
31137
  else {
30760
31138
  return [2 /*return*/, false];
@@ -30762,7 +31140,7 @@
30762
31140
  }
30763
31141
  return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
30764
31142
  case 1:
30765
- _a.sent();
31143
+ _d.sent();
30766
31144
  return [2 /*return*/];
30767
31145
  }
30768
31146
  });
@@ -31587,10 +31965,11 @@
31587
31965
  }
31588
31966
  return FileExplorerItem;
31589
31967
  }());
31968
+ var FileExplorerItemType;
31590
31969
  (function (FileExplorerItemType) {
31591
31970
  FileExplorerItemType[FileExplorerItemType["File"] = 0] = "File";
31592
31971
  FileExplorerItemType[FileExplorerItemType["Folder"] = 1] = "Folder";
31593
- })(exports.FileExplorerItemType || (exports.FileExplorerItemType = {}));
31972
+ })(FileExplorerItemType || (FileExplorerItemType = {}));
31594
31973
 
31595
31974
  // fix for build prod
31596
31975
  var printJS$2 = printJS___namespace;
@@ -32546,24 +32925,7 @@
32546
32925
  if (dataSource === void 0) { dataSource = []; }
32547
32926
  this._dataSource = dataSource;
32548
32927
  this._oldValue = this._value;
32549
- var value = [];
32550
- dataSource.forEach(function (item) {
32551
- value.push(item.id);
32552
- if (item.name) {
32553
- item.nameWithoutExtension = item.name;
32554
- var index = item.name.lastIndexOf('.');
32555
- if (index > -1) {
32556
- item.nameWithoutExtension = item.name.substring(0, index);
32557
- }
32558
- if (item.extension) {
32559
- item.extension = item.extension.toLowerCase();
32560
- }
32561
- item.tailFile = item.name.substring(index);
32562
- item.tailFileUpper = item.tailFile.toUpperCase();
32563
- item.isFile = item.fileExplorerItemType == exports.FileExplorerItemType.File;
32564
- }
32565
- });
32566
- this._value = value;
32928
+ this._value = dataSource.map(function (item) { return item.id; });
32567
32929
  if (this._oldValue != null) {
32568
32930
  if (JSON.stringify(this._oldValue) != JSON.stringify(this._value)) {
32569
32931
  this.fireEventChange();
@@ -32683,10 +33045,6 @@
32683
33045
  show: false,
32684
33046
  formData: {}
32685
33047
  };
32686
- this.forms[this.formIds.signatureDetail] = {
32687
- header: 'Thông tin chữ ký số',
32688
- show: false,
32689
- };
32690
33048
  this.forms[this.formIds.fileVersionList] = {
32691
33049
  header: 'Danh sách phiên bản',
32692
33050
  show: false,
@@ -32777,7 +33135,7 @@
32777
33135
  };
32778
33136
  FileManagerComponent.prototype.modifyGridInfo = function (gridInfo) {
32779
33137
  return __awaiter(this, void 0, void 0, function () {
32780
- return __generator(this, function (_b) {
33138
+ return __generator(this, function (_a) {
32781
33139
  gridInfo.filters.push(this.newFilter('parentFolderId', exports.Operator.equal, this.data.currentFolderId));
32782
33140
  return [2 /*return*/];
32783
33141
  });
@@ -32786,7 +33144,7 @@
32786
33144
  FileManagerComponent.prototype.afterGetData = function () {
32787
33145
  return __awaiter(this, void 0, void 0, function () {
32788
33146
  var _loop_1, this_1, ind;
32789
- return __generator(this, function (_b) {
33147
+ return __generator(this, function (_a) {
32790
33148
  _loop_1 = function (ind) {
32791
33149
  var item = this_1.model.dataSource[ind];
32792
33150
  if (this_1._fileExplorerService.supportDigitalSignature(item.name)) {
@@ -32797,7 +33155,7 @@
32797
33155
  }
32798
33156
  });
32799
33157
  }
32800
- if (item.fileExplorerItemType === exports.FileExplorerItemType.Folder) {
33158
+ if (item.fileExplorerItemType === FileExplorerItemType.Folder) {
32801
33159
  item.class = '';
32802
33160
  }
32803
33161
  if (item.extension) {
@@ -32959,7 +33317,7 @@
32959
33317
  FileManagerComponent.prototype.openObject = function (explorerItem) {
32960
33318
  return __awaiter(this, void 0, void 0, function () {
32961
33319
  var canViewOnline;
32962
- return __generator(this, function (_b) {
33320
+ return __generator(this, function (_a) {
32963
33321
  if (explorerItem.isFile) {
32964
33322
  canViewOnline = this._fileObjectService.isSupportedViewOnline(explorerItem.name);
32965
33323
  if (canViewOnline) {
@@ -33000,7 +33358,7 @@
33000
33358
  FileManagerComponent.prototype.download = function (explorerItem) {
33001
33359
  return __awaiter(this, void 0, void 0, function () {
33002
33360
  var model;
33003
- return __generator(this, function (_b) {
33361
+ return __generator(this, function (_a) {
33004
33362
  model = this._downloadLinkService.getGenerateDownloadLinkModel(explorerItem);
33005
33363
  this._downloadLinkService.download(model);
33006
33364
  return [2 /*return*/];
@@ -33012,7 +33370,7 @@
33012
33370
  return __awaiter(this, void 0, void 0, function () {
33013
33371
  var selectedItems, hasItems, arrModel;
33014
33372
  var _this = this;
33015
- return __generator(this, function (_b) {
33373
+ return __generator(this, function (_a) {
33016
33374
  selectedItems = this.model.selectedItems;
33017
33375
  hasItems = selectedItems && selectedItems.length;
33018
33376
  if (hasItems) {
@@ -33162,13 +33520,13 @@
33162
33520
  return __awaiter(this, void 0, void 0, function () {
33163
33521
  var rs, breadcrumbs;
33164
33522
  var _this = this;
33165
- return __generator(this, function (_b) {
33166
- switch (_b.label) {
33523
+ return __generator(this, function (_a) {
33524
+ switch (_a.label) {
33167
33525
  case 0:
33168
33526
  if (!this.data.currentFolderId) return [3 /*break*/, 2];
33169
33527
  return [4 /*yield*/, this._folderService.getFullFolderPath(this.data.currentFolderId)];
33170
33528
  case 1:
33171
- rs = _b.sent();
33529
+ rs = _a.sent();
33172
33530
  if (rs.success) {
33173
33531
  breadcrumbs = rs.data.map(function (f) {
33174
33532
  var item = {
@@ -33190,7 +33548,7 @@
33190
33548
  return [3 /*break*/, 3];
33191
33549
  case 2:
33192
33550
  this.data.breadcrumbs = [];
33193
- _b.label = 3;
33551
+ _a.label = 3;
33194
33552
  case 3: return [2 /*return*/];
33195
33553
  }
33196
33554
  });
@@ -33200,75 +33558,36 @@
33200
33558
  // TODO: Lưu ý xử lý trường double click vào nút
33201
33559
  FileManagerComponent.prototype.signFile = function (file) {
33202
33560
  var _this = this;
33203
- this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số văn bản này?').then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
33204
- var sourceFileId, sourceFile_1, rsConvert, e_1;
33205
- var _this = this;
33206
- return __generator(this, function (_b) {
33207
- switch (_b.label) {
33208
- case 0:
33209
- if (!rs) return [3 /*break*/, 5];
33210
- sourceFileId = file.id;
33211
- sourceFile_1 = file;
33212
- if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 4];
33213
- _b.label = 1;
33214
- case 1:
33215
- _b.trys.push([1, 3, , 4]);
33216
- return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
33217
- id: sourceFileId,
33218
- name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33219
- folderId: file.parentFolderId,
33220
- ownerType: this._userService.getCurrentUser().userId.toString(),
33221
- })];
33222
- case 2:
33223
- rsConvert = _b.sent();
33224
- if (!rsConvert || !rsConvert.success) {
33225
- this._notifierService.showWarning("C\u00F3 l\u1ED7i x\u1EA3y ra khi chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf \u0111\u1EC3 k\u00FD. Vui l\u00F2ng th\u1EED l\u1EA1i sau");
33226
- return [2 /*return*/];
33227
- }
33228
- else {
33229
- this._notifierService.showSuccess("Chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf th\u00E0nh c\u00F4ng");
33230
- sourceFileId = rsConvert.data;
33231
- sourceFile_1 = { id: sourceFileId };
33232
- this._triggerProcessData();
33233
- }
33234
- return [3 /*break*/, 4];
33235
- case 3:
33236
- e_1 = _b.sent();
33237
- this._notifierService.showWarning("C\u00F3 l\u1ED7i x\u1EA3y ra khi chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf \u0111\u1EC3 k\u00FD. Vui l\u00F2ng th\u1EED l\u1EA1i sau");
33238
- return [2 /*return*/];
33239
- case 4:
33240
- this._fileExplorerService.generateLinkDownload({
33241
- fileId: sourceFileId,
33242
- }).then(function (rs) {
33243
- var url = _this._downloadLinkService.getDownloadForSignUrl(rs.data);
33244
- var prms = {};
33245
- prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + _this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
33246
- prms['SessionId'] = '';
33247
- prms['FileName'] = url;
33248
- // tslint:disable-next-line: variable-name
33249
- var json_prms = JSON.stringify(prms);
33250
- vgca_sign_approved(json_prms, function (result) {
33251
- var resultObj = JSON.parse(result);
33252
- if (resultObj.FileServer != '') {
33253
- _this._fileExplorerService.saveSignedFile({
33254
- sourceFile: sourceFile_1,
33255
- tempFileId: resultObj.FileServer,
33256
- }).then(function (rss) {
33257
- _this._triggerProcessData();
33258
- _this._notifierService.showSuccess('Ký số thành công');
33259
- });
33260
- }
33561
+ this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số văn bản này?').then(function (rs) {
33562
+ if (rs) {
33563
+ _this._fileExplorerService.generateLinkDownload({
33564
+ fileId: file.id
33565
+ }).then(function (rs) {
33566
+ var url = _this._fileExplorerService.getDownloadForSignUrl(rs.data);
33567
+ var prms = {};
33568
+ prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/Signature/SavePhysicalSignedFile";
33569
+ prms['SessionId'] = '';
33570
+ prms['FileName'] = url;
33571
+ // tslint:disable-next-line: variable-name
33572
+ var json_prms = JSON.stringify(prms);
33573
+ vgca_sign_file(json_prms, function (result) {
33574
+ var resultObj = JSON.parse(result);
33575
+ if (resultObj.FileServer != '') {
33576
+ _this._fileExplorerService.saveSignedFile({
33577
+ sourceFile: file,
33578
+ tempFileId: resultObj.FileServer
33579
+ }).then(function (rss) {
33580
+ _this._notifierService.showSuccess('Ký số thành công');
33261
33581
  });
33262
- });
33263
- _b.label = 5;
33264
- case 5: return [2 /*return*/];
33265
- }
33266
- });
33267
- }); });
33582
+ }
33583
+ });
33584
+ });
33585
+ }
33586
+ });
33268
33587
  };
33269
33588
  FileManagerComponent.prototype.shareFolder = function (file) {
33270
33589
  return __awaiter(this, void 0, void 0, function () {
33271
- return __generator(this, function (_b) {
33590
+ return __generator(this, function (_a) {
33272
33591
  this.forms.shareFolder.data = file;
33273
33592
  this.forms.shareFolder.show = true;
33274
33593
  return [2 /*return*/];
@@ -33277,7 +33596,7 @@
33277
33596
  };
33278
33597
  FileManagerComponent.prototype.shareFile = function (file) {
33279
33598
  return __awaiter(this, void 0, void 0, function () {
33280
- return __generator(this, function (_b) {
33599
+ return __generator(this, function (_a) {
33281
33600
  this.forms.shareFile.data = file;
33282
33601
  this.forms.shareFile.show = true;
33283
33602
  return [2 /*return*/];
@@ -33291,154 +33610,19 @@
33291
33610
  };
33292
33611
  FileManagerComponent.prototype.viewListSign = function (e, signatures) {
33293
33612
  e.stopPropagation();
33294
- this.model.advanceData = signatures;
33613
+ this.forms.signatureDetail.data = signatures;
33295
33614
  this.forms.signatureDetail.show = true;
33296
33615
  };
33297
33616
  FileManagerComponent.prototype.onRowSelect = function (evt) {
33298
33617
  this.onSelected.emit(this.model.selectedItems);
33299
33618
  };
33300
- FileManagerComponent.prototype.signMultiple = function () {
33301
- return __awaiter(this, void 0, void 0, function () {
33302
- var selectedItems, hasItems;
33303
- return __generator(this, function (_b) {
33304
- selectedItems = this.model.selectedItems;
33305
- hasItems = selectedItems && selectedItems.length;
33306
- if (hasItems) {
33307
- if (selectedItems.length == 1) {
33308
- this.signFile(selectedItems[0]);
33309
- }
33310
- else {
33311
- this.signFileMultiple(selectedItems);
33312
- }
33313
- }
33314
- return [2 /*return*/];
33315
- });
33316
- });
33317
- };
33318
- FileManagerComponent.prototype.signFileMultiple = function (lstFile) {
33319
- return __awaiter(this, void 0, void 0, function () {
33320
- var prms, rs, lstFile_1, lstFile_1_1, file, sourceFileId, sourceFile, rsConvert, result, url, e_2, result, url, e_3_1, json_prms;
33321
- var e_3, _b;
33322
- var _this = this;
33323
- return __generator(this, function (_c) {
33324
- switch (_c.label) {
33325
- case 0:
33326
- prms = {};
33327
- prms['Files'] = [];
33328
- prms['FileUploadHandler'] = this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
33329
- prms['SessionId'] = '';
33330
- return [4 /*yield*/, this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số các văn bản này?')];
33331
- case 1:
33332
- rs = _c.sent();
33333
- if (!rs) return [3 /*break*/, 18];
33334
- _c.label = 2;
33335
- case 2:
33336
- _c.trys.push([2, 15, 16, 17]);
33337
- lstFile_1 = __values(lstFile), lstFile_1_1 = lstFile_1.next();
33338
- _c.label = 3;
33339
- case 3:
33340
- if (!!lstFile_1_1.done) return [3 /*break*/, 14];
33341
- file = lstFile_1_1.value;
33342
- if (!this._fileObjectService.isTypeFileKySo(file.name))
33343
- return [3 /*break*/, 13];
33344
- sourceFileId = file.id;
33345
- sourceFile = file;
33346
- if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 11];
33347
- _c.label = 4;
33348
- case 4:
33349
- _c.trys.push([4, 9, , 10]);
33350
- return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
33351
- id: sourceFileId,
33352
- name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33353
- folderId: file.parentFolderId,
33354
- ownerType: this._userService.getCurrentUser().userId.toString(),
33355
- })];
33356
- case 5:
33357
- rsConvert = _c.sent();
33358
- if (!(!rsConvert || !rsConvert.success)) return [3 /*break*/, 6];
33359
- this._notifierService.showWarning("C\u00F3 l\u1ED7i x\u1EA3y ra khi chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf \u0111\u1EC3 k\u00FD. Vui l\u00F2ng th\u1EED l\u1EA1i sau");
33360
- return [3 /*break*/, 13];
33361
- case 6: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: rsConvert.data })];
33362
- case 7:
33363
- result = _c.sent();
33364
- if (result.success) {
33365
- url = this._downloadLinkService.getDownloadForSignUrl(result.data);
33366
- prms['Files'].push({
33367
- "FileID": rsConvert.data,
33368
- "FileName": this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33369
- "URL": url,
33370
- });
33371
- }
33372
- _c.label = 8;
33373
- case 8: return [3 /*break*/, 10];
33374
- case 9:
33375
- e_2 = _c.sent();
33376
- this._notifierService.showWarning("C\u00F3 l\u1ED7i x\u1EA3y ra khi chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf \u0111\u1EC3 k\u00FD. Vui l\u00F2ng th\u1EED l\u1EA1i sau");
33377
- return [3 /*break*/, 13];
33378
- case 10: return [3 /*break*/, 13];
33379
- case 11: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: sourceFileId })];
33380
- case 12:
33381
- result = _c.sent();
33382
- if (result.success) {
33383
- url = this._downloadLinkService.getDownloadForSignUrl(result.data);
33384
- prms['Files'].push({
33385
- "FileID": sourceFileId,
33386
- "FileName": file.name,
33387
- "URL": url,
33388
- });
33389
- }
33390
- _c.label = 13;
33391
- case 13:
33392
- lstFile_1_1 = lstFile_1.next();
33393
- return [3 /*break*/, 3];
33394
- case 14: return [3 /*break*/, 17];
33395
- case 15:
33396
- e_3_1 = _c.sent();
33397
- e_3 = { error: e_3_1 };
33398
- return [3 /*break*/, 17];
33399
- case 16:
33400
- try {
33401
- if (lstFile_1_1 && !lstFile_1_1.done && (_b = lstFile_1.return)) _b.call(lstFile_1);
33402
- }
33403
- finally { if (e_3) throw e_3.error; }
33404
- return [7 /*endfinally*/];
33405
- case 17:
33406
- json_prms = JSON.stringify(prms);
33407
- vgca_sign_files(json_prms, function (result) {
33408
- var _a;
33409
- var resultObj = JSON.parse(result);
33410
- if ((_a = resultObj.Files) === null || _a === void 0 ? void 0 : _a.length) {
33411
- resultObj.Files.forEach(function (item) { return __awaiter(_this, void 0, void 0, function () {
33412
- var _this = this;
33413
- return __generator(this, function (_b) {
33414
- this._fileExplorerService.saveSignedFile({
33415
- sourceFile: { id: item.FileID },
33416
- tempFileId: item.FileSignedURL,
33417
- }).then(function (rss) {
33418
- _this._triggerProcessData();
33419
- _this._notifierService.showSuccess('Ký số thành công');
33420
- });
33421
- return [2 /*return*/];
33422
- });
33423
- }); });
33424
- }
33425
- ;
33426
- });
33427
- _c.label = 18;
33428
- case 18:
33429
- ;
33430
- return [2 /*return*/];
33431
- }
33432
- });
33433
- });
33434
- };
33435
33619
  return FileManagerComponent;
33436
33620
  }(DataListBase));
33437
33621
  FileManagerComponent.decorators = [
33438
33622
  { type: i0.Component, args: [{
33439
33623
  // tslint:disable-next-line: component-selector
33440
33624
  selector: 'file-manager',
33441
- template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"p-grid fm-toolbar\">\r\n <div class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n <div *ngIf=\"!readonly && rootFolderId\" class=\"fm-toolbar-buttons\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c\" tooltipPosition=\"top\"\r\n icon=\"pi pi-folder\" class=\"p-button-text p-button-rounded\" iconPos=\"left\" (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i l\u00EAn\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-rounded p-button-text p-button-primary\" (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\" iconPos=\"left\"\r\n (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <ng-container *ngIf=\"canSetMove()\">\r\n <button class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"\u0110\u1EB7t \u1EDF \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\" iconPos=\"left\"\r\n (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button icon=\"pi pi-undo\" pButton class=\"p-button-rounded p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF qua\" tooltipPosition=\"top\" (click)=\"cancelMove()\">\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasSelect()\">\r\n <button class=\"p-button-rounded p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n <button *ngIf=\"!control.uploadOnly\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"K\u00FD s\u1ED1 nhi\u1EC1u\" tooltipPosition=\"top\" icon=\"fas fa-signature\" iconPos=\"left\"\r\n label=\"K\u00FD s\u1ED1 nhi\u1EC1u\" (click)=\"signMultiple()\">\r\n </button>\r\n <button pButton type=\"button\" pTooltip=\"{{ 'X\u00F3a' | translate }}\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\" iconPos=\"left\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" class=\"--auto-height-content --no-wrapper-padding\"\r\n (onReload)=\"_triggerProcessData($event)\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\"\r\n (click)=\"openObject(rowData)\">\r\n </span>\r\n\r\n <span class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n {{rowData.name}}\r\n <div *ngIf=\"rowData.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\"\r\n pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"nfl-toolbar\">\r\n <button *ngIf=\"!readonly\" type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"fas fa-cloud-upload-alt\" label=\"T\u1EA3i l\u00EAn\" (click)=\"selectFile()\"></button>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon\">\r\n </span>\r\n <a class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n <span>{{rowData.name}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n </div>\r\n\r\n <div class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\" pTooltip=\"X\u00F3a\"\r\n tooltipPosition=\"top\" icon=\"pi pi-trash\" (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p-fileUpload #fileControl [name]=\"fileInForm\" mode=\"basic\" [ngStyle]=\"{'display': 'none'}\" [chooseLabel]=\"chooseLabel\"\r\n [multiple]=\"control?control.multiple:false\" [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" [readonly]=\"readonly\" (onClose)=\"closeFileViewer()\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<!--<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>-->\r\n\r\n<!-- Xem ch\u1EEF k\u00FD s\u1ED1 -->\r\n<tn-dialog *ngIf=\"forms.signatureDetail.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.signatureDetail.header | translate\" [popupSize]=\"forms[formIds.signatureDetail].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.signatureDetail)\">\r\n <signature-detail [parentModel]=\"model\" [parentContext]=\"context\">\r\n </signature-detail>\r\n</tn-dialog>",
33625
+ template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"p-grid fm-toolbar\">\r\n <div class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n <div *ngIf=\"!readonly && rootFolderId\" class=\"fm-toolbar-buttons\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c\" tooltipPosition=\"top\"\r\n icon=\"pi pi-folder\" class=\"p-button-text p-button-rounded\" iconPos=\"left\" (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i l\u00EAn\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-rounded p-button-text p-button-primary\" (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\" iconPos=\"left\"\r\n (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <ng-container *ngIf=\"canSetMove()\">\r\n <button class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"\u0110\u1EB7t \u1EDF \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\" iconPos=\"left\"\r\n (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button icon=\"pi pi-undo\" pButton class=\"p-button-rounded p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF qua\" tooltipPosition=\"top\" (click)=\"cancelMove()\">\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasSelect()\">\r\n <button class=\"p-button-rounded p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n\r\n <button pButton type=\"button\" pTooltip=\"{{ 'X\u00F3a' | translate }}\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\" iconPos=\"left\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" class=\"--auto-height-content --no-wrapper-padding\"\r\n (onReload)=\"_triggerProcessData($event)\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\"\r\n (click)=\"openObject(rowData)\">\r\n </span>\r\n\r\n <span class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n {{rowData.name}}\r\n <div *ngIf=\"rowData.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\"\r\n pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"nfl-toolbar\">\r\n <button *ngIf=\"!readonly\" type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"fas fa-cloud-upload-alt\" label=\"T\u1EA3i l\u00EAn\" (click)=\"selectFile()\"></button>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon\">\r\n </span>\r\n <a class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n <span>{{rowData.name}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n </div>\r\n\r\n <div class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\" pTooltip=\"X\u00F3a\"\r\n tooltipPosition=\"top\" icon=\"pi pi-trash\" (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p-fileUpload #fileControl [name]=\"fileInForm\" mode=\"basic\" [ngStyle]=\"{'display': 'none'}\" [chooseLabel]=\"chooseLabel\"\r\n [multiple]=\"control.multiple\" [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" [readonly]=\"readonly\" (onClose)=\"closeFileViewer()\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<!--<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>\r\n\r\n<signature-detail *ngIf=\"forms.signatureDetail.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.signatureDetail.formData\">\r\n</signature-detail> -->",
33442
33626
  providers: [
33443
33627
  {
33444
33628
  provide: forms.NG_VALUE_ACCESSOR,
@@ -34707,9 +34891,11 @@
34707
34891
  this.decimalPlaces = 2;
34708
34892
  this.viewMode = false;
34709
34893
  this.inputStyleClass = '';
34894
+ this.thousandSeperator = '.';
34710
34895
  this.onFocus = new i0.EventEmitter();
34711
34896
  this.onBlur = new i0.EventEmitter();
34712
34897
  this.onChanged = new i0.EventEmitter();
34898
+ this.locale = 'vi-VN';
34713
34899
  }
34714
34900
  Object.defineProperty(MaskComponent.prototype, "placeholder", {
34715
34901
  set: function (value) {
@@ -34721,10 +34907,11 @@
34721
34907
  configurable: true
34722
34908
  });
34723
34909
  MaskComponent.prototype.ngOnInit = function () {
34910
+ this.locale = this.thousandSeperator == '.' ? 'vi-VN' : 'en-US';
34724
34911
  };
34725
34912
  MaskComponent.prototype.writeValue = function (obj) {
34726
34913
  if (obj) {
34727
- this.model = this._numberPipe.transform(obj, '', 'vi-VN');
34914
+ this.model = this._numberPipe.transform(obj, '', this.locale);
34728
34915
  this.value = Number(this.model);
34729
34916
  }
34730
34917
  else if (obj === 0) {
@@ -34742,7 +34929,7 @@
34742
34929
  return 'separator.0';
34743
34930
  };
34744
34931
  MaskComponent.prototype.getThousandSeperator = function () {
34745
- return '.';
34932
+ return this.thousandSeperator || '.';
34746
34933
  };
34747
34934
  MaskComponent.prototype.handleFocus = function () {
34748
34935
  this.onFocus.emit(this.value);
@@ -34774,7 +34961,7 @@
34774
34961
  }
34775
34962
  };
34776
34963
  MaskComponent.prototype.numberToStringVN = function (number) {
34777
- return this._numberPipe.transform(number, '', 'vi-VN');
34964
+ return this._numberPipe.transform(number, '', this.locale);
34778
34965
  };
34779
34966
  MaskComponent.prototype.registerOnChange = function (fn) {
34780
34967
  this.onChange = fn;
@@ -34819,6 +35006,7 @@
34819
35006
  decimalPlaces: [{ type: i0.Input }],
34820
35007
  viewMode: [{ type: i0.Input }],
34821
35008
  inputStyleClass: [{ type: i0.Input }],
35009
+ thousandSeperator: [{ type: i0.Input }],
34822
35010
  onFocus: [{ type: i0.Output }],
34823
35011
  onBlur: [{ type: i0.Output }],
34824
35012
  onChanged: [{ type: i0.Output }]
@@ -45326,8 +45514,10 @@
45326
45514
  },] }
45327
45515
  ];
45328
45516
 
45517
+ var moment$1 = moment___namespace;
45329
45518
  var TnDatePipe = /** @class */ (function () {
45330
- function TnDatePipe() {
45519
+ function TnDatePipe(format) {
45520
+ this.format = format;
45331
45521
  }
45332
45522
  TnDatePipe.prototype.addZero = function (value) {
45333
45523
  if (value < 10)
@@ -45337,6 +45527,8 @@
45337
45527
  TnDatePipe.prototype.transform = function (value, args) {
45338
45528
  if (value == null)
45339
45529
  return '';
45530
+ if (this.format)
45531
+ return moment$1(value).format(this.format);
45340
45532
  var date = new Date(value);
45341
45533
  return this.addZero(date.getHours()) + ":" + this.addZero(date.getMinutes()) + ":" + this.addZero(date.getSeconds()) + ", Ng\u00E0y " + this.addZero(date.getDate()) + "/" + this.addZero(date.getMonth() + 1) + "/" + date.getFullYear();
45342
45534
  };
@@ -45346,7 +45538,10 @@
45346
45538
  { type: i0.Pipe, args: [{
45347
45539
  name: 'tnDate'
45348
45540
  },] }
45349
- ];
45541
+ ];
45542
+ TnDatePipe.ctorParameters = function () { return [
45543
+ { type: undefined, decorators: [{ type: i0.Inject, args: [i0.LOCALE_ID,] }] }
45544
+ ]; };
45350
45545
 
45351
45546
  var UserFormatPipe = /** @class */ (function () {
45352
45547
  function UserFormatPipe(_userService) {
@@ -45511,70 +45706,6 @@
45511
45706
  { type: UserService }
45512
45707
  ]; };
45513
45708
 
45514
- // fix for build prod
45515
- var moment$1 = moment___default['default'];
45516
- var SignatureDetailComponent = /** @class */ (function (_super) {
45517
- __extends(SignatureDetailComponent, _super);
45518
- function SignatureDetailComponent(injector) {
45519
- return _super.call(this, injector) || this;
45520
- }
45521
- SignatureDetailComponent.prototype.ngOnInit = function () {
45522
- this.model.data = this.parentModel.advanceData;
45523
- this.buildTree();
45524
- };
45525
- SignatureDetailComponent.prototype.buildTree = function () {
45526
- var nodes = [];
45527
- for (var ind in this.model.data) {
45528
- var item = this.model.data[ind];
45529
- var childNodes = { expanded: true, children: [] };
45530
- childNodes.label = "" + item.reason;
45531
- childNodes.expandedIcon = 'fas fa-signature';
45532
- childNodes.collapsedIcon = 'fas fa-signature';
45533
- childNodes.leaf = false;
45534
- if (item.reason) {
45535
- childNodes.children.push({
45536
- label: 'Người ký: ' + item.certificate.subject.nameOfSigner,
45537
- expandedIcon: 'fas fa-user-tag',
45538
- collapsedIcon: 'fas fa-user-tag',
45539
- leaf: true
45540
- });
45541
- }
45542
- childNodes.children.push({
45543
- label: 'Đơn vị: ' + item.certificate.subject.organizationUnit + ' - ' + item.certificate.subject.organization,
45544
- expandedIcon: 'fas fa-building',
45545
- collapsedIcon: 'fas fa-building',
45546
- leaf: true
45547
- });
45548
- childNodes.children.push({
45549
- label: 'Chứng thư cấp bởi: ' + item.certificate.issuerDN.nameOfIssuer,
45550
- expandedIcon: 'fas fa-certificate',
45551
- collapsedIcon: 'fas fa-certificate',
45552
- leaf: true
45553
- });
45554
- childNodes.children.push({
45555
- label: 'Thời gian ký: ' + moment$1(item.signDate).format('D/MM/Y hh:mm:ss Z'),
45556
- expandedIcon: 'fas fa-clock',
45557
- collapsedIcon: 'fas fa-clock',
45558
- leaf: true
45559
- });
45560
- nodes.push(childNodes);
45561
- }
45562
- this.model.dataSource = nodes;
45563
- };
45564
- return SignatureDetailComponent;
45565
- }(ComponentBase));
45566
- SignatureDetailComponent.decorators = [
45567
- { type: i0.Component, args: [{
45568
- selector: 'signature-detail',
45569
- template: "<div class=\"tree-signature\">\r\n <p-tree [value]=\"model.dataSource\" [filter]=\"true\" [emptyMessage]=\"'Kh\u00F4ng c\u00F3 ch\u1EEF k\u00FD'\" styleClass=\"signature-tree\">\r\n </p-tree>\r\n</div>",
45570
- providers: [ComponentContextService],
45571
- styles: [":host::ng-deep .signature-tree{border:none;width:100%}:host::ng-deep .signature-tree .ui-treenode-icon{color:#888;padding-right:10px}:host::ng-deep .signature-tree span.fas.fa-signature+span{font-weight:700}:host::ng-deep .signature-tree span.ui-treenode-icon.fas.fa-signature{color:#212529!important;padding-left:5px}:host::ng-deep .signature-tree span.ui-tree-toggler{color:#212529!important}"]
45572
- },] }
45573
- ];
45574
- SignatureDetailComponent.ctorParameters = function () { return [
45575
- { type: i0.Injector }
45576
- ]; };
45577
-
45578
45709
  function coreDeclaration() {
45579
45710
  return [
45580
45711
  AddressComponent,
@@ -45704,8 +45835,7 @@
45704
45835
  FilePickerDialogComponent,
45705
45836
  AddNewsComponent,
45706
45837
  CommonDashboardComponent,
45707
- NotFoundComponent,
45708
- SignatureDetailComponent
45838
+ NotFoundComponent
45709
45839
  ];
45710
45840
  }
45711
45841
  function coreModuleImport() {
@@ -47258,6 +47388,67 @@
47258
47388
  { type: ModuleConfigService }
47259
47389
  ]; };
47260
47390
 
47391
+ var OrganizationBaseService = /** @class */ (function (_super) {
47392
+ __extends(OrganizationBaseService, _super);
47393
+ function OrganizationBaseService(http, injector, _moduleConfigService) {
47394
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.organizationEndpoint + "/organization") || this;
47395
+ _this.ORGANIZATION_INFO_KEY = 'organization_info';
47396
+ _this.RETRY_COUNT = 0;
47397
+ _this.REPLAY_COUNT = 10;
47398
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.organizationEndpoint;
47399
+ _this._moduleConfig = _moduleConfigService.getConfig();
47400
+ _this.organizationEndpoint = _this._moduleConfig.environment.apiDomain.organizationEndpoint + "/organization/";
47401
+ return _this;
47402
+ }
47403
+ OrganizationBaseService.prototype.getOrganizationInfo = function (organizationId) {
47404
+ var _this = this;
47405
+ var storageItem = localStorage.getItem(this.ORGANIZATION_INFO_KEY + "_" + organizationId);
47406
+ var organization = JSON.parse(storageItem);
47407
+ if (organization) {
47408
+ return new Promise(function (resolve, reject) { return resolve(organization); });
47409
+ }
47410
+ else {
47411
+ return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
47412
+ var svUrl, result;
47413
+ var _this = this;
47414
+ return __generator(this, function (_a) {
47415
+ switch (_a.label) {
47416
+ case 0:
47417
+ if (!(organizationId == null)) return [3 /*break*/, 1];
47418
+ reject({});
47419
+ return [3 /*break*/, 3];
47420
+ case 1:
47421
+ if (!(organizationId > 0)) return [3 /*break*/, 3];
47422
+ svUrl = this.serviceUri + "/GetOrganizationInfo?id=" + organizationId;
47423
+ return [4 /*yield*/, this._http.get(svUrl).pipe(operators.shareReplay(this.REPLAY_COUNT), operators.retry(this.RETRY_COUNT), operators.map(function (repsonse) {
47424
+ // save response to local storage here
47425
+ localStorage.setItem(_this.ORGANIZATION_INFO_KEY + "_" + repsonse.data.id, JSON.stringify(repsonse.data));
47426
+ return repsonse.data;
47427
+ }, operators.catchError(function (err) { return _this.handleError(err, _this._injector); }))).toPromise()];
47428
+ case 2:
47429
+ result = _a.sent();
47430
+ resolve(result);
47431
+ _a.label = 3;
47432
+ case 3: return [2 /*return*/];
47433
+ }
47434
+ });
47435
+ }); });
47436
+ }
47437
+ };
47438
+ return OrganizationBaseService;
47439
+ }(BaseService));
47440
+ OrganizationBaseService.ɵprov = i0.ɵɵdefineInjectable({ factory: function OrganizationBaseService_Factory() { return new OrganizationBaseService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: OrganizationBaseService, providedIn: "root" });
47441
+ OrganizationBaseService.decorators = [
47442
+ { type: i0.Injectable, args: [{
47443
+ providedIn: 'root'
47444
+ },] }
47445
+ ];
47446
+ OrganizationBaseService.ctorParameters = function () { return [
47447
+ { type: i1$1.HttpClient },
47448
+ { type: i0.Injector },
47449
+ { type: ModuleConfigService }
47450
+ ]; };
47451
+
47261
47452
  var ErrorType = /** @class */ (function () {
47262
47453
  function ErrorType() {
47263
47454
  }
@@ -47386,22 +47577,64 @@
47386
47577
  return TemplateTextMany;
47387
47578
  }());
47388
47579
 
47389
- var ServiceRequestModel = /** @class */ (function () {
47390
- function ServiceRequestModel() {
47391
- this.service = '';
47392
- this.entityInstanceId = '';
47393
- this.parent = null;
47394
- this.serviceCode = '';
47395
- this.entity = '';
47396
- this.entityKey = '';
47397
- }
47398
- return ServiceRequestModel;
47399
- }());
47400
-
47401
- var FileVersionDTO = /** @class */ (function () {
47402
- function FileVersionDTO() {
47580
+ var FileUploadSetting = /** @class */ (function () {
47581
+ function FileUploadSetting(init) {
47582
+ this.entityKeyField = 'id';
47583
+ this.readonly = false;
47584
+ this.disabled = false;
47585
+ this.sharedFolderType = exports.SharedFolderType.Tempt;
47586
+ this.mode = exports.FileUploadMode.usingServiceFile;
47587
+ this.layout = exports.EnumFileLayout.LIST;
47588
+ this.multiple = false;
47589
+ this.uploadOnly = false;
47590
+ this.useBreadcrumbs = true;
47591
+ this.useSignature = true;
47592
+ this.control = new FileUploadControlSchema();
47593
+ for (var key in init) {
47594
+ this[key] = init[key];
47595
+ }
47596
+ this.control = new FileUploadControlSchema({
47597
+ serviceCode: this.serviceCode,
47598
+ entity: this.entity,
47599
+ entityKeyField: this.entityKeyField,
47600
+ readonly: this.readonly,
47601
+ accept: this.accept,
47602
+ mode: this.mode,
47603
+ layout: this.layout,
47604
+ sharedFolderType: this.sharedFolderType,
47605
+ fileDataService: this.fileDataService,
47606
+ multiple: this.multiple,
47607
+ disabled: this.disabled
47608
+ });
47609
+ }
47610
+ return FileUploadSetting;
47611
+ }());
47612
+ var FileManagerSetting = /** @class */ (function () {
47613
+ function FileManagerSetting(init) {
47614
+ this.mode = exports.FileManagerMode.multiple;
47615
+ this.layout = exports.EnumFileLayout.SIMPLE;
47616
+ this.readonly = true;
47617
+ this.inTaiLieu = false;
47618
+ this.inTaiLieuChung = false;
47619
+ this.copyToFolderId = '';
47620
+ this.entityKeyField = 'id';
47621
+ this.control = new FileManagerControlSchema();
47622
+ for (var key in init) {
47623
+ this[key] = init[key];
47624
+ }
47625
+ this.control = new FileManagerControlSchema({
47626
+ serviceCode: this.serviceCode,
47627
+ entity: this.entity,
47628
+ entityKeyField: this.entityKeyField,
47629
+ readonly: this.readonly,
47630
+ accept: this.accept,
47631
+ mode: this.mode,
47632
+ layout: this.layout,
47633
+ fileDataService: this.fileDataService,
47634
+ rootFolderName: this.rootFolderName
47635
+ });
47403
47636
  }
47404
- return FileVersionDTO;
47637
+ return FileManagerSetting;
47405
47638
  }());
47406
47639
 
47407
47640
  (function (PermissionBase) {
@@ -47759,18 +47992,16 @@
47759
47992
  exports.FILE_TYPES = FILE_TYPES;
47760
47993
  exports.FieldDefineIsWorkflowControl = FieldDefineIsWorkflowControl;
47761
47994
  exports.FileDataService = FileDataService;
47762
- exports.FileExplorerItem = FileExplorerItem;
47763
- exports.FileExplorerNewService = FileExplorerNewService;
47764
47995
  exports.FileExplorerService = FileExplorerService;
47765
47996
  exports.FileManagerComponent = FileManagerComponent;
47766
47997
  exports.FileManagerControlSchema = FileManagerControlSchema;
47998
+ exports.FileManagerSetting = FileManagerSetting;
47767
47999
  exports.FileObjectService = FileObjectService;
47768
48000
  exports.FilePickerDialogComponent = FilePickerDialogComponent;
47769
48001
  exports.FileUploadComponent = FileUploadComponent;
47770
48002
  exports.FileUploadControlSchema = FileUploadControlSchema;
48003
+ exports.FileUploadSetting = FileUploadSetting;
47771
48004
  exports.FileV4Service = FileV4Service;
47772
- exports.FileVersionDTO = FileVersionDTO;
47773
- exports.FileVersionService = FileVersionService;
47774
48005
  exports.Filter = Filter;
47775
48006
  exports.FolderService = FolderService;
47776
48007
  exports.FormControlBase = FormControlBase;
@@ -47811,7 +48042,6 @@
47811
48042
  exports.ModuleConfigService = ModuleConfigService;
47812
48043
  exports.MultiTranslateHttpLoader = MultiTranslateHttpLoader;
47813
48044
  exports.MultipleReferenceDataFormatPipe = MultipleReferenceDataFormatPipe;
47814
- exports.MyDriveService = MyDriveService;
47815
48045
  exports.NodeService = NodeService;
47816
48046
  exports.NotFoundComponent = NotFoundComponent;
47817
48047
  exports.NotificationService = NotificationService;
@@ -47819,6 +48049,7 @@
47819
48049
  exports.NumberCompareValidator = NumberCompareValidator;
47820
48050
  exports.NumberOnlyValidator = NumberOnlyValidator;
47821
48051
  exports.NumberRangeControlSchema = NumberRangeControlSchema;
48052
+ exports.OrganizationBaseService = OrganizationBaseService;
47822
48053
  exports.OrganizationFormatPipe = OrganizationFormatPipe;
47823
48054
  exports.OrganizationNameFormatPipe = OrganizationNameFormatPipe;
47824
48055
  exports.OrganizationPickerControlSchema = OrganizationPickerControlSchema;
@@ -47860,7 +48091,6 @@
47860
48091
  exports.SchemaBase = SchemaBase;
47861
48092
  exports.SecurePipe = SecurePipe;
47862
48093
  exports.ServiceFileUploadComponent = ServiceFileUploadComponent;
47863
- exports.ServiceRequestModel = ServiceRequestModel;
47864
48094
  exports.SessionTypes = SessionTypes;
47865
48095
  exports.SignalRService = SignalRService;
47866
48096
  exports.SimpleDicItem = SimpleDicItem;
@@ -48063,27 +48293,29 @@
48063
48293
  exports.ɵd = ExceptionHandlerService;
48064
48294
  exports.ɵda = TnAppNotificationListComponent;
48065
48295
  exports.ɵdb = TnAppNotificationComponent;
48066
- exports.ɵdc = FolderFormComponent;
48067
- exports.ɵdd = FileFormComponent;
48068
- exports.ɵde = FileViewerComponent;
48069
- exports.ɵdf = FileVersionListComponent;
48070
- exports.ɵdg = WorkflowHistoryComponent;
48071
- exports.ɵdh = EntityWorkflowHistoryService;
48072
- exports.ɵdi = WorkflowHistoryDialogComponent;
48073
- exports.ɵdj = WorkflowHistoryNewComponent;
48074
- exports.ɵdk = WorkflowSettingComponent;
48075
- exports.ɵdl = EntityWorkflowSettingService;
48076
- exports.ɵdm = WorkflowSettingDialogComponent;
48077
- exports.ɵdn = QrCodeGeneratorComponent;
48078
- exports.ɵdo = AccessDeniedV1Component;
48079
- exports.ɵdp = AddNewsComponent;
48080
- exports.ɵdq = ArticleService;
48081
- exports.ɵdr = NewsCategoryService;
48082
- exports.ɵds = SignatureDetailComponent;
48083
- exports.ɵdt = CheckReadyComponent;
48084
- exports.ɵdu = SendAccessTokenInterceptor;
48085
- exports.ɵdv = LogInterceptor;
48086
- exports.ɵdw = PermissionUtilsInterceptor;
48296
+ exports.ɵdc = MyDriveService;
48297
+ exports.ɵdd = FileVersionService;
48298
+ exports.ɵde = FileExplorerNewService;
48299
+ exports.ɵdf = FolderFormComponent;
48300
+ exports.ɵdg = FileFormComponent;
48301
+ exports.ɵdh = FileViewerComponent;
48302
+ exports.ɵdi = FileVersionListComponent;
48303
+ exports.ɵdj = WorkflowHistoryComponent;
48304
+ exports.ɵdk = EntityWorkflowHistoryService;
48305
+ exports.ɵdl = WorkflowHistoryDialogComponent;
48306
+ exports.ɵdm = WorkflowHistoryNewComponent;
48307
+ exports.ɵdn = WorkflowSettingComponent;
48308
+ exports.ɵdo = EntityWorkflowSettingService;
48309
+ exports.ɵdp = WorkflowSettingDialogComponent;
48310
+ exports.ɵdq = QrCodeGeneratorComponent;
48311
+ exports.ɵdr = AccessDeniedV1Component;
48312
+ exports.ɵds = AddNewsComponent;
48313
+ exports.ɵdt = ArticleService;
48314
+ exports.ɵdu = NewsCategoryService;
48315
+ exports.ɵdv = CheckReadyComponent;
48316
+ exports.ɵdw = SendAccessTokenInterceptor;
48317
+ exports.ɵdx = LogInterceptor;
48318
+ exports.ɵdy = PermissionUtilsInterceptor;
48087
48319
  exports.ɵe = CanBo_HoSoService;
48088
48320
  exports.ɵf = AfterViewCheckedComponent;
48089
48321
  exports.ɵg = AdvanceSearchComponent;