tnx-shared 5.3.163 → 5.3.164

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 (55) hide show
  1. package/bundles/tnx-shared.umd.js +940 -505
  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/component-base.d.ts.map +1 -1
  6. package/classes/base/i-list-component.d.ts +3 -0
  7. package/classes/base/i-list-component.d.ts.map +1 -1
  8. package/classes/base/list-base.d.ts +5 -2
  9. package/classes/base/list-base.d.ts.map +1 -1
  10. package/classes/base/list-component-base.d.ts +21 -5
  11. package/classes/base/list-component-base.d.ts.map +1 -1
  12. package/classes/form-schema.d.ts +10 -0
  13. package/classes/form-schema.d.ts.map +1 -1
  14. package/components/settings/settings-authorize-button/settings-authorize-button.component.d.ts +20 -0
  15. package/components/settings/settings-authorize-button/settings-authorize-button.component.d.ts.map +1 -0
  16. package/components/settings/settings-authorize-button/settings-authorize-button.component.ngfactory.d.ts.map +1 -0
  17. package/components/settings/settings-authorize-button/settings-authorize-button.component.scss.shim.ngstyle.d.ts.map +1 -0
  18. package/configs/component-context.constant.d.ts +8 -0
  19. package/configs/component-context.constant.d.ts.map +1 -1
  20. package/const/common.d.ts +2 -2
  21. package/const/common.d.ts.map +1 -1
  22. package/directives/authorize.directive.d.ts +8 -3
  23. package/directives/authorize.directive.d.ts.map +1 -1
  24. package/enums/common.d.ts +16 -0
  25. package/enums/common.d.ts.map +1 -1
  26. package/esm2015/classes/base/component-base.js +5 -1
  27. package/esm2015/classes/base/i-list-component.js +1 -1
  28. package/esm2015/classes/base/list-base.js +20 -6
  29. package/esm2015/classes/base/list-component-base.js +119 -10
  30. package/esm2015/classes/form-schema.js +12 -1
  31. package/esm2015/components/crud/crud-list/crud-list.component.js +2 -2
  32. package/esm2015/components/settings/settings-authorize-button/settings-authorize-button.component.js +142 -0
  33. package/esm2015/configs/component-context.constant.js +10 -2
  34. package/esm2015/const/common.js +5 -5
  35. package/esm2015/directives/authorize.directive.js +37 -6
  36. package/esm2015/enums/common.js +19 -1
  37. package/esm2015/services/authen.service.js +3 -1
  38. package/esm2015/services/basepermission.service.js +28 -0
  39. package/esm2015/services/common.service.js +1 -1
  40. package/esm2015/tnx-shared.js +4 -2
  41. package/esm2015/tnx-shared.module.js +3 -1
  42. package/fesm2015/tnx-shared.js +616 -262
  43. package/fesm2015/tnx-shared.js.map +1 -1
  44. package/package.json +2 -2
  45. package/services/authen.service.d.ts.map +1 -1
  46. package/services/basepermission.service.d.ts +11 -0
  47. package/services/basepermission.service.d.ts.map +1 -0
  48. package/services/basepermission.service.ngfactory.d.ts.map +1 -0
  49. package/services/common.service.d.ts.map +1 -1
  50. package/tnx-shared.d.ts +3 -1
  51. package/tnx-shared.d.ts.map +1 -1
  52. package/tnx-shared.metadata.json +1 -1
  53. package/tnx-shared.module.d.ts +2 -1
  54. package/tnx-shared.module.d.ts.map +1 -1
  55. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
@@ -115,7 +115,15 @@
115
115
  COLUMN_SETTING: 'COLUMN_SETTING',
116
116
  COLOR_SETTING: 'COLOR_SETTING',
117
117
  DEFAULT_DATA: 'DEFAULT_DATA',
118
- ADVANCE_FILTER: 'ADVANCE_FILTER'
118
+ ADVANCE_FILTER: 'ADVANCE_FILTER',
119
+ BUTTON_AUTHORIZE: 'BUTTON_AUTHORIZE',
120
+ BUTTON_SETTING: 'BUTTON_SETTING'
121
+ };
122
+ ComCtxConstants.COMMON_VN = {
123
+ ADD: 'THEM_MOI',
124
+ EDIT: 'SUA',
125
+ DELETE: 'XOA',
126
+ DELETE_MULTIPLE: 'XOA_CAC_MUC_DA_CHON',
119
127
  };
120
128
  ComCtxConstants.COMMON = {
121
129
  ADD: 'ADD',
@@ -1081,6 +1089,7 @@
1081
1089
  this.useCommonSearch = false;
1082
1090
  this.useCommonFullTextSearch = true;
1083
1091
  this.hiddenSearch = false;
1092
+ this.hiddenAuthorizeButton = false;
1084
1093
  this.hiddenHeader = false;
1085
1094
  this.hiddenPageSetting = false;
1086
1095
  this.hiddenTextPage = false;
@@ -2036,6 +2045,7 @@
2036
2045
  _this.searchMultiple = true;
2037
2046
  _this.disableDisplayFieldServerSearch = false;
2038
2047
  _this.loadOnInit = false;
2048
+ _this.isLazyLoad = false;
2039
2049
  _this.allowLoadDataWhenParentNull = false;
2040
2050
  _this.disabledParentItem = true;
2041
2051
  for (var key in init) {
@@ -2389,6 +2399,16 @@
2389
2399
  }
2390
2400
  return PopupSize;
2391
2401
  }());
2402
+ var ButtonAction = /** @class */ (function () {
2403
+ function ButtonAction(init) {
2404
+ this.lstElement = [];
2405
+ this.isAuthorize = false;
2406
+ for (var key in init) {
2407
+ this[key] = init[key];
2408
+ }
2409
+ }
2410
+ return ButtonAction;
2411
+ }());
2392
2412
  var EventData = /** @class */ (function () {
2393
2413
  function EventData(init) {
2394
2414
  for (var key in init) {
@@ -2885,6 +2905,7 @@
2885
2905
  Object.keys(sessionStorage).filter(function (item) { return /^AUTHORIZATION/.test(item) || /^V4_AUTHORIZATION/.test(item); }).forEach(function (item) {
2886
2906
  sessionStorage.removeItem(item);
2887
2907
  });
2908
+ sessionStorage.removeItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE);
2888
2909
  sessionStorage.removeItem('profiles');
2889
2910
  sessionStorage.removeItem('v4_profiles');
2890
2911
  };
@@ -5395,6 +5416,24 @@
5395
5416
  EnumCanBo[EnumCanBo["NGOAI_DON_VI"] = 2] = "NGOAI_DON_VI";
5396
5417
  EnumCanBo[EnumCanBo["TRONG_DON_VI"] = 3] = "TRONG_DON_VI";
5397
5418
  })(exports.EnumCanBo || (exports.EnumCanBo = {}));
5419
+ exports.PermissionName = void 0;
5420
+ (function (PermissionName) {
5421
+ PermissionName["WATCH"] = "Xem";
5422
+ PermissionName["ADD"] = "Th\u00EAm m\u1EDBi";
5423
+ PermissionName["EDIT"] = "S\u1EEDa";
5424
+ PermissionName["DELETE"] = "X\u00F3a";
5425
+ PermissionName["DELETE_MULTIPLE"] = "X\u00F3a c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn";
5426
+ })(exports.PermissionName || (exports.PermissionName = {}));
5427
+ exports.EnumProperties = void 0;
5428
+ (function (EnumProperties) {
5429
+ EnumProperties["NG_REFLECT_TEXT"] = "ng-reflect-text";
5430
+ EnumProperties["NG_REFLECT_LABEL"] = "ng-reflect-label";
5431
+ EnumProperties["CRUD_LIST"] = "crud-list";
5432
+ EnumProperties["LABEL"] = "label";
5433
+ EnumProperties["TAG_NAME"] = "tagName";
5434
+ EnumProperties["TOOLTIP"] = "ptooltip";
5435
+ EnumProperties["RESULTS"] = "_results";
5436
+ })(exports.EnumProperties || (exports.EnumProperties = {}));
5398
5437
 
5399
5438
  var ExportItem = /** @class */ (function () {
5400
5439
  function ExportItem(init) {
@@ -10355,6 +10394,10 @@
10355
10394
  this._crudService = injector.get(CrudService);
10356
10395
  this._commonService = injector.get(CommonService);
10357
10396
  this._datePipe = injector.get(i3.DatePipe);
10397
+ var root = this._appContext.getRootContext();
10398
+ if (!root) {
10399
+ this._appContext.addRootContext(this._componentContext, this._activatedRoute);
10400
+ }
10358
10401
  this._componentContext = this._appContext.addComponentContext(this._componentContext, this._activatedRoute, this.getComponentId());
10359
10402
  if (this._componentContext) {
10360
10403
  this.model = this._componentContext.data;
@@ -11178,9 +11221,9 @@
11178
11221
  var FieldWorkflowCodeInCrudForm = '_WorkflowCode';
11179
11222
  var ɵ0$2 = exports.PermissionBase.READ, ɵ1$1 = exports.PermissionBase.EDIT, ɵ2$1 = exports.PermissionBase.DELETE;
11180
11223
  var DataSourcePermissionBase = [
11181
- { id: ɵ0$2, ten: 'Xem' },
11182
- { id: ɵ1$1, ten: 'Sửa' },
11183
- { id: ɵ2$1, ten: 'Xóa' }
11224
+ { id: ɵ0$2, ten: exports.PermissionName.WATCH },
11225
+ { id: ɵ1$1, ten: exports.PermissionName.EDIT },
11226
+ { id: ɵ2$1, ten: exports.PermissionName.DELETE }
11184
11227
  ];
11185
11228
  var ɵ3 = exports.EnumGioiTinh.NAM, ɵ4 = exports.EnumGioiTinh.NU;
11186
11229
  var DataSourceGioiTinh = [
@@ -19100,307 +19143,6 @@
19100
19143
  onDataBinded: [{ type: i0.Output }]
19101
19144
  };
19102
19145
 
19103
- var CauHinhWorkflowService = /** @class */ (function (_super) {
19104
- __extends(CauHinhWorkflowService, _super);
19105
- function CauHinhWorkflowService(http, injector, _moduleConfigService) {
19106
- var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/CauHinhWorkflow") || this;
19107
- _this._moduleConfigService = _moduleConfigService;
19108
- _this.serviceCode = 'congviec';
19109
- _this.entityName = 'CauHinhWorkflow';
19110
- _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
19111
- return _this;
19112
- }
19113
- return CauHinhWorkflowService;
19114
- }(BaseService));
19115
- CauHinhWorkflowService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function CauHinhWorkflowService_Factory() { return new CauHinhWorkflowService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: CauHinhWorkflowService, providedIn: "root" });
19116
- CauHinhWorkflowService.decorators = [
19117
- { type: i0.Injectable, args: [{
19118
- providedIn: 'root'
19119
- },] }
19120
- ];
19121
- CauHinhWorkflowService.ctorParameters = function () { return [
19122
- { type: i1$1.HttpClient },
19123
- { type: i0.Injector },
19124
- { type: ModuleConfigService }
19125
- ]; };
19126
-
19127
- var StateMachinesService = /** @class */ (function (_super) {
19128
- __extends(StateMachinesService, _super);
19129
- function StateMachinesService(http, injector, _moduleConfigService) {
19130
- var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/StateMachines") || this;
19131
- _this._moduleConfigService = _moduleConfigService;
19132
- _this.entityName = 'StateMachines';
19133
- _this.serviceCode = 'workflow';
19134
- _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint;
19135
- return _this;
19136
- }
19137
- StateMachinesService.prototype.changeState = function (itemWorkflowHistory) {
19138
- return this.defaultPost(this.serviceUri + "/ChangeState", itemWorkflowHistory);
19139
- };
19140
- StateMachinesService.prototype.rollback = function (rowData) {
19141
- return this.defaultPost(this.serviceUri + "/Rollback/" + rowData.__workflowCode + "/" + rowData.id, {});
19142
- };
19143
- StateMachinesService.prototype.getUserInProcessForm = function (workflowCode, stateCode, actionCode, itemId) {
19144
- return this.defaultPost(this.serviceUri + "/GetUserInProcessForm/" + workflowCode + "/" + stateCode + "/" + actionCode + "/" + itemId, {});
19145
- };
19146
- return StateMachinesService;
19147
- }(BaseService));
19148
- StateMachinesService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function StateMachinesService_Factory() { return new StateMachinesService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: StateMachinesService, providedIn: "root" });
19149
- StateMachinesService.decorators = [
19150
- { type: i0.Injectable, args: [{
19151
- providedIn: 'root'
19152
- },] }
19153
- ];
19154
- StateMachinesService.ctorParameters = function () { return [
19155
- { type: i1$1.HttpClient },
19156
- { type: i0.Injector },
19157
- { type: ModuleConfigService }
19158
- ]; };
19159
-
19160
- var DmLoaiCongViecService = /** @class */ (function (_super) {
19161
- __extends(DmLoaiCongViecService, _super);
19162
- function DmLoaiCongViecService(http, injector, _moduleConfigService) {
19163
- var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/DM_LoaiCongViec") || this;
19164
- _this._moduleConfigService = _moduleConfigService;
19165
- _this.serviceCode = 'congviec';
19166
- _this.entityName = 'DM_LoaiCongViec';
19167
- _this.dicLoaiCongViec = {};
19168
- _this.keyIdLoaiCongViecRoot = 'root';
19169
- _this.getWorkflowSettingByIdLoaiCongViec = function (idLoaiCongViec) { return __awaiter(_this, void 0, void 0, function () {
19170
- var result, idLoaiCongViecs, i;
19171
- return __generator(this, function (_a) {
19172
- switch (_a.label) {
19173
- case 0:
19174
- if (!!this.dicWorkflowByLoaiCongViec) return [3 /*break*/, 2];
19175
- return [4 /*yield*/, this.getDatasourceWorkflowCongViec()];
19176
- case 1:
19177
- _a.sent();
19178
- _a.label = 2;
19179
- case 2:
19180
- if (!idLoaiCongViec) {
19181
- return [2 /*return*/, this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot]];
19182
- }
19183
- result = this.dicWorkflowByLoaiCongViec[idLoaiCongViec];
19184
- if (result)
19185
- return [2 /*return*/, result];
19186
- return [4 /*yield*/, this.getIdLoaiCongViecs(idLoaiCongViec)];
19187
- case 3:
19188
- idLoaiCongViecs = _a.sent();
19189
- if (!Array.isArray(idLoaiCongViecs))
19190
- return [2 /*return*/, null];
19191
- if (idLoaiCongViecs.length > 1) {
19192
- for (i = idLoaiCongViecs.length - 2; i >= 0; i--) {
19193
- result = this.dicWorkflowByLoaiCongViec[idLoaiCongViecs[i]];
19194
- if (result)
19195
- return [2 /*return*/, result];
19196
- }
19197
- }
19198
- if (!result) {
19199
- result = this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot];
19200
- }
19201
- return [2 /*return*/, result];
19202
- }
19203
- });
19204
- }); };
19205
- _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
19206
- return _this;
19207
- }
19208
- DmLoaiCongViecService.prototype.getDatasourceWorkflowCongViec = function () {
19209
- return __awaiter(this, void 0, void 0, function () {
19210
- var cauHinhWorkflowService, cauHinhWorkflows, notifierService, workflowCodes, stateMachinesService, workflows;
19211
- var _this = this;
19212
- return __generator(this, function (_a) {
19213
- switch (_a.label) {
19214
- case 0:
19215
- if (!this.dicWorkflowByLoaiCongViec) {
19216
- this.dicWorkflowByLoaiCongViec = {};
19217
- }
19218
- cauHinhWorkflowService = this._injector.get(CauHinhWorkflowService);
19219
- return [4 /*yield*/, cauHinhWorkflowService.getAll([], 'idLoaiCongViec,workflowCodes,workflowCode')];
19220
- case 1:
19221
- cauHinhWorkflows = (_a.sent()).data;
19222
- notifierService = this._injector.get(NotifierService);
19223
- if (cauHinhWorkflows == null) {
19224
- notifierService.showWarning('Dịch vụ workflow không phản hồi');
19225
- return [2 /*return*/, []];
19226
- }
19227
- workflowCodes = [];
19228
- cauHinhWorkflows.forEach(function (itemWorkflowSetting) {
19229
- if (itemWorkflowSetting.workflowCodes && !Array.isArray(itemWorkflowSetting.workflowCodes)) {
19230
- itemWorkflowSetting.workflowCodes = itemWorkflowSetting.workflowCodes.split(',');
19231
- }
19232
- else {
19233
- itemWorkflowSetting.workflowCodes = [];
19234
- }
19235
- itemWorkflowSetting.workflowCodes.forEach(function (workflowCode) {
19236
- if (workflowCodes.indexOf(workflowCode) == -1) {
19237
- workflowCodes.push(workflowCode);
19238
- }
19239
- });
19240
- });
19241
- stateMachinesService = this._injector.get(StateMachinesService);
19242
- return [4 /*yield*/, stateMachinesService.getDataDropdownByFilter([
19243
- this.newFilter('code', exports.Operator.in, workflowCodes)
19244
- ], new DropdownOptions({
19245
- valueField: 'code',
19246
- displayField: 'title',
19247
- fieldPlus: 'data'
19248
- }))];
19249
- case 2:
19250
- workflows = (_a.sent());
19251
- workflows.forEach(function (item) {
19252
- item.data = JSON.parse(item.data);
19253
- var stateMachineData = item.data;
19254
- stateMachineData.actions = {};
19255
- stateMachineData.machines.forEach(function (machine) {
19256
- stateMachineData.actions[machine.code] = [];
19257
- stateMachineData.connections.forEach(function (conn) {
19258
- if (conn.source == machine.id) {
19259
- stateMachineData.actions[machine.code].push(conn);
19260
- }
19261
- });
19262
- });
19263
- });
19264
- cauHinhWorkflows.forEach(function (itemWorkflowSetting) {
19265
- itemWorkflowSetting.workflows = workflows.filter(function (q) { return itemWorkflowSetting.workflowCodes.indexOf(q.code) > -1; });
19266
- if (!itemWorkflowSetting.idLoaiCongViec) {
19267
- _this.dicWorkflowByLoaiCongViec[_this.keyIdLoaiCongViecRoot] = itemWorkflowSetting;
19268
- }
19269
- else {
19270
- _this.dicWorkflowByLoaiCongViec[itemWorkflowSetting.idLoaiCongViec] = itemWorkflowSetting;
19271
- }
19272
- });
19273
- return [2 /*return*/, workflows];
19274
- }
19275
- });
19276
- });
19277
- };
19278
- DmLoaiCongViecService.prototype.getIdLoaiCongViecs = function (idLoaiCongViec) {
19279
- return __awaiter(this, void 0, void 0, function () {
19280
- var notifierService, itemLoaiCongViec, idLoaiCongViecs;
19281
- return __generator(this, function (_a) {
19282
- switch (_a.label) {
19283
- case 0:
19284
- notifierService = this._injector.get(NotifierService);
19285
- return [4 /*yield*/, this.getItemLoaiCongViec(idLoaiCongViec)];
19286
- case 1:
19287
- itemLoaiCongViec = _a.sent();
19288
- if (itemLoaiCongViec == null) {
19289
- notifierService.showWarning('Loại công việc không tồn tại');
19290
- return [2 /*return*/, null];
19291
- }
19292
- idLoaiCongViecs = itemLoaiCongViec.idDuongDan.split(';').filter(function (q) { return !!q; });
19293
- return [2 /*return*/, idLoaiCongViecs];
19294
- }
19295
- });
19296
- });
19297
- };
19298
- DmLoaiCongViecService.prototype.getItemLoaiCongViec = function (idLoaiCongViec) {
19299
- return __awaiter(this, void 0, void 0, function () {
19300
- var _a, _b;
19301
- return __generator(this, function (_c) {
19302
- switch (_c.label) {
19303
- case 0:
19304
- if (!!this.dicLoaiCongViec[idLoaiCongViec]) return [3 /*break*/, 2];
19305
- _a = this.dicLoaiCongViec;
19306
- _b = idLoaiCongViec;
19307
- return [4 /*yield*/, this.getDetail(idLoaiCongViec)];
19308
- case 1:
19309
- _a[_b] = (_c.sent()).data;
19310
- _c.label = 2;
19311
- case 2: return [2 /*return*/, this.dicLoaiCongViec[idLoaiCongViec]];
19312
- }
19313
- });
19314
- });
19315
- };
19316
- return DmLoaiCongViecService;
19317
- }(BaseService));
19318
- DmLoaiCongViecService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function DmLoaiCongViecService_Factory() { return new DmLoaiCongViecService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: DmLoaiCongViecService, providedIn: "root" });
19319
- DmLoaiCongViecService.decorators = [
19320
- { type: i0.Injectable, args: [{
19321
- providedIn: 'root'
19322
- },] }
19323
- ];
19324
- DmLoaiCongViecService.ctorParameters = function () { return [
19325
- { type: i1$1.HttpClient },
19326
- { type: i0.Injector },
19327
- { type: ModuleConfigService }
19328
- ]; };
19329
-
19330
- var CongViecService = /** @class */ (function (_super) {
19331
- __extends(CongViecService, _super);
19332
- function CongViecService(http, injector, _moduleConfigService, _dmLoaiCongViecService) {
19333
- var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/vanbanden") || this;
19334
- _this._dmLoaiCongViecService = _dmLoaiCongViecService;
19335
- _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint;
19336
- _this._moduleConfig = _moduleConfigService.getConfig();
19337
- return _this;
19338
- }
19339
- CongViecService.prototype.adjustSettingWorkflowForCrudList = function (setting) {
19340
- this.useWorkflow = true;
19341
- setting.isWorkflowTree = true;
19342
- setting.baseService = this;
19343
- setting.displayField = function (item) { return item.ten; };
19344
- setting.baseService.useWorkflow = true;
19345
- setting.workflowConfigAdvance = {
19346
- getWorkflowSetting: this.getWorkflowConfig.bind(this)
19347
- };
19348
- };
19349
- CongViecService.prototype.getWorkflowConfig = function (rowData) {
19350
- return __awaiter(this, void 0, void 0, function () {
19351
- return __generator(this, function (_a) {
19352
- switch (_a.label) {
19353
- case 0: return [4 /*yield*/, this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(rowData.idLoaiCongViec)];
19354
- case 1: return [2 /*return*/, _a.sent()];
19355
- }
19356
- });
19357
- });
19358
- };
19359
- CongViecService.prototype.countByMenuState = function (data) {
19360
- return this.defaultPost(this.serviceUri + "/CountByMenuState", data);
19361
- };
19362
- CongViecService.prototype.getDicIdByMenuState = function (data, tuNgay, denNgay) {
19363
- return this.defaultPost(this.serviceUri + "/GetDicIdByMenuState", {
19364
- lstTrangThai: data,
19365
- tuNgay: tuNgay,
19366
- denNgay: denNgay
19367
- });
19368
- };
19369
- CongViecService.prototype.updateBulkIdCha = function (model) {
19370
- var url = this.serviceUri + "/UpdateBulkIdCha";
19371
- return this.defaultPost(url, model);
19372
- };
19373
- CongViecService.prototype.deleteBulkCongViecCon = function (ids) {
19374
- var url = this.serviceUri + "/DeleteBulkCongViecCon";
19375
- return this.defaultPost(url, ids);
19376
- };
19377
- CongViecService.prototype.getDataDashboardCaNhan = function (inputData) {
19378
- var url = this.serviceUri + "/GetDataDashboardCaNhan";
19379
- return this.defaultPost(url, inputData);
19380
- };
19381
- CongViecService.prototype.getDataDashboardByDonVi = function (inputData) {
19382
- var url = this.serviceUri + "/GetDataDashboardByDonVi";
19383
- return this.defaultPost(url, inputData);
19384
- };
19385
- CongViecService.prototype.getListTasksDashboard = function (dataFilter) {
19386
- var url = this.serviceUri + "/getListTasksDashboard";
19387
- return this.defaultPost(url, dataFilter);
19388
- };
19389
- return CongViecService;
19390
- }(BaseService));
19391
- CongViecService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function CongViecService_Factory() { return new CongViecService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService), i0__namespace.ɵɵinject(DmLoaiCongViecService)); }, token: CongViecService, providedIn: "root" });
19392
- CongViecService.decorators = [
19393
- { type: i0.Injectable, args: [{
19394
- providedIn: 'root'
19395
- },] }
19396
- ];
19397
- CongViecService.ctorParameters = function () { return [
19398
- { type: i1$1.HttpClient },
19399
- { type: i0.Injector },
19400
- { type: ModuleConfigService },
19401
- { type: DmLoaiCongViecService }
19402
- ]; };
19403
-
19404
19146
  var SearchInfo = /** @class */ (function () {
19405
19147
  function SearchInfo(init) {
19406
19148
  this.fieldSearchText = [];
@@ -21213,6 +20955,307 @@
21213
20955
  { type: CrudService }
21214
20956
  ]; };
21215
20957
 
20958
+ var StateMachinesService = /** @class */ (function (_super) {
20959
+ __extends(StateMachinesService, _super);
20960
+ function StateMachinesService(http, injector, _moduleConfigService) {
20961
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/StateMachines") || this;
20962
+ _this._moduleConfigService = _moduleConfigService;
20963
+ _this.entityName = 'StateMachines';
20964
+ _this.serviceCode = 'workflow';
20965
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint;
20966
+ return _this;
20967
+ }
20968
+ StateMachinesService.prototype.changeState = function (itemWorkflowHistory) {
20969
+ return this.defaultPost(this.serviceUri + "/ChangeState", itemWorkflowHistory);
20970
+ };
20971
+ StateMachinesService.prototype.rollback = function (rowData) {
20972
+ return this.defaultPost(this.serviceUri + "/Rollback/" + rowData.__workflowCode + "/" + rowData.id, {});
20973
+ };
20974
+ StateMachinesService.prototype.getUserInProcessForm = function (workflowCode, stateCode, actionCode, itemId) {
20975
+ return this.defaultPost(this.serviceUri + "/GetUserInProcessForm/" + workflowCode + "/" + stateCode + "/" + actionCode + "/" + itemId, {});
20976
+ };
20977
+ return StateMachinesService;
20978
+ }(BaseService));
20979
+ StateMachinesService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function StateMachinesService_Factory() { return new StateMachinesService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: StateMachinesService, providedIn: "root" });
20980
+ StateMachinesService.decorators = [
20981
+ { type: i0.Injectable, args: [{
20982
+ providedIn: 'root'
20983
+ },] }
20984
+ ];
20985
+ StateMachinesService.ctorParameters = function () { return [
20986
+ { type: i1$1.HttpClient },
20987
+ { type: i0.Injector },
20988
+ { type: ModuleConfigService }
20989
+ ]; };
20990
+
20991
+ var CauHinhWorkflowService = /** @class */ (function (_super) {
20992
+ __extends(CauHinhWorkflowService, _super);
20993
+ function CauHinhWorkflowService(http, injector, _moduleConfigService) {
20994
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/CauHinhWorkflow") || this;
20995
+ _this._moduleConfigService = _moduleConfigService;
20996
+ _this.serviceCode = 'congviec';
20997
+ _this.entityName = 'CauHinhWorkflow';
20998
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
20999
+ return _this;
21000
+ }
21001
+ return CauHinhWorkflowService;
21002
+ }(BaseService));
21003
+ CauHinhWorkflowService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function CauHinhWorkflowService_Factory() { return new CauHinhWorkflowService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: CauHinhWorkflowService, providedIn: "root" });
21004
+ CauHinhWorkflowService.decorators = [
21005
+ { type: i0.Injectable, args: [{
21006
+ providedIn: 'root'
21007
+ },] }
21008
+ ];
21009
+ CauHinhWorkflowService.ctorParameters = function () { return [
21010
+ { type: i1$1.HttpClient },
21011
+ { type: i0.Injector },
21012
+ { type: ModuleConfigService }
21013
+ ]; };
21014
+
21015
+ var DmLoaiCongViecService = /** @class */ (function (_super) {
21016
+ __extends(DmLoaiCongViecService, _super);
21017
+ function DmLoaiCongViecService(http, injector, _moduleConfigService) {
21018
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/DM_LoaiCongViec") || this;
21019
+ _this._moduleConfigService = _moduleConfigService;
21020
+ _this.serviceCode = 'congviec';
21021
+ _this.entityName = 'DM_LoaiCongViec';
21022
+ _this.dicLoaiCongViec = {};
21023
+ _this.keyIdLoaiCongViecRoot = 'root';
21024
+ _this.getWorkflowSettingByIdLoaiCongViec = function (idLoaiCongViec) { return __awaiter(_this, void 0, void 0, function () {
21025
+ var result, idLoaiCongViecs, i;
21026
+ return __generator(this, function (_a) {
21027
+ switch (_a.label) {
21028
+ case 0:
21029
+ if (!!this.dicWorkflowByLoaiCongViec) return [3 /*break*/, 2];
21030
+ return [4 /*yield*/, this.getDatasourceWorkflowCongViec()];
21031
+ case 1:
21032
+ _a.sent();
21033
+ _a.label = 2;
21034
+ case 2:
21035
+ if (!idLoaiCongViec) {
21036
+ return [2 /*return*/, this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot]];
21037
+ }
21038
+ result = this.dicWorkflowByLoaiCongViec[idLoaiCongViec];
21039
+ if (result)
21040
+ return [2 /*return*/, result];
21041
+ return [4 /*yield*/, this.getIdLoaiCongViecs(idLoaiCongViec)];
21042
+ case 3:
21043
+ idLoaiCongViecs = _a.sent();
21044
+ if (!Array.isArray(idLoaiCongViecs))
21045
+ return [2 /*return*/, null];
21046
+ if (idLoaiCongViecs.length > 1) {
21047
+ for (i = idLoaiCongViecs.length - 2; i >= 0; i--) {
21048
+ result = this.dicWorkflowByLoaiCongViec[idLoaiCongViecs[i]];
21049
+ if (result)
21050
+ return [2 /*return*/, result];
21051
+ }
21052
+ }
21053
+ if (!result) {
21054
+ result = this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot];
21055
+ }
21056
+ return [2 /*return*/, result];
21057
+ }
21058
+ });
21059
+ }); };
21060
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
21061
+ return _this;
21062
+ }
21063
+ DmLoaiCongViecService.prototype.getDatasourceWorkflowCongViec = function () {
21064
+ return __awaiter(this, void 0, void 0, function () {
21065
+ var cauHinhWorkflowService, cauHinhWorkflows, notifierService, workflowCodes, stateMachinesService, workflows;
21066
+ var _this = this;
21067
+ return __generator(this, function (_a) {
21068
+ switch (_a.label) {
21069
+ case 0:
21070
+ if (!this.dicWorkflowByLoaiCongViec) {
21071
+ this.dicWorkflowByLoaiCongViec = {};
21072
+ }
21073
+ cauHinhWorkflowService = this._injector.get(CauHinhWorkflowService);
21074
+ return [4 /*yield*/, cauHinhWorkflowService.getAll([], 'idLoaiCongViec,workflowCodes,workflowCode')];
21075
+ case 1:
21076
+ cauHinhWorkflows = (_a.sent()).data;
21077
+ notifierService = this._injector.get(NotifierService);
21078
+ if (cauHinhWorkflows == null) {
21079
+ notifierService.showWarning('Dịch vụ workflow không phản hồi');
21080
+ return [2 /*return*/, []];
21081
+ }
21082
+ workflowCodes = [];
21083
+ cauHinhWorkflows.forEach(function (itemWorkflowSetting) {
21084
+ if (itemWorkflowSetting.workflowCodes && !Array.isArray(itemWorkflowSetting.workflowCodes)) {
21085
+ itemWorkflowSetting.workflowCodes = itemWorkflowSetting.workflowCodes.split(',');
21086
+ }
21087
+ else {
21088
+ itemWorkflowSetting.workflowCodes = [];
21089
+ }
21090
+ itemWorkflowSetting.workflowCodes.forEach(function (workflowCode) {
21091
+ if (workflowCodes.indexOf(workflowCode) == -1) {
21092
+ workflowCodes.push(workflowCode);
21093
+ }
21094
+ });
21095
+ });
21096
+ stateMachinesService = this._injector.get(StateMachinesService);
21097
+ return [4 /*yield*/, stateMachinesService.getDataDropdownByFilter([
21098
+ this.newFilter('code', exports.Operator.in, workflowCodes)
21099
+ ], new DropdownOptions({
21100
+ valueField: 'code',
21101
+ displayField: 'title',
21102
+ fieldPlus: 'data'
21103
+ }))];
21104
+ case 2:
21105
+ workflows = (_a.sent());
21106
+ workflows.forEach(function (item) {
21107
+ item.data = JSON.parse(item.data);
21108
+ var stateMachineData = item.data;
21109
+ stateMachineData.actions = {};
21110
+ stateMachineData.machines.forEach(function (machine) {
21111
+ stateMachineData.actions[machine.code] = [];
21112
+ stateMachineData.connections.forEach(function (conn) {
21113
+ if (conn.source == machine.id) {
21114
+ stateMachineData.actions[machine.code].push(conn);
21115
+ }
21116
+ });
21117
+ });
21118
+ });
21119
+ cauHinhWorkflows.forEach(function (itemWorkflowSetting) {
21120
+ itemWorkflowSetting.workflows = workflows.filter(function (q) { return itemWorkflowSetting.workflowCodes.indexOf(q.code) > -1; });
21121
+ if (!itemWorkflowSetting.idLoaiCongViec) {
21122
+ _this.dicWorkflowByLoaiCongViec[_this.keyIdLoaiCongViecRoot] = itemWorkflowSetting;
21123
+ }
21124
+ else {
21125
+ _this.dicWorkflowByLoaiCongViec[itemWorkflowSetting.idLoaiCongViec] = itemWorkflowSetting;
21126
+ }
21127
+ });
21128
+ return [2 /*return*/, workflows];
21129
+ }
21130
+ });
21131
+ });
21132
+ };
21133
+ DmLoaiCongViecService.prototype.getIdLoaiCongViecs = function (idLoaiCongViec) {
21134
+ return __awaiter(this, void 0, void 0, function () {
21135
+ var notifierService, itemLoaiCongViec, idLoaiCongViecs;
21136
+ return __generator(this, function (_a) {
21137
+ switch (_a.label) {
21138
+ case 0:
21139
+ notifierService = this._injector.get(NotifierService);
21140
+ return [4 /*yield*/, this.getItemLoaiCongViec(idLoaiCongViec)];
21141
+ case 1:
21142
+ itemLoaiCongViec = _a.sent();
21143
+ if (itemLoaiCongViec == null) {
21144
+ notifierService.showWarning('Loại công việc không tồn tại');
21145
+ return [2 /*return*/, null];
21146
+ }
21147
+ idLoaiCongViecs = itemLoaiCongViec.idDuongDan.split(';').filter(function (q) { return !!q; });
21148
+ return [2 /*return*/, idLoaiCongViecs];
21149
+ }
21150
+ });
21151
+ });
21152
+ };
21153
+ DmLoaiCongViecService.prototype.getItemLoaiCongViec = function (idLoaiCongViec) {
21154
+ return __awaiter(this, void 0, void 0, function () {
21155
+ var _a, _b;
21156
+ return __generator(this, function (_c) {
21157
+ switch (_c.label) {
21158
+ case 0:
21159
+ if (!!this.dicLoaiCongViec[idLoaiCongViec]) return [3 /*break*/, 2];
21160
+ _a = this.dicLoaiCongViec;
21161
+ _b = idLoaiCongViec;
21162
+ return [4 /*yield*/, this.getDetail(idLoaiCongViec)];
21163
+ case 1:
21164
+ _a[_b] = (_c.sent()).data;
21165
+ _c.label = 2;
21166
+ case 2: return [2 /*return*/, this.dicLoaiCongViec[idLoaiCongViec]];
21167
+ }
21168
+ });
21169
+ });
21170
+ };
21171
+ return DmLoaiCongViecService;
21172
+ }(BaseService));
21173
+ DmLoaiCongViecService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function DmLoaiCongViecService_Factory() { return new DmLoaiCongViecService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: DmLoaiCongViecService, providedIn: "root" });
21174
+ DmLoaiCongViecService.decorators = [
21175
+ { type: i0.Injectable, args: [{
21176
+ providedIn: 'root'
21177
+ },] }
21178
+ ];
21179
+ DmLoaiCongViecService.ctorParameters = function () { return [
21180
+ { type: i1$1.HttpClient },
21181
+ { type: i0.Injector },
21182
+ { type: ModuleConfigService }
21183
+ ]; };
21184
+
21185
+ var CongViecService = /** @class */ (function (_super) {
21186
+ __extends(CongViecService, _super);
21187
+ function CongViecService(http, injector, _moduleConfigService, _dmLoaiCongViecService) {
21188
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/vanbanden") || this;
21189
+ _this._dmLoaiCongViecService = _dmLoaiCongViecService;
21190
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint;
21191
+ _this._moduleConfig = _moduleConfigService.getConfig();
21192
+ return _this;
21193
+ }
21194
+ CongViecService.prototype.adjustSettingWorkflowForCrudList = function (setting) {
21195
+ this.useWorkflow = true;
21196
+ setting.isWorkflowTree = true;
21197
+ setting.baseService = this;
21198
+ setting.displayField = function (item) { return item.ten; };
21199
+ setting.baseService.useWorkflow = true;
21200
+ setting.workflowConfigAdvance = {
21201
+ getWorkflowSetting: this.getWorkflowConfig.bind(this)
21202
+ };
21203
+ };
21204
+ CongViecService.prototype.getWorkflowConfig = function (rowData) {
21205
+ return __awaiter(this, void 0, void 0, function () {
21206
+ return __generator(this, function (_a) {
21207
+ switch (_a.label) {
21208
+ case 0: return [4 /*yield*/, this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(rowData.idLoaiCongViec)];
21209
+ case 1: return [2 /*return*/, _a.sent()];
21210
+ }
21211
+ });
21212
+ });
21213
+ };
21214
+ CongViecService.prototype.countByMenuState = function (data) {
21215
+ return this.defaultPost(this.serviceUri + "/CountByMenuState", data);
21216
+ };
21217
+ CongViecService.prototype.getDicIdByMenuState = function (data, tuNgay, denNgay) {
21218
+ return this.defaultPost(this.serviceUri + "/GetDicIdByMenuState", {
21219
+ lstTrangThai: data,
21220
+ tuNgay: tuNgay,
21221
+ denNgay: denNgay
21222
+ });
21223
+ };
21224
+ CongViecService.prototype.updateBulkIdCha = function (model) {
21225
+ var url = this.serviceUri + "/UpdateBulkIdCha";
21226
+ return this.defaultPost(url, model);
21227
+ };
21228
+ CongViecService.prototype.deleteBulkCongViecCon = function (ids) {
21229
+ var url = this.serviceUri + "/DeleteBulkCongViecCon";
21230
+ return this.defaultPost(url, ids);
21231
+ };
21232
+ CongViecService.prototype.getDataDashboardCaNhan = function (inputData) {
21233
+ var url = this.serviceUri + "/GetDataDashboardCaNhan";
21234
+ return this.defaultPost(url, inputData);
21235
+ };
21236
+ CongViecService.prototype.getDataDashboardByDonVi = function (inputData) {
21237
+ var url = this.serviceUri + "/GetDataDashboardByDonVi";
21238
+ return this.defaultPost(url, inputData);
21239
+ };
21240
+ CongViecService.prototype.getListTasksDashboard = function (dataFilter) {
21241
+ var url = this.serviceUri + "/getListTasksDashboard";
21242
+ return this.defaultPost(url, dataFilter);
21243
+ };
21244
+ return CongViecService;
21245
+ }(BaseService));
21246
+ CongViecService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function CongViecService_Factory() { return new CongViecService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService), i0__namespace.ɵɵinject(DmLoaiCongViecService)); }, token: CongViecService, providedIn: "root" });
21247
+ CongViecService.decorators = [
21248
+ { type: i0.Injectable, args: [{
21249
+ providedIn: 'root'
21250
+ },] }
21251
+ ];
21252
+ CongViecService.ctorParameters = function () { return [
21253
+ { type: i1$1.HttpClient },
21254
+ { type: i0.Injector },
21255
+ { type: ModuleConfigService },
21256
+ { type: DmLoaiCongViecService }
21257
+ ]; };
21258
+
21216
21259
  var EntityWorkflowHistoryService = /** @class */ (function (_super) {
21217
21260
  __extends(EntityWorkflowHistoryService, _super);
21218
21261
  function EntityWorkflowHistoryService(http, injector, _moduleConfigService) {
@@ -21490,6 +21533,30 @@
21490
21533
  { type: ModuleConfigService }
21491
21534
  ]; };
21492
21535
 
21536
+ var BasePermissionService = /** @class */ (function (_super) {
21537
+ __extends(BasePermissionService, _super);
21538
+ function BasePermissionService(http, injector, _moduleConfigService) {
21539
+ var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/BasePermission") || this;
21540
+ _this._moduleConfigService = _moduleConfigService;
21541
+ _this.entityName = 'BasePermission';
21542
+ _this.serviceCode = 'Authorization';
21543
+ _this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
21544
+ return _this;
21545
+ }
21546
+ return BasePermissionService;
21547
+ }(BaseService));
21548
+ BasePermissionService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function BasePermissionService_Factory() { return new BasePermissionService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: BasePermissionService, providedIn: "root" });
21549
+ BasePermissionService.decorators = [
21550
+ { type: i0.Injectable, args: [{
21551
+ providedIn: 'root'
21552
+ },] }
21553
+ ];
21554
+ BasePermissionService.ctorParameters = function () { return [
21555
+ { type: i1$1.HttpClient },
21556
+ { type: i0.Injector },
21557
+ { type: ModuleConfigService }
21558
+ ]; };
21559
+
21493
21560
  var ListComponentBase = /** @class */ (function (_super) {
21494
21561
  __extends(ListComponentBase, _super);
21495
21562
  function ListComponentBase(_injector, _isTreeTable) {
@@ -21581,8 +21648,8 @@
21581
21648
  _this.showingActionWorkflow = false;
21582
21649
  _this.buttonContexts = [];
21583
21650
  _this.authorizePaths = {};
21584
- _this.buttonApplyAuthorize = {};
21585
21651
  _this.commonConst = ComCtxConstants.COMMON;
21652
+ _this.buttonApplyAuthorize = {};
21586
21653
  _this._defaultTableClass = 'new-table scr-table crud-list-table';
21587
21654
  _this._tableClass = '';
21588
21655
  _this._showSettingsRowColor = false;
@@ -21613,11 +21680,19 @@
21613
21680
  _this.filter_column = [];
21614
21681
  _this.dataAdvance = {};
21615
21682
  _this.searchModel = {};
21683
+ _this.authorizeButtonKey = '';
21684
+ _this.lstButtonPermission = [];
21685
+ _this.lstButtonTemplate = [];
21686
+ _this.isBtnReady = false;
21687
+ _this.isSuperUser = false;
21616
21688
  _this.showFormWorkflow = false;
21617
21689
  _this.headerWorkflow = '';
21690
+ _this.lstBtnAuthorizeMenu = [];
21618
21691
  _this.popupSizeWorkflow = new PopupSize({ width: 950, height: 540 });
21619
21692
  _this.showHistoryWorkflow = false;
21693
+ _this.showAllButtons = false;
21620
21694
  _this.hiddenBtnFunction = false;
21695
+ _this.lstButtonAction = [];
21621
21696
  // Biến để kiểm tra lần click đầu tiên của user vào dòng trên grid
21622
21697
  // Sử dụng để fix bug set selected row từ form cha, nhưng vào form con ấn sang row khác nó k bỏ selected row đã set từ bên ngoài
21623
21698
  _this.firstRowClick = true;
@@ -21651,6 +21726,11 @@
21651
21726
  _this.detailTaskModel = new DialogModel({
21652
21727
  header: 'Chi tiết công việc'
21653
21728
  });
21729
+ _this.buttonAuthorizeModel = new DialogModel({
21730
+ header: 'Phân quyền nút chức năng',
21731
+ popupSize: new PopupSize({ width: 1000, height: 700 }),
21732
+ data: { dataSouce: [] }
21733
+ });
21654
21734
  _this.shareLinkModel = new DialogModel({
21655
21735
  header: 'Chia sẻ quyền',
21656
21736
  popupSize: new PopupSize({ width: 650, height: 310 })
@@ -21660,7 +21740,6 @@
21660
21740
  });
21661
21741
  _this.BUTTON_PHAN_QUYEN = ButtonPermission.BUTTON_PHAN_QUYEN;
21662
21742
  _this.BUTTON_CAU_HINH_QUY_TRINH = ButtonPermission.BUTTON_CAU_HINH_QUY_TRINH;
21663
- _this.lstButtonPermission = [];
21664
21743
  _this.buttonPermissionMap = new Map();
21665
21744
  _this.sourceIcon = {};
21666
21745
  _this.stopCalculatingFunctionColumnWidth = false;
@@ -21906,6 +21985,7 @@
21906
21985
  _this._templateInstanceService = _this._injector.get(TemplateInstanceService);
21907
21986
  _this._printService = _this._injector.get(PrintService);
21908
21987
  _this._federationService = _this._injector.get(FederationService);
21988
+ _this._basePermissionService = _this._injector.get(BasePermissionService);
21909
21989
  _this.handleCheckAll = _this.handleCheckAll.bind(_this);
21910
21990
  _this.handleCheckAll_Group = _this.handleCheckAll_Group.bind(_this);
21911
21991
  _this.environment = _this._moduleConfigService.getConfig().environment;
@@ -21981,7 +22061,7 @@
21981
22061
  configurable: true
21982
22062
  });
21983
22063
  ListComponentBase.prototype.ngOnInit = function () {
21984
- var e_1, _b;
22064
+ var e_1, _f;
21985
22065
  var _this = this;
21986
22066
  this.subscribe(ComCtxConstants.COMMON.ENTITY_METADATA_RELOADED, function (service) {
21987
22067
  _this.entityMetadataService = service;
@@ -22004,7 +22084,7 @@
22004
22084
  }
22005
22085
  if (!this.setting.hiddenTrinhKy || !this.setting.disableShare) {
22006
22086
  if (!this.menuButtons) {
22007
- this.menuButtons = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_b) {
22087
+ this.menuButtons = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_f) {
22008
22088
  return [2 /*return*/, []];
22009
22089
  }); }); };
22010
22090
  }
@@ -22031,11 +22111,12 @@
22031
22111
  var temp = userService.getCurrentUser();
22032
22112
  if (temp != null) {
22033
22113
  this.currentUser = new TnUser(userService.getCurrentUser());
22114
+ this.isSuperUser = this.currentUser.issuperuser.toLowerCase() === 'true';
22034
22115
  }
22035
22116
  if (this.currentUser == null) {
22036
22117
  try {
22037
- for (var _c = __values(this.lstButtonPermission), _d = _c.next(); !_d.done; _d = _c.next()) {
22038
- var buttonPermissionCode = _d.value;
22118
+ for (var _g = __values(this.lstButtonPermission), _h = _g.next(); !_h.done; _h = _g.next()) {
22119
+ var buttonPermissionCode = _h.value;
22039
22120
  var buttonPermission = (this.setting.baseService.serviceCode + "/" + this.setting.baseService.entityName + "/" + buttonPermissionCode).toUpperCase();
22040
22121
  this.buttonPermissionMap.set(buttonPermission, false);
22041
22122
  }
@@ -22043,7 +22124,7 @@
22043
22124
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
22044
22125
  finally {
22045
22126
  try {
22046
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
22127
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
22047
22128
  }
22048
22129
  finally { if (e_1) throw e_1.error; }
22049
22130
  }
@@ -22054,13 +22135,13 @@
22054
22135
  && (this._moduleConfigService.getConfig().environment.ignoreAdmin === true
22055
22136
  || this.currentUser.isadmin.toLowerCase() !== 'true')) {
22056
22137
  this._permissionService.getServicePermission(this.setting.baseService.serviceCode).then(function (result) {
22057
- var e_2, _b;
22138
+ var e_2, _f;
22058
22139
  var _a;
22059
22140
  var lstBasePermission = result;
22060
22141
  _this.lstButtonPermission = (_a = _this._moduleConfigService.getConfig().environment.buttonPermissions) !== null && _a !== void 0 ? _a : [];
22061
22142
  try {
22062
- for (var _c = __values(_this.lstButtonPermission), _d = _c.next(); !_d.done; _d = _c.next()) {
22063
- var buttonPermissionCode = _d.value;
22143
+ for (var _g = __values(_this.lstButtonPermission), _h = _g.next(); !_h.done; _h = _g.next()) {
22144
+ var buttonPermissionCode = _h.value;
22064
22145
  var buttonPermission = (_this.setting.baseService.serviceCode + "/" + _this.setting.baseService.entityName + "/" + buttonPermissionCode).toUpperCase();
22065
22146
  _this.buttonPermissionMap.set(buttonPermission, lstBasePermission.includes(buttonPermission));
22066
22147
  }
@@ -22068,7 +22149,7 @@
22068
22149
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
22069
22150
  finally {
22070
22151
  try {
22071
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
22152
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
22072
22153
  }
22073
22154
  finally { if (e_2) throw e_2.error; }
22074
22155
  }
@@ -22136,7 +22217,7 @@
22136
22217
  this.buildFilterColumn(this.setting.cols);
22137
22218
  };
22138
22219
  ListComponentBase.prototype.extendColumns = function (cols, appendCol) {
22139
- var e_3, _b;
22220
+ var e_3, _f;
22140
22221
  var _this = this;
22141
22222
  if (appendCol === void 0) { appendCol = true; }
22142
22223
  this.setting.fieldNeedGetRef = [];
@@ -22282,7 +22363,7 @@
22282
22363
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
22283
22364
  finally {
22284
22365
  try {
22285
- if (cols_1_1 && !cols_1_1.done && (_b = cols_1.return)) _b.call(cols_1);
22366
+ if (cols_1_1 && !cols_1_1.done && (_f = cols_1.return)) _f.call(cols_1);
22286
22367
  }
22287
22368
  finally { if (e_3) throw e_3.error; }
22288
22369
  }
@@ -22305,7 +22386,7 @@
22305
22386
  });
22306
22387
  };
22307
22388
  ListComponentBase.prototype.formatColumns = function (cols) {
22308
- var e_4, _b;
22389
+ var e_4, _f;
22309
22390
  try {
22310
22391
  for (var cols_2 = __values(cols), cols_2_1 = cols_2.next(); !cols_2_1.done; cols_2_1 = cols_2.next()) {
22311
22392
  var col = cols_2_1.value;
@@ -22321,13 +22402,13 @@
22321
22402
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
22322
22403
  finally {
22323
22404
  try {
22324
- if (cols_2_1 && !cols_2_1.done && (_b = cols_2.return)) _b.call(cols_2);
22405
+ if (cols_2_1 && !cols_2_1.done && (_f = cols_2.return)) _f.call(cols_2);
22325
22406
  }
22326
22407
  finally { if (e_4) throw e_4.error; }
22327
22408
  }
22328
22409
  };
22329
22410
  ListComponentBase.prototype.getColumnSetting = function (colGroup) {
22330
- var e_5, _b;
22411
+ var e_5, _f;
22331
22412
  this.setting.groupColumn = colGroup;
22332
22413
  var dataSetting = localStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.COLUMN_SETTING);
22333
22414
  if (dataSetting) {
@@ -22359,7 +22440,7 @@
22359
22440
  catch (e_5_1) { e_5 = { error: e_5_1 }; }
22360
22441
  finally {
22361
22442
  try {
22362
- if (settings_1_1 && !settings_1_1.done && (_b = settings_1.return)) _b.call(settings_1);
22443
+ if (settings_1_1 && !settings_1_1.done && (_f = settings_1.return)) _f.call(settings_1);
22363
22444
  }
22364
22445
  finally { if (e_5) throw e_5.error; }
22365
22446
  }
@@ -22614,14 +22695,14 @@
22614
22695
  };
22615
22696
  ListComponentBase.prototype.handleSearch = function (data) {
22616
22697
  return __awaiter(this, void 0, void 0, function () {
22617
- return __generator(this, function (_b) {
22618
- switch (_b.label) {
22698
+ return __generator(this, function (_f) {
22699
+ switch (_f.label) {
22619
22700
  case 0:
22620
22701
  this.filter_commonSearch = data.filters;
22621
22702
  this.dataSearchCommon = data.dataForm;
22622
22703
  return [4 /*yield*/, this.onSearched.emit(data)];
22623
22704
  case 1:
22624
- _b.sent();
22705
+ _f.sent();
22625
22706
  this.setting.pageSetting.page = 1;
22626
22707
  this.getData();
22627
22708
  return [2 /*return*/];
@@ -22659,17 +22740,17 @@
22659
22740
  if (isTree === void 0) { isTree = false; }
22660
22741
  return __awaiter(this, void 0, void 0, function () {
22661
22742
  var rs;
22662
- return __generator(this, function (_b) {
22663
- switch (_b.label) {
22743
+ return __generator(this, function (_f) {
22744
+ switch (_f.label) {
22664
22745
  case 0:
22665
22746
  if (!this.setting.showConfirmExport) return [3 /*break*/, 2];
22666
22747
  return [4 /*yield*/, this._notifierService.showConfirm('Bạn có chắc chắn muốn xuất bản ghi đã chọn (Và các bản ghi con tương ứng)', 'Xác nhận xuất file')];
22667
22748
  case 1:
22668
- rs = _b.sent();
22749
+ rs = _f.sent();
22669
22750
  if (!rs) {
22670
22751
  return [2 /*return*/];
22671
22752
  }
22672
- _b.label = 2;
22753
+ _f.label = 2;
22673
22754
  case 2:
22674
22755
  switch (this.setting.exportItemsMode) {
22675
22756
  case exports.ExportItemsMode.FromHtml:
@@ -22690,17 +22771,17 @@
22690
22771
  if (isTree === void 0) { isTree = false; }
22691
22772
  return __awaiter(this, void 0, void 0, function () {
22692
22773
  var rs, header, element, tableEle, headEle, bodyEle, arrHeadEle, arrRowData, strHeadEle, strBodyEle, css, table;
22693
- return __generator(this, function (_b) {
22694
- switch (_b.label) {
22774
+ return __generator(this, function (_f) {
22775
+ switch (_f.label) {
22695
22776
  case 0:
22696
22777
  if (!this.setting.showConfirmExport) return [3 /*break*/, 2];
22697
22778
  return [4 /*yield*/, this._notifierService.showConfirm('Bạn có chắc chắn muốn in bản ghi đã chọn (Và các bản ghi con tương ứng)', 'Xác nhận in file')];
22698
22779
  case 1:
22699
- rs = _b.sent();
22780
+ rs = _f.sent();
22700
22781
  if (!rs) {
22701
22782
  return [2 /*return*/];
22702
22783
  }
22703
- _b.label = 2;
22784
+ _f.label = 2;
22704
22785
  case 2:
22705
22786
  header = 'Danh sách ' + this.setting.objectName;
22706
22787
  element = isTree ? this.treeTable.el.nativeElement : this.table.el.nativeElement;
@@ -22884,25 +22965,25 @@
22884
22965
  };
22885
22966
  ListComponentBase.prototype.showContextMenu = function (evt, rowData) {
22886
22967
  return __awaiter(this, void 0, void 0, function () {
22887
- var _b, _c, shareButtons, showWorkflowAttach;
22888
- var _d;
22889
- return __generator(this, function (_e) {
22890
- switch (_e.label) {
22968
+ var _f, _g, shareButtons, showWorkflowAttach;
22969
+ var _h;
22970
+ return __generator(this, function (_j) {
22971
+ switch (_j.label) {
22891
22972
  case 0:
22892
22973
  this.rowDataCurrent = rowData;
22893
- _b = this;
22894
- _c = this.getMenuButtonAuthorized;
22974
+ _f = this;
22975
+ _g = this.getMenuButtonAuthorized;
22895
22976
  return [4 /*yield*/, this.menuButtons(rowData)];
22896
- case 1: return [4 /*yield*/, _c.apply(this, [_e.sent()])];
22977
+ case 1: return [4 /*yield*/, _g.apply(this, [_j.sent()])];
22897
22978
  case 2:
22898
- _b.buttonContexts = _e.sent();
22979
+ _f.buttonContexts = _j.sent();
22899
22980
  if (!this.setting.disableShare) {
22900
22981
  shareButtons = [
22901
22982
  { label: 'Chia sẻ', icon: 'pi pi-link', command: this.createShareLink.bind(this) },
22902
22983
  { label: 'Danh sách chia sẻ', icon: 'pi pi-list', command: this.showLinkSharing.bind(this) },
22903
22984
  // { label: 'Danh sách nhìn thấy', icon: 'pi pi-list', command: this.showListPermissionByItem.bind(this) }
22904
22985
  ];
22905
- (_d = this.buttonContexts).push.apply(_d, __spreadArray([], __read(shareButtons)));
22986
+ (_h = this.buttonContexts).push.apply(_h, __spreadArray([], __read(shareButtons)));
22906
22987
  }
22907
22988
  showWorkflowAttach = localStorage.getItem('__showWorkflowAttach');
22908
22989
  if (showWorkflowAttach == 'true') {
@@ -22924,20 +23005,22 @@
22924
23005
  ListComponentBase.prototype.getMenuButtonAuthorized = function (menuButtons) {
22925
23006
  return __awaiter(this, void 0, void 0, function () {
22926
23007
  var authorizedButtons, serviceCodeByBase, promises, _loop_3, this_2, menuButtons_1, menuButtons_1_1, item;
22927
- var e_6, _b;
22928
- return __generator(this, function (_c) {
22929
- switch (_c.label) {
23008
+ var e_6, _f;
23009
+ return __generator(this, function (_g) {
23010
+ switch (_g.label) {
22930
23011
  case 0:
22931
23012
  authorizedButtons = [];
22932
- serviceCodeByBase = this.setting.baseService != null ? this.setting.baseService.serviceCode : '';
23013
+ serviceCodeByBase = this.setting.baseService != null ? this.setting.baseService.serviceCode.toUpperCase() : '';
22933
23014
  promises = [];
22934
23015
  _loop_3 = function (item) {
22935
- if (!item.authorizationPermission) {
23016
+ var permission = this_2.lstBtnAuthorizeMenu.find(function (p) { return p.rawText == item.label; });
23017
+ if (!item.authorizationPermission && !permission) {
22936
23018
  authorizedButtons.push(item);
22937
23019
  return "continue";
22938
23020
  }
22939
23021
  var serviceCode = item.authorizationServiceCode ? item.authorizationServiceCode : serviceCodeByBase;
22940
- promises.push(this_2._permissionService.isAuthorized(serviceCode, item.authorizationPermission, true).then(function (authorized) {
23022
+ var permissionCode = permission ? permission.permissionCode : item.authorizationPermission;
23023
+ promises.push(this_2._permissionService.isAuthorized(serviceCode, permissionCode, true).then(function (authorized) {
22941
23024
  if (authorized !== true) {
22942
23025
  return;
22943
23026
  }
@@ -22954,13 +23037,13 @@
22954
23037
  catch (e_6_1) { e_6 = { error: e_6_1 }; }
22955
23038
  finally {
22956
23039
  try {
22957
- if (menuButtons_1_1 && !menuButtons_1_1.done && (_b = menuButtons_1.return)) _b.call(menuButtons_1);
23040
+ if (menuButtons_1_1 && !menuButtons_1_1.done && (_f = menuButtons_1.return)) _f.call(menuButtons_1);
22958
23041
  }
22959
23042
  finally { if (e_6) throw e_6.error; }
22960
23043
  }
22961
23044
  return [4 /*yield*/, Promise.all(promises)];
22962
23045
  case 1:
22963
- _c.sent();
23046
+ _g.sent();
22964
23047
  return [2 /*return*/, authorizedButtons];
22965
23048
  }
22966
23049
  });
@@ -23575,10 +23658,10 @@
23575
23658
  clearTimeout(this.timeout);
23576
23659
  };
23577
23660
  ListComponentBase.prototype.disableMultipleDelete = function () {
23578
- var e_7, _b;
23661
+ var e_7, _f;
23579
23662
  try {
23580
- for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
23581
- var item = _d.value;
23663
+ for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
23664
+ var item = _h.value;
23582
23665
  if (this.disableDelete(item)) {
23583
23666
  return true;
23584
23667
  }
@@ -23587,7 +23670,7 @@
23587
23670
  catch (e_7_1) { e_7 = { error: e_7_1 }; }
23588
23671
  finally {
23589
23672
  try {
23590
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
23673
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
23591
23674
  }
23592
23675
  finally { if (e_7) throw e_7.error; }
23593
23676
  }
@@ -23658,11 +23741,11 @@
23658
23741
  };
23659
23742
  ListComponentBase.prototype.processBaseData = function () {
23660
23743
  return __awaiter(this, void 0, void 0, function () {
23661
- return __generator(this, function (_b) {
23662
- switch (_b.label) {
23744
+ return __generator(this, function (_f) {
23745
+ switch (_f.label) {
23663
23746
  case 0: return [4 /*yield*/, this.preProcessData(this._rawDataSource)];
23664
23747
  case 1:
23665
- _b.sent();
23748
+ _f.sent();
23666
23749
  return [2 /*return*/];
23667
23750
  }
23668
23751
  });
@@ -23671,11 +23754,11 @@
23671
23754
  ListComponentBase.prototype.preProcessData = function (dataSource) {
23672
23755
  return __awaiter(this, void 0, void 0, function () {
23673
23756
  var colHasPipe, _loop_4, this_3, colHasPipe_1, colHasPipe_1_1, col;
23674
- var e_8, _b;
23675
- return __generator(this, function (_c) {
23757
+ var e_8, _f;
23758
+ return __generator(this, function (_g) {
23676
23759
  colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
23677
23760
  _loop_4 = function (col) {
23678
- var e_9, _d;
23761
+ var e_9, _h;
23679
23762
  var _loop_5 = function (item) {
23680
23763
  this_3.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
23681
23764
  item["pipe__" + col.field + " "] = rs;
@@ -23690,7 +23773,7 @@
23690
23773
  catch (e_9_1) { e_9 = { error: e_9_1 }; }
23691
23774
  finally {
23692
23775
  try {
23693
- if (dataSource_1_1 && !dataSource_1_1.done && (_d = dataSource_1.return)) _d.call(dataSource_1);
23776
+ if (dataSource_1_1 && !dataSource_1_1.done && (_h = dataSource_1.return)) _h.call(dataSource_1);
23694
23777
  }
23695
23778
  finally { if (e_9) throw e_9.error; }
23696
23779
  }
@@ -23705,7 +23788,7 @@
23705
23788
  catch (e_8_1) { e_8 = { error: e_8_1 }; }
23706
23789
  finally {
23707
23790
  try {
23708
- if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_b = colHasPipe_1.return)) _b.call(colHasPipe_1);
23791
+ if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_f = colHasPipe_1.return)) _f.call(colHasPipe_1);
23709
23792
  }
23710
23793
  finally { if (e_8) throw e_8.error; }
23711
23794
  }
@@ -23716,8 +23799,8 @@
23716
23799
  ListComponentBase.prototype.transform = function (pipe, asyncPipe, value) {
23717
23800
  return __awaiter(this, void 0, void 0, function () {
23718
23801
  var val, val;
23719
- return __generator(this, function (_b) {
23720
- switch (_b.label) {
23802
+ return __generator(this, function (_f) {
23803
+ switch (_f.label) {
23721
23804
  case 0:
23722
23805
  if (this.cachedTransforms[value]) {
23723
23806
  return [2 /*return*/, this.cachedTransforms[value]];
@@ -23725,7 +23808,7 @@
23725
23808
  if (!asyncPipe) return [3 /*break*/, 2];
23726
23809
  return [4 /*yield*/, pipe.transform(value)];
23727
23810
  case 1:
23728
- val = _b.sent();
23811
+ val = _f.sent();
23729
23812
  this.cachedTransforms[value] = val;
23730
23813
  return [2 /*return*/, val];
23731
23814
  case 2:
@@ -23881,7 +23964,7 @@
23881
23964
  }
23882
23965
  };
23883
23966
  ListComponentBase.prototype.getMinimizeData = function (model) {
23884
- var e_10, _b;
23967
+ var e_10, _f;
23885
23968
  if (isLiteralObject(model)) {
23886
23969
  if (model._dropdownvalue != null && model._dropdownvalue !== '') {
23887
23970
  return model[model._dropdownvalue];
@@ -23907,7 +23990,7 @@
23907
23990
  catch (e_10_1) { e_10 = { error: e_10_1 }; }
23908
23991
  finally {
23909
23992
  try {
23910
- if (model_1_1 && !model_1_1.done && (_b = model_1.return)) _b.call(model_1);
23993
+ if (model_1_1 && !model_1_1.done && (_f = model_1.return)) _f.call(model_1);
23911
23994
  }
23912
23995
  finally { if (e_10) throw e_10.error; }
23913
23996
  }
@@ -24042,8 +24125,8 @@
24042
24125
  };
24043
24126
  ListComponentBase.prototype.handleTableRendered = function () {
24044
24127
  return __awaiter(this, void 0, void 0, function () {
24045
- return __generator(this, function (_b) {
24046
- switch (_b.label) {
24128
+ return __generator(this, function (_f) {
24129
+ switch (_f.label) {
24047
24130
  case 0:
24048
24131
  if (this.table) {
24049
24132
  this._processAfterRendered(this.table.el.nativeElement);
@@ -24053,7 +24136,7 @@
24053
24136
  }
24054
24137
  return [4 /*yield*/, this.modifyButtonFunctionInRow()];
24055
24138
  case 1:
24056
- _b.sent();
24139
+ _f.sent();
24057
24140
  this.onReloaded.emit(true);
24058
24141
  return [2 /*return*/];
24059
24142
  }
@@ -24086,42 +24169,42 @@
24086
24169
  ListComponentBase.prototype.modifyButtonFunctionInRow = function () {
24087
24170
  var _a;
24088
24171
  return __awaiter(this, void 0, void 0, function () {
24089
- var _b, _c, rowData, _d, _e, ex_1, e_11_1;
24090
- var e_11, _f;
24091
- return __generator(this, function (_g) {
24092
- switch (_g.label) {
24172
+ var _f, _g, rowData, total, _h, ex_1, e_11_1;
24173
+ var e_11, _j;
24174
+ return __generator(this, function (_k) {
24175
+ switch (_k.label) {
24093
24176
  case 0:
24094
- _g.trys.push([0, 8, 9, 10]);
24095
- _b = __values(this.model.dataSource), _c = _b.next();
24096
- _g.label = 1;
24177
+ _k.trys.push([0, 8, 9, 10]);
24178
+ _f = __values(this.model.dataSource), _g = _f.next();
24179
+ _k.label = 1;
24097
24180
  case 1:
24098
- if (!!_c.done) return [3 /*break*/, 7];
24099
- rowData = _c.value;
24100
- _g.label = 2;
24181
+ if (!!_g.done) return [3 /*break*/, 7];
24182
+ rowData = _g.value;
24183
+ _k.label = 2;
24101
24184
  case 2:
24102
- _g.trys.push([2, 5, , 6]);
24103
- _d = rowData;
24104
- _e = this.getMenuButtonAuthorized;
24185
+ _k.trys.push([2, 5, , 6]);
24186
+ _h = this.getMenuButtonAuthorized;
24105
24187
  return [4 /*yield*/, this.menuButtons(rowData)];
24106
- case 3: return [4 /*yield*/, _e.apply(this, [(_a = _g.sent()) !== null && _a !== void 0 ? _a : []])];
24188
+ case 3: return [4 /*yield*/, _h.apply(this, [(_a = _k.sent()) !== null && _a !== void 0 ? _a : []])];
24107
24189
  case 4:
24108
- _d.disableFunctionRow = (_g.sent()).length < 1 && this.setting.disableShare;
24190
+ total = (_k.sent());
24191
+ rowData.disableFunctionRow = total.length < 1 && this.setting.disableShare;
24109
24192
  return [3 /*break*/, 6];
24110
24193
  case 5:
24111
- ex_1 = _g.sent();
24194
+ ex_1 = _k.sent();
24112
24195
  this.hiddenBtnFunction = true;
24113
24196
  return [2 /*return*/];
24114
24197
  case 6:
24115
- _c = _b.next();
24198
+ _g = _f.next();
24116
24199
  return [3 /*break*/, 1];
24117
24200
  case 7: return [3 /*break*/, 10];
24118
24201
  case 8:
24119
- e_11_1 = _g.sent();
24202
+ e_11_1 = _k.sent();
24120
24203
  e_11 = { error: e_11_1 };
24121
24204
  return [3 /*break*/, 10];
24122
24205
  case 9:
24123
24206
  try {
24124
- if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
24207
+ if (_g && !_g.done && (_j = _f.return)) _j.call(_f);
24125
24208
  }
24126
24209
  finally { if (e_11) throw e_11.error; }
24127
24210
  return [7 /*endfinally*/];
@@ -24151,10 +24234,10 @@
24151
24234
  };
24152
24235
  ListComponentBase.prototype.createSearchSchema = function () {
24153
24236
  return __awaiter(this, void 0, void 0, function () {
24154
- var searchInfo, _b, _c, col, control, e_12_1, _loop_6, this_4, _d, _e, field;
24155
- var e_12, _f, _g, e_13, _h;
24156
- return __generator(this, function (_j) {
24157
- switch (_j.label) {
24237
+ var searchInfo, _f, _g, col, control, e_12_1, _loop_6, this_4, _h, _j, field;
24238
+ var e_12, _k, _l, e_13, _m;
24239
+ return __generator(this, function (_o) {
24240
+ switch (_o.label) {
24158
24241
  case 0:
24159
24242
  if (this.setting.cols == null) {
24160
24243
  return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
@@ -24164,14 +24247,14 @@
24164
24247
  searchInfo.schema = [];
24165
24248
  searchInfo.fieldDropdown = {};
24166
24249
  searchInfo.fieldSearchText = [];
24167
- _j.label = 1;
24250
+ _o.label = 1;
24168
24251
  case 1:
24169
- _j.trys.push([1, 6, 7, 8]);
24170
- _b = __values(this.setting.cols), _c = _b.next();
24171
- _j.label = 2;
24252
+ _o.trys.push([1, 6, 7, 8]);
24253
+ _f = __values(this.setting.cols), _g = _f.next();
24254
+ _o.label = 2;
24172
24255
  case 2:
24173
- if (!!_c.done) return [3 /*break*/, 5];
24174
- col = _c.value;
24256
+ if (!!_g.done) return [3 /*break*/, 5];
24257
+ col = _g.value;
24175
24258
  if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
24176
24259
  if (col.fullTextSearch) {
24177
24260
  if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
@@ -24184,9 +24267,9 @@
24184
24267
  }
24185
24268
  return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
24186
24269
  case 3:
24187
- control = _j.sent();
24270
+ control = _o.sent();
24188
24271
  if (control != null) {
24189
- (_g = searchInfo.schema).push.apply(_g, __spreadArray([], __read(control)));
24272
+ (_l = searchInfo.schema).push.apply(_l, __spreadArray([], __read(control)));
24190
24273
  }
24191
24274
  else {
24192
24275
  if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
@@ -24240,18 +24323,18 @@
24240
24323
  }
24241
24324
  }
24242
24325
  }
24243
- _j.label = 4;
24326
+ _o.label = 4;
24244
24327
  case 4:
24245
- _c = _b.next();
24328
+ _g = _f.next();
24246
24329
  return [3 /*break*/, 2];
24247
24330
  case 5: return [3 /*break*/, 8];
24248
24331
  case 6:
24249
- e_12_1 = _j.sent();
24332
+ e_12_1 = _o.sent();
24250
24333
  e_12 = { error: e_12_1 };
24251
24334
  return [3 /*break*/, 8];
24252
24335
  case 7:
24253
24336
  try {
24254
- if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
24337
+ if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
24255
24338
  }
24256
24339
  finally { if (e_12) throw e_12.error; }
24257
24340
  return [7 /*endfinally*/];
@@ -24271,15 +24354,15 @@
24271
24354
  };
24272
24355
  this_4 = this;
24273
24356
  try {
24274
- for (_d = __values(searchInfo.fieldSearchText), _e = _d.next(); !_e.done; _e = _d.next()) {
24275
- field = _e.value;
24357
+ for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
24358
+ field = _j.value;
24276
24359
  _loop_6(field);
24277
24360
  }
24278
24361
  }
24279
24362
  catch (e_13_1) { e_13 = { error: e_13_1 }; }
24280
24363
  finally {
24281
24364
  try {
24282
- if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
24365
+ if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
24283
24366
  }
24284
24367
  finally { if (e_13) throw e_13.error; }
24285
24368
  }
@@ -24317,8 +24400,8 @@
24317
24400
  ListComponentBase.prototype.getItemWorkflowSetting = function (setting, rowData) {
24318
24401
  return __awaiter(this, void 0, void 0, function () {
24319
24402
  var workflowSetting;
24320
- return __generator(this, function (_b) {
24321
- switch (_b.label) {
24403
+ return __generator(this, function (_f) {
24404
+ switch (_f.label) {
24322
24405
  case 0:
24323
24406
  workflowSetting = setting.workflowSettingNew;
24324
24407
  if (!(setting.isWorkflowTree
@@ -24326,8 +24409,8 @@
24326
24409
  && setting.workflowConfigAdvance.getWorkflowSetting)) return [3 /*break*/, 2];
24327
24410
  return [4 /*yield*/, setting.workflowConfigAdvance.getWorkflowSetting(rowData)];
24328
24411
  case 1:
24329
- workflowSetting = _b.sent();
24330
- _b.label = 2;
24412
+ workflowSetting = _f.sent();
24413
+ _f.label = 2;
24331
24414
  case 2:
24332
24415
  if (!workflowSetting || workflowSetting.workflows.length == 0) {
24333
24416
  return [2 /*return*/, this._notifierService.showWarning('Đối tượng chưa được cấu hình quy trình nghiệp vụ')];
@@ -24341,13 +24424,13 @@
24341
24424
  return __awaiter(this, void 0, void 0, function () {
24342
24425
  var workflowSetting, resultCheckExist, modelTask, contentLink, modelEntity, taskWorkflowSetting, compRef;
24343
24426
  var _this = this;
24344
- return __generator(this, function (_b) {
24345
- switch (_b.label) {
24427
+ return __generator(this, function (_f) {
24428
+ switch (_f.label) {
24346
24429
  case 0:
24347
24430
  rowData.__startingWorkflow = true;
24348
24431
  return [4 /*yield*/, this.getItemWorkflowSetting(this.setting, rowData)];
24349
24432
  case 1:
24350
- workflowSetting = _b.sent();
24433
+ workflowSetting = _f.sent();
24351
24434
  if (!workflowSetting) {
24352
24435
  rowData.__startingWorkflow = false;
24353
24436
  return [2 /*return*/];
@@ -24359,7 +24442,7 @@
24359
24442
  this.newFilter('entityKey', exports.Operator.equal, rowData.id)
24360
24443
  ])];
24361
24444
  case 2:
24362
- resultCheckExist = (_b.sent());
24445
+ resultCheckExist = (_f.sent());
24363
24446
  if (!resultCheckExist.success) {
24364
24447
  rowData.__startingWorkflow = false;
24365
24448
  return [2 /*return*/, this._notifierService.showWarning('Có lỗi xảy ra khi kiểm tra trạng thái đã tạo công việc hay chưa')];
@@ -24371,8 +24454,8 @@
24371
24454
  if (!this.setting.modifyRowDataForTask) return [3 /*break*/, 4];
24372
24455
  return [4 /*yield*/, this.setting.modifyRowDataForTask(rowData)];
24373
24456
  case 3:
24374
- _b.sent();
24375
- _b.label = 4;
24457
+ _f.sent();
24458
+ _f.label = 4;
24376
24459
  case 4:
24377
24460
  modelTask = {
24378
24461
  id: this._commonService.guid(),
@@ -24387,7 +24470,7 @@
24387
24470
  };
24388
24471
  return [4 /*yield*/, this.getCopyPath(this.setting, rowData)];
24389
24472
  case 5:
24390
- contentLink = _b.sent();
24473
+ contentLink = _f.sent();
24391
24474
  if (contentLink) {
24392
24475
  modelEntity = this.parseAttachLink(contentLink);
24393
24476
  modelTask.dinhKemNghiepVuDtos = modelEntity;
@@ -24395,27 +24478,27 @@
24395
24478
  if (!this.setting.modifyItemTask) return [3 /*break*/, 7];
24396
24479
  return [4 /*yield*/, this.setting.modifyItemTask(modelTask, rowData)];
24397
24480
  case 6:
24398
- _b.sent();
24399
- _b.label = 7;
24481
+ _f.sent();
24482
+ _f.label = 7;
24400
24483
  case 7:
24401
24484
  if (!(workflowSetting.autoStartTask
24402
24485
  && workflowSetting.idLoaiCongViecDefault)) return [3 /*break*/, 9];
24403
24486
  return [4 /*yield*/, this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(workflowSetting.idLoaiCongViecDefault)];
24404
24487
  case 8:
24405
- taskWorkflowSetting = _b.sent();
24488
+ taskWorkflowSetting = _f.sent();
24406
24489
  if (taskWorkflowSetting != null && taskWorkflowSetting.workflowCode) {
24407
24490
  modelTask[FieldWorkflowCodeInCrudForm] = taskWorkflowSetting.workflowCode;
24408
24491
  this.insertTaskAndReload(modelTask, rowData, taskWorkflowSetting);
24409
24492
  rowData.__startingWorkflow = false;
24410
24493
  return [2 /*return*/];
24411
24494
  }
24412
- _b.label = 9;
24495
+ _f.label = 9;
24413
24496
  case 9: return [3 /*break*/, 14];
24414
24497
  case 10:
24415
24498
  if (!(workflowSetting.workflows.length == 1)) return [3 /*break*/, 12];
24416
24499
  return [4 /*yield*/, this.startWorkflow(rowData, workflowSetting.workflows[0])];
24417
24500
  case 11:
24418
- _b.sent();
24501
+ _f.sent();
24419
24502
  rowData.__startingWorkflow = false;
24420
24503
  return [2 /*return*/];
24421
24504
  case 12:
@@ -24424,13 +24507,13 @@
24424
24507
  rowData.__startingWorkflow = false;
24425
24508
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'StartWorkflowComponent', this.startWorkflowViewContainer)];
24426
24509
  case 13:
24427
- compRef = _b.sent();
24510
+ compRef = _f.sent();
24428
24511
  dialog.buttonTemplateInput = compRef.instance.buttonTemplate;
24429
24512
  compRef.workflows = workflowSetting.workflows;
24430
24513
  compRef.defaultWorkflow = workflowSetting.workflowCode;
24431
24514
  compRef.instance.onSaved.subscribe(function (event) { return _this.handleStartWorkflowFromDialog(event); });
24432
24515
  compRef.instance.onCancel.subscribe(function (event) { return _this.startWorkflowModel.showEditForm = false; });
24433
- _b.label = 14;
24516
+ _f.label = 14;
24434
24517
  case 14: return [2 /*return*/];
24435
24518
  }
24436
24519
  });
@@ -24476,25 +24559,25 @@
24476
24559
  };
24477
24560
  ListComponentBase.prototype.insertTaskAndReload = function (modelTask, rowData, workflowSetting) {
24478
24561
  return __awaiter(this, void 0, void 0, function () {
24479
- var _b;
24562
+ var _f;
24480
24563
  var _this = this;
24481
- return __generator(this, function (_c) {
24482
- switch (_c.label) {
24564
+ return __generator(this, function (_g) {
24565
+ switch (_g.label) {
24483
24566
  case 0:
24484
24567
  if (!this.setting.getDataForNextFirstStepTask) return [3 /*break*/, 2];
24485
- _b = modelTask;
24568
+ _f = modelTask;
24486
24569
  return [4 /*yield*/, this.setting.getDataForNextFirstStepTask(rowData)];
24487
24570
  case 1:
24488
- _b.itemWorkflowHistory = _c.sent();
24571
+ _f.itemWorkflowHistory = _g.sent();
24489
24572
  modelTask.itemWorkflowHistory = this.tongHopWorkflowHistoryForNextFirstStep(modelTask.itemWorkflowHistory, modelTask, workflowSetting, modelTask[FieldWorkflowCodeInCrudForm]);
24490
- _c.label = 2;
24573
+ _g.label = 2;
24491
24574
  case 2: return [4 /*yield*/, this._congViecService.post(modelTask)
24492
24575
  .then(function (res) { return _this.handleResponse(res, '', function (f) {
24493
24576
  _this.onStartedWorkflow.emit(rowData.id);
24494
24577
  _this.getData();
24495
24578
  }); })];
24496
24579
  case 3:
24497
- _c.sent();
24580
+ _g.sent();
24498
24581
  return [2 /*return*/];
24499
24582
  }
24500
24583
  });
@@ -24514,9 +24597,9 @@
24514
24597
  if (dialogDetailTask === void 0) { dialogDetailTask = null; }
24515
24598
  if (dialogChoYKienForm === void 0) { dialogChoYKienForm = null; }
24516
24599
  return __awaiter(this, void 0, void 0, function () {
24517
- var _b;
24518
- return __generator(this, function (_c) {
24519
- switch (_c.label) {
24600
+ var _f;
24601
+ return __generator(this, function (_g) {
24602
+ switch (_g.label) {
24520
24603
  case 0:
24521
24604
  if (this.showingActionWorkflow)
24522
24605
  return [2 /*return*/];
@@ -24525,10 +24608,10 @@
24525
24608
  this.dialogProcessWorkflowForm = dialogProcessWorkflowForm;
24526
24609
  this.dialogDetailTask = dialogDetailTask;
24527
24610
  this.dialogChoYKienForm = dialogChoYKienForm;
24528
- _b = this;
24611
+ _f = this;
24529
24612
  return [4 /*yield*/, this.getButtonContext(rowData)];
24530
24613
  case 1:
24531
- _b.buttonContexts = _c.sent();
24614
+ _f.buttonContexts = _g.sent();
24532
24615
  if (this.buttonContexts.length === 0) {
24533
24616
  return [2 /*return*/];
24534
24617
  }
@@ -24542,20 +24625,20 @@
24542
24625
  return __awaiter(this, void 0, void 0, function () {
24543
24626
  var resultGetActionWorkflow, buttonContexts;
24544
24627
  var _this = this;
24545
- return __generator(this, function (_b) {
24546
- switch (_b.label) {
24628
+ return __generator(this, function (_f) {
24629
+ switch (_f.label) {
24547
24630
  case 0:
24548
24631
  this.showingActionWorkflow = true;
24549
24632
  resultGetActionWorkflow = null;
24550
24633
  if (!(!this.setting.isWorkflowTree && this.setting.workflowSettingNew.createTaskInstead)) return [3 /*break*/, 2];
24551
24634
  return [4 /*yield*/, this.getActionWorkflowByTask(rowData, rowData.dialogHistory)];
24552
24635
  case 1:
24553
- resultGetActionWorkflow = _b.sent();
24636
+ resultGetActionWorkflow = _f.sent();
24554
24637
  return [3 /*break*/, 4];
24555
24638
  case 2: return [4 /*yield*/, this.getActionWorkflow(rowData)];
24556
24639
  case 3:
24557
- resultGetActionWorkflow = _b.sent();
24558
- _b.label = 4;
24640
+ resultGetActionWorkflow = _f.sent();
24641
+ _f.label = 4;
24559
24642
  case 4:
24560
24643
  this.showingActionWorkflow = false;
24561
24644
  if (!Array.isArray(resultGetActionWorkflow)) {
@@ -24579,11 +24662,11 @@
24579
24662
  ListComponentBase.prototype.getActionWorkflow = function (rowData) {
24580
24663
  return __awaiter(this, void 0, void 0, function () {
24581
24664
  var workflowSetting;
24582
- return __generator(this, function (_b) {
24583
- switch (_b.label) {
24665
+ return __generator(this, function (_f) {
24666
+ switch (_f.label) {
24584
24667
  case 0: return [4 /*yield*/, this.getItemWorkflowSetting(this.setting, rowData)];
24585
24668
  case 1:
24586
- workflowSetting = _b.sent();
24669
+ workflowSetting = _f.sent();
24587
24670
  if (!workflowSetting)
24588
24671
  return [2 /*return*/];
24589
24672
  return [2 /*return*/, this._getActionWorkflowBase(this.setting, rowData, workflowSetting)];
@@ -24593,21 +24676,21 @@
24593
24676
  };
24594
24677
  ListComponentBase.prototype.getActionWorkflowByTask = function (rowData, dialog) {
24595
24678
  return __awaiter(this, void 0, void 0, function () {
24596
- var _b, workflowPermissionDetailService, userService, result, workflowSetting, crudListSetting;
24597
- return __generator(this, function (_c) {
24598
- switch (_c.label) {
24679
+ var _f, workflowPermissionDetailService, userService, result, workflowSetting, crudListSetting;
24680
+ return __generator(this, function (_g) {
24681
+ switch (_g.label) {
24599
24682
  case 0:
24600
24683
  if (!!rowData.__isGotCongViec) return [3 /*break*/, 2];
24601
- _b = rowData;
24684
+ _f = rowData;
24602
24685
  return [4 /*yield*/, this._congViecService.getDetailByFilter([
24603
24686
  this.newFilter('serviceCode', exports.Operator.equal, this.setting.baseService.serviceCode),
24604
24687
  this.newFilter('entity', exports.Operator.equal, this.setting.baseService.entityName),
24605
24688
  this.newFilter('entityKey', exports.Operator.equal, rowData.id)
24606
24689
  ])];
24607
24690
  case 1:
24608
- _b.__itemCongViec = (_c.sent()).data;
24691
+ _f.__itemCongViec = (_g.sent()).data;
24609
24692
  rowData.__isGotCongViec = true;
24610
- _c.label = 2;
24693
+ _g.label = 2;
24611
24694
  case 2:
24612
24695
  rowData = rowData.__itemCongViec;
24613
24696
  if (!rowData) {
@@ -24620,12 +24703,12 @@
24620
24703
  return [4 /*yield*/, workflowPermissionDetailService.changeEndpoint(this._congViecService)
24621
24704
  .appendInfoForWorkflow(userService.getUserIdCombine(), [rowData], 'id', this.setting.ignoreWorkflow)];
24622
24705
  case 3:
24623
- result = _c.sent();
24706
+ result = _g.sent();
24624
24707
  if (result !== true)
24625
24708
  return [2 /*return*/];
24626
24709
  return [4 /*yield*/, this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(rowData.idLoaiCongViec)];
24627
24710
  case 4:
24628
- workflowSetting = _c.sent();
24711
+ workflowSetting = _g.sent();
24629
24712
  if (workflowSetting == null)
24630
24713
  return [2 /*return*/];
24631
24714
  crudListSetting = new CrudListSetting();
@@ -24639,8 +24722,8 @@
24639
24722
  return __awaiter(this, void 0, void 0, function () {
24640
24723
  var buttonContexts, itemWorkflowSetting_1, actions_1, actionAllows, workflowHistoryService, userService, userId, userIdStringUpper, itemWorkflowHistoryLast;
24641
24724
  var _this = this;
24642
- return __generator(this, function (_b) {
24643
- switch (_b.label) {
24725
+ return __generator(this, function (_f) {
24726
+ switch (_f.label) {
24644
24727
  case 0:
24645
24728
  this.currentItem = rowData;
24646
24729
  this.buttonContexts = [];
@@ -24655,7 +24738,7 @@
24655
24738
  actions_1 = itemWorkflowSetting_1.data.actions[rowData.__trangThai];
24656
24739
  return [4 /*yield*/, crudListSetting.baseService.getActionAllow(rowData.id)];
24657
24740
  case 2:
24658
- actionAllows = (_b.sent()).data;
24741
+ actionAllows = (_f.sent()).data;
24659
24742
  if (actionAllows) {
24660
24743
  actionAllows.forEach(function (actionCode) {
24661
24744
  var action = actions_1.find(function (q) { return q.code == actionCode; });
@@ -24684,7 +24767,7 @@
24684
24767
  }
24685
24768
  return [4 /*yield*/, workflowHistoryService.changeEndpoint(crudListSetting.baseService).getLastByItemId(rowData.id)];
24686
24769
  case 3:
24687
- itemWorkflowHistoryLast = (_b.sent()).data;
24770
+ itemWorkflowHistoryLast = (_f.sent()).data;
24688
24771
  if (itemWorkflowHistoryLast
24689
24772
  && itemWorkflowHistoryLast.actionCode != MaActionBatDauQuyTrinh
24690
24773
  && itemWorkflowHistoryLast.userIdCreated.toUpperCase() == userIdStringUpper
@@ -24704,7 +24787,7 @@
24704
24787
  label: exports.ButtonTextActionCongViec.XEM_LICH_SU,
24705
24788
  command: function () { return _this.viewHistoryWorkflow(crudListSetting, rowData); }
24706
24789
  });
24707
- _b.label = 4;
24790
+ _f.label = 4;
24708
24791
  case 4: return [2 /*return*/, buttonContexts];
24709
24792
  }
24710
24793
  });
@@ -24714,13 +24797,13 @@
24714
24797
  return __awaiter(this, void 0, void 0, function () {
24715
24798
  var itemTask, taskFormModel, compRef;
24716
24799
  var _this = this;
24717
- return __generator(this, function (_b) {
24718
- switch (_b.label) {
24800
+ return __generator(this, function (_f) {
24801
+ switch (_f.label) {
24719
24802
  case 0: return [4 /*yield*/, this._congViecService.getDetailByFilter([
24720
24803
  this.newFilter('entityKey', exports.Operator.equal, rowData.id)
24721
24804
  ])];
24722
24805
  case 1:
24723
- itemTask = (_b.sent()).data;
24806
+ itemTask = (_f.sent()).data;
24724
24807
  if (itemTask == null) {
24725
24808
  return [2 /*return*/, this._notifierService.showWarning('Không tìm thấy công việc gắn với bản ghi')];
24726
24809
  }
@@ -24731,7 +24814,7 @@
24731
24814
  this.detailTaskModel.showEditForm = true;
24732
24815
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('congviec', 'BaseCongViecFormComponent', this.detailTaskViewContainer)];
24733
24816
  case 2:
24734
- compRef = _b.sent();
24817
+ compRef = _f.sent();
24735
24818
  if (this.dialogDetailTask) {
24736
24819
  this.dialogDetailTask.buttonTemplateInput = compRef.instance.buttonTemplate;
24737
24820
  }
@@ -24768,11 +24851,11 @@
24768
24851
  return __awaiter(this, void 0, void 0, function () {
24769
24852
  var workflowSetting, compRef;
24770
24853
  var _this = this;
24771
- return __generator(this, function (_b) {
24772
- switch (_b.label) {
24854
+ return __generator(this, function (_f) {
24855
+ switch (_f.label) {
24773
24856
  case 0: return [4 /*yield*/, this.getItemWorkflowSetting(crudListSetting, rowData)];
24774
24857
  case 1:
24775
- workflowSetting = _b.sent();
24858
+ workflowSetting = _f.sent();
24776
24859
  if (!workflowSetting)
24777
24860
  return [2 /*return*/];
24778
24861
  this.currentItem = rowData;
@@ -24782,7 +24865,7 @@
24782
24865
  this.workflowHistoryModel.showEditForm = true;
24783
24866
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowHistoryNewComponent', this.workflowHistoryNewViewContainer)];
24784
24867
  case 2:
24785
- compRef = _b.sent();
24868
+ compRef = _f.sent();
24786
24869
  compRef.instance.businessSetting = crudListSetting;
24787
24870
  compRef.instance.tableName = this.workflowHistoryModel.data.tableName;
24788
24871
  compRef.instance.item = rowData;
@@ -24800,8 +24883,8 @@
24800
24883
  return __awaiter(this, void 0, void 0, function () {
24801
24884
  var domainNewTab, compRef;
24802
24885
  var _this = this;
24803
- return __generator(this, function (_b) {
24804
- switch (_b.label) {
24886
+ return __generator(this, function (_f) {
24887
+ switch (_f.label) {
24805
24888
  case 0:
24806
24889
  if (workflowAction.openNewTab) {
24807
24890
  domainNewTab = workflowAction.domainNewTab;
@@ -24823,7 +24906,7 @@
24823
24906
  this.processWorkflowModel.header = workflowAction.name;
24824
24907
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'ProcessWorkflowFormComponent', this.processWorkflowFormViewContainer)];
24825
24908
  case 1:
24826
- compRef = _b.sent();
24909
+ compRef = _f.sent();
24827
24910
  if (this.dialogProcessWorkflowForm) {
24828
24911
  this.dialogProcessWorkflowForm.buttonTemplateInput = compRef.instance.buttonTemplate;
24829
24912
  }
@@ -24842,15 +24925,15 @@
24842
24925
  return __awaiter(this, void 0, void 0, function () {
24843
24926
  var compRef;
24844
24927
  var _this = this;
24845
- return __generator(this, function (_b) {
24846
- switch (_b.label) {
24928
+ return __generator(this, function (_f) {
24929
+ switch (_f.label) {
24847
24930
  case 0:
24848
24931
  this.choYKienModel.data.rowData = rowData;
24849
24932
  this.choYKienModel.data.setting = crudListSetting;
24850
24933
  this.choYKienModel.showEditForm = true;
24851
24934
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'ChoYKienFormComponent', this.choYKienFormViewContainer)];
24852
24935
  case 1:
24853
- compRef = _b.sent();
24936
+ compRef = _f.sent();
24854
24937
  if (this.dialogChoYKienForm) {
24855
24938
  this.dialogChoYKienForm.buttonTemplateInput = compRef.instance.buttonTemplate;
24856
24939
  }
@@ -24866,8 +24949,8 @@
24866
24949
  ListComponentBase.prototype.startWorkflow = function (rowData, workflow) {
24867
24950
  return __awaiter(this, void 0, void 0, function () {
24868
24951
  var _this = this;
24869
- return __generator(this, function (_b) {
24870
- switch (_b.label) {
24952
+ return __generator(this, function (_f) {
24953
+ switch (_f.label) {
24871
24954
  case 0: return [4 /*yield*/, this.setting.baseService.startWorkflow(rowData.id, workflow.code)
24872
24955
  .then(function (res) { return _this.handleResponse(res, 'Chạy quy trình thành công', function (f) {
24873
24956
  _this.onStartedWorkflow.emit(rowData.id);
@@ -24875,7 +24958,7 @@
24875
24958
  _this.getData();
24876
24959
  }); })];
24877
24960
  case 1:
24878
- _b.sent();
24961
+ _f.sent();
24879
24962
  return [2 /*return*/];
24880
24963
  }
24881
24964
  });
@@ -24900,7 +24983,7 @@
24900
24983
  ListComponentBase.prototype.createShareLink = function () {
24901
24984
  return __awaiter(this, void 0, void 0, function () {
24902
24985
  var rowData;
24903
- return __generator(this, function (_b) {
24986
+ return __generator(this, function (_f) {
24904
24987
  if (!this.setting.checkReadyToTrinhKy()) {
24905
24988
  return [2 /*return*/, this._notifierService.showWarning('Đang tải dữ liệu danh sách, chờ một lúc rồi thử lại')];
24906
24989
  }
@@ -24912,17 +24995,17 @@
24912
24995
  };
24913
24996
  ListComponentBase.prototype.createShareLinkMultiple = function () {
24914
24997
  return __awaiter(this, void 0, void 0, function () {
24915
- return __generator(this, function (_b) {
24998
+ return __generator(this, function (_f) {
24916
24999
  this.showShareLinkForm(this.model.selectedItems);
24917
25000
  return [2 /*return*/];
24918
25001
  });
24919
25002
  });
24920
25003
  };
24921
25004
  ListComponentBase.prototype.disableMultipleCopyLink = function () {
24922
- var e_14, _b;
25005
+ var e_14, _f;
24923
25006
  try {
24924
- for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
24925
- var item = _d.value;
25007
+ for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
25008
+ var item = _h.value;
24926
25009
  if (this.disableCopyLink(item)) {
24927
25010
  return true;
24928
25011
  }
@@ -24931,7 +25014,7 @@
24931
25014
  catch (e_14_1) { e_14 = { error: e_14_1 }; }
24932
25015
  finally {
24933
25016
  try {
24934
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
25017
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
24935
25018
  }
24936
25019
  finally { if (e_14) throw e_14.error; }
24937
25020
  }
@@ -24951,7 +25034,7 @@
24951
25034
  };
24952
25035
  ListComponentBase.prototype.showSettingsPermission = function () {
24953
25036
  return __awaiter(this, void 0, void 0, function () {
24954
- return __generator(this, function (_b) {
25037
+ return __generator(this, function (_f) {
24955
25038
  if (this.creatingSearchInfo)
24956
25039
  return [2 /*return*/];
24957
25040
  this._showSettingsPermission = true;
@@ -24963,13 +25046,13 @@
24963
25046
  return __awaiter(this, void 0, void 0, function () {
24964
25047
  var compRef;
24965
25048
  var _this = this;
24966
- return __generator(this, function (_b) {
24967
- switch (_b.label) {
25049
+ return __generator(this, function (_f) {
25050
+ switch (_f.label) {
24968
25051
  case 0:
24969
25052
  this._showSettingsWorkflow = true;
24970
25053
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowSettingDialogComponent', this.workflowSettingDialogViewContainer)];
24971
25054
  case 1:
24972
- compRef = _b.sent();
25055
+ compRef = _f.sent();
24973
25056
  compRef.instance.parentSetting = this.setting;
24974
25057
  compRef.instance.parentContext = this.context;
24975
25058
  compRef.instance.parentModel = this.model;
@@ -24985,13 +25068,13 @@
24985
25068
  return __awaiter(this, void 0, void 0, function () {
24986
25069
  var compRef;
24987
25070
  var _this = this;
24988
- return __generator(this, function (_b) {
24989
- switch (_b.label) {
25071
+ return __generator(this, function (_f) {
25072
+ switch (_f.label) {
24990
25073
  case 0:
24991
25074
  this.workflowSettingModel.showEditForm = true;
24992
25075
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowSettingNewComponent', this.workflowsettingnewViewContainer)];
24993
25076
  case 1:
24994
- compRef = _b.sent();
25077
+ compRef = _f.sent();
24995
25078
  dialog.buttonTemplateInput = compRef.instance.buttonTemplate;
24996
25079
  compRef.instance.parentSetting = this.setting;
24997
25080
  compRef.instance.onSaved.subscribe(function (event) { return _this.onSaveWorkflowSettingsNew(null); });
@@ -25005,13 +25088,13 @@
25005
25088
  return __awaiter(this, void 0, void 0, function () {
25006
25089
  var compRef;
25007
25090
  var _this = this;
25008
- return __generator(this, function (_b) {
25009
- switch (_b.label) {
25091
+ return __generator(this, function (_f) {
25092
+ switch (_f.label) {
25010
25093
  case 0:
25011
25094
  this.permissionSharingModel.showEditForm = true;
25012
25095
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'PermissionSharingComponent', this.permissionSharingViewContainer)];
25013
25096
  case 1:
25014
- compRef = _b.sent();
25097
+ compRef = _f.sent();
25015
25098
  compRef.instance.item = this.rowDataCurrent;
25016
25099
  compRef.instance.baseService = this.setting.baseService;
25017
25100
  compRef.instance.onCancel.subscribe(function (event) { return _this.permissionSharingModel.showEditForm = false; });
@@ -25023,13 +25106,13 @@
25023
25106
  ListComponentBase.prototype.showAttachedTask = function () {
25024
25107
  return __awaiter(this, void 0, void 0, function () {
25025
25108
  var compRef;
25026
- return __generator(this, function (_b) {
25027
- switch (_b.label) {
25109
+ return __generator(this, function (_f) {
25110
+ switch (_f.label) {
25028
25111
  case 0:
25029
25112
  this.attachedTaskModel.showEditForm = true;
25030
25113
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('congviec', 'BaseCongViecComponent', this.baseCongViecViewContainer)];
25031
25114
  case 1:
25032
- compRef = _b.sent();
25115
+ compRef = _f.sent();
25033
25116
  compRef.instance.serviceCode = this.setting.baseService.serviceCode;
25034
25117
  compRef.instance.entity = this.setting.baseService.entityName;
25035
25118
  compRef.instance.itemIdAttach = this.rowDataCurrent.id;
@@ -25042,13 +25125,13 @@
25042
25125
  return __awaiter(this, void 0, void 0, function () {
25043
25126
  var compRef;
25044
25127
  var _this = this;
25045
- return __generator(this, function (_b) {
25046
- switch (_b.label) {
25128
+ return __generator(this, function (_f) {
25129
+ switch (_f.label) {
25047
25130
  case 0:
25048
25131
  this.permissionListModel.showEditForm = true;
25049
25132
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowPermissionComponent', this.workflowPermissionViewContainer)];
25050
25133
  case 1:
25051
- compRef = _b.sent();
25134
+ compRef = _f.sent();
25052
25135
  // this.dialogWorkflowPermission.buttonTemplateInput = compRef.instance.buttonTemplate;
25053
25136
  compRef.instance.item = this.rowDataCurrent;
25054
25137
  compRef.instance.businessSetting = this.setting;
@@ -25105,6 +25188,137 @@
25105
25188
  });
25106
25189
  });
25107
25190
  };
25191
+ ListComponentBase.prototype.handleShowFormSettingButton = function () {
25192
+ var _a, _b, _c, _d, _e;
25193
+ return __awaiter(this, void 0, void 0, function () {
25194
+ var lstBtnCustom, lstBtnAction, _loop_7, this_5, lstBtnCustom_1, lstBtnCustom_1_1, item, lstMenuButtons, buttonSetting;
25195
+ var e_15, _f;
25196
+ var _this = this;
25197
+ return __generator(this, function (_g) {
25198
+ switch (_g.label) {
25199
+ case 0:
25200
+ // Tổng hợp dữ liệu các nút từ ngTemplate + base + menuButton
25201
+ this.buttonAuthorizeModel.data.dataSource = [];
25202
+ lstBtnCustom = this.lstButtonElement[exports.EnumProperties.RESULTS].concat(this.lstButtonTemplate);
25203
+ lstBtnAction = [];
25204
+ _loop_7 = function (item) {
25205
+ var buttonText = (_c = (_b = (_a = item.nativeElement.getAttribute(exports.EnumProperties.LABEL)) !== null && _a !== void 0 ? _a : item.nativeElement.getAttribute(exports.EnumProperties.NG_REFLECT_TEXT)) !== null && _b !== void 0 ? _b : item.nativeElement.getAttribute(exports.EnumProperties.NG_REFLECT_LABEL)) !== null && _c !== void 0 ? _c : item.nativeElement.innerText;
25206
+ if (!buttonText || lstBtnAction.some(function (p) { return p.rawText === buttonText; })) {
25207
+ return "continue";
25208
+ }
25209
+ this_5.addButtonAction(lstBtnAction, this_5.authorizeButtonKey, buttonText);
25210
+ };
25211
+ this_5 = this;
25212
+ try {
25213
+ for (lstBtnCustom_1 = __values(lstBtnCustom), lstBtnCustom_1_1 = lstBtnCustom_1.next(); !lstBtnCustom_1_1.done; lstBtnCustom_1_1 = lstBtnCustom_1.next()) {
25214
+ item = lstBtnCustom_1_1.value;
25215
+ _loop_7(item);
25216
+ }
25217
+ }
25218
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
25219
+ finally {
25220
+ try {
25221
+ if (lstBtnCustom_1_1 && !lstBtnCustom_1_1.done && (_f = lstBtnCustom_1.return)) _f.call(lstBtnCustom_1);
25222
+ }
25223
+ finally { if (e_15) throw e_15.error; }
25224
+ }
25225
+ return [4 /*yield*/, this.menuButtons({})];
25226
+ case 1:
25227
+ lstMenuButtons = (_d = _g.sent()) !== null && _d !== void 0 ? _d : [];
25228
+ if (lstMenuButtons.length) {
25229
+ lstMenuButtons.forEach(function (item) { return _this.addButtonAction(lstBtnAction, _this.authorizeButtonKey, item.label); });
25230
+ }
25231
+ buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
25232
+ ((_e = buttonSetting[this.authorizeButtonKey]) === null || _e === void 0 ? void 0 : _e.length) && buttonSetting[this.authorizeButtonKey].forEach(function (item) {
25233
+ var permissionItem = lstBtnAction.find(function (p) { return p.permissionCode == item.code; });
25234
+ if (permissionItem) {
25235
+ permissionItem.isAuthorize = true;
25236
+ permissionItem.id = item.id;
25237
+ }
25238
+ });
25239
+ this.buttonAuthorizeModel.data.dataSource = lstBtnAction;
25240
+ this.buttonAuthorizeModel.showEditForm = true;
25241
+ return [2 /*return*/];
25242
+ }
25243
+ });
25244
+ });
25245
+ };
25246
+ ListComponentBase.prototype.onShowFormSettingButton = function () {
25247
+ return __awaiter(this, void 0, void 0, function () {
25248
+ var _this = this;
25249
+ return __generator(this, function (_f) {
25250
+ this.checkedAll = true;
25251
+ this.handleCheckAll();
25252
+ setTimeout(function () {
25253
+ _this.handleShowFormSettingButton();
25254
+ }, 100);
25255
+ return [2 /*return*/];
25256
+ });
25257
+ });
25258
+ };
25259
+ ListComponentBase.prototype.setBtnReady = function (isReady) {
25260
+ this.isBtnReady = isReady;
25261
+ };
25262
+ ListComponentBase.prototype.addButtonAction = function (lstBtnAction, key, rawText, id) {
25263
+ id !== null && id !== void 0 ? id : (id = this._commonService.guid());
25264
+ var permissionCode = this._commonService.convertStringToUnSign(rawText).replace(/ /g, '_').toUpperCase();
25265
+ lstBtnAction.push(new ButtonAction({
25266
+ id: id,
25267
+ rawText: rawText,
25268
+ permissionCode: "[" + key + "]_[" + permissionCode + "]"
25269
+ }));
25270
+ };
25271
+ ListComponentBase.prototype.setAuthorizeButton = function (lstButtonTemplate) {
25272
+ var _a, _b;
25273
+ return __awaiter(this, void 0, void 0, function () {
25274
+ var filterPermission, lstPermissionCode, buttonSetting, lstMenuButton, lstMenuButtons;
25275
+ var _this = this;
25276
+ return __generator(this, function (_f) {
25277
+ switch (_f.label) {
25278
+ case 0:
25279
+ this.authorizeButtonKey = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
25280
+ if (i0.isDevMode()) {
25281
+ this.authorizeButtonKey = this.serviceCode.toUpperCase() + "_" + window.location.pathname.substring(1).toUpperCase();
25282
+ }
25283
+ filterPermission = [this.newFilter('code', exports.Operator.contain, "[" + this.authorizeButtonKey + "]")];
25284
+ return [4 /*yield*/, this._basePermissionService.getAllWithIgnore(filterPermission, 'code,id')];
25285
+ case 1:
25286
+ lstPermissionCode = (_a = (_f.sent()).data) !== null && _a !== void 0 ? _a : [];
25287
+ buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
25288
+ buttonSetting[this.authorizeButtonKey] = lstPermissionCode;
25289
+ this.lstButtonTemplate = lstButtonTemplate;
25290
+ if (!buttonSetting[this.authorizeButtonKey].length) {
25291
+ this.isBtnReady = true;
25292
+ return [2 /*return*/];
25293
+ }
25294
+ sessionStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE, JSON.stringify(buttonSetting));
25295
+ lstMenuButton = [];
25296
+ return [4 /*yield*/, this.menuButtons({})];
25297
+ case 2:
25298
+ lstMenuButtons = (_b = _f.sent()) !== null && _b !== void 0 ? _b : [];
25299
+ if (!lstMenuButtons.length) {
25300
+ this.isBtnReady = true;
25301
+ return [2 /*return*/];
25302
+ }
25303
+ lstMenuButtons.forEach(function (item) { return _this.addButtonAction(lstMenuButton, _this.authorizeButtonKey, item.label); });
25304
+ buttonSetting[this.authorizeButtonKey].forEach(function (item) {
25305
+ var itemBtnMenu = lstMenuButton.find(function (p) { return p.permissionCode == item.code; });
25306
+ if (itemBtnMenu) {
25307
+ _this.lstBtnAuthorizeMenu.push(itemBtnMenu);
25308
+ }
25309
+ });
25310
+ this.isBtnReady = true;
25311
+ this.handleTableRendered();
25312
+ return [2 /*return*/];
25313
+ }
25314
+ });
25315
+ });
25316
+ };
25317
+ ListComponentBase.prototype.handleCloseAuthorizeButtonForm = function () {
25318
+ this.checkedAll = false;
25319
+ this.handleCheckAll();
25320
+ this.buttonAuthorizeModel.showEditForm = false;
25321
+ };
25108
25322
  return ListComponentBase;
25109
25323
  }(ComponentBase));
25110
25324
  ListComponentBase.decorators = [
@@ -25117,6 +25331,7 @@
25117
25331
  ListComponentBase.propDecorators = {
25118
25332
  treeTable: [{ type: i0.ViewChild, args: ['treetable',] }],
25119
25333
  _table: [{ type: i0.ViewChild, args: [table.Table, { static: false },] }],
25334
+ lstButtonElement: [{ type: i0.ViewChildren, args: ['buttonBase',] }],
25120
25335
  container: [{ type: i0.ViewChild, args: ['container', { static: true },] }],
25121
25336
  iconToggleRowGroup: [{ type: i0.ViewChild, args: ['iconToggleRowGroup', { static: true },] }],
25122
25337
  iconToggleRowData: [{ type: i0.ViewChild, args: ['iconToggleRowData', { static: true },] }],
@@ -25380,7 +25595,7 @@
25380
25595
  { type: i0.Component, args: [{
25381
25596
  // tslint:disable-next-line: component-selector
25382
25597
  selector: 'crud-list',
25383
- template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\n [ngStyle]=\"_style\">\n <div class=\"ui-helper-clearfix crud-list-header-area\">\n <div *ngIf=\"!setting.hiddenSearch\">\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <ng-container *ngIf=\"!setting.useCommonSearch\">\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"setting.useCommonSearch && !hasTemplate('searchCustom')\"\n class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <div style=\"width: 100%;\">\n <common-search-form #commonSearch [parentSetting]=\"setting\" [parentModel]=\"model\"\n [templateFilter]=\"templateFilter\" [parentContext]=\"context\"\n [searchBoxTooltip]=\"setting.toolTipSearhBoxCommon\"\n (onClickSearch)=\"handleSearch($event)\"></common-search-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\n </h1>\n\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\n [ngTemplateOutletContext]=\"{\n crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\n <ng-container *ngIf=\"!paginationTemplate\">\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\n (onChangeLimitPage)=\"savePageSize()\">\n </paging-next-back-only>\n </ng-container>\n <ng-container *ngIf=\"paginationTemplate\">\n <ng-container [ngTemplateOutlet]=\"paginationTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"fit-content crud-list-body-area\">\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\n <ng-container>\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\n (click)=\"danhSoThuTuGroupLastest()\"></button>\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\n </ng-container>\n <ng-container *ngIf=\"setting.showExportWordSelectedItems\"\n [ngTemplateOutlet]=\"buttonExportWord\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenReorder\" [ngTemplateOutlet]=\"buttonReorder\">\n </ng-container>\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\n (click)=\"createShareLinkMultiple()\"></button>\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n </div>\n </ng-container>\n <div *ngIf=\"!setting.hiddenAdvanceSearch && !setting.useCommonSearch\"\n class=\"p-col-12 advance-search-container\"\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\n (onInit)=\"handleInitAdvanceSearch($event)\">\n </advance-search>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\n <div class=\"container-table-inner\">\n <ng-container *ngIf=\"!_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n </div>\n </ng-container>\n\n <div class=\"table-border-line --top\"></div>\n <div class=\"table-border-line --right\"></div>\n <div class=\"table-border-line --bottom\"></div>\n <div class=\"table-border-line --left\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\n (onDelete)=\"onDeleteSettings()\" (onCancel)=\"_showSettings = false\">\n</settings>\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\n (onCancel)=\"_showSettingsRowColor = false\">\n</settings-row>\n<!-- <workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\">\n</workflow-setting-dialog> -->\n<div #workflowSettingDialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\"></div>\n<tn-dialog #dialogWfSettingNew [visible]=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\n <div #workflowsettingnew></div>\n</tn-dialog>\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\n (onCancel)=\"_showSettingsPermission = false\">\n</entity-permission>\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\n</p-contextMenu>\n<tn-dialog #dialogProcessWorkflowForm [visible]=\"processWorkflowModel.showEditForm\" [header]=\"processWorkflowModel.header | translate\"\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"processWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%; padding: 1rem\">\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\n </process-workflow-form> -->\n <div #processWorkflowForm></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogChoYKienForm [visible]=\"choYKienModel.showEditForm\" [header]=\"choYKienModel.header | translate\"\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"choYKienModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\n (onCancel)=\"choYKienModel.showEditForm = false\">\n </cho-y-kien-form> -->\n <div #choYKienForm></div>\n </div>\n</tn-dialog>\n<tn-dialog [visible]=\"workflowHistoryModel.showEditForm\" [header]=\"workflowHistoryModel.header | translate\"\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\n </workflow-history-new> -->\n <div #workflowHistoryNew></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogDetailTask [visible]=\"detailTaskModel.showEditForm\" [header]=\"detailTaskModel.header | translate\"\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"detailTaskModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\n (onCancel)=\"detailTaskModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #detailTask></div>\n</tn-dialog>\n\n<tn-dialog #dialogPermissionSharing [visible]=\"permissionSharingModel.showEditForm\" [header]=\"permissionSharingModel.header | translate\"\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"permissionSharingModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\n </permission-sharing> -->\n <div #permissionSharing></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogWorkflowPermission [visible]=\"permissionListModel.showEditForm\" [header]=\"permissionListModel.header | translate\"\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"permissionListModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\n (onCancel)=\"permissionListModel.showEditForm = false\">\n </workflow-permission> -->\n <div #workflowPermission></div>\n </div>\n</tn-dialog>\n<!-- <workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\n</workflow-history-dialog> -->\n<div #workflowPermission *ngIf=\"showHistoryWorkflow\"></div>\n<tn-dialog #dialogstartWorkflow [visible]=\"startWorkflowModel.showEditForm\" [header]=\"startWorkflowModel.header | translate\"\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"startWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\n </start-workflow> -->\n <div #startWorkflow></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViecForm [visible]=\"congViecModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\n (onHide)=\"congViecModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #baseCongViecForm></div>\n</tn-dialog>\n<tn-dialog #dialog *ngIf=\"shareLinkModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"shareLinkModel.showEditForm = false\">\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </share-link-by-permission>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViec [visible]=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"attachedTaskModel.showEditForm = false\">\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\n <div #baseCongViec></div>\n</tn-dialog>\n<ng-template #tableGetGroupFieldFalse>\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\n [expandedRowKeys]=\"model.expandedRowKeys\" [(selection)]=\"model.selectedItems\"\n (onRowReorder)=\"handleRowOrdered($event)\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"rowExpansion; context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n</ng-template>\n<ng-template #tableGetGroupFieldTrue>\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\n (onChange)=\"handleCheckRowGroup(rowData)\">\n </p-checkbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!rowGroup\">\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\n <div class=\"container-row-group\">\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\n [class.sticky]=\"setting.stickyColumn\">\n <i style=\"margin-right:5px\"\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n <div class=\"content-row-group\">\n <ng-container *ngIf=\"!contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n </div>\n </a>\n </div>\n </td>\n </ng-container>\n <ng-container *ngIf=\"rowGroup\">\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n <after-view-checked></after-view-checked>\n</ng-template>\n<ng-template #baseColgroup let-columns>\n <colgroup>\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\n <col *ngIf=\"rowExpansion\" style=\"width: 2.5rem\" />\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\n </ng-container>\n <col *ngIf=\"enableReorderRow\" style=\"width: 30px\" />\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\n </colgroup>\n</ng-template>\n<ng-template #buttonAdd>\n <span [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.ADD]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.ADD]\">\n <button type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\n [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\n </span>\n</ng-template>\n<ng-template #buttonExport>\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\n</ng-template>\n<ng-template #buttonExportWord>\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\n label=\"In c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-word\"\n class=\"p-button-text p-button-success\" (click)=\"printByReadingHtml()\"></button>\n</ng-template>\n<ng-template #buttonDelete>\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.DELETE_MULTIPLE]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE_MULTIPLE]\" type=\"button\" pButton pRipple\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\n</ng-template>\n<ng-template #buttonReorder>\n <button\n *ngIf=\"showSaveReorder && enableReorderRow && (_sortField == setting.columnSetting.sortField || _sortDir == 0)\"\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.REORDER_SAVE]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.REORDER_SAVE]\" type=\"button\" pButton pRipple\n [label]=\"'L\u01B0u s\u1EAFp x\u1EBFp' | translate\" icon=\"pi pi-save\" class=\"p-button-text p-button-success\"\n (click)=\"saveReorder()\"></button>\n</ng-template>\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"title-row\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!hasTemplate('headerCheckbox') && !setting.useCommonSearch\" type=\"button\" pButton pRipple\n icon=\"pi pi-refresh\" class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"reload()\"></button>\n <p-triStateCheckbox *ngIf=\"setting.useCommonSearch\" [(ngModel)]=\"checkedAll\" binary=\"true\"\n (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\n (dblclick)=\"reload()\">\n {{ 'TT' |translate}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\n [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngIf=\"hasTemplate('trHeaderBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\" [pTooltip]=\"col.fullLabel\"\n tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\n [className]=\"col.isPinned && col.width ? col.class : ''\" [class.first-th]=\"i==0\" [escape]=\"false\"\n tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\" [tnSortableColumnDisabled]=\"!col.sort\">\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\n <ng-container *ngIf=\"col.sort || col.sortClient\">\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\n </ng-container>\n </th>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('trHeaderAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\n </tr>\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\n </ng-container>\n</ng-template>\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [className]=\"col.isPinned && col.width ? col.class + ' cell-header-filter center': 'cell-header-filter center'\">\n <ng-container *ngIf=\"col.allowFilter\">\n <ng-container *ngIf=\"col.templateFilter\">\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngSwitch]=\"col.dataType\">\n <ng-container *ngSwitchCase=\"'int'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'intWithoutMask'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'decimal'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'boolean'\">\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"filterText\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </tr>\n</ng-template>\n<ng-template #buttonBaseSetting>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <th class=\"center setting-cell column-function\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\n (click)=\"showSettings()\"></button>\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\n (click)=\"showSettingsWorkflowNew(dialogWfSettingNew)\"></button>\n <div *ngIf=\"setting.hiddenSetting && setting.hiddenSettingPermission && setting.hiddenSettingWorkflow\"\n class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n\n</ng-template>\n<ng-template #colFunctionHeader>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <ng-container *ngIf=\"setting.hiddenFilterRow\">\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!setting.hiddenFilterRow\">\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\n <div class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTh let-col>\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\n {{col.label}}\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n</ng-template>\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\n </p-checkbox>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\n {{rowData[fieldOrder]}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <td *ngIf=\"rowExpansion && !rowData.hidden[fieldColExpand]\" class=\"no-padding center row-expansion-toggle\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!hasTemplate('dynamicColBodys')\">\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodys')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodys')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </div>\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\n (click)=\"showListVersion(rowData)\"></button>\n <button *ngIf=\"!rowData.hiddenEdit\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.EDIT]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EDIT]\" type=\"button\" pButton pRipple\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\n (click)=\"edit(rowData)\"></button>\n <button *ngIf=\"!rowData.hiddenDelete\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.DELETE]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE]\" type=\"button\" pButton pRipple\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\n (click)=\"delete(rowData)\"></button>\n <ng-container *ngIf=\"!hiddenBtnFunction\">\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\" [disabled]=\"rowData.disableFunctionRow\"\n (click)=\"showContextMenu($event, rowData)\"></button>\n </ng-container>\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n </tr>\n <ng-container *ngIf=\"rowData.template\">\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\n }\"></ng-container>\n </ng-container>\n</ng-template>\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\n <td *ngIf=\"col && col.visible && col.field != 'function' && !rowData.hidden[col.field]\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\n <span *ngIf=\"col.pipe\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n {{rowData['pipe__' + col.field]}}\n </span>\n <span *ngIf=\"!col.pipe\" class=\"contentTd\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\n class=\"link-or-action\">\n <ng-container *ngIf=\"col.click\">\n <a href=\"javascript:;\" (click)=\"col.click(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container *ngIf=\"!col.click\">\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n </span>\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\" class=\"\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </span>\n </span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n</ng-template>\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\n let-expanded=\"expanded\">\n <ng-container *ngIf=\"col.template\">\n <ng-container [ngTemplateOutlet]=\"col.template\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.template\">\n <ng-container [ngSwitch]=\"col.dataType\">\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\n </span>\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\n [ngClass]=\"rowData[field]\"></i>\n </span>\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\n tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'int'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'intWithoutMask'\">\n {{rowData[field]}}\n </span>\n <span *ngSwitchCase=\"'currency'\">\n {{rowData[field] | currency:\"VND\"}}\n </span>\n <span *ngSwitchCase=\"'decimal'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'boolean'\">\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\n [disabled]=\"col.disableCheckBox\">\n </p-checkbox>\n </span>\n <span *ngSwitchCase=\"'html'\">\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\n </span>\n <span *ngSwitchCase=\"'metadataStatus'\">\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\n duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\n </span>\n <ng-container *ngSwitchCase=\"'fileUpload'\">\n <ng-container\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fileManager'\">\n <ng-container\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'string'\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"null\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentCellString let-rowData let-field=\"field\">\n <span>\n <!-- __sv: Short Value -->\n <ng-container *ngIf=\"rowData[field + '__sv']\">\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\n {{rowData[field + '__sv']}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\n tooltipPosition=\"top\">[...]</span>\n </ng-container>\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\n {{rowData[field]}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\n {{rowData[field]}}\n </ng-container>\n </span>\n</ng-template>\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n </a>\n</ng-template>\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n (click)=\"handleToggleRow(rowData, $event)\"></button>\n</ng-template>\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\n </ng-container>\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\n</ng-template>\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\n <div class=\"container-text-workflow\">\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\n (click)=\"showFormStartWorkflow(rowData, dialogstartWorkflow)\"></button>\n <ng-container *ngIf=\"rowData.__workflowCode\">\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData, dialogProcessWorkflowForm, dialogDetailTask, dialogChoYKienForm)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #viewHistory let-rowData=\"rowData\">\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\n</ng-template>\n<ng-template #containerSticky>\n <span class=\"fix-sticky top\"></span>\n <span class=\"fix-sticky right\"></span>\n <!-- <span class=\"fix-sticky bottom\"></span> -->\n <span class=\"fix-sticky left\"></span>\n</ng-template>\n<ng-template #sortIcon let-field=\"field\">\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\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>\n</ng-template>\n<ng-template #filterDropdown let-col=\"col\">\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\n (onChanged)=\"prepareSearch(col)\" (onHideSmartEvent)=\"onSearch()\"\n (onShow)=\"onShowFilterDropdownPanel($event)\" (onHide)=\"onHideFilterDropdownPanel($event)\"\n (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\n </div>\n</ng-template>\n<ng-template #filterText let-col=\"col\">\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\n </div>\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterNumber let-col=\"col\">\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\n [min]=\"col.min\" [max]=\"col.max\" [placeholder]=\"col.placeholder\" (change)=\"onSearch()\">\n </tn-number-picker-range>\n </div>\n <span\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] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\n tabindex=\"-1\">\n <i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterDate let-col=\"col\" let-control=\"control\">\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-datetime-picker-range #dateRange [control]=\"control\" (onChanged)=\"onChangeDateTime($event, col.field)\">\n </tn-datetime-picker-range>\n </div>\n <span\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] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\n class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterBoolean let-col=\"col\">\n <div class=\"filter-boolean-box\">\n <p-selectButton *ngIf=\"!col.minimizeFilter\"\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\n <ng-template let-item>\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\n </ng-template>\n </p-selectButton>\n <ng-container *ngIf=\"col.minimizeFilter\">\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\n class=\"btn-filter-boolean p-button-primary\"\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\n <file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingFileInstanceId\"\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </file-upload>\n\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [(ngModel)]=\"rowData.field\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </service-file-upload>\n</ng-template>\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [maxFileSize]=\"fileSetting.control.maxFileSize\"\n [inTaiLieu]=\"fileSetting.control.inTaiLieu\" [(value)]=\"rowData[field]\" [disabled]=\"fileSetting.control.disabled\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\"\n (uploaded)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.UPLOADED)\">\n </file-manager>\n</ng-template>",
25598
+ template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\n [ngStyle]=\"_style\">\n <div class=\"ui-helper-clearfix crud-list-header-area\">\n <div *ngIf=\"!setting.hiddenSearch\">\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <ng-container *ngIf=\"!setting.useCommonSearch\">\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"setting.useCommonSearch && !hasTemplate('searchCustom')\"\n class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <div style=\"width: 100%;\">\n <common-search-form #commonSearch [parentSetting]=\"setting\" [parentModel]=\"model\"\n [templateFilter]=\"templateFilter\" [parentContext]=\"context\"\n [searchBoxTooltip]=\"setting.toolTipSearhBoxCommon\"\n (onClickSearch)=\"handleSearch($event)\"></common-search-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\n </h1>\n\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\n [ngTemplateOutletContext]=\"{\n crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\n <ng-container *ngIf=\"!paginationTemplate\">\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\n (onChangeLimitPage)=\"savePageSize()\">\n </paging-next-back-only>\n </ng-container>\n <ng-container *ngIf=\"paginationTemplate\">\n <ng-container [ngTemplateOutlet]=\"paginationTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"fit-content crud-list-body-area\">\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\n <div *ngIf=\"!setting.hiddenToolbar && isBtnReady\" class=\"p-grid crudListToolbar\">\n <ng-container>\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\n (click)=\"danhSoThuTuGroupLastest()\"></button>\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\n </ng-container>\n <ng-container *ngIf=\"setting.showExportWordSelectedItems\"\n [ngTemplateOutlet]=\"buttonExportWord\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenReorder\" [ngTemplateOutlet]=\"buttonReorder\">\n </ng-container>\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\n (click)=\"createShareLinkMultiple()\"></button>\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n\n <ng-container *ngIf=\"isSuperUser\" [ngTemplateOutlet]=\"buttonAuthorize\">\n </ng-container>\n </div>\n </ng-container>\n <div *ngIf=\"!setting.hiddenAdvanceSearch && !setting.useCommonSearch\"\n class=\"p-col-12 advance-search-container\"\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\n (onInit)=\"handleInitAdvanceSearch($event)\">\n </advance-search>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\n <div class=\"container-table-inner\">\n <ng-container *ngIf=\"!_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n </div>\n </ng-container>\n\n <div class=\"table-border-line --top\"></div>\n <div class=\"table-border-line --right\"></div>\n <div class=\"table-border-line --bottom\"></div>\n <div class=\"table-border-line --left\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\n (onDelete)=\"onDeleteSettings()\" (onCancel)=\"_showSettings = false\">\n</settings>\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\n (onCancel)=\"_showSettingsRowColor = false\">\n</settings-row>\n<!-- <workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\">\n</workflow-setting-dialog> -->\n<div #workflowSettingDialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\"></div>\n<tn-dialog #dialogWfSettingNew [visible]=\"workflowSettingModel.showEditForm\"\n [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\" [popupSize]=\"workflowSettingModel.popupSize\"\n (onHide)=\"workflowSettingModel.showEditForm = false\">\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\n <div #workflowsettingnew></div>\n</tn-dialog>\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\n (onCancel)=\"_showSettingsPermission = false\">\n</entity-permission>\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\n</p-contextMenu>\n<tn-dialog #dialogProcessWorkflowForm [visible]=\"processWorkflowModel.showEditForm\"\n [header]=\"processWorkflowModel.header | translate\" [popupSize]=\"processWorkflowModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"processWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%; padding: 1rem\">\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\n </process-workflow-form> -->\n <div #processWorkflowForm></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogChoYKienForm [visible]=\"choYKienModel.showEditForm\" [header]=\"choYKienModel.header | translate\"\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"choYKienModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\n (onCancel)=\"choYKienModel.showEditForm = false\">\n </cho-y-kien-form> -->\n <div #choYKienForm></div>\n </div>\n</tn-dialog>\n<tn-dialog *ngIf=\"buttonAuthorizeModel.showEditForm\" #dialog [header]=\"buttonAuthorizeModel.header | translate\"\n [popupSize]=\"buttonAuthorizeModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"handleCloseAuthorizeButtonForm()\">\n <settings-authorize-button [authorizeButtonKey]=\"authorizeButtonKey\"\n [dataSource]=\"buttonAuthorizeModel.data.dataSource\"></settings-authorize-button>\n</tn-dialog>\n\n<tn-dialog [visible]=\"workflowHistoryModel.showEditForm\" [header]=\"workflowHistoryModel.header | translate\"\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\n </workflow-history-new> -->\n <div #workflowHistoryNew></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogDetailTask [visible]=\"detailTaskModel.showEditForm\" [header]=\"detailTaskModel.header | translate\"\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"detailTaskModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\n (onCancel)=\"detailTaskModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #detailTask></div>\n</tn-dialog>\n\n<tn-dialog #dialogPermissionSharing [visible]=\"permissionSharingModel.showEditForm\"\n [header]=\"permissionSharingModel.header | translate\" [popupSize]=\"permissionSharingModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"permissionSharingModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\n </permission-sharing> -->\n <div #permissionSharing></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogWorkflowPermission [visible]=\"permissionListModel.showEditForm\"\n [header]=\"permissionListModel.header | translate\" [popupSize]=\"permissionListModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"permissionListModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\n (onCancel)=\"permissionListModel.showEditForm = false\">\n </workflow-permission> -->\n <div #workflowPermission></div>\n </div>\n</tn-dialog>\n<!-- <workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\n</workflow-history-dialog> -->\n<div #workflowPermission *ngIf=\"showHistoryWorkflow\"></div>\n<tn-dialog #dialogstartWorkflow [visible]=\"startWorkflowModel.showEditForm\"\n [header]=\"startWorkflowModel.header | translate\" [popupSize]=\"startWorkflowModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"startWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\n </start-workflow> -->\n <div #startWorkflow></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViecForm [visible]=\"congViecModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\n (onHide)=\"congViecModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #baseCongViecForm></div>\n</tn-dialog>\n<tn-dialog #dialog *ngIf=\"shareLinkModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"shareLinkModel.showEditForm = false\">\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </share-link-by-permission>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViec [visible]=\"attachedTaskModel.showEditForm\"\n [header]=\"attachedTaskModel.header | translate\" [popupSize]=\"attachedTaskModel.popupSize\"\n [useDefaultScrollBar]=\"true\" (onHide)=\"attachedTaskModel.showEditForm = false\">\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\n <div #baseCongViec></div>\n</tn-dialog>\n<ng-template #tableGetGroupFieldFalse>\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\n [expandedRowKeys]=\"model.expandedRowKeys\" [(selection)]=\"model.selectedItems\"\n (onRowReorder)=\"handleRowOrdered($event)\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"rowExpansion; context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n</ng-template>\n<ng-template #tableGetGroupFieldTrue>\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\n (onChange)=\"handleCheckRowGroup(rowData)\">\n </p-checkbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!rowGroup\">\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\n <div class=\"container-row-group\">\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\n [class.sticky]=\"setting.stickyColumn\">\n <i style=\"margin-right:5px\"\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n <div class=\"content-row-group\">\n <ng-container *ngIf=\"!contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n </div>\n </a>\n </div>\n </td>\n </ng-container>\n <ng-container *ngIf=\"rowGroup\">\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n <after-view-checked></after-view-checked>\n</ng-template>\n<ng-template #baseColgroup let-columns>\n <colgroup>\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\n <col *ngIf=\"rowExpansion\" style=\"width: 2.5rem\" />\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\n </ng-container>\n <col *ngIf=\"enableReorderRow\" style=\"width: 30px\" />\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\n </colgroup>\n</ng-template>\n<ng-template #buttonAdd>\n <button #buttonBase appAuthorize type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\n class=\"p-button-text\" [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\n</ng-template>\n<ng-template #buttonExport>\n <button #buttonBase appAuthorize *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\" icon=\"fas fa-file-excel\" class=\"p-button-text p-button-success\"\n (click)=\"xuatCacMucDaChon()\"></button>\n</ng-template>\n<ng-template #buttonAuthorize>\n <button *ngIf=\"!setting.hiddenAuthorizeButton && authorizeButtonKey\" type=\"button\" pButton\n pRipple label=\"Ph\u00E2n quy\u1EC1n n\u00FAt\" icon=\"fas fa-tools\" class=\"p-button-text\"\n (click)=\"onShowFormSettingButton()\"></button>\n</ng-template>\n\n<ng-template #buttonExportWord>\n <button #buttonBase appAuthorize *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple label=\"In c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\"\n icon=\"fas fa-file-word\" class=\"p-button-text p-button-success\" (click)=\"printByReadingHtml()\"></button>\n</ng-template>\n<ng-template #buttonDelete>\n <button #buttonBase *ngIf=\"(!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete())\"\n appAuthorize type=\"button\" pButton pRipple label=\"X\u00F3a c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\" icon=\"pi pi-trash\"\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\n</ng-template>\n<ng-template #buttonReorder>\n <button #buttonBase\n *ngIf=\"showSaveReorder && enableReorderRow && (_sortField == setting.columnSetting.sortField || _sortDir == 0)\"\n appAuthorize type=\"button\" pButton pRipple label=\"L\u01B0u s\u1EAFp x\u1EBFp\" icon=\"pi pi-save\"\n class=\"p-button-text p-button-success\" (click)=\"saveReorder()\"></button>\n</ng-template>\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"title-row\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!hasTemplate('headerCheckbox') && !setting.useCommonSearch\" type=\"button\" pButton pRipple\n icon=\"pi pi-refresh\" class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"reload()\"></button>\n <p-triStateCheckbox *ngIf=\"setting.useCommonSearch\" [(ngModel)]=\"checkedAll\" binary=\"true\"\n (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\n (dblclick)=\"reload()\">\n {{ 'TT' |translate}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\n [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngIf=\"hasTemplate('trHeaderBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\" [pTooltip]=\"col.fullLabel\"\n tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\n [className]=\"col.isPinned && col.width ? col.class : ''\" [class.first-th]=\"i==0\" [escape]=\"false\"\n tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\" [tnSortableColumnDisabled]=\"!col.sort\">\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\n <ng-container *ngIf=\"col.sort || col.sortClient\">\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\n </ng-container>\n </th>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('trHeaderAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\n </tr>\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\n </ng-container>\n</ng-template>\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [className]=\"col.isPinned && col.width ? col.class + ' cell-header-filter center': 'cell-header-filter center'\">\n <ng-container *ngIf=\"col.allowFilter\">\n <ng-container *ngIf=\"col.templateFilter\">\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngSwitch]=\"col.dataType\">\n <ng-container *ngSwitchCase=\"'int'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'intWithoutMask'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'decimal'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'boolean'\">\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"filterText\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </tr>\n</ng-template>\n<ng-template #buttonBaseSetting>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <th class=\"center setting-cell column-function\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\n (click)=\"showSettings()\"></button>\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\n (click)=\"showSettingsWorkflowNew(dialogWfSettingNew)\"></button>\n <div *ngIf=\"setting.hiddenSetting && setting.hiddenSettingPermission && setting.hiddenSettingWorkflow\"\n class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n\n</ng-template>\n<ng-template #colFunctionHeader>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <ng-container *ngIf=\"setting.hiddenFilterRow\">\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!setting.hiddenFilterRow\">\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\n <div class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTh let-col>\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\n {{col.label}}\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n</ng-template>\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\n </p-checkbox>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\n {{rowData[fieldOrder]}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <td *ngIf=\"rowExpansion && !rowData.hidden[fieldColExpand]\" class=\"no-padding center row-expansion-toggle\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!hasTemplate('dynamicColBodys')\">\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodys')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodys')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </div>\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\n (click)=\"showListVersion(rowData)\"></button>\n <button #buttonBase *ngIf=\"!rowData.hiddenEdit\" appAuthorize type=\"button\" pButton pRipple\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\n (click)=\"edit(rowData)\"></button>\n <button #buttonBase *ngIf=\"!rowData.hiddenDelete\" appAuthorize type=\"button\" pButton pRipple\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\n (click)=\"delete(rowData)\"></button>\n <ng-container *ngIf=\"!hiddenBtnFunction\">\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\" [disabled]=\"rowData.disableFunctionRow\"\n (click)=\"showContextMenu($event, rowData)\"></button>\n </ng-container>\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n </tr>\n <ng-container *ngIf=\"rowData.template\">\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\n }\"></ng-container>\n </ng-container>\n</ng-template>\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\n <td *ngIf=\"col && col.visible && col.field != 'function' && !rowData.hidden[col.field]\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\n <span *ngIf=\"col.pipe\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n {{rowData['pipe__' + col.field]}}\n </span>\n <span *ngIf=\"!col.pipe\" class=\"contentTd\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\n class=\"link-or-action\">\n <ng-container *ngIf=\"col.click\">\n <a href=\"javascript:;\" (click)=\"col.click(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container *ngIf=\"!col.click\">\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n </span>\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\" class=\"\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </span>\n </span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n</ng-template>\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\n let-expanded=\"expanded\">\n <ng-container *ngIf=\"col.template\">\n <ng-container [ngTemplateOutlet]=\"col.template\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.template\">\n <ng-container [ngSwitch]=\"col.dataType\">\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\n </span>\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\n [ngClass]=\"rowData[field]\"></i>\n </span>\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\n tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'int'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'intWithoutMask'\">\n {{rowData[field]}}\n </span>\n <span *ngSwitchCase=\"'currency'\">\n {{rowData[field] | currency:\"VND\"}}\n </span>\n <span *ngSwitchCase=\"'decimal'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'boolean'\">\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\n [disabled]=\"col.disableCheckBox\">\n </p-checkbox>\n </span>\n <span *ngSwitchCase=\"'html'\">\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\n </span>\n <span *ngSwitchCase=\"'metadataStatus'\">\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\n duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\n </span>\n <ng-container *ngSwitchCase=\"'fileUpload'\">\n <ng-container\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fileManager'\">\n <ng-container\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'string'\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"null\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentCellString let-rowData let-field=\"field\">\n <span>\n <!-- __sv: Short Value -->\n <ng-container *ngIf=\"rowData[field + '__sv']\">\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\n {{rowData[field + '__sv']}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\n tooltipPosition=\"top\">[...]</span>\n </ng-container>\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\n {{rowData[field]}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\n {{rowData[field]}}\n </ng-container>\n </span>\n</ng-template>\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n </a>\n</ng-template>\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n (click)=\"handleToggleRow(rowData, $event)\"></button>\n</ng-template>\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\n </ng-container>\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\n</ng-template>\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\n <div class=\"container-text-workflow\">\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\n (click)=\"showFormStartWorkflow(rowData, dialogstartWorkflow)\"></button>\n <ng-container *ngIf=\"rowData.__workflowCode\">\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\n [disabled]=\"showingActionWorkflow\"\n (click)=\"showActionWorkflow($event, rowData, dialogProcessWorkflowForm, dialogDetailTask, dialogChoYKienForm)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #viewHistory let-rowData=\"rowData\">\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\n</ng-template>\n<ng-template #containerSticky>\n <span class=\"fix-sticky top\"></span>\n <span class=\"fix-sticky right\"></span>\n <!-- <span class=\"fix-sticky bottom\"></span> -->\n <span class=\"fix-sticky left\"></span>\n</ng-template>\n<ng-template #sortIcon let-field=\"field\">\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\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>\n</ng-template>\n<ng-template #filterDropdown let-col=\"col\">\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\n (onChanged)=\"prepareSearch(col)\" (onHideSmartEvent)=\"onSearch()\"\n (onShow)=\"onShowFilterDropdownPanel($event)\" (onHide)=\"onHideFilterDropdownPanel($event)\"\n (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\n </div>\n</ng-template>\n<ng-template #filterText let-col=\"col\">\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\n </div>\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterNumber let-col=\"col\">\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\n [min]=\"col.min\" [max]=\"col.max\" [placeholder]=\"col.placeholder\" (change)=\"onSearch()\">\n </tn-number-picker-range>\n </div>\n <span\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] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\n tabindex=\"-1\">\n <i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterDate let-col=\"col\" let-control=\"control\">\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-datetime-picker-range #dateRange [control]=\"control\" (onChanged)=\"onChangeDateTime($event, col.field)\">\n </tn-datetime-picker-range>\n </div>\n <span\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] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\n class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterBoolean let-col=\"col\">\n <div class=\"filter-boolean-box\">\n <p-selectButton *ngIf=\"!col.minimizeFilter\"\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\n <ng-template let-item>\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\n </ng-template>\n </p-selectButton>\n <ng-container *ngIf=\"col.minimizeFilter\">\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\n class=\"btn-filter-boolean p-button-primary\"\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\n <file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingFileInstanceId\"\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </file-upload>\n\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [(ngModel)]=\"rowData.field\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </service-file-upload>\n</ng-template>\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [maxFileSize]=\"fileSetting.control.maxFileSize\"\n [inTaiLieu]=\"fileSetting.control.inTaiLieu\" [(value)]=\"rowData[field]\" [disabled]=\"fileSetting.control.disabled\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\"\n (uploaded)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.UPLOADED)\">\n </file-manager>\n</ng-template>",
25384
25599
  providers: [i3.DecimalPipe, i3.DatePipe],
25385
25600
  styles: [".container-table{display:flex;overflow:hidden;flex-direction:column}.container-table .container-table-inner{display:flex;position:relative;height:auto;max-height:100%;min-height:60px}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{top:0;left:0;right:0;bottom:0;margin:auto;position:absolute;display:flex;flex-wrap:wrap;width:1.4em;height:1.4em;border:1px solid #d1d1d1;border-radius:2px;cursor:pointer}.pick-color-row>div{flex:0 0 50%;background:#84d140;border:1px solid #fff}.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{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.group-icon{font-weight:400;color:#256aa2}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{position:absolute;left:0;top:0;width:5px;height:100%}.column-function{min-width:100px;padding:0}.custom-search-area{margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em;background-color:#f2f2f2}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{display:flex;align-items:center;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem!important;width:2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;white-space:nowrap;font-weight:700}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{width:26px;height:26px}.btn-filter-boolean:not(.p-button-primary),.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;color:#6c757d;border-color:#ced4da}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .main-title>*>h1{font-size:1.2em}::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{z-index:10;position:fixed;min-width:200px}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{position:absolute;width:0;height: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{display:flex;min-width:0;background-color:#fff;border-radius:3px}::ng-deep crud-list .cell-header-filter .filter-box>div{flex:1;border:1px solid #ced4da;border-right:none;border-radius:3px 0 0 3px;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{cursor:pointer;min-width:unset;flex-basis:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:#f5f6f8;color:#6c757d;border:1px solid #ced4da;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{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::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{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;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{position:absolute;top:calc(50% - 16px);min-width:250px;z-index:2;box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763)}::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{flex:1;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;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{position:absolute;z-index:5;background-color:#eee}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{left:0;right:0;height:1px}::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 .custom-search-area .main-container-search-inner .container-control{overflow:hidden;padding-bottom:0}::ng-deep crud-list>p-contextmenu{display:none}::ng-deep crud-list .contentTd{overflow:hidden;display:-webkit-box;-webkit-line-clamp:7;-webkit-box-orient:vertical}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
25386
25601
  },] }
@@ -25693,6 +25908,7 @@
25693
25908
  _this.hasCrudList = true;
25694
25909
  _this.customGetData = false;
25695
25910
  _this.readyToTrinhKy = false;
25911
+ _this.showAllButtons = false;
25696
25912
  _this.plusUrl = '';
25697
25913
  _this.dataSearchCommon = {};
25698
25914
  _this.popupSizeMax = new PopupSize({ maximize: true });
@@ -25791,7 +26007,7 @@
25791
26007
  };
25792
26008
  ListBase.prototype.mergeInfoToColumnSchema = function () {
25793
26009
  var _this = this;
25794
- var i = 0, constWidth = 83, sumWidth = 0, widthColBefore = 0; // 83 tổng chiều dài checkbox + stt crud-list
26010
+ var i = 0, constWidth = 83, sumWidth = 0, widthColBefore = 0; // 83 tổng chiều dài checkbox + stt crud-list
25795
26011
  if (this.setting.hiddenCheckbox)
25796
26012
  constWidth -= 35;
25797
26013
  if (this.setting.hiddenOrderColumn)
@@ -26119,6 +26335,7 @@
26119
26335
  ListBase.prototype.processGetData = function (response) {
26120
26336
  return __awaiter(this, void 0, void 0, function () {
26121
26337
  var _a, dataSource, rawDataSource, resetSelectedItems;
26338
+ var _this = this;
26122
26339
  return __generator(this, function (_b) {
26123
26340
  switch (_b.label) {
26124
26341
  case 0:
@@ -26154,11 +26371,26 @@
26154
26371
  // this._getRefDataDropdown(this.model.dataSource);
26155
26372
  // K dùng hàm ở trên vì đối với tree list thì model.dataSource đã bị tái cấu trúc
26156
26373
  this._getRefDataDropdown(rawDataSource);
26374
+ setTimeout(function () {
26375
+ _this.setAuthorizeButtons();
26376
+ }, 10);
26157
26377
  return [2 /*return*/];
26158
26378
  }
26159
26379
  });
26160
26380
  });
26161
26381
  };
26382
+ ListBase.prototype.setAuthorizeButtons = function () {
26383
+ return __awaiter(this, void 0, void 0, function () {
26384
+ return __generator(this, function (_a) {
26385
+ if (this.setting.hiddenAuthorizeButton) {
26386
+ this.crudList.setBtnReady(true);
26387
+ return [2 /*return*/];
26388
+ }
26389
+ this.crudList.setAuthorizeButton(this.lstButtonElement['_results']);
26390
+ return [2 /*return*/];
26391
+ });
26392
+ });
26393
+ };
26162
26394
  ListBase.prototype.beforeRenderDataSource = function (datasource) {
26163
26395
  return datasource;
26164
26396
  };
@@ -26876,6 +27108,7 @@
26876
27108
  { type: Boolean }
26877
27109
  ]; };
26878
27110
  ListBase.propDecorators = {
27111
+ lstButtonElement: [{ type: i0.ViewChildren, args: ['button',] }],
26879
27112
  contentCrudList: [{ type: i0.ViewChild, args: [CrudListComponent,] }],
26880
27113
  contentTreeTable: [{ type: i0.ViewChild, args: [TreeTableComponent,] }],
26881
27114
  parentModel: [{ type: i0.Input }],
@@ -38351,10 +38584,11 @@
38351
38584
  ]; };
38352
38585
 
38353
38586
  var AuthorizeDirective = /** @class */ (function () {
38354
- function AuthorizeDirective(_el, _permissionService, _userService, _moduleConfigService) {
38587
+ function AuthorizeDirective(_el, _permissionService, _userService, _commonService, _moduleConfigService) {
38355
38588
  this._el = _el;
38356
38589
  this._permissionService = _permissionService;
38357
38590
  this._userService = _userService;
38591
+ this._commonService = _commonService;
38358
38592
  this._moduleConfigService = _moduleConfigService;
38359
38593
  this._permissionTypes = exports.PermissionTypes.CONTROL;
38360
38594
  this.ignoreAdmin = false;
@@ -38382,13 +38616,16 @@
38382
38616
  configurable: true
38383
38617
  });
38384
38618
  AuthorizeDirective.prototype.ngOnInit = function () {
38619
+ };
38620
+ AuthorizeDirective.prototype.ngAfterViewInit = function () {
38385
38621
  var _this = this;
38386
- if (!this.enableAuthorize) {
38387
- return;
38388
- }
38622
+ this.setAuthorizeButton();
38389
38623
  if (this._moduleCode) {
38390
38624
  this.appCode = this._moduleCode;
38391
38625
  }
38626
+ if (!this.enableAuthorize) {
38627
+ return;
38628
+ }
38392
38629
  var currentUser = this._userService.getCurrentUser();
38393
38630
  if (!currentUser || !(this.appCode)) {
38394
38631
  console.log('Không đọc được user hoặc appCode');
@@ -38420,6 +38657,31 @@
38420
38657
  }
38421
38658
  });
38422
38659
  };
38660
+ AuthorizeDirective.prototype.setAuthorizeButton = function () {
38661
+ var _a, _b, _c;
38662
+ var key = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
38663
+ if (i0.isDevMode()) {
38664
+ key = this.appCode + "_" + window.location.pathname.substring(1).toUpperCase();
38665
+ }
38666
+ // const componentName = this._element.closest(EnumProperties.CRUD_LIST)?.parentNode[EnumProperties.TAG_NAME];
38667
+ // if (componentName && !key.endsWith(componentName)) {
38668
+ // key += `_${componentName}`;
38669
+ // }
38670
+ var buttonText = (_b = (_a = this._element.getAttribute(exports.EnumProperties.LABEL)) !== null && _a !== void 0 ? _a : this._element.getAttribute(exports.EnumProperties.NG_REFLECT_TEXT)) !== null && _b !== void 0 ? _b : this._element.getAttribute(exports.EnumProperties.NG_REFLECT_LABEL);
38671
+ if (!buttonText) {
38672
+ this.enableAuthorize = false;
38673
+ return;
38674
+ }
38675
+ this.buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
38676
+ var permissionCode = "[" + key + "]_[" + this._commonService.convertStringToUnSign(buttonText).replace(/ /g, '_').toUpperCase() + "]";
38677
+ var isSetAuthorize = (_c = this.buttonSetting[key]) === null || _c === void 0 ? void 0 : _c.find(function (p) { return p.code == permissionCode; });
38678
+ if (isSetAuthorize) {
38679
+ this.permission = permissionCode;
38680
+ }
38681
+ else {
38682
+ this.enableAuthorize = false;
38683
+ }
38684
+ };
38423
38685
  AuthorizeDirective.prototype.ngAfterContentChecked = function () {
38424
38686
  if (this._label && !this._bind && this._element.innerHTML !== '' && this.keepHTML) {
38425
38687
  this._label.innerHTML = this._element.innerHTML;
@@ -38438,6 +38700,7 @@
38438
38700
  { type: i0.ElementRef },
38439
38701
  { type: PermissionService },
38440
38702
  { type: UserService },
38703
+ { type: CommonService },
38441
38704
  { type: ModuleConfigService }
38442
38705
  ]; };
38443
38706
  AuthorizeDirective.propDecorators = {
@@ -49749,6 +50012,174 @@
49749
50012
  parentSetting: [{ type: i0.Input }]
49750
50013
  };
49751
50014
 
50015
+ var SettingAuthorizeButtonComponent = /** @class */ (function (_super) {
50016
+ __extends(SettingAuthorizeButtonComponent, _super);
50017
+ function SettingAuthorizeButtonComponent(_injector, _basePermissionService, _moduleConfigService) {
50018
+ var _this = _super.call(this, _injector) || this;
50019
+ _this._injector = _injector;
50020
+ _this._basePermissionService = _basePermissionService;
50021
+ _this._moduleConfigService = _moduleConfigService;
50022
+ _this.authorizeButtonKey = '';
50023
+ _this.dataSource = [];
50024
+ _this.appCode = '';
50025
+ return _this;
50026
+ }
50027
+ SettingAuthorizeButtonComponent.prototype.ngOnInit = function () {
50028
+ this.appCode = this._moduleConfigService.getConfig().appCode;
50029
+ this.setting.baseService = this._basePermissionService;
50030
+ this.customGetData = true;
50031
+ this.setting.hiddenAdvanceSearch = true;
50032
+ this.setting.hiddenHeader = true;
50033
+ this.setting.heightType = exports.HeightType.dynamic;
50034
+ this.setting.hiddenOrderColumn = true;
50035
+ this.setting.hiddenFilterRow = true;
50036
+ this.setting.hiddenSettingWorkflow = true;
50037
+ this.setting.hiddenAuthorizeButton = true;
50038
+ this.setting.hiddenSettingPermission = true;
50039
+ this.setting.fixHeightTypeInDialog = false;
50040
+ this.setting.hiddenCheckbox = false;
50041
+ this.setting.showEditLink = false;
50042
+ this.setting.modelSchemas = [
50043
+ new ModelSchema({
50044
+ field: 'permissionCode',
50045
+ name: 'Mã',
50046
+ }),
50047
+ new ModelSchema({
50048
+ field: 'rawText',
50049
+ name: 'Tên',
50050
+ }),
50051
+ new ModelSchema({
50052
+ field: 'isAuthorize',
50053
+ name: 'Đã tạo quyền',
50054
+ }),
50055
+ new ModelSchema({
50056
+ field: 'ma1',
50057
+ name: 'Mã',
50058
+ }),
50059
+ ];
50060
+ this.setting.cols = [
50061
+ new ColumnSchemaBase({ field: 'permissionCode', sort: false, showEditLink: false }),
50062
+ new ColumnSchemaBase({ field: 'rawText', width: '230px', sort: false }),
50063
+ new ColumnSchemaBase({ field: 'isAuthorize', dataType: exports.DataType.boolean, width: '100px', sort: false }),
50064
+ ];
50065
+ _super.prototype.ngOnInit.call(this);
50066
+ };
50067
+ SettingAuthorizeButtonComponent.prototype.getDataCustom = function (gridInfo) {
50068
+ this.model.dataSource = this.dataSource;
50069
+ this.afterGetData();
50070
+ };
50071
+ SettingAuthorizeButtonComponent.prototype.addBasePermission = function (rowData) {
50072
+ return __awaiter(this, void 0, void 0, function () {
50073
+ var insertRes;
50074
+ return __generator(this, function (_a) {
50075
+ switch (_a.label) {
50076
+ case 0: return [4 /*yield*/, this._basePermissionService.post(rowData)];
50077
+ case 1:
50078
+ insertRes = _a.sent();
50079
+ if (insertRes.success) {
50080
+ this._notifierService.showSuccess('Thêm quyền thành công');
50081
+ this.updateDataSource(insertRes.data);
50082
+ return [2 /*return*/];
50083
+ }
50084
+ this._notifierService.showWarning('Có lỗi trong quá trình xử lý, vui lòng thử lại');
50085
+ return [2 /*return*/];
50086
+ }
50087
+ });
50088
+ });
50089
+ };
50090
+ SettingAuthorizeButtonComponent.prototype.deleteBasePermission = function (rowData) {
50091
+ return __awaiter(this, void 0, void 0, function () {
50092
+ var _this = this;
50093
+ return __generator(this, function (_a) {
50094
+ this._notifierService.showConfirm('Xác nhận xóa quyền').then(function (res) { return __awaiter(_this, void 0, void 0, function () {
50095
+ var deleteRes;
50096
+ return __generator(this, function (_a) {
50097
+ switch (_a.label) {
50098
+ case 0:
50099
+ if (!res)
50100
+ return [2 /*return*/];
50101
+ return [4 /*yield*/, this._basePermissionService.delete(rowData.id)];
50102
+ case 1:
50103
+ deleteRes = _a.sent();
50104
+ if (deleteRes.success) {
50105
+ this._notifierService.showSuccess('Xóa quyền thành công');
50106
+ this.updateDataSource(rowData.id, true);
50107
+ return [2 /*return*/];
50108
+ }
50109
+ this._notifierService.showWarning(deleteRes.message);
50110
+ return [2 /*return*/];
50111
+ }
50112
+ });
50113
+ }); });
50114
+ return [2 /*return*/];
50115
+ });
50116
+ });
50117
+ };
50118
+ SettingAuthorizeButtonComponent.prototype.updateDataSource = function (id, isDeleted) {
50119
+ if (isDeleted === void 0) { isDeleted = false; }
50120
+ var currentRow = this.model.dataSource.find(function (p) { return p.id == id; });
50121
+ if (!currentRow)
50122
+ return;
50123
+ if (isDeleted) {
50124
+ currentRow.id = this._commonService.guid();
50125
+ }
50126
+ currentRow.isAuthorize = !isDeleted;
50127
+ this.afterGetData();
50128
+ };
50129
+ SettingAuthorizeButtonComponent.prototype.afterGetData = function () {
50130
+ return __awaiter(this, void 0, void 0, function () {
50131
+ var _this = this;
50132
+ return __generator(this, function (_a) {
50133
+ this._unmarkLoading();
50134
+ if (!this.model.dataSource.length)
50135
+ return [2 /*return*/];
50136
+ this.model.dataSource.forEach(function (item) {
50137
+ item.name = item.rawText;
50138
+ item.code = item.permissionCode;
50139
+ item.moduleCode = _this.appCode;
50140
+ });
50141
+ return [2 /*return*/];
50142
+ });
50143
+ });
50144
+ };
50145
+ SettingAuthorizeButtonComponent.prototype.ngOnDestroy = function () {
50146
+ var _this = this;
50147
+ var buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
50148
+ this.model.dataSource.forEach(function (rowData) {
50149
+ var buttonItem = buttonSetting[_this.authorizeButtonKey].find(function (p) { return p.code == rowData.code; });
50150
+ if (rowData.isAuthorize && !buttonItem) {
50151
+ buttonSetting[_this.authorizeButtonKey].push({
50152
+ id: rowData.id,
50153
+ code: rowData.code,
50154
+ });
50155
+ }
50156
+ else if (!rowData.isAuthorize && buttonItem) {
50157
+ var index = buttonSetting[_this.authorizeButtonKey].indexOf(buttonItem);
50158
+ buttonSetting[_this.authorizeButtonKey].splice(index, 1);
50159
+ }
50160
+ });
50161
+ sessionStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE, JSON.stringify(buttonSetting));
50162
+ };
50163
+ return SettingAuthorizeButtonComponent;
50164
+ }(DataListBase));
50165
+ SettingAuthorizeButtonComponent.decorators = [
50166
+ { type: i0.Component, args: [{
50167
+ selector: 'settings-authorize-button',
50168
+ template: "<crud-list #crudList [menuButtons]=\"getMenuButtons\" [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\n [hiddenAdd]=\"true\" [hiddenDelete]=\"true\" [hiddenCopyLink]=\"true\" (onReload)=\"_triggerProcessData($event)\"\n (onAdd)=\"_add($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_handleReloaded($event)\" (onCopyLink)=\"_copyLink($event)\"\n (onCopyLinkMultiple)=\"_copyLinkMultiple()\">\n <ng-template #function let-rowData=\"rowData\">\n <button *ngIf=\"!rowData.isAuthorize\" class=\"p-button-rounded p-button-text p-button-info link-or-action\"\n type=\"button\" pButton icon=\"pi pi-plus\" pTooltip=\"Th\u00EAm m\u1EDBi\" (click)=\"addBasePermission(rowData)\"></button>\n <button *ngIf=\"rowData.isAuthorize\"\n class=\"p-button-rounded p-button-text p-button-danger p-button-info link-or-action\" type=\"button\" pButton\n icon=\"pi pi-trash\" pTooltip=\"X\u00F3a\" (click)=\"deleteBasePermission(rowData)\"></button>\n </ng-template>\n</crud-list>",
50169
+ providers: [ComponentContextService],
50170
+ styles: [""]
50171
+ },] }
50172
+ ];
50173
+ SettingAuthorizeButtonComponent.ctorParameters = function () { return [
50174
+ { type: i0.Injector },
50175
+ { type: BasePermissionService },
50176
+ { type: ModuleConfigService }
50177
+ ]; };
50178
+ SettingAuthorizeButtonComponent.propDecorators = {
50179
+ authorizeButtonKey: [{ type: i0.Input }],
50180
+ dataSource: [{ type: i0.Input }]
50181
+ };
50182
+
49752
50183
  var SettingsComponent = /** @class */ (function (_super) {
49753
50184
  __extends(SettingsComponent, _super);
49754
50185
  function SettingsComponent(_injector, _domService, _userService) {
@@ -53815,6 +54246,7 @@
53815
54246
  TnAccordionTabComponent,
53816
54247
  SplashComponentComponent,
53817
54248
  SettingsWorkflowComponent,
54249
+ SettingAuthorizeButtonComponent,
53818
54250
  SettingsWorkflowNo1Component,
53819
54251
  CommonLibComponent
53820
54252
  ];
@@ -54022,6 +54454,7 @@
54022
54454
  exports.BaseModule = BaseModule;
54023
54455
  exports.BaseService = BaseService;
54024
54456
  exports.BooleanFormatPipe = BooleanFormatPipe;
54457
+ exports.ButtonAction = ButtonAction;
54025
54458
  exports.ButtonControlSchema = ButtonControlSchema;
54026
54459
  exports.ButtonPermission = ButtonPermission;
54027
54460
  exports.ButtonPermissions = ButtonPermissions;
@@ -54499,7 +54932,9 @@
54499
54932
  exports["ɵdt"] = CheckReadyComponent;
54500
54933
  exports["ɵdu"] = TnAccordionTabComponent;
54501
54934
  exports["ɵdv"] = SettingsWorkflowComponent;
54502
- exports["ɵdw"] = SettingsWorkflowNo1Component;
54935
+ exports["ɵdw"] = SettingAuthorizeButtonComponent;
54936
+ exports["ɵdx"] = BasePermissionService;
54937
+ exports["ɵdy"] = SettingsWorkflowNo1Component;
54503
54938
  exports["ɵe"] = ListBase;
54504
54939
  exports["ɵf"] = ListComponentBase;
54505
54940
  exports["ɵg"] = TreeTableComponent;