tnx-shared 5.3.163 → 5.3.165

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 +943 -514
  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 -11
  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 -263
  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,18 +22695,12 @@
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) {
22619
- case 0:
22620
- this.filter_commonSearch = data.filters;
22621
- this.dataSearchCommon = data.dataForm;
22622
- return [4 /*yield*/, this.onSearched.emit(data)];
22623
- case 1:
22624
- _b.sent();
22625
- this.setting.pageSetting.page = 1;
22626
- this.getData();
22627
- return [2 /*return*/];
22628
- }
22698
+ return __generator(this, function (_f) {
22699
+ this.filter_commonSearch = data.filters;
22700
+ this.dataSearchCommon = data.dataForm;
22701
+ this.setting.pageSetting.page = 1;
22702
+ this.getData();
22703
+ return [2 /*return*/];
22629
22704
  });
22630
22705
  });
22631
22706
  };
@@ -22659,17 +22734,17 @@
22659
22734
  if (isTree === void 0) { isTree = false; }
22660
22735
  return __awaiter(this, void 0, void 0, function () {
22661
22736
  var rs;
22662
- return __generator(this, function (_b) {
22663
- switch (_b.label) {
22737
+ return __generator(this, function (_f) {
22738
+ switch (_f.label) {
22664
22739
  case 0:
22665
22740
  if (!this.setting.showConfirmExport) return [3 /*break*/, 2];
22666
22741
  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
22742
  case 1:
22668
- rs = _b.sent();
22743
+ rs = _f.sent();
22669
22744
  if (!rs) {
22670
22745
  return [2 /*return*/];
22671
22746
  }
22672
- _b.label = 2;
22747
+ _f.label = 2;
22673
22748
  case 2:
22674
22749
  switch (this.setting.exportItemsMode) {
22675
22750
  case exports.ExportItemsMode.FromHtml:
@@ -22690,17 +22765,17 @@
22690
22765
  if (isTree === void 0) { isTree = false; }
22691
22766
  return __awaiter(this, void 0, void 0, function () {
22692
22767
  var rs, header, element, tableEle, headEle, bodyEle, arrHeadEle, arrRowData, strHeadEle, strBodyEle, css, table;
22693
- return __generator(this, function (_b) {
22694
- switch (_b.label) {
22768
+ return __generator(this, function (_f) {
22769
+ switch (_f.label) {
22695
22770
  case 0:
22696
22771
  if (!this.setting.showConfirmExport) return [3 /*break*/, 2];
22697
22772
  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
22773
  case 1:
22699
- rs = _b.sent();
22774
+ rs = _f.sent();
22700
22775
  if (!rs) {
22701
22776
  return [2 /*return*/];
22702
22777
  }
22703
- _b.label = 2;
22778
+ _f.label = 2;
22704
22779
  case 2:
22705
22780
  header = 'Danh sách ' + this.setting.objectName;
22706
22781
  element = isTree ? this.treeTable.el.nativeElement : this.table.el.nativeElement;
@@ -22884,25 +22959,25 @@
22884
22959
  };
22885
22960
  ListComponentBase.prototype.showContextMenu = function (evt, rowData) {
22886
22961
  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) {
22962
+ var _f, _g, shareButtons, showWorkflowAttach;
22963
+ var _h;
22964
+ return __generator(this, function (_j) {
22965
+ switch (_j.label) {
22891
22966
  case 0:
22892
22967
  this.rowDataCurrent = rowData;
22893
- _b = this;
22894
- _c = this.getMenuButtonAuthorized;
22968
+ _f = this;
22969
+ _g = this.getMenuButtonAuthorized;
22895
22970
  return [4 /*yield*/, this.menuButtons(rowData)];
22896
- case 1: return [4 /*yield*/, _c.apply(this, [_e.sent()])];
22971
+ case 1: return [4 /*yield*/, _g.apply(this, [_j.sent()])];
22897
22972
  case 2:
22898
- _b.buttonContexts = _e.sent();
22973
+ _f.buttonContexts = _j.sent();
22899
22974
  if (!this.setting.disableShare) {
22900
22975
  shareButtons = [
22901
22976
  { label: 'Chia sẻ', icon: 'pi pi-link', command: this.createShareLink.bind(this) },
22902
22977
  { label: 'Danh sách chia sẻ', icon: 'pi pi-list', command: this.showLinkSharing.bind(this) },
22903
22978
  // { label: 'Danh sách nhìn thấy', icon: 'pi pi-list', command: this.showListPermissionByItem.bind(this) }
22904
22979
  ];
22905
- (_d = this.buttonContexts).push.apply(_d, __spreadArray([], __read(shareButtons)));
22980
+ (_h = this.buttonContexts).push.apply(_h, __spreadArray([], __read(shareButtons)));
22906
22981
  }
22907
22982
  showWorkflowAttach = localStorage.getItem('__showWorkflowAttach');
22908
22983
  if (showWorkflowAttach == 'true') {
@@ -22924,20 +22999,22 @@
22924
22999
  ListComponentBase.prototype.getMenuButtonAuthorized = function (menuButtons) {
22925
23000
  return __awaiter(this, void 0, void 0, function () {
22926
23001
  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) {
23002
+ var e_6, _f;
23003
+ return __generator(this, function (_g) {
23004
+ switch (_g.label) {
22930
23005
  case 0:
22931
23006
  authorizedButtons = [];
22932
- serviceCodeByBase = this.setting.baseService != null ? this.setting.baseService.serviceCode : '';
23007
+ serviceCodeByBase = this.setting.baseService != null ? this.setting.baseService.serviceCode.toUpperCase() : '';
22933
23008
  promises = [];
22934
23009
  _loop_3 = function (item) {
22935
- if (!item.authorizationPermission) {
23010
+ var permission = this_2.lstBtnAuthorizeMenu.find(function (p) { return p.rawText == item.label; });
23011
+ if (!item.authorizationPermission && !permission) {
22936
23012
  authorizedButtons.push(item);
22937
23013
  return "continue";
22938
23014
  }
22939
23015
  var serviceCode = item.authorizationServiceCode ? item.authorizationServiceCode : serviceCodeByBase;
22940
- promises.push(this_2._permissionService.isAuthorized(serviceCode, item.authorizationPermission, true).then(function (authorized) {
23016
+ var permissionCode = permission ? permission.permissionCode : item.authorizationPermission;
23017
+ promises.push(this_2._permissionService.isAuthorized(serviceCode, permissionCode, true).then(function (authorized) {
22941
23018
  if (authorized !== true) {
22942
23019
  return;
22943
23020
  }
@@ -22954,13 +23031,13 @@
22954
23031
  catch (e_6_1) { e_6 = { error: e_6_1 }; }
22955
23032
  finally {
22956
23033
  try {
22957
- if (menuButtons_1_1 && !menuButtons_1_1.done && (_b = menuButtons_1.return)) _b.call(menuButtons_1);
23034
+ if (menuButtons_1_1 && !menuButtons_1_1.done && (_f = menuButtons_1.return)) _f.call(menuButtons_1);
22958
23035
  }
22959
23036
  finally { if (e_6) throw e_6.error; }
22960
23037
  }
22961
23038
  return [4 /*yield*/, Promise.all(promises)];
22962
23039
  case 1:
22963
- _c.sent();
23040
+ _g.sent();
22964
23041
  return [2 /*return*/, authorizedButtons];
22965
23042
  }
22966
23043
  });
@@ -23575,10 +23652,10 @@
23575
23652
  clearTimeout(this.timeout);
23576
23653
  };
23577
23654
  ListComponentBase.prototype.disableMultipleDelete = function () {
23578
- var e_7, _b;
23655
+ var e_7, _f;
23579
23656
  try {
23580
- for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
23581
- var item = _d.value;
23657
+ for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
23658
+ var item = _h.value;
23582
23659
  if (this.disableDelete(item)) {
23583
23660
  return true;
23584
23661
  }
@@ -23587,7 +23664,7 @@
23587
23664
  catch (e_7_1) { e_7 = { error: e_7_1 }; }
23588
23665
  finally {
23589
23666
  try {
23590
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
23667
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
23591
23668
  }
23592
23669
  finally { if (e_7) throw e_7.error; }
23593
23670
  }
@@ -23658,11 +23735,11 @@
23658
23735
  };
23659
23736
  ListComponentBase.prototype.processBaseData = function () {
23660
23737
  return __awaiter(this, void 0, void 0, function () {
23661
- return __generator(this, function (_b) {
23662
- switch (_b.label) {
23738
+ return __generator(this, function (_f) {
23739
+ switch (_f.label) {
23663
23740
  case 0: return [4 /*yield*/, this.preProcessData(this._rawDataSource)];
23664
23741
  case 1:
23665
- _b.sent();
23742
+ _f.sent();
23666
23743
  return [2 /*return*/];
23667
23744
  }
23668
23745
  });
@@ -23671,11 +23748,11 @@
23671
23748
  ListComponentBase.prototype.preProcessData = function (dataSource) {
23672
23749
  return __awaiter(this, void 0, void 0, function () {
23673
23750
  var colHasPipe, _loop_4, this_3, colHasPipe_1, colHasPipe_1_1, col;
23674
- var e_8, _b;
23675
- return __generator(this, function (_c) {
23751
+ var e_8, _f;
23752
+ return __generator(this, function (_g) {
23676
23753
  colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
23677
23754
  _loop_4 = function (col) {
23678
- var e_9, _d;
23755
+ var e_9, _h;
23679
23756
  var _loop_5 = function (item) {
23680
23757
  this_3.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
23681
23758
  item["pipe__" + col.field + " "] = rs;
@@ -23690,7 +23767,7 @@
23690
23767
  catch (e_9_1) { e_9 = { error: e_9_1 }; }
23691
23768
  finally {
23692
23769
  try {
23693
- if (dataSource_1_1 && !dataSource_1_1.done && (_d = dataSource_1.return)) _d.call(dataSource_1);
23770
+ if (dataSource_1_1 && !dataSource_1_1.done && (_h = dataSource_1.return)) _h.call(dataSource_1);
23694
23771
  }
23695
23772
  finally { if (e_9) throw e_9.error; }
23696
23773
  }
@@ -23705,7 +23782,7 @@
23705
23782
  catch (e_8_1) { e_8 = { error: e_8_1 }; }
23706
23783
  finally {
23707
23784
  try {
23708
- if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_b = colHasPipe_1.return)) _b.call(colHasPipe_1);
23785
+ if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_f = colHasPipe_1.return)) _f.call(colHasPipe_1);
23709
23786
  }
23710
23787
  finally { if (e_8) throw e_8.error; }
23711
23788
  }
@@ -23716,8 +23793,8 @@
23716
23793
  ListComponentBase.prototype.transform = function (pipe, asyncPipe, value) {
23717
23794
  return __awaiter(this, void 0, void 0, function () {
23718
23795
  var val, val;
23719
- return __generator(this, function (_b) {
23720
- switch (_b.label) {
23796
+ return __generator(this, function (_f) {
23797
+ switch (_f.label) {
23721
23798
  case 0:
23722
23799
  if (this.cachedTransforms[value]) {
23723
23800
  return [2 /*return*/, this.cachedTransforms[value]];
@@ -23725,7 +23802,7 @@
23725
23802
  if (!asyncPipe) return [3 /*break*/, 2];
23726
23803
  return [4 /*yield*/, pipe.transform(value)];
23727
23804
  case 1:
23728
- val = _b.sent();
23805
+ val = _f.sent();
23729
23806
  this.cachedTransforms[value] = val;
23730
23807
  return [2 /*return*/, val];
23731
23808
  case 2:
@@ -23881,7 +23958,7 @@
23881
23958
  }
23882
23959
  };
23883
23960
  ListComponentBase.prototype.getMinimizeData = function (model) {
23884
- var e_10, _b;
23961
+ var e_10, _f;
23885
23962
  if (isLiteralObject(model)) {
23886
23963
  if (model._dropdownvalue != null && model._dropdownvalue !== '') {
23887
23964
  return model[model._dropdownvalue];
@@ -23907,7 +23984,7 @@
23907
23984
  catch (e_10_1) { e_10 = { error: e_10_1 }; }
23908
23985
  finally {
23909
23986
  try {
23910
- if (model_1_1 && !model_1_1.done && (_b = model_1.return)) _b.call(model_1);
23987
+ if (model_1_1 && !model_1_1.done && (_f = model_1.return)) _f.call(model_1);
23911
23988
  }
23912
23989
  finally { if (e_10) throw e_10.error; }
23913
23990
  }
@@ -24042,8 +24119,8 @@
24042
24119
  };
24043
24120
  ListComponentBase.prototype.handleTableRendered = function () {
24044
24121
  return __awaiter(this, void 0, void 0, function () {
24045
- return __generator(this, function (_b) {
24046
- switch (_b.label) {
24122
+ return __generator(this, function (_f) {
24123
+ switch (_f.label) {
24047
24124
  case 0:
24048
24125
  if (this.table) {
24049
24126
  this._processAfterRendered(this.table.el.nativeElement);
@@ -24053,7 +24130,7 @@
24053
24130
  }
24054
24131
  return [4 /*yield*/, this.modifyButtonFunctionInRow()];
24055
24132
  case 1:
24056
- _b.sent();
24133
+ _f.sent();
24057
24134
  this.onReloaded.emit(true);
24058
24135
  return [2 /*return*/];
24059
24136
  }
@@ -24086,42 +24163,42 @@
24086
24163
  ListComponentBase.prototype.modifyButtonFunctionInRow = function () {
24087
24164
  var _a;
24088
24165
  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) {
24166
+ var _f, _g, rowData, total, _h, ex_1, e_11_1;
24167
+ var e_11, _j;
24168
+ return __generator(this, function (_k) {
24169
+ switch (_k.label) {
24093
24170
  case 0:
24094
- _g.trys.push([0, 8, 9, 10]);
24095
- _b = __values(this.model.dataSource), _c = _b.next();
24096
- _g.label = 1;
24171
+ _k.trys.push([0, 8, 9, 10]);
24172
+ _f = __values(this.model.dataSource), _g = _f.next();
24173
+ _k.label = 1;
24097
24174
  case 1:
24098
- if (!!_c.done) return [3 /*break*/, 7];
24099
- rowData = _c.value;
24100
- _g.label = 2;
24175
+ if (!!_g.done) return [3 /*break*/, 7];
24176
+ rowData = _g.value;
24177
+ _k.label = 2;
24101
24178
  case 2:
24102
- _g.trys.push([2, 5, , 6]);
24103
- _d = rowData;
24104
- _e = this.getMenuButtonAuthorized;
24179
+ _k.trys.push([2, 5, , 6]);
24180
+ _h = this.getMenuButtonAuthorized;
24105
24181
  return [4 /*yield*/, this.menuButtons(rowData)];
24106
- case 3: return [4 /*yield*/, _e.apply(this, [(_a = _g.sent()) !== null && _a !== void 0 ? _a : []])];
24182
+ case 3: return [4 /*yield*/, _h.apply(this, [(_a = _k.sent()) !== null && _a !== void 0 ? _a : []])];
24107
24183
  case 4:
24108
- _d.disableFunctionRow = (_g.sent()).length < 1 && this.setting.disableShare;
24184
+ total = (_k.sent());
24185
+ rowData.disableFunctionRow = total.length < 1 && this.setting.disableShare;
24109
24186
  return [3 /*break*/, 6];
24110
24187
  case 5:
24111
- ex_1 = _g.sent();
24188
+ ex_1 = _k.sent();
24112
24189
  this.hiddenBtnFunction = true;
24113
24190
  return [2 /*return*/];
24114
24191
  case 6:
24115
- _c = _b.next();
24192
+ _g = _f.next();
24116
24193
  return [3 /*break*/, 1];
24117
24194
  case 7: return [3 /*break*/, 10];
24118
24195
  case 8:
24119
- e_11_1 = _g.sent();
24196
+ e_11_1 = _k.sent();
24120
24197
  e_11 = { error: e_11_1 };
24121
24198
  return [3 /*break*/, 10];
24122
24199
  case 9:
24123
24200
  try {
24124
- if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
24201
+ if (_g && !_g.done && (_j = _f.return)) _j.call(_f);
24125
24202
  }
24126
24203
  finally { if (e_11) throw e_11.error; }
24127
24204
  return [7 /*endfinally*/];
@@ -24151,10 +24228,10 @@
24151
24228
  };
24152
24229
  ListComponentBase.prototype.createSearchSchema = function () {
24153
24230
  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) {
24231
+ var searchInfo, _f, _g, col, control, e_12_1, _loop_6, this_4, _h, _j, field;
24232
+ var e_12, _k, _l, e_13, _m;
24233
+ return __generator(this, function (_o) {
24234
+ switch (_o.label) {
24158
24235
  case 0:
24159
24236
  if (this.setting.cols == null) {
24160
24237
  return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
@@ -24164,14 +24241,14 @@
24164
24241
  searchInfo.schema = [];
24165
24242
  searchInfo.fieldDropdown = {};
24166
24243
  searchInfo.fieldSearchText = [];
24167
- _j.label = 1;
24244
+ _o.label = 1;
24168
24245
  case 1:
24169
- _j.trys.push([1, 6, 7, 8]);
24170
- _b = __values(this.setting.cols), _c = _b.next();
24171
- _j.label = 2;
24246
+ _o.trys.push([1, 6, 7, 8]);
24247
+ _f = __values(this.setting.cols), _g = _f.next();
24248
+ _o.label = 2;
24172
24249
  case 2:
24173
- if (!!_c.done) return [3 /*break*/, 5];
24174
- col = _c.value;
24250
+ if (!!_g.done) return [3 /*break*/, 5];
24251
+ col = _g.value;
24175
24252
  if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
24176
24253
  if (col.fullTextSearch) {
24177
24254
  if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
@@ -24184,9 +24261,9 @@
24184
24261
  }
24185
24262
  return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
24186
24263
  case 3:
24187
- control = _j.sent();
24264
+ control = _o.sent();
24188
24265
  if (control != null) {
24189
- (_g = searchInfo.schema).push.apply(_g, __spreadArray([], __read(control)));
24266
+ (_l = searchInfo.schema).push.apply(_l, __spreadArray([], __read(control)));
24190
24267
  }
24191
24268
  else {
24192
24269
  if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
@@ -24240,18 +24317,18 @@
24240
24317
  }
24241
24318
  }
24242
24319
  }
24243
- _j.label = 4;
24320
+ _o.label = 4;
24244
24321
  case 4:
24245
- _c = _b.next();
24322
+ _g = _f.next();
24246
24323
  return [3 /*break*/, 2];
24247
24324
  case 5: return [3 /*break*/, 8];
24248
24325
  case 6:
24249
- e_12_1 = _j.sent();
24326
+ e_12_1 = _o.sent();
24250
24327
  e_12 = { error: e_12_1 };
24251
24328
  return [3 /*break*/, 8];
24252
24329
  case 7:
24253
24330
  try {
24254
- if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
24331
+ if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
24255
24332
  }
24256
24333
  finally { if (e_12) throw e_12.error; }
24257
24334
  return [7 /*endfinally*/];
@@ -24271,15 +24348,15 @@
24271
24348
  };
24272
24349
  this_4 = this;
24273
24350
  try {
24274
- for (_d = __values(searchInfo.fieldSearchText), _e = _d.next(); !_e.done; _e = _d.next()) {
24275
- field = _e.value;
24351
+ for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
24352
+ field = _j.value;
24276
24353
  _loop_6(field);
24277
24354
  }
24278
24355
  }
24279
24356
  catch (e_13_1) { e_13 = { error: e_13_1 }; }
24280
24357
  finally {
24281
24358
  try {
24282
- if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
24359
+ if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
24283
24360
  }
24284
24361
  finally { if (e_13) throw e_13.error; }
24285
24362
  }
@@ -24317,8 +24394,8 @@
24317
24394
  ListComponentBase.prototype.getItemWorkflowSetting = function (setting, rowData) {
24318
24395
  return __awaiter(this, void 0, void 0, function () {
24319
24396
  var workflowSetting;
24320
- return __generator(this, function (_b) {
24321
- switch (_b.label) {
24397
+ return __generator(this, function (_f) {
24398
+ switch (_f.label) {
24322
24399
  case 0:
24323
24400
  workflowSetting = setting.workflowSettingNew;
24324
24401
  if (!(setting.isWorkflowTree
@@ -24326,8 +24403,8 @@
24326
24403
  && setting.workflowConfigAdvance.getWorkflowSetting)) return [3 /*break*/, 2];
24327
24404
  return [4 /*yield*/, setting.workflowConfigAdvance.getWorkflowSetting(rowData)];
24328
24405
  case 1:
24329
- workflowSetting = _b.sent();
24330
- _b.label = 2;
24406
+ workflowSetting = _f.sent();
24407
+ _f.label = 2;
24331
24408
  case 2:
24332
24409
  if (!workflowSetting || workflowSetting.workflows.length == 0) {
24333
24410
  return [2 /*return*/, this._notifierService.showWarning('Đối tượng chưa được cấu hình quy trình nghiệp vụ')];
@@ -24341,13 +24418,13 @@
24341
24418
  return __awaiter(this, void 0, void 0, function () {
24342
24419
  var workflowSetting, resultCheckExist, modelTask, contentLink, modelEntity, taskWorkflowSetting, compRef;
24343
24420
  var _this = this;
24344
- return __generator(this, function (_b) {
24345
- switch (_b.label) {
24421
+ return __generator(this, function (_f) {
24422
+ switch (_f.label) {
24346
24423
  case 0:
24347
24424
  rowData.__startingWorkflow = true;
24348
24425
  return [4 /*yield*/, this.getItemWorkflowSetting(this.setting, rowData)];
24349
24426
  case 1:
24350
- workflowSetting = _b.sent();
24427
+ workflowSetting = _f.sent();
24351
24428
  if (!workflowSetting) {
24352
24429
  rowData.__startingWorkflow = false;
24353
24430
  return [2 /*return*/];
@@ -24359,7 +24436,7 @@
24359
24436
  this.newFilter('entityKey', exports.Operator.equal, rowData.id)
24360
24437
  ])];
24361
24438
  case 2:
24362
- resultCheckExist = (_b.sent());
24439
+ resultCheckExist = (_f.sent());
24363
24440
  if (!resultCheckExist.success) {
24364
24441
  rowData.__startingWorkflow = false;
24365
24442
  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 +24448,8 @@
24371
24448
  if (!this.setting.modifyRowDataForTask) return [3 /*break*/, 4];
24372
24449
  return [4 /*yield*/, this.setting.modifyRowDataForTask(rowData)];
24373
24450
  case 3:
24374
- _b.sent();
24375
- _b.label = 4;
24451
+ _f.sent();
24452
+ _f.label = 4;
24376
24453
  case 4:
24377
24454
  modelTask = {
24378
24455
  id: this._commonService.guid(),
@@ -24387,7 +24464,7 @@
24387
24464
  };
24388
24465
  return [4 /*yield*/, this.getCopyPath(this.setting, rowData)];
24389
24466
  case 5:
24390
- contentLink = _b.sent();
24467
+ contentLink = _f.sent();
24391
24468
  if (contentLink) {
24392
24469
  modelEntity = this.parseAttachLink(contentLink);
24393
24470
  modelTask.dinhKemNghiepVuDtos = modelEntity;
@@ -24395,27 +24472,27 @@
24395
24472
  if (!this.setting.modifyItemTask) return [3 /*break*/, 7];
24396
24473
  return [4 /*yield*/, this.setting.modifyItemTask(modelTask, rowData)];
24397
24474
  case 6:
24398
- _b.sent();
24399
- _b.label = 7;
24475
+ _f.sent();
24476
+ _f.label = 7;
24400
24477
  case 7:
24401
24478
  if (!(workflowSetting.autoStartTask
24402
24479
  && workflowSetting.idLoaiCongViecDefault)) return [3 /*break*/, 9];
24403
24480
  return [4 /*yield*/, this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(workflowSetting.idLoaiCongViecDefault)];
24404
24481
  case 8:
24405
- taskWorkflowSetting = _b.sent();
24482
+ taskWorkflowSetting = _f.sent();
24406
24483
  if (taskWorkflowSetting != null && taskWorkflowSetting.workflowCode) {
24407
24484
  modelTask[FieldWorkflowCodeInCrudForm] = taskWorkflowSetting.workflowCode;
24408
24485
  this.insertTaskAndReload(modelTask, rowData, taskWorkflowSetting);
24409
24486
  rowData.__startingWorkflow = false;
24410
24487
  return [2 /*return*/];
24411
24488
  }
24412
- _b.label = 9;
24489
+ _f.label = 9;
24413
24490
  case 9: return [3 /*break*/, 14];
24414
24491
  case 10:
24415
24492
  if (!(workflowSetting.workflows.length == 1)) return [3 /*break*/, 12];
24416
24493
  return [4 /*yield*/, this.startWorkflow(rowData, workflowSetting.workflows[0])];
24417
24494
  case 11:
24418
- _b.sent();
24495
+ _f.sent();
24419
24496
  rowData.__startingWorkflow = false;
24420
24497
  return [2 /*return*/];
24421
24498
  case 12:
@@ -24424,13 +24501,13 @@
24424
24501
  rowData.__startingWorkflow = false;
24425
24502
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'StartWorkflowComponent', this.startWorkflowViewContainer)];
24426
24503
  case 13:
24427
- compRef = _b.sent();
24504
+ compRef = _f.sent();
24428
24505
  dialog.buttonTemplateInput = compRef.instance.buttonTemplate;
24429
24506
  compRef.workflows = workflowSetting.workflows;
24430
24507
  compRef.defaultWorkflow = workflowSetting.workflowCode;
24431
24508
  compRef.instance.onSaved.subscribe(function (event) { return _this.handleStartWorkflowFromDialog(event); });
24432
24509
  compRef.instance.onCancel.subscribe(function (event) { return _this.startWorkflowModel.showEditForm = false; });
24433
- _b.label = 14;
24510
+ _f.label = 14;
24434
24511
  case 14: return [2 /*return*/];
24435
24512
  }
24436
24513
  });
@@ -24476,25 +24553,25 @@
24476
24553
  };
24477
24554
  ListComponentBase.prototype.insertTaskAndReload = function (modelTask, rowData, workflowSetting) {
24478
24555
  return __awaiter(this, void 0, void 0, function () {
24479
- var _b;
24556
+ var _f;
24480
24557
  var _this = this;
24481
- return __generator(this, function (_c) {
24482
- switch (_c.label) {
24558
+ return __generator(this, function (_g) {
24559
+ switch (_g.label) {
24483
24560
  case 0:
24484
24561
  if (!this.setting.getDataForNextFirstStepTask) return [3 /*break*/, 2];
24485
- _b = modelTask;
24562
+ _f = modelTask;
24486
24563
  return [4 /*yield*/, this.setting.getDataForNextFirstStepTask(rowData)];
24487
24564
  case 1:
24488
- _b.itemWorkflowHistory = _c.sent();
24565
+ _f.itemWorkflowHistory = _g.sent();
24489
24566
  modelTask.itemWorkflowHistory = this.tongHopWorkflowHistoryForNextFirstStep(modelTask.itemWorkflowHistory, modelTask, workflowSetting, modelTask[FieldWorkflowCodeInCrudForm]);
24490
- _c.label = 2;
24567
+ _g.label = 2;
24491
24568
  case 2: return [4 /*yield*/, this._congViecService.post(modelTask)
24492
24569
  .then(function (res) { return _this.handleResponse(res, '', function (f) {
24493
24570
  _this.onStartedWorkflow.emit(rowData.id);
24494
24571
  _this.getData();
24495
24572
  }); })];
24496
24573
  case 3:
24497
- _c.sent();
24574
+ _g.sent();
24498
24575
  return [2 /*return*/];
24499
24576
  }
24500
24577
  });
@@ -24514,9 +24591,9 @@
24514
24591
  if (dialogDetailTask === void 0) { dialogDetailTask = null; }
24515
24592
  if (dialogChoYKienForm === void 0) { dialogChoYKienForm = null; }
24516
24593
  return __awaiter(this, void 0, void 0, function () {
24517
- var _b;
24518
- return __generator(this, function (_c) {
24519
- switch (_c.label) {
24594
+ var _f;
24595
+ return __generator(this, function (_g) {
24596
+ switch (_g.label) {
24520
24597
  case 0:
24521
24598
  if (this.showingActionWorkflow)
24522
24599
  return [2 /*return*/];
@@ -24525,10 +24602,10 @@
24525
24602
  this.dialogProcessWorkflowForm = dialogProcessWorkflowForm;
24526
24603
  this.dialogDetailTask = dialogDetailTask;
24527
24604
  this.dialogChoYKienForm = dialogChoYKienForm;
24528
- _b = this;
24605
+ _f = this;
24529
24606
  return [4 /*yield*/, this.getButtonContext(rowData)];
24530
24607
  case 1:
24531
- _b.buttonContexts = _c.sent();
24608
+ _f.buttonContexts = _g.sent();
24532
24609
  if (this.buttonContexts.length === 0) {
24533
24610
  return [2 /*return*/];
24534
24611
  }
@@ -24542,20 +24619,20 @@
24542
24619
  return __awaiter(this, void 0, void 0, function () {
24543
24620
  var resultGetActionWorkflow, buttonContexts;
24544
24621
  var _this = this;
24545
- return __generator(this, function (_b) {
24546
- switch (_b.label) {
24622
+ return __generator(this, function (_f) {
24623
+ switch (_f.label) {
24547
24624
  case 0:
24548
24625
  this.showingActionWorkflow = true;
24549
24626
  resultGetActionWorkflow = null;
24550
24627
  if (!(!this.setting.isWorkflowTree && this.setting.workflowSettingNew.createTaskInstead)) return [3 /*break*/, 2];
24551
24628
  return [4 /*yield*/, this.getActionWorkflowByTask(rowData, rowData.dialogHistory)];
24552
24629
  case 1:
24553
- resultGetActionWorkflow = _b.sent();
24630
+ resultGetActionWorkflow = _f.sent();
24554
24631
  return [3 /*break*/, 4];
24555
24632
  case 2: return [4 /*yield*/, this.getActionWorkflow(rowData)];
24556
24633
  case 3:
24557
- resultGetActionWorkflow = _b.sent();
24558
- _b.label = 4;
24634
+ resultGetActionWorkflow = _f.sent();
24635
+ _f.label = 4;
24559
24636
  case 4:
24560
24637
  this.showingActionWorkflow = false;
24561
24638
  if (!Array.isArray(resultGetActionWorkflow)) {
@@ -24579,11 +24656,11 @@
24579
24656
  ListComponentBase.prototype.getActionWorkflow = function (rowData) {
24580
24657
  return __awaiter(this, void 0, void 0, function () {
24581
24658
  var workflowSetting;
24582
- return __generator(this, function (_b) {
24583
- switch (_b.label) {
24659
+ return __generator(this, function (_f) {
24660
+ switch (_f.label) {
24584
24661
  case 0: return [4 /*yield*/, this.getItemWorkflowSetting(this.setting, rowData)];
24585
24662
  case 1:
24586
- workflowSetting = _b.sent();
24663
+ workflowSetting = _f.sent();
24587
24664
  if (!workflowSetting)
24588
24665
  return [2 /*return*/];
24589
24666
  return [2 /*return*/, this._getActionWorkflowBase(this.setting, rowData, workflowSetting)];
@@ -24593,21 +24670,21 @@
24593
24670
  };
24594
24671
  ListComponentBase.prototype.getActionWorkflowByTask = function (rowData, dialog) {
24595
24672
  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) {
24673
+ var _f, workflowPermissionDetailService, userService, result, workflowSetting, crudListSetting;
24674
+ return __generator(this, function (_g) {
24675
+ switch (_g.label) {
24599
24676
  case 0:
24600
24677
  if (!!rowData.__isGotCongViec) return [3 /*break*/, 2];
24601
- _b = rowData;
24678
+ _f = rowData;
24602
24679
  return [4 /*yield*/, this._congViecService.getDetailByFilter([
24603
24680
  this.newFilter('serviceCode', exports.Operator.equal, this.setting.baseService.serviceCode),
24604
24681
  this.newFilter('entity', exports.Operator.equal, this.setting.baseService.entityName),
24605
24682
  this.newFilter('entityKey', exports.Operator.equal, rowData.id)
24606
24683
  ])];
24607
24684
  case 1:
24608
- _b.__itemCongViec = (_c.sent()).data;
24685
+ _f.__itemCongViec = (_g.sent()).data;
24609
24686
  rowData.__isGotCongViec = true;
24610
- _c.label = 2;
24687
+ _g.label = 2;
24611
24688
  case 2:
24612
24689
  rowData = rowData.__itemCongViec;
24613
24690
  if (!rowData) {
@@ -24620,12 +24697,12 @@
24620
24697
  return [4 /*yield*/, workflowPermissionDetailService.changeEndpoint(this._congViecService)
24621
24698
  .appendInfoForWorkflow(userService.getUserIdCombine(), [rowData], 'id', this.setting.ignoreWorkflow)];
24622
24699
  case 3:
24623
- result = _c.sent();
24700
+ result = _g.sent();
24624
24701
  if (result !== true)
24625
24702
  return [2 /*return*/];
24626
24703
  return [4 /*yield*/, this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(rowData.idLoaiCongViec)];
24627
24704
  case 4:
24628
- workflowSetting = _c.sent();
24705
+ workflowSetting = _g.sent();
24629
24706
  if (workflowSetting == null)
24630
24707
  return [2 /*return*/];
24631
24708
  crudListSetting = new CrudListSetting();
@@ -24639,8 +24716,8 @@
24639
24716
  return __awaiter(this, void 0, void 0, function () {
24640
24717
  var buttonContexts, itemWorkflowSetting_1, actions_1, actionAllows, workflowHistoryService, userService, userId, userIdStringUpper, itemWorkflowHistoryLast;
24641
24718
  var _this = this;
24642
- return __generator(this, function (_b) {
24643
- switch (_b.label) {
24719
+ return __generator(this, function (_f) {
24720
+ switch (_f.label) {
24644
24721
  case 0:
24645
24722
  this.currentItem = rowData;
24646
24723
  this.buttonContexts = [];
@@ -24655,7 +24732,7 @@
24655
24732
  actions_1 = itemWorkflowSetting_1.data.actions[rowData.__trangThai];
24656
24733
  return [4 /*yield*/, crudListSetting.baseService.getActionAllow(rowData.id)];
24657
24734
  case 2:
24658
- actionAllows = (_b.sent()).data;
24735
+ actionAllows = (_f.sent()).data;
24659
24736
  if (actionAllows) {
24660
24737
  actionAllows.forEach(function (actionCode) {
24661
24738
  var action = actions_1.find(function (q) { return q.code == actionCode; });
@@ -24684,7 +24761,7 @@
24684
24761
  }
24685
24762
  return [4 /*yield*/, workflowHistoryService.changeEndpoint(crudListSetting.baseService).getLastByItemId(rowData.id)];
24686
24763
  case 3:
24687
- itemWorkflowHistoryLast = (_b.sent()).data;
24764
+ itemWorkflowHistoryLast = (_f.sent()).data;
24688
24765
  if (itemWorkflowHistoryLast
24689
24766
  && itemWorkflowHistoryLast.actionCode != MaActionBatDauQuyTrinh
24690
24767
  && itemWorkflowHistoryLast.userIdCreated.toUpperCase() == userIdStringUpper
@@ -24704,7 +24781,7 @@
24704
24781
  label: exports.ButtonTextActionCongViec.XEM_LICH_SU,
24705
24782
  command: function () { return _this.viewHistoryWorkflow(crudListSetting, rowData); }
24706
24783
  });
24707
- _b.label = 4;
24784
+ _f.label = 4;
24708
24785
  case 4: return [2 /*return*/, buttonContexts];
24709
24786
  }
24710
24787
  });
@@ -24714,13 +24791,13 @@
24714
24791
  return __awaiter(this, void 0, void 0, function () {
24715
24792
  var itemTask, taskFormModel, compRef;
24716
24793
  var _this = this;
24717
- return __generator(this, function (_b) {
24718
- switch (_b.label) {
24794
+ return __generator(this, function (_f) {
24795
+ switch (_f.label) {
24719
24796
  case 0: return [4 /*yield*/, this._congViecService.getDetailByFilter([
24720
24797
  this.newFilter('entityKey', exports.Operator.equal, rowData.id)
24721
24798
  ])];
24722
24799
  case 1:
24723
- itemTask = (_b.sent()).data;
24800
+ itemTask = (_f.sent()).data;
24724
24801
  if (itemTask == null) {
24725
24802
  return [2 /*return*/, this._notifierService.showWarning('Không tìm thấy công việc gắn với bản ghi')];
24726
24803
  }
@@ -24731,7 +24808,7 @@
24731
24808
  this.detailTaskModel.showEditForm = true;
24732
24809
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('congviec', 'BaseCongViecFormComponent', this.detailTaskViewContainer)];
24733
24810
  case 2:
24734
- compRef = _b.sent();
24811
+ compRef = _f.sent();
24735
24812
  if (this.dialogDetailTask) {
24736
24813
  this.dialogDetailTask.buttonTemplateInput = compRef.instance.buttonTemplate;
24737
24814
  }
@@ -24768,11 +24845,11 @@
24768
24845
  return __awaiter(this, void 0, void 0, function () {
24769
24846
  var workflowSetting, compRef;
24770
24847
  var _this = this;
24771
- return __generator(this, function (_b) {
24772
- switch (_b.label) {
24848
+ return __generator(this, function (_f) {
24849
+ switch (_f.label) {
24773
24850
  case 0: return [4 /*yield*/, this.getItemWorkflowSetting(crudListSetting, rowData)];
24774
24851
  case 1:
24775
- workflowSetting = _b.sent();
24852
+ workflowSetting = _f.sent();
24776
24853
  if (!workflowSetting)
24777
24854
  return [2 /*return*/];
24778
24855
  this.currentItem = rowData;
@@ -24782,7 +24859,7 @@
24782
24859
  this.workflowHistoryModel.showEditForm = true;
24783
24860
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowHistoryNewComponent', this.workflowHistoryNewViewContainer)];
24784
24861
  case 2:
24785
- compRef = _b.sent();
24862
+ compRef = _f.sent();
24786
24863
  compRef.instance.businessSetting = crudListSetting;
24787
24864
  compRef.instance.tableName = this.workflowHistoryModel.data.tableName;
24788
24865
  compRef.instance.item = rowData;
@@ -24800,8 +24877,8 @@
24800
24877
  return __awaiter(this, void 0, void 0, function () {
24801
24878
  var domainNewTab, compRef;
24802
24879
  var _this = this;
24803
- return __generator(this, function (_b) {
24804
- switch (_b.label) {
24880
+ return __generator(this, function (_f) {
24881
+ switch (_f.label) {
24805
24882
  case 0:
24806
24883
  if (workflowAction.openNewTab) {
24807
24884
  domainNewTab = workflowAction.domainNewTab;
@@ -24823,7 +24900,7 @@
24823
24900
  this.processWorkflowModel.header = workflowAction.name;
24824
24901
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'ProcessWorkflowFormComponent', this.processWorkflowFormViewContainer)];
24825
24902
  case 1:
24826
- compRef = _b.sent();
24903
+ compRef = _f.sent();
24827
24904
  if (this.dialogProcessWorkflowForm) {
24828
24905
  this.dialogProcessWorkflowForm.buttonTemplateInput = compRef.instance.buttonTemplate;
24829
24906
  }
@@ -24842,15 +24919,15 @@
24842
24919
  return __awaiter(this, void 0, void 0, function () {
24843
24920
  var compRef;
24844
24921
  var _this = this;
24845
- return __generator(this, function (_b) {
24846
- switch (_b.label) {
24922
+ return __generator(this, function (_f) {
24923
+ switch (_f.label) {
24847
24924
  case 0:
24848
24925
  this.choYKienModel.data.rowData = rowData;
24849
24926
  this.choYKienModel.data.setting = crudListSetting;
24850
24927
  this.choYKienModel.showEditForm = true;
24851
24928
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'ChoYKienFormComponent', this.choYKienFormViewContainer)];
24852
24929
  case 1:
24853
- compRef = _b.sent();
24930
+ compRef = _f.sent();
24854
24931
  if (this.dialogChoYKienForm) {
24855
24932
  this.dialogChoYKienForm.buttonTemplateInput = compRef.instance.buttonTemplate;
24856
24933
  }
@@ -24866,8 +24943,8 @@
24866
24943
  ListComponentBase.prototype.startWorkflow = function (rowData, workflow) {
24867
24944
  return __awaiter(this, void 0, void 0, function () {
24868
24945
  var _this = this;
24869
- return __generator(this, function (_b) {
24870
- switch (_b.label) {
24946
+ return __generator(this, function (_f) {
24947
+ switch (_f.label) {
24871
24948
  case 0: return [4 /*yield*/, this.setting.baseService.startWorkflow(rowData.id, workflow.code)
24872
24949
  .then(function (res) { return _this.handleResponse(res, 'Chạy quy trình thành công', function (f) {
24873
24950
  _this.onStartedWorkflow.emit(rowData.id);
@@ -24875,7 +24952,7 @@
24875
24952
  _this.getData();
24876
24953
  }); })];
24877
24954
  case 1:
24878
- _b.sent();
24955
+ _f.sent();
24879
24956
  return [2 /*return*/];
24880
24957
  }
24881
24958
  });
@@ -24900,7 +24977,7 @@
24900
24977
  ListComponentBase.prototype.createShareLink = function () {
24901
24978
  return __awaiter(this, void 0, void 0, function () {
24902
24979
  var rowData;
24903
- return __generator(this, function (_b) {
24980
+ return __generator(this, function (_f) {
24904
24981
  if (!this.setting.checkReadyToTrinhKy()) {
24905
24982
  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
24983
  }
@@ -24912,17 +24989,17 @@
24912
24989
  };
24913
24990
  ListComponentBase.prototype.createShareLinkMultiple = function () {
24914
24991
  return __awaiter(this, void 0, void 0, function () {
24915
- return __generator(this, function (_b) {
24992
+ return __generator(this, function (_f) {
24916
24993
  this.showShareLinkForm(this.model.selectedItems);
24917
24994
  return [2 /*return*/];
24918
24995
  });
24919
24996
  });
24920
24997
  };
24921
24998
  ListComponentBase.prototype.disableMultipleCopyLink = function () {
24922
- var e_14, _b;
24999
+ var e_14, _f;
24923
25000
  try {
24924
- for (var _c = __values(this.model.selectedItems), _d = _c.next(); !_d.done; _d = _c.next()) {
24925
- var item = _d.value;
25001
+ for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
25002
+ var item = _h.value;
24926
25003
  if (this.disableCopyLink(item)) {
24927
25004
  return true;
24928
25005
  }
@@ -24931,7 +25008,7 @@
24931
25008
  catch (e_14_1) { e_14 = { error: e_14_1 }; }
24932
25009
  finally {
24933
25010
  try {
24934
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
25011
+ if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
24935
25012
  }
24936
25013
  finally { if (e_14) throw e_14.error; }
24937
25014
  }
@@ -24951,7 +25028,7 @@
24951
25028
  };
24952
25029
  ListComponentBase.prototype.showSettingsPermission = function () {
24953
25030
  return __awaiter(this, void 0, void 0, function () {
24954
- return __generator(this, function (_b) {
25031
+ return __generator(this, function (_f) {
24955
25032
  if (this.creatingSearchInfo)
24956
25033
  return [2 /*return*/];
24957
25034
  this._showSettingsPermission = true;
@@ -24963,13 +25040,13 @@
24963
25040
  return __awaiter(this, void 0, void 0, function () {
24964
25041
  var compRef;
24965
25042
  var _this = this;
24966
- return __generator(this, function (_b) {
24967
- switch (_b.label) {
25043
+ return __generator(this, function (_f) {
25044
+ switch (_f.label) {
24968
25045
  case 0:
24969
25046
  this._showSettingsWorkflow = true;
24970
25047
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowSettingDialogComponent', this.workflowSettingDialogViewContainer)];
24971
25048
  case 1:
24972
- compRef = _b.sent();
25049
+ compRef = _f.sent();
24973
25050
  compRef.instance.parentSetting = this.setting;
24974
25051
  compRef.instance.parentContext = this.context;
24975
25052
  compRef.instance.parentModel = this.model;
@@ -24985,13 +25062,13 @@
24985
25062
  return __awaiter(this, void 0, void 0, function () {
24986
25063
  var compRef;
24987
25064
  var _this = this;
24988
- return __generator(this, function (_b) {
24989
- switch (_b.label) {
25065
+ return __generator(this, function (_f) {
25066
+ switch (_f.label) {
24990
25067
  case 0:
24991
25068
  this.workflowSettingModel.showEditForm = true;
24992
25069
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowSettingNewComponent', this.workflowsettingnewViewContainer)];
24993
25070
  case 1:
24994
- compRef = _b.sent();
25071
+ compRef = _f.sent();
24995
25072
  dialog.buttonTemplateInput = compRef.instance.buttonTemplate;
24996
25073
  compRef.instance.parentSetting = this.setting;
24997
25074
  compRef.instance.onSaved.subscribe(function (event) { return _this.onSaveWorkflowSettingsNew(null); });
@@ -25005,13 +25082,13 @@
25005
25082
  return __awaiter(this, void 0, void 0, function () {
25006
25083
  var compRef;
25007
25084
  var _this = this;
25008
- return __generator(this, function (_b) {
25009
- switch (_b.label) {
25085
+ return __generator(this, function (_f) {
25086
+ switch (_f.label) {
25010
25087
  case 0:
25011
25088
  this.permissionSharingModel.showEditForm = true;
25012
25089
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'PermissionSharingComponent', this.permissionSharingViewContainer)];
25013
25090
  case 1:
25014
- compRef = _b.sent();
25091
+ compRef = _f.sent();
25015
25092
  compRef.instance.item = this.rowDataCurrent;
25016
25093
  compRef.instance.baseService = this.setting.baseService;
25017
25094
  compRef.instance.onCancel.subscribe(function (event) { return _this.permissionSharingModel.showEditForm = false; });
@@ -25023,13 +25100,13 @@
25023
25100
  ListComponentBase.prototype.showAttachedTask = function () {
25024
25101
  return __awaiter(this, void 0, void 0, function () {
25025
25102
  var compRef;
25026
- return __generator(this, function (_b) {
25027
- switch (_b.label) {
25103
+ return __generator(this, function (_f) {
25104
+ switch (_f.label) {
25028
25105
  case 0:
25029
25106
  this.attachedTaskModel.showEditForm = true;
25030
25107
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('congviec', 'BaseCongViecComponent', this.baseCongViecViewContainer)];
25031
25108
  case 1:
25032
- compRef = _b.sent();
25109
+ compRef = _f.sent();
25033
25110
  compRef.instance.serviceCode = this.setting.baseService.serviceCode;
25034
25111
  compRef.instance.entity = this.setting.baseService.entityName;
25035
25112
  compRef.instance.itemIdAttach = this.rowDataCurrent.id;
@@ -25042,13 +25119,13 @@
25042
25119
  return __awaiter(this, void 0, void 0, function () {
25043
25120
  var compRef;
25044
25121
  var _this = this;
25045
- return __generator(this, function (_b) {
25046
- switch (_b.label) {
25122
+ return __generator(this, function (_f) {
25123
+ switch (_f.label) {
25047
25124
  case 0:
25048
25125
  this.permissionListModel.showEditForm = true;
25049
25126
  return [4 /*yield*/, this._federationService.loadRemoteNewComponent('commonapp', 'WorkflowPermissionComponent', this.workflowPermissionViewContainer)];
25050
25127
  case 1:
25051
- compRef = _b.sent();
25128
+ compRef = _f.sent();
25052
25129
  // this.dialogWorkflowPermission.buttonTemplateInput = compRef.instance.buttonTemplate;
25053
25130
  compRef.instance.item = this.rowDataCurrent;
25054
25131
  compRef.instance.businessSetting = this.setting;
@@ -25105,6 +25182,137 @@
25105
25182
  });
25106
25183
  });
25107
25184
  };
25185
+ ListComponentBase.prototype.handleShowFormSettingButton = function () {
25186
+ var _a, _b, _c, _d, _e;
25187
+ return __awaiter(this, void 0, void 0, function () {
25188
+ var lstBtnCustom, lstBtnAction, _loop_7, this_5, lstBtnCustom_1, lstBtnCustom_1_1, item, lstMenuButtons, buttonSetting;
25189
+ var e_15, _f;
25190
+ var _this = this;
25191
+ return __generator(this, function (_g) {
25192
+ switch (_g.label) {
25193
+ case 0:
25194
+ // Tổng hợp dữ liệu các nút từ ngTemplate + base + menuButton
25195
+ this.buttonAuthorizeModel.data.dataSource = [];
25196
+ lstBtnCustom = this.lstButtonElement[exports.EnumProperties.RESULTS].concat(this.lstButtonTemplate);
25197
+ lstBtnAction = [];
25198
+ _loop_7 = function (item) {
25199
+ 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;
25200
+ if (!buttonText || lstBtnAction.some(function (p) { return p.rawText === buttonText; })) {
25201
+ return "continue";
25202
+ }
25203
+ this_5.addButtonAction(lstBtnAction, this_5.authorizeButtonKey, buttonText);
25204
+ };
25205
+ this_5 = this;
25206
+ try {
25207
+ for (lstBtnCustom_1 = __values(lstBtnCustom), lstBtnCustom_1_1 = lstBtnCustom_1.next(); !lstBtnCustom_1_1.done; lstBtnCustom_1_1 = lstBtnCustom_1.next()) {
25208
+ item = lstBtnCustom_1_1.value;
25209
+ _loop_7(item);
25210
+ }
25211
+ }
25212
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
25213
+ finally {
25214
+ try {
25215
+ if (lstBtnCustom_1_1 && !lstBtnCustom_1_1.done && (_f = lstBtnCustom_1.return)) _f.call(lstBtnCustom_1);
25216
+ }
25217
+ finally { if (e_15) throw e_15.error; }
25218
+ }
25219
+ return [4 /*yield*/, this.menuButtons({})];
25220
+ case 1:
25221
+ lstMenuButtons = (_d = _g.sent()) !== null && _d !== void 0 ? _d : [];
25222
+ if (lstMenuButtons.length) {
25223
+ lstMenuButtons.forEach(function (item) { return _this.addButtonAction(lstBtnAction, _this.authorizeButtonKey, item.label); });
25224
+ }
25225
+ buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
25226
+ ((_e = buttonSetting[this.authorizeButtonKey]) === null || _e === void 0 ? void 0 : _e.length) && buttonSetting[this.authorizeButtonKey].forEach(function (item) {
25227
+ var permissionItem = lstBtnAction.find(function (p) { return p.permissionCode == item.code; });
25228
+ if (permissionItem) {
25229
+ permissionItem.isAuthorize = true;
25230
+ permissionItem.id = item.id;
25231
+ }
25232
+ });
25233
+ this.buttonAuthorizeModel.data.dataSource = lstBtnAction;
25234
+ this.buttonAuthorizeModel.showEditForm = true;
25235
+ return [2 /*return*/];
25236
+ }
25237
+ });
25238
+ });
25239
+ };
25240
+ ListComponentBase.prototype.onShowFormSettingButton = function () {
25241
+ return __awaiter(this, void 0, void 0, function () {
25242
+ var _this = this;
25243
+ return __generator(this, function (_f) {
25244
+ this.checkedAll = true;
25245
+ this.handleCheckAll();
25246
+ setTimeout(function () {
25247
+ _this.handleShowFormSettingButton();
25248
+ }, 100);
25249
+ return [2 /*return*/];
25250
+ });
25251
+ });
25252
+ };
25253
+ ListComponentBase.prototype.setBtnReady = function (isReady) {
25254
+ this.isBtnReady = isReady;
25255
+ };
25256
+ ListComponentBase.prototype.addButtonAction = function (lstBtnAction, key, rawText, id) {
25257
+ id !== null && id !== void 0 ? id : (id = this._commonService.guid());
25258
+ var permissionCode = this._commonService.convertStringToUnSign(rawText).replace(/ /g, '_').toUpperCase();
25259
+ lstBtnAction.push(new ButtonAction({
25260
+ id: id,
25261
+ rawText: rawText,
25262
+ permissionCode: "[" + key + "]_[" + permissionCode + "]"
25263
+ }));
25264
+ };
25265
+ ListComponentBase.prototype.setAuthorizeButton = function (lstButtonTemplate) {
25266
+ var _a, _b;
25267
+ return __awaiter(this, void 0, void 0, function () {
25268
+ var filterPermission, lstPermissionCode, buttonSetting, lstMenuButton, lstMenuButtons;
25269
+ var _this = this;
25270
+ return __generator(this, function (_f) {
25271
+ switch (_f.label) {
25272
+ case 0:
25273
+ this.authorizeButtonKey = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
25274
+ if (i0.isDevMode()) {
25275
+ this.authorizeButtonKey = this.serviceCode.toUpperCase() + "_" + window.location.pathname.substring(1).toUpperCase();
25276
+ }
25277
+ filterPermission = [this.newFilter('code', exports.Operator.contain, "[" + this.authorizeButtonKey + "]")];
25278
+ return [4 /*yield*/, this._basePermissionService.getAllWithIgnore(filterPermission, 'code,id')];
25279
+ case 1:
25280
+ lstPermissionCode = (_a = (_f.sent()).data) !== null && _a !== void 0 ? _a : [];
25281
+ buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
25282
+ buttonSetting[this.authorizeButtonKey] = lstPermissionCode;
25283
+ this.lstButtonTemplate = lstButtonTemplate;
25284
+ if (!buttonSetting[this.authorizeButtonKey].length) {
25285
+ this.isBtnReady = true;
25286
+ return [2 /*return*/];
25287
+ }
25288
+ sessionStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE, JSON.stringify(buttonSetting));
25289
+ lstMenuButton = [];
25290
+ return [4 /*yield*/, this.menuButtons({})];
25291
+ case 2:
25292
+ lstMenuButtons = (_b = _f.sent()) !== null && _b !== void 0 ? _b : [];
25293
+ if (!lstMenuButtons.length) {
25294
+ this.isBtnReady = true;
25295
+ return [2 /*return*/];
25296
+ }
25297
+ lstMenuButtons.forEach(function (item) { return _this.addButtonAction(lstMenuButton, _this.authorizeButtonKey, item.label); });
25298
+ buttonSetting[this.authorizeButtonKey].forEach(function (item) {
25299
+ var itemBtnMenu = lstMenuButton.find(function (p) { return p.permissionCode == item.code; });
25300
+ if (itemBtnMenu) {
25301
+ _this.lstBtnAuthorizeMenu.push(itemBtnMenu);
25302
+ }
25303
+ });
25304
+ this.isBtnReady = true;
25305
+ this.handleTableRendered();
25306
+ return [2 /*return*/];
25307
+ }
25308
+ });
25309
+ });
25310
+ };
25311
+ ListComponentBase.prototype.handleCloseAuthorizeButtonForm = function () {
25312
+ this.checkedAll = false;
25313
+ this.handleCheckAll();
25314
+ this.buttonAuthorizeModel.showEditForm = false;
25315
+ };
25108
25316
  return ListComponentBase;
25109
25317
  }(ComponentBase));
25110
25318
  ListComponentBase.decorators = [
@@ -25117,6 +25325,7 @@
25117
25325
  ListComponentBase.propDecorators = {
25118
25326
  treeTable: [{ type: i0.ViewChild, args: ['treetable',] }],
25119
25327
  _table: [{ type: i0.ViewChild, args: [table.Table, { static: false },] }],
25328
+ lstButtonElement: [{ type: i0.ViewChildren, args: ['buttonBase',] }],
25120
25329
  container: [{ type: i0.ViewChild, args: ['container', { static: true },] }],
25121
25330
  iconToggleRowGroup: [{ type: i0.ViewChild, args: ['iconToggleRowGroup', { static: true },] }],
25122
25331
  iconToggleRowData: [{ type: i0.ViewChild, args: ['iconToggleRowData', { static: true },] }],
@@ -25380,7 +25589,7 @@
25380
25589
  { type: i0.Component, args: [{
25381
25590
  // tslint:disable-next-line: component-selector
25382
25591
  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>",
25592
+ 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
25593
  providers: [i3.DecimalPipe, i3.DatePipe],
25385
25594
  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
25595
  },] }
@@ -25693,6 +25902,7 @@
25693
25902
  _this.hasCrudList = true;
25694
25903
  _this.customGetData = false;
25695
25904
  _this.readyToTrinhKy = false;
25905
+ _this.showAllButtons = false;
25696
25906
  _this.plusUrl = '';
25697
25907
  _this.dataSearchCommon = {};
25698
25908
  _this.popupSizeMax = new PopupSize({ maximize: true });
@@ -25791,7 +26001,7 @@
25791
26001
  };
25792
26002
  ListBase.prototype.mergeInfoToColumnSchema = function () {
25793
26003
  var _this = this;
25794
- var i = 0, constWidth = 83, sumWidth = 0, widthColBefore = 0; // 83 tổng chiều dài checkbox + stt crud-list
26004
+ var i = 0, constWidth = 83, sumWidth = 0, widthColBefore = 0; // 83 tổng chiều dài checkbox + stt crud-list
25795
26005
  if (this.setting.hiddenCheckbox)
25796
26006
  constWidth -= 35;
25797
26007
  if (this.setting.hiddenOrderColumn)
@@ -26119,6 +26329,7 @@
26119
26329
  ListBase.prototype.processGetData = function (response) {
26120
26330
  return __awaiter(this, void 0, void 0, function () {
26121
26331
  var _a, dataSource, rawDataSource, resetSelectedItems;
26332
+ var _this = this;
26122
26333
  return __generator(this, function (_b) {
26123
26334
  switch (_b.label) {
26124
26335
  case 0:
@@ -26154,11 +26365,26 @@
26154
26365
  // this._getRefDataDropdown(this.model.dataSource);
26155
26366
  // K dùng hàm ở trên vì đối với tree list thì model.dataSource đã bị tái cấu trúc
26156
26367
  this._getRefDataDropdown(rawDataSource);
26368
+ setTimeout(function () {
26369
+ _this.setAuthorizeButtons();
26370
+ }, 10);
26157
26371
  return [2 /*return*/];
26158
26372
  }
26159
26373
  });
26160
26374
  });
26161
26375
  };
26376
+ ListBase.prototype.setAuthorizeButtons = function () {
26377
+ return __awaiter(this, void 0, void 0, function () {
26378
+ return __generator(this, function (_a) {
26379
+ if (this.setting.hiddenAuthorizeButton) {
26380
+ this.crudList.setBtnReady(true);
26381
+ return [2 /*return*/];
26382
+ }
26383
+ this.crudList.setAuthorizeButton(this.lstButtonElement['_results']);
26384
+ return [2 /*return*/];
26385
+ });
26386
+ });
26387
+ };
26162
26388
  ListBase.prototype.beforeRenderDataSource = function (datasource) {
26163
26389
  return datasource;
26164
26390
  };
@@ -26876,6 +27102,7 @@
26876
27102
  { type: Boolean }
26877
27103
  ]; };
26878
27104
  ListBase.propDecorators = {
27105
+ lstButtonElement: [{ type: i0.ViewChildren, args: ['button',] }],
26879
27106
  contentCrudList: [{ type: i0.ViewChild, args: [CrudListComponent,] }],
26880
27107
  contentTreeTable: [{ type: i0.ViewChild, args: [TreeTableComponent,] }],
26881
27108
  parentModel: [{ type: i0.Input }],
@@ -38351,10 +38578,11 @@
38351
38578
  ]; };
38352
38579
 
38353
38580
  var AuthorizeDirective = /** @class */ (function () {
38354
- function AuthorizeDirective(_el, _permissionService, _userService, _moduleConfigService) {
38581
+ function AuthorizeDirective(_el, _permissionService, _userService, _commonService, _moduleConfigService) {
38355
38582
  this._el = _el;
38356
38583
  this._permissionService = _permissionService;
38357
38584
  this._userService = _userService;
38585
+ this._commonService = _commonService;
38358
38586
  this._moduleConfigService = _moduleConfigService;
38359
38587
  this._permissionTypes = exports.PermissionTypes.CONTROL;
38360
38588
  this.ignoreAdmin = false;
@@ -38382,13 +38610,16 @@
38382
38610
  configurable: true
38383
38611
  });
38384
38612
  AuthorizeDirective.prototype.ngOnInit = function () {
38613
+ };
38614
+ AuthorizeDirective.prototype.ngAfterViewInit = function () {
38385
38615
  var _this = this;
38386
- if (!this.enableAuthorize) {
38387
- return;
38388
- }
38616
+ this.setAuthorizeButton();
38389
38617
  if (this._moduleCode) {
38390
38618
  this.appCode = this._moduleCode;
38391
38619
  }
38620
+ if (!this.enableAuthorize) {
38621
+ return;
38622
+ }
38392
38623
  var currentUser = this._userService.getCurrentUser();
38393
38624
  if (!currentUser || !(this.appCode)) {
38394
38625
  console.log('Không đọc được user hoặc appCode');
@@ -38420,6 +38651,31 @@
38420
38651
  }
38421
38652
  });
38422
38653
  };
38654
+ AuthorizeDirective.prototype.setAuthorizeButton = function () {
38655
+ var _a, _b, _c;
38656
+ var key = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
38657
+ if (i0.isDevMode()) {
38658
+ key = this.appCode + "_" + window.location.pathname.substring(1).toUpperCase();
38659
+ }
38660
+ // const componentName = this._element.closest(EnumProperties.CRUD_LIST)?.parentNode[EnumProperties.TAG_NAME];
38661
+ // if (componentName && !key.endsWith(componentName)) {
38662
+ // key += `_${componentName}`;
38663
+ // }
38664
+ 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);
38665
+ if (!buttonText) {
38666
+ this.enableAuthorize = false;
38667
+ return;
38668
+ }
38669
+ this.buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
38670
+ var permissionCode = "[" + key + "]_[" + this._commonService.convertStringToUnSign(buttonText).replace(/ /g, '_').toUpperCase() + "]";
38671
+ var isSetAuthorize = (_c = this.buttonSetting[key]) === null || _c === void 0 ? void 0 : _c.find(function (p) { return p.code == permissionCode; });
38672
+ if (isSetAuthorize) {
38673
+ this.permission = permissionCode;
38674
+ }
38675
+ else {
38676
+ this.enableAuthorize = false;
38677
+ }
38678
+ };
38423
38679
  AuthorizeDirective.prototype.ngAfterContentChecked = function () {
38424
38680
  if (this._label && !this._bind && this._element.innerHTML !== '' && this.keepHTML) {
38425
38681
  this._label.innerHTML = this._element.innerHTML;
@@ -38438,6 +38694,7 @@
38438
38694
  { type: i0.ElementRef },
38439
38695
  { type: PermissionService },
38440
38696
  { type: UserService },
38697
+ { type: CommonService },
38441
38698
  { type: ModuleConfigService }
38442
38699
  ]; };
38443
38700
  AuthorizeDirective.propDecorators = {
@@ -49749,6 +50006,174 @@
49749
50006
  parentSetting: [{ type: i0.Input }]
49750
50007
  };
49751
50008
 
50009
+ var SettingAuthorizeButtonComponent = /** @class */ (function (_super) {
50010
+ __extends(SettingAuthorizeButtonComponent, _super);
50011
+ function SettingAuthorizeButtonComponent(_injector, _basePermissionService, _moduleConfigService) {
50012
+ var _this = _super.call(this, _injector) || this;
50013
+ _this._injector = _injector;
50014
+ _this._basePermissionService = _basePermissionService;
50015
+ _this._moduleConfigService = _moduleConfigService;
50016
+ _this.authorizeButtonKey = '';
50017
+ _this.dataSource = [];
50018
+ _this.appCode = '';
50019
+ return _this;
50020
+ }
50021
+ SettingAuthorizeButtonComponent.prototype.ngOnInit = function () {
50022
+ this.appCode = this._moduleConfigService.getConfig().appCode;
50023
+ this.setting.baseService = this._basePermissionService;
50024
+ this.customGetData = true;
50025
+ this.setting.hiddenAdvanceSearch = true;
50026
+ this.setting.hiddenHeader = true;
50027
+ this.setting.heightType = exports.HeightType.dynamic;
50028
+ this.setting.hiddenOrderColumn = true;
50029
+ this.setting.hiddenFilterRow = true;
50030
+ this.setting.hiddenSettingWorkflow = true;
50031
+ this.setting.hiddenAuthorizeButton = true;
50032
+ this.setting.hiddenSettingPermission = true;
50033
+ this.setting.fixHeightTypeInDialog = false;
50034
+ this.setting.hiddenCheckbox = false;
50035
+ this.setting.showEditLink = false;
50036
+ this.setting.modelSchemas = [
50037
+ new ModelSchema({
50038
+ field: 'permissionCode',
50039
+ name: 'Mã',
50040
+ }),
50041
+ new ModelSchema({
50042
+ field: 'rawText',
50043
+ name: 'Tên',
50044
+ }),
50045
+ new ModelSchema({
50046
+ field: 'isAuthorize',
50047
+ name: 'Đã tạo quyền',
50048
+ }),
50049
+ new ModelSchema({
50050
+ field: 'ma1',
50051
+ name: 'Mã',
50052
+ }),
50053
+ ];
50054
+ this.setting.cols = [
50055
+ new ColumnSchemaBase({ field: 'permissionCode', sort: false, showEditLink: false }),
50056
+ new ColumnSchemaBase({ field: 'rawText', width: '230px', sort: false }),
50057
+ new ColumnSchemaBase({ field: 'isAuthorize', dataType: exports.DataType.boolean, width: '100px', sort: false }),
50058
+ ];
50059
+ _super.prototype.ngOnInit.call(this);
50060
+ };
50061
+ SettingAuthorizeButtonComponent.prototype.getDataCustom = function (gridInfo) {
50062
+ this.model.dataSource = this.dataSource;
50063
+ this.afterGetData();
50064
+ };
50065
+ SettingAuthorizeButtonComponent.prototype.addBasePermission = function (rowData) {
50066
+ return __awaiter(this, void 0, void 0, function () {
50067
+ var insertRes;
50068
+ return __generator(this, function (_a) {
50069
+ switch (_a.label) {
50070
+ case 0: return [4 /*yield*/, this._basePermissionService.post(rowData)];
50071
+ case 1:
50072
+ insertRes = _a.sent();
50073
+ if (insertRes.success) {
50074
+ this._notifierService.showSuccess('Thêm quyền thành công');
50075
+ this.updateDataSource(insertRes.data);
50076
+ return [2 /*return*/];
50077
+ }
50078
+ this._notifierService.showWarning('Có lỗi trong quá trình xử lý, vui lòng thử lại');
50079
+ return [2 /*return*/];
50080
+ }
50081
+ });
50082
+ });
50083
+ };
50084
+ SettingAuthorizeButtonComponent.prototype.deleteBasePermission = function (rowData) {
50085
+ return __awaiter(this, void 0, void 0, function () {
50086
+ var _this = this;
50087
+ return __generator(this, function (_a) {
50088
+ this._notifierService.showConfirm('Xác nhận xóa quyền').then(function (res) { return __awaiter(_this, void 0, void 0, function () {
50089
+ var deleteRes;
50090
+ return __generator(this, function (_a) {
50091
+ switch (_a.label) {
50092
+ case 0:
50093
+ if (!res)
50094
+ return [2 /*return*/];
50095
+ return [4 /*yield*/, this._basePermissionService.delete(rowData.id)];
50096
+ case 1:
50097
+ deleteRes = _a.sent();
50098
+ if (deleteRes.success) {
50099
+ this._notifierService.showSuccess('Xóa quyền thành công');
50100
+ this.updateDataSource(rowData.id, true);
50101
+ return [2 /*return*/];
50102
+ }
50103
+ this._notifierService.showWarning(deleteRes.message);
50104
+ return [2 /*return*/];
50105
+ }
50106
+ });
50107
+ }); });
50108
+ return [2 /*return*/];
50109
+ });
50110
+ });
50111
+ };
50112
+ SettingAuthorizeButtonComponent.prototype.updateDataSource = function (id, isDeleted) {
50113
+ if (isDeleted === void 0) { isDeleted = false; }
50114
+ var currentRow = this.model.dataSource.find(function (p) { return p.id == id; });
50115
+ if (!currentRow)
50116
+ return;
50117
+ if (isDeleted) {
50118
+ currentRow.id = this._commonService.guid();
50119
+ }
50120
+ currentRow.isAuthorize = !isDeleted;
50121
+ this.afterGetData();
50122
+ };
50123
+ SettingAuthorizeButtonComponent.prototype.afterGetData = function () {
50124
+ return __awaiter(this, void 0, void 0, function () {
50125
+ var _this = this;
50126
+ return __generator(this, function (_a) {
50127
+ this._unmarkLoading();
50128
+ if (!this.model.dataSource.length)
50129
+ return [2 /*return*/];
50130
+ this.model.dataSource.forEach(function (item) {
50131
+ item.name = item.rawText;
50132
+ item.code = item.permissionCode;
50133
+ item.moduleCode = _this.appCode;
50134
+ });
50135
+ return [2 /*return*/];
50136
+ });
50137
+ });
50138
+ };
50139
+ SettingAuthorizeButtonComponent.prototype.ngOnDestroy = function () {
50140
+ var _this = this;
50141
+ var buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
50142
+ this.model.dataSource.forEach(function (rowData) {
50143
+ var buttonItem = buttonSetting[_this.authorizeButtonKey].find(function (p) { return p.code == rowData.code; });
50144
+ if (rowData.isAuthorize && !buttonItem) {
50145
+ buttonSetting[_this.authorizeButtonKey].push({
50146
+ id: rowData.id,
50147
+ code: rowData.code,
50148
+ });
50149
+ }
50150
+ else if (!rowData.isAuthorize && buttonItem) {
50151
+ var index = buttonSetting[_this.authorizeButtonKey].indexOf(buttonItem);
50152
+ buttonSetting[_this.authorizeButtonKey].splice(index, 1);
50153
+ }
50154
+ });
50155
+ sessionStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE, JSON.stringify(buttonSetting));
50156
+ };
50157
+ return SettingAuthorizeButtonComponent;
50158
+ }(DataListBase));
50159
+ SettingAuthorizeButtonComponent.decorators = [
50160
+ { type: i0.Component, args: [{
50161
+ selector: 'settings-authorize-button',
50162
+ 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>",
50163
+ providers: [ComponentContextService],
50164
+ styles: [""]
50165
+ },] }
50166
+ ];
50167
+ SettingAuthorizeButtonComponent.ctorParameters = function () { return [
50168
+ { type: i0.Injector },
50169
+ { type: BasePermissionService },
50170
+ { type: ModuleConfigService }
50171
+ ]; };
50172
+ SettingAuthorizeButtonComponent.propDecorators = {
50173
+ authorizeButtonKey: [{ type: i0.Input }],
50174
+ dataSource: [{ type: i0.Input }]
50175
+ };
50176
+
49752
50177
  var SettingsComponent = /** @class */ (function (_super) {
49753
50178
  __extends(SettingsComponent, _super);
49754
50179
  function SettingsComponent(_injector, _domService, _userService) {
@@ -53815,6 +54240,7 @@
53815
54240
  TnAccordionTabComponent,
53816
54241
  SplashComponentComponent,
53817
54242
  SettingsWorkflowComponent,
54243
+ SettingAuthorizeButtonComponent,
53818
54244
  SettingsWorkflowNo1Component,
53819
54245
  CommonLibComponent
53820
54246
  ];
@@ -54022,6 +54448,7 @@
54022
54448
  exports.BaseModule = BaseModule;
54023
54449
  exports.BaseService = BaseService;
54024
54450
  exports.BooleanFormatPipe = BooleanFormatPipe;
54451
+ exports.ButtonAction = ButtonAction;
54025
54452
  exports.ButtonControlSchema = ButtonControlSchema;
54026
54453
  exports.ButtonPermission = ButtonPermission;
54027
54454
  exports.ButtonPermissions = ButtonPermissions;
@@ -54499,7 +54926,9 @@
54499
54926
  exports["ɵdt"] = CheckReadyComponent;
54500
54927
  exports["ɵdu"] = TnAccordionTabComponent;
54501
54928
  exports["ɵdv"] = SettingsWorkflowComponent;
54502
- exports["ɵdw"] = SettingsWorkflowNo1Component;
54929
+ exports["ɵdw"] = SettingAuthorizeButtonComponent;
54930
+ exports["ɵdx"] = BasePermissionService;
54931
+ exports["ɵdy"] = SettingsWorkflowNo1Component;
54503
54932
  exports["ɵe"] = ListBase;
54504
54933
  exports["ɵf"] = ListComponentBase;
54505
54934
  exports["ɵg"] = TreeTableComponent;