tnx-shared 5.3.287 → 5.3.289
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.
- package/bundles/tnx-shared.umd.js +212 -154
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/data-form-base.d.ts.map +1 -1
- package/classes/base/i-list-component.d.ts +0 -2
- package/classes/base/i-list-component.d.ts.map +1 -1
- package/classes/base/list-base.d.ts +3 -0
- package/classes/base/list-base.d.ts.map +1 -1
- package/classes/base/list-component-base.d.ts +2 -5
- package/classes/base/list-component-base.d.ts.map +1 -1
- package/classes/base/validators.d.ts.map +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
- package/esm2015/classes/base/data-form-base.js +4 -3
- package/esm2015/classes/base/i-list-component.js +1 -1
- package/esm2015/classes/base/list-base.js +39 -3
- package/esm2015/classes/base/list-component-base.js +6 -34
- package/esm2015/classes/base/validators.js +4 -2
- package/esm2015/components/crud/crud-form/crud-form.component.js +4 -1
- package/esm2015/components/crud/crud-list/crud-list.component.js +2 -2
- package/esm2015/public-api.js +2 -1
- package/esm2015/services/common.service.js +13 -1
- package/esm2015/services/template-text.service.js +32 -0
- package/fesm2015/tnx-shared.js +91 -40
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -1
- package/services/common.service.d.ts +1 -0
- package/services/common.service.d.ts.map +1 -1
- package/services/template-text.service.d.ts +12 -0
- package/services/template-text.service.d.ts.map +1 -0
- package/services/template-text.service.ngfactory.d.ts.map +1 -0
- package/tnx-shared.metadata.json +1 -1
|
@@ -4887,6 +4887,18 @@
|
|
|
4887
4887
|
element.innerHTML = str;
|
|
4888
4888
|
return element.innerText;
|
|
4889
4889
|
};
|
|
4890
|
+
CommonService.prototype.renderTimespan = function (datetime) {
|
|
4891
|
+
if (!datetime) {
|
|
4892
|
+
return '';
|
|
4893
|
+
}
|
|
4894
|
+
try {
|
|
4895
|
+
var arrTime = datetime.split(':');
|
|
4896
|
+
return arrTime[0] + ":" + arrTime[1];
|
|
4897
|
+
}
|
|
4898
|
+
catch (_a) {
|
|
4899
|
+
return '';
|
|
4900
|
+
}
|
|
4901
|
+
};
|
|
4890
4902
|
return CommonService;
|
|
4891
4903
|
}());
|
|
4892
4904
|
CommonService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function CommonService_Factory() { return new CommonService(i0__namespace.ɵɵinject(ModuleConfigService)); }, token: CommonService, providedIn: "root" });
|
|
@@ -13662,7 +13674,9 @@
|
|
|
13662
13674
|
var _a;
|
|
13663
13675
|
this._label = (_a = event.control.errorLabel) !== null && _a !== void 0 ? _a : event.control.label;
|
|
13664
13676
|
if (event.control.isHtmlLabel) {
|
|
13665
|
-
|
|
13677
|
+
var element = document.createElement('div');
|
|
13678
|
+
element.innerHTML = this._label;
|
|
13679
|
+
this._label = element.innerText;
|
|
13666
13680
|
}
|
|
13667
13681
|
return isNotEmpty(event.value, event.control);
|
|
13668
13682
|
};
|
|
@@ -16784,6 +16798,9 @@
|
|
|
16784
16798
|
CrudFormComponent.prototype.removeAllErrorByNodes = function (currentNode) {
|
|
16785
16799
|
var e_31, _e, e_32, _f;
|
|
16786
16800
|
var _a, _b;
|
|
16801
|
+
if (!currentNode.parentNode.model._errors) {
|
|
16802
|
+
currentNode.parentNode.model._errors = {};
|
|
16803
|
+
}
|
|
16787
16804
|
currentNode.parentNode.model._errors[currentNode.field] = [];
|
|
16788
16805
|
if (!((_a = currentNode.childNodes) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
16789
16806
|
return;
|
|
@@ -19403,8 +19420,9 @@
|
|
|
19403
19420
|
DataFormBase.prototype.showMessageAfterUpdate = function (isSuccess, error) {
|
|
19404
19421
|
if (isSuccess === void 0) { isSuccess = false; }
|
|
19405
19422
|
if (isSuccess) {
|
|
19406
|
-
if (!this.messageUpdateSuccess)
|
|
19423
|
+
if (!this.messageUpdateSuccess) {
|
|
19407
19424
|
this.messageUpdateSuccess = this._translateService.instant('MESSAGE.UPDATE_DATA_SUCCESS');
|
|
19425
|
+
}
|
|
19408
19426
|
if (this.messageUpdateSuccess) {
|
|
19409
19427
|
this._notifierService.showSuccess(this.messageUpdateSuccess);
|
|
19410
19428
|
}
|
|
@@ -21965,7 +21983,6 @@
|
|
|
21965
21983
|
_this.config = new CrudListConfig();
|
|
21966
21984
|
_this.enableReorderRow = false;
|
|
21967
21985
|
_this.fieldOrder = FieldOrderCrudList;
|
|
21968
|
-
_this.showExportAll = false;
|
|
21969
21986
|
_this._style = {};
|
|
21970
21987
|
_this._rawDataSource = [];
|
|
21971
21988
|
_this._dataSource = [];
|
|
@@ -21992,6 +22009,7 @@
|
|
|
21992
22009
|
_this.onRollbackedWorkflow = new i0.EventEmitter();
|
|
21993
22010
|
_this.onChangedStatusWorkflow = new i0.EventEmitter();
|
|
21994
22011
|
_this.widthFunctionColumnChange = new i0.EventEmitter();
|
|
22012
|
+
_this.onExportAll = new i0.EventEmitter();
|
|
21995
22013
|
_this.onSearched = new i0.EventEmitter();
|
|
21996
22014
|
_this.isTreeTable = false;
|
|
21997
22015
|
_this.tableReady = new rxjs.Subject();
|
|
@@ -23113,6 +23131,9 @@
|
|
|
23113
23131
|
ListComponentBase.prototype.add = function () {
|
|
23114
23132
|
this.onAdd.emit();
|
|
23115
23133
|
};
|
|
23134
|
+
ListComponentBase.prototype.exportAllData = function () {
|
|
23135
|
+
this.onExportAll.emit();
|
|
23136
|
+
};
|
|
23116
23137
|
ListComponentBase.prototype.xuatCacMucDaChon = function (isTree) {
|
|
23117
23138
|
if (isTree === void 0) { isTree = false; }
|
|
23118
23139
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -25933,48 +25954,6 @@
|
|
|
25933
25954
|
this.handleCheckAll();
|
|
25934
25955
|
this.buttonAuthorizeModel.showEditForm = false;
|
|
25935
25956
|
};
|
|
25936
|
-
ListComponentBase.prototype.exportDataAll = function () {
|
|
25937
|
-
var _a;
|
|
25938
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
25939
|
-
var lstData, lstVisibleField, lstHeader, printData;
|
|
25940
|
-
var _this = this;
|
|
25941
|
-
return __generator(this, function (_h) {
|
|
25942
|
-
switch (_h.label) {
|
|
25943
|
-
case 0: return [4 /*yield*/, this.setting.baseService.getDataCustomRoute(this.plusUrl, this.currentGridInfo.filters, this.currentGridInfo.fields, this.currentGridInfo.sorts, -1, 1)];
|
|
25944
|
-
case 1:
|
|
25945
|
-
lstData = (_a = (_h.sent()).data) !== null && _a !== void 0 ? _a : [];
|
|
25946
|
-
return [4 /*yield*/, this.beforeExportDataAll(lstData)];
|
|
25947
|
-
case 2:
|
|
25948
|
-
_h.sent();
|
|
25949
|
-
return [4 /*yield*/, this._crudService.getRefDataInDatasource(lstData, this.setting.fieldNeedGetRef)];
|
|
25950
|
-
case 3:
|
|
25951
|
-
_h.sent();
|
|
25952
|
-
lstVisibleField = this.setting.cols.filter(function (item) { return item.visible && item.dataType != 'trangThaiV5'; }).map(function (item) {
|
|
25953
|
-
if (item.controlType == 'dropdown' && item.field.startsWith('str')) {
|
|
25954
|
-
return item.field.slice(3);
|
|
25955
|
-
}
|
|
25956
|
-
return item.field;
|
|
25957
|
-
});
|
|
25958
|
-
lstHeader = ['TT'];
|
|
25959
|
-
lstVisibleField.forEach(function (item) {
|
|
25960
|
-
var schema = _this.setting.modelSchemas.find(function (x) { return x.field == item; });
|
|
25961
|
-
lstHeader.push((schema === null || schema === void 0 ? void 0 : schema.name) || "");
|
|
25962
|
-
});
|
|
25963
|
-
printData = __spreadArray([
|
|
25964
|
-
lstHeader
|
|
25965
|
-
], __read(lstData.map(function (item, index) {
|
|
25966
|
-
var row = [index + 1];
|
|
25967
|
-
_this.setting.cols.filter(function (col) { return col.visible && col.dataType != 'trangThaiV5'; }).forEach(function (col) {
|
|
25968
|
-
row.push(item[col.field]);
|
|
25969
|
-
});
|
|
25970
|
-
return row;
|
|
25971
|
-
})));
|
|
25972
|
-
this._exportService.objectToExcel(printData, 'Danh sách ' + this.setting.objectName, 1);
|
|
25973
|
-
return [2 /*return*/];
|
|
25974
|
-
}
|
|
25975
|
-
});
|
|
25976
|
-
});
|
|
25977
|
-
};
|
|
25978
25957
|
return ListComponentBase;
|
|
25979
25958
|
}(ComponentBase));
|
|
25980
25959
|
ListComponentBase.decorators = [
|
|
@@ -26058,8 +26037,6 @@
|
|
|
26058
26037
|
childrenFromParent: [{ type: i0.Input }],
|
|
26059
26038
|
menuButtons: [{ type: i0.Input }],
|
|
26060
26039
|
fieldOrder: [{ type: i0.Input }],
|
|
26061
|
-
beforeExportDataAll: [{ type: i0.Input }],
|
|
26062
|
-
showExportAll: [{ type: i0.Input }],
|
|
26063
26040
|
style: [{ type: i0.Input }],
|
|
26064
26041
|
tableClass: [{ type: i0.Input }],
|
|
26065
26042
|
allDataSource: [{ type: i0.Input }],
|
|
@@ -26086,6 +26063,7 @@
|
|
|
26086
26063
|
onRollbackedWorkflow: [{ type: i0.Output }],
|
|
26087
26064
|
onChangedStatusWorkflow: [{ type: i0.Output }],
|
|
26088
26065
|
widthFunctionColumnChange: [{ type: i0.Output }],
|
|
26066
|
+
onExportAll: [{ type: i0.Output }],
|
|
26089
26067
|
onSearched: [{ type: i0.Output }]
|
|
26090
26068
|
};
|
|
26091
26069
|
|
|
@@ -26253,7 +26231,7 @@
|
|
|
26253
26231
|
{ type: i0.Component, args: [{
|
|
26254
26232
|
// tslint:disable-next-line: component-selector
|
|
26255
26233
|
selector: 'crud-list',
|
|
26256
|
-
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 && !setting.hiddenSearchCustom\"\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 <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 *ngIf=\"hasTemplate('defaultToolbar')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('defaultToolbar')\"\n [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBtnReady\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete}\">\n </ng-container>\n <ng-container *ngIf=\"isSuperUser\" [ngTemplateOutlet]=\"buttonAuthorize\">\n </ng-container>\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 *ngIf=\"isBtnReady\">\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\"\n style=\"display: none\" (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 [ngTemplateOutlet]=\"buttonExportAll\">\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 </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\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" [disabled]=\"!model.baseReady\"\n (click)=\"add()\"></button>\n</ng-template>\n<ng-template #buttonExportAll>\n <button *ngIf=\"showExportAll\" #buttonBase appAuthorize type=\"button\" pButton pRipple label=\"Xu\u1EA5t t\u1EA5t c\u1EA3\"\n icon=\"fas fa-file-excel\" class=\"p-button-text p-button-success\"\n [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" (click)=\"exportDataAll()\"></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 [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" (click)=\"xuatCacMucDaChon()\"></button>\n</ng-template>\n<ng-template #buttonAuthorize>\n <button *ngIf=\"!setting.hiddenAuthorizeButton && authorizeButtonKey\" type=\"button\" pButton pRipple\n label=\"Ph\u00E2n quy\u1EC1n n\u00FAt\" icon=\"fas fa-tools\" class=\"p-button-text\" (click)=\"onShowFormSettingButton()\"></button>\n</ng-template>\n\n<ng-template #buttonExportWord>\n <button #buttonBase appAuthorize *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"In c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\" icon=\"fas fa-file-word\" class=\"p-button-text p-button-success\"\n [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" (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\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\"\n (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)\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\"\n pTooltip=\"S\u1EEDa\" 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)\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\"\n pTooltip=\"X\u00F3a\" 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\" [ngClass]=\"{'limit-line': setting.isLimitNumberOfLine}\">\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=\"'timespan'\">\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 [noFileMessage]=\"fileSetting.control.noFileMessage\"\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>",
|
|
26234
|
+
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 && !setting.hiddenSearchCustom\"\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 <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 *ngIf=\"hasTemplate('defaultToolbar')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('defaultToolbar')\"\n [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBtnReady\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete}\">\n </ng-container>\n <ng-container *ngIf=\"isSuperUser\" [ngTemplateOutlet]=\"buttonAuthorize\">\n </ng-container>\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 *ngIf=\"isBtnReady\">\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\"\n style=\"display: none\" (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 [ngTemplateOutlet]=\"buttonExportAll\">\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 </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\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" [disabled]=\"!model.baseReady\"\n (click)=\"add()\"></button>\n</ng-template>\n<ng-template #buttonExportAll>\n <button *ngIf=\"setting.showExportAll\" #buttonBase appAuthorize type=\"button\" pButton pRipple label=\"Xu\u1EA5t t\u1EA5t c\u1EA3\"\n icon=\"fas fa-file-excel\" class=\"p-button-text p-button-success\"\n [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" (click)=\"exportAllData()\"></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 [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" (click)=\"xuatCacMucDaChon()\"></button>\n</ng-template>\n<ng-template #buttonAuthorize>\n <button *ngIf=\"!setting.hiddenAuthorizeButton && authorizeButtonKey\" type=\"button\" pButton pRipple\n label=\"Ph\u00E2n quy\u1EC1n n\u00FAt\" icon=\"fas fa-tools\" class=\"p-button-text\" (click)=\"onShowFormSettingButton()\"></button>\n</ng-template>\n\n<ng-template #buttonExportWord>\n <button #buttonBase appAuthorize *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"In c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\" icon=\"fas fa-file-word\" class=\"p-button-text p-button-success\"\n [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\" (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\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\"\n (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)\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\"\n pTooltip=\"S\u1EEDa\" 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)\" [suffixAuthorizeCode]=\"setting.suffixAuthorizeCode\"\n pTooltip=\"X\u00F3a\" 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\" [ngClass]=\"{'limit-line': setting.isLimitNumberOfLine}\">\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=\"'timespan'\">\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 [noFileMessage]=\"fileSetting.control.noFileMessage\"\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>",
|
|
26257
26235
|
providers: [i3.DecimalPipe, i3.DatePipe],
|
|
26258
26236
|
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.limit-line{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}}"]
|
|
26259
26237
|
},] }
|
|
@@ -26624,7 +26602,6 @@
|
|
|
26624
26602
|
var beforeValue = this.crudList;
|
|
26625
26603
|
if (content) {
|
|
26626
26604
|
this.crudList = content;
|
|
26627
|
-
this.crudList.plusUrl = this.plusUrl;
|
|
26628
26605
|
if (!beforeValue) {
|
|
26629
26606
|
this.countReady++;
|
|
26630
26607
|
this.setDefaultValueFilter();
|
|
@@ -26749,15 +26726,15 @@
|
|
|
26749
26726
|
};
|
|
26750
26727
|
ListBase.prototype.handleAfterViewInit = function () {
|
|
26751
26728
|
return __awaiter(this, void 0, void 0, function () {
|
|
26752
|
-
return __generator(this, function (
|
|
26753
|
-
switch (
|
|
26729
|
+
return __generator(this, function (_b) {
|
|
26730
|
+
switch (_b.label) {
|
|
26754
26731
|
case 0:
|
|
26755
26732
|
if (!((this.setting.baseService && this.setting.baseService.useWorkflow)
|
|
26756
26733
|
|| this.setting.isWorkflowTree)) return [3 /*break*/, 2];
|
|
26757
26734
|
return [4 /*yield*/, this.checkHasWorkflow()];
|
|
26758
26735
|
case 1:
|
|
26759
|
-
|
|
26760
|
-
|
|
26736
|
+
_b.sent();
|
|
26737
|
+
_b.label = 2;
|
|
26761
26738
|
case 2:
|
|
26762
26739
|
this.countReady++;
|
|
26763
26740
|
if (this.countReady > 1) {
|
|
@@ -26777,7 +26754,7 @@
|
|
|
26777
26754
|
// #region Get Data
|
|
26778
26755
|
ListBase.prototype.reload = function () {
|
|
26779
26756
|
return __awaiter(this, void 0, void 0, function () {
|
|
26780
|
-
return __generator(this, function (
|
|
26757
|
+
return __generator(this, function (_b) {
|
|
26781
26758
|
this.crudList.reload();
|
|
26782
26759
|
return [2 /*return*/];
|
|
26783
26760
|
});
|
|
@@ -26785,8 +26762,8 @@
|
|
|
26785
26762
|
};
|
|
26786
26763
|
ListBase.prototype._triggerProcessData = function (infoGetData) {
|
|
26787
26764
|
return __awaiter(this, void 0, void 0, function () {
|
|
26788
|
-
return __generator(this, function (
|
|
26789
|
-
switch (
|
|
26765
|
+
return __generator(this, function (_b) {
|
|
26766
|
+
switch (_b.label) {
|
|
26790
26767
|
case 0:
|
|
26791
26768
|
if (infoGetData === null || infoGetData === void 0 ? void 0 : infoGetData.dataSearchCommon) {
|
|
26792
26769
|
this.dataSearchCommon = infoGetData.dataSearchCommon;
|
|
@@ -26795,7 +26772,7 @@
|
|
|
26795
26772
|
return [2 /*return*/];
|
|
26796
26773
|
return [4 /*yield*/, this.processData((infoGetData === null || infoGetData === void 0 ? void 0 : infoGetData.gridInfo) || null)];
|
|
26797
26774
|
case 1:
|
|
26798
|
-
|
|
26775
|
+
_b.sent();
|
|
26799
26776
|
return [2 /*return*/];
|
|
26800
26777
|
}
|
|
26801
26778
|
});
|
|
@@ -26803,7 +26780,7 @@
|
|
|
26803
26780
|
};
|
|
26804
26781
|
ListBase.prototype.processData = function (gridInfo) {
|
|
26805
26782
|
return __awaiter(this, void 0, void 0, function () {
|
|
26806
|
-
return __generator(this, function (
|
|
26783
|
+
return __generator(this, function (_b) {
|
|
26807
26784
|
this.readyToTrinhKy = false;
|
|
26808
26785
|
if (this.hasCrudList) {
|
|
26809
26786
|
if (!this.crudList) {
|
|
@@ -26831,7 +26808,7 @@
|
|
|
26831
26808
|
};
|
|
26832
26809
|
ListBase.prototype.modifyGridInfo = function (gridInfo) {
|
|
26833
26810
|
return __awaiter(this, void 0, void 0, function () {
|
|
26834
|
-
return __generator(this, function (
|
|
26811
|
+
return __generator(this, function (_b) {
|
|
26835
26812
|
return [2 /*return*/, true];
|
|
26836
26813
|
});
|
|
26837
26814
|
});
|
|
@@ -26839,10 +26816,10 @@
|
|
|
26839
26816
|
ListBase.prototype.getData = function (gridInfo) {
|
|
26840
26817
|
return __awaiter(this, void 0, void 0, function () {
|
|
26841
26818
|
var cols, fields, cols_1, cols_1_1, col, resultModify;
|
|
26842
|
-
var e_1,
|
|
26819
|
+
var e_1, _b;
|
|
26843
26820
|
var _this = this;
|
|
26844
|
-
return __generator(this, function (
|
|
26845
|
-
switch (
|
|
26821
|
+
return __generator(this, function (_c) {
|
|
26822
|
+
switch (_c.label) {
|
|
26846
26823
|
case 0:
|
|
26847
26824
|
if (!(this.setting.baseService && this.model.ready && !this.model.loading)) return [3 /*break*/, 2];
|
|
26848
26825
|
this._markLoading();
|
|
@@ -26889,7 +26866,7 @@
|
|
|
26889
26866
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
26890
26867
|
finally {
|
|
26891
26868
|
try {
|
|
26892
|
-
if (cols_1_1 && !cols_1_1.done && (
|
|
26869
|
+
if (cols_1_1 && !cols_1_1.done && (_b = cols_1.return)) _b.call(cols_1);
|
|
26893
26870
|
}
|
|
26894
26871
|
finally { if (e_1) throw e_1.error; }
|
|
26895
26872
|
}
|
|
@@ -26898,8 +26875,8 @@
|
|
|
26898
26875
|
}
|
|
26899
26876
|
return [4 /*yield*/, this.modifyGridInfo(gridInfo)];
|
|
26900
26877
|
case 1:
|
|
26901
|
-
resultModify =
|
|
26902
|
-
this.
|
|
26878
|
+
resultModify = _c.sent();
|
|
26879
|
+
this.currentGridInfo = gridInfo;
|
|
26903
26880
|
if (this.useDefaltSort && gridInfo.sorts.length == 0) {
|
|
26904
26881
|
gridInfo.sorts.unshift(this.newSort(this.defaultSortField, this.defaultSortDir));
|
|
26905
26882
|
}
|
|
@@ -26908,6 +26885,9 @@
|
|
|
26908
26885
|
this.model.total = 0;
|
|
26909
26886
|
this.model.expandedRowKeys = {};
|
|
26910
26887
|
this._unmarkLoading();
|
|
26888
|
+
setTimeout(function () {
|
|
26889
|
+
_this.setAuthorizeButtons();
|
|
26890
|
+
}, 10);
|
|
26911
26891
|
return [2 /*return*/];
|
|
26912
26892
|
}
|
|
26913
26893
|
return [2 /*return*/, this.doGetRequest(gridInfo)];
|
|
@@ -26922,19 +26902,19 @@
|
|
|
26922
26902
|
if (this.setting.baseService) {
|
|
26923
26903
|
this.getPromiseGetData(gridInfo)
|
|
26924
26904
|
.then(function (response) { return __awaiter(_this, void 0, void 0, function () {
|
|
26925
|
-
return __generator(this, function (
|
|
26926
|
-
switch (
|
|
26905
|
+
return __generator(this, function (_b) {
|
|
26906
|
+
switch (_b.label) {
|
|
26927
26907
|
case 0:
|
|
26928
26908
|
if (!response.success) return [3 /*break*/, 2];
|
|
26929
26909
|
return [4 /*yield*/, this.processGetData(response)];
|
|
26930
26910
|
case 1:
|
|
26931
|
-
|
|
26911
|
+
_b.sent();
|
|
26932
26912
|
this.fireDataLoaded();
|
|
26933
26913
|
return [3 /*break*/, 3];
|
|
26934
26914
|
case 2:
|
|
26935
26915
|
this._notifierService.showWarning(response.message);
|
|
26936
26916
|
this.fireDataLoaded(false);
|
|
26937
|
-
|
|
26917
|
+
_b.label = 3;
|
|
26938
26918
|
case 3: return [2 /*return*/];
|
|
26939
26919
|
}
|
|
26940
26920
|
});
|
|
@@ -26972,7 +26952,7 @@
|
|
|
26972
26952
|
};
|
|
26973
26953
|
ListBase.prototype.afterReloaded = function () {
|
|
26974
26954
|
return __awaiter(this, void 0, void 0, function () {
|
|
26975
|
-
return __generator(this, function (
|
|
26955
|
+
return __generator(this, function (_b) {
|
|
26976
26956
|
return [2 /*return*/];
|
|
26977
26957
|
});
|
|
26978
26958
|
});
|
|
@@ -26995,17 +26975,17 @@
|
|
|
26995
26975
|
};
|
|
26996
26976
|
ListBase.prototype._getDataSource = function (response) {
|
|
26997
26977
|
return __awaiter(this, void 0, void 0, function () {
|
|
26998
|
-
return __generator(this, function (
|
|
26978
|
+
return __generator(this, function (_b) {
|
|
26999
26979
|
return [2 /*return*/, [[], []]];
|
|
27000
26980
|
});
|
|
27001
26981
|
});
|
|
27002
26982
|
};
|
|
27003
26983
|
ListBase.prototype.processGetData = function (response) {
|
|
27004
26984
|
return __awaiter(this, void 0, void 0, function () {
|
|
27005
|
-
var
|
|
26985
|
+
var _b, dataSource, rawDataSource, resetSelectedItems;
|
|
27006
26986
|
var _this = this;
|
|
27007
|
-
return __generator(this, function (
|
|
27008
|
-
switch (
|
|
26987
|
+
return __generator(this, function (_c) {
|
|
26988
|
+
switch (_c.label) {
|
|
27009
26989
|
case 0:
|
|
27010
26990
|
this.model.expandedRowKeys = {};
|
|
27011
26991
|
this.model.total = response.totalRecord;
|
|
@@ -27013,14 +26993,14 @@
|
|
|
27013
26993
|
this.mergeRefFields(response.data);
|
|
27014
26994
|
return [4 /*yield*/, this.beforeRenderDataSource(response.data)];
|
|
27015
26995
|
case 1:
|
|
27016
|
-
|
|
27017
|
-
|
|
26996
|
+
_c.sent();
|
|
26997
|
+
_c.label = 2;
|
|
27018
26998
|
case 2: return [4 /*yield*/, this._getDataSource(response)];
|
|
27019
26999
|
case 3:
|
|
27020
|
-
|
|
27000
|
+
_b = __read.apply(void 0, [_c.sent(), 2]), dataSource = _b[0], rawDataSource = _b[1];
|
|
27021
27001
|
return [4 /*yield*/, this.afterProcessDataInBase(dataSource)];
|
|
27022
27002
|
case 4:
|
|
27023
|
-
|
|
27003
|
+
_c.sent();
|
|
27024
27004
|
if (this.setting.columnSetting.groupField && this.setting.columnSetting.groupInClient) {
|
|
27025
27005
|
this.groupInClient(dataSource);
|
|
27026
27006
|
}
|
|
@@ -27035,7 +27015,7 @@
|
|
|
27035
27015
|
}
|
|
27036
27016
|
return [4 /*yield*/, this.afterGetData()];
|
|
27037
27017
|
case 5:
|
|
27038
|
-
|
|
27018
|
+
_c.sent();
|
|
27039
27019
|
// this._getRefDataDropdown(this.model.dataSource);
|
|
27040
27020
|
// K dùng hàm ở trên vì đối với tree list thì model.dataSource đã bị tái cấu trúc
|
|
27041
27021
|
this._getRefDataDropdown(rawDataSource);
|
|
@@ -27049,7 +27029,7 @@
|
|
|
27049
27029
|
};
|
|
27050
27030
|
ListBase.prototype.setAuthorizeButtons = function () {
|
|
27051
27031
|
return __awaiter(this, void 0, void 0, function () {
|
|
27052
|
-
return __generator(this, function (
|
|
27032
|
+
return __generator(this, function (_b) {
|
|
27053
27033
|
if (this.crudList && !this.setting.hiddenAuthorizeButton && !this.setting.hiddenToolbar) {
|
|
27054
27034
|
this.crudList.setAuthorizeButton(this.lstButtonElement[exports.EnumProperties.RESULTS]);
|
|
27055
27035
|
}
|
|
@@ -27060,9 +27040,9 @@
|
|
|
27060
27040
|
ListBase.prototype.getMenuButtonCustomAuthorized = function (menuButtons) {
|
|
27061
27041
|
return __awaiter(this, void 0, void 0, function () {
|
|
27062
27042
|
var buttonSetting, authorizeButtonKey, serviceCode, lstButtonAuthorize, promises, authorizedButtons, _loop_1, this_1, menuButtons_1, menuButtons_1_1, item;
|
|
27063
|
-
var e_2,
|
|
27064
|
-
return __generator(this, function (
|
|
27065
|
-
switch (
|
|
27043
|
+
var e_2, _b;
|
|
27044
|
+
return __generator(this, function (_c) {
|
|
27045
|
+
switch (_c.label) {
|
|
27066
27046
|
case 0:
|
|
27067
27047
|
buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
|
|
27068
27048
|
authorizeButtonKey = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
|
|
@@ -27102,13 +27082,13 @@
|
|
|
27102
27082
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
27103
27083
|
finally {
|
|
27104
27084
|
try {
|
|
27105
|
-
if (menuButtons_1_1 && !menuButtons_1_1.done && (
|
|
27085
|
+
if (menuButtons_1_1 && !menuButtons_1_1.done && (_b = menuButtons_1.return)) _b.call(menuButtons_1);
|
|
27106
27086
|
}
|
|
27107
27087
|
finally { if (e_2) throw e_2.error; }
|
|
27108
27088
|
}
|
|
27109
27089
|
return [4 /*yield*/, Promise.all(promises)];
|
|
27110
27090
|
case 1:
|
|
27111
|
-
|
|
27091
|
+
_c.sent();
|
|
27112
27092
|
return [2 /*return*/, authorizedButtons];
|
|
27113
27093
|
}
|
|
27114
27094
|
});
|
|
@@ -27118,7 +27098,7 @@
|
|
|
27118
27098
|
return datasource;
|
|
27119
27099
|
};
|
|
27120
27100
|
ListBase.prototype.mergeRefFields = function (dataSource) {
|
|
27121
|
-
var e_3,
|
|
27101
|
+
var e_3, _b, e_4, _c;
|
|
27122
27102
|
var schemas = this.setting.cols.filter(function (p) { return p.isForeignField && !!p.displayFieldInGrid && !p.field.startsWith('str'); });
|
|
27123
27103
|
if (!schemas.length)
|
|
27124
27104
|
return;
|
|
@@ -27134,7 +27114,7 @@
|
|
|
27134
27114
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
27135
27115
|
finally {
|
|
27136
27116
|
try {
|
|
27137
|
-
if (schemas_1_1 && !schemas_1_1.done && (
|
|
27117
|
+
if (schemas_1_1 && !schemas_1_1.done && (_c = schemas_1.return)) _c.call(schemas_1);
|
|
27138
27118
|
}
|
|
27139
27119
|
finally { if (e_4) throw e_4.error; }
|
|
27140
27120
|
}
|
|
@@ -27143,13 +27123,13 @@
|
|
|
27143
27123
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
27144
27124
|
finally {
|
|
27145
27125
|
try {
|
|
27146
|
-
if (dataSource_1_1 && !dataSource_1_1.done && (
|
|
27126
|
+
if (dataSource_1_1 && !dataSource_1_1.done && (_b = dataSource_1.return)) _b.call(dataSource_1);
|
|
27147
27127
|
}
|
|
27148
27128
|
finally { if (e_3) throw e_3.error; }
|
|
27149
27129
|
}
|
|
27150
27130
|
};
|
|
27151
27131
|
ListBase.prototype.calculateRowSpan = function (dataSource, fields, funcNext) {
|
|
27152
|
-
var e_5,
|
|
27132
|
+
var e_5, _b;
|
|
27153
27133
|
for (var i = 0; i < dataSource.length - 1; i++) {
|
|
27154
27134
|
if (funcNext && funcNext(dataSource[i]) != funcNext(dataSource[i + 1]))
|
|
27155
27135
|
continue;
|
|
@@ -27186,7 +27166,7 @@
|
|
|
27186
27166
|
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
27187
27167
|
finally {
|
|
27188
27168
|
try {
|
|
27189
|
-
if (fields_1_1 && !fields_1_1.done && (
|
|
27169
|
+
if (fields_1_1 && !fields_1_1.done && (_b = fields_1.return)) _b.call(fields_1);
|
|
27190
27170
|
}
|
|
27191
27171
|
finally { if (e_5) throw e_5.error; }
|
|
27192
27172
|
}
|
|
@@ -27195,14 +27175,14 @@
|
|
|
27195
27175
|
ListBase.prototype.afterProcessDataInBase = function (dataSource) {
|
|
27196
27176
|
if (dataSource === void 0) { dataSource = []; }
|
|
27197
27177
|
return __awaiter(this, void 0, void 0, function () {
|
|
27198
|
-
return __generator(this, function (
|
|
27178
|
+
return __generator(this, function (_b) {
|
|
27199
27179
|
return [2 /*return*/];
|
|
27200
27180
|
});
|
|
27201
27181
|
});
|
|
27202
27182
|
};
|
|
27203
27183
|
ListBase.prototype.afterGetData = function () {
|
|
27204
27184
|
return __awaiter(this, void 0, void 0, function () {
|
|
27205
|
-
return __generator(this, function (
|
|
27185
|
+
return __generator(this, function (_b) {
|
|
27206
27186
|
return [2 /*return*/];
|
|
27207
27187
|
});
|
|
27208
27188
|
});
|
|
@@ -27213,7 +27193,7 @@
|
|
|
27213
27193
|
* @param refFields
|
|
27214
27194
|
*/
|
|
27215
27195
|
ListBase.prototype.addRefFields = function (refFields) {
|
|
27216
|
-
var e_6,
|
|
27196
|
+
var e_6, _b;
|
|
27217
27197
|
if (this.setting.fieldNeedGetRef == null || this.setting.fieldNeedGetRef.length === 0) {
|
|
27218
27198
|
this.setting.fieldNeedGetRef = __spreadArray([], __read(refFields));
|
|
27219
27199
|
return;
|
|
@@ -27236,7 +27216,7 @@
|
|
|
27236
27216
|
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
27237
27217
|
finally {
|
|
27238
27218
|
try {
|
|
27239
|
-
if (refFields_1_1 && !refFields_1_1.done && (
|
|
27219
|
+
if (refFields_1_1 && !refFields_1_1.done && (_b = refFields_1.return)) _b.call(refFields_1);
|
|
27240
27220
|
}
|
|
27241
27221
|
finally { if (e_6) throw e_6.error; }
|
|
27242
27222
|
}
|
|
@@ -27272,21 +27252,21 @@
|
|
|
27272
27252
|
return __awaiter(this, void 0, void 0, function () {
|
|
27273
27253
|
var lstFieldNeedGetRef;
|
|
27274
27254
|
var _this = this;
|
|
27275
|
-
return __generator(this, function (
|
|
27276
|
-
switch (
|
|
27255
|
+
return __generator(this, function (_b) {
|
|
27256
|
+
switch (_b.label) {
|
|
27277
27257
|
case 0:
|
|
27278
27258
|
if (!(dataSource && dataSource.length > 0)) return [3 /*break*/, 3];
|
|
27279
27259
|
lstFieldNeedGetRef = this.setting.fieldNeedGetRef.filter(function (p) { return !p.isForeignField; });
|
|
27280
27260
|
if (!lstFieldNeedGetRef) return [3 /*break*/, 2];
|
|
27281
27261
|
return [4 /*yield*/, this._crudService.getRefDataInDatasource(dataSource, lstFieldNeedGetRef, function (field) { return _this.afterGetRefDataDropdown(field); })];
|
|
27282
27262
|
case 1:
|
|
27283
|
-
|
|
27263
|
+
_b.sent();
|
|
27284
27264
|
this.afterGetRefDataDropdown(null);
|
|
27285
27265
|
this.readyToTrinhKy = true;
|
|
27286
27266
|
return [3 /*break*/, 3];
|
|
27287
27267
|
case 2:
|
|
27288
27268
|
this.readyToTrinhKy = true;
|
|
27289
|
-
|
|
27269
|
+
_b.label = 3;
|
|
27290
27270
|
case 3: return [2 /*return*/];
|
|
27291
27271
|
}
|
|
27292
27272
|
});
|
|
@@ -27299,8 +27279,8 @@
|
|
|
27299
27279
|
ListBase.prototype.checkHasWorkflow = function () {
|
|
27300
27280
|
return __awaiter(this, void 0, void 0, function () {
|
|
27301
27281
|
var key, dataWorkflowNew, dataSource;
|
|
27302
|
-
return __generator(this, function (
|
|
27303
|
-
switch (
|
|
27282
|
+
return __generator(this, function (_b) {
|
|
27283
|
+
switch (_b.label) {
|
|
27304
27284
|
case 0:
|
|
27305
27285
|
key = this.setting.baseService.getKeyWorkflowSetting();
|
|
27306
27286
|
if (!this.setting.baseService.useWorkflow) return [3 /*break*/, 5];
|
|
@@ -27308,12 +27288,12 @@
|
|
|
27308
27288
|
this.newFilter('tableName', exports.Operator.equal, key)
|
|
27309
27289
|
])];
|
|
27310
27290
|
case 1:
|
|
27311
|
-
dataWorkflowNew = (
|
|
27291
|
+
dataWorkflowNew = (_b.sent()).data;
|
|
27312
27292
|
this._registerGlobalService(this._congViecServiceInBase);
|
|
27313
27293
|
if (!dataWorkflowNew) return [3 /*break*/, 3];
|
|
27314
27294
|
return [4 /*yield*/, this.getWorkflowDetailByWorkflowSetting(dataWorkflowNew)];
|
|
27315
27295
|
case 2:
|
|
27316
|
-
|
|
27296
|
+
_b.sent();
|
|
27317
27297
|
this.setting.workflowSettingNew = dataWorkflowNew;
|
|
27318
27298
|
this.appendColWorkflowStatus(dataWorkflowNew.workflows);
|
|
27319
27299
|
return [3 /*break*/, 5];
|
|
@@ -27321,9 +27301,9 @@
|
|
|
27321
27301
|
if (!this.setting.isWorkflowTree) return [3 /*break*/, 5];
|
|
27322
27302
|
return [4 /*yield*/, this.getDataSourceTrangThaiWorkflow()];
|
|
27323
27303
|
case 4:
|
|
27324
|
-
dataSource =
|
|
27304
|
+
dataSource = _b.sent();
|
|
27325
27305
|
this.appendColWorkflowStatus(dataSource);
|
|
27326
|
-
|
|
27306
|
+
_b.label = 5;
|
|
27327
27307
|
case 5: return [2 /*return*/];
|
|
27328
27308
|
}
|
|
27329
27309
|
});
|
|
@@ -27332,22 +27312,22 @@
|
|
|
27332
27312
|
ListBase.prototype.getWorkflowDetailByWorkflowSetting = function (itemWorkflowSetting) {
|
|
27333
27313
|
return __awaiter(this, void 0, void 0, function () {
|
|
27334
27314
|
var workflowCodes, workflows;
|
|
27335
|
-
return __generator(this, function (
|
|
27336
|
-
switch (
|
|
27315
|
+
return __generator(this, function (_b) {
|
|
27316
|
+
switch (_b.label) {
|
|
27337
27317
|
case 0:
|
|
27338
27318
|
itemWorkflowSetting.workflows = [];
|
|
27339
27319
|
workflowCodes = [];
|
|
27340
27320
|
if (!itemWorkflowSetting.createTaskInstead) return [3 /*break*/, 2];
|
|
27341
27321
|
return [4 /*yield*/, this.getWorkflowCodeByTask()];
|
|
27342
27322
|
case 1:
|
|
27343
|
-
workflowCodes =
|
|
27323
|
+
workflowCodes = _b.sent();
|
|
27344
27324
|
return [3 /*break*/, 3];
|
|
27345
27325
|
case 2:
|
|
27346
27326
|
if (itemWorkflowSetting.workflowCodes && !Array.isArray(itemWorkflowSetting.workflowCodes)) {
|
|
27347
27327
|
itemWorkflowSetting.workflowCodes = itemWorkflowSetting.workflowCodes.split(',');
|
|
27348
27328
|
workflowCodes = itemWorkflowSetting.workflowCodes;
|
|
27349
27329
|
}
|
|
27350
|
-
|
|
27330
|
+
_b.label = 3;
|
|
27351
27331
|
case 3:
|
|
27352
27332
|
if (!workflowCodes.length) return [3 /*break*/, 5];
|
|
27353
27333
|
return [4 /*yield*/, this._stateMachinesService.getDataDropdownByFilter([
|
|
@@ -27358,7 +27338,7 @@
|
|
|
27358
27338
|
fieldPlus: 'data'
|
|
27359
27339
|
}))];
|
|
27360
27340
|
case 4:
|
|
27361
|
-
workflows = (
|
|
27341
|
+
workflows = (_b.sent());
|
|
27362
27342
|
workflows === null || workflows === void 0 ? void 0 : workflows.forEach(function (item) {
|
|
27363
27343
|
item.data = JSON.parse(item.data);
|
|
27364
27344
|
var stateMachineData = item.data;
|
|
@@ -27373,7 +27353,7 @@
|
|
|
27373
27353
|
});
|
|
27374
27354
|
});
|
|
27375
27355
|
itemWorkflowSetting.workflows = workflows;
|
|
27376
|
-
|
|
27356
|
+
_b.label = 5;
|
|
27377
27357
|
case 5: return [2 /*return*/];
|
|
27378
27358
|
}
|
|
27379
27359
|
});
|
|
@@ -27382,13 +27362,13 @@
|
|
|
27382
27362
|
ListBase.prototype.getWorkflowCodeByTask = function () {
|
|
27383
27363
|
return __awaiter(this, void 0, void 0, function () {
|
|
27384
27364
|
var phanCongCongViecService, dataWorkflowByTask, workflowCodes;
|
|
27385
|
-
return __generator(this, function (
|
|
27386
|
-
switch (
|
|
27365
|
+
return __generator(this, function (_b) {
|
|
27366
|
+
switch (_b.label) {
|
|
27387
27367
|
case 0:
|
|
27388
27368
|
phanCongCongViecService = this._injector.get(CauHinhWorkflowService);
|
|
27389
27369
|
return [4 /*yield*/, phanCongCongViecService.getAll([], 'workflowCodes')];
|
|
27390
27370
|
case 1:
|
|
27391
|
-
dataWorkflowByTask = (
|
|
27371
|
+
dataWorkflowByTask = (_b.sent()).data;
|
|
27392
27372
|
if (!dataWorkflowByTask)
|
|
27393
27373
|
return [2 /*return*/, []];
|
|
27394
27374
|
workflowCodes = [];
|
|
@@ -27484,7 +27464,7 @@
|
|
|
27484
27464
|
};
|
|
27485
27465
|
ListBase.prototype.getDataSourceTrangThaiWorkflow = function () {
|
|
27486
27466
|
return __awaiter(this, void 0, void 0, function () {
|
|
27487
|
-
return __generator(this, function (
|
|
27467
|
+
return __generator(this, function (_b) {
|
|
27488
27468
|
return [2 /*return*/, []];
|
|
27489
27469
|
});
|
|
27490
27470
|
});
|
|
@@ -27549,11 +27529,11 @@
|
|
|
27549
27529
|
ListBase.prototype._add = function (evt) {
|
|
27550
27530
|
return __awaiter(this, void 0, void 0, function () {
|
|
27551
27531
|
var resultValidate;
|
|
27552
|
-
return __generator(this, function (
|
|
27553
|
-
switch (
|
|
27532
|
+
return __generator(this, function (_b) {
|
|
27533
|
+
switch (_b.label) {
|
|
27554
27534
|
case 0: return [4 /*yield*/, this.validateAdd()];
|
|
27555
27535
|
case 1:
|
|
27556
|
-
resultValidate =
|
|
27536
|
+
resultValidate = _b.sent();
|
|
27557
27537
|
if (!resultValidate) {
|
|
27558
27538
|
return [2 /*return*/];
|
|
27559
27539
|
}
|
|
@@ -27563,7 +27543,7 @@
|
|
|
27563
27543
|
this.setting.maskClass = null;
|
|
27564
27544
|
return [4 /*yield*/, this.beforeAdd()];
|
|
27565
27545
|
case 2:
|
|
27566
|
-
|
|
27546
|
+
_b.sent();
|
|
27567
27547
|
this.showDetailForm = true;
|
|
27568
27548
|
return [2 /*return*/];
|
|
27569
27549
|
}
|
|
@@ -27572,21 +27552,21 @@
|
|
|
27572
27552
|
};
|
|
27573
27553
|
ListBase.prototype.validateAdd = function () {
|
|
27574
27554
|
return __awaiter(this, void 0, void 0, function () {
|
|
27575
|
-
return __generator(this, function (
|
|
27555
|
+
return __generator(this, function (_b) {
|
|
27576
27556
|
return [2 /*return*/, true];
|
|
27577
27557
|
});
|
|
27578
27558
|
});
|
|
27579
27559
|
};
|
|
27580
27560
|
ListBase.prototype.beforeAdd = function () {
|
|
27581
27561
|
return __awaiter(this, void 0, void 0, function () {
|
|
27582
|
-
return __generator(this, function (
|
|
27562
|
+
return __generator(this, function (_b) {
|
|
27583
27563
|
return [2 /*return*/];
|
|
27584
27564
|
});
|
|
27585
27565
|
});
|
|
27586
27566
|
};
|
|
27587
27567
|
ListBase.prototype._view = function (rowData) {
|
|
27588
27568
|
return __awaiter(this, void 0, void 0, function () {
|
|
27589
|
-
return __generator(this, function (
|
|
27569
|
+
return __generator(this, function (_b) {
|
|
27590
27570
|
if (this.setting.showEditLinkOnlyView) {
|
|
27591
27571
|
this._viewOnly(rowData);
|
|
27592
27572
|
}
|
|
@@ -27599,19 +27579,19 @@
|
|
|
27599
27579
|
};
|
|
27600
27580
|
ListBase.prototype._viewOnly = function (rowData) {
|
|
27601
27581
|
return __awaiter(this, void 0, void 0, function () {
|
|
27602
|
-
return __generator(this, function (
|
|
27603
|
-
switch (
|
|
27582
|
+
return __generator(this, function (_b) {
|
|
27583
|
+
switch (_b.label) {
|
|
27604
27584
|
case 0:
|
|
27605
27585
|
this.formModel.formState = exports.FormState.VIEW;
|
|
27606
27586
|
return [4 /*yield*/, this.beforeView()];
|
|
27607
27587
|
case 1:
|
|
27608
|
-
|
|
27588
|
+
_b.sent();
|
|
27609
27589
|
this.setting.popupHeader = "Chi ti\u1EBFt " + this.setting.objectName;
|
|
27610
27590
|
this.setting.maskClass = null;
|
|
27611
27591
|
this.formModel.data = this.cloneData(rowData);
|
|
27612
27592
|
return [4 /*yield*/, this.modifyViewModel(rowData)];
|
|
27613
27593
|
case 2:
|
|
27614
|
-
|
|
27594
|
+
_b.sent();
|
|
27615
27595
|
this.showDetailForm = true;
|
|
27616
27596
|
return [2 /*return*/];
|
|
27617
27597
|
}
|
|
@@ -27620,50 +27600,50 @@
|
|
|
27620
27600
|
};
|
|
27621
27601
|
ListBase.prototype.beforeView = function () {
|
|
27622
27602
|
return __awaiter(this, void 0, void 0, function () {
|
|
27623
|
-
return __generator(this, function (
|
|
27603
|
+
return __generator(this, function (_b) {
|
|
27624
27604
|
return [2 /*return*/];
|
|
27625
27605
|
});
|
|
27626
27606
|
});
|
|
27627
27607
|
};
|
|
27628
27608
|
ListBase.prototype.modifyViewModel = function (rowData) {
|
|
27629
27609
|
return __awaiter(this, void 0, void 0, function () {
|
|
27630
|
-
return __generator(this, function (
|
|
27610
|
+
return __generator(this, function (_b) {
|
|
27631
27611
|
return [2 /*return*/];
|
|
27632
27612
|
});
|
|
27633
27613
|
});
|
|
27634
27614
|
};
|
|
27635
27615
|
ListBase.prototype._copyLinkMultiple = function () {
|
|
27636
27616
|
return __awaiter(this, void 0, void 0, function () {
|
|
27637
|
-
var paths,
|
|
27638
|
-
var e_7,
|
|
27639
|
-
return __generator(this, function (
|
|
27640
|
-
switch (
|
|
27617
|
+
var paths, _b, _c, item, _d, _e, e_7_1;
|
|
27618
|
+
var e_7, _f;
|
|
27619
|
+
return __generator(this, function (_g) {
|
|
27620
|
+
switch (_g.label) {
|
|
27641
27621
|
case 0:
|
|
27642
27622
|
paths = [];
|
|
27643
|
-
|
|
27623
|
+
_g.label = 1;
|
|
27644
27624
|
case 1:
|
|
27645
|
-
|
|
27646
|
-
|
|
27647
|
-
|
|
27625
|
+
_g.trys.push([1, 6, 7, 8]);
|
|
27626
|
+
_b = __values(this.model.selectedItems), _c = _b.next();
|
|
27627
|
+
_g.label = 2;
|
|
27648
27628
|
case 2:
|
|
27649
|
-
if (!!
|
|
27650
|
-
item =
|
|
27651
|
-
|
|
27629
|
+
if (!!_c.done) return [3 /*break*/, 5];
|
|
27630
|
+
item = _c.value;
|
|
27631
|
+
_e = (_d = paths).push;
|
|
27652
27632
|
return [4 /*yield*/, this.getCopyPath(this.setting, item)];
|
|
27653
27633
|
case 3:
|
|
27654
|
-
|
|
27655
|
-
|
|
27634
|
+
_e.apply(_d, [_g.sent()]);
|
|
27635
|
+
_g.label = 4;
|
|
27656
27636
|
case 4:
|
|
27657
|
-
|
|
27637
|
+
_c = _b.next();
|
|
27658
27638
|
return [3 /*break*/, 2];
|
|
27659
27639
|
case 5: return [3 /*break*/, 8];
|
|
27660
27640
|
case 6:
|
|
27661
|
-
e_7_1 =
|
|
27641
|
+
e_7_1 = _g.sent();
|
|
27662
27642
|
e_7 = { error: e_7_1 };
|
|
27663
27643
|
return [3 /*break*/, 8];
|
|
27664
27644
|
case 7:
|
|
27665
27645
|
try {
|
|
27666
|
-
if (
|
|
27646
|
+
if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
|
|
27667
27647
|
}
|
|
27668
27648
|
finally { if (e_7) throw e_7.error; }
|
|
27669
27649
|
return [7 /*endfinally*/];
|
|
@@ -27678,11 +27658,11 @@
|
|
|
27678
27658
|
ListBase.prototype._copyLink = function (rowData) {
|
|
27679
27659
|
return __awaiter(this, void 0, void 0, function () {
|
|
27680
27660
|
var path;
|
|
27681
|
-
return __generator(this, function (
|
|
27682
|
-
switch (
|
|
27661
|
+
return __generator(this, function (_b) {
|
|
27662
|
+
switch (_b.label) {
|
|
27683
27663
|
case 0: return [4 /*yield*/, this.getCopyPath(this.setting, rowData)];
|
|
27684
27664
|
case 1:
|
|
27685
|
-
path =
|
|
27665
|
+
path = _b.sent();
|
|
27686
27666
|
this._commonService.copyByStorage(path);
|
|
27687
27667
|
this._notifierService.showSuccess('Đã sao chép liên kết');
|
|
27688
27668
|
return [2 /*return*/];
|
|
@@ -27694,11 +27674,11 @@
|
|
|
27694
27674
|
if (scopeDataEdit === void 0) { scopeDataEdit = {}; }
|
|
27695
27675
|
return __awaiter(this, void 0, void 0, function () {
|
|
27696
27676
|
var resultValidate, flashShow;
|
|
27697
|
-
return __generator(this, function (
|
|
27698
|
-
switch (
|
|
27677
|
+
return __generator(this, function (_b) {
|
|
27678
|
+
switch (_b.label) {
|
|
27699
27679
|
case 0: return [4 /*yield*/, this.validateEdit()];
|
|
27700
27680
|
case 1:
|
|
27701
|
-
resultValidate =
|
|
27681
|
+
resultValidate = _b.sent();
|
|
27702
27682
|
if (!resultValidate) {
|
|
27703
27683
|
return [2 /*return*/];
|
|
27704
27684
|
}
|
|
@@ -27706,7 +27686,7 @@
|
|
|
27706
27686
|
delete rowData[KeyFlashShow];
|
|
27707
27687
|
return [4 /*yield*/, this.beforeEdit()];
|
|
27708
27688
|
case 2:
|
|
27709
|
-
|
|
27689
|
+
_b.sent();
|
|
27710
27690
|
this.formModel.formState = exports.FormState.EDIT;
|
|
27711
27691
|
this.setting.popupHeader = "Chi ti\u1EBFt " + this.setting.objectName;
|
|
27712
27692
|
this.setting.maskClass = flashShow ? 'hide' : null;
|
|
@@ -27714,7 +27694,7 @@
|
|
|
27714
27694
|
this.formModel.data = this.cloneData(rowData);
|
|
27715
27695
|
return [4 /*yield*/, this.modifyEditModel(this.formModel.data, rowData)];
|
|
27716
27696
|
case 3:
|
|
27717
|
-
|
|
27697
|
+
_b.sent();
|
|
27718
27698
|
this.formModel.data[KeyFlashShow] = flashShow;
|
|
27719
27699
|
this.showDetailForm = true;
|
|
27720
27700
|
return [2 /*return*/];
|
|
@@ -27724,21 +27704,21 @@
|
|
|
27724
27704
|
};
|
|
27725
27705
|
ListBase.prototype.validateEdit = function () {
|
|
27726
27706
|
return __awaiter(this, void 0, void 0, function () {
|
|
27727
|
-
return __generator(this, function (
|
|
27707
|
+
return __generator(this, function (_b) {
|
|
27728
27708
|
return [2 /*return*/, true];
|
|
27729
27709
|
});
|
|
27730
27710
|
});
|
|
27731
27711
|
};
|
|
27732
27712
|
ListBase.prototype.beforeEdit = function () {
|
|
27733
27713
|
return __awaiter(this, void 0, void 0, function () {
|
|
27734
|
-
return __generator(this, function (
|
|
27714
|
+
return __generator(this, function (_b) {
|
|
27735
27715
|
return [2 /*return*/];
|
|
27736
27716
|
});
|
|
27737
27717
|
});
|
|
27738
27718
|
};
|
|
27739
27719
|
ListBase.prototype.modifyEditModel = function (modelEdit, rowData) {
|
|
27740
27720
|
return __awaiter(this, void 0, void 0, function () {
|
|
27741
|
-
return __generator(this, function (
|
|
27721
|
+
return __generator(this, function (_b) {
|
|
27742
27722
|
return [2 /*return*/];
|
|
27743
27723
|
});
|
|
27744
27724
|
});
|
|
@@ -27827,6 +27807,55 @@
|
|
|
27827
27807
|
ListBase.prototype.deepClone = function (data) {
|
|
27828
27808
|
return JSON.parse(JSON.stringify(data));
|
|
27829
27809
|
};
|
|
27810
|
+
ListBase.prototype._exportAllData = function (event) {
|
|
27811
|
+
var _a;
|
|
27812
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
27813
|
+
var lstData, lstVisibleField, lstHeader, printData;
|
|
27814
|
+
var _this = this;
|
|
27815
|
+
return __generator(this, function (_b) {
|
|
27816
|
+
switch (_b.label) {
|
|
27817
|
+
case 0: return [4 /*yield*/, this.setting.baseService.getDataCustomRoute(this.plusUrl, this.currentGridInfo.filters, this.currentGridInfo.fields, this.currentGridInfo.sorts, -1, 1)];
|
|
27818
|
+
case 1:
|
|
27819
|
+
lstData = (_a = (_b.sent()).data) !== null && _a !== void 0 ? _a : [];
|
|
27820
|
+
return [4 /*yield*/, this.beforeExportAllData(lstData)];
|
|
27821
|
+
case 2:
|
|
27822
|
+
_b.sent();
|
|
27823
|
+
return [4 /*yield*/, this._crudService.getRefDataInDatasource(lstData, this.setting.fieldNeedGetRef)];
|
|
27824
|
+
case 3:
|
|
27825
|
+
_b.sent();
|
|
27826
|
+
lstVisibleField = this.setting.cols.filter(function (item) { return item.visible && item.dataType != 'trangThaiV5'; }).map(function (item) {
|
|
27827
|
+
if (item.controlType == 'dropdown' && item.field.startsWith('str')) {
|
|
27828
|
+
return item.field.slice(3);
|
|
27829
|
+
}
|
|
27830
|
+
return item.field;
|
|
27831
|
+
});
|
|
27832
|
+
lstHeader = ['TT'];
|
|
27833
|
+
lstVisibleField.forEach(function (item) {
|
|
27834
|
+
var schema = _this.setting.modelSchemas.find(function (x) { return x.field == item; });
|
|
27835
|
+
lstHeader.push((schema === null || schema === void 0 ? void 0 : schema.name) || "");
|
|
27836
|
+
});
|
|
27837
|
+
printData = __spreadArray([
|
|
27838
|
+
lstHeader
|
|
27839
|
+
], __read(lstData.map(function (item, index) {
|
|
27840
|
+
var row = [index + 1];
|
|
27841
|
+
_this.setting.cols.filter(function (col) { return col.visible && col.dataType != 'trangThaiV5'; }).forEach(function (col) {
|
|
27842
|
+
row.push(item[col.field]);
|
|
27843
|
+
});
|
|
27844
|
+
return row;
|
|
27845
|
+
})));
|
|
27846
|
+
this._exportService.objectToExcel(printData, 'Danh sách ' + this.setting.objectName, 1);
|
|
27847
|
+
return [2 /*return*/];
|
|
27848
|
+
}
|
|
27849
|
+
});
|
|
27850
|
+
});
|
|
27851
|
+
};
|
|
27852
|
+
ListBase.prototype.beforeExportAllData = function (dataSource) {
|
|
27853
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
27854
|
+
return __generator(this, function (_b) {
|
|
27855
|
+
return [2 /*return*/];
|
|
27856
|
+
});
|
|
27857
|
+
});
|
|
27858
|
+
};
|
|
27830
27859
|
return ListBase;
|
|
27831
27860
|
}(ComponentBaseWithButton));
|
|
27832
27861
|
ListBase.decorators = [
|
|
@@ -41606,6 +41635,34 @@
|
|
|
41606
41635
|
{ type: i0.Injector }
|
|
41607
41636
|
]; };
|
|
41608
41637
|
|
|
41638
|
+
var TemplateTextService = /** @class */ (function (_super) {
|
|
41639
|
+
__extends(TemplateTextService, _super);
|
|
41640
|
+
function TemplateTextService(http, injector, _moduleConfigService) {
|
|
41641
|
+
var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.templateEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/TemplateText") || this;
|
|
41642
|
+
_this._moduleConfigService = _moduleConfigService;
|
|
41643
|
+
_this.serviceCode = 'template';
|
|
41644
|
+
_this.entityName = 'TemplateText';
|
|
41645
|
+
_this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.templateEndpoint;
|
|
41646
|
+
return _this;
|
|
41647
|
+
}
|
|
41648
|
+
TemplateTextService.prototype.compileContentByCode = function (code, data) {
|
|
41649
|
+
var url = this.serviceUri + "/CompileContentByCode/" + code;
|
|
41650
|
+
return this.defaultPost(url, data);
|
|
41651
|
+
};
|
|
41652
|
+
return TemplateTextService;
|
|
41653
|
+
}(BaseService));
|
|
41654
|
+
TemplateTextService.ɵprov = i0__namespace.ɵɵdefineInjectable({ factory: function TemplateTextService_Factory() { return new TemplateTextService(i0__namespace.ɵɵinject(i1__namespace$1.HttpClient), i0__namespace.ɵɵinject(i0__namespace.INJECTOR), i0__namespace.ɵɵinject(ModuleConfigService)); }, token: TemplateTextService, providedIn: "root" });
|
|
41655
|
+
TemplateTextService.decorators = [
|
|
41656
|
+
{ type: i0.Injectable, args: [{
|
|
41657
|
+
providedIn: 'root'
|
|
41658
|
+
},] }
|
|
41659
|
+
];
|
|
41660
|
+
TemplateTextService.ctorParameters = function () { return [
|
|
41661
|
+
{ type: i1$1.HttpClient },
|
|
41662
|
+
{ type: i0.Injector },
|
|
41663
|
+
{ type: ModuleConfigService }
|
|
41664
|
+
]; };
|
|
41665
|
+
|
|
41609
41666
|
var TemplateService = /** @class */ (function () {
|
|
41610
41667
|
function TemplateService(_moduleConfigService, _httpClient, _printService, _fileService, _notifierService, _crudService, _commonService) {
|
|
41611
41668
|
this._httpClient = _httpClient;
|
|
@@ -56317,6 +56374,7 @@
|
|
|
56317
56374
|
exports.TemplateService = TemplateService;
|
|
56318
56375
|
exports.TemplateTextItem = TemplateTextItem;
|
|
56319
56376
|
exports.TemplateTextMany = TemplateTextMany;
|
|
56377
|
+
exports.TemplateTextService = TemplateTextService;
|
|
56320
56378
|
exports.TemplateTextV4Service = TemplateTextV4Service;
|
|
56321
56379
|
exports.TemplateV4Service = TemplateV4Service;
|
|
56322
56380
|
exports.TenContainer = TenContainer;
|