tnx-shared 5.0.74 → 5.0.75

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 (110) hide show
  1. package/bundles/tnx-shared.umd.js +655 -819
  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 +1 -3
  8. package/classes/base/data-list-base.d.ts.map +1 -1
  9. package/classes/constants.d.ts +0 -4
  10. package/classes/constants.d.ts.map +1 -1
  11. package/classes/form-schema.d.ts +5 -38
  12. package/classes/form-schema.d.ts.map +1 -1
  13. package/components/autocomplete-picker/autocomplete-picker.component.d.ts +0 -1
  14. package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
  15. package/components/common-app-component/common-app-component.d.ts +1 -4
  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 +1 -6
  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 +3 -0
  23. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  24. package/components/file-explorer/services/download-link.service.d.ts +1 -0
  25. package/components/file-explorer/services/download-link.service.d.ts.map +1 -1
  26. package/components/file-explorer/services/file-explorer.service.d.ts +2 -0
  27. package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
  28. package/components/file-explorer/services/file-object.service.d.ts +2 -0
  29. package/components/file-explorer/services/file-object.service.d.ts.map +1 -1
  30. package/components/file-explorer/signature-detail/signature-detail.component.d.ts +8 -0
  31. package/components/file-explorer/signature-detail/signature-detail.component.d.ts.map +1 -0
  32. package/components/file-explorer/signature-detail/signature-detail.component.ngfactory.d.ts.map +1 -0
  33. package/components/file-explorer/signature-detail/signature-detail.component.scss.shim.ngstyle.d.ts.map +1 -0
  34. package/components/file-upload/file-upload.component.d.ts +3 -0
  35. package/components/file-upload/file-upload.component.d.ts.map +1 -1
  36. package/components/mask/mask.component.d.ts +0 -2
  37. package/components/mask/mask.component.d.ts.map +1 -1
  38. package/components/service-file-upload/service-file-upload.component.d.ts +3 -0
  39. package/components/service-file-upload/service-file-upload.component.d.ts.map +1 -1
  40. package/configs/component-context.constant.d.ts +0 -1
  41. package/configs/component-context.constant.d.ts.map +1 -1
  42. package/esm2015/classes/base/data-form-base.js +5 -5
  43. package/esm2015/classes/base/data-list-base.js +23 -48
  44. package/esm2015/classes/constants.js +1 -6
  45. package/esm2015/classes/form-schema.js +4 -34
  46. package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +16 -72
  47. package/esm2015/components/common-app-component/app.menu.component.js +2 -2
  48. package/esm2015/components/common-app-component/common-app-component.js +3 -26
  49. package/esm2015/components/crud/crud-form/crud-form.component.js +2 -9
  50. package/esm2015/components/crud/crud-list/crud-list.component.js +6 -71
  51. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +3 -29
  52. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +3 -29
  53. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +155 -14
  54. package/esm2015/components/file-explorer/services/download-link.service.js +4 -1
  55. package/esm2015/components/file-explorer/services/file-explorer.service.js +22 -8
  56. package/esm2015/components/file-explorer/services/file-object.service.js +18 -1
  57. package/esm2015/components/file-explorer/signature-detail/signature-detail.component.js +66 -0
  58. package/esm2015/components/file-upload/file-upload.component.js +34 -2
  59. package/esm2015/components/mask/mask.component.js +4 -8
  60. package/esm2015/components/service-file-upload/service-file-upload.component.js +32 -2
  61. package/esm2015/components/workflow/services/entity-workflow-history.service.js +3 -3
  62. package/esm2015/components/workflow/services/entity-workflow-setting.service.js +4 -4
  63. package/esm2015/configs/component-context.constant.js +2 -3
  64. package/esm2015/models/grid-info.js +1 -1
  65. package/esm2015/pipes/tn-date.pipe.js +2 -12
  66. package/esm2015/public-api.js +7 -3
  67. package/esm2015/services/base.service.js +1 -16
  68. package/esm2015/services/common.service.js +1 -9
  69. package/esm2015/services/crud.service.js +4 -23
  70. package/esm2015/services/menu.service.js +3 -6
  71. package/esm2015/services/notifier.service.js +2 -2
  72. package/esm2015/services/permission.service.js +2 -9
  73. package/esm2015/services/template-text-v4.service.js +1 -1
  74. package/esm2015/services/user-v5.service.js +1 -1
  75. package/esm2015/services/user.service.js +2 -8
  76. package/esm2015/tnx-shared.js +22 -24
  77. package/esm2015/tnx-shared.module.js +4 -2
  78. package/fesm2015/tnx-shared.js +413 -534
  79. package/fesm2015/tnx-shared.js.map +1 -1
  80. package/models/grid-info.d.ts +0 -1
  81. package/models/grid-info.d.ts.map +1 -1
  82. package/package.json +2 -2
  83. package/pipes/tn-date.pipe.d.ts +0 -2
  84. package/pipes/tn-date.pipe.d.ts.map +1 -1
  85. package/public-api.d.ts +6 -2
  86. package/public-api.d.ts.map +1 -1
  87. package/services/base.service.d.ts +0 -1
  88. package/services/base.service.d.ts.map +1 -1
  89. package/services/common.service.d.ts +0 -4
  90. package/services/common.service.d.ts.map +1 -1
  91. package/services/crud.service.d.ts.map +1 -1
  92. package/services/menu.service.d.ts +1 -1
  93. package/services/menu.service.d.ts.map +1 -1
  94. package/services/permission.service.d.ts +0 -1
  95. package/services/permission.service.d.ts.map +1 -1
  96. package/services/template-text-v4.service.d.ts.map +1 -1
  97. package/services/user.service.d.ts.map +1 -1
  98. package/tnx-shared.d.ts +21 -23
  99. package/tnx-shared.d.ts.map +1 -1
  100. package/tnx-shared.metadata.json +1 -1
  101. package/tnx-shared.module.d.ts +2 -2
  102. package/tnx-shared.module.d.ts.map +1 -1
  103. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
  104. package/components/file-explorer/models/file-settings.d.ts +0 -46
  105. package/components/file-explorer/models/file-settings.d.ts.map +0 -1
  106. package/esm2015/components/file-explorer/models/file-settings.js +0 -60
  107. package/esm2015/services/organization-base.service.js +0 -57
  108. package/services/organization-base.service.d.ts +0 -16
  109. package/services/organization-base.service.d.ts.map +0 -1
  110. package/services/organization-base.service.ngfactory.d.ts.map +0 -1
@@ -28,6 +28,9 @@
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_);
31
34
  var printJS___namespace = /*#__PURE__*/_interopNamespace(printJS_);
32
35
  var JWT___namespace = /*#__PURE__*/_interopNamespace(JWT_);
33
36
  var jQuery___namespace = /*#__PURE__*/_interopNamespace(jQuery_);
@@ -395,8 +398,7 @@
395
398
  MENU_CHANGED: 'MENU_CHANGED',
396
399
  ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER: 'ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER',
397
400
  SHOW_WAIT_BOX: 'SHOW_WAIT_BOX',
398
- SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM',
399
- NEED_CLEAR_PERMISSION_CACHE: 'NEED_CLEAR_PERMISSION_CACHE'
401
+ SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM'
400
402
  };
401
403
  ComCtxConstants.ROOT_USMART = {
402
404
  SHOW_CONFIG_DATA_DEFAULT: 'SHOW_CONFIG_DATA_DEFAULT',
@@ -908,7 +910,7 @@
908
910
  NotifierService.prototype.showWarningByReponse = function (res) {
909
911
  var message = res.message;
910
912
  if (!message)
911
- message = 'Có lỗi xảy ra, vui lòng liên hệ quản trị viên!';
913
+ message = res.error;
912
914
  this.showWarning(message);
913
915
  };
914
916
  NotifierService.prototype.showBusinessError = function (message, key, header, life) {
@@ -2361,14 +2363,6 @@
2361
2363
  errorDetail: err
2362
2364
  };
2363
2365
  };
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
- };
2372
2366
  return CommonService;
2373
2367
  }());
2374
2368
  CommonService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CommonService_Factory() { return new CommonService(i0.ɵɵinject(ModuleConfigService)); }, token: CommonService, providedIn: "root" });
@@ -3254,11 +3248,7 @@
3254
3248
  EnumWorkflowCoreCodeSettingKey["MAC_DINH"] = "workflowCoreTrinhKy";
3255
3249
  EnumWorkflowCoreCodeSettingKey["PHE_DUYET_2_BUOC"] = "workflowCoreTrinhKy2Buoc";
3256
3250
  EnumWorkflowCoreCodeSettingKey["PHE_DUYET_3_BUOC"] = "workflowCoreTrinhKy3Buoc";
3257
- })(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
3258
- (function (EnumCoreVersion) {
3259
- EnumCoreVersion["V4"] = "V4";
3260
- EnumCoreVersion["V5"] = "V5";
3261
- })(exports.EnumCoreVersion || (exports.EnumCoreVersion = {}));
3251
+ })(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
3262
3252
 
3263
3253
  var ModelSchema = /** @class */ (function () {
3264
3254
  function ModelSchema(init) {
@@ -3334,7 +3324,6 @@
3334
3324
  this.function = new CrudListCustomFunction();
3335
3325
  this.popupHeader = '';
3336
3326
  this.popupSize = new PopupSize();
3337
- this.showMenuButtons = true;
3338
3327
  this.getCustomDataTrinhKy = function (rowData) { return ({}); };
3339
3328
  this.getLabelButtonTrinhKy = function (rowData) { return 'Trình ký'; };
3340
3329
  this.checkReadyToTrinhKy = function () { return true; };
@@ -3649,7 +3638,6 @@
3649
3638
  _this.fieldPlus = ''; // Danh sách những trường bổ sung cần lấy thêm ngoài id, ten; Ví dụ ,ma
3650
3639
  _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
3651
3640
  _this.fireCallBackInside = true;
3652
- _this.coreVersion = exports.EnumCoreVersion.V5;
3653
3641
  _this.funcCompare = function (item, value) { return item[_this.valueField] == value; };
3654
3642
  for (var key in init) {
3655
3643
  _this[key] = init[key];
@@ -3703,7 +3691,6 @@
3703
3691
  _this.prefix = '';
3704
3692
  _this.suffix = '';
3705
3693
  _this.decimalPlaces = 2;
3706
- _this.thousandSeperator = '.';
3707
3694
  for (var key in init) {
3708
3695
  _this[key] = init[key];
3709
3696
  }
@@ -3883,6 +3870,8 @@
3883
3870
  _this.mode = exports.FileManagerMode.multiple;
3884
3871
  _this.layout = exports.EnumFileLayout.LIST;
3885
3872
  _this.readonly = false;
3873
+ _this.signonly = false;
3874
+ _this.uploadOnly = false;
3886
3875
  // Trường hợp ở trong form, dùng trường này để lấy
3887
3876
  // entityKey từ model.data thay vì truyền vào entityKey
3888
3877
  _this.entityKeyField = 'id';
@@ -4497,7 +4486,6 @@
4497
4486
  DataType["decimal"] = "decimal";
4498
4487
  DataType["boolean"] = "boolean";
4499
4488
  DataType["enum"] = "enum";
4500
- DataType["currency"] = "currency";
4501
4489
  })(exports.DataType || (exports.DataType = {}));
4502
4490
  (function (ControlType) {
4503
4491
  ControlType["dropdown"] = "dropdown";
@@ -4569,34 +4557,7 @@
4569
4557
  (function (ExportAllMode) {
4570
4558
  ExportAllMode[ExportAllMode["ManualGetData"] = 0] = "ManualGetData";
4571
4559
  ExportAllMode[ExportAllMode["AutoGetData"] = 1] = "AutoGetData";
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
+ })(exports.ExportAllMode || (exports.ExportAllMode = {}));
4600
4561
 
4601
4562
  var _a;
4602
4563
  (function (WorkflowCoreStatusEnum) {
@@ -6038,24 +5999,14 @@
6038
5999
  if (model.hasOwnProperty(sourceField)) {
6039
6000
  valueFilter = model[sourceField];
6040
6001
  if (canAccessSubField(valueFilter)) {
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
+ valueFilter = valueFilter[subField];
6047
6003
  }
6048
6004
  }
6049
6005
  else if (rootModel) {
6050
6006
  if (rootModel.hasOwnProperty(sourceField)) {
6051
6007
  valueFilter = rootModel[sourceField];
6052
6008
  if (canAccessSubField(valueFilter)) {
6053
- if (isArray(valueFilter)) {
6054
- valueFilter = valueFilter.map(function (x) { return x[subField]; });
6055
- }
6056
- else {
6057
- valueFilter = valueFilter[subField];
6058
- }
6009
+ valueFilter = valueFilter[subField];
6059
6010
  }
6060
6011
  }
6061
6012
  else {
@@ -6081,12 +6032,7 @@
6081
6032
  finally { if (e_1) throw e_1.error; }
6082
6033
  }
6083
6034
  if (canAccessSubField(temp)) {
6084
- if (isArray(temp)) {
6085
- valueFilter = temp.map(function (x) { return x[subField]; });
6086
- }
6087
- else {
6088
- valueFilter = temp[subField];
6089
- }
6035
+ valueFilter = temp[subField];
6090
6036
  }
6091
6037
  }
6092
6038
  }
@@ -6099,9 +6045,6 @@
6099
6045
  valueFilter = tmpFilter.funcGetValue(valueFilter);
6100
6046
  }
6101
6047
  tmpFilter.value = JSON.stringify(valueFilter);
6102
- if (tmpFilter.modifyValue) {
6103
- valueFilter = tmpFilter.modifyValue(valueFilter);
6104
- }
6105
6048
  tmpFilter.filters = [];
6106
6049
  if (filter.logic && filter.filters) {
6107
6050
  filter.filters.forEach(function (f) { return _this.deQuyReplaceValue(tmpFilter.filters, f, model, rootModel); });
@@ -6252,7 +6195,6 @@
6252
6195
  });
6253
6196
  };
6254
6197
  CrudService.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
6255
- data !== null && data !== void 0 ? data : (data = []);
6256
6198
  var field = schema.field;
6257
6199
  var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
6258
6200
  if (schema.funcGetLabel) {
@@ -6545,24 +6487,6 @@
6545
6487
  });
6546
6488
  return this.postGridInfo(apiUrl, gridInfo);
6547
6489
  };
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
- };
6566
6490
  BaseService.prototype.getAllByGridInfo = function (gridInfo, plusUrl) {
6567
6491
  if (plusUrl === void 0) { plusUrl = ''; }
6568
6492
  var apiUrl = this.apiGetAll;
@@ -7033,7 +6957,7 @@
7033
6957
  }());
7034
6958
 
7035
6959
  // fix for build prod
7036
- var printJS = printJS___namespace;
6960
+ var printJS = printJS___default['default'];
7037
6961
  var FileExplorerService = /** @class */ (function () {
7038
6962
  function FileExplorerService(_http, _moduleConfig, _authenService, _commonSerivce, _moduleConfigService, _notifierService) {
7039
6963
  this._http = _http;
@@ -7243,11 +7167,11 @@
7243
7167
  return this._serviceUri + "/DownloadLink/" + hash;
7244
7168
  };
7245
7169
  FileExplorerService.prototype.getDownloadForSignUrl = function (hash) {
7246
- return this._serviceUri + "/Download/downloadforsign/" + hash;
7170
+ return this._serviceUri + "/DownloadLink/downloadforsign/" + hash;
7247
7171
  };
7248
7172
  FileExplorerService.prototype.generateLinkDownload = function (model) {
7249
7173
  var _this = this;
7250
- var svUrl = this._serviceUri + "/Download/GenerateDownloadLink";
7174
+ var svUrl = this._serviceUri + "/DownloadLink/GenerateDownloadLink";
7251
7175
  if (model.isFileVersion && !model.fileVersionId) {
7252
7176
  model.fileVersionId = model.fileId;
7253
7177
  }
@@ -7277,7 +7201,7 @@
7277
7201
  this._http.get(url, { responseType: 'blob' })
7278
7202
  .toPromise()
7279
7203
  .then(function (rs) {
7280
- FileSaver.saveAs(rs, fileName);
7204
+ FileSaver__default['default'].saveAs(rs, fileName);
7281
7205
  })
7282
7206
  .catch(function (err) {
7283
7207
  _this._notifierService.showWarning('Lỗi tải file');
@@ -7439,13 +7363,13 @@
7439
7363
  return regex.test(ext);
7440
7364
  };
7441
7365
  FileExplorerService.prototype.saveSignedFile = function (data) {
7442
- return this._http.post(this._serviceUri + "/Signature/SaveSignedFile", data).toPromise();
7366
+ return this._http.post(this._serviceUri + "/KySoFile/SaveSignedFile", data).toPromise();
7443
7367
  };
7444
7368
  FileExplorerService.prototype.getSignatureInfoByFileId = function (fileId) {
7445
- return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileId?fileId=" + fileId).toPromise();
7369
+ return this._http.get(this._serviceUri + "/KySoFile/GetListSignatureByFileId?fileId=" + fileId).toPromise();
7446
7370
  };
7447
7371
  FileExplorerService.prototype.getSignatureInfoByFileVersionId = function (fileVersionId) {
7448
- return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
7372
+ return this._http.get(this._serviceUri + "/KySoFile/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
7449
7373
  };
7450
7374
  FileExplorerService.prototype.getUploadFileVersionApiUrl = function () {
7451
7375
  return this._serviceUri + "/FileVersion/SaveVersionOnEdit";
@@ -7503,6 +7427,20 @@
7503
7427
  var svUrl = this._serviceUri + "/FileObject/CreateServiceFileAnonymous";
7504
7428
  return this._http.post(svUrl, serviceFileObjectDTO).pipe(operators.catchError(function (err) { return _this.handleError(err); })).toPromise();
7505
7429
  };
7430
+ FileExplorerService.prototype.needConvertBeforeSign = function (fileName) {
7431
+ if (fileName.lastIndexOf('.') === -1) {
7432
+ return false;
7433
+ }
7434
+ var fileType = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
7435
+ if ((/(doc|docx|dot|dotm|dotx|xls|xlsx|ppt|pptx)$/i).test(fileType)) {
7436
+ return true;
7437
+ }
7438
+ return false;
7439
+ };
7440
+ FileExplorerService.prototype.changeFileExtension = function (fileName, newExtension) {
7441
+ var arr = fileName.split('.');
7442
+ return fileName.replace("." + arr[arr.length - 1], "." + newExtension);
7443
+ };
7506
7444
  return FileExplorerService;
7507
7445
  }());
7508
7446
  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" });
@@ -7950,6 +7888,9 @@
7950
7888
  });
7951
7889
  return promise;
7952
7890
  };
7891
+ DownloadLinkService.prototype.getDownloadForSignUrl = function (hash) {
7892
+ return this.serviceUri + "/DownloadForSign/" + hash;
7893
+ };
7953
7894
  return DownloadLinkService;
7954
7895
  }(BaseService));
7955
7896
  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" });
@@ -8941,7 +8882,6 @@
8941
8882
  }
8942
8883
  else {
8943
8884
  this._applicationContext.getRootContext().replaySubscribeOnce(ComCtxConstants.ROOT.USER_READY, function (rs) {
8944
- var firstTimeLogin = rs;
8945
8885
  var accessToken = _this._oauthService.getAccessToken();
8946
8886
  var decoded = JWT.default(accessToken);
8947
8887
  // Chuyển đổi sang dùng instanceId nếu đăng nhập bằng identityv4 nhưng phải sử dụng base userOrgv5
@@ -8983,12 +8923,7 @@
8983
8923
  localStorage.setItem(_this.CURRENT_USER_KEY, JSON.stringify(user));
8984
8924
  }
8985
8925
  _this._applicationContext.getRootContext().data.currentUser = user;
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
+ _this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED, true);
8992
8927
  }, function (err) {
8993
8928
  });
8994
8929
  });
@@ -9548,12 +9483,9 @@
9548
9483
  _this.delayCheckPermissions = [];
9549
9484
  _this.ignoreAdmin = false;
9550
9485
  _this.appCode = null;
9551
- if (_moduleConfigService.getConfig().environment.authenticationSettings.coreVersion == 'v4') {
9552
- _this.serviceUri = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint + "/permission";
9553
- }
9554
9486
  _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
9555
- _this.appCode = _this._moduleConfigService.getConfig().appCode;
9556
9487
  _this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
9488
+ _this.appCode = _this._moduleConfigService.getConfig().appCode;
9557
9489
  return _this;
9558
9490
  }
9559
9491
  /**
@@ -9775,10 +9707,6 @@
9775
9707
  }
9776
9708
  });
9777
9709
  };
9778
- PermissionService.prototype.clearPermissionCache = function (lstModule) {
9779
- var url = this.serviceUri + "/ClearPermissionCache";
9780
- return this.defaultPost(url, lstModule);
9781
- };
9782
9710
  return PermissionService;
9783
9711
  }(BaseService));
9784
9712
  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" });
@@ -10153,7 +10081,7 @@
10153
10081
  if (service == undefined) {
10154
10082
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
10155
10083
  }
10156
- this.serviceUri = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory";
10084
+ this.serviceUri = service.endPoint + "/EntityWorkflowHistory";
10157
10085
  };
10158
10086
  EntityWorkflowHistoryService.prototype.getLastHistory = function (tableName, filters) {
10159
10087
  if (filters === void 0) { filters = []; }
@@ -10161,7 +10089,7 @@
10161
10089
  if (service == undefined) {
10162
10090
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
10163
10091
  }
10164
- var url = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory/GetLastByFilter";
10092
+ var url = service.endPoint + "/EntityWorkflowHistory/GetLastByFilter";
10165
10093
  var gridInfo = {
10166
10094
  pageInfo: {
10167
10095
  page: 1,
@@ -10318,7 +10246,7 @@
10318
10246
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow setting');
10319
10247
  }
10320
10248
  return new Promise(function (resolve, reject) {
10321
- _this.defaultPost(service.endPoint + "/" + _this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
10249
+ _this.defaultPost(service.endPoint + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
10322
10250
  .then(function (res) {
10323
10251
  if (res.success) {
10324
10252
  var itemSetting = res.data;
@@ -10403,11 +10331,11 @@
10403
10331
  };
10404
10332
  EntityWorkflowSettingService.prototype.saveSetting = function (settingKey, data) {
10405
10333
  var service = this.serviceManagers[settingKey];
10406
- return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
10334
+ return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
10407
10335
  };
10408
10336
  EntityWorkflowSettingService.prototype.removeSetting = function (settingKey) {
10409
10337
  var service = this.serviceManagers[settingKey];
10410
- return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
10338
+ return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
10411
10339
  };
10412
10340
  return EntityWorkflowSettingService;
10413
10341
  }(BaseService));
@@ -11221,37 +11149,25 @@
11221
11149
  });
11222
11150
  });
11223
11151
  };
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
- };
11231
11152
  DataListBase.prototype._edit = function (rowData, scopeDataEdit) {
11232
11153
  if (scopeDataEdit === void 0) { scopeDataEdit = {}; }
11233
11154
  return __awaiter(this, void 0, void 0, function () {
11234
- var resultValidate, flashShow;
11155
+ var flashShow;
11235
11156
  return __generator(this, function (_a) {
11236
11157
  switch (_a.label) {
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
+ case 0:
11243
11159
  flashShow = rowData[KeyFlashShow];
11244
11160
  delete rowData[KeyFlashShow];
11245
11161
  this.formModel.formState = exports.FormState.EDIT;
11246
11162
  return [4 /*yield*/, this.beforeEdit()];
11247
- case 2:
11163
+ case 1:
11248
11164
  _a.sent();
11249
11165
  this.setting.popupHeader = "C\u1EADp nh\u1EADt " + this.setting.objectName;
11250
11166
  this.setting.maskClass = flashShow ? 'hide' : null;
11251
11167
  this.scopeDataEdit = scopeDataEdit;
11252
11168
  this.formModel.data = this.cloneData(rowData);
11253
11169
  return [4 /*yield*/, this.modifyEditModel(rowData)];
11254
- case 3:
11170
+ case 2:
11255
11171
  _a.sent();
11256
11172
  this.formModel.data[KeyFlashShow] = flashShow;
11257
11173
  this.showDetailForm = true;
@@ -11282,56 +11198,34 @@
11282
11198
  DataListBase.prototype.getPromiseDeleteItem = function (rowData) {
11283
11199
  return this.setting.baseService.delete(rowData.id);
11284
11200
  };
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
- };
11292
11201
  DataListBase.prototype._delete = function (rowData) {
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*/];
11202
+ var _this = this;
11203
+ if (rowData.__disableDelete) {
11204
+ return;
11205
+ }
11206
+ this._notifierService.showDeleteConfirm().then(function (rs) {
11207
+ if (!rs) {
11208
+ return;
11209
+ }
11210
+ if (_this.setting.baseService) {
11211
+ _this.getPromiseDeleteItem(rowData)
11212
+ .then(function (response) {
11213
+ if (response.success) {
11214
+ if (_this.setting.showVersionButton) {
11215
+ _this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
11301
11216
  }
11302
- return [4 /*yield*/, this.validateDelete(rowData)];
11303
- case 1:
11304
- resultValidate = _a.sent();
11305
- if (!resultValidate) {
11306
- return [2 /*return*/];
11217
+ else {
11218
+ _this._triggerProcessData();
11307
11219
  }
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
- });
11220
+ _this._notifierService.showDeleteDataSuccess();
11221
+ }
11222
+ else {
11223
+ _this._notifierService.showWarningByReponse(response);
11224
+ }
11225
+ }, function (error) {
11226
+ _this._notifierService.showDeleteDataError();
11227
+ });
11228
+ }
11335
11229
  });
11336
11230
  };
11337
11231
  DataListBase.prototype.getPromiseDeleteItems = function (items) {
@@ -11672,7 +11566,7 @@
11672
11566
  arrPromiseDontNeedWait = [];
11673
11567
  arrSchemaDontNeedWait = [];
11674
11568
  _loop_1 = function (schema) {
11675
- var field, arrValue_1, promise, filters, result, funcGetLabel_1;
11569
+ var field, arrValue_1, promise, result, funcGetLabel_1;
11676
11570
  return __generator(this, function (_a) {
11677
11571
  switch (_a.label) {
11678
11572
  case 0:
@@ -11707,11 +11601,7 @@
11707
11601
  promise = schema.baseService.getDataDropdown(schema.groupCode, arrValue_1, this_1.createDropdownOptions(schema));
11708
11602
  }
11709
11603
  else {
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
+ promise = schema.baseService.getDataDropdownByFilter([this_1.newFilter(schema.valueField, exports.Operator.in, arrValue_1)], this_1.createDropdownOptions(schema));
11715
11605
  }
11716
11606
  if (!(schema.order != null)) return [3 /*break*/, 2];
11717
11607
  return [4 /*yield*/, promise];
@@ -11789,7 +11679,6 @@
11789
11679
  });
11790
11680
  };
11791
11681
  DataListBase.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
11792
- data !== null && data !== void 0 ? data : (data = []);
11793
11682
  var field = schema.field;
11794
11683
  var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
11795
11684
  if (schema.funcGetLabel) {
@@ -14838,10 +14727,6 @@
14838
14727
  });
14839
14728
  this.onModelChanged.emit(event);
14840
14729
  }
14841
- else {
14842
- this._rootNode = new ControlTreeNode(this._modelData, this.formControls);
14843
- this._rootNode.setCrudForm(this);
14844
- }
14845
14730
  },
14846
14731
  enumerable: false,
14847
14732
  configurable: true
@@ -16101,24 +15986,18 @@
16101
15986
  return __generator(this, function (_d) {
16102
15987
  switch (_d.label) {
16103
15988
  case 0:
16104
- if (!control.multiple) return [3 /*break*/, 5];
15989
+ if (!control.multiple) return [3 /*break*/, 3];
16105
15990
  if (!(eventType == 'hide')) return [3 /*break*/, 2];
16106
15991
  return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
16107
15992
  case 1:
16108
15993
  _d.sent();
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:
16114
- _d.sent();
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:
15994
+ _d.label = 2;
15995
+ case 2: return [3 /*break*/, 5];
15996
+ case 3: return [4 /*yield*/, this.handleFieldValueChange(control, event, eventType, parentModel, parentPath, sourceNode, bubble)];
15997
+ case 4:
16119
15998
  _d.sent();
16120
- _d.label = 7;
16121
- case 7: return [2 /*return*/];
15999
+ _d.label = 5;
16000
+ case 5: return [2 /*return*/];
16122
16001
  }
16123
16002
  });
16124
16003
  });
@@ -17071,7 +16950,7 @@
17071
16950
  CrudFormComponent.decorators = [
17072
16951
  { type: i0.Component, args: [{
17073
16952
  selector: 'crud-form',
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
+ 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]\" [signonly]=\"control.signonly\"\r\n [readonly]=\"control.disabled\" [rootFolderName]=\"control.rootFolderName || control.label\"\r\n [layout]=\"control.layout\" [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>",
17075
16954
  providers: [ComponentContextService],
17076
16955
  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}"]
17077
16956
  },] }
@@ -18254,7 +18133,7 @@
18254
18133
  this.onSaved.emit();
18255
18134
  return [3 /*break*/, 3];
18256
18135
  case 2:
18257
- this.handleInsertError(response);
18136
+ this.handleInsertError();
18258
18137
  _a.label = 3;
18259
18138
  case 3: return [2 /*return*/];
18260
18139
  }
@@ -18274,7 +18153,7 @@
18274
18153
  DataFormBase.prototype.getPromiseActionInsert = function () {
18275
18154
  return this.setting.baseService.post(this.model.data, this.insertPlusUrl);
18276
18155
  };
18277
- DataFormBase.prototype.handleInsertError = function (response) {
18156
+ DataFormBase.prototype.handleInsertError = function () {
18278
18157
  };
18279
18158
  DataFormBase.prototype.onUpdate = function () {
18280
18159
  return __awaiter(this, void 0, void 0, function () {
@@ -18295,7 +18174,7 @@
18295
18174
  this.onSaved.emit();
18296
18175
  return [3 /*break*/, 3];
18297
18176
  case 2:
18298
- this.handleUpdateError(response);
18177
+ this.handleUpdateError();
18299
18178
  _a.label = 3;
18300
18179
  case 3: return [2 /*return*/];
18301
18180
  }
@@ -18312,7 +18191,7 @@
18312
18191
  });
18313
18192
  });
18314
18193
  };
18315
- DataFormBase.prototype.handleUpdateError = function (response) {
18194
+ DataFormBase.prototype.handleUpdateError = function () {
18316
18195
  };
18317
18196
  DataFormBase.prototype.getPromiseActionUpdate = function () {
18318
18197
  return this.setting.baseService.put(this.model.data.id.toString(), this.model.data, this.updatePlusUrl);
@@ -18944,49 +18823,27 @@
18944
18823
  AutoCompletePickerComponent.prototype.buildFilterKeyword = function () {
18945
18824
  var _this = this;
18946
18825
  if (this.fieldSearchText.length == 1) {
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
+ this.getFilterOnSearch = function (value) { return _this.newFilter(_this.control.displayField, exports.Operator.contain, value); };
18953
18827
  }
18954
18828
  else {
18955
18829
  this.getFilterOnSearch = function (value) {
18956
- var e_1, _a, e_2, _b;
18830
+ var e_1, _a;
18957
18831
  var result = new Filter({
18958
18832
  logic: 'or',
18959
18833
  filters: []
18960
18834
  });
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; }
18835
+ try {
18836
+ for (var _b = __values(_this.fieldSearchText), _c = _b.next(); !_c.done; _c = _b.next()) {
18837
+ var fieldSearch = _c.value;
18838
+ result.filters.push(_this.newFilter(fieldSearch, exports.Operator.contain, value));
18974
18839
  }
18975
18840
  }
18976
- else {
18841
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
18842
+ finally {
18977
18843
  try {
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
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
18989
18845
  }
18846
+ finally { if (e_1) throw e_1.error; }
18990
18847
  }
18991
18848
  return result;
18992
18849
  };
@@ -19062,50 +18919,34 @@
19062
18919
  return __generator(this, function (_a) {
19063
18920
  switch (_a.label) {
19064
18921
  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:
19071
18922
  filters = [];
19072
18923
  if (this.control.multiple) {
19073
18924
  if (this.value && this.value.length > 0) {
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
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this.value));
19080
18926
  }
19081
18927
  }
19082
18928
  else {
19083
18929
  if (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
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this.value));
19090
18931
  }
19091
18932
  }
19092
18933
  return [4 /*yield*/, appendDefaultFilter(filters, this.control.defaultFilters)];
19093
- case 3:
18934
+ case 1:
19094
18935
  _a.sent();
19095
18936
  if (this.keyword && this.keyword.length > 0) {
19096
18937
  filters.push(this.getFilterOnSearch(this.keyword));
19097
18938
  }
19098
- if (!this.control.modifyFilter) return [3 /*break*/, 5];
18939
+ if (!this.control.modifyFilter) return [3 /*break*/, 3];
19099
18940
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19100
- case 4:
18941
+ case 2:
19101
18942
  allow = _a.sent();
19102
18943
  if (allow === false) {
19103
18944
  this.results = [];
19104
18945
  return [2 /*return*/];
19105
18946
  }
19106
- _a.label = 5;
19107
- case 5: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
19108
- case 6:
18947
+ _a.label = 3;
18948
+ case 3: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
18949
+ case 4:
19109
18950
  dataSource = _a.sent();
19110
18951
  this.fireEventAfterGetDataDropDown(dataSource);
19111
18952
  this.reStructureDataSource(dataSource);
@@ -19286,17 +19127,9 @@
19286
19127
  if (!this.control.multiple) return [3 /*break*/, 5];
19287
19128
  dataSource = [];
19288
19129
  if (!(this.value && this.value.length > 0)) return [3 /*break*/, 4];
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
- }
19130
+ filters = [
19131
+ this.newFilter(this.control.valueField, exports.Operator.in, this.value)
19132
+ ];
19300
19133
  if (!this.control.modifyFilter) return [3 /*break*/, 2];
19301
19134
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19302
19135
  case 1:
@@ -19320,17 +19153,9 @@
19320
19153
  case 5:
19321
19154
  dataSource = [];
19322
19155
  if (!this.value) return [3 /*break*/, 9];
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
- }
19156
+ filters = [
19157
+ this.newFilter(this.control.valueField, exports.Operator.equal, this.value)
19158
+ ];
19334
19159
  if (!this.control.modifyFilter) return [3 /*break*/, 7];
19335
19160
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19336
19161
  case 6:
@@ -19375,7 +19200,7 @@
19375
19200
  }
19376
19201
  };
19377
19202
  AutoCompletePickerComponent.prototype.reStructureDataSource = function (sources) {
19378
- var e_3, _a;
19203
+ var e_2, _a;
19379
19204
  if (sources != null && sources.length > 0) {
19380
19205
  var arr = [];
19381
19206
  try {
@@ -19385,12 +19210,12 @@
19385
19210
  arr.push(item);
19386
19211
  }
19387
19212
  }
19388
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
19213
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
19389
19214
  finally {
19390
19215
  try {
19391
19216
  if (sources_1_1 && !sources_1_1.done && (_a = sources_1.return)) _a.call(sources_1);
19392
19217
  }
19393
- finally { if (e_3) throw e_3.error; }
19218
+ finally { if (e_2) throw e_2.error; }
19394
19219
  }
19395
19220
  this.dataSource = arr;
19396
19221
  }
@@ -19420,12 +19245,7 @@
19420
19245
  if (!this.control.multiple) return [3 /*break*/, 6];
19421
19246
  if (!(obj != null && obj.length > 0)) return [3 /*break*/, 4];
19422
19247
  filters = [];
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
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.in, obj));
19429
19249
  if (!this.control.modifyFilter) return [3 /*break*/, 2];
19430
19250
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19431
19251
  case 1:
@@ -19450,17 +19270,9 @@
19450
19270
  case 5: return [3 /*break*/, 10];
19451
19271
  case 6:
19452
19272
  if (!(obj != null)) return [3 /*break*/, 9];
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
- }
19273
+ filters = [
19274
+ this.newFilter(this.control.valueField, exports.Operator.equal, obj)
19275
+ ];
19464
19276
  if (!this.control.modifyFilter) return [3 /*break*/, 8];
19465
19277
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19466
19278
  case 7:
@@ -19536,7 +19348,6 @@
19536
19348
  AutoCompletePickerComponent.propDecorators = {
19537
19349
  control: [{ type: i0.Input }],
19538
19350
  disabled: [{ type: i0.Input }],
19539
- parentPath: [{ type: i0.Input }],
19540
19351
  popupSize: [{ type: i0.Input }],
19541
19352
  onSelect: [{ type: i0.Output }],
19542
19353
  onUnSelect: [{ type: i0.Output }],
@@ -19655,6 +19466,23 @@
19655
19466
  FileObjectService.prototype.getScanFileUploadEndpoint = function (correlationId) {
19656
19467
  return this.serviceCode + "/CreateScannedFile/" + correlationId;
19657
19468
  };
19469
+ FileObjectService.prototype.isTypeFileKySo = function (fileName) {
19470
+ var fileExtension = this.getFileExtension(fileName);
19471
+ if (fileExtension) {
19472
+ fileExtension = fileExtension.toLowerCase();
19473
+ if (fileExtension.indexOf('.') > -1) {
19474
+ var arr = fileExtension.split('.');
19475
+ fileExtension = arr[arr.length - 1];
19476
+ }
19477
+ if ((/(pdf|doc|docx|xls|xlsm|xlsx)$/i).test(fileExtension)) {
19478
+ return true;
19479
+ }
19480
+ }
19481
+ return false;
19482
+ };
19483
+ FileObjectService.prototype.getPublicDownloadLinkByFileId = function (fileId) {
19484
+ return this.serviceUri + "/public/" + fileId + "/download";
19485
+ };
19658
19486
  return FileObjectService;
19659
19487
  }(BaseService));
19660
19488
  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" });
@@ -20742,16 +20570,13 @@
20742
20570
  });
20743
20571
  });
20744
20572
  };
20745
- MenuService.prototype.renderMenuByAppCode = function (scopeName, appCode) {
20573
+ MenuService.prototype.renderMenuByAppCode = function (appCode) {
20746
20574
  return __awaiter(this, void 0, void 0, function () {
20747
20575
  var menuUrl;
20748
20576
  var _this = this;
20749
20577
  return __generator(this, function (_a) {
20750
20578
  this._menuItems = [];
20751
20579
  menuUrl = "assets/menus/" + appCode.toLocaleLowerCase() + ".json";
20752
- if (scopeName) {
20753
- menuUrl = "assets/menus/" + scopeName.toLocaleLowerCase() + "/" + appCode.toLocaleLowerCase() + ".json";
20754
- }
20755
20580
  fetch(menuUrl).then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
20756
20581
  var menu, _a, _b;
20757
20582
  return __generator(this, function (_c) {
@@ -20905,7 +20730,7 @@
20905
20730
  // 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
20906
20731
  funcSetNewTabLink = function (link) { return "/" + appCodeLowerCase + link; };
20907
20732
  }
20908
- this._menuService.renderMenuByAppCode(this.environment.scopeName, appCode);
20733
+ this._menuService.renderMenuByAppCode(appCode);
20909
20734
  this.model = this._menuService.getMenuItems();
20910
20735
  this._router.events.pipe(operators.filter(function (event) { return event instanceof i3.NavigationEnd; }))
20911
20736
  .subscribe(function (event) {
@@ -23466,7 +23291,7 @@
23466
23291
  };
23467
23292
 
23468
23293
  var CommonAppComponentComponent = /** @class */ (function () {
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) {
23294
+ 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) {
23470
23295
  var _this = this;
23471
23296
  this._globalService = _globalService;
23472
23297
  this._commonService = _commonService;
@@ -23496,7 +23321,6 @@
23496
23321
  this._menuService = _menuService;
23497
23322
  this._primengConfig = _primengConfig;
23498
23323
  this._storageService = _storageService;
23499
- this._permissionService = _permissionService;
23500
23324
  this.showQuickNote = true;
23501
23325
  this.allowAnonymous = false;
23502
23326
  this._unsubscribeAll = new rxjs.Subject();
@@ -23650,25 +23474,6 @@
23650
23474
  root.data.allowAnonymous = this.allowAnonymous;
23651
23475
  // get current User
23652
23476
  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
- }); });
23672
23477
  this._componentContextService.subscribe(ComCtxConstants.ROOT.KEY_DOWN_ARROWLEFT, function (e) {
23673
23478
  if (document.activeElement === _this.cancelButton.nativeElement) {
23674
23479
  _this.okButton.nativeElement.focus();
@@ -24184,17 +23989,6 @@
24184
23989
  }
24185
23990
  }
24186
23991
  };
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
- };
24198
23992
  return CommonAppComponentComponent;
24199
23993
  }());
24200
23994
  CommonAppComponentComponent.decorators = [
@@ -24233,8 +24027,7 @@
24233
24027
  { type: i1.ConfirmationService },
24234
24028
  { type: MenuService },
24235
24029
  { type: i1.PrimeNGConfig },
24236
- { type: StorageService },
24237
- { type: PermissionService }
24030
+ { type: StorageService }
24238
24031
  ]; };
24239
24032
  CommonAppComponentComponent.propDecorators = {
24240
24033
  okButton: [{ type: i0.ViewChild, args: ['okButton',] }],
@@ -26391,8 +26184,6 @@
26391
26184
  });
26392
26185
  _this.sourceIcon = {};
26393
26186
  _this.stopCalculatingFunctionColumnWidth = false;
26394
- _this.FileUploadMode = exports.FileUploadMode;
26395
- _this.eventType = exports.EventType;
26396
26187
  _this._unSubscribeAll = new rxjs.Subject();
26397
26188
  _this.handleSelectRow = function (evt, data) {
26398
26189
  if (_this.setting.hasCustomHandleClickRow) {
@@ -26575,94 +26366,6 @@
26575
26366
  _this.setting.pageSetting.page = 1;
26576
26367
  _this.getData();
26577
26368
  };
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
- }); };
26666
26369
  _this._activatedRoute = _this._injector.get(i3.ActivatedRoute);
26667
26370
  _this._router = _this._injector.get(i3.Router);
26668
26371
  _this._customRouterService = _this._injector.get(CustomRouterService);
@@ -26970,7 +26673,7 @@
26970
26673
  });
26971
26674
  };
26972
26675
  CrudListComponent.prototype.formatColumns = function (cols) {
26973
- var e_1, _f;
26676
+ var e_1, _b;
26974
26677
  try {
26975
26678
  for (var cols_1 = __values(cols), cols_1_1 = cols_1.next(); !cols_1_1.done; cols_1_1 = cols_1.next()) {
26976
26679
  var col = cols_1_1.value;
@@ -26982,7 +26685,7 @@
26982
26685
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
26983
26686
  finally {
26984
26687
  try {
26985
- if (cols_1_1 && !cols_1_1.done && (_f = cols_1.return)) _f.call(cols_1);
26688
+ if (cols_1_1 && !cols_1_1.done && (_b = cols_1.return)) _b.call(cols_1);
26986
26689
  }
26987
26690
  finally { if (e_1) throw e_1.error; }
26988
26691
  }
@@ -27181,7 +26884,7 @@
27181
26884
  CrudListComponent.prototype.validatePermission = function (rowData) {
27182
26885
  return __awaiter(this, void 0, void 0, function () {
27183
26886
  var itemStatus, hasPermission, userData, userId, userIdUpper, userGroupIds, userOrgIds, managerTypes, userIdLastUpper_1, donViIdLastUpper_1;
27184
- return __generator(this, function (_f) {
26887
+ return __generator(this, function (_b) {
27185
26888
  this.currentItem = rowData;
27186
26889
  itemStatus = this.setting.workflowSetting.statuses.find(function (p) { return p.trangThaiContainer.ma == rowData.currentStateCode; });
27187
26890
  hasPermission = false;
@@ -27248,12 +26951,12 @@
27248
26951
  };
27249
26952
  CrudListComponent.prototype.showActionWorkflow = function (evt, rowData) {
27250
26953
  return __awaiter(this, void 0, void 0, function () {
27251
- var _f, buttonContexts, hasPermission;
27252
- return __generator(this, function (_g) {
27253
- switch (_g.label) {
26954
+ var _b, buttonContexts, hasPermission;
26955
+ return __generator(this, function (_c) {
26956
+ switch (_c.label) {
27254
26957
  case 0: return [4 /*yield*/, this.getActionWorkflow(rowData)];
27255
26958
  case 1:
27256
- _f = __read.apply(void 0, [_g.sent(), 2]), buttonContexts = _f[0], hasPermission = _f[1];
26959
+ _b = __read.apply(void 0, [_c.sent(), 2]), buttonContexts = _b[0], hasPermission = _b[1];
27257
26960
  this.buttonContexts = buttonContexts;
27258
26961
  rowData.__hasPermission = hasPermission;
27259
26962
  rowData.__actions = this.buttonContexts;
@@ -27267,11 +26970,11 @@
27267
26970
  return __awaiter(this, void 0, void 0, function () {
27268
26971
  var hasPermission, buttonContexts, statusAction, actions;
27269
26972
  var _this = this;
27270
- return __generator(this, function (_f) {
27271
- switch (_f.label) {
26973
+ return __generator(this, function (_b) {
26974
+ switch (_b.label) {
27272
26975
  case 0: return [4 /*yield*/, this.validatePermission(rowData)];
27273
26976
  case 1:
27274
- hasPermission = _f.sent();
26977
+ hasPermission = _b.sent();
27275
26978
  buttonContexts = [];
27276
26979
  if (!hasPermission) {
27277
26980
  buttonContexts = [];
@@ -27337,8 +27040,8 @@
27337
27040
  return __awaiter(this, void 0, void 0, function () {
27338
27041
  var dataProcess_1, validateWf;
27339
27042
  var _this = this;
27340
- return __generator(this, function (_f) {
27341
- switch (_f.label) {
27043
+ return __generator(this, function (_b) {
27044
+ switch (_b.label) {
27342
27045
  case 0:
27343
27046
  if (!(workflowAction.actionOptions && !workflowAction.actionOptions.openDialog)) return [3 /*break*/, 2];
27344
27047
  dataProcess_1 = {
@@ -27348,7 +27051,7 @@
27348
27051
  };
27349
27052
  return [4 /*yield*/, this.setting.baseService.validateProcessWorkflow(this.currentItem.id, workflowAction.ma, dataProcess_1)];
27350
27053
  case 1:
27351
- validateWf = _f.sent();
27054
+ validateWf = _b.sent();
27352
27055
  this.handleResponse(validateWf, '', function (f) {
27353
27056
  _this.setting.baseService.processWorkflow(_this.currentItem.id, workflowAction.ma, dataProcess_1)
27354
27057
  .then(function (res) { return _this.handleResponse(res, workflowAction.ten + " th\u00E0nh c\u00F4ng", function (f) {
@@ -27372,7 +27075,7 @@
27372
27075
  this.actionWorkflow = workflowAction;
27373
27076
  this.headerWorkflow = workflowAction.ten;
27374
27077
  this.showFormWorkflow = true;
27375
- _f.label = 3;
27078
+ _b.label = 3;
27376
27079
  case 3: return [2 /*return*/];
27377
27080
  }
27378
27081
  });
@@ -27475,7 +27178,7 @@
27475
27178
  this.onAdd.emit();
27476
27179
  };
27477
27180
  CrudListComponent.prototype.xuatCacMucDaChon_backup = function () {
27478
- var e_2, _f;
27181
+ var e_2, _b;
27479
27182
  if (this._groupField) {
27480
27183
  this._notifierService.showWarning('Giao diện hiện tại chưa hỗ trợ xuất excel');
27481
27184
  return;
@@ -27517,7 +27220,7 @@
27517
27220
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
27518
27221
  finally {
27519
27222
  try {
27520
- if (rowData_1_1 && !rowData_1_1.done && (_f = rowData_1.return)) _f.call(rowData_1);
27223
+ if (rowData_1_1 && !rowData_1_1.done && (_b = rowData_1.return)) _b.call(rowData_1);
27521
27224
  }
27522
27225
  finally { if (e_2) throw e_2.error; }
27523
27226
  }
@@ -27660,8 +27363,8 @@
27660
27363
  CrudListComponent.prototype.checkHasPermissionInLastStatus = function (rowData) {
27661
27364
  return __awaiter(this, void 0, void 0, function () {
27662
27365
  var statusKetThuc;
27663
- return __generator(this, function (_f) {
27664
- switch (_f.label) {
27366
+ return __generator(this, function (_b) {
27367
+ switch (_b.label) {
27665
27368
  case 0:
27666
27369
  statusKetThuc = this.setting.workflowSetting.statuses.find(function (q) { return q.type == exports.EnumWFNhomTrangThai.KET_THUC; });
27667
27370
  if (statusKetThuc == null) {
@@ -27674,46 +27377,46 @@
27674
27377
  return [4 /*yield*/, this.validatePermission(rowData)];
27675
27378
  case 1:
27676
27379
  // Kiểm tra permission
27677
- return [2 /*return*/, _f.sent()];
27380
+ return [2 /*return*/, _b.sent()];
27678
27381
  }
27679
27382
  });
27680
27383
  });
27681
27384
  };
27682
27385
  CrudListComponent.prototype.showContextMenu = function (evt, rowData) {
27683
27386
  return __awaiter(this, void 0, void 0, function () {
27684
- var _f, _g, _h, _j;
27685
- return __generator(this, function (_k) {
27686
- switch (_k.label) {
27387
+ var _b, _c, _d, _e;
27388
+ return __generator(this, function (_f) {
27389
+ switch (_f.label) {
27687
27390
  case 0:
27688
27391
  this.rowDataCurrent = rowData;
27689
- _f = this;
27392
+ _b = this;
27690
27393
  return [4 /*yield*/, this.menuButtons(rowData)];
27691
27394
  case 1:
27692
- _f.buttonContexts = _k.sent();
27395
+ _b.buttonContexts = _f.sent();
27693
27396
  if (!(!this.setting.hiddenTrinhKy && !rowData.__hiddenTrinhKy)) return [3 /*break*/, 7];
27694
- _h = this.setting.checkReadyToTrinhKy();
27695
- if (!_h) return [3 /*break*/, 3];
27397
+ _d = this.setting.checkReadyToTrinhKy();
27398
+ if (!_d) return [3 /*break*/, 3];
27696
27399
  return [4 /*yield*/, this.setting.checkAllowTrinhKy(rowData)];
27697
27400
  case 2:
27698
- _h = (_k.sent());
27699
- _k.label = 3;
27401
+ _d = (_f.sent());
27402
+ _f.label = 3;
27700
27403
  case 3:
27701
- _g = _h;
27702
- if (!_g) return [3 /*break*/, 6];
27703
- _j = !this.setting.checkPermisionTrinhKy;
27704
- if (_j) return [3 /*break*/, 5];
27404
+ _c = _d;
27405
+ if (!_c) return [3 /*break*/, 6];
27406
+ _e = !this.setting.checkPermisionTrinhKy;
27407
+ if (_e) return [3 /*break*/, 5];
27705
27408
  return [4 /*yield*/, this.checkHasPermissionInLastStatus(rowData)];
27706
27409
  case 4:
27707
- _j = (_k.sent());
27708
- _k.label = 5;
27410
+ _e = (_f.sent());
27411
+ _f.label = 5;
27709
27412
  case 5:
27710
- _g = (_j);
27711
- _k.label = 6;
27413
+ _c = (_e);
27414
+ _f.label = 6;
27712
27415
  case 6:
27713
- if (_g) {
27416
+ if (_c) {
27714
27417
  this.buttonContexts.unshift({ label: this.setting.getLabelButtonTrinhKy(rowData), icon: 'pi pi-send', command: this.trinhKy.bind(this) });
27715
27418
  }
27716
- _k.label = 7;
27419
+ _f.label = 7;
27717
27420
  case 7:
27718
27421
  if (this.buttonContexts.length > 0) {
27719
27422
  this._showContextMenu(evt);
@@ -28290,7 +27993,7 @@
28290
27993
  return col.dataType == exports.DataType.datetime || col.dataType == exports.DataType.date || col.dataType == exports.DataType.boolean || col.dataType == exports.DataType.enum;
28291
27994
  };
28292
27995
  CrudListComponent.prototype.alignRightColumn = function (col) {
28293
- return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal || col.dataType == exports.DataType.currency;
27996
+ return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal;
28294
27997
  };
28295
27998
  CrudListComponent.prototype.ngOnDestroy = function () {
28296
27999
  if (!this.disableKeypressControl) {
@@ -28306,10 +28009,10 @@
28306
28009
  clearTimeout(this.timeout);
28307
28010
  };
28308
28011
  CrudListComponent.prototype.disableMultipleDelete = function () {
28309
- var e_3, _f;
28012
+ var e_3, _b;
28310
28013
  try {
28311
- for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
28312
- var item = _h.value;
28014
+ for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
28015
+ var item = _d.value;
28313
28016
  if (this.disableDelete(item)) {
28314
28017
  return true;
28315
28018
  }
@@ -28318,7 +28021,7 @@
28318
28021
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
28319
28022
  finally {
28320
28023
  try {
28321
- if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
28024
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
28322
28025
  }
28323
28026
  finally { if (e_3) throw e_3.error; }
28324
28027
  }
@@ -28388,11 +28091,11 @@
28388
28091
  };
28389
28092
  CrudListComponent.prototype.processBaseData = function () {
28390
28093
  return __awaiter(this, void 0, void 0, function () {
28391
- return __generator(this, function (_f) {
28392
- switch (_f.label) {
28094
+ return __generator(this, function (_b) {
28095
+ switch (_b.label) {
28393
28096
  case 0: return [4 /*yield*/, this.preProcessData(this.model.dataSource)];
28394
28097
  case 1:
28395
- _f.sent();
28098
+ _b.sent();
28396
28099
  return [2 /*return*/];
28397
28100
  }
28398
28101
  });
@@ -28401,14 +28104,14 @@
28401
28104
  CrudListComponent.prototype.preProcessData = function (dataSource) {
28402
28105
  return __awaiter(this, void 0, void 0, function () {
28403
28106
  var colHasPipe, _loop_3, this_2, colHasPipe_1, colHasPipe_1_1, col;
28404
- var e_4, _f;
28405
- return __generator(this, function (_g) {
28107
+ var e_4, _b;
28108
+ return __generator(this, function (_c) {
28406
28109
  colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
28407
28110
  _loop_3 = function (col) {
28408
- var e_5, _f;
28111
+ var e_5, _b;
28409
28112
  var _loop_4 = function (item) {
28410
28113
  this_2.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
28411
- item["pipe__" + col.field] = rs;
28114
+ item["pipe__" + col.field + " "] = rs;
28412
28115
  });
28413
28116
  };
28414
28117
  try {
@@ -28420,7 +28123,7 @@
28420
28123
  catch (e_5_1) { e_5 = { error: e_5_1 }; }
28421
28124
  finally {
28422
28125
  try {
28423
- if (dataSource_1_1 && !dataSource_1_1.done && (_f = dataSource_1.return)) _f.call(dataSource_1);
28126
+ if (dataSource_1_1 && !dataSource_1_1.done && (_b = dataSource_1.return)) _b.call(dataSource_1);
28424
28127
  }
28425
28128
  finally { if (e_5) throw e_5.error; }
28426
28129
  }
@@ -28435,7 +28138,7 @@
28435
28138
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
28436
28139
  finally {
28437
28140
  try {
28438
- if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_f = colHasPipe_1.return)) _f.call(colHasPipe_1);
28141
+ if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_b = colHasPipe_1.return)) _b.call(colHasPipe_1);
28439
28142
  }
28440
28143
  finally { if (e_4) throw e_4.error; }
28441
28144
  }
@@ -28446,8 +28149,8 @@
28446
28149
  CrudListComponent.prototype.transform = function (pipe, asyncPipe, value) {
28447
28150
  return __awaiter(this, void 0, void 0, function () {
28448
28151
  var val, val;
28449
- return __generator(this, function (_f) {
28450
- switch (_f.label) {
28152
+ return __generator(this, function (_b) {
28153
+ switch (_b.label) {
28451
28154
  case 0:
28452
28155
  if (this.cachedTransforms[value]) {
28453
28156
  return [2 /*return*/, this.cachedTransforms[value]];
@@ -28455,7 +28158,7 @@
28455
28158
  if (!asyncPipe) return [3 /*break*/, 2];
28456
28159
  return [4 /*yield*/, pipe.transform(value)];
28457
28160
  case 1:
28458
- val = _f.sent();
28161
+ val = _b.sent();
28459
28162
  this.cachedTransforms[value] = val;
28460
28163
  return [2 /*return*/, val];
28461
28164
  case 2:
@@ -28549,7 +28252,7 @@
28549
28252
  return {};
28550
28253
  };
28551
28254
  CrudListComponent.prototype.getMinimizeData = function (model) {
28552
- var e_6, _f;
28255
+ var e_6, _b;
28553
28256
  if (isLiteralObject(model)) {
28554
28257
  if (model._dropdownvalue != null && model._dropdownvalue !== '') {
28555
28258
  return model[model._dropdownvalue];
@@ -28575,7 +28278,7 @@
28575
28278
  catch (e_6_1) { e_6 = { error: e_6_1 }; }
28576
28279
  finally {
28577
28280
  try {
28578
- if (model_1_1 && !model_1_1.done && (_f = model_1.return)) _f.call(model_1);
28281
+ if (model_1_1 && !model_1_1.done && (_b = model_1.return)) _b.call(model_1);
28579
28282
  }
28580
28283
  finally { if (e_6) throw e_6.error; }
28581
28284
  }
@@ -28723,7 +28426,7 @@
28723
28426
  };
28724
28427
  CrudListComponent.prototype.showSettingsPermission = function () {
28725
28428
  return __awaiter(this, void 0, void 0, function () {
28726
- return __generator(this, function (_f) {
28429
+ return __generator(this, function (_b) {
28727
28430
  if (this.creatingSearchInfo)
28728
28431
  return [2 /*return*/];
28729
28432
  this._showSettingsPermission = true;
@@ -28733,10 +28436,10 @@
28733
28436
  };
28734
28437
  CrudListComponent.prototype.createSearchSchema = function () {
28735
28438
  return __awaiter(this, void 0, void 0, function () {
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
+ var searchInfo, _b, _c, col, control, e_7_1, _loop_5, this_3, _d, _e, field;
28440
+ var e_7, _f, _g, e_8, _h;
28441
+ return __generator(this, function (_j) {
28442
+ switch (_j.label) {
28740
28443
  case 0:
28741
28444
  if (this.setting.cols == null) {
28742
28445
  return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
@@ -28746,14 +28449,14 @@
28746
28449
  searchInfo.schema = [];
28747
28450
  searchInfo.fieldDropdown = {};
28748
28451
  searchInfo.fieldSearchText = [];
28749
- _o.label = 1;
28452
+ _j.label = 1;
28750
28453
  case 1:
28751
- _o.trys.push([1, 6, 7, 8]);
28752
- _f = __values(this.setting.cols), _g = _f.next();
28753
- _o.label = 2;
28454
+ _j.trys.push([1, 6, 7, 8]);
28455
+ _b = __values(this.setting.cols), _c = _b.next();
28456
+ _j.label = 2;
28754
28457
  case 2:
28755
- if (!!_g.done) return [3 /*break*/, 5];
28756
- col = _g.value;
28458
+ if (!!_c.done) return [3 /*break*/, 5];
28459
+ col = _c.value;
28757
28460
  if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
28758
28461
  if (col.fullTextSearch) {
28759
28462
  if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
@@ -28766,9 +28469,9 @@
28766
28469
  }
28767
28470
  return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
28768
28471
  case 3:
28769
- control = _o.sent();
28472
+ control = _j.sent();
28770
28473
  if (control != null) {
28771
- (_l = searchInfo.schema).push.apply(_l, __spread(control));
28474
+ (_g = searchInfo.schema).push.apply(_g, __spread(control));
28772
28475
  }
28773
28476
  else {
28774
28477
  if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
@@ -28822,18 +28525,18 @@
28822
28525
  }
28823
28526
  }
28824
28527
  }
28825
- _o.label = 4;
28528
+ _j.label = 4;
28826
28529
  case 4:
28827
- _g = _f.next();
28530
+ _c = _b.next();
28828
28531
  return [3 /*break*/, 2];
28829
28532
  case 5: return [3 /*break*/, 8];
28830
28533
  case 6:
28831
- e_7_1 = _o.sent();
28534
+ e_7_1 = _j.sent();
28832
28535
  e_7 = { error: e_7_1 };
28833
28536
  return [3 /*break*/, 8];
28834
28537
  case 7:
28835
28538
  try {
28836
- if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
28539
+ if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
28837
28540
  }
28838
28541
  finally { if (e_7) throw e_7.error; }
28839
28542
  return [7 /*endfinally*/];
@@ -28853,15 +28556,15 @@
28853
28556
  };
28854
28557
  this_3 = this;
28855
28558
  try {
28856
- for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
28857
- field = _j.value;
28559
+ for (_d = __values(searchInfo.fieldSearchText), _e = _d.next(); !_e.done; _e = _d.next()) {
28560
+ field = _e.value;
28858
28561
  _loop_5(field);
28859
28562
  }
28860
28563
  }
28861
28564
  catch (e_8_1) { e_8 = { error: e_8_1 }; }
28862
28565
  finally {
28863
28566
  try {
28864
- if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
28567
+ if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
28865
28568
  }
28866
28569
  finally { if (e_8) throw e_8.error; }
28867
28570
  }
@@ -28927,19 +28630,15 @@
28927
28630
  }
28928
28631
  }, 20);
28929
28632
  };
28930
- CrudListComponent.prototype.getTooltip = function (tooltip, field) {
28931
- var result = tooltip && tooltip[field] ? tooltip[field] : null;
28932
- return result;
28933
- };
28934
28633
  return CrudListComponent;
28935
28634
  }(ComponentBase));
28936
28635
  CrudListComponent.decorators = [
28937
28636
  { type: i0.Component, args: [{
28938
28637
  // tslint:disable-next-line: component-selector
28939
28638
  selector: 'crud-list',
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>",
28639
+ 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>",
28941
28640
  providers: [i2$1.DecimalPipe, i2$1.DatePipe],
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}}"]
28641
+ 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}}"]
28943
28642
  },] }
28944
28643
  ];
28945
28644
  CrudListComponent.ctorParameters = function () { return [
@@ -30856,67 +30555,31 @@
30856
30555
  };
30857
30556
  EntityPickerDataComponent.prototype.modifyGridInfo = function (gridInfo) {
30858
30557
  return __awaiter(this, void 0, void 0, function () {
30859
- var _a, _b, filter, value, allow;
30860
- var e_1, _c;
30861
- return __generator(this, function (_d) {
30862
- switch (_d.label) {
30558
+ var allow;
30559
+ return __generator(this, function (_a) {
30560
+ switch (_a.label) {
30863
30561
  case 0:
30864
30562
  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
- }
30890
30563
  if (this.control.multiple) {
30891
30564
  if (this._value && this._value.length > 0) {
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
- }
30565
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this._value));
30898
30566
  }
30899
30567
  }
30900
30568
  else {
30901
30569
  if (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
- }
30570
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this._value));
30908
30571
  }
30909
30572
  }
30910
30573
  return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
30911
30574
  case 1:
30912
- _d.sent();
30575
+ _a.sent();
30913
30576
  if (!this.control.modifyFilter) return [3 /*break*/, 3];
30914
30577
  return [4 /*yield*/, this.control.modifyFilter(gridInfo.filters, this)];
30915
30578
  case 2:
30916
- allow = _d.sent();
30579
+ allow = _a.sent();
30917
30580
  if (allow === false)
30918
30581
  return [2 /*return*/, false];
30919
- _d.label = 3;
30582
+ _a.label = 3;
30920
30583
  case 3:
30921
30584
  if (this.setting.columnSetting.sortField) {
30922
30585
  gridInfo.sorts.push({
@@ -31081,45 +30744,13 @@
31081
30744
  };
31082
30745
  EntityPickerSelectedComponent.prototype.modifyGridInfo = function (gridInfo) {
31083
30746
  return __awaiter(this, void 0, void 0, function () {
31084
- var _a, _b, filter, value;
31085
- var e_1, _c;
31086
- return __generator(this, function (_d) {
31087
- switch (_d.label) {
30747
+ return __generator(this, function (_a) {
30748
+ switch (_a.label) {
31088
30749
  case 0:
31089
30750
  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
- }
31115
30751
  if (this.control.multiple) {
31116
30752
  if (this._value != null && this._value.length > 0) {
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
- }
30753
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31123
30754
  }
31124
30755
  else {
31125
30756
  return [2 /*return*/, false];
@@ -31127,12 +30758,7 @@
31127
30758
  }
31128
30759
  else {
31129
30760
  if (this._value != null) {
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
- }
30761
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31136
30762
  }
31137
30763
  else {
31138
30764
  return [2 /*return*/, false];
@@ -31140,7 +30766,7 @@
31140
30766
  }
31141
30767
  return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
31142
30768
  case 1:
31143
- _d.sent();
30769
+ _a.sent();
31144
30770
  return [2 /*return*/];
31145
30771
  }
31146
30772
  });
@@ -31965,11 +31591,10 @@
31965
31591
  }
31966
31592
  return FileExplorerItem;
31967
31593
  }());
31968
- var FileExplorerItemType;
31969
31594
  (function (FileExplorerItemType) {
31970
31595
  FileExplorerItemType[FileExplorerItemType["File"] = 0] = "File";
31971
31596
  FileExplorerItemType[FileExplorerItemType["Folder"] = 1] = "Folder";
31972
- })(FileExplorerItemType || (FileExplorerItemType = {}));
31597
+ })(exports.FileExplorerItemType || (exports.FileExplorerItemType = {}));
31973
31598
 
31974
31599
  // fix for build prod
31975
31600
  var printJS$2 = printJS___namespace;
@@ -32794,6 +32419,7 @@
32794
32419
  _this.invalidFileLimitMessageDetail = 'tối đa {0} file.';
32795
32420
  _this._hasLoadedSource = false;
32796
32421
  _this.readonly = false;
32422
+ _this.signonly = false;
32797
32423
  _this.onReady = new i0.EventEmitter();
32798
32424
  _this.entityKeyChange = new i0.EventEmitter();
32799
32425
  _this.closePopup = new i0.EventEmitter();
@@ -32925,7 +32551,24 @@
32925
32551
  if (dataSource === void 0) { dataSource = []; }
32926
32552
  this._dataSource = dataSource;
32927
32553
  this._oldValue = this._value;
32928
- this._value = dataSource.map(function (item) { return item.id; });
32554
+ var value = [];
32555
+ dataSource.forEach(function (item) {
32556
+ value.push(item.id);
32557
+ if (item.name) {
32558
+ item.nameWithoutExtension = item.name;
32559
+ var index = item.name.lastIndexOf('.');
32560
+ if (index > -1) {
32561
+ item.nameWithoutExtension = item.name.substring(0, index);
32562
+ }
32563
+ if (item.extension) {
32564
+ item.extension = item.extension.toLowerCase();
32565
+ }
32566
+ item.tailFile = item.name.substring(index);
32567
+ item.tailFileUpper = item.tailFile.toUpperCase();
32568
+ item.isFile = item.fileExplorerItemType == exports.FileExplorerItemType.File;
32569
+ }
32570
+ });
32571
+ this._value = value;
32929
32572
  if (this._oldValue != null) {
32930
32573
  if (JSON.stringify(this._oldValue) != JSON.stringify(this._value)) {
32931
32574
  this.fireEventChange();
@@ -33045,6 +32688,10 @@
33045
32688
  show: false,
33046
32689
  formData: {}
33047
32690
  };
32691
+ this.forms[this.formIds.signatureDetail] = {
32692
+ header: 'Thông tin chữ ký số',
32693
+ show: false,
32694
+ };
33048
32695
  this.forms[this.formIds.fileVersionList] = {
33049
32696
  header: 'Danh sách phiên bản',
33050
32697
  show: false,
@@ -33096,14 +32743,14 @@
33096
32743
  command: function () {
33097
32744
  _this.deleteFile(item);
33098
32745
  },
33099
- visible: !this.readonly
32746
+ visible: !this.signonly && !this.readonly
33100
32747
  },
33101
32748
  {
33102
32749
  label: 'Đổi tên', icon: 'fas fa-eraser',
33103
32750
  command: function () {
33104
32751
  _this.renameFile(item);
33105
32752
  },
33106
- visible: !this.readonly
32753
+ visible: !this.signonly && !this.readonly
33107
32754
  }
33108
32755
  ];
33109
32756
  }
@@ -33135,7 +32782,7 @@
33135
32782
  };
33136
32783
  FileManagerComponent.prototype.modifyGridInfo = function (gridInfo) {
33137
32784
  return __awaiter(this, void 0, void 0, function () {
33138
- return __generator(this, function (_a) {
32785
+ return __generator(this, function (_b) {
33139
32786
  gridInfo.filters.push(this.newFilter('parentFolderId', exports.Operator.equal, this.data.currentFolderId));
33140
32787
  return [2 /*return*/];
33141
32788
  });
@@ -33144,7 +32791,7 @@
33144
32791
  FileManagerComponent.prototype.afterGetData = function () {
33145
32792
  return __awaiter(this, void 0, void 0, function () {
33146
32793
  var _loop_1, this_1, ind;
33147
- return __generator(this, function (_a) {
32794
+ return __generator(this, function (_b) {
33148
32795
  _loop_1 = function (ind) {
33149
32796
  var item = this_1.model.dataSource[ind];
33150
32797
  if (this_1._fileExplorerService.supportDigitalSignature(item.name)) {
@@ -33155,7 +32802,7 @@
33155
32802
  }
33156
32803
  });
33157
32804
  }
33158
- if (item.fileExplorerItemType === FileExplorerItemType.Folder) {
32805
+ if (item.fileExplorerItemType === exports.FileExplorerItemType.Folder) {
33159
32806
  item.class = '';
33160
32807
  }
33161
32808
  if (item.extension) {
@@ -33317,7 +32964,7 @@
33317
32964
  FileManagerComponent.prototype.openObject = function (explorerItem) {
33318
32965
  return __awaiter(this, void 0, void 0, function () {
33319
32966
  var canViewOnline;
33320
- return __generator(this, function (_a) {
32967
+ return __generator(this, function (_b) {
33321
32968
  if (explorerItem.isFile) {
33322
32969
  canViewOnline = this._fileObjectService.isSupportedViewOnline(explorerItem.name);
33323
32970
  if (canViewOnline) {
@@ -33358,7 +33005,7 @@
33358
33005
  FileManagerComponent.prototype.download = function (explorerItem) {
33359
33006
  return __awaiter(this, void 0, void 0, function () {
33360
33007
  var model;
33361
- return __generator(this, function (_a) {
33008
+ return __generator(this, function (_b) {
33362
33009
  model = this._downloadLinkService.getGenerateDownloadLinkModel(explorerItem);
33363
33010
  this._downloadLinkService.download(model);
33364
33011
  return [2 /*return*/];
@@ -33370,7 +33017,7 @@
33370
33017
  return __awaiter(this, void 0, void 0, function () {
33371
33018
  var selectedItems, hasItems, arrModel;
33372
33019
  var _this = this;
33373
- return __generator(this, function (_a) {
33020
+ return __generator(this, function (_b) {
33374
33021
  selectedItems = this.model.selectedItems;
33375
33022
  hasItems = selectedItems && selectedItems.length;
33376
33023
  if (hasItems) {
@@ -33520,13 +33167,13 @@
33520
33167
  return __awaiter(this, void 0, void 0, function () {
33521
33168
  var rs, breadcrumbs;
33522
33169
  var _this = this;
33523
- return __generator(this, function (_a) {
33524
- switch (_a.label) {
33170
+ return __generator(this, function (_b) {
33171
+ switch (_b.label) {
33525
33172
  case 0:
33526
33173
  if (!this.data.currentFolderId) return [3 /*break*/, 2];
33527
33174
  return [4 /*yield*/, this._folderService.getFullFolderPath(this.data.currentFolderId)];
33528
33175
  case 1:
33529
- rs = _a.sent();
33176
+ rs = _b.sent();
33530
33177
  if (rs.success) {
33531
33178
  breadcrumbs = rs.data.map(function (f) {
33532
33179
  var item = {
@@ -33548,7 +33195,7 @@
33548
33195
  return [3 /*break*/, 3];
33549
33196
  case 2:
33550
33197
  this.data.breadcrumbs = [];
33551
- _a.label = 3;
33198
+ _b.label = 3;
33552
33199
  case 3: return [2 /*return*/];
33553
33200
  }
33554
33201
  });
@@ -33558,36 +33205,75 @@
33558
33205
  // TODO: Lưu ý xử lý trường double click vào nút
33559
33206
  FileManagerComponent.prototype.signFile = function (file) {
33560
33207
  var _this = this;
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');
33581
- });
33208
+ 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 () {
33209
+ var sourceFileId, sourceFile_1, rsConvert, e_1;
33210
+ var _this = this;
33211
+ return __generator(this, function (_b) {
33212
+ switch (_b.label) {
33213
+ case 0:
33214
+ if (!rs) return [3 /*break*/, 5];
33215
+ sourceFileId = file.id;
33216
+ sourceFile_1 = file;
33217
+ if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 4];
33218
+ _b.label = 1;
33219
+ case 1:
33220
+ _b.trys.push([1, 3, , 4]);
33221
+ return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
33222
+ id: sourceFileId,
33223
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33224
+ folderId: file.parentFolderId,
33225
+ ownerType: this._userService.getCurrentUser().userId.toString(),
33226
+ })];
33227
+ case 2:
33228
+ rsConvert = _b.sent();
33229
+ if (!rsConvert || !rsConvert.success) {
33230
+ 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");
33231
+ return [2 /*return*/];
33582
33232
  }
33583
- });
33584
- });
33585
- }
33586
- });
33233
+ else {
33234
+ this._notifierService.showSuccess("Chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf th\u00E0nh c\u00F4ng");
33235
+ sourceFileId = rsConvert.data;
33236
+ sourceFile_1 = { id: sourceFileId };
33237
+ this._triggerProcessData();
33238
+ }
33239
+ return [3 /*break*/, 4];
33240
+ case 3:
33241
+ e_1 = _b.sent();
33242
+ 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");
33243
+ return [2 /*return*/];
33244
+ case 4:
33245
+ this._fileExplorerService.generateLinkDownload({
33246
+ fileId: sourceFileId,
33247
+ }).then(function (rs) {
33248
+ var url = _this._downloadLinkService.getDownloadForSignUrl(rs.data);
33249
+ var prms = {};
33250
+ prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + _this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
33251
+ prms['SessionId'] = '';
33252
+ prms['FileName'] = url;
33253
+ // tslint:disable-next-line: variable-name
33254
+ var json_prms = JSON.stringify(prms);
33255
+ vgca_sign_approved(json_prms, function (result) {
33256
+ var resultObj = JSON.parse(result);
33257
+ if (resultObj.FileServer != '') {
33258
+ _this._fileExplorerService.saveSignedFile({
33259
+ sourceFile: sourceFile_1,
33260
+ tempFileId: resultObj.FileServer,
33261
+ }).then(function (rss) {
33262
+ _this._triggerProcessData();
33263
+ _this._notifierService.showSuccess('Ký số thành công');
33264
+ });
33265
+ }
33266
+ });
33267
+ });
33268
+ _b.label = 5;
33269
+ case 5: return [2 /*return*/];
33270
+ }
33271
+ });
33272
+ }); });
33587
33273
  };
33588
33274
  FileManagerComponent.prototype.shareFolder = function (file) {
33589
33275
  return __awaiter(this, void 0, void 0, function () {
33590
- return __generator(this, function (_a) {
33276
+ return __generator(this, function (_b) {
33591
33277
  this.forms.shareFolder.data = file;
33592
33278
  this.forms.shareFolder.show = true;
33593
33279
  return [2 /*return*/];
@@ -33596,7 +33282,7 @@
33596
33282
  };
33597
33283
  FileManagerComponent.prototype.shareFile = function (file) {
33598
33284
  return __awaiter(this, void 0, void 0, function () {
33599
- return __generator(this, function (_a) {
33285
+ return __generator(this, function (_b) {
33600
33286
  this.forms.shareFile.data = file;
33601
33287
  this.forms.shareFile.show = true;
33602
33288
  return [2 /*return*/];
@@ -33610,19 +33296,154 @@
33610
33296
  };
33611
33297
  FileManagerComponent.prototype.viewListSign = function (e, signatures) {
33612
33298
  e.stopPropagation();
33613
- this.forms.signatureDetail.data = signatures;
33299
+ this.model.advanceData = signatures;
33614
33300
  this.forms.signatureDetail.show = true;
33615
33301
  };
33616
33302
  FileManagerComponent.prototype.onRowSelect = function (evt) {
33617
33303
  this.onSelected.emit(this.model.selectedItems);
33618
33304
  };
33305
+ FileManagerComponent.prototype.signMultiple = function () {
33306
+ return __awaiter(this, void 0, void 0, function () {
33307
+ var selectedItems, hasItems;
33308
+ return __generator(this, function (_b) {
33309
+ selectedItems = this.model.selectedItems;
33310
+ hasItems = selectedItems && selectedItems.length;
33311
+ if (hasItems) {
33312
+ if (selectedItems.length == 1) {
33313
+ this.signFile(selectedItems[0]);
33314
+ }
33315
+ else {
33316
+ this.signFileMultiple(selectedItems);
33317
+ }
33318
+ }
33319
+ return [2 /*return*/];
33320
+ });
33321
+ });
33322
+ };
33323
+ FileManagerComponent.prototype.signFileMultiple = function (lstFile) {
33324
+ return __awaiter(this, void 0, void 0, function () {
33325
+ var prms, rs, lstFile_1, lstFile_1_1, file, sourceFileId, sourceFile, rsConvert, result, url, e_2, result, url, e_3_1, json_prms;
33326
+ var e_3, _b;
33327
+ var _this = this;
33328
+ return __generator(this, function (_c) {
33329
+ switch (_c.label) {
33330
+ case 0:
33331
+ prms = {};
33332
+ prms['Files'] = [];
33333
+ prms['FileUploadHandler'] = this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
33334
+ prms['SessionId'] = '';
33335
+ 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?')];
33336
+ case 1:
33337
+ rs = _c.sent();
33338
+ if (!rs) return [3 /*break*/, 18];
33339
+ _c.label = 2;
33340
+ case 2:
33341
+ _c.trys.push([2, 15, 16, 17]);
33342
+ lstFile_1 = __values(lstFile), lstFile_1_1 = lstFile_1.next();
33343
+ _c.label = 3;
33344
+ case 3:
33345
+ if (!!lstFile_1_1.done) return [3 /*break*/, 14];
33346
+ file = lstFile_1_1.value;
33347
+ if (!this._fileObjectService.isTypeFileKySo(file.name))
33348
+ return [3 /*break*/, 13];
33349
+ sourceFileId = file.id;
33350
+ sourceFile = file;
33351
+ if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 11];
33352
+ _c.label = 4;
33353
+ case 4:
33354
+ _c.trys.push([4, 9, , 10]);
33355
+ return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
33356
+ id: sourceFileId,
33357
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33358
+ folderId: file.parentFolderId,
33359
+ ownerType: this._userService.getCurrentUser().userId.toString(),
33360
+ })];
33361
+ case 5:
33362
+ rsConvert = _c.sent();
33363
+ if (!(!rsConvert || !rsConvert.success)) return [3 /*break*/, 6];
33364
+ 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");
33365
+ return [3 /*break*/, 13];
33366
+ case 6: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: rsConvert.data })];
33367
+ case 7:
33368
+ result = _c.sent();
33369
+ if (result.success) {
33370
+ url = this._downloadLinkService.getDownloadForSignUrl(result.data);
33371
+ prms['Files'].push({
33372
+ "FileID": rsConvert.data,
33373
+ "FileName": this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33374
+ "URL": url,
33375
+ });
33376
+ }
33377
+ _c.label = 8;
33378
+ case 8: return [3 /*break*/, 10];
33379
+ case 9:
33380
+ e_2 = _c.sent();
33381
+ 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");
33382
+ return [3 /*break*/, 13];
33383
+ case 10: return [3 /*break*/, 13];
33384
+ case 11: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: sourceFileId })];
33385
+ case 12:
33386
+ result = _c.sent();
33387
+ if (result.success) {
33388
+ url = this._downloadLinkService.getDownloadForSignUrl(result.data);
33389
+ prms['Files'].push({
33390
+ "FileID": sourceFileId,
33391
+ "FileName": file.name,
33392
+ "URL": url,
33393
+ });
33394
+ }
33395
+ _c.label = 13;
33396
+ case 13:
33397
+ lstFile_1_1 = lstFile_1.next();
33398
+ return [3 /*break*/, 3];
33399
+ case 14: return [3 /*break*/, 17];
33400
+ case 15:
33401
+ e_3_1 = _c.sent();
33402
+ e_3 = { error: e_3_1 };
33403
+ return [3 /*break*/, 17];
33404
+ case 16:
33405
+ try {
33406
+ if (lstFile_1_1 && !lstFile_1_1.done && (_b = lstFile_1.return)) _b.call(lstFile_1);
33407
+ }
33408
+ finally { if (e_3) throw e_3.error; }
33409
+ return [7 /*endfinally*/];
33410
+ case 17:
33411
+ json_prms = JSON.stringify(prms);
33412
+ vgca_sign_files(json_prms, function (result) {
33413
+ var _a;
33414
+ var resultObj = JSON.parse(result);
33415
+ if ((_a = resultObj.Files) === null || _a === void 0 ? void 0 : _a.length) {
33416
+ resultObj.Files.forEach(function (item) { return __awaiter(_this, void 0, void 0, function () {
33417
+ var _this = this;
33418
+ return __generator(this, function (_b) {
33419
+ this._fileExplorerService.saveSignedFile({
33420
+ sourceFile: { id: item.FileID },
33421
+ tempFileId: item.FileSignedURL,
33422
+ }).then(function (rss) {
33423
+ _this._triggerProcessData();
33424
+ _this._notifierService.showSuccess('Ký số thành công');
33425
+ });
33426
+ return [2 /*return*/];
33427
+ });
33428
+ }); });
33429
+ }
33430
+ ;
33431
+ });
33432
+ _c.label = 18;
33433
+ case 18:
33434
+ ;
33435
+ return [2 /*return*/];
33436
+ }
33437
+ });
33438
+ });
33439
+ };
33619
33440
  return FileManagerComponent;
33620
33441
  }(DataListBase));
33621
33442
  FileManagerComponent.decorators = [
33622
33443
  { type: i0.Component, args: [{
33623
33444
  // tslint:disable-next-line: component-selector
33624
33445
  selector: 'file-manager',
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> -->",
33446
+ 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=\"!signonly&&!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 <ng-container *ngIf=\"!this.signonly&&!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 <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 </ng-container>\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 </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>",
33626
33447
  providers: [
33627
33448
  {
33628
33449
  provide: forms.NG_VALUE_ACCESSOR,
@@ -33672,6 +33493,7 @@
33672
33493
  entity: [{ type: i0.Input }],
33673
33494
  entityKey: [{ type: i0.Input }],
33674
33495
  readonly: [{ type: i0.Input }],
33496
+ signonly: [{ type: i0.Input }],
33675
33497
  value: [{ type: i0.Input }],
33676
33498
  onReady: [{ type: i0.Output }],
33677
33499
  entityKeyChange: [{ type: i0.Output }],
@@ -34600,6 +34422,12 @@
34600
34422
  _this.hasFile = false;
34601
34423
  _this.showNoti = false;
34602
34424
  _this.notification = null;
34425
+ _this.supportedExtensions = [
34426
+ 'pdf',
34427
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
34428
+ 'mp4', 'webm', 'ogg',
34429
+ 'mp3', 'wav', 'aac' // Âm thanh
34430
+ ];
34603
34431
  return _this;
34604
34432
  }
34605
34433
  FileUploadComponent.prototype.writeValue = function (obj) {
@@ -34620,15 +34448,15 @@
34620
34448
  FileUploadComponent.prototype.getFile = function () {
34621
34449
  return __awaiter(this, void 0, void 0, function () {
34622
34450
  var fileObject;
34623
- return __generator(this, function (_a) {
34624
- switch (_a.label) {
34451
+ return __generator(this, function (_b) {
34452
+ switch (_b.label) {
34625
34453
  case 0:
34626
34454
  if (!this.fileId) return [3 /*break*/, 2];
34627
34455
  this.loading = true;
34628
34456
  this.notification = 'Đang đính kèm...';
34629
34457
  return [4 /*yield*/, this._fileObjectService.getDetail(this.fileId)];
34630
34458
  case 1:
34631
- fileObject = (_a.sent()).data;
34459
+ fileObject = (_b.sent()).data;
34632
34460
  if (fileObject) {
34633
34461
  this.selectedFileName = fileObject.name;
34634
34462
  this.hasFile = true;
@@ -34639,7 +34467,7 @@
34639
34467
  else {
34640
34468
  this.hasFile = false;
34641
34469
  }
34642
- _a.label = 2;
34470
+ _b.label = 2;
34643
34471
  case 2: return [2 /*return*/];
34644
34472
  }
34645
34473
  });
@@ -34733,12 +34561,38 @@
34733
34561
  this._downloadLinkService.download(model);
34734
34562
  }
34735
34563
  };
34564
+ FileUploadComponent.prototype.isViewableFile = function (url) {
34565
+ var _a;
34566
+ if (!url) {
34567
+ return false;
34568
+ }
34569
+ try {
34570
+ // Lấy phần mở rộng của file từ URL
34571
+ var extension = (_a = url.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
34572
+ return extension ? this.supportedExtensions.includes(extension) : false;
34573
+ }
34574
+ catch (error) {
34575
+ console.error('Lỗi khi kiểm tra đuôi file:', error);
34576
+ return false;
34577
+ }
34578
+ };
34579
+ FileUploadComponent.prototype.onDownloadOrViewFile = function () {
34580
+ if (this.isViewableFile(this.selectedFileName)) {
34581
+ if (this.fileId) {
34582
+ var url = this._fileObjectService.getPublicDownloadLinkByFileId(this.fileId);
34583
+ window.open(url, '_blank');
34584
+ }
34585
+ }
34586
+ else {
34587
+ this.onDownloadFile();
34588
+ }
34589
+ };
34736
34590
  return FileUploadComponent;
34737
34591
  }(ComponentBase));
34738
34592
  FileUploadComponent.decorators = [
34739
34593
  { type: i0.Component, args: [{
34740
34594
  selector: 'file-upload',
34741
- template: "<div class=\"file-upload\">\r\n <div class=\"fl-icon\">\r\n <i *ngIf=\"loading\" class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\r\n <i *ngIf=\"!loading\" class=\"pi pi-file-o\" style=\"font-size: 2rem\"></i>\r\n </div>\r\n\r\n <div class=\"fl-file-name\" (click)=\"onDownloadFile()\">\r\n <span *ngIf=\"!showNoti\">{{selectedFileName}}</span>\r\n <span *ngIf=\"showNoti\"> {{notification}} </span>\r\n </div>\r\n\r\n <div class=\"fl-buttons\">\r\n <button *ngIf=\"!hasFile && !readonly\" pTooltip=\"Ch\u1ECDn file\" class=\"fl-choose\"\r\n class=\"link-or-action p-button-text p-button-rounded fl-choose\" tooltipPosition=\"top\" pButton type=\"button\"\r\n icon=\"pi pi-plus\" (click)=\"onOpenSelect()\"></button>\r\n\r\n <button *ngIf=\"hasFile && !readonly\" (click)=\"onRemoveFile()\"\r\n class=\"link-or-action p-button-text p-button-rounded p-button-danger fl-remove\" pTooltip=\"X\u00F3a file\"\r\n tooltipPosition=\"top\" pButton type=\"button\" icon=\"pi pi-trash\"></button>\r\n\r\n <button [disabled]=\"!menu || !menu.length\" 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)\"></button>\r\n </div>\r\n\r\n <div style=\"display: none;\">\r\n <p-fileUpload #file [accept]=\"accept\" [auto]=\"false\" class=\"file-upload\" mode=\"basic\"\r\n [chooseLabel]=\"chooseLabel\" name=\"file[]\" [maxFileSize]=\"maxFileSize\" accept=\"{{accept}}\"\r\n pTooltip=\"Ch\u1ECDn t\u1EEB m\u00E1y t\u00EDnh\" toolStipPosition=\"top\" multiple=\"single\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onSelect)=\"onSelectFile($event)\"\r\n (onError)=\"handleError($event)\">\r\n </p-fileUpload>\r\n </div>\r\n\r\n</div>\r\n\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"menu\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>",
34595
+ template: "<div class=\"file-upload\">\r\n <div class=\"fl-icon\">\r\n <i *ngIf=\"loading\" class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\r\n <i *ngIf=\"!loading\" class=\"pi pi-file-o\" style=\"font-size: 2rem\"></i>\r\n </div>\r\n\r\n <div class=\"fl-file-name\" (click)=\"onDownloadOrViewFile()\">\r\n <span *ngIf=\"!showNoti\">{{selectedFileName}}</span>\r\n <span *ngIf=\"showNoti\"> {{notification}} </span>\r\n </div>\r\n\r\n <div class=\"fl-buttons\">\r\n <button *ngIf=\"!hasFile && !readonly\" pTooltip=\"Ch\u1ECDn file\" class=\"fl-choose\"\r\n class=\"link-or-action p-button-text p-button-rounded fl-choose\" tooltipPosition=\"top\" pButton type=\"button\"\r\n icon=\"pi pi-plus\" (click)=\"onOpenSelect()\"></button>\r\n\r\n <button *ngIf=\"hasFile && !readonly\" (click)=\"onRemoveFile()\"\r\n class=\"link-or-action p-button-text p-button-rounded p-button-danger fl-remove\" pTooltip=\"X\u00F3a file\"\r\n tooltipPosition=\"top\" pButton type=\"button\" icon=\"pi pi-trash\"></button>\r\n\r\n <button [disabled]=\"!menu || !menu.length\" 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)\"></button>\r\n </div>\r\n\r\n <div style=\"display: none;\">\r\n <p-fileUpload #file [accept]=\"accept\" [auto]=\"false\" class=\"file-upload\" mode=\"basic\"\r\n [chooseLabel]=\"chooseLabel\" name=\"file[]\" [maxFileSize]=\"maxFileSize\" accept=\"{{accept}}\"\r\n pTooltip=\"Ch\u1ECDn t\u1EEB m\u00E1y t\u00EDnh\" toolStipPosition=\"top\" multiple=\"single\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onSelect)=\"onSelectFile($event)\"\r\n (onError)=\"handleError($event)\">\r\n </p-fileUpload>\r\n </div>\r\n\r\n</div>\r\n\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"menu\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>",
34742
34596
  providers: [
34743
34597
  {
34744
34598
  provide: forms.NG_VALUE_ACCESSOR,
@@ -34891,11 +34745,9 @@
34891
34745
  this.decimalPlaces = 2;
34892
34746
  this.viewMode = false;
34893
34747
  this.inputStyleClass = '';
34894
- this.thousandSeperator = '.';
34895
34748
  this.onFocus = new i0.EventEmitter();
34896
34749
  this.onBlur = new i0.EventEmitter();
34897
34750
  this.onChanged = new i0.EventEmitter();
34898
- this.locale = 'vi-VN';
34899
34751
  }
34900
34752
  Object.defineProperty(MaskComponent.prototype, "placeholder", {
34901
34753
  set: function (value) {
@@ -34907,11 +34759,10 @@
34907
34759
  configurable: true
34908
34760
  });
34909
34761
  MaskComponent.prototype.ngOnInit = function () {
34910
- this.locale = this.thousandSeperator == '.' ? 'vi-VN' : 'en-US';
34911
34762
  };
34912
34763
  MaskComponent.prototype.writeValue = function (obj) {
34913
34764
  if (obj) {
34914
- this.model = this._numberPipe.transform(obj, '', this.locale);
34765
+ this.model = this._numberPipe.transform(obj, '', 'vi-VN');
34915
34766
  this.value = Number(this.model);
34916
34767
  }
34917
34768
  else if (obj === 0) {
@@ -34929,7 +34780,7 @@
34929
34780
  return 'separator.0';
34930
34781
  };
34931
34782
  MaskComponent.prototype.getThousandSeperator = function () {
34932
- return this.thousandSeperator || '.';
34783
+ return '.';
34933
34784
  };
34934
34785
  MaskComponent.prototype.handleFocus = function () {
34935
34786
  this.onFocus.emit(this.value);
@@ -34961,7 +34812,7 @@
34961
34812
  }
34962
34813
  };
34963
34814
  MaskComponent.prototype.numberToStringVN = function (number) {
34964
- return this._numberPipe.transform(number, '', this.locale);
34815
+ return this._numberPipe.transform(number, '', 'vi-VN');
34965
34816
  };
34966
34817
  MaskComponent.prototype.registerOnChange = function (fn) {
34967
34818
  this.onChange = fn;
@@ -35006,7 +34857,6 @@
35006
34857
  decimalPlaces: [{ type: i0.Input }],
35007
34858
  viewMode: [{ type: i0.Input }],
35008
34859
  inputStyleClass: [{ type: i0.Input }],
35009
- thousandSeperator: [{ type: i0.Input }],
35010
34860
  onFocus: [{ type: i0.Output }],
35011
34861
  onBlur: [{ type: i0.Output }],
35012
34862
  onChanged: [{ type: i0.Output }]
@@ -35913,6 +35763,12 @@
35913
35763
  _this.onRemove = new i0.EventEmitter();
35914
35764
  _this.onChanged = new i0.EventEmitter();
35915
35765
  _this.dataModel = {};
35766
+ _this.supportedExtensions = [
35767
+ 'pdf',
35768
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
35769
+ 'mp4', 'webm', 'ogg',
35770
+ 'mp3', 'wav', 'aac' // Âm thanh
35771
+ ];
35916
35772
  if (_this._userService.isValidAccessToken()) {
35917
35773
  _this.userId = _this._userService.getUserIdCombine();
35918
35774
  }
@@ -35946,8 +35802,8 @@
35946
35802
  ServiceFileUploadComponent.prototype.getServiceFile = function () {
35947
35803
  return __awaiter(this, void 0, void 0, function () {
35948
35804
  var serviceRequestModel, fileObject;
35949
- return __generator(this, function (_a) {
35950
- switch (_a.label) {
35805
+ return __generator(this, function (_b) {
35806
+ switch (_b.label) {
35951
35807
  case 0:
35952
35808
  if (!this.hasKeys()) return [3 /*break*/, 2];
35953
35809
  serviceRequestModel = {
@@ -35959,7 +35815,7 @@
35959
35815
  this.setNoti('Đang lấy đính kèm...');
35960
35816
  return [4 /*yield*/, this._fileObjectService.getSingleServiceFile(serviceRequestModel)];
35961
35817
  case 1:
35962
- fileObject = (_a.sent()).data;
35818
+ fileObject = (_b.sent()).data;
35963
35819
  this.loading = false;
35964
35820
  this.setNoti(null);
35965
35821
  if (fileObject) {
@@ -35979,7 +35835,7 @@
35979
35835
  this.selectedFileName = null;
35980
35836
  this.onChangeBase(null);
35981
35837
  this.onChanged.emit();
35982
- _a.label = 3;
35838
+ _b.label = 3;
35983
35839
  case 3:
35984
35840
  this.setMenu();
35985
35841
  return [2 /*return*/];
@@ -36226,12 +36082,36 @@
36226
36082
  ServiceFileUploadComponent.prototype.setDisabledState = function (isDisabled) {
36227
36083
  this.isDisabled = isDisabled;
36228
36084
  };
36085
+ ServiceFileUploadComponent.prototype.isViewableFile = function (url) {
36086
+ var _a;
36087
+ if (!url) {
36088
+ return false;
36089
+ }
36090
+ try {
36091
+ // Lấy phần mở rộng của file từ URL
36092
+ var extension = (_a = url.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
36093
+ return extension ? this.supportedExtensions.includes(extension) : false;
36094
+ }
36095
+ catch (error) {
36096
+ console.error('Lỗi khi kiểm tra đuôi file:', error);
36097
+ return false;
36098
+ }
36099
+ };
36100
+ ServiceFileUploadComponent.prototype.onDownloadOrViewFile = function () {
36101
+ if (this.isViewableFile(this.selectedFileName)) {
36102
+ var url = this._fileObjectService.getPublicDownloadLinkByFileId(this.fileId);
36103
+ window.open(url, '_blank');
36104
+ }
36105
+ else {
36106
+ this.onDownloadFile();
36107
+ }
36108
+ };
36229
36109
  return ServiceFileUploadComponent;
36230
36110
  }(ComponentBase));
36231
36111
  ServiceFileUploadComponent.decorators = [
36232
36112
  { type: i0.Component, args: [{
36233
36113
  selector: 'service-file-upload',
36234
- template: "<div class=\"file-upload\">\r\n <div class=\"fl-icon\">\r\n <i *ngIf=\"loading\" class=\"pi pi-spin pi-spinner\"></i>\r\n <i *ngIf=\"!loading\" class=\"pi pi-file-o\"></i>\r\n </div>\r\n\r\n <div class=\"fl-file-name\" (click)=\"onDownloadFile()\">\r\n <div>\r\n <ng-container *ngIf=\"!showNoti\">\r\n <span pTooltip=\"{{selectedFileName}}\">{{selectedFileNameShort}}</span>\r\n <span *ngIf=\"extension\">.{{extension}} </span>\r\n </ng-container>\r\n <span *ngIf=\"showNoti\"> {{notification}} </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fl-buttons\">\r\n <button *ngIf=\"!hasFile && !readonly\" pTooltip=\"Ch\u1ECDn file\" class=\"fl-choose\"\r\n class=\"link-or-action p-button-text p-button-rounded fl-choose\" tooltipPosition=\"top\" pButton type=\"button\"\r\n icon=\"pi pi-plus\" (click)=\"onOpenSelect()\"></button>\r\n\r\n <button *ngIf=\"hasFile && !readonly\" (click)=\"onRemoveFile()\"\r\n class=\"link-or-action p-button-text p-button-rounded p-button-danger fl-remove\" pTooltip=\"X\u00F3a file\"\r\n tooltipPosition=\"top\" pButton type=\"button\" icon=\"pi pi-trash\"></button>\r\n\r\n <button [disabled]=\"!menu || !menu.length\" 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)\"></button>\r\n </div>\r\n\r\n <div style=\"display: none;\">\r\n <p-fileUpload #file [accept]=\"accept\" class=\"file-upload\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file[]\"\r\n [maxFileSize]=\"control.maxFileSize\" pTooltip=\"Ch\u1ECDn t\u1EEB m\u00E1y t\u00EDnh\" toolStipPosition=\"top\" multiple=\"single\"\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\" [accept]=\"accept\"\r\n (onSelect)=\"onSelectFile($event)\">\r\n </p-fileUpload>\r\n </div>\r\n\r\n</div>\r\n\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"menu\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>",
36114
+ template: "<div class=\"file-upload\">\r\n <div class=\"fl-icon\">\r\n <i *ngIf=\"loading\" class=\"pi pi-spin pi-spinner\"></i>\r\n <i *ngIf=\"!loading\" class=\"pi pi-file-o\"></i>\r\n </div>\r\n\r\n <div class=\"fl-file-name\" (click)=\"onDownloadOrViewFile()\">\r\n <div>\r\n <ng-container *ngIf=\"!showNoti\">\r\n <span pTooltip=\"{{selectedFileName}}\">{{selectedFileNameShort}}</span>\r\n <span *ngIf=\"extension\">.{{extension}} </span>\r\n </ng-container>\r\n <span *ngIf=\"showNoti\"> {{notification}} </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fl-buttons\">\r\n <button *ngIf=\"!hasFile && !readonly\" pTooltip=\"Ch\u1ECDn file\" class=\"fl-choose\"\r\n class=\"link-or-action p-button-text p-button-rounded fl-choose\" tooltipPosition=\"top\" pButton type=\"button\"\r\n icon=\"pi pi-plus\" (click)=\"onOpenSelect()\"></button>\r\n\r\n <button *ngIf=\"hasFile && !readonly\" (click)=\"onRemoveFile()\"\r\n class=\"link-or-action p-button-text p-button-rounded p-button-danger fl-remove\" pTooltip=\"X\u00F3a file\"\r\n tooltipPosition=\"top\" pButton type=\"button\" icon=\"pi pi-trash\"></button>\r\n\r\n <button [disabled]=\"!menu || !menu.length\" 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)\"></button>\r\n </div>\r\n\r\n <div style=\"display: none;\">\r\n <p-fileUpload #file [accept]=\"accept\" class=\"file-upload\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file[]\"\r\n [maxFileSize]=\"control.maxFileSize\" pTooltip=\"Ch\u1ECDn t\u1EEB m\u00E1y t\u00EDnh\" toolStipPosition=\"top\" multiple=\"single\"\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\" [accept]=\"accept\"\r\n (onSelect)=\"onSelectFile($event)\">\r\n </p-fileUpload>\r\n </div>\r\n\r\n</div>\r\n\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"menu\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>",
36235
36115
  providers: [
36236
36116
  {
36237
36117
  provide: forms.NG_VALUE_ACCESSOR,
@@ -45514,10 +45394,8 @@
45514
45394
  },] }
45515
45395
  ];
45516
45396
 
45517
- var moment$1 = moment___namespace;
45518
45397
  var TnDatePipe = /** @class */ (function () {
45519
- function TnDatePipe(format) {
45520
- this.format = format;
45398
+ function TnDatePipe() {
45521
45399
  }
45522
45400
  TnDatePipe.prototype.addZero = function (value) {
45523
45401
  if (value < 10)
@@ -45527,8 +45405,6 @@
45527
45405
  TnDatePipe.prototype.transform = function (value, args) {
45528
45406
  if (value == null)
45529
45407
  return '';
45530
- if (this.format)
45531
- return moment$1(value).format(this.format);
45532
45408
  var date = new Date(value);
45533
45409
  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();
45534
45410
  };
@@ -45538,10 +45414,7 @@
45538
45414
  { type: i0.Pipe, args: [{
45539
45415
  name: 'tnDate'
45540
45416
  },] }
45541
- ];
45542
- TnDatePipe.ctorParameters = function () { return [
45543
- { type: undefined, decorators: [{ type: i0.Inject, args: [i0.LOCALE_ID,] }] }
45544
- ]; };
45417
+ ];
45545
45418
 
45546
45419
  var UserFormatPipe = /** @class */ (function () {
45547
45420
  function UserFormatPipe(_userService) {
@@ -45706,6 +45579,70 @@
45706
45579
  { type: UserService }
45707
45580
  ]; };
45708
45581
 
45582
+ // fix for build prod
45583
+ var moment$1 = moment___default['default'];
45584
+ var SignatureDetailComponent = /** @class */ (function (_super) {
45585
+ __extends(SignatureDetailComponent, _super);
45586
+ function SignatureDetailComponent(injector) {
45587
+ return _super.call(this, injector) || this;
45588
+ }
45589
+ SignatureDetailComponent.prototype.ngOnInit = function () {
45590
+ this.model.data = this.parentModel.advanceData;
45591
+ this.buildTree();
45592
+ };
45593
+ SignatureDetailComponent.prototype.buildTree = function () {
45594
+ var nodes = [];
45595
+ for (var ind in this.model.data) {
45596
+ var item = this.model.data[ind];
45597
+ var childNodes = { expanded: true, children: [] };
45598
+ childNodes.label = "" + item.reason;
45599
+ childNodes.expandedIcon = 'fas fa-signature';
45600
+ childNodes.collapsedIcon = 'fas fa-signature';
45601
+ childNodes.leaf = false;
45602
+ if (item.reason) {
45603
+ childNodes.children.push({
45604
+ label: 'Người ký: ' + item.certificate.subject.nameOfSigner,
45605
+ expandedIcon: 'fas fa-user-tag',
45606
+ collapsedIcon: 'fas fa-user-tag',
45607
+ leaf: true
45608
+ });
45609
+ }
45610
+ childNodes.children.push({
45611
+ label: 'Đơn vị: ' + item.certificate.subject.organizationUnit + ' - ' + item.certificate.subject.organization,
45612
+ expandedIcon: 'fas fa-building',
45613
+ collapsedIcon: 'fas fa-building',
45614
+ leaf: true
45615
+ });
45616
+ childNodes.children.push({
45617
+ label: 'Chứng thư cấp bởi: ' + item.certificate.issuerDN.nameOfIssuer,
45618
+ expandedIcon: 'fas fa-certificate',
45619
+ collapsedIcon: 'fas fa-certificate',
45620
+ leaf: true
45621
+ });
45622
+ childNodes.children.push({
45623
+ label: 'Thời gian ký: ' + moment$1(item.signDate).format('D/MM/Y hh:mm:ss Z'),
45624
+ expandedIcon: 'fas fa-clock',
45625
+ collapsedIcon: 'fas fa-clock',
45626
+ leaf: true
45627
+ });
45628
+ nodes.push(childNodes);
45629
+ }
45630
+ this.model.dataSource = nodes;
45631
+ };
45632
+ return SignatureDetailComponent;
45633
+ }(ComponentBase));
45634
+ SignatureDetailComponent.decorators = [
45635
+ { type: i0.Component, args: [{
45636
+ selector: 'signature-detail',
45637
+ 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>",
45638
+ providers: [ComponentContextService],
45639
+ 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}"]
45640
+ },] }
45641
+ ];
45642
+ SignatureDetailComponent.ctorParameters = function () { return [
45643
+ { type: i0.Injector }
45644
+ ]; };
45645
+
45709
45646
  function coreDeclaration() {
45710
45647
  return [
45711
45648
  AddressComponent,
@@ -45835,7 +45772,8 @@
45835
45772
  FilePickerDialogComponent,
45836
45773
  AddNewsComponent,
45837
45774
  CommonDashboardComponent,
45838
- NotFoundComponent
45775
+ NotFoundComponent,
45776
+ SignatureDetailComponent
45839
45777
  ];
45840
45778
  }
45841
45779
  function coreModuleImport() {
@@ -47388,67 +47326,6 @@
47388
47326
  { type: ModuleConfigService }
47389
47327
  ]; };
47390
47328
 
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
-
47452
47329
  var ErrorType = /** @class */ (function () {
47453
47330
  function ErrorType() {
47454
47331
  }
@@ -47577,64 +47454,22 @@
47577
47454
  return TemplateTextMany;
47578
47455
  }());
47579
47456
 
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
- });
47457
+ var ServiceRequestModel = /** @class */ (function () {
47458
+ function ServiceRequestModel() {
47459
+ this.service = '';
47460
+ this.entityInstanceId = '';
47461
+ this.parent = null;
47462
+ this.serviceCode = '';
47463
+ this.entity = '';
47464
+ this.entityKey = '';
47465
+ }
47466
+ return ServiceRequestModel;
47467
+ }());
47468
+
47469
+ var FileVersionDTO = /** @class */ (function () {
47470
+ function FileVersionDTO() {
47636
47471
  }
47637
- return FileManagerSetting;
47472
+ return FileVersionDTO;
47638
47473
  }());
47639
47474
 
47640
47475
  (function (PermissionBase) {
@@ -47992,16 +47827,18 @@
47992
47827
  exports.FILE_TYPES = FILE_TYPES;
47993
47828
  exports.FieldDefineIsWorkflowControl = FieldDefineIsWorkflowControl;
47994
47829
  exports.FileDataService = FileDataService;
47830
+ exports.FileExplorerItem = FileExplorerItem;
47831
+ exports.FileExplorerNewService = FileExplorerNewService;
47995
47832
  exports.FileExplorerService = FileExplorerService;
47996
47833
  exports.FileManagerComponent = FileManagerComponent;
47997
47834
  exports.FileManagerControlSchema = FileManagerControlSchema;
47998
- exports.FileManagerSetting = FileManagerSetting;
47999
47835
  exports.FileObjectService = FileObjectService;
48000
47836
  exports.FilePickerDialogComponent = FilePickerDialogComponent;
48001
47837
  exports.FileUploadComponent = FileUploadComponent;
48002
47838
  exports.FileUploadControlSchema = FileUploadControlSchema;
48003
- exports.FileUploadSetting = FileUploadSetting;
48004
47839
  exports.FileV4Service = FileV4Service;
47840
+ exports.FileVersionDTO = FileVersionDTO;
47841
+ exports.FileVersionService = FileVersionService;
48005
47842
  exports.Filter = Filter;
48006
47843
  exports.FolderService = FolderService;
48007
47844
  exports.FormControlBase = FormControlBase;
@@ -48042,6 +47879,7 @@
48042
47879
  exports.ModuleConfigService = ModuleConfigService;
48043
47880
  exports.MultiTranslateHttpLoader = MultiTranslateHttpLoader;
48044
47881
  exports.MultipleReferenceDataFormatPipe = MultipleReferenceDataFormatPipe;
47882
+ exports.MyDriveService = MyDriveService;
48045
47883
  exports.NodeService = NodeService;
48046
47884
  exports.NotFoundComponent = NotFoundComponent;
48047
47885
  exports.NotificationService = NotificationService;
@@ -48049,7 +47887,6 @@
48049
47887
  exports.NumberCompareValidator = NumberCompareValidator;
48050
47888
  exports.NumberOnlyValidator = NumberOnlyValidator;
48051
47889
  exports.NumberRangeControlSchema = NumberRangeControlSchema;
48052
- exports.OrganizationBaseService = OrganizationBaseService;
48053
47890
  exports.OrganizationFormatPipe = OrganizationFormatPipe;
48054
47891
  exports.OrganizationNameFormatPipe = OrganizationNameFormatPipe;
48055
47892
  exports.OrganizationPickerControlSchema = OrganizationPickerControlSchema;
@@ -48091,6 +47928,7 @@
48091
47928
  exports.SchemaBase = SchemaBase;
48092
47929
  exports.SecurePipe = SecurePipe;
48093
47930
  exports.ServiceFileUploadComponent = ServiceFileUploadComponent;
47931
+ exports.ServiceRequestModel = ServiceRequestModel;
48094
47932
  exports.SessionTypes = SessionTypes;
48095
47933
  exports.SignalRService = SignalRService;
48096
47934
  exports.SimpleDicItem = SimpleDicItem;
@@ -48293,29 +48131,27 @@
48293
48131
  exports.ɵd = ExceptionHandlerService;
48294
48132
  exports.ɵda = TnAppNotificationListComponent;
48295
48133
  exports.ɵdb = TnAppNotificationComponent;
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;
48134
+ exports.ɵdc = FolderFormComponent;
48135
+ exports.ɵdd = FileFormComponent;
48136
+ exports.ɵde = FileViewerComponent;
48137
+ exports.ɵdf = FileVersionListComponent;
48138
+ exports.ɵdg = WorkflowHistoryComponent;
48139
+ exports.ɵdh = EntityWorkflowHistoryService;
48140
+ exports.ɵdi = WorkflowHistoryDialogComponent;
48141
+ exports.ɵdj = WorkflowHistoryNewComponent;
48142
+ exports.ɵdk = WorkflowSettingComponent;
48143
+ exports.ɵdl = EntityWorkflowSettingService;
48144
+ exports.ɵdm = WorkflowSettingDialogComponent;
48145
+ exports.ɵdn = QrCodeGeneratorComponent;
48146
+ exports.ɵdo = AccessDeniedV1Component;
48147
+ exports.ɵdp = AddNewsComponent;
48148
+ exports.ɵdq = ArticleService;
48149
+ exports.ɵdr = NewsCategoryService;
48150
+ exports.ɵds = SignatureDetailComponent;
48151
+ exports.ɵdt = CheckReadyComponent;
48152
+ exports.ɵdu = SendAccessTokenInterceptor;
48153
+ exports.ɵdv = LogInterceptor;
48154
+ exports.ɵdw = PermissionUtilsInterceptor;
48319
48155
  exports.ɵe = CanBo_HoSoService;
48320
48156
  exports.ɵf = AfterViewCheckedComponent;
48321
48157
  exports.ɵg = AdvanceSearchComponent;