tnx-shared 5.0.76 → 5.0.77

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 (126) hide show
  1. package/bundles/tnx-shared.umd.js +1032 -892
  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 +25 -38
  12. package/classes/form-schema.d.ts.map +1 -1
  13. package/classes/public-function.d.ts +1 -1
  14. package/components/address/address.component.d.ts.map +1 -1
  15. package/components/address-new/address-new.component.d.ts +37 -0
  16. package/components/address-new/address-new.component.d.ts.map +1 -0
  17. package/components/address-new/address-new.component.ngfactory.d.ts.map +1 -0
  18. package/components/address-new/address-new.component.scss.shim.ngstyle.d.ts.map +1 -0
  19. package/components/address-new/models/don-vi-hanh-chinh.d.ts +6 -0
  20. package/components/address-new/models/don-vi-hanh-chinh.d.ts.map +1 -0
  21. package/components/address-new/services/address.service.d.ts +8 -0
  22. package/components/address-new/services/address.service.d.ts.map +1 -0
  23. package/components/address-new/services/address.service.ngfactory.d.ts.map +1 -0
  24. package/components/autocomplete-picker/autocomplete-picker.component.d.ts +0 -1
  25. package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
  26. package/components/common-app-component/common-app-component.d.ts +1 -4
  27. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  28. package/components/crud/crud-form/crud-form.component.d.ts +2 -2
  29. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  30. package/components/crud/crud-list/crud-list.component.d.ts +1 -6
  31. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  32. package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
  33. package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts.map +1 -1
  34. package/components/file-explorer/file-manager/file-manager.component.d.ts +3 -0
  35. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  36. package/components/file-explorer/services/download-link.service.d.ts +1 -0
  37. package/components/file-explorer/services/download-link.service.d.ts.map +1 -1
  38. package/components/file-explorer/services/file-explorer.service.d.ts +2 -0
  39. package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
  40. package/components/file-explorer/services/file-object.service.d.ts +2 -0
  41. package/components/file-explorer/services/file-object.service.d.ts.map +1 -1
  42. package/components/file-explorer/signature-detail/signature-detail.component.d.ts +8 -0
  43. package/components/file-explorer/signature-detail/signature-detail.component.d.ts.map +1 -0
  44. package/components/file-explorer/signature-detail/signature-detail.component.ngfactory.d.ts.map +1 -0
  45. package/components/file-explorer/signature-detail/signature-detail.component.scss.shim.ngstyle.d.ts.map +1 -0
  46. package/components/file-upload/file-upload.component.d.ts +3 -0
  47. package/components/file-upload/file-upload.component.d.ts.map +1 -1
  48. package/components/mask/mask.component.d.ts +0 -2
  49. package/components/mask/mask.component.d.ts.map +1 -1
  50. package/components/service-file-upload/service-file-upload.component.d.ts +3 -0
  51. package/components/service-file-upload/service-file-upload.component.d.ts.map +1 -1
  52. package/configs/component-context.constant.d.ts +0 -1
  53. package/configs/component-context.constant.d.ts.map +1 -1
  54. package/esm2015/classes/base/data-form-base.js +5 -5
  55. package/esm2015/classes/base/data-list-base.js +23 -48
  56. package/esm2015/classes/constants.js +1 -6
  57. package/esm2015/classes/form-schema.js +29 -34
  58. package/esm2015/components/address/address.component.js +10 -4
  59. package/esm2015/components/address-new/address-new.component.js +224 -0
  60. package/esm2015/components/address-new/models/don-vi-hanh-chinh.js +8 -0
  61. package/esm2015/components/address-new/services/address.service.js +25 -0
  62. package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +16 -72
  63. package/esm2015/components/common-app-component/app.menu.component.js +2 -2
  64. package/esm2015/components/common-app-component/common-app-component.js +3 -26
  65. package/esm2015/components/crud/crud-form/crud-form.component.js +11 -10
  66. package/esm2015/components/crud/crud-list/crud-list.component.js +6 -71
  67. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +3 -29
  68. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +3 -29
  69. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +155 -14
  70. package/esm2015/components/file-explorer/services/download-link.service.js +4 -1
  71. package/esm2015/components/file-explorer/services/file-explorer.service.js +21 -7
  72. package/esm2015/components/file-explorer/services/file-object.service.js +18 -1
  73. package/esm2015/components/file-explorer/signature-detail/signature-detail.component.js +66 -0
  74. package/esm2015/components/file-upload/file-upload.component.js +34 -2
  75. package/esm2015/components/mask/mask.component.js +4 -8
  76. package/esm2015/components/service-file-upload/service-file-upload.component.js +32 -2
  77. package/esm2015/components/workflow/services/entity-workflow-history.service.js +3 -3
  78. package/esm2015/components/workflow/services/entity-workflow-setting.service.js +4 -4
  79. package/esm2015/configs/component-context.constant.js +2 -3
  80. package/esm2015/models/grid-info.js +1 -1
  81. package/esm2015/pipes/tn-date.pipe.js +2 -12
  82. package/esm2015/public-api.js +7 -3
  83. package/esm2015/services/base.service.js +1 -16
  84. package/esm2015/services/common.service.js +1 -9
  85. package/esm2015/services/crud.service.js +4 -23
  86. package/esm2015/services/menu.service.js +3 -6
  87. package/esm2015/services/notifier.service.js +2 -2
  88. package/esm2015/services/permission.service.js +2 -9
  89. package/esm2015/services/template-text-v4.service.js +1 -1
  90. package/esm2015/services/user-v5.service.js +1 -1
  91. package/esm2015/services/user.service.js +2 -8
  92. package/esm2015/tnx-shared.js +94 -94
  93. package/esm2015/tnx-shared.module.js +6 -2
  94. package/fesm2015/tnx-shared.js +693 -536
  95. package/fesm2015/tnx-shared.js.map +1 -1
  96. package/models/grid-info.d.ts +0 -1
  97. package/models/grid-info.d.ts.map +1 -1
  98. package/package.json +2 -2
  99. package/pipes/tn-date.pipe.d.ts +0 -2
  100. package/pipes/tn-date.pipe.d.ts.map +1 -1
  101. package/public-api.d.ts +6 -2
  102. package/public-api.d.ts.map +1 -1
  103. package/services/base.service.d.ts +0 -1
  104. package/services/base.service.d.ts.map +1 -1
  105. package/services/common.service.d.ts +0 -4
  106. package/services/common.service.d.ts.map +1 -1
  107. package/services/crud.service.d.ts.map +1 -1
  108. package/services/menu.service.d.ts +1 -1
  109. package/services/menu.service.d.ts.map +1 -1
  110. package/services/permission.service.d.ts +0 -1
  111. package/services/permission.service.d.ts.map +1 -1
  112. package/services/template-text-v4.service.d.ts.map +1 -1
  113. package/services/user.service.d.ts.map +1 -1
  114. package/tnx-shared.d.ts +93 -93
  115. package/tnx-shared.d.ts.map +1 -1
  116. package/tnx-shared.metadata.json +1 -1
  117. package/tnx-shared.module.d.ts +3 -2
  118. package/tnx-shared.module.d.ts.map +1 -1
  119. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
  120. package/components/file-explorer/models/file-settings.d.ts +0 -46
  121. package/components/file-explorer/models/file-settings.d.ts.map +0 -1
  122. package/esm2015/components/file-explorer/models/file-settings.js +0 -60
  123. package/esm2015/services/organization-base.service.js +0 -57
  124. package/services/organization-base.service.d.ts +0 -16
  125. package/services/organization-base.service.d.ts.map +0 -1
  126. package/services/organization-base.service.ngfactory.d.ts.map +0 -1
@@ -28,6 +28,7 @@
28
28
 
29
29
  var stringify__default = /*#__PURE__*/_interopDefaultLegacy(stringify);
30
30
  var moment___namespace = /*#__PURE__*/_interopNamespace(moment_);
31
+ var FileSaver__default = /*#__PURE__*/_interopDefaultLegacy(FileSaver);
31
32
  var printJS___namespace = /*#__PURE__*/_interopNamespace(printJS_);
32
33
  var JWT___namespace = /*#__PURE__*/_interopNamespace(JWT_);
33
34
  var jQuery___namespace = /*#__PURE__*/_interopNamespace(jQuery_);
@@ -395,8 +396,7 @@
395
396
  MENU_CHANGED: 'MENU_CHANGED',
396
397
  ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER: 'ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER',
397
398
  SHOW_WAIT_BOX: 'SHOW_WAIT_BOX',
398
- SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM',
399
- NEED_CLEAR_PERMISSION_CACHE: 'NEED_CLEAR_PERMISSION_CACHE'
399
+ SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM'
400
400
  };
401
401
  ComCtxConstants.ROOT_USMART = {
402
402
  SHOW_CONFIG_DATA_DEFAULT: 'SHOW_CONFIG_DATA_DEFAULT',
@@ -908,7 +908,7 @@
908
908
  NotifierService.prototype.showWarningByReponse = function (res) {
909
909
  var message = res.message;
910
910
  if (!message)
911
- message = 'Có lỗi xảy ra, vui lòng liên hệ quản trị viên!';
911
+ message = res.error;
912
912
  this.showWarning(message);
913
913
  };
914
914
  NotifierService.prototype.showBusinessError = function (message, key, header, life) {
@@ -2361,14 +2361,6 @@
2361
2361
  errorDetail: err
2362
2362
  };
2363
2363
  };
2364
- CommonService.prototype.tryParseJson = function (data) {
2365
- try {
2366
- return { valid: true, value: JSON.parse(data) };
2367
- }
2368
- catch (e) {
2369
- return { valid: false, value: data };
2370
- }
2371
- };
2372
2364
  return CommonService;
2373
2365
  }());
2374
2366
  CommonService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CommonService_Factory() { return new CommonService(i0.ɵɵinject(ModuleConfigService)); }, token: CommonService, providedIn: "root" });
@@ -3254,11 +3246,7 @@
3254
3246
  EnumWorkflowCoreCodeSettingKey["MAC_DINH"] = "workflowCoreTrinhKy";
3255
3247
  EnumWorkflowCoreCodeSettingKey["PHE_DUYET_2_BUOC"] = "workflowCoreTrinhKy2Buoc";
3256
3248
  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 = {}));
3249
+ })(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
3262
3250
 
3263
3251
  var ModelSchema = /** @class */ (function () {
3264
3252
  function ModelSchema(init) {
@@ -3334,7 +3322,6 @@
3334
3322
  this.function = new CrudListCustomFunction();
3335
3323
  this.popupHeader = '';
3336
3324
  this.popupSize = new PopupSize();
3337
- this.showMenuButtons = true;
3338
3325
  this.getCustomDataTrinhKy = function (rowData) { return ({}); };
3339
3326
  this.getLabelButtonTrinhKy = function (rowData) { return 'Trình ký'; };
3340
3327
  this.checkReadyToTrinhKy = function () { return true; };
@@ -3649,7 +3636,6 @@
3649
3636
  _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
3637
  _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
3638
  _this.fireCallBackInside = true;
3652
- _this.coreVersion = exports.EnumCoreVersion.V5;
3653
3639
  _this.funcCompare = function (item, value) { return item[_this.valueField] == value; };
3654
3640
  for (var key in init) {
3655
3641
  _this[key] = init[key];
@@ -3703,7 +3689,6 @@
3703
3689
  _this.prefix = '';
3704
3690
  _this.suffix = '';
3705
3691
  _this.decimalPlaces = 2;
3706
- _this.thousandSeperator = '.';
3707
3692
  for (var key in init) {
3708
3693
  _this[key] = init[key];
3709
3694
  }
@@ -3883,6 +3868,8 @@
3883
3868
  _this.mode = exports.FileManagerMode.multiple;
3884
3869
  _this.layout = exports.EnumFileLayout.LIST;
3885
3870
  _this.readonly = false;
3871
+ _this.signonly = false;
3872
+ _this.uploadOnly = false;
3886
3873
  // Trường hợp ở trong form, dùng trường này để lấy
3887
3874
  // entityKey từ model.data thay vì truyền vào entityKey
3888
3875
  _this.entityKeyField = 'id';
@@ -4154,6 +4141,34 @@
4154
4141
  }
4155
4142
  return AddressControlSchema;
4156
4143
  }(FormControlBase));
4144
+ var AddressNewControlSchema = /** @class */ (function (_super) {
4145
+ __extends(AddressNewControlSchema, _super);
4146
+ function AddressNewControlSchema(init) {
4147
+ var _this = _super.call(this) || this;
4148
+ _this.hideNo = false;
4149
+ _this.hideStreet = false;
4150
+ _this.hideWard = false;
4151
+ _this.hideDistrict = false;
4152
+ _this.requiredNo = true;
4153
+ _this.requiredStreet = true;
4154
+ _this.requiredWard = true;
4155
+ _this.requiredDistrict = true;
4156
+ _this.requiredProvince = true;
4157
+ _this.wardToProvince = true;
4158
+ _this.noWidth = 1;
4159
+ _this.streetWidth = 3;
4160
+ _this.wardWidth = 3;
4161
+ _this.districtWidth = 2;
4162
+ _this.provinceWidth = 3;
4163
+ _this.showInBox = false;
4164
+ _this.hideHolder = true;
4165
+ for (var key in init) {
4166
+ _this[key] = init[key];
4167
+ }
4168
+ return _this;
4169
+ }
4170
+ return AddressNewControlSchema;
4171
+ }(FormControlBase));
4157
4172
  var VanBanPickerControlSchema = /** @class */ (function (_super) {
4158
4173
  __extends(VanBanPickerControlSchema, _super);
4159
4174
  function VanBanPickerControlSchema(init) {
@@ -4497,7 +4512,6 @@
4497
4512
  DataType["decimal"] = "decimal";
4498
4513
  DataType["boolean"] = "boolean";
4499
4514
  DataType["enum"] = "enum";
4500
- DataType["currency"] = "currency";
4501
4515
  })(exports.DataType || (exports.DataType = {}));
4502
4516
  (function (ControlType) {
4503
4517
  ControlType["dropdown"] = "dropdown";
@@ -4569,34 +4583,7 @@
4569
4583
  (function (ExportAllMode) {
4570
4584
  ExportAllMode[ExportAllMode["ManualGetData"] = 0] = "ManualGetData";
4571
4585
  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 = {}));
4586
+ })(exports.ExportAllMode || (exports.ExportAllMode = {}));
4600
4587
 
4601
4588
  var _a;
4602
4589
  (function (WorkflowCoreStatusEnum) {
@@ -6038,24 +6025,14 @@
6038
6025
  if (model.hasOwnProperty(sourceField)) {
6039
6026
  valueFilter = model[sourceField];
6040
6027
  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
- }
6028
+ valueFilter = valueFilter[subField];
6047
6029
  }
6048
6030
  }
6049
6031
  else if (rootModel) {
6050
6032
  if (rootModel.hasOwnProperty(sourceField)) {
6051
6033
  valueFilter = rootModel[sourceField];
6052
6034
  if (canAccessSubField(valueFilter)) {
6053
- if (isArray(valueFilter)) {
6054
- valueFilter = valueFilter.map(function (x) { return x[subField]; });
6055
- }
6056
- else {
6057
- valueFilter = valueFilter[subField];
6058
- }
6035
+ valueFilter = valueFilter[subField];
6059
6036
  }
6060
6037
  }
6061
6038
  else {
@@ -6081,12 +6058,7 @@
6081
6058
  finally { if (e_1) throw e_1.error; }
6082
6059
  }
6083
6060
  if (canAccessSubField(temp)) {
6084
- if (isArray(temp)) {
6085
- valueFilter = temp.map(function (x) { return x[subField]; });
6086
- }
6087
- else {
6088
- valueFilter = temp[subField];
6089
- }
6061
+ valueFilter = temp[subField];
6090
6062
  }
6091
6063
  }
6092
6064
  }
@@ -6099,9 +6071,6 @@
6099
6071
  valueFilter = tmpFilter.funcGetValue(valueFilter);
6100
6072
  }
6101
6073
  tmpFilter.value = JSON.stringify(valueFilter);
6102
- if (tmpFilter.modifyValue) {
6103
- valueFilter = tmpFilter.modifyValue(valueFilter);
6104
- }
6105
6074
  tmpFilter.filters = [];
6106
6075
  if (filter.logic && filter.filters) {
6107
6076
  filter.filters.forEach(function (f) { return _this.deQuyReplaceValue(tmpFilter.filters, f, model, rootModel); });
@@ -6252,7 +6221,6 @@
6252
6221
  });
6253
6222
  };
6254
6223
  CrudService.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
6255
- data !== null && data !== void 0 ? data : (data = []);
6256
6224
  var field = schema.field;
6257
6225
  var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
6258
6226
  if (schema.funcGetLabel) {
@@ -6545,24 +6513,6 @@
6545
6513
  });
6546
6514
  return this.postGridInfo(apiUrl, gridInfo);
6547
6515
  };
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
6516
  BaseService.prototype.getAllByGridInfo = function (gridInfo, plusUrl) {
6567
6517
  if (plusUrl === void 0) { plusUrl = ''; }
6568
6518
  var apiUrl = this.apiGetAll;
@@ -7243,11 +7193,11 @@
7243
7193
  return this._serviceUri + "/DownloadLink/" + hash;
7244
7194
  };
7245
7195
  FileExplorerService.prototype.getDownloadForSignUrl = function (hash) {
7246
- return this._serviceUri + "/Download/downloadforsign/" + hash;
7196
+ return this._serviceUri + "/DownloadLink/downloadforsign/" + hash;
7247
7197
  };
7248
7198
  FileExplorerService.prototype.generateLinkDownload = function (model) {
7249
7199
  var _this = this;
7250
- var svUrl = this._serviceUri + "/Download/GenerateDownloadLink";
7200
+ var svUrl = this._serviceUri + "/DownloadLink/GenerateDownloadLink";
7251
7201
  if (model.isFileVersion && !model.fileVersionId) {
7252
7202
  model.fileVersionId = model.fileId;
7253
7203
  }
@@ -7277,7 +7227,7 @@
7277
7227
  this._http.get(url, { responseType: 'blob' })
7278
7228
  .toPromise()
7279
7229
  .then(function (rs) {
7280
- FileSaver.saveAs(rs, fileName);
7230
+ FileSaver__default['default'].saveAs(rs, fileName);
7281
7231
  })
7282
7232
  .catch(function (err) {
7283
7233
  _this._notifierService.showWarning('Lỗi tải file');
@@ -7439,13 +7389,13 @@
7439
7389
  return regex.test(ext);
7440
7390
  };
7441
7391
  FileExplorerService.prototype.saveSignedFile = function (data) {
7442
- return this._http.post(this._serviceUri + "/Signature/SaveSignedFile", data).toPromise();
7392
+ return this._http.post(this._serviceUri + "/KySoFile/SaveSignedFile", data).toPromise();
7443
7393
  };
7444
7394
  FileExplorerService.prototype.getSignatureInfoByFileId = function (fileId) {
7445
- return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileId?fileId=" + fileId).toPromise();
7395
+ return this._http.get(this._serviceUri + "/KySoFile/GetListSignatureByFileId?fileId=" + fileId).toPromise();
7446
7396
  };
7447
7397
  FileExplorerService.prototype.getSignatureInfoByFileVersionId = function (fileVersionId) {
7448
- return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
7398
+ return this._http.get(this._serviceUri + "/KySoFile/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
7449
7399
  };
7450
7400
  FileExplorerService.prototype.getUploadFileVersionApiUrl = function () {
7451
7401
  return this._serviceUri + "/FileVersion/SaveVersionOnEdit";
@@ -7503,6 +7453,20 @@
7503
7453
  var svUrl = this._serviceUri + "/FileObject/CreateServiceFileAnonymous";
7504
7454
  return this._http.post(svUrl, serviceFileObjectDTO).pipe(operators.catchError(function (err) { return _this.handleError(err); })).toPromise();
7505
7455
  };
7456
+ FileExplorerService.prototype.needConvertBeforeSign = function (fileName) {
7457
+ if (fileName.lastIndexOf('.') === -1) {
7458
+ return false;
7459
+ }
7460
+ var fileType = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
7461
+ if ((/(doc|docx|dot|dotm|dotx|xls|xlsx|ppt|pptx)$/i).test(fileType)) {
7462
+ return true;
7463
+ }
7464
+ return false;
7465
+ };
7466
+ FileExplorerService.prototype.changeFileExtension = function (fileName, newExtension) {
7467
+ var arr = fileName.split('.');
7468
+ return fileName.replace("." + arr[arr.length - 1], "." + newExtension);
7469
+ };
7506
7470
  return FileExplorerService;
7507
7471
  }());
7508
7472
  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 +7914,9 @@
7950
7914
  });
7951
7915
  return promise;
7952
7916
  };
7917
+ DownloadLinkService.prototype.getDownloadForSignUrl = function (hash) {
7918
+ return this.serviceUri + "/DownloadForSign/" + hash;
7919
+ };
7953
7920
  return DownloadLinkService;
7954
7921
  }(BaseService));
7955
7922
  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 +8908,6 @@
8941
8908
  }
8942
8909
  else {
8943
8910
  this._applicationContext.getRootContext().replaySubscribeOnce(ComCtxConstants.ROOT.USER_READY, function (rs) {
8944
- var firstTimeLogin = rs;
8945
8911
  var accessToken = _this._oauthService.getAccessToken();
8946
8912
  var decoded = JWT.default(accessToken);
8947
8913
  // 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 +8949,7 @@
8983
8949
  localStorage.setItem(_this.CURRENT_USER_KEY, JSON.stringify(user));
8984
8950
  }
8985
8951
  _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
- }
8952
+ _this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED, true);
8992
8953
  }, function (err) {
8993
8954
  });
8994
8955
  });
@@ -9548,12 +9509,9 @@
9548
9509
  _this.delayCheckPermissions = [];
9549
9510
  _this.ignoreAdmin = false;
9550
9511
  _this.appCode = null;
9551
- if (_moduleConfigService.getConfig().environment.authenticationSettings.coreVersion == 'v4') {
9552
- _this.serviceUri = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint + "/permission";
9553
- }
9554
9512
  _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
9555
- _this.appCode = _this._moduleConfigService.getConfig().appCode;
9556
9513
  _this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
9514
+ _this.appCode = _this._moduleConfigService.getConfig().appCode;
9557
9515
  return _this;
9558
9516
  }
9559
9517
  /**
@@ -9775,10 +9733,6 @@
9775
9733
  }
9776
9734
  });
9777
9735
  };
9778
- PermissionService.prototype.clearPermissionCache = function (lstModule) {
9779
- var url = this.serviceUri + "/ClearPermissionCache";
9780
- return this.defaultPost(url, lstModule);
9781
- };
9782
9736
  return PermissionService;
9783
9737
  }(BaseService));
9784
9738
  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 +10107,7 @@
10153
10107
  if (service == undefined) {
10154
10108
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
10155
10109
  }
10156
- this.serviceUri = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory";
10110
+ this.serviceUri = service.endPoint + "/EntityWorkflowHistory";
10157
10111
  };
10158
10112
  EntityWorkflowHistoryService.prototype.getLastHistory = function (tableName, filters) {
10159
10113
  if (filters === void 0) { filters = []; }
@@ -10161,7 +10115,7 @@
10161
10115
  if (service == undefined) {
10162
10116
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
10163
10117
  }
10164
- var url = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory/GetLastByFilter";
10118
+ var url = service.endPoint + "/EntityWorkflowHistory/GetLastByFilter";
10165
10119
  var gridInfo = {
10166
10120
  pageInfo: {
10167
10121
  page: 1,
@@ -10318,7 +10272,7 @@
10318
10272
  (this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow setting');
10319
10273
  }
10320
10274
  return new Promise(function (resolve, reject) {
10321
- _this.defaultPost(service.endPoint + "/" + _this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
10275
+ _this.defaultPost(service.endPoint + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
10322
10276
  .then(function (res) {
10323
10277
  if (res.success) {
10324
10278
  var itemSetting = res.data;
@@ -10403,11 +10357,11 @@
10403
10357
  };
10404
10358
  EntityWorkflowSettingService.prototype.saveSetting = function (settingKey, data) {
10405
10359
  var service = this.serviceManagers[settingKey];
10406
- return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
10360
+ return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
10407
10361
  };
10408
10362
  EntityWorkflowSettingService.prototype.removeSetting = function (settingKey) {
10409
10363
  var service = this.serviceManagers[settingKey];
10410
- return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
10364
+ return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
10411
10365
  };
10412
10366
  return EntityWorkflowSettingService;
10413
10367
  }(BaseService));
@@ -11221,37 +11175,25 @@
11221
11175
  });
11222
11176
  });
11223
11177
  };
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
11178
  DataListBase.prototype._edit = function (rowData, scopeDataEdit) {
11232
11179
  if (scopeDataEdit === void 0) { scopeDataEdit = {}; }
11233
11180
  return __awaiter(this, void 0, void 0, function () {
11234
- var resultValidate, flashShow;
11181
+ var flashShow;
11235
11182
  return __generator(this, function (_a) {
11236
11183
  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
- }
11184
+ case 0:
11243
11185
  flashShow = rowData[KeyFlashShow];
11244
11186
  delete rowData[KeyFlashShow];
11245
11187
  this.formModel.formState = exports.FormState.EDIT;
11246
11188
  return [4 /*yield*/, this.beforeEdit()];
11247
- case 2:
11189
+ case 1:
11248
11190
  _a.sent();
11249
11191
  this.setting.popupHeader = "C\u1EADp nh\u1EADt " + this.setting.objectName;
11250
11192
  this.setting.maskClass = flashShow ? 'hide' : null;
11251
11193
  this.scopeDataEdit = scopeDataEdit;
11252
11194
  this.formModel.data = this.cloneData(rowData);
11253
11195
  return [4 /*yield*/, this.modifyEditModel(rowData)];
11254
- case 3:
11196
+ case 2:
11255
11197
  _a.sent();
11256
11198
  this.formModel.data[KeyFlashShow] = flashShow;
11257
11199
  this.showDetailForm = true;
@@ -11282,56 +11224,34 @@
11282
11224
  DataListBase.prototype.getPromiseDeleteItem = function (rowData) {
11283
11225
  return this.setting.baseService.delete(rowData.id);
11284
11226
  };
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
11227
  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*/];
11228
+ var _this = this;
11229
+ if (rowData.__disableDelete) {
11230
+ return;
11231
+ }
11232
+ this._notifierService.showDeleteConfirm().then(function (rs) {
11233
+ if (!rs) {
11234
+ return;
11235
+ }
11236
+ if (_this.setting.baseService) {
11237
+ _this.getPromiseDeleteItem(rowData)
11238
+ .then(function (response) {
11239
+ if (response.success) {
11240
+ if (_this.setting.showVersionButton) {
11241
+ _this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
11301
11242
  }
11302
- return [4 /*yield*/, this.validateDelete(rowData)];
11303
- case 1:
11304
- resultValidate = _a.sent();
11305
- if (!resultValidate) {
11306
- return [2 /*return*/];
11243
+ else {
11244
+ _this._triggerProcessData();
11307
11245
  }
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
- });
11246
+ _this._notifierService.showDeleteDataSuccess();
11247
+ }
11248
+ else {
11249
+ _this._notifierService.showWarningByReponse(response);
11250
+ }
11251
+ }, function (error) {
11252
+ _this._notifierService.showDeleteDataError();
11253
+ });
11254
+ }
11335
11255
  });
11336
11256
  };
11337
11257
  DataListBase.prototype.getPromiseDeleteItems = function (items) {
@@ -11672,7 +11592,7 @@
11672
11592
  arrPromiseDontNeedWait = [];
11673
11593
  arrSchemaDontNeedWait = [];
11674
11594
  _loop_1 = function (schema) {
11675
- var field, arrValue_1, promise, filters, result, funcGetLabel_1;
11595
+ var field, arrValue_1, promise, result, funcGetLabel_1;
11676
11596
  return __generator(this, function (_a) {
11677
11597
  switch (_a.label) {
11678
11598
  case 0:
@@ -11707,11 +11627,7 @@
11707
11627
  promise = schema.baseService.getDataDropdown(schema.groupCode, arrValue_1, this_1.createDropdownOptions(schema));
11708
11628
  }
11709
11629
  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));
11630
+ promise = schema.baseService.getDataDropdownByFilter([this_1.newFilter(schema.valueField, exports.Operator.in, arrValue_1)], this_1.createDropdownOptions(schema));
11715
11631
  }
11716
11632
  if (!(schema.order != null)) return [3 /*break*/, 2];
11717
11633
  return [4 /*yield*/, promise];
@@ -11789,7 +11705,6 @@
11789
11705
  });
11790
11706
  };
11791
11707
  DataListBase.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
11792
- data !== null && data !== void 0 ? data : (data = []);
11793
11708
  var field = schema.field;
11794
11709
  var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
11795
11710
  if (schema.funcGetLabel) {
@@ -14838,10 +14753,6 @@
14838
14753
  });
14839
14754
  this.onModelChanged.emit(event);
14840
14755
  }
14841
- else {
14842
- this._rootNode = new ControlTreeNode(this._modelData, this.formControls);
14843
- this._rootNode.setCrudForm(this);
14844
- }
14845
14756
  },
14846
14757
  enumerable: false,
14847
14758
  configurable: true
@@ -15267,6 +15178,9 @@
15267
15178
  else if (schema instanceof AddressControlSchema) {
15268
15179
  this.controlNeedCheckReady.push(schema);
15269
15180
  }
15181
+ else if (schema instanceof AddressNewControlSchema) {
15182
+ this.controlNeedCheckReady.push(schema);
15183
+ }
15270
15184
  else if (schema instanceof RadioButtonListControlSchema) {
15271
15185
  schema.fireCallBackInside = false;
15272
15186
  }
@@ -15888,6 +15802,8 @@
15888
15802
  return 'datetimerange';
15889
15803
  if (control instanceof AddressControlSchema)
15890
15804
  return 'address';
15805
+ if (control instanceof AddressNewControlSchema)
15806
+ return 'address-new';
15891
15807
  if (control instanceof DropdownControlSchema)
15892
15808
  return 'dropdown';
15893
15809
  if (control instanceof EditorControlSchema)
@@ -15990,6 +15906,8 @@
15990
15906
  return 'fileManager';
15991
15907
  if (control instanceof AddressControlSchema)
15992
15908
  return 'address';
15909
+ if (control instanceof AddressNewControlSchema)
15910
+ return 'address-new';
15993
15911
  if (control instanceof TextControlSchema
15994
15912
  && (control.dataFormat === 'money'
15995
15913
  || control.dataFormat === 'moneyint')) {
@@ -16101,24 +16019,18 @@
16101
16019
  return __generator(this, function (_d) {
16102
16020
  switch (_d.label) {
16103
16021
  case 0:
16104
- if (!control.multiple) return [3 /*break*/, 5];
16022
+ if (!control.multiple) return [3 /*break*/, 3];
16105
16023
  if (!(eventType == 'hide')) return [3 /*break*/, 2];
16106
16024
  return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
16107
16025
  case 1:
16108
16026
  _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:
16027
+ _d.label = 2;
16028
+ case 2: return [3 /*break*/, 5];
16029
+ case 3: return [4 /*yield*/, this.handleFieldValueChange(control, event, eventType, parentModel, parentPath, sourceNode, bubble)];
16030
+ case 4:
16119
16031
  _d.sent();
16120
- _d.label = 7;
16121
- case 7: return [2 /*return*/];
16032
+ _d.label = 5;
16033
+ case 5: return [2 /*return*/];
16122
16034
  }
16123
16035
  });
16124
16036
  });
@@ -16355,6 +16267,7 @@
16355
16267
  if (control instanceof DropdownControlSchema
16356
16268
  || control instanceof RadioButtonListControlSchema
16357
16269
  || control instanceof AddressControlSchema
16270
+ || control instanceof AddressNewControlSchema
16358
16271
  || control instanceof FileManagerControlSchema) {
16359
16272
  if (!force && !parentNode.model._status[control.field].ready) {
16360
16273
  return [2 /*return*/, true];
@@ -17071,7 +16984,7 @@
17071
16984
  CrudFormComponent.decorators = [
17072
16985
  { type: i0.Component, args: [{
17073
16986
  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",
16987
+ 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=\"'address-new'\">\r\n <address-new-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-new-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=\"'address-new'\">\r\n <address-new-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-new-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
16988
  providers: [ComponentContextService],
17076
16989
  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
16990
  },] }
@@ -18254,7 +18167,7 @@
18254
18167
  this.onSaved.emit();
18255
18168
  return [3 /*break*/, 3];
18256
18169
  case 2:
18257
- this.handleInsertError(response);
18170
+ this.handleInsertError();
18258
18171
  _a.label = 3;
18259
18172
  case 3: return [2 /*return*/];
18260
18173
  }
@@ -18274,7 +18187,7 @@
18274
18187
  DataFormBase.prototype.getPromiseActionInsert = function () {
18275
18188
  return this.setting.baseService.post(this.model.data, this.insertPlusUrl);
18276
18189
  };
18277
- DataFormBase.prototype.handleInsertError = function (response) {
18190
+ DataFormBase.prototype.handleInsertError = function () {
18278
18191
  };
18279
18192
  DataFormBase.prototype.onUpdate = function () {
18280
18193
  return __awaiter(this, void 0, void 0, function () {
@@ -18295,7 +18208,7 @@
18295
18208
  this.onSaved.emit();
18296
18209
  return [3 /*break*/, 3];
18297
18210
  case 2:
18298
- this.handleUpdateError(response);
18211
+ this.handleUpdateError();
18299
18212
  _a.label = 3;
18300
18213
  case 3: return [2 /*return*/];
18301
18214
  }
@@ -18312,7 +18225,7 @@
18312
18225
  });
18313
18226
  });
18314
18227
  };
18315
- DataFormBase.prototype.handleUpdateError = function (response) {
18228
+ DataFormBase.prototype.handleUpdateError = function () {
18316
18229
  };
18317
18230
  DataFormBase.prototype.getPromiseActionUpdate = function () {
18318
18231
  return this.setting.baseService.put(this.model.data.id.toString(), this.model.data, this.updatePlusUrl);
@@ -18511,7 +18424,9 @@
18511
18424
  label: 'Tỉnh/Thành phố',
18512
18425
  required: this.control.required && this.control.requiredProvince,
18513
18426
  baseService: this._addressService,
18514
- defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: exports.ENUM_DON_VI_HANH_CHINH.THANH_PHO.toString() }],
18427
+ defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: exports.ENUM_DON_VI_HANH_CHINH.THANH_PHO.toString() },
18428
+ { field: 'version', operator: exports.Operator.equal, value: "-1" }
18429
+ ],
18515
18430
  valueField: 'id',
18516
18431
  displayField: 'name',
18517
18432
  fieldPlus: 'idRoot',
@@ -18527,7 +18442,9 @@
18527
18442
  label: 'Quận/Huyện',
18528
18443
  required: this.control.required && this.control.requiredDistrict,
18529
18444
  baseService: this._addressService,
18530
- defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: exports.ENUM_DON_VI_HANH_CHINH.QUAN_HUYEN.toString() }],
18445
+ defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: exports.ENUM_DON_VI_HANH_CHINH.QUAN_HUYEN.toString() },
18446
+ { field: 'version', operator: exports.Operator.equal, value: "-1" }
18447
+ ],
18531
18448
  bindingFilters: [{ field: 'parentId', operator: exports.Operator.equal, sourceField: 'idProvince', subField: 'idRoot' }],
18532
18449
  valueField: 'id',
18533
18450
  displayField: 'name',
@@ -18542,7 +18459,9 @@
18542
18459
  label: 'Phường/Xã',
18543
18460
  required: this.control.required && this.control.requiredWard,
18544
18461
  baseService: this._addressService,
18545
- defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: exports.ENUM_DON_VI_HANH_CHINH.PHUONG_XA.toString() }],
18462
+ defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: exports.ENUM_DON_VI_HANH_CHINH.PHUONG_XA.toString() },
18463
+ { field: 'version', operator: exports.Operator.equal, value: "-1" }
18464
+ ],
18546
18465
  bindingFilters: [{ field: 'parentId', operator: exports.Operator.equal, sourceField: 'idDistrict', subField: 'idRoot' }],
18547
18466
  valueField: 'id',
18548
18467
  displayField: 'name',
@@ -18679,6 +18598,266 @@
18679
18598
  onReady: [{ type: i0.Output }]
18680
18599
  };
18681
18600
 
18601
+ var ENUM_DON_VI_HANH_CHINH;
18602
+ (function (ENUM_DON_VI_HANH_CHINH) {
18603
+ ENUM_DON_VI_HANH_CHINH[ENUM_DON_VI_HANH_CHINH["THANH_PHO"] = 1] = "THANH_PHO";
18604
+ // QUAN_HUYEN = 2,
18605
+ ENUM_DON_VI_HANH_CHINH[ENUM_DON_VI_HANH_CHINH["PHUONG_XA"] = 2] = "PHUONG_XA";
18606
+ ENUM_DON_VI_HANH_CHINH[ENUM_DON_VI_HANH_CHINH["DUONG"] = 3] = "DUONG";
18607
+ })(ENUM_DON_VI_HANH_CHINH || (ENUM_DON_VI_HANH_CHINH = {}));
18608
+
18609
+ var AddressService$1 = /** @class */ (function (_super) {
18610
+ __extends(AddressService, _super);
18611
+ function AddressService(http, injector, _moduleConfigService) {
18612
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.commonMasterDataEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/Address") || this;
18613
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.commonMasterDataEndpoint;
18614
+ return _this;
18615
+ }
18616
+ return AddressService;
18617
+ }(BaseService));
18618
+ AddressService$1.ɵprov = i0.ɵɵdefineInjectable({ factory: function AddressService_Factory() { return new AddressService$1(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: AddressService$1, providedIn: "root" });
18619
+ AddressService$1.decorators = [
18620
+ { type: i0.Injectable, args: [{
18621
+ providedIn: 'root'
18622
+ },] }
18623
+ ];
18624
+ AddressService$1.ctorParameters = function () { return [
18625
+ { type: i1$1.HttpClient },
18626
+ { type: i0.Injector },
18627
+ { type: ModuleConfigService }
18628
+ ]; };
18629
+
18630
+ var AddressNewComponent = /** @class */ (function (_super) {
18631
+ __extends(AddressNewComponent, _super);
18632
+ function AddressNewComponent(_injector, _addressService, _moduleConfigService, _deviceDetectorService) {
18633
+ var _this = _super.call(this, _injector) || this;
18634
+ _this._injector = _injector;
18635
+ _this._addressService = _addressService;
18636
+ _this._moduleConfigService = _moduleConfigService;
18637
+ _this._deviceDetectorService = _deviceDetectorService;
18638
+ _this.viewMode = false;
18639
+ _this._showSubLabel = true;
18640
+ _this.readyToReload = false;
18641
+ _this._readyStatus = {};
18642
+ _this.onSelect = new i0.EventEmitter();
18643
+ _this.dataChange = new i0.EventEmitter();
18644
+ _this.onReady = new i0.EventEmitter();
18645
+ _this.doNotCheckBaseService = true;
18646
+ return _this;
18647
+ }
18648
+ Object.defineProperty(AddressNewComponent.prototype, "disabled", {
18649
+ set: function (value) {
18650
+ this._disabled = value;
18651
+ this.setDisabledControl();
18652
+ },
18653
+ enumerable: false,
18654
+ configurable: true
18655
+ });
18656
+ Object.defineProperty(AddressNewComponent.prototype, "data", {
18657
+ set: function (value) {
18658
+ if (this._modelData != value && isLiteralObject(value))
18659
+ this._modelData = mergeJSON(this._modelData, value);
18660
+ else if (value == null)
18661
+ this._modelData = {};
18662
+ },
18663
+ enumerable: false,
18664
+ configurable: true
18665
+ });
18666
+ ;
18667
+ Object.defineProperty(AddressNewComponent.prototype, "showSubLabel", {
18668
+ set: function (value) {
18669
+ this._showSubLabel = value;
18670
+ this.setShowLabel();
18671
+ },
18672
+ enumerable: false,
18673
+ configurable: true
18674
+ });
18675
+ AddressNewComponent.prototype.ngOnInit = function () {
18676
+ var _this = this;
18677
+ this.control._component = this;
18678
+ _super.prototype.ngOnInit.call(this);
18679
+ // Nếu đã ẩn quận huyện thì phải ẩn luôn cả phường xã
18680
+ // Vì nếu không load dữ liệu sẽ không chuẩn
18681
+ // if (this.control.hideDistrict) {
18682
+ // this.control.hideWard = true;
18683
+ // }
18684
+ this.setting.schema = [
18685
+ new DropdownControlSchema({
18686
+ field: 'idProvince',
18687
+ label: 'Tỉnh/Thành phố',
18688
+ required: this.control.required && this.control.requiredProvince,
18689
+ baseService: this._addressService,
18690
+ defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: ENUM_DON_VI_HANH_CHINH.THANH_PHO.toString() },
18691
+ { field: 'version', operator: exports.Operator.equal, value: "1" }],
18692
+ valueField: 'id',
18693
+ displayField: 'name',
18694
+ fieldPlus: 'idRoot',
18695
+ sortField: 'sort',
18696
+ mdWidth: this.control.provinceWidth,
18697
+ disabled: this._disabled,
18698
+ callbackDataFinish: function (evt) {
18699
+ _this.readyToReload = true;
18700
+ }
18701
+ }),
18702
+ // new DropdownControlSchema({
18703
+ // field: 'idDistrict',
18704
+ // label: 'Quận/Huyện',
18705
+ // required: this.control.required && this.control.requiredDistrict,
18706
+ // baseService: this._addressService,
18707
+ // defaultFilters: [{ field: 'level', operator: Operator.equal, value: ENUM_DON_VI_HANH_CHINH.QUAN_HUYEN.toString() }],
18708
+ // bindingFilters: [{ field: 'parentId', operator: Operator.equal, sourceField: 'idProvince', subField: 'idRoot' }],
18709
+ // valueField: 'id',
18710
+ // displayField: 'name',
18711
+ // fieldPlus: 'idRoot',
18712
+ // sortField: 'sort',
18713
+ // mdWidth: this.control.districtWidth,
18714
+ // disabled: this._disabled,
18715
+ // hidden: this.control.hideDistrict
18716
+ // }),
18717
+ new DropdownControlSchema({
18718
+ field: 'idWard',
18719
+ label: 'Phường/Xã',
18720
+ required: this.control.required && this.control.requiredWard,
18721
+ baseService: this._addressService,
18722
+ defaultFilters: [{ field: 'level', operator: exports.Operator.equal, value: ENUM_DON_VI_HANH_CHINH.PHUONG_XA.toString() },
18723
+ { field: 'version', operator: exports.Operator.equal, value: "1" }
18724
+ ],
18725
+ bindingFilters: [{ field: 'parentId', operator: exports.Operator.equal, sourceField: 'idProvince', subField: 'idRoot' }],
18726
+ valueField: 'id',
18727
+ displayField: 'name',
18728
+ fieldPlus: 'idRoot',
18729
+ sortField: 'sort',
18730
+ mdWidth: this.control.wardWidth,
18731
+ disabled: this._disabled,
18732
+ hidden: this.control.hideWard
18733
+ }),
18734
+ new TextControlSchema({
18735
+ field: 'street',
18736
+ label: 'Đường',
18737
+ required: this.control.required && this.control.requiredStreet,
18738
+ mdWidth: this.control.streetWidth,
18739
+ disabled: this._disabled,
18740
+ hidden: this.control.hideStreet
18741
+ }),
18742
+ new TextControlSchema({
18743
+ field: 'no',
18744
+ label: 'Số nhà',
18745
+ required: this.control.required && this.control.requiredNo,
18746
+ mdWidth: this.control.noWidth,
18747
+ disabled: this._disabled,
18748
+ hidden: this.control.hideNo
18749
+ })
18750
+ ];
18751
+ if (this.viewMode) {
18752
+ this.getModelText();
18753
+ }
18754
+ };
18755
+ AddressNewComponent.prototype.setDisabledControl = function () {
18756
+ var disabled = this._disabled ? true : null;
18757
+ this.setting.schema.forEach(function (ctrl) { return ctrl.disabled = disabled; });
18758
+ };
18759
+ AddressNewComponent.prototype.handleValueChange = function (evt) {
18760
+ this.dataChange.emit(this._modelData);
18761
+ this.onSelect.emit(this._modelData);
18762
+ };
18763
+ AddressNewComponent.prototype.handleReady = function (field) {
18764
+ this._readyStatus[field] = true;
18765
+ if (this._readyStatus['idProvince']
18766
+ && (this.control.hideDistrict || this._readyStatus['idDistrict'])
18767
+ && (this.control.hideWard || this._readyStatus['idWard'])) {
18768
+ this.onReady.emit(this.control.field);
18769
+ }
18770
+ };
18771
+ AddressNewComponent.prototype.setShowLabel = function () {
18772
+ };
18773
+ AddressNewComponent.prototype.getModelText = function () {
18774
+ var _this = this;
18775
+ var values = [];
18776
+ if (this._modelData.idProvince)
18777
+ values.push(this._modelData.idProvince);
18778
+ if (!this.control.hideDistrict && this._modelData.idDistrict)
18779
+ values.push(this._modelData.idDistrict);
18780
+ if (!this.control.hideWard && this._modelData.idWard)
18781
+ values.push(this._modelData.idWard);
18782
+ if (values.length > 0) {
18783
+ var result_1 = {
18784
+ province: '',
18785
+ district: '',
18786
+ ward: '',
18787
+ street: this._modelData.street,
18788
+ no: this._modelData.no
18789
+ };
18790
+ this._addressService.getAll([
18791
+ this.newFilter('id', exports.Operator.in, values)
18792
+ ], 'id,name').then(function (res) { return _this.handleResponse(res, '', function (data) {
18793
+ if (_this._modelData.idProvince) {
18794
+ var province = data.data.find(function (p) { return p.id == _this._modelData.idProvince; });
18795
+ if (province)
18796
+ result_1.province = province.name;
18797
+ }
18798
+ if (!_this.control.hideDistrict && _this._modelData.idDistrict) {
18799
+ var district = data.data.find(function (p) { return p.id == _this._modelData.idDistrict; });
18800
+ if (district)
18801
+ result_1.district = district.name;
18802
+ }
18803
+ if (!_this.control.hideWard && _this._modelData.idWard) {
18804
+ var ward = data.data.find(function (p) { return p.id == _this._modelData.idWard; });
18805
+ if (ward)
18806
+ result_1.ward = ward.name;
18807
+ }
18808
+ _this.setModelText(result_1);
18809
+ }); });
18810
+ }
18811
+ };
18812
+ AddressNewComponent.prototype.setModelText = function (objAddress) {
18813
+ var str = "";
18814
+ if (objAddress.no) {
18815
+ str += ", S\u1ED1 " + objAddress.no;
18816
+ }
18817
+ if (objAddress.street) {
18818
+ str += ", \u0110\u01B0\u1EDDng " + objAddress.street;
18819
+ }
18820
+ if (!this.control.hideDistrict && objAddress.ward) {
18821
+ str += ", " + objAddress.ward;
18822
+ }
18823
+ if (!this.control.hideDistrict && objAddress.district) {
18824
+ str += ", " + objAddress.district;
18825
+ }
18826
+ if (objAddress.province) {
18827
+ str += ", " + objAddress.province;
18828
+ }
18829
+ if (str !== '') {
18830
+ str = str.substring(2).trim();
18831
+ }
18832
+ this.modelString = str;
18833
+ };
18834
+ return AddressNewComponent;
18835
+ }(DataFormBase));
18836
+ AddressNewComponent.decorators = [
18837
+ { type: i0.Component, args: [{
18838
+ selector: 'address-new-picker',
18839
+ template: "<ng-container *ngIf=\"!viewMode\">\r\n <div\r\n [ngStyle]=\"control.showInBox?{border: '1px solid #ced4da', 'borderRadius': '5px' }: { margin: '-0.5rem -1rem -1rem -1rem' }\">\r\n <crud-form #crudForm [(data)]=\"_modelData\" [setting]=\"setting\" [context]=\"context\" [autoFocus]=\"false\"\r\n (onFormReady)=\"_handleFormReady($event)\" (onChange)=\"handleValueChange($event)\"\r\n (onControlReady)=\"handleReady($event)\">\r\n </crud-form>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"viewMode\">\r\n {{modelString}}\r\n</ng-container>",
18840
+ styles: [".control-padding-fix{padding-left:0}@media (max-width:640px){::ng-deep address-new-picker>div{min-width:100%}}"]
18841
+ },] }
18842
+ ];
18843
+ AddressNewComponent.ctorParameters = function () { return [
18844
+ { type: i0.Injector },
18845
+ { type: AddressService$1 },
18846
+ { type: ModuleConfigService },
18847
+ { type: ngxDeviceDetector.DeviceDetectorService }
18848
+ ]; };
18849
+ AddressNewComponent.propDecorators = {
18850
+ crudForm: [{ type: i0.ViewChild, args: [CrudFormComponent, { static: false },] }],
18851
+ control: [{ type: i0.Input }],
18852
+ disabled: [{ type: i0.Input }],
18853
+ viewMode: [{ type: i0.Input }],
18854
+ data: [{ type: i0.Input }],
18855
+ showSubLabel: [{ type: i0.Input }],
18856
+ onSelect: [{ type: i0.Output }],
18857
+ dataChange: [{ type: i0.Output }],
18858
+ onReady: [{ type: i0.Output }]
18859
+ };
18860
+
18682
18861
  var AfterViewCheckedComponent = /** @class */ (function (_super) {
18683
18862
  __extends(AfterViewCheckedComponent, _super);
18684
18863
  function AfterViewCheckedComponent(injector) {
@@ -18944,49 +19123,27 @@
18944
19123
  AutoCompletePickerComponent.prototype.buildFilterKeyword = function () {
18945
19124
  var _this = this;
18946
19125
  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
- }
19126
+ this.getFilterOnSearch = function (value) { return _this.newFilter(_this.control.displayField, exports.Operator.contain, value); };
18953
19127
  }
18954
19128
  else {
18955
19129
  this.getFilterOnSearch = function (value) {
18956
- var e_1, _a, e_2, _b;
19130
+ var e_1, _a;
18957
19131
  var result = new Filter({
18958
19132
  logic: 'or',
18959
19133
  filters: []
18960
19134
  });
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; }
19135
+ try {
19136
+ for (var _b = __values(_this.fieldSearchText), _c = _b.next(); !_c.done; _c = _b.next()) {
19137
+ var fieldSearch = _c.value;
19138
+ result.filters.push(_this.newFilter(fieldSearch, exports.Operator.contain, value));
18974
19139
  }
18975
19140
  }
18976
- else {
19141
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
19142
+ finally {
18977
19143
  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; }
19144
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
18989
19145
  }
19146
+ finally { if (e_1) throw e_1.error; }
18990
19147
  }
18991
19148
  return result;
18992
19149
  };
@@ -19062,50 +19219,34 @@
19062
19219
  return __generator(this, function (_a) {
19063
19220
  switch (_a.label) {
19064
19221
  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
19222
  filters = [];
19072
19223
  if (this.control.multiple) {
19073
19224
  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
- }
19225
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this.value));
19080
19226
  }
19081
19227
  }
19082
19228
  else {
19083
19229
  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
- }
19230
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this.value));
19090
19231
  }
19091
19232
  }
19092
19233
  return [4 /*yield*/, appendDefaultFilter(filters, this.control.defaultFilters)];
19093
- case 3:
19234
+ case 1:
19094
19235
  _a.sent();
19095
19236
  if (this.keyword && this.keyword.length > 0) {
19096
19237
  filters.push(this.getFilterOnSearch(this.keyword));
19097
19238
  }
19098
- if (!this.control.modifyFilter) return [3 /*break*/, 5];
19239
+ if (!this.control.modifyFilter) return [3 /*break*/, 3];
19099
19240
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19100
- case 4:
19241
+ case 2:
19101
19242
  allow = _a.sent();
19102
19243
  if (allow === false) {
19103
19244
  this.results = [];
19104
19245
  return [2 /*return*/];
19105
19246
  }
19106
- _a.label = 5;
19107
- case 5: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
19108
- case 6:
19247
+ _a.label = 3;
19248
+ case 3: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
19249
+ case 4:
19109
19250
  dataSource = _a.sent();
19110
19251
  this.fireEventAfterGetDataDropDown(dataSource);
19111
19252
  this.reStructureDataSource(dataSource);
@@ -19286,17 +19427,9 @@
19286
19427
  if (!this.control.multiple) return [3 /*break*/, 5];
19287
19428
  dataSource = [];
19288
19429
  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
- }
19430
+ filters = [
19431
+ this.newFilter(this.control.valueField, exports.Operator.in, this.value)
19432
+ ];
19300
19433
  if (!this.control.modifyFilter) return [3 /*break*/, 2];
19301
19434
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19302
19435
  case 1:
@@ -19320,17 +19453,9 @@
19320
19453
  case 5:
19321
19454
  dataSource = [];
19322
19455
  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
- }
19456
+ filters = [
19457
+ this.newFilter(this.control.valueField, exports.Operator.equal, this.value)
19458
+ ];
19334
19459
  if (!this.control.modifyFilter) return [3 /*break*/, 7];
19335
19460
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19336
19461
  case 6:
@@ -19375,7 +19500,7 @@
19375
19500
  }
19376
19501
  };
19377
19502
  AutoCompletePickerComponent.prototype.reStructureDataSource = function (sources) {
19378
- var e_3, _a;
19503
+ var e_2, _a;
19379
19504
  if (sources != null && sources.length > 0) {
19380
19505
  var arr = [];
19381
19506
  try {
@@ -19385,12 +19510,12 @@
19385
19510
  arr.push(item);
19386
19511
  }
19387
19512
  }
19388
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
19513
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
19389
19514
  finally {
19390
19515
  try {
19391
19516
  if (sources_1_1 && !sources_1_1.done && (_a = sources_1.return)) _a.call(sources_1);
19392
19517
  }
19393
- finally { if (e_3) throw e_3.error; }
19518
+ finally { if (e_2) throw e_2.error; }
19394
19519
  }
19395
19520
  this.dataSource = arr;
19396
19521
  }
@@ -19420,12 +19545,7 @@
19420
19545
  if (!this.control.multiple) return [3 /*break*/, 6];
19421
19546
  if (!(obj != null && obj.length > 0)) return [3 /*break*/, 4];
19422
19547
  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
- }
19548
+ filters.push(this.newFilter(this.control.valueField, exports.Operator.in, obj));
19429
19549
  if (!this.control.modifyFilter) return [3 /*break*/, 2];
19430
19550
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19431
19551
  case 1:
@@ -19450,17 +19570,9 @@
19450
19570
  case 5: return [3 /*break*/, 10];
19451
19571
  case 6:
19452
19572
  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
- }
19573
+ filters = [
19574
+ this.newFilter(this.control.valueField, exports.Operator.equal, obj)
19575
+ ];
19464
19576
  if (!this.control.modifyFilter) return [3 /*break*/, 8];
19465
19577
  return [4 /*yield*/, this.control.modifyFilter(filters)];
19466
19578
  case 7:
@@ -19536,7 +19648,6 @@
19536
19648
  AutoCompletePickerComponent.propDecorators = {
19537
19649
  control: [{ type: i0.Input }],
19538
19650
  disabled: [{ type: i0.Input }],
19539
- parentPath: [{ type: i0.Input }],
19540
19651
  popupSize: [{ type: i0.Input }],
19541
19652
  onSelect: [{ type: i0.Output }],
19542
19653
  onUnSelect: [{ type: i0.Output }],
@@ -19655,6 +19766,23 @@
19655
19766
  FileObjectService.prototype.getScanFileUploadEndpoint = function (correlationId) {
19656
19767
  return this.serviceCode + "/CreateScannedFile/" + correlationId;
19657
19768
  };
19769
+ FileObjectService.prototype.isTypeFileKySo = function (fileName) {
19770
+ var fileExtension = this.getFileExtension(fileName);
19771
+ if (fileExtension) {
19772
+ fileExtension = fileExtension.toLowerCase();
19773
+ if (fileExtension.indexOf('.') > -1) {
19774
+ var arr = fileExtension.split('.');
19775
+ fileExtension = arr[arr.length - 1];
19776
+ }
19777
+ if ((/(pdf|doc|docx|xls|xlsm|xlsx)$/i).test(fileExtension)) {
19778
+ return true;
19779
+ }
19780
+ }
19781
+ return false;
19782
+ };
19783
+ FileObjectService.prototype.getPublicDownloadLinkByFileId = function (fileId) {
19784
+ return this.serviceUri + "/public/" + fileId + "/download";
19785
+ };
19658
19786
  return FileObjectService;
19659
19787
  }(BaseService));
19660
19788
  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 +20870,13 @@
20742
20870
  });
20743
20871
  });
20744
20872
  };
20745
- MenuService.prototype.renderMenuByAppCode = function (scopeName, appCode) {
20873
+ MenuService.prototype.renderMenuByAppCode = function (appCode) {
20746
20874
  return __awaiter(this, void 0, void 0, function () {
20747
20875
  var menuUrl;
20748
20876
  var _this = this;
20749
20877
  return __generator(this, function (_a) {
20750
20878
  this._menuItems = [];
20751
20879
  menuUrl = "assets/menus/" + appCode.toLocaleLowerCase() + ".json";
20752
- if (scopeName) {
20753
- menuUrl = "assets/menus/" + scopeName.toLocaleLowerCase() + "/" + appCode.toLocaleLowerCase() + ".json";
20754
- }
20755
20880
  fetch(menuUrl).then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
20756
20881
  var menu, _a, _b;
20757
20882
  return __generator(this, function (_c) {
@@ -20905,7 +21030,7 @@
20905
21030
  // 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
21031
  funcSetNewTabLink = function (link) { return "/" + appCodeLowerCase + link; };
20907
21032
  }
20908
- this._menuService.renderMenuByAppCode(this.environment.scopeName, appCode);
21033
+ this._menuService.renderMenuByAppCode(appCode);
20909
21034
  this.model = this._menuService.getMenuItems();
20910
21035
  this._router.events.pipe(operators.filter(function (event) { return event instanceof i3.NavigationEnd; }))
20911
21036
  .subscribe(function (event) {
@@ -23466,7 +23591,7 @@
23466
23591
  };
23467
23592
 
23468
23593
  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) {
23594
+ 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
23595
  var _this = this;
23471
23596
  this._globalService = _globalService;
23472
23597
  this._commonService = _commonService;
@@ -23496,7 +23621,6 @@
23496
23621
  this._menuService = _menuService;
23497
23622
  this._primengConfig = _primengConfig;
23498
23623
  this._storageService = _storageService;
23499
- this._permissionService = _permissionService;
23500
23624
  this.showQuickNote = true;
23501
23625
  this.allowAnonymous = false;
23502
23626
  this._unsubscribeAll = new rxjs.Subject();
@@ -23650,25 +23774,6 @@
23650
23774
  root.data.allowAnonymous = this.allowAnonymous;
23651
23775
  // get current User
23652
23776
  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
23777
  this._componentContextService.subscribe(ComCtxConstants.ROOT.KEY_DOWN_ARROWLEFT, function (e) {
23673
23778
  if (document.activeElement === _this.cancelButton.nativeElement) {
23674
23779
  _this.okButton.nativeElement.focus();
@@ -24184,17 +24289,6 @@
24184
24289
  }
24185
24290
  }
24186
24291
  };
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
24292
  return CommonAppComponentComponent;
24199
24293
  }());
24200
24294
  CommonAppComponentComponent.decorators = [
@@ -24233,8 +24327,7 @@
24233
24327
  { type: i1.ConfirmationService },
24234
24328
  { type: MenuService },
24235
24329
  { type: i1.PrimeNGConfig },
24236
- { type: StorageService },
24237
- { type: PermissionService }
24330
+ { type: StorageService }
24238
24331
  ]; };
24239
24332
  CommonAppComponentComponent.propDecorators = {
24240
24333
  okButton: [{ type: i0.ViewChild, args: ['okButton',] }],
@@ -26391,8 +26484,6 @@
26391
26484
  });
26392
26485
  _this.sourceIcon = {};
26393
26486
  _this.stopCalculatingFunctionColumnWidth = false;
26394
- _this.FileUploadMode = exports.FileUploadMode;
26395
- _this.eventType = exports.EventType;
26396
26487
  _this._unSubscribeAll = new rxjs.Subject();
26397
26488
  _this.handleSelectRow = function (evt, data) {
26398
26489
  if (_this.setting.hasCustomHandleClickRow) {
@@ -26575,94 +26666,6 @@
26575
26666
  _this.setting.pageSetting.page = 1;
26576
26667
  _this.getData();
26577
26668
  };
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
26669
  _this._activatedRoute = _this._injector.get(i3.ActivatedRoute);
26667
26670
  _this._router = _this._injector.get(i3.Router);
26668
26671
  _this._customRouterService = _this._injector.get(CustomRouterService);
@@ -26970,7 +26973,7 @@
26970
26973
  });
26971
26974
  };
26972
26975
  CrudListComponent.prototype.formatColumns = function (cols) {
26973
- var e_1, _f;
26976
+ var e_1, _b;
26974
26977
  try {
26975
26978
  for (var cols_1 = __values(cols), cols_1_1 = cols_1.next(); !cols_1_1.done; cols_1_1 = cols_1.next()) {
26976
26979
  var col = cols_1_1.value;
@@ -26982,7 +26985,7 @@
26982
26985
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
26983
26986
  finally {
26984
26987
  try {
26985
- if (cols_1_1 && !cols_1_1.done && (_f = cols_1.return)) _f.call(cols_1);
26988
+ if (cols_1_1 && !cols_1_1.done && (_b = cols_1.return)) _b.call(cols_1);
26986
26989
  }
26987
26990
  finally { if (e_1) throw e_1.error; }
26988
26991
  }
@@ -27181,7 +27184,7 @@
27181
27184
  CrudListComponent.prototype.validatePermission = function (rowData) {
27182
27185
  return __awaiter(this, void 0, void 0, function () {
27183
27186
  var itemStatus, hasPermission, userData, userId, userIdUpper, userGroupIds, userOrgIds, managerTypes, userIdLastUpper_1, donViIdLastUpper_1;
27184
- return __generator(this, function (_f) {
27187
+ return __generator(this, function (_b) {
27185
27188
  this.currentItem = rowData;
27186
27189
  itemStatus = this.setting.workflowSetting.statuses.find(function (p) { return p.trangThaiContainer.ma == rowData.currentStateCode; });
27187
27190
  hasPermission = false;
@@ -27248,12 +27251,12 @@
27248
27251
  };
27249
27252
  CrudListComponent.prototype.showActionWorkflow = function (evt, rowData) {
27250
27253
  return __awaiter(this, void 0, void 0, function () {
27251
- var _f, buttonContexts, hasPermission;
27252
- return __generator(this, function (_g) {
27253
- switch (_g.label) {
27254
+ var _b, buttonContexts, hasPermission;
27255
+ return __generator(this, function (_c) {
27256
+ switch (_c.label) {
27254
27257
  case 0: return [4 /*yield*/, this.getActionWorkflow(rowData)];
27255
27258
  case 1:
27256
- _f = __read.apply(void 0, [_g.sent(), 2]), buttonContexts = _f[0], hasPermission = _f[1];
27259
+ _b = __read.apply(void 0, [_c.sent(), 2]), buttonContexts = _b[0], hasPermission = _b[1];
27257
27260
  this.buttonContexts = buttonContexts;
27258
27261
  rowData.__hasPermission = hasPermission;
27259
27262
  rowData.__actions = this.buttonContexts;
@@ -27267,11 +27270,11 @@
27267
27270
  return __awaiter(this, void 0, void 0, function () {
27268
27271
  var hasPermission, buttonContexts, statusAction, actions;
27269
27272
  var _this = this;
27270
- return __generator(this, function (_f) {
27271
- switch (_f.label) {
27273
+ return __generator(this, function (_b) {
27274
+ switch (_b.label) {
27272
27275
  case 0: return [4 /*yield*/, this.validatePermission(rowData)];
27273
27276
  case 1:
27274
- hasPermission = _f.sent();
27277
+ hasPermission = _b.sent();
27275
27278
  buttonContexts = [];
27276
27279
  if (!hasPermission) {
27277
27280
  buttonContexts = [];
@@ -27337,8 +27340,8 @@
27337
27340
  return __awaiter(this, void 0, void 0, function () {
27338
27341
  var dataProcess_1, validateWf;
27339
27342
  var _this = this;
27340
- return __generator(this, function (_f) {
27341
- switch (_f.label) {
27343
+ return __generator(this, function (_b) {
27344
+ switch (_b.label) {
27342
27345
  case 0:
27343
27346
  if (!(workflowAction.actionOptions && !workflowAction.actionOptions.openDialog)) return [3 /*break*/, 2];
27344
27347
  dataProcess_1 = {
@@ -27348,7 +27351,7 @@
27348
27351
  };
27349
27352
  return [4 /*yield*/, this.setting.baseService.validateProcessWorkflow(this.currentItem.id, workflowAction.ma, dataProcess_1)];
27350
27353
  case 1:
27351
- validateWf = _f.sent();
27354
+ validateWf = _b.sent();
27352
27355
  this.handleResponse(validateWf, '', function (f) {
27353
27356
  _this.setting.baseService.processWorkflow(_this.currentItem.id, workflowAction.ma, dataProcess_1)
27354
27357
  .then(function (res) { return _this.handleResponse(res, workflowAction.ten + " th\u00E0nh c\u00F4ng", function (f) {
@@ -27372,7 +27375,7 @@
27372
27375
  this.actionWorkflow = workflowAction;
27373
27376
  this.headerWorkflow = workflowAction.ten;
27374
27377
  this.showFormWorkflow = true;
27375
- _f.label = 3;
27378
+ _b.label = 3;
27376
27379
  case 3: return [2 /*return*/];
27377
27380
  }
27378
27381
  });
@@ -27475,7 +27478,7 @@
27475
27478
  this.onAdd.emit();
27476
27479
  };
27477
27480
  CrudListComponent.prototype.xuatCacMucDaChon_backup = function () {
27478
- var e_2, _f;
27481
+ var e_2, _b;
27479
27482
  if (this._groupField) {
27480
27483
  this._notifierService.showWarning('Giao diện hiện tại chưa hỗ trợ xuất excel');
27481
27484
  return;
@@ -27517,7 +27520,7 @@
27517
27520
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
27518
27521
  finally {
27519
27522
  try {
27520
- if (rowData_1_1 && !rowData_1_1.done && (_f = rowData_1.return)) _f.call(rowData_1);
27523
+ if (rowData_1_1 && !rowData_1_1.done && (_b = rowData_1.return)) _b.call(rowData_1);
27521
27524
  }
27522
27525
  finally { if (e_2) throw e_2.error; }
27523
27526
  }
@@ -27660,8 +27663,8 @@
27660
27663
  CrudListComponent.prototype.checkHasPermissionInLastStatus = function (rowData) {
27661
27664
  return __awaiter(this, void 0, void 0, function () {
27662
27665
  var statusKetThuc;
27663
- return __generator(this, function (_f) {
27664
- switch (_f.label) {
27666
+ return __generator(this, function (_b) {
27667
+ switch (_b.label) {
27665
27668
  case 0:
27666
27669
  statusKetThuc = this.setting.workflowSetting.statuses.find(function (q) { return q.type == exports.EnumWFNhomTrangThai.KET_THUC; });
27667
27670
  if (statusKetThuc == null) {
@@ -27674,46 +27677,46 @@
27674
27677
  return [4 /*yield*/, this.validatePermission(rowData)];
27675
27678
  case 1:
27676
27679
  // Kiểm tra permission
27677
- return [2 /*return*/, _f.sent()];
27680
+ return [2 /*return*/, _b.sent()];
27678
27681
  }
27679
27682
  });
27680
27683
  });
27681
27684
  };
27682
27685
  CrudListComponent.prototype.showContextMenu = function (evt, rowData) {
27683
27686
  return __awaiter(this, void 0, void 0, function () {
27684
- var _f, _g, _h, _j;
27685
- return __generator(this, function (_k) {
27686
- switch (_k.label) {
27687
+ var _b, _c, _d, _e;
27688
+ return __generator(this, function (_f) {
27689
+ switch (_f.label) {
27687
27690
  case 0:
27688
27691
  this.rowDataCurrent = rowData;
27689
- _f = this;
27692
+ _b = this;
27690
27693
  return [4 /*yield*/, this.menuButtons(rowData)];
27691
27694
  case 1:
27692
- _f.buttonContexts = _k.sent();
27695
+ _b.buttonContexts = _f.sent();
27693
27696
  if (!(!this.setting.hiddenTrinhKy && !rowData.__hiddenTrinhKy)) return [3 /*break*/, 7];
27694
- _h = this.setting.checkReadyToTrinhKy();
27695
- if (!_h) return [3 /*break*/, 3];
27697
+ _d = this.setting.checkReadyToTrinhKy();
27698
+ if (!_d) return [3 /*break*/, 3];
27696
27699
  return [4 /*yield*/, this.setting.checkAllowTrinhKy(rowData)];
27697
27700
  case 2:
27698
- _h = (_k.sent());
27699
- _k.label = 3;
27701
+ _d = (_f.sent());
27702
+ _f.label = 3;
27700
27703
  case 3:
27701
- _g = _h;
27702
- if (!_g) return [3 /*break*/, 6];
27703
- _j = !this.setting.checkPermisionTrinhKy;
27704
- if (_j) return [3 /*break*/, 5];
27704
+ _c = _d;
27705
+ if (!_c) return [3 /*break*/, 6];
27706
+ _e = !this.setting.checkPermisionTrinhKy;
27707
+ if (_e) return [3 /*break*/, 5];
27705
27708
  return [4 /*yield*/, this.checkHasPermissionInLastStatus(rowData)];
27706
27709
  case 4:
27707
- _j = (_k.sent());
27708
- _k.label = 5;
27710
+ _e = (_f.sent());
27711
+ _f.label = 5;
27709
27712
  case 5:
27710
- _g = (_j);
27711
- _k.label = 6;
27713
+ _c = (_e);
27714
+ _f.label = 6;
27712
27715
  case 6:
27713
- if (_g) {
27716
+ if (_c) {
27714
27717
  this.buttonContexts.unshift({ label: this.setting.getLabelButtonTrinhKy(rowData), icon: 'pi pi-send', command: this.trinhKy.bind(this) });
27715
27718
  }
27716
- _k.label = 7;
27719
+ _f.label = 7;
27717
27720
  case 7:
27718
27721
  if (this.buttonContexts.length > 0) {
27719
27722
  this._showContextMenu(evt);
@@ -28290,7 +28293,7 @@
28290
28293
  return col.dataType == exports.DataType.datetime || col.dataType == exports.DataType.date || col.dataType == exports.DataType.boolean || col.dataType == exports.DataType.enum;
28291
28294
  };
28292
28295
  CrudListComponent.prototype.alignRightColumn = function (col) {
28293
- return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal || col.dataType == exports.DataType.currency;
28296
+ return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal;
28294
28297
  };
28295
28298
  CrudListComponent.prototype.ngOnDestroy = function () {
28296
28299
  if (!this.disableKeypressControl) {
@@ -28306,10 +28309,10 @@
28306
28309
  clearTimeout(this.timeout);
28307
28310
  };
28308
28311
  CrudListComponent.prototype.disableMultipleDelete = function () {
28309
- var e_3, _f;
28312
+ var e_3, _b;
28310
28313
  try {
28311
- for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
28312
- var item = _h.value;
28314
+ for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
28315
+ var item = _d.value;
28313
28316
  if (this.disableDelete(item)) {
28314
28317
  return true;
28315
28318
  }
@@ -28318,7 +28321,7 @@
28318
28321
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
28319
28322
  finally {
28320
28323
  try {
28321
- if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
28324
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
28322
28325
  }
28323
28326
  finally { if (e_3) throw e_3.error; }
28324
28327
  }
@@ -28388,11 +28391,11 @@
28388
28391
  };
28389
28392
  CrudListComponent.prototype.processBaseData = function () {
28390
28393
  return __awaiter(this, void 0, void 0, function () {
28391
- return __generator(this, function (_f) {
28392
- switch (_f.label) {
28394
+ return __generator(this, function (_b) {
28395
+ switch (_b.label) {
28393
28396
  case 0: return [4 /*yield*/, this.preProcessData(this.model.dataSource)];
28394
28397
  case 1:
28395
- _f.sent();
28398
+ _b.sent();
28396
28399
  return [2 /*return*/];
28397
28400
  }
28398
28401
  });
@@ -28401,14 +28404,14 @@
28401
28404
  CrudListComponent.prototype.preProcessData = function (dataSource) {
28402
28405
  return __awaiter(this, void 0, void 0, function () {
28403
28406
  var colHasPipe, _loop_3, this_2, colHasPipe_1, colHasPipe_1_1, col;
28404
- var e_4, _f;
28405
- return __generator(this, function (_g) {
28407
+ var e_4, _b;
28408
+ return __generator(this, function (_c) {
28406
28409
  colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
28407
28410
  _loop_3 = function (col) {
28408
- var e_5, _f;
28411
+ var e_5, _b;
28409
28412
  var _loop_4 = function (item) {
28410
28413
  this_2.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
28411
- item["pipe__" + col.field] = rs;
28414
+ item["pipe__" + col.field + " "] = rs;
28412
28415
  });
28413
28416
  };
28414
28417
  try {
@@ -28420,7 +28423,7 @@
28420
28423
  catch (e_5_1) { e_5 = { error: e_5_1 }; }
28421
28424
  finally {
28422
28425
  try {
28423
- if (dataSource_1_1 && !dataSource_1_1.done && (_f = dataSource_1.return)) _f.call(dataSource_1);
28426
+ if (dataSource_1_1 && !dataSource_1_1.done && (_b = dataSource_1.return)) _b.call(dataSource_1);
28424
28427
  }
28425
28428
  finally { if (e_5) throw e_5.error; }
28426
28429
  }
@@ -28435,7 +28438,7 @@
28435
28438
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
28436
28439
  finally {
28437
28440
  try {
28438
- if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_f = colHasPipe_1.return)) _f.call(colHasPipe_1);
28441
+ if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_b = colHasPipe_1.return)) _b.call(colHasPipe_1);
28439
28442
  }
28440
28443
  finally { if (e_4) throw e_4.error; }
28441
28444
  }
@@ -28446,8 +28449,8 @@
28446
28449
  CrudListComponent.prototype.transform = function (pipe, asyncPipe, value) {
28447
28450
  return __awaiter(this, void 0, void 0, function () {
28448
28451
  var val, val;
28449
- return __generator(this, function (_f) {
28450
- switch (_f.label) {
28452
+ return __generator(this, function (_b) {
28453
+ switch (_b.label) {
28451
28454
  case 0:
28452
28455
  if (this.cachedTransforms[value]) {
28453
28456
  return [2 /*return*/, this.cachedTransforms[value]];
@@ -28455,7 +28458,7 @@
28455
28458
  if (!asyncPipe) return [3 /*break*/, 2];
28456
28459
  return [4 /*yield*/, pipe.transform(value)];
28457
28460
  case 1:
28458
- val = _f.sent();
28461
+ val = _b.sent();
28459
28462
  this.cachedTransforms[value] = val;
28460
28463
  return [2 /*return*/, val];
28461
28464
  case 2:
@@ -28549,7 +28552,7 @@
28549
28552
  return {};
28550
28553
  };
28551
28554
  CrudListComponent.prototype.getMinimizeData = function (model) {
28552
- var e_6, _f;
28555
+ var e_6, _b;
28553
28556
  if (isLiteralObject(model)) {
28554
28557
  if (model._dropdownvalue != null && model._dropdownvalue !== '') {
28555
28558
  return model[model._dropdownvalue];
@@ -28575,7 +28578,7 @@
28575
28578
  catch (e_6_1) { e_6 = { error: e_6_1 }; }
28576
28579
  finally {
28577
28580
  try {
28578
- if (model_1_1 && !model_1_1.done && (_f = model_1.return)) _f.call(model_1);
28581
+ if (model_1_1 && !model_1_1.done && (_b = model_1.return)) _b.call(model_1);
28579
28582
  }
28580
28583
  finally { if (e_6) throw e_6.error; }
28581
28584
  }
@@ -28723,7 +28726,7 @@
28723
28726
  };
28724
28727
  CrudListComponent.prototype.showSettingsPermission = function () {
28725
28728
  return __awaiter(this, void 0, void 0, function () {
28726
- return __generator(this, function (_f) {
28729
+ return __generator(this, function (_b) {
28727
28730
  if (this.creatingSearchInfo)
28728
28731
  return [2 /*return*/];
28729
28732
  this._showSettingsPermission = true;
@@ -28733,10 +28736,10 @@
28733
28736
  };
28734
28737
  CrudListComponent.prototype.createSearchSchema = function () {
28735
28738
  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) {
28739
+ var searchInfo, _b, _c, col, control, e_7_1, _loop_5, this_3, _d, _e, field;
28740
+ var e_7, _f, _g, e_8, _h;
28741
+ return __generator(this, function (_j) {
28742
+ switch (_j.label) {
28740
28743
  case 0:
28741
28744
  if (this.setting.cols == null) {
28742
28745
  return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
@@ -28746,14 +28749,14 @@
28746
28749
  searchInfo.schema = [];
28747
28750
  searchInfo.fieldDropdown = {};
28748
28751
  searchInfo.fieldSearchText = [];
28749
- _o.label = 1;
28752
+ _j.label = 1;
28750
28753
  case 1:
28751
- _o.trys.push([1, 6, 7, 8]);
28752
- _f = __values(this.setting.cols), _g = _f.next();
28753
- _o.label = 2;
28754
+ _j.trys.push([1, 6, 7, 8]);
28755
+ _b = __values(this.setting.cols), _c = _b.next();
28756
+ _j.label = 2;
28754
28757
  case 2:
28755
- if (!!_g.done) return [3 /*break*/, 5];
28756
- col = _g.value;
28758
+ if (!!_c.done) return [3 /*break*/, 5];
28759
+ col = _c.value;
28757
28760
  if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
28758
28761
  if (col.fullTextSearch) {
28759
28762
  if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
@@ -28766,9 +28769,9 @@
28766
28769
  }
28767
28770
  return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
28768
28771
  case 3:
28769
- control = _o.sent();
28772
+ control = _j.sent();
28770
28773
  if (control != null) {
28771
- (_l = searchInfo.schema).push.apply(_l, __spread(control));
28774
+ (_g = searchInfo.schema).push.apply(_g, __spread(control));
28772
28775
  }
28773
28776
  else {
28774
28777
  if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
@@ -28822,18 +28825,18 @@
28822
28825
  }
28823
28826
  }
28824
28827
  }
28825
- _o.label = 4;
28828
+ _j.label = 4;
28826
28829
  case 4:
28827
- _g = _f.next();
28830
+ _c = _b.next();
28828
28831
  return [3 /*break*/, 2];
28829
28832
  case 5: return [3 /*break*/, 8];
28830
28833
  case 6:
28831
- e_7_1 = _o.sent();
28834
+ e_7_1 = _j.sent();
28832
28835
  e_7 = { error: e_7_1 };
28833
28836
  return [3 /*break*/, 8];
28834
28837
  case 7:
28835
28838
  try {
28836
- if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
28839
+ if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
28837
28840
  }
28838
28841
  finally { if (e_7) throw e_7.error; }
28839
28842
  return [7 /*endfinally*/];
@@ -28853,15 +28856,15 @@
28853
28856
  };
28854
28857
  this_3 = this;
28855
28858
  try {
28856
- for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
28857
- field = _j.value;
28859
+ for (_d = __values(searchInfo.fieldSearchText), _e = _d.next(); !_e.done; _e = _d.next()) {
28860
+ field = _e.value;
28858
28861
  _loop_5(field);
28859
28862
  }
28860
28863
  }
28861
28864
  catch (e_8_1) { e_8 = { error: e_8_1 }; }
28862
28865
  finally {
28863
28866
  try {
28864
- if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
28867
+ if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
28865
28868
  }
28866
28869
  finally { if (e_8) throw e_8.error; }
28867
28870
  }
@@ -28927,19 +28930,15 @@
28927
28930
  }
28928
28931
  }, 20);
28929
28932
  };
28930
- CrudListComponent.prototype.getTooltip = function (tooltip, field) {
28931
- var result = tooltip && tooltip[field] ? tooltip[field] : null;
28932
- return result;
28933
- };
28934
28933
  return CrudListComponent;
28935
28934
  }(ComponentBase));
28936
28935
  CrudListComponent.decorators = [
28937
28936
  { type: i0.Component, args: [{
28938
28937
  // tslint:disable-next-line: component-selector
28939
28938
  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>",
28939
+ 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
28940
  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}}"]
28941
+ 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
28942
  },] }
28944
28943
  ];
28945
28944
  CrudListComponent.ctorParameters = function () { return [
@@ -30856,67 +30855,31 @@
30856
30855
  };
30857
30856
  EntityPickerDataComponent.prototype.modifyGridInfo = function (gridInfo) {
30858
30857
  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) {
30858
+ var allow;
30859
+ return __generator(this, function (_a) {
30860
+ switch (_a.label) {
30863
30861
  case 0:
30864
30862
  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
30863
  if (this.control.multiple) {
30891
30864
  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
- }
30865
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this._value));
30898
30866
  }
30899
30867
  }
30900
30868
  else {
30901
30869
  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
- }
30870
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this._value));
30908
30871
  }
30909
30872
  }
30910
30873
  return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
30911
30874
  case 1:
30912
- _d.sent();
30875
+ _a.sent();
30913
30876
  if (!this.control.modifyFilter) return [3 /*break*/, 3];
30914
30877
  return [4 /*yield*/, this.control.modifyFilter(gridInfo.filters, this)];
30915
30878
  case 2:
30916
- allow = _d.sent();
30879
+ allow = _a.sent();
30917
30880
  if (allow === false)
30918
30881
  return [2 /*return*/, false];
30919
- _d.label = 3;
30882
+ _a.label = 3;
30920
30883
  case 3:
30921
30884
  if (this.setting.columnSetting.sortField) {
30922
30885
  gridInfo.sorts.push({
@@ -31081,45 +31044,13 @@
31081
31044
  };
31082
31045
  EntityPickerSelectedComponent.prototype.modifyGridInfo = function (gridInfo) {
31083
31046
  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) {
31047
+ return __generator(this, function (_a) {
31048
+ switch (_a.label) {
31088
31049
  case 0:
31089
31050
  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
31051
  if (this.control.multiple) {
31116
31052
  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
- }
31053
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31123
31054
  }
31124
31055
  else {
31125
31056
  return [2 /*return*/, false];
@@ -31127,12 +31058,7 @@
31127
31058
  }
31128
31059
  else {
31129
31060
  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
- }
31061
+ gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
31136
31062
  }
31137
31063
  else {
31138
31064
  return [2 /*return*/, false];
@@ -31140,7 +31066,7 @@
31140
31066
  }
31141
31067
  return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
31142
31068
  case 1:
31143
- _d.sent();
31069
+ _a.sent();
31144
31070
  return [2 /*return*/];
31145
31071
  }
31146
31072
  });
@@ -31965,11 +31891,10 @@
31965
31891
  }
31966
31892
  return FileExplorerItem;
31967
31893
  }());
31968
- var FileExplorerItemType;
31969
31894
  (function (FileExplorerItemType) {
31970
31895
  FileExplorerItemType[FileExplorerItemType["File"] = 0] = "File";
31971
31896
  FileExplorerItemType[FileExplorerItemType["Folder"] = 1] = "Folder";
31972
- })(FileExplorerItemType || (FileExplorerItemType = {}));
31897
+ })(exports.FileExplorerItemType || (exports.FileExplorerItemType = {}));
31973
31898
 
31974
31899
  // fix for build prod
31975
31900
  var printJS$2 = printJS___namespace;
@@ -32794,6 +32719,7 @@
32794
32719
  _this.invalidFileLimitMessageDetail = 'tối đa {0} file.';
32795
32720
  _this._hasLoadedSource = false;
32796
32721
  _this.readonly = false;
32722
+ _this.signonly = false;
32797
32723
  _this.onReady = new i0.EventEmitter();
32798
32724
  _this.entityKeyChange = new i0.EventEmitter();
32799
32725
  _this.closePopup = new i0.EventEmitter();
@@ -32925,7 +32851,24 @@
32925
32851
  if (dataSource === void 0) { dataSource = []; }
32926
32852
  this._dataSource = dataSource;
32927
32853
  this._oldValue = this._value;
32928
- this._value = dataSource.map(function (item) { return item.id; });
32854
+ var value = [];
32855
+ dataSource.forEach(function (item) {
32856
+ value.push(item.id);
32857
+ if (item.name) {
32858
+ item.nameWithoutExtension = item.name;
32859
+ var index = item.name.lastIndexOf('.');
32860
+ if (index > -1) {
32861
+ item.nameWithoutExtension = item.name.substring(0, index);
32862
+ }
32863
+ if (item.extension) {
32864
+ item.extension = item.extension.toLowerCase();
32865
+ }
32866
+ item.tailFile = item.name.substring(index);
32867
+ item.tailFileUpper = item.tailFile.toUpperCase();
32868
+ item.isFile = item.fileExplorerItemType == exports.FileExplorerItemType.File;
32869
+ }
32870
+ });
32871
+ this._value = value;
32929
32872
  if (this._oldValue != null) {
32930
32873
  if (JSON.stringify(this._oldValue) != JSON.stringify(this._value)) {
32931
32874
  this.fireEventChange();
@@ -33045,6 +32988,10 @@
33045
32988
  show: false,
33046
32989
  formData: {}
33047
32990
  };
32991
+ this.forms[this.formIds.signatureDetail] = {
32992
+ header: 'Thông tin chữ ký số',
32993
+ show: false,
32994
+ };
33048
32995
  this.forms[this.formIds.fileVersionList] = {
33049
32996
  header: 'Danh sách phiên bản',
33050
32997
  show: false,
@@ -33096,14 +33043,14 @@
33096
33043
  command: function () {
33097
33044
  _this.deleteFile(item);
33098
33045
  },
33099
- visible: !this.readonly
33046
+ visible: !this.signonly && !this.readonly
33100
33047
  },
33101
33048
  {
33102
33049
  label: 'Đổi tên', icon: 'fas fa-eraser',
33103
33050
  command: function () {
33104
33051
  _this.renameFile(item);
33105
33052
  },
33106
- visible: !this.readonly
33053
+ visible: !this.signonly && !this.readonly
33107
33054
  }
33108
33055
  ];
33109
33056
  }
@@ -33135,7 +33082,7 @@
33135
33082
  };
33136
33083
  FileManagerComponent.prototype.modifyGridInfo = function (gridInfo) {
33137
33084
  return __awaiter(this, void 0, void 0, function () {
33138
- return __generator(this, function (_a) {
33085
+ return __generator(this, function (_b) {
33139
33086
  gridInfo.filters.push(this.newFilter('parentFolderId', exports.Operator.equal, this.data.currentFolderId));
33140
33087
  return [2 /*return*/];
33141
33088
  });
@@ -33144,7 +33091,7 @@
33144
33091
  FileManagerComponent.prototype.afterGetData = function () {
33145
33092
  return __awaiter(this, void 0, void 0, function () {
33146
33093
  var _loop_1, this_1, ind;
33147
- return __generator(this, function (_a) {
33094
+ return __generator(this, function (_b) {
33148
33095
  _loop_1 = function (ind) {
33149
33096
  var item = this_1.model.dataSource[ind];
33150
33097
  if (this_1._fileExplorerService.supportDigitalSignature(item.name)) {
@@ -33155,7 +33102,7 @@
33155
33102
  }
33156
33103
  });
33157
33104
  }
33158
- if (item.fileExplorerItemType === FileExplorerItemType.Folder) {
33105
+ if (item.fileExplorerItemType === exports.FileExplorerItemType.Folder) {
33159
33106
  item.class = '';
33160
33107
  }
33161
33108
  if (item.extension) {
@@ -33317,7 +33264,7 @@
33317
33264
  FileManagerComponent.prototype.openObject = function (explorerItem) {
33318
33265
  return __awaiter(this, void 0, void 0, function () {
33319
33266
  var canViewOnline;
33320
- return __generator(this, function (_a) {
33267
+ return __generator(this, function (_b) {
33321
33268
  if (explorerItem.isFile) {
33322
33269
  canViewOnline = this._fileObjectService.isSupportedViewOnline(explorerItem.name);
33323
33270
  if (canViewOnline) {
@@ -33358,7 +33305,7 @@
33358
33305
  FileManagerComponent.prototype.download = function (explorerItem) {
33359
33306
  return __awaiter(this, void 0, void 0, function () {
33360
33307
  var model;
33361
- return __generator(this, function (_a) {
33308
+ return __generator(this, function (_b) {
33362
33309
  model = this._downloadLinkService.getGenerateDownloadLinkModel(explorerItem);
33363
33310
  this._downloadLinkService.download(model);
33364
33311
  return [2 /*return*/];
@@ -33370,7 +33317,7 @@
33370
33317
  return __awaiter(this, void 0, void 0, function () {
33371
33318
  var selectedItems, hasItems, arrModel;
33372
33319
  var _this = this;
33373
- return __generator(this, function (_a) {
33320
+ return __generator(this, function (_b) {
33374
33321
  selectedItems = this.model.selectedItems;
33375
33322
  hasItems = selectedItems && selectedItems.length;
33376
33323
  if (hasItems) {
@@ -33520,13 +33467,13 @@
33520
33467
  return __awaiter(this, void 0, void 0, function () {
33521
33468
  var rs, breadcrumbs;
33522
33469
  var _this = this;
33523
- return __generator(this, function (_a) {
33524
- switch (_a.label) {
33470
+ return __generator(this, function (_b) {
33471
+ switch (_b.label) {
33525
33472
  case 0:
33526
33473
  if (!this.data.currentFolderId) return [3 /*break*/, 2];
33527
33474
  return [4 /*yield*/, this._folderService.getFullFolderPath(this.data.currentFolderId)];
33528
33475
  case 1:
33529
- rs = _a.sent();
33476
+ rs = _b.sent();
33530
33477
  if (rs.success) {
33531
33478
  breadcrumbs = rs.data.map(function (f) {
33532
33479
  var item = {
@@ -33548,7 +33495,7 @@
33548
33495
  return [3 /*break*/, 3];
33549
33496
  case 2:
33550
33497
  this.data.breadcrumbs = [];
33551
- _a.label = 3;
33498
+ _b.label = 3;
33552
33499
  case 3: return [2 /*return*/];
33553
33500
  }
33554
33501
  });
@@ -33558,36 +33505,75 @@
33558
33505
  // TODO: Lưu ý xử lý trường double click vào nút
33559
33506
  FileManagerComponent.prototype.signFile = function (file) {
33560
33507
  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
- });
33508
+ 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 () {
33509
+ var sourceFileId, sourceFile_1, rsConvert, e_1;
33510
+ var _this = this;
33511
+ return __generator(this, function (_b) {
33512
+ switch (_b.label) {
33513
+ case 0:
33514
+ if (!rs) return [3 /*break*/, 5];
33515
+ sourceFileId = file.id;
33516
+ sourceFile_1 = file;
33517
+ if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 4];
33518
+ _b.label = 1;
33519
+ case 1:
33520
+ _b.trys.push([1, 3, , 4]);
33521
+ return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
33522
+ id: sourceFileId,
33523
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33524
+ folderId: file.parentFolderId,
33525
+ ownerType: this._userService.getCurrentUser().userId.toString(),
33526
+ })];
33527
+ case 2:
33528
+ rsConvert = _b.sent();
33529
+ if (!rsConvert || !rsConvert.success) {
33530
+ 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");
33531
+ return [2 /*return*/];
33582
33532
  }
33583
- });
33584
- });
33585
- }
33586
- });
33533
+ else {
33534
+ this._notifierService.showSuccess("Chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf th\u00E0nh c\u00F4ng");
33535
+ sourceFileId = rsConvert.data;
33536
+ sourceFile_1 = { id: sourceFileId };
33537
+ this._triggerProcessData();
33538
+ }
33539
+ return [3 /*break*/, 4];
33540
+ case 3:
33541
+ e_1 = _b.sent();
33542
+ 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");
33543
+ return [2 /*return*/];
33544
+ case 4:
33545
+ this._fileExplorerService.generateLinkDownload({
33546
+ fileId: sourceFileId,
33547
+ }).then(function (rs) {
33548
+ var url = _this._downloadLinkService.getDownloadForSignUrl(rs.data);
33549
+ var prms = {};
33550
+ prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + _this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
33551
+ prms['SessionId'] = '';
33552
+ prms['FileName'] = url;
33553
+ // tslint:disable-next-line: variable-name
33554
+ var json_prms = JSON.stringify(prms);
33555
+ vgca_sign_approved(json_prms, function (result) {
33556
+ var resultObj = JSON.parse(result);
33557
+ if (resultObj.FileServer != '') {
33558
+ _this._fileExplorerService.saveSignedFile({
33559
+ sourceFile: sourceFile_1,
33560
+ tempFileId: resultObj.FileServer,
33561
+ }).then(function (rss) {
33562
+ _this._triggerProcessData();
33563
+ _this._notifierService.showSuccess('Ký số thành công');
33564
+ });
33565
+ }
33566
+ });
33567
+ });
33568
+ _b.label = 5;
33569
+ case 5: return [2 /*return*/];
33570
+ }
33571
+ });
33572
+ }); });
33587
33573
  };
33588
33574
  FileManagerComponent.prototype.shareFolder = function (file) {
33589
33575
  return __awaiter(this, void 0, void 0, function () {
33590
- return __generator(this, function (_a) {
33576
+ return __generator(this, function (_b) {
33591
33577
  this.forms.shareFolder.data = file;
33592
33578
  this.forms.shareFolder.show = true;
33593
33579
  return [2 /*return*/];
@@ -33596,7 +33582,7 @@
33596
33582
  };
33597
33583
  FileManagerComponent.prototype.shareFile = function (file) {
33598
33584
  return __awaiter(this, void 0, void 0, function () {
33599
- return __generator(this, function (_a) {
33585
+ return __generator(this, function (_b) {
33600
33586
  this.forms.shareFile.data = file;
33601
33587
  this.forms.shareFile.show = true;
33602
33588
  return [2 /*return*/];
@@ -33610,19 +33596,154 @@
33610
33596
  };
33611
33597
  FileManagerComponent.prototype.viewListSign = function (e, signatures) {
33612
33598
  e.stopPropagation();
33613
- this.forms.signatureDetail.data = signatures;
33599
+ this.model.advanceData = signatures;
33614
33600
  this.forms.signatureDetail.show = true;
33615
33601
  };
33616
33602
  FileManagerComponent.prototype.onRowSelect = function (evt) {
33617
33603
  this.onSelected.emit(this.model.selectedItems);
33618
33604
  };
33605
+ FileManagerComponent.prototype.signMultiple = function () {
33606
+ return __awaiter(this, void 0, void 0, function () {
33607
+ var selectedItems, hasItems;
33608
+ return __generator(this, function (_b) {
33609
+ selectedItems = this.model.selectedItems;
33610
+ hasItems = selectedItems && selectedItems.length;
33611
+ if (hasItems) {
33612
+ if (selectedItems.length == 1) {
33613
+ this.signFile(selectedItems[0]);
33614
+ }
33615
+ else {
33616
+ this.signFileMultiple(selectedItems);
33617
+ }
33618
+ }
33619
+ return [2 /*return*/];
33620
+ });
33621
+ });
33622
+ };
33623
+ FileManagerComponent.prototype.signFileMultiple = function (lstFile) {
33624
+ return __awaiter(this, void 0, void 0, function () {
33625
+ var prms, rs, lstFile_1, lstFile_1_1, file, sourceFileId, sourceFile, rsConvert, result, url, e_2, result, url, e_3_1, json_prms;
33626
+ var e_3, _b;
33627
+ var _this = this;
33628
+ return __generator(this, function (_c) {
33629
+ switch (_c.label) {
33630
+ case 0:
33631
+ prms = {};
33632
+ prms['Files'] = [];
33633
+ prms['FileUploadHandler'] = this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
33634
+ prms['SessionId'] = '';
33635
+ 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?')];
33636
+ case 1:
33637
+ rs = _c.sent();
33638
+ if (!rs) return [3 /*break*/, 18];
33639
+ _c.label = 2;
33640
+ case 2:
33641
+ _c.trys.push([2, 15, 16, 17]);
33642
+ lstFile_1 = __values(lstFile), lstFile_1_1 = lstFile_1.next();
33643
+ _c.label = 3;
33644
+ case 3:
33645
+ if (!!lstFile_1_1.done) return [3 /*break*/, 14];
33646
+ file = lstFile_1_1.value;
33647
+ if (!this._fileObjectService.isTypeFileKySo(file.name))
33648
+ return [3 /*break*/, 13];
33649
+ sourceFileId = file.id;
33650
+ sourceFile = file;
33651
+ if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 11];
33652
+ _c.label = 4;
33653
+ case 4:
33654
+ _c.trys.push([4, 9, , 10]);
33655
+ return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
33656
+ id: sourceFileId,
33657
+ name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33658
+ folderId: file.parentFolderId,
33659
+ ownerType: this._userService.getCurrentUser().userId.toString(),
33660
+ })];
33661
+ case 5:
33662
+ rsConvert = _c.sent();
33663
+ if (!(!rsConvert || !rsConvert.success)) return [3 /*break*/, 6];
33664
+ 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");
33665
+ return [3 /*break*/, 13];
33666
+ case 6: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: rsConvert.data })];
33667
+ case 7:
33668
+ result = _c.sent();
33669
+ if (result.success) {
33670
+ url = this._downloadLinkService.getDownloadForSignUrl(result.data);
33671
+ prms['Files'].push({
33672
+ "FileID": rsConvert.data,
33673
+ "FileName": this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
33674
+ "URL": url,
33675
+ });
33676
+ }
33677
+ _c.label = 8;
33678
+ case 8: return [3 /*break*/, 10];
33679
+ case 9:
33680
+ e_2 = _c.sent();
33681
+ 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");
33682
+ return [3 /*break*/, 13];
33683
+ case 10: return [3 /*break*/, 13];
33684
+ case 11: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: sourceFileId })];
33685
+ case 12:
33686
+ result = _c.sent();
33687
+ if (result.success) {
33688
+ url = this._downloadLinkService.getDownloadForSignUrl(result.data);
33689
+ prms['Files'].push({
33690
+ "FileID": sourceFileId,
33691
+ "FileName": file.name,
33692
+ "URL": url,
33693
+ });
33694
+ }
33695
+ _c.label = 13;
33696
+ case 13:
33697
+ lstFile_1_1 = lstFile_1.next();
33698
+ return [3 /*break*/, 3];
33699
+ case 14: return [3 /*break*/, 17];
33700
+ case 15:
33701
+ e_3_1 = _c.sent();
33702
+ e_3 = { error: e_3_1 };
33703
+ return [3 /*break*/, 17];
33704
+ case 16:
33705
+ try {
33706
+ if (lstFile_1_1 && !lstFile_1_1.done && (_b = lstFile_1.return)) _b.call(lstFile_1);
33707
+ }
33708
+ finally { if (e_3) throw e_3.error; }
33709
+ return [7 /*endfinally*/];
33710
+ case 17:
33711
+ json_prms = JSON.stringify(prms);
33712
+ vgca_sign_files(json_prms, function (result) {
33713
+ var _a;
33714
+ var resultObj = JSON.parse(result);
33715
+ if ((_a = resultObj.Files) === null || _a === void 0 ? void 0 : _a.length) {
33716
+ resultObj.Files.forEach(function (item) { return __awaiter(_this, void 0, void 0, function () {
33717
+ var _this = this;
33718
+ return __generator(this, function (_b) {
33719
+ this._fileExplorerService.saveSignedFile({
33720
+ sourceFile: { id: item.FileID },
33721
+ tempFileId: item.FileSignedURL,
33722
+ }).then(function (rss) {
33723
+ _this._triggerProcessData();
33724
+ _this._notifierService.showSuccess('Ký số thành công');
33725
+ });
33726
+ return [2 /*return*/];
33727
+ });
33728
+ }); });
33729
+ }
33730
+ ;
33731
+ });
33732
+ _c.label = 18;
33733
+ case 18:
33734
+ ;
33735
+ return [2 /*return*/];
33736
+ }
33737
+ });
33738
+ });
33739
+ };
33619
33740
  return FileManagerComponent;
33620
33741
  }(DataListBase));
33621
33742
  FileManagerComponent.decorators = [
33622
33743
  { type: i0.Component, args: [{
33623
33744
  // tslint:disable-next-line: component-selector
33624
33745
  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> -->",
33746
+ 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
33747
  providers: [
33627
33748
  {
33628
33749
  provide: forms.NG_VALUE_ACCESSOR,
@@ -33672,6 +33793,7 @@
33672
33793
  entity: [{ type: i0.Input }],
33673
33794
  entityKey: [{ type: i0.Input }],
33674
33795
  readonly: [{ type: i0.Input }],
33796
+ signonly: [{ type: i0.Input }],
33675
33797
  value: [{ type: i0.Input }],
33676
33798
  onReady: [{ type: i0.Output }],
33677
33799
  entityKeyChange: [{ type: i0.Output }],
@@ -34600,6 +34722,12 @@
34600
34722
  _this.hasFile = false;
34601
34723
  _this.showNoti = false;
34602
34724
  _this.notification = null;
34725
+ _this.supportedExtensions = [
34726
+ 'pdf',
34727
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
34728
+ 'mp4', 'webm', 'ogg',
34729
+ 'mp3', 'wav', 'aac' // Âm thanh
34730
+ ];
34603
34731
  return _this;
34604
34732
  }
34605
34733
  FileUploadComponent.prototype.writeValue = function (obj) {
@@ -34620,15 +34748,15 @@
34620
34748
  FileUploadComponent.prototype.getFile = function () {
34621
34749
  return __awaiter(this, void 0, void 0, function () {
34622
34750
  var fileObject;
34623
- return __generator(this, function (_a) {
34624
- switch (_a.label) {
34751
+ return __generator(this, function (_b) {
34752
+ switch (_b.label) {
34625
34753
  case 0:
34626
34754
  if (!this.fileId) return [3 /*break*/, 2];
34627
34755
  this.loading = true;
34628
34756
  this.notification = 'Đang đính kèm...';
34629
34757
  return [4 /*yield*/, this._fileObjectService.getDetail(this.fileId)];
34630
34758
  case 1:
34631
- fileObject = (_a.sent()).data;
34759
+ fileObject = (_b.sent()).data;
34632
34760
  if (fileObject) {
34633
34761
  this.selectedFileName = fileObject.name;
34634
34762
  this.hasFile = true;
@@ -34639,7 +34767,7 @@
34639
34767
  else {
34640
34768
  this.hasFile = false;
34641
34769
  }
34642
- _a.label = 2;
34770
+ _b.label = 2;
34643
34771
  case 2: return [2 /*return*/];
34644
34772
  }
34645
34773
  });
@@ -34733,12 +34861,38 @@
34733
34861
  this._downloadLinkService.download(model);
34734
34862
  }
34735
34863
  };
34864
+ FileUploadComponent.prototype.isViewableFile = function (url) {
34865
+ var _a;
34866
+ if (!url) {
34867
+ return false;
34868
+ }
34869
+ try {
34870
+ // Lấy phần mở rộng của file từ URL
34871
+ var extension = (_a = url.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
34872
+ return extension ? this.supportedExtensions.includes(extension) : false;
34873
+ }
34874
+ catch (error) {
34875
+ console.error('Lỗi khi kiểm tra đuôi file:', error);
34876
+ return false;
34877
+ }
34878
+ };
34879
+ FileUploadComponent.prototype.onDownloadOrViewFile = function () {
34880
+ if (this.isViewableFile(this.selectedFileName)) {
34881
+ if (this.fileId) {
34882
+ var url = this._fileObjectService.getPublicDownloadLinkByFileId(this.fileId);
34883
+ window.open(url, '_blank');
34884
+ }
34885
+ }
34886
+ else {
34887
+ this.onDownloadFile();
34888
+ }
34889
+ };
34736
34890
  return FileUploadComponent;
34737
34891
  }(ComponentBase));
34738
34892
  FileUploadComponent.decorators = [
34739
34893
  { type: i0.Component, args: [{
34740
34894
  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>",
34895
+ 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
34896
  providers: [
34743
34897
  {
34744
34898
  provide: forms.NG_VALUE_ACCESSOR,
@@ -34891,11 +35045,9 @@
34891
35045
  this.decimalPlaces = 2;
34892
35046
  this.viewMode = false;
34893
35047
  this.inputStyleClass = '';
34894
- this.thousandSeperator = '.';
34895
35048
  this.onFocus = new i0.EventEmitter();
34896
35049
  this.onBlur = new i0.EventEmitter();
34897
35050
  this.onChanged = new i0.EventEmitter();
34898
- this.locale = 'vi-VN';
34899
35051
  }
34900
35052
  Object.defineProperty(MaskComponent.prototype, "placeholder", {
34901
35053
  set: function (value) {
@@ -34907,11 +35059,10 @@
34907
35059
  configurable: true
34908
35060
  });
34909
35061
  MaskComponent.prototype.ngOnInit = function () {
34910
- this.locale = this.thousandSeperator == '.' ? 'vi-VN' : 'en-US';
34911
35062
  };
34912
35063
  MaskComponent.prototype.writeValue = function (obj) {
34913
35064
  if (obj) {
34914
- this.model = this._numberPipe.transform(obj, '', this.locale);
35065
+ this.model = this._numberPipe.transform(obj, '', 'vi-VN');
34915
35066
  this.value = Number(this.model);
34916
35067
  }
34917
35068
  else if (obj === 0) {
@@ -34929,7 +35080,7 @@
34929
35080
  return 'separator.0';
34930
35081
  };
34931
35082
  MaskComponent.prototype.getThousandSeperator = function () {
34932
- return this.thousandSeperator || '.';
35083
+ return '.';
34933
35084
  };
34934
35085
  MaskComponent.prototype.handleFocus = function () {
34935
35086
  this.onFocus.emit(this.value);
@@ -34961,7 +35112,7 @@
34961
35112
  }
34962
35113
  };
34963
35114
  MaskComponent.prototype.numberToStringVN = function (number) {
34964
- return this._numberPipe.transform(number, '', this.locale);
35115
+ return this._numberPipe.transform(number, '', 'vi-VN');
34965
35116
  };
34966
35117
  MaskComponent.prototype.registerOnChange = function (fn) {
34967
35118
  this.onChange = fn;
@@ -35006,7 +35157,6 @@
35006
35157
  decimalPlaces: [{ type: i0.Input }],
35007
35158
  viewMode: [{ type: i0.Input }],
35008
35159
  inputStyleClass: [{ type: i0.Input }],
35009
- thousandSeperator: [{ type: i0.Input }],
35010
35160
  onFocus: [{ type: i0.Output }],
35011
35161
  onBlur: [{ type: i0.Output }],
35012
35162
  onChanged: [{ type: i0.Output }]
@@ -35913,6 +36063,12 @@
35913
36063
  _this.onRemove = new i0.EventEmitter();
35914
36064
  _this.onChanged = new i0.EventEmitter();
35915
36065
  _this.dataModel = {};
36066
+ _this.supportedExtensions = [
36067
+ 'pdf',
36068
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
36069
+ 'mp4', 'webm', 'ogg',
36070
+ 'mp3', 'wav', 'aac' // Âm thanh
36071
+ ];
35916
36072
  if (_this._userService.isValidAccessToken()) {
35917
36073
  _this.userId = _this._userService.getUserIdCombine();
35918
36074
  }
@@ -35946,8 +36102,8 @@
35946
36102
  ServiceFileUploadComponent.prototype.getServiceFile = function () {
35947
36103
  return __awaiter(this, void 0, void 0, function () {
35948
36104
  var serviceRequestModel, fileObject;
35949
- return __generator(this, function (_a) {
35950
- switch (_a.label) {
36105
+ return __generator(this, function (_b) {
36106
+ switch (_b.label) {
35951
36107
  case 0:
35952
36108
  if (!this.hasKeys()) return [3 /*break*/, 2];
35953
36109
  serviceRequestModel = {
@@ -35959,7 +36115,7 @@
35959
36115
  this.setNoti('Đang lấy đính kèm...');
35960
36116
  return [4 /*yield*/, this._fileObjectService.getSingleServiceFile(serviceRequestModel)];
35961
36117
  case 1:
35962
- fileObject = (_a.sent()).data;
36118
+ fileObject = (_b.sent()).data;
35963
36119
  this.loading = false;
35964
36120
  this.setNoti(null);
35965
36121
  if (fileObject) {
@@ -35979,7 +36135,7 @@
35979
36135
  this.selectedFileName = null;
35980
36136
  this.onChangeBase(null);
35981
36137
  this.onChanged.emit();
35982
- _a.label = 3;
36138
+ _b.label = 3;
35983
36139
  case 3:
35984
36140
  this.setMenu();
35985
36141
  return [2 /*return*/];
@@ -36226,12 +36382,36 @@
36226
36382
  ServiceFileUploadComponent.prototype.setDisabledState = function (isDisabled) {
36227
36383
  this.isDisabled = isDisabled;
36228
36384
  };
36385
+ ServiceFileUploadComponent.prototype.isViewableFile = function (url) {
36386
+ var _a;
36387
+ if (!url) {
36388
+ return false;
36389
+ }
36390
+ try {
36391
+ // Lấy phần mở rộng của file từ URL
36392
+ var extension = (_a = url.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
36393
+ return extension ? this.supportedExtensions.includes(extension) : false;
36394
+ }
36395
+ catch (error) {
36396
+ console.error('Lỗi khi kiểm tra đuôi file:', error);
36397
+ return false;
36398
+ }
36399
+ };
36400
+ ServiceFileUploadComponent.prototype.onDownloadOrViewFile = function () {
36401
+ if (this.isViewableFile(this.selectedFileName)) {
36402
+ var url = this._fileObjectService.getPublicDownloadLinkByFileId(this.fileId);
36403
+ window.open(url, '_blank');
36404
+ }
36405
+ else {
36406
+ this.onDownloadFile();
36407
+ }
36408
+ };
36229
36409
  return ServiceFileUploadComponent;
36230
36410
  }(ComponentBase));
36231
36411
  ServiceFileUploadComponent.decorators = [
36232
36412
  { type: i0.Component, args: [{
36233
36413
  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>",
36414
+ 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
36415
  providers: [
36236
36416
  {
36237
36417
  provide: forms.NG_VALUE_ACCESSOR,
@@ -45514,10 +45694,8 @@
45514
45694
  },] }
45515
45695
  ];
45516
45696
 
45517
- var moment$1 = moment___namespace;
45518
45697
  var TnDatePipe = /** @class */ (function () {
45519
- function TnDatePipe(format) {
45520
- this.format = format;
45698
+ function TnDatePipe() {
45521
45699
  }
45522
45700
  TnDatePipe.prototype.addZero = function (value) {
45523
45701
  if (value < 10)
@@ -45527,8 +45705,6 @@
45527
45705
  TnDatePipe.prototype.transform = function (value, args) {
45528
45706
  if (value == null)
45529
45707
  return '';
45530
- if (this.format)
45531
- return moment$1(value).format(this.format);
45532
45708
  var date = new Date(value);
45533
45709
  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
45710
  };
@@ -45538,10 +45714,7 @@
45538
45714
  { type: i0.Pipe, args: [{
45539
45715
  name: 'tnDate'
45540
45716
  },] }
45541
- ];
45542
- TnDatePipe.ctorParameters = function () { return [
45543
- { type: undefined, decorators: [{ type: i0.Inject, args: [i0.LOCALE_ID,] }] }
45544
- ]; };
45717
+ ];
45545
45718
 
45546
45719
  var UserFormatPipe = /** @class */ (function () {
45547
45720
  function UserFormatPipe(_userService) {
@@ -45706,9 +45879,74 @@
45706
45879
  { type: UserService }
45707
45880
  ]; };
45708
45881
 
45882
+ // fix for build prod
45883
+ var moment$1 = moment___namespace;
45884
+ var SignatureDetailComponent = /** @class */ (function (_super) {
45885
+ __extends(SignatureDetailComponent, _super);
45886
+ function SignatureDetailComponent(injector) {
45887
+ return _super.call(this, injector) || this;
45888
+ }
45889
+ SignatureDetailComponent.prototype.ngOnInit = function () {
45890
+ this.model.data = this.parentModel.advanceData;
45891
+ this.buildTree();
45892
+ };
45893
+ SignatureDetailComponent.prototype.buildTree = function () {
45894
+ var nodes = [];
45895
+ for (var ind in this.model.data) {
45896
+ var item = this.model.data[ind];
45897
+ var childNodes = { expanded: true, children: [] };
45898
+ childNodes.label = "" + item.reason;
45899
+ childNodes.expandedIcon = 'fas fa-signature';
45900
+ childNodes.collapsedIcon = 'fas fa-signature';
45901
+ childNodes.leaf = false;
45902
+ if (item.reason) {
45903
+ childNodes.children.push({
45904
+ label: 'Người ký: ' + item.certificate.subject.nameOfSigner,
45905
+ expandedIcon: 'fas fa-user-tag',
45906
+ collapsedIcon: 'fas fa-user-tag',
45907
+ leaf: true
45908
+ });
45909
+ }
45910
+ childNodes.children.push({
45911
+ label: 'Đơn vị: ' + item.certificate.subject.organizationUnit + ' - ' + item.certificate.subject.organization,
45912
+ expandedIcon: 'fas fa-building',
45913
+ collapsedIcon: 'fas fa-building',
45914
+ leaf: true
45915
+ });
45916
+ childNodes.children.push({
45917
+ label: 'Chứng thư cấp bởi: ' + item.certificate.issuerDN.nameOfIssuer,
45918
+ expandedIcon: 'fas fa-certificate',
45919
+ collapsedIcon: 'fas fa-certificate',
45920
+ leaf: true
45921
+ });
45922
+ childNodes.children.push({
45923
+ label: 'Thời gian ký: ' + moment$1(item.signDate).format('D/MM/Y hh:mm:ss Z'),
45924
+ expandedIcon: 'fas fa-clock',
45925
+ collapsedIcon: 'fas fa-clock',
45926
+ leaf: true
45927
+ });
45928
+ nodes.push(childNodes);
45929
+ }
45930
+ this.model.dataSource = nodes;
45931
+ };
45932
+ return SignatureDetailComponent;
45933
+ }(ComponentBase));
45934
+ SignatureDetailComponent.decorators = [
45935
+ { type: i0.Component, args: [{
45936
+ selector: 'signature-detail',
45937
+ 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>",
45938
+ providers: [ComponentContextService],
45939
+ 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}"]
45940
+ },] }
45941
+ ];
45942
+ SignatureDetailComponent.ctorParameters = function () { return [
45943
+ { type: i0.Injector }
45944
+ ]; };
45945
+
45709
45946
  function coreDeclaration() {
45710
45947
  return [
45711
45948
  AddressComponent,
45949
+ AddressNewComponent,
45712
45950
  AfterViewCheckedComponent,
45713
45951
  AdvanceSearchComponent,
45714
45952
  AppRootMenuComponent,
@@ -45835,7 +46073,8 @@
45835
46073
  FilePickerDialogComponent,
45836
46074
  AddNewsComponent,
45837
46075
  CommonDashboardComponent,
45838
- NotFoundComponent
46076
+ NotFoundComponent,
46077
+ SignatureDetailComponent
45839
46078
  ];
45840
46079
  }
45841
46080
  function coreModuleImport() {
@@ -47388,67 +47627,6 @@
47388
47627
  { type: ModuleConfigService }
47389
47628
  ]; };
47390
47629
 
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
47630
  var ErrorType = /** @class */ (function () {
47453
47631
  function ErrorType() {
47454
47632
  }
@@ -47577,64 +47755,22 @@
47577
47755
  return TemplateTextMany;
47578
47756
  }());
47579
47757
 
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
- });
47758
+ var ServiceRequestModel = /** @class */ (function () {
47759
+ function ServiceRequestModel() {
47760
+ this.service = '';
47761
+ this.entityInstanceId = '';
47762
+ this.parent = null;
47763
+ this.serviceCode = '';
47764
+ this.entity = '';
47765
+ this.entityKey = '';
47766
+ }
47767
+ return ServiceRequestModel;
47768
+ }());
47769
+
47770
+ var FileVersionDTO = /** @class */ (function () {
47771
+ function FileVersionDTO() {
47636
47772
  }
47637
- return FileManagerSetting;
47773
+ return FileVersionDTO;
47638
47774
  }());
47639
47775
 
47640
47776
  (function (PermissionBase) {
@@ -47876,6 +48012,7 @@
47876
48012
  exports.AccessDeniedComponent = AccessDeniedComponent;
47877
48013
  exports.Action = Action;
47878
48014
  exports.AddressControlSchema = AddressControlSchema;
48015
+ exports.AddressNewControlSchema = AddressNewControlSchema;
47879
48016
  exports.AddressService = AddressService;
47880
48017
  exports.AdvanceSearchData = AdvanceSearchData;
47881
48018
  exports.AdvanceSearchSetting = AdvanceSearchSetting;
@@ -47992,16 +48129,18 @@
47992
48129
  exports.FILE_TYPES = FILE_TYPES;
47993
48130
  exports.FieldDefineIsWorkflowControl = FieldDefineIsWorkflowControl;
47994
48131
  exports.FileDataService = FileDataService;
48132
+ exports.FileExplorerItem = FileExplorerItem;
48133
+ exports.FileExplorerNewService = FileExplorerNewService;
47995
48134
  exports.FileExplorerService = FileExplorerService;
47996
48135
  exports.FileManagerComponent = FileManagerComponent;
47997
48136
  exports.FileManagerControlSchema = FileManagerControlSchema;
47998
- exports.FileManagerSetting = FileManagerSetting;
47999
48137
  exports.FileObjectService = FileObjectService;
48000
48138
  exports.FilePickerDialogComponent = FilePickerDialogComponent;
48001
48139
  exports.FileUploadComponent = FileUploadComponent;
48002
48140
  exports.FileUploadControlSchema = FileUploadControlSchema;
48003
- exports.FileUploadSetting = FileUploadSetting;
48004
48141
  exports.FileV4Service = FileV4Service;
48142
+ exports.FileVersionDTO = FileVersionDTO;
48143
+ exports.FileVersionService = FileVersionService;
48005
48144
  exports.Filter = Filter;
48006
48145
  exports.FolderService = FolderService;
48007
48146
  exports.FormControlBase = FormControlBase;
@@ -48042,6 +48181,7 @@
48042
48181
  exports.ModuleConfigService = ModuleConfigService;
48043
48182
  exports.MultiTranslateHttpLoader = MultiTranslateHttpLoader;
48044
48183
  exports.MultipleReferenceDataFormatPipe = MultipleReferenceDataFormatPipe;
48184
+ exports.MyDriveService = MyDriveService;
48045
48185
  exports.NodeService = NodeService;
48046
48186
  exports.NotFoundComponent = NotFoundComponent;
48047
48187
  exports.NotificationService = NotificationService;
@@ -48049,7 +48189,6 @@
48049
48189
  exports.NumberCompareValidator = NumberCompareValidator;
48050
48190
  exports.NumberOnlyValidator = NumberOnlyValidator;
48051
48191
  exports.NumberRangeControlSchema = NumberRangeControlSchema;
48052
- exports.OrganizationBaseService = OrganizationBaseService;
48053
48192
  exports.OrganizationFormatPipe = OrganizationFormatPipe;
48054
48193
  exports.OrganizationNameFormatPipe = OrganizationNameFormatPipe;
48055
48194
  exports.OrganizationPickerControlSchema = OrganizationPickerControlSchema;
@@ -48091,6 +48230,7 @@
48091
48230
  exports.SchemaBase = SchemaBase;
48092
48231
  exports.SecurePipe = SecurePipe;
48093
48232
  exports.ServiceFileUploadComponent = ServiceFileUploadComponent;
48233
+ exports.ServiceRequestModel = ServiceRequestModel;
48094
48234
  exports.SessionTypes = SessionTypes;
48095
48235
  exports.SignalRService = SignalRService;
48096
48236
  exports.SimpleDicItem = SimpleDicItem;
@@ -48237,107 +48377,107 @@
48237
48377
  exports.ɵ9 = ɵ9;
48238
48378
  exports.ɵa = AddressComponent;
48239
48379
  exports.ɵb = DropdownService;
48240
- exports.ɵba = EntityPermissionComponent;
48241
- exports.ɵbb = DM_ChucVuService;
48242
- exports.ɵbc = RoleService;
48243
- exports.ɵbd = EntityPermissionService;
48244
- exports.ɵbe = EquationEditorComponent;
48245
- exports.ɵbf = MaskComponent;
48246
- exports.ɵbg = NumberPickerRangeComponent;
48247
- exports.ɵbh = PagingNextBackOnlyComponent;
48248
- exports.ɵbi = RadioButtonListComponent;
48249
- exports.ɵbj = VanBanPickerComponent;
48250
- exports.ɵbk = VanBanDenService;
48251
- exports.ɵbl = VanBanDiService;
48252
- exports.ɵbm = VanBanPickerDialogComponent;
48253
- exports.ɵbn = VanbanDiPickerComponent;
48254
- exports.ɵbo = VanbanDenPickerComponent;
48255
- exports.ɵbp = CongViecPickerComponent;
48256
- exports.ɵbq = CongViecService;
48257
- exports.ɵbr = TaskWorkflowHistoriesService;
48258
- exports.ɵbs = SettingsComponent;
48259
- exports.ɵbt = SettingsRowComponent;
48260
- exports.ɵbu = SettingsWorkflowComponent;
48261
- exports.ɵbv = SettingsWorkflowNo1Component;
48262
- exports.ɵbw = SimpleWorkflowFormComponent;
48263
- exports.ɵbx = ProcessWorkflowFormComponent;
48264
- exports.ɵby = WorkflowHistoryService;
48265
- exports.ɵbz = ProcessWorkflowTargetComponent;
48380
+ exports.ɵba = EntityPickerComponent;
48381
+ exports.ɵbb = EntityPickerDialogComponent;
48382
+ exports.ɵbc = EntityPermissionComponent;
48383
+ exports.ɵbd = DM_ChucVuService;
48384
+ exports.ɵbe = RoleService;
48385
+ exports.ɵbf = EntityPermissionService;
48386
+ exports.ɵbg = EquationEditorComponent;
48387
+ exports.ɵbh = MaskComponent;
48388
+ exports.ɵbi = NumberPickerRangeComponent;
48389
+ exports.ɵbj = PagingNextBackOnlyComponent;
48390
+ exports.ɵbk = RadioButtonListComponent;
48391
+ exports.ɵbl = VanBanPickerComponent;
48392
+ exports.ɵbm = VanBanDenService;
48393
+ exports.ɵbn = VanBanDiService;
48394
+ exports.ɵbo = VanBanPickerDialogComponent;
48395
+ exports.ɵbp = VanbanDiPickerComponent;
48396
+ exports.ɵbq = VanbanDenPickerComponent;
48397
+ exports.ɵbr = CongViecPickerComponent;
48398
+ exports.ɵbs = CongViecService;
48399
+ exports.ɵbt = TaskWorkflowHistoriesService;
48400
+ exports.ɵbu = SettingsComponent;
48401
+ exports.ɵbv = SettingsRowComponent;
48402
+ exports.ɵbw = SettingsWorkflowComponent;
48403
+ exports.ɵbx = SettingsWorkflowNo1Component;
48404
+ exports.ɵby = SimpleWorkflowFormComponent;
48405
+ exports.ɵbz = ProcessWorkflowFormComponent;
48266
48406
  exports.ɵc = EntityPickerService;
48267
- exports.ɵca = SplashComponentV1Component;
48268
- exports.ɵcb = SplashComponentV2Component;
48269
- exports.ɵcc = StateMachinesConnectionReceiverComponent;
48270
- exports.ɵcd = StateMachinesConnectionReceiverUserComponent;
48271
- exports.ɵce = StateMachinesConnectionReceiverDepartmentComponent;
48272
- exports.ɵcf = StateMachinesConnectionReceiverGroupComponent;
48273
- exports.ɵcg = StateMachinesConnectionReceiverRoleComponent;
48274
- exports.ɵch = StateMachinesConnectionSenderComponent;
48275
- exports.ɵci = StartWorkflowComponent;
48276
- exports.ɵcj = WorkflowSettingsService;
48277
- exports.ɵck = WorkflowSettingNewComponent;
48278
- exports.ɵcl = DmLoaiCongViecService;
48279
- exports.ɵcm = TnDialogComponent;
48280
- exports.ɵcn = TnColorPickerComponent;
48281
- exports.ɵco = TnTinymceComponent;
48282
- exports.ɵcp = TnTabViewComponent;
48283
- exports.ɵcq = TableDetailFormComponent;
48284
- exports.ɵcr = FileIconPipe;
48285
- exports.ɵcs = FileSizePipe;
48286
- exports.ɵct = QuickAddFormComponent;
48287
- exports.ɵcu = PreventShiftTabDirective;
48288
- exports.ɵcv = UserPickerComponent;
48289
- exports.ɵcw = UserPickerBoxComponent;
48290
- exports.ɵcx = TnAppHelpComponent;
48291
- exports.ɵcy = PathNameService;
48292
- exports.ɵcz = HelperCurrentPageComponent;
48407
+ exports.ɵca = WorkflowHistoryService;
48408
+ exports.ɵcb = ProcessWorkflowTargetComponent;
48409
+ exports.ɵcc = SplashComponentV1Component;
48410
+ exports.ɵcd = SplashComponentV2Component;
48411
+ exports.ɵce = StateMachinesConnectionReceiverComponent;
48412
+ exports.ɵcf = StateMachinesConnectionReceiverUserComponent;
48413
+ exports.ɵcg = StateMachinesConnectionReceiverDepartmentComponent;
48414
+ exports.ɵch = StateMachinesConnectionReceiverGroupComponent;
48415
+ exports.ɵci = StateMachinesConnectionReceiverRoleComponent;
48416
+ exports.ɵcj = StateMachinesConnectionSenderComponent;
48417
+ exports.ɵck = StartWorkflowComponent;
48418
+ exports.ɵcl = WorkflowSettingsService;
48419
+ exports.ɵcm = WorkflowSettingNewComponent;
48420
+ exports.ɵcn = DmLoaiCongViecService;
48421
+ exports.ɵco = TnDialogComponent;
48422
+ exports.ɵcp = TnColorPickerComponent;
48423
+ exports.ɵcq = TnTinymceComponent;
48424
+ exports.ɵcr = TnTabViewComponent;
48425
+ exports.ɵcs = TableDetailFormComponent;
48426
+ exports.ɵct = FileIconPipe;
48427
+ exports.ɵcu = FileSizePipe;
48428
+ exports.ɵcv = QuickAddFormComponent;
48429
+ exports.ɵcw = PreventShiftTabDirective;
48430
+ exports.ɵcx = UserPickerComponent;
48431
+ exports.ɵcy = UserPickerBoxComponent;
48432
+ exports.ɵcz = TnAppHelpComponent;
48293
48433
  exports.ɵd = ExceptionHandlerService;
48294
- exports.ɵda = TnAppNotificationListComponent;
48295
- 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;
48434
+ exports.ɵda = PathNameService;
48435
+ exports.ɵdb = HelperCurrentPageComponent;
48436
+ exports.ɵdc = TnAppNotificationListComponent;
48437
+ exports.ɵdd = TnAppNotificationComponent;
48438
+ exports.ɵde = FolderFormComponent;
48439
+ exports.ɵdf = FileFormComponent;
48440
+ exports.ɵdg = FileViewerComponent;
48441
+ exports.ɵdh = FileVersionListComponent;
48442
+ exports.ɵdi = WorkflowHistoryComponent;
48443
+ exports.ɵdj = EntityWorkflowHistoryService;
48444
+ exports.ɵdk = WorkflowHistoryDialogComponent;
48445
+ exports.ɵdl = WorkflowHistoryNewComponent;
48446
+ exports.ɵdm = WorkflowSettingComponent;
48447
+ exports.ɵdn = EntityWorkflowSettingService;
48448
+ exports.ɵdo = WorkflowSettingDialogComponent;
48449
+ exports.ɵdp = QrCodeGeneratorComponent;
48450
+ exports.ɵdq = AccessDeniedV1Component;
48451
+ exports.ɵdr = AddNewsComponent;
48452
+ exports.ɵds = ArticleService;
48453
+ exports.ɵdt = NewsCategoryService;
48454
+ exports.ɵdu = SignatureDetailComponent;
48315
48455
  exports.ɵdv = CheckReadyComponent;
48316
48456
  exports.ɵdw = SendAccessTokenInterceptor;
48317
48457
  exports.ɵdx = LogInterceptor;
48318
48458
  exports.ɵdy = PermissionUtilsInterceptor;
48319
48459
  exports.ɵe = CanBo_HoSoService;
48320
- exports.ɵf = AfterViewCheckedComponent;
48321
- exports.ɵg = AdvanceSearchComponent;
48322
- exports.ɵh = AppRootMenuComponent;
48323
- exports.ɵi = AppTopBarComponent;
48324
- exports.ɵj = AppTopBarV1Component;
48325
- exports.ɵk = AppTopBarV2Component;
48326
- exports.ɵl = AppProfileComponent;
48327
- exports.ɵm = AppSubMenuComponent;
48328
- exports.ɵn = AppMenuComponent;
48329
- exports.ɵo = AutoCompletePickerComponent;
48330
- exports.ɵp = CheckBoxListComponent;
48331
- exports.ɵq = ReportQueueComponent;
48332
- exports.ɵr = CoCauToChucPickerListComponent;
48333
- exports.ɵs = DatetimePickerComponent;
48334
- exports.ɵt = DatetimePickerRangeComponent;
48335
- exports.ɵu = DynamicNodeComponent;
48336
- exports.ɵv = EntityPickerBoxComponent;
48337
- exports.ɵw = EntityPickerDataComponent;
48338
- exports.ɵx = EntityPickerSelectedComponent;
48339
- exports.ɵy = EntityPickerComponent;
48340
- exports.ɵz = EntityPickerDialogComponent;
48460
+ exports.ɵf = AddressNewComponent;
48461
+ exports.ɵg = AddressService$1;
48462
+ exports.ɵh = AfterViewCheckedComponent;
48463
+ exports.ɵi = AdvanceSearchComponent;
48464
+ exports.ɵj = AppRootMenuComponent;
48465
+ exports.ɵk = AppTopBarComponent;
48466
+ exports.ɵl = AppTopBarV1Component;
48467
+ exports.ɵm = AppTopBarV2Component;
48468
+ exports.ɵn = AppProfileComponent;
48469
+ exports.ɵo = AppSubMenuComponent;
48470
+ exports.ɵp = AppMenuComponent;
48471
+ exports.ɵq = AutoCompletePickerComponent;
48472
+ exports.ɵr = CheckBoxListComponent;
48473
+ exports.ɵs = ReportQueueComponent;
48474
+ exports.ɵt = CoCauToChucPickerListComponent;
48475
+ exports.ɵu = DatetimePickerComponent;
48476
+ exports.ɵv = DatetimePickerRangeComponent;
48477
+ exports.ɵw = DynamicNodeComponent;
48478
+ exports.ɵx = EntityPickerBoxComponent;
48479
+ exports.ɵy = EntityPickerDataComponent;
48480
+ exports.ɵz = EntityPickerSelectedComponent;
48341
48481
 
48342
48482
  Object.defineProperty(exports, '__esModule', { value: true });
48343
48483