tnx-shared 5.3.163 → 5.3.165
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/tnx-shared.umd.js +943 -514
- 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/component-base.d.ts.map +1 -1
- package/classes/base/i-list-component.d.ts +3 -0
- package/classes/base/i-list-component.d.ts.map +1 -1
- package/classes/base/list-base.d.ts +5 -2
- package/classes/base/list-base.d.ts.map +1 -1
- package/classes/base/list-component-base.d.ts +21 -5
- package/classes/base/list-component-base.d.ts.map +1 -1
- package/classes/form-schema.d.ts +10 -0
- package/classes/form-schema.d.ts.map +1 -1
- package/components/settings/settings-authorize-button/settings-authorize-button.component.d.ts +20 -0
- package/components/settings/settings-authorize-button/settings-authorize-button.component.d.ts.map +1 -0
- package/components/settings/settings-authorize-button/settings-authorize-button.component.ngfactory.d.ts.map +1 -0
- package/components/settings/settings-authorize-button/settings-authorize-button.component.scss.shim.ngstyle.d.ts.map +1 -0
- package/configs/component-context.constant.d.ts +8 -0
- package/configs/component-context.constant.d.ts.map +1 -1
- package/const/common.d.ts +2 -2
- package/const/common.d.ts.map +1 -1
- package/directives/authorize.directive.d.ts +8 -3
- package/directives/authorize.directive.d.ts.map +1 -1
- package/enums/common.d.ts +16 -0
- package/enums/common.d.ts.map +1 -1
- package/esm2015/classes/base/component-base.js +5 -1
- package/esm2015/classes/base/i-list-component.js +1 -1
- package/esm2015/classes/base/list-base.js +20 -6
- package/esm2015/classes/base/list-component-base.js +119 -11
- package/esm2015/classes/form-schema.js +12 -1
- package/esm2015/components/crud/crud-list/crud-list.component.js +2 -2
- package/esm2015/components/settings/settings-authorize-button/settings-authorize-button.component.js +142 -0
- package/esm2015/configs/component-context.constant.js +10 -2
- package/esm2015/const/common.js +5 -5
- package/esm2015/directives/authorize.directive.js +37 -6
- package/esm2015/enums/common.js +19 -1
- package/esm2015/services/authen.service.js +3 -1
- package/esm2015/services/basepermission.service.js +28 -0
- package/esm2015/services/common.service.js +1 -1
- package/esm2015/tnx-shared.js +4 -2
- package/esm2015/tnx-shared.module.js +3 -1
- package/fesm2015/tnx-shared.js +616 -263
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/services/authen.service.d.ts.map +1 -1
- package/services/basepermission.service.d.ts +11 -0
- package/services/basepermission.service.d.ts.map +1 -0
- package/services/basepermission.service.ngfactory.d.ts.map +1 -0
- package/services/common.service.d.ts.map +1 -1
- package/tnx-shared.d.ts +3 -1
- package/tnx-shared.d.ts.map +1 -1
- package/tnx-shared.metadata.json +1 -1
- package/tnx-shared.module.d.ts +2 -1
- package/tnx-shared.module.d.ts.map +1 -1
- package/tnx-shared.module.ngfactory.d.ts.map +1 -1
package/fesm2015/tnx-shared.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, InjectionToken, Optional, Inject, Injector, Directive, Input, ViewChild, EventEmitter, Component, ContentChildren, TemplateRef, Output, ComponentFactoryResolver, ApplicationRef, ElementRef, isDevMode, ContentChild, ViewContainerRef, ChangeDetectorRef, Pipe, LOCALE_ID, forwardRef, NgZone, HostListener, ChangeDetectionStrategy, ViewEncapsulation, NgModuleFactory, Compiler, Renderer2, NgModule } from '@angular/core';
|
|
2
|
+
import { Injectable, InjectionToken, Optional, Inject, Injector, Directive, Input, ViewChild, EventEmitter, Component, ContentChildren, TemplateRef, Output, ComponentFactoryResolver, ApplicationRef, ElementRef, isDevMode, ViewChildren, ContentChild, ViewContainerRef, ChangeDetectorRef, Pipe, LOCALE_ID, forwardRef, NgZone, HostListener, ChangeDetectionStrategy, ViewEncapsulation, NgModuleFactory, Compiler, Renderer2, NgModule } from '@angular/core';
|
|
3
3
|
import { Subject, ReplaySubject, forkJoin, from, combineLatest } from 'rxjs';
|
|
4
4
|
import { takeUntil, catchError, shareReplay, retry, map, mergeMap, debounceTime, distinctUntilChanged, distinct } from 'rxjs/operators';
|
|
5
5
|
import { __awaiter } from 'tslib';
|
|
@@ -159,7 +159,15 @@ ComCtxConstants.LOCALSTORAGE_KEY = {
|
|
|
159
159
|
COLUMN_SETTING: 'COLUMN_SETTING',
|
|
160
160
|
COLOR_SETTING: 'COLOR_SETTING',
|
|
161
161
|
DEFAULT_DATA: 'DEFAULT_DATA',
|
|
162
|
-
ADVANCE_FILTER: 'ADVANCE_FILTER'
|
|
162
|
+
ADVANCE_FILTER: 'ADVANCE_FILTER',
|
|
163
|
+
BUTTON_AUTHORIZE: 'BUTTON_AUTHORIZE',
|
|
164
|
+
BUTTON_SETTING: 'BUTTON_SETTING'
|
|
165
|
+
};
|
|
166
|
+
ComCtxConstants.COMMON_VN = {
|
|
167
|
+
ADD: 'THEM_MOI',
|
|
168
|
+
EDIT: 'SUA',
|
|
169
|
+
DELETE: 'XOA',
|
|
170
|
+
DELETE_MULTIPLE: 'XOA_CAC_MUC_DA_CHON',
|
|
163
171
|
};
|
|
164
172
|
ComCtxConstants.COMMON = {
|
|
165
173
|
ADD: 'ADD',
|
|
@@ -639,6 +647,7 @@ class CrudListSetting {
|
|
|
639
647
|
this.useCommonSearch = false;
|
|
640
648
|
this.useCommonFullTextSearch = true;
|
|
641
649
|
this.hiddenSearch = false;
|
|
650
|
+
this.hiddenAuthorizeButton = false;
|
|
642
651
|
this.hiddenHeader = false;
|
|
643
652
|
this.hiddenPageSetting = false;
|
|
644
653
|
this.hiddenTextPage = false;
|
|
@@ -1453,6 +1462,7 @@ class DropdownControlSchema extends DataSourceControlSchema {
|
|
|
1453
1462
|
this.searchMultiple = true;
|
|
1454
1463
|
this.disableDisplayFieldServerSearch = false;
|
|
1455
1464
|
this.loadOnInit = false;
|
|
1465
|
+
this.isLazyLoad = false;
|
|
1456
1466
|
this.allowLoadDataWhenParentNull = false;
|
|
1457
1467
|
this.disabledParentItem = true;
|
|
1458
1468
|
for (const key in init) {
|
|
@@ -1763,6 +1773,15 @@ class PopupSize {
|
|
|
1763
1773
|
}
|
|
1764
1774
|
}
|
|
1765
1775
|
}
|
|
1776
|
+
class ButtonAction {
|
|
1777
|
+
constructor(init) {
|
|
1778
|
+
this.lstElement = [];
|
|
1779
|
+
this.isAuthorize = false;
|
|
1780
|
+
for (const key in init) {
|
|
1781
|
+
this[key] = init[key];
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1766
1785
|
class EventData {
|
|
1767
1786
|
constructor(init) {
|
|
1768
1787
|
for (const key in init) {
|
|
@@ -2196,6 +2215,7 @@ class AuthenService {
|
|
|
2196
2215
|
Object.keys(sessionStorage).filter(item => /^AUTHORIZATION/.test(item) || /^V4_AUTHORIZATION/.test(item)).forEach(item => {
|
|
2197
2216
|
sessionStorage.removeItem(item);
|
|
2198
2217
|
});
|
|
2218
|
+
sessionStorage.removeItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE);
|
|
2199
2219
|
sessionStorage.removeItem('profiles');
|
|
2200
2220
|
sessionStorage.removeItem('v4_profiles');
|
|
2201
2221
|
}
|
|
@@ -4469,6 +4489,24 @@ var EnumCanBo;
|
|
|
4469
4489
|
EnumCanBo[EnumCanBo["NGOAI_DON_VI"] = 2] = "NGOAI_DON_VI";
|
|
4470
4490
|
EnumCanBo[EnumCanBo["TRONG_DON_VI"] = 3] = "TRONG_DON_VI";
|
|
4471
4491
|
})(EnumCanBo || (EnumCanBo = {}));
|
|
4492
|
+
var PermissionName;
|
|
4493
|
+
(function (PermissionName) {
|
|
4494
|
+
PermissionName["WATCH"] = "Xem";
|
|
4495
|
+
PermissionName["ADD"] = "Th\u00EAm m\u1EDBi";
|
|
4496
|
+
PermissionName["EDIT"] = "S\u1EEDa";
|
|
4497
|
+
PermissionName["DELETE"] = "X\u00F3a";
|
|
4498
|
+
PermissionName["DELETE_MULTIPLE"] = "X\u00F3a c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn";
|
|
4499
|
+
})(PermissionName || (PermissionName = {}));
|
|
4500
|
+
var EnumProperties;
|
|
4501
|
+
(function (EnumProperties) {
|
|
4502
|
+
EnumProperties["NG_REFLECT_TEXT"] = "ng-reflect-text";
|
|
4503
|
+
EnumProperties["NG_REFLECT_LABEL"] = "ng-reflect-label";
|
|
4504
|
+
EnumProperties["CRUD_LIST"] = "crud-list";
|
|
4505
|
+
EnumProperties["LABEL"] = "label";
|
|
4506
|
+
EnumProperties["TAG_NAME"] = "tagName";
|
|
4507
|
+
EnumProperties["TOOLTIP"] = "ptooltip";
|
|
4508
|
+
EnumProperties["RESULTS"] = "_results";
|
|
4509
|
+
})(EnumProperties || (EnumProperties = {}));
|
|
4472
4510
|
|
|
4473
4511
|
class ExportItem {
|
|
4474
4512
|
constructor(init) {
|
|
@@ -8635,6 +8673,10 @@ class ComponentBase {
|
|
|
8635
8673
|
this._crudService = injector.get(CrudService);
|
|
8636
8674
|
this._commonService = injector.get(CommonService);
|
|
8637
8675
|
this._datePipe = injector.get(DatePipe);
|
|
8676
|
+
const root = this._appContext.getRootContext();
|
|
8677
|
+
if (!root) {
|
|
8678
|
+
this._appContext.addRootContext(this._componentContext, this._activatedRoute);
|
|
8679
|
+
}
|
|
8638
8680
|
this._componentContext = this._appContext.addComponentContext(this._componentContext, this._activatedRoute, this.getComponentId());
|
|
8639
8681
|
if (this._componentContext) {
|
|
8640
8682
|
this.model = this._componentContext.data;
|
|
@@ -9271,9 +9313,9 @@ const TopicReloadCountCongViecV5 = '__TopicReloadCountCongViecV5';
|
|
|
9271
9313
|
const FieldWorkflowCodeInCrudForm = '_WorkflowCode';
|
|
9272
9314
|
const ɵ0$2 = PermissionBase.READ, ɵ1$1 = PermissionBase.EDIT, ɵ2$1 = PermissionBase.DELETE;
|
|
9273
9315
|
const DataSourcePermissionBase = [
|
|
9274
|
-
{ id: ɵ0$2, ten:
|
|
9275
|
-
{ id: ɵ1$1, ten:
|
|
9276
|
-
{ id: ɵ2$1, ten:
|
|
9316
|
+
{ id: ɵ0$2, ten: PermissionName.WATCH },
|
|
9317
|
+
{ id: ɵ1$1, ten: PermissionName.EDIT },
|
|
9318
|
+
{ id: ɵ2$1, ten: PermissionName.DELETE }
|
|
9277
9319
|
];
|
|
9278
9320
|
const ɵ3 = EnumGioiTinh.NAM, ɵ4 = EnumGioiTinh.NU;
|
|
9279
9321
|
const DataSourceGioiTinh = [
|
|
@@ -15986,250 +16028,6 @@ DataFormBase.propDecorators = {
|
|
|
15986
16028
|
onDataBinded: [{ type: Output }]
|
|
15987
16029
|
};
|
|
15988
16030
|
|
|
15989
|
-
class CauHinhWorkflowService extends BaseService {
|
|
15990
|
-
constructor(http, injector, _moduleConfigService) {
|
|
15991
|
-
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/CauHinhWorkflow`);
|
|
15992
|
-
this._moduleConfigService = _moduleConfigService;
|
|
15993
|
-
this.serviceCode = 'congviec';
|
|
15994
|
-
this.entityName = 'CauHinhWorkflow';
|
|
15995
|
-
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
|
|
15996
|
-
}
|
|
15997
|
-
}
|
|
15998
|
-
CauHinhWorkflowService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CauHinhWorkflowService_Factory() { return new CauHinhWorkflowService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: CauHinhWorkflowService, providedIn: "root" });
|
|
15999
|
-
CauHinhWorkflowService.decorators = [
|
|
16000
|
-
{ type: Injectable, args: [{
|
|
16001
|
-
providedIn: 'root'
|
|
16002
|
-
},] }
|
|
16003
|
-
];
|
|
16004
|
-
CauHinhWorkflowService.ctorParameters = () => [
|
|
16005
|
-
{ type: HttpClient },
|
|
16006
|
-
{ type: Injector },
|
|
16007
|
-
{ type: ModuleConfigService }
|
|
16008
|
-
];
|
|
16009
|
-
|
|
16010
|
-
class StateMachinesService extends BaseService {
|
|
16011
|
-
constructor(http, injector, _moduleConfigService) {
|
|
16012
|
-
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/StateMachines`);
|
|
16013
|
-
this._moduleConfigService = _moduleConfigService;
|
|
16014
|
-
this.entityName = 'StateMachines';
|
|
16015
|
-
this.serviceCode = 'workflow';
|
|
16016
|
-
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint;
|
|
16017
|
-
}
|
|
16018
|
-
changeState(itemWorkflowHistory) {
|
|
16019
|
-
return this.defaultPost(`${this.serviceUri}/ChangeState`, itemWorkflowHistory);
|
|
16020
|
-
}
|
|
16021
|
-
rollback(rowData) {
|
|
16022
|
-
return this.defaultPost(`${this.serviceUri}/Rollback/${rowData.__workflowCode}/${rowData.id}`, {});
|
|
16023
|
-
}
|
|
16024
|
-
getUserInProcessForm(workflowCode, stateCode, actionCode, itemId) {
|
|
16025
|
-
return this.defaultPost(`${this.serviceUri}/GetUserInProcessForm/${workflowCode}/${stateCode}/${actionCode}/${itemId}`, {});
|
|
16026
|
-
}
|
|
16027
|
-
}
|
|
16028
|
-
StateMachinesService.ɵprov = i0.ɵɵdefineInjectable({ factory: function StateMachinesService_Factory() { return new StateMachinesService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: StateMachinesService, providedIn: "root" });
|
|
16029
|
-
StateMachinesService.decorators = [
|
|
16030
|
-
{ type: Injectable, args: [{
|
|
16031
|
-
providedIn: 'root'
|
|
16032
|
-
},] }
|
|
16033
|
-
];
|
|
16034
|
-
StateMachinesService.ctorParameters = () => [
|
|
16035
|
-
{ type: HttpClient },
|
|
16036
|
-
{ type: Injector },
|
|
16037
|
-
{ type: ModuleConfigService }
|
|
16038
|
-
];
|
|
16039
|
-
|
|
16040
|
-
class DmLoaiCongViecService extends BaseService {
|
|
16041
|
-
constructor(http, injector, _moduleConfigService) {
|
|
16042
|
-
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/DM_LoaiCongViec`);
|
|
16043
|
-
this._moduleConfigService = _moduleConfigService;
|
|
16044
|
-
this.serviceCode = 'congviec';
|
|
16045
|
-
this.entityName = 'DM_LoaiCongViec';
|
|
16046
|
-
this.dicLoaiCongViec = {};
|
|
16047
|
-
this.keyIdLoaiCongViecRoot = 'root';
|
|
16048
|
-
this.getWorkflowSettingByIdLoaiCongViec = (idLoaiCongViec) => __awaiter(this, void 0, void 0, function* () {
|
|
16049
|
-
if (!this.dicWorkflowByLoaiCongViec) {
|
|
16050
|
-
yield this.getDatasourceWorkflowCongViec();
|
|
16051
|
-
}
|
|
16052
|
-
if (!idLoaiCongViec) {
|
|
16053
|
-
return this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot];
|
|
16054
|
-
}
|
|
16055
|
-
let result = this.dicWorkflowByLoaiCongViec[idLoaiCongViec];
|
|
16056
|
-
if (result)
|
|
16057
|
-
return result;
|
|
16058
|
-
const idLoaiCongViecs = yield this.getIdLoaiCongViecs(idLoaiCongViec);
|
|
16059
|
-
if (!Array.isArray(idLoaiCongViecs))
|
|
16060
|
-
return null;
|
|
16061
|
-
if (idLoaiCongViecs.length > 1) {
|
|
16062
|
-
for (let i = idLoaiCongViecs.length - 2; i >= 0; i--) {
|
|
16063
|
-
result = this.dicWorkflowByLoaiCongViec[idLoaiCongViecs[i]];
|
|
16064
|
-
if (result)
|
|
16065
|
-
return result;
|
|
16066
|
-
}
|
|
16067
|
-
}
|
|
16068
|
-
if (!result) {
|
|
16069
|
-
result = this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot];
|
|
16070
|
-
}
|
|
16071
|
-
return result;
|
|
16072
|
-
});
|
|
16073
|
-
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
|
|
16074
|
-
}
|
|
16075
|
-
getDatasourceWorkflowCongViec() {
|
|
16076
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
16077
|
-
if (!this.dicWorkflowByLoaiCongViec) {
|
|
16078
|
-
this.dicWorkflowByLoaiCongViec = {};
|
|
16079
|
-
}
|
|
16080
|
-
const cauHinhWorkflowService = this._injector.get(CauHinhWorkflowService);
|
|
16081
|
-
const cauHinhWorkflows = (yield cauHinhWorkflowService.getAll([], 'idLoaiCongViec,workflowCodes,workflowCode')).data;
|
|
16082
|
-
const notifierService = this._injector.get(NotifierService);
|
|
16083
|
-
if (cauHinhWorkflows == null) {
|
|
16084
|
-
notifierService.showWarning('Dịch vụ workflow không phản hồi');
|
|
16085
|
-
return [];
|
|
16086
|
-
}
|
|
16087
|
-
const workflowCodes = [];
|
|
16088
|
-
cauHinhWorkflows.forEach(itemWorkflowSetting => {
|
|
16089
|
-
if (itemWorkflowSetting.workflowCodes && !Array.isArray(itemWorkflowSetting.workflowCodes)) {
|
|
16090
|
-
itemWorkflowSetting.workflowCodes = itemWorkflowSetting.workflowCodes.split(',');
|
|
16091
|
-
}
|
|
16092
|
-
else {
|
|
16093
|
-
itemWorkflowSetting.workflowCodes = [];
|
|
16094
|
-
}
|
|
16095
|
-
itemWorkflowSetting.workflowCodes.forEach(workflowCode => {
|
|
16096
|
-
if (workflowCodes.indexOf(workflowCode) == -1) {
|
|
16097
|
-
workflowCodes.push(workflowCode);
|
|
16098
|
-
}
|
|
16099
|
-
});
|
|
16100
|
-
});
|
|
16101
|
-
const stateMachinesService = this._injector.get(StateMachinesService);
|
|
16102
|
-
const workflows = (yield stateMachinesService.getDataDropdownByFilter([
|
|
16103
|
-
this.newFilter('code', Operator.in, workflowCodes)
|
|
16104
|
-
], new DropdownOptions({
|
|
16105
|
-
valueField: 'code',
|
|
16106
|
-
displayField: 'title',
|
|
16107
|
-
fieldPlus: 'data'
|
|
16108
|
-
})));
|
|
16109
|
-
workflows.forEach(item => {
|
|
16110
|
-
item.data = JSON.parse(item.data);
|
|
16111
|
-
const stateMachineData = item.data;
|
|
16112
|
-
stateMachineData.actions = {};
|
|
16113
|
-
stateMachineData.machines.forEach(machine => {
|
|
16114
|
-
stateMachineData.actions[machine.code] = [];
|
|
16115
|
-
stateMachineData.connections.forEach(conn => {
|
|
16116
|
-
if (conn.source == machine.id) {
|
|
16117
|
-
stateMachineData.actions[machine.code].push(conn);
|
|
16118
|
-
}
|
|
16119
|
-
});
|
|
16120
|
-
});
|
|
16121
|
-
});
|
|
16122
|
-
cauHinhWorkflows.forEach(itemWorkflowSetting => {
|
|
16123
|
-
itemWorkflowSetting.workflows = workflows.filter(q => itemWorkflowSetting.workflowCodes.indexOf(q.code) > -1);
|
|
16124
|
-
if (!itemWorkflowSetting.idLoaiCongViec) {
|
|
16125
|
-
this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot] = itemWorkflowSetting;
|
|
16126
|
-
}
|
|
16127
|
-
else {
|
|
16128
|
-
this.dicWorkflowByLoaiCongViec[itemWorkflowSetting.idLoaiCongViec] = itemWorkflowSetting;
|
|
16129
|
-
}
|
|
16130
|
-
});
|
|
16131
|
-
return workflows;
|
|
16132
|
-
});
|
|
16133
|
-
}
|
|
16134
|
-
getIdLoaiCongViecs(idLoaiCongViec) {
|
|
16135
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
16136
|
-
const notifierService = this._injector.get(NotifierService);
|
|
16137
|
-
const itemLoaiCongViec = yield this.getItemLoaiCongViec(idLoaiCongViec);
|
|
16138
|
-
if (itemLoaiCongViec == null) {
|
|
16139
|
-
notifierService.showWarning('Loại công việc không tồn tại');
|
|
16140
|
-
return null;
|
|
16141
|
-
}
|
|
16142
|
-
const idLoaiCongViecs = itemLoaiCongViec.idDuongDan.split(';').filter(q => !!q);
|
|
16143
|
-
return idLoaiCongViecs;
|
|
16144
|
-
});
|
|
16145
|
-
}
|
|
16146
|
-
getItemLoaiCongViec(idLoaiCongViec) {
|
|
16147
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
16148
|
-
if (!this.dicLoaiCongViec[idLoaiCongViec]) {
|
|
16149
|
-
this.dicLoaiCongViec[idLoaiCongViec] = (yield this.getDetail(idLoaiCongViec)).data;
|
|
16150
|
-
}
|
|
16151
|
-
return this.dicLoaiCongViec[idLoaiCongViec];
|
|
16152
|
-
});
|
|
16153
|
-
}
|
|
16154
|
-
}
|
|
16155
|
-
DmLoaiCongViecService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DmLoaiCongViecService_Factory() { return new DmLoaiCongViecService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: DmLoaiCongViecService, providedIn: "root" });
|
|
16156
|
-
DmLoaiCongViecService.decorators = [
|
|
16157
|
-
{ type: Injectable, args: [{
|
|
16158
|
-
providedIn: 'root'
|
|
16159
|
-
},] }
|
|
16160
|
-
];
|
|
16161
|
-
DmLoaiCongViecService.ctorParameters = () => [
|
|
16162
|
-
{ type: HttpClient },
|
|
16163
|
-
{ type: Injector },
|
|
16164
|
-
{ type: ModuleConfigService }
|
|
16165
|
-
];
|
|
16166
|
-
|
|
16167
|
-
class CongViecService extends BaseService {
|
|
16168
|
-
constructor(http, injector, _moduleConfigService, _dmLoaiCongViecService) {
|
|
16169
|
-
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/vanbanden`);
|
|
16170
|
-
this._dmLoaiCongViecService = _dmLoaiCongViecService;
|
|
16171
|
-
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint;
|
|
16172
|
-
this._moduleConfig = _moduleConfigService.getConfig();
|
|
16173
|
-
}
|
|
16174
|
-
adjustSettingWorkflowForCrudList(setting) {
|
|
16175
|
-
this.useWorkflow = true;
|
|
16176
|
-
setting.isWorkflowTree = true;
|
|
16177
|
-
setting.baseService = this;
|
|
16178
|
-
setting.displayField = (item) => item.ten;
|
|
16179
|
-
setting.baseService.useWorkflow = true;
|
|
16180
|
-
setting.workflowConfigAdvance = {
|
|
16181
|
-
getWorkflowSetting: this.getWorkflowConfig.bind(this)
|
|
16182
|
-
};
|
|
16183
|
-
}
|
|
16184
|
-
getWorkflowConfig(rowData) {
|
|
16185
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
16186
|
-
return yield this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(rowData.idLoaiCongViec);
|
|
16187
|
-
});
|
|
16188
|
-
}
|
|
16189
|
-
countByMenuState(data) {
|
|
16190
|
-
return this.defaultPost(`${this.serviceUri}/CountByMenuState`, data);
|
|
16191
|
-
}
|
|
16192
|
-
getDicIdByMenuState(data, tuNgay, denNgay) {
|
|
16193
|
-
return this.defaultPost(`${this.serviceUri}/GetDicIdByMenuState`, {
|
|
16194
|
-
lstTrangThai: data,
|
|
16195
|
-
tuNgay,
|
|
16196
|
-
denNgay
|
|
16197
|
-
});
|
|
16198
|
-
}
|
|
16199
|
-
updateBulkIdCha(model) {
|
|
16200
|
-
const url = `${this.serviceUri}/UpdateBulkIdCha`;
|
|
16201
|
-
return this.defaultPost(url, model);
|
|
16202
|
-
}
|
|
16203
|
-
deleteBulkCongViecCon(ids) {
|
|
16204
|
-
const url = `${this.serviceUri}/DeleteBulkCongViecCon`;
|
|
16205
|
-
return this.defaultPost(url, ids);
|
|
16206
|
-
}
|
|
16207
|
-
getDataDashboardCaNhan(inputData) {
|
|
16208
|
-
const url = `${this.serviceUri}/GetDataDashboardCaNhan`;
|
|
16209
|
-
return this.defaultPost(url, inputData);
|
|
16210
|
-
}
|
|
16211
|
-
getDataDashboardByDonVi(inputData) {
|
|
16212
|
-
const url = `${this.serviceUri}/GetDataDashboardByDonVi`;
|
|
16213
|
-
return this.defaultPost(url, inputData);
|
|
16214
|
-
}
|
|
16215
|
-
getListTasksDashboard(dataFilter) {
|
|
16216
|
-
const url = `${this.serviceUri}/getListTasksDashboard`;
|
|
16217
|
-
return this.defaultPost(url, dataFilter);
|
|
16218
|
-
}
|
|
16219
|
-
}
|
|
16220
|
-
CongViecService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CongViecService_Factory() { return new CongViecService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(DmLoaiCongViecService)); }, token: CongViecService, providedIn: "root" });
|
|
16221
|
-
CongViecService.decorators = [
|
|
16222
|
-
{ type: Injectable, args: [{
|
|
16223
|
-
providedIn: 'root'
|
|
16224
|
-
},] }
|
|
16225
|
-
];
|
|
16226
|
-
CongViecService.ctorParameters = () => [
|
|
16227
|
-
{ type: HttpClient },
|
|
16228
|
-
{ type: Injector },
|
|
16229
|
-
{ type: ModuleConfigService },
|
|
16230
|
-
{ type: DmLoaiCongViecService }
|
|
16231
|
-
];
|
|
16232
|
-
|
|
16233
16031
|
class SearchInfo {
|
|
16234
16032
|
constructor(init) {
|
|
16235
16033
|
this.fieldSearchText = [];
|
|
@@ -17951,6 +17749,250 @@ CanBoHoSoService.ctorParameters = () => [
|
|
|
17951
17749
|
{ type: CrudService }
|
|
17952
17750
|
];
|
|
17953
17751
|
|
|
17752
|
+
class StateMachinesService extends BaseService {
|
|
17753
|
+
constructor(http, injector, _moduleConfigService) {
|
|
17754
|
+
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/StateMachines`);
|
|
17755
|
+
this._moduleConfigService = _moduleConfigService;
|
|
17756
|
+
this.entityName = 'StateMachines';
|
|
17757
|
+
this.serviceCode = 'workflow';
|
|
17758
|
+
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint;
|
|
17759
|
+
}
|
|
17760
|
+
changeState(itemWorkflowHistory) {
|
|
17761
|
+
return this.defaultPost(`${this.serviceUri}/ChangeState`, itemWorkflowHistory);
|
|
17762
|
+
}
|
|
17763
|
+
rollback(rowData) {
|
|
17764
|
+
return this.defaultPost(`${this.serviceUri}/Rollback/${rowData.__workflowCode}/${rowData.id}`, {});
|
|
17765
|
+
}
|
|
17766
|
+
getUserInProcessForm(workflowCode, stateCode, actionCode, itemId) {
|
|
17767
|
+
return this.defaultPost(`${this.serviceUri}/GetUserInProcessForm/${workflowCode}/${stateCode}/${actionCode}/${itemId}`, {});
|
|
17768
|
+
}
|
|
17769
|
+
}
|
|
17770
|
+
StateMachinesService.ɵprov = i0.ɵɵdefineInjectable({ factory: function StateMachinesService_Factory() { return new StateMachinesService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: StateMachinesService, providedIn: "root" });
|
|
17771
|
+
StateMachinesService.decorators = [
|
|
17772
|
+
{ type: Injectable, args: [{
|
|
17773
|
+
providedIn: 'root'
|
|
17774
|
+
},] }
|
|
17775
|
+
];
|
|
17776
|
+
StateMachinesService.ctorParameters = () => [
|
|
17777
|
+
{ type: HttpClient },
|
|
17778
|
+
{ type: Injector },
|
|
17779
|
+
{ type: ModuleConfigService }
|
|
17780
|
+
];
|
|
17781
|
+
|
|
17782
|
+
class CauHinhWorkflowService extends BaseService {
|
|
17783
|
+
constructor(http, injector, _moduleConfigService) {
|
|
17784
|
+
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/CauHinhWorkflow`);
|
|
17785
|
+
this._moduleConfigService = _moduleConfigService;
|
|
17786
|
+
this.serviceCode = 'congviec';
|
|
17787
|
+
this.entityName = 'CauHinhWorkflow';
|
|
17788
|
+
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
|
|
17789
|
+
}
|
|
17790
|
+
}
|
|
17791
|
+
CauHinhWorkflowService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CauHinhWorkflowService_Factory() { return new CauHinhWorkflowService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: CauHinhWorkflowService, providedIn: "root" });
|
|
17792
|
+
CauHinhWorkflowService.decorators = [
|
|
17793
|
+
{ type: Injectable, args: [{
|
|
17794
|
+
providedIn: 'root'
|
|
17795
|
+
},] }
|
|
17796
|
+
];
|
|
17797
|
+
CauHinhWorkflowService.ctorParameters = () => [
|
|
17798
|
+
{ type: HttpClient },
|
|
17799
|
+
{ type: Injector },
|
|
17800
|
+
{ type: ModuleConfigService }
|
|
17801
|
+
];
|
|
17802
|
+
|
|
17803
|
+
class DmLoaiCongViecService extends BaseService {
|
|
17804
|
+
constructor(http, injector, _moduleConfigService) {
|
|
17805
|
+
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/DM_LoaiCongViec`);
|
|
17806
|
+
this._moduleConfigService = _moduleConfigService;
|
|
17807
|
+
this.serviceCode = 'congviec';
|
|
17808
|
+
this.entityName = 'DM_LoaiCongViec';
|
|
17809
|
+
this.dicLoaiCongViec = {};
|
|
17810
|
+
this.keyIdLoaiCongViecRoot = 'root';
|
|
17811
|
+
this.getWorkflowSettingByIdLoaiCongViec = (idLoaiCongViec) => __awaiter(this, void 0, void 0, function* () {
|
|
17812
|
+
if (!this.dicWorkflowByLoaiCongViec) {
|
|
17813
|
+
yield this.getDatasourceWorkflowCongViec();
|
|
17814
|
+
}
|
|
17815
|
+
if (!idLoaiCongViec) {
|
|
17816
|
+
return this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot];
|
|
17817
|
+
}
|
|
17818
|
+
let result = this.dicWorkflowByLoaiCongViec[idLoaiCongViec];
|
|
17819
|
+
if (result)
|
|
17820
|
+
return result;
|
|
17821
|
+
const idLoaiCongViecs = yield this.getIdLoaiCongViecs(idLoaiCongViec);
|
|
17822
|
+
if (!Array.isArray(idLoaiCongViecs))
|
|
17823
|
+
return null;
|
|
17824
|
+
if (idLoaiCongViecs.length > 1) {
|
|
17825
|
+
for (let i = idLoaiCongViecs.length - 2; i >= 0; i--) {
|
|
17826
|
+
result = this.dicWorkflowByLoaiCongViec[idLoaiCongViecs[i]];
|
|
17827
|
+
if (result)
|
|
17828
|
+
return result;
|
|
17829
|
+
}
|
|
17830
|
+
}
|
|
17831
|
+
if (!result) {
|
|
17832
|
+
result = this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot];
|
|
17833
|
+
}
|
|
17834
|
+
return result;
|
|
17835
|
+
});
|
|
17836
|
+
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.congviecEndpoint;
|
|
17837
|
+
}
|
|
17838
|
+
getDatasourceWorkflowCongViec() {
|
|
17839
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17840
|
+
if (!this.dicWorkflowByLoaiCongViec) {
|
|
17841
|
+
this.dicWorkflowByLoaiCongViec = {};
|
|
17842
|
+
}
|
|
17843
|
+
const cauHinhWorkflowService = this._injector.get(CauHinhWorkflowService);
|
|
17844
|
+
const cauHinhWorkflows = (yield cauHinhWorkflowService.getAll([], 'idLoaiCongViec,workflowCodes,workflowCode')).data;
|
|
17845
|
+
const notifierService = this._injector.get(NotifierService);
|
|
17846
|
+
if (cauHinhWorkflows == null) {
|
|
17847
|
+
notifierService.showWarning('Dịch vụ workflow không phản hồi');
|
|
17848
|
+
return [];
|
|
17849
|
+
}
|
|
17850
|
+
const workflowCodes = [];
|
|
17851
|
+
cauHinhWorkflows.forEach(itemWorkflowSetting => {
|
|
17852
|
+
if (itemWorkflowSetting.workflowCodes && !Array.isArray(itemWorkflowSetting.workflowCodes)) {
|
|
17853
|
+
itemWorkflowSetting.workflowCodes = itemWorkflowSetting.workflowCodes.split(',');
|
|
17854
|
+
}
|
|
17855
|
+
else {
|
|
17856
|
+
itemWorkflowSetting.workflowCodes = [];
|
|
17857
|
+
}
|
|
17858
|
+
itemWorkflowSetting.workflowCodes.forEach(workflowCode => {
|
|
17859
|
+
if (workflowCodes.indexOf(workflowCode) == -1) {
|
|
17860
|
+
workflowCodes.push(workflowCode);
|
|
17861
|
+
}
|
|
17862
|
+
});
|
|
17863
|
+
});
|
|
17864
|
+
const stateMachinesService = this._injector.get(StateMachinesService);
|
|
17865
|
+
const workflows = (yield stateMachinesService.getDataDropdownByFilter([
|
|
17866
|
+
this.newFilter('code', Operator.in, workflowCodes)
|
|
17867
|
+
], new DropdownOptions({
|
|
17868
|
+
valueField: 'code',
|
|
17869
|
+
displayField: 'title',
|
|
17870
|
+
fieldPlus: 'data'
|
|
17871
|
+
})));
|
|
17872
|
+
workflows.forEach(item => {
|
|
17873
|
+
item.data = JSON.parse(item.data);
|
|
17874
|
+
const stateMachineData = item.data;
|
|
17875
|
+
stateMachineData.actions = {};
|
|
17876
|
+
stateMachineData.machines.forEach(machine => {
|
|
17877
|
+
stateMachineData.actions[machine.code] = [];
|
|
17878
|
+
stateMachineData.connections.forEach(conn => {
|
|
17879
|
+
if (conn.source == machine.id) {
|
|
17880
|
+
stateMachineData.actions[machine.code].push(conn);
|
|
17881
|
+
}
|
|
17882
|
+
});
|
|
17883
|
+
});
|
|
17884
|
+
});
|
|
17885
|
+
cauHinhWorkflows.forEach(itemWorkflowSetting => {
|
|
17886
|
+
itemWorkflowSetting.workflows = workflows.filter(q => itemWorkflowSetting.workflowCodes.indexOf(q.code) > -1);
|
|
17887
|
+
if (!itemWorkflowSetting.idLoaiCongViec) {
|
|
17888
|
+
this.dicWorkflowByLoaiCongViec[this.keyIdLoaiCongViecRoot] = itemWorkflowSetting;
|
|
17889
|
+
}
|
|
17890
|
+
else {
|
|
17891
|
+
this.dicWorkflowByLoaiCongViec[itemWorkflowSetting.idLoaiCongViec] = itemWorkflowSetting;
|
|
17892
|
+
}
|
|
17893
|
+
});
|
|
17894
|
+
return workflows;
|
|
17895
|
+
});
|
|
17896
|
+
}
|
|
17897
|
+
getIdLoaiCongViecs(idLoaiCongViec) {
|
|
17898
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17899
|
+
const notifierService = this._injector.get(NotifierService);
|
|
17900
|
+
const itemLoaiCongViec = yield this.getItemLoaiCongViec(idLoaiCongViec);
|
|
17901
|
+
if (itemLoaiCongViec == null) {
|
|
17902
|
+
notifierService.showWarning('Loại công việc không tồn tại');
|
|
17903
|
+
return null;
|
|
17904
|
+
}
|
|
17905
|
+
const idLoaiCongViecs = itemLoaiCongViec.idDuongDan.split(';').filter(q => !!q);
|
|
17906
|
+
return idLoaiCongViecs;
|
|
17907
|
+
});
|
|
17908
|
+
}
|
|
17909
|
+
getItemLoaiCongViec(idLoaiCongViec) {
|
|
17910
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17911
|
+
if (!this.dicLoaiCongViec[idLoaiCongViec]) {
|
|
17912
|
+
this.dicLoaiCongViec[idLoaiCongViec] = (yield this.getDetail(idLoaiCongViec)).data;
|
|
17913
|
+
}
|
|
17914
|
+
return this.dicLoaiCongViec[idLoaiCongViec];
|
|
17915
|
+
});
|
|
17916
|
+
}
|
|
17917
|
+
}
|
|
17918
|
+
DmLoaiCongViecService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DmLoaiCongViecService_Factory() { return new DmLoaiCongViecService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: DmLoaiCongViecService, providedIn: "root" });
|
|
17919
|
+
DmLoaiCongViecService.decorators = [
|
|
17920
|
+
{ type: Injectable, args: [{
|
|
17921
|
+
providedIn: 'root'
|
|
17922
|
+
},] }
|
|
17923
|
+
];
|
|
17924
|
+
DmLoaiCongViecService.ctorParameters = () => [
|
|
17925
|
+
{ type: HttpClient },
|
|
17926
|
+
{ type: Injector },
|
|
17927
|
+
{ type: ModuleConfigService }
|
|
17928
|
+
];
|
|
17929
|
+
|
|
17930
|
+
class CongViecService extends BaseService {
|
|
17931
|
+
constructor(http, injector, _moduleConfigService, _dmLoaiCongViecService) {
|
|
17932
|
+
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/vanbanden`);
|
|
17933
|
+
this._dmLoaiCongViecService = _dmLoaiCongViecService;
|
|
17934
|
+
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.vanbanEndpoint;
|
|
17935
|
+
this._moduleConfig = _moduleConfigService.getConfig();
|
|
17936
|
+
}
|
|
17937
|
+
adjustSettingWorkflowForCrudList(setting) {
|
|
17938
|
+
this.useWorkflow = true;
|
|
17939
|
+
setting.isWorkflowTree = true;
|
|
17940
|
+
setting.baseService = this;
|
|
17941
|
+
setting.displayField = (item) => item.ten;
|
|
17942
|
+
setting.baseService.useWorkflow = true;
|
|
17943
|
+
setting.workflowConfigAdvance = {
|
|
17944
|
+
getWorkflowSetting: this.getWorkflowConfig.bind(this)
|
|
17945
|
+
};
|
|
17946
|
+
}
|
|
17947
|
+
getWorkflowConfig(rowData) {
|
|
17948
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17949
|
+
return yield this._dmLoaiCongViecService.getWorkflowSettingByIdLoaiCongViec(rowData.idLoaiCongViec);
|
|
17950
|
+
});
|
|
17951
|
+
}
|
|
17952
|
+
countByMenuState(data) {
|
|
17953
|
+
return this.defaultPost(`${this.serviceUri}/CountByMenuState`, data);
|
|
17954
|
+
}
|
|
17955
|
+
getDicIdByMenuState(data, tuNgay, denNgay) {
|
|
17956
|
+
return this.defaultPost(`${this.serviceUri}/GetDicIdByMenuState`, {
|
|
17957
|
+
lstTrangThai: data,
|
|
17958
|
+
tuNgay,
|
|
17959
|
+
denNgay
|
|
17960
|
+
});
|
|
17961
|
+
}
|
|
17962
|
+
updateBulkIdCha(model) {
|
|
17963
|
+
const url = `${this.serviceUri}/UpdateBulkIdCha`;
|
|
17964
|
+
return this.defaultPost(url, model);
|
|
17965
|
+
}
|
|
17966
|
+
deleteBulkCongViecCon(ids) {
|
|
17967
|
+
const url = `${this.serviceUri}/DeleteBulkCongViecCon`;
|
|
17968
|
+
return this.defaultPost(url, ids);
|
|
17969
|
+
}
|
|
17970
|
+
getDataDashboardCaNhan(inputData) {
|
|
17971
|
+
const url = `${this.serviceUri}/GetDataDashboardCaNhan`;
|
|
17972
|
+
return this.defaultPost(url, inputData);
|
|
17973
|
+
}
|
|
17974
|
+
getDataDashboardByDonVi(inputData) {
|
|
17975
|
+
const url = `${this.serviceUri}/GetDataDashboardByDonVi`;
|
|
17976
|
+
return this.defaultPost(url, inputData);
|
|
17977
|
+
}
|
|
17978
|
+
getListTasksDashboard(dataFilter) {
|
|
17979
|
+
const url = `${this.serviceUri}/getListTasksDashboard`;
|
|
17980
|
+
return this.defaultPost(url, dataFilter);
|
|
17981
|
+
}
|
|
17982
|
+
}
|
|
17983
|
+
CongViecService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CongViecService_Factory() { return new CongViecService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(DmLoaiCongViecService)); }, token: CongViecService, providedIn: "root" });
|
|
17984
|
+
CongViecService.decorators = [
|
|
17985
|
+
{ type: Injectable, args: [{
|
|
17986
|
+
providedIn: 'root'
|
|
17987
|
+
},] }
|
|
17988
|
+
];
|
|
17989
|
+
CongViecService.ctorParameters = () => [
|
|
17990
|
+
{ type: HttpClient },
|
|
17991
|
+
{ type: Injector },
|
|
17992
|
+
{ type: ModuleConfigService },
|
|
17993
|
+
{ type: DmLoaiCongViecService }
|
|
17994
|
+
];
|
|
17995
|
+
|
|
17954
17996
|
class EntityWorkflowHistoryService extends BaseService {
|
|
17955
17997
|
constructor(http, injector, _moduleConfigService) {
|
|
17956
17998
|
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.userOrgEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/EntityWorkflowHistory`);
|
|
@@ -18193,6 +18235,27 @@ WorkflowHistoryService.ctorParameters = () => [
|
|
|
18193
18235
|
{ type: ModuleConfigService }
|
|
18194
18236
|
];
|
|
18195
18237
|
|
|
18238
|
+
class BasePermissionService extends BaseService {
|
|
18239
|
+
constructor(http, injector, _moduleConfigService) {
|
|
18240
|
+
super(http, injector, `${_moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint}/${_moduleConfigService.getConfig().environment.apiVersion}/BasePermission`);
|
|
18241
|
+
this._moduleConfigService = _moduleConfigService;
|
|
18242
|
+
this.entityName = 'BasePermission';
|
|
18243
|
+
this.serviceCode = 'Authorization';
|
|
18244
|
+
this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
|
|
18245
|
+
}
|
|
18246
|
+
}
|
|
18247
|
+
BasePermissionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function BasePermissionService_Factory() { return new BasePermissionService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: BasePermissionService, providedIn: "root" });
|
|
18248
|
+
BasePermissionService.decorators = [
|
|
18249
|
+
{ type: Injectable, args: [{
|
|
18250
|
+
providedIn: 'root'
|
|
18251
|
+
},] }
|
|
18252
|
+
];
|
|
18253
|
+
BasePermissionService.ctorParameters = () => [
|
|
18254
|
+
{ type: HttpClient },
|
|
18255
|
+
{ type: Injector },
|
|
18256
|
+
{ type: ModuleConfigService }
|
|
18257
|
+
];
|
|
18258
|
+
|
|
18196
18259
|
class ListComponentBase extends ComponentBase {
|
|
18197
18260
|
constructor(_injector, _isTreeTable) {
|
|
18198
18261
|
super(_injector);
|
|
@@ -18283,8 +18346,8 @@ class ListComponentBase extends ComponentBase {
|
|
|
18283
18346
|
this.showingActionWorkflow = false;
|
|
18284
18347
|
this.buttonContexts = [];
|
|
18285
18348
|
this.authorizePaths = {};
|
|
18286
|
-
this.buttonApplyAuthorize = {};
|
|
18287
18349
|
this.commonConst = ComCtxConstants.COMMON;
|
|
18350
|
+
this.buttonApplyAuthorize = {};
|
|
18288
18351
|
this._defaultTableClass = 'new-table scr-table crud-list-table';
|
|
18289
18352
|
this._tableClass = '';
|
|
18290
18353
|
this._showSettingsRowColor = false;
|
|
@@ -18315,11 +18378,19 @@ class ListComponentBase extends ComponentBase {
|
|
|
18315
18378
|
this.filter_column = [];
|
|
18316
18379
|
this.dataAdvance = {};
|
|
18317
18380
|
this.searchModel = {};
|
|
18381
|
+
this.authorizeButtonKey = '';
|
|
18382
|
+
this.lstButtonPermission = [];
|
|
18383
|
+
this.lstButtonTemplate = [];
|
|
18384
|
+
this.isBtnReady = false;
|
|
18385
|
+
this.isSuperUser = false;
|
|
18318
18386
|
this.showFormWorkflow = false;
|
|
18319
18387
|
this.headerWorkflow = '';
|
|
18388
|
+
this.lstBtnAuthorizeMenu = [];
|
|
18320
18389
|
this.popupSizeWorkflow = new PopupSize({ width: 950, height: 540 });
|
|
18321
18390
|
this.showHistoryWorkflow = false;
|
|
18391
|
+
this.showAllButtons = false;
|
|
18322
18392
|
this.hiddenBtnFunction = false;
|
|
18393
|
+
this.lstButtonAction = [];
|
|
18323
18394
|
// Biến để kiểm tra lần click đầu tiên của user vào dòng trên grid
|
|
18324
18395
|
// Sử dụng để fix bug set selected row từ form cha, nhưng vào form con ấn sang row khác nó k bỏ selected row đã set từ bên ngoài
|
|
18325
18396
|
this.firstRowClick = true;
|
|
@@ -18353,6 +18424,11 @@ class ListComponentBase extends ComponentBase {
|
|
|
18353
18424
|
this.detailTaskModel = new DialogModel({
|
|
18354
18425
|
header: 'Chi tiết công việc'
|
|
18355
18426
|
});
|
|
18427
|
+
this.buttonAuthorizeModel = new DialogModel({
|
|
18428
|
+
header: 'Phân quyền nút chức năng',
|
|
18429
|
+
popupSize: new PopupSize({ width: 1000, height: 700 }),
|
|
18430
|
+
data: { dataSouce: [] }
|
|
18431
|
+
});
|
|
18356
18432
|
this.shareLinkModel = new DialogModel({
|
|
18357
18433
|
header: 'Chia sẻ quyền',
|
|
18358
18434
|
popupSize: new PopupSize({ width: 650, height: 310 })
|
|
@@ -18362,7 +18438,6 @@ class ListComponentBase extends ComponentBase {
|
|
|
18362
18438
|
});
|
|
18363
18439
|
this.BUTTON_PHAN_QUYEN = ButtonPermission.BUTTON_PHAN_QUYEN;
|
|
18364
18440
|
this.BUTTON_CAU_HINH_QUY_TRINH = ButtonPermission.BUTTON_CAU_HINH_QUY_TRINH;
|
|
18365
|
-
this.lstButtonPermission = [];
|
|
18366
18441
|
this.buttonPermissionMap = new Map();
|
|
18367
18442
|
this.sourceIcon = {};
|
|
18368
18443
|
this.stopCalculatingFunctionColumnWidth = false;
|
|
@@ -18603,6 +18678,7 @@ class ListComponentBase extends ComponentBase {
|
|
|
18603
18678
|
this._templateInstanceService = this._injector.get(TemplateInstanceService);
|
|
18604
18679
|
this._printService = this._injector.get(PrintService);
|
|
18605
18680
|
this._federationService = this._injector.get(FederationService);
|
|
18681
|
+
this._basePermissionService = this._injector.get(BasePermissionService);
|
|
18606
18682
|
this.handleCheckAll = this.handleCheckAll.bind(this);
|
|
18607
18683
|
this.handleCheckAll_Group = this.handleCheckAll_Group.bind(this);
|
|
18608
18684
|
this.environment = this._moduleConfigService.getConfig().environment;
|
|
@@ -18699,6 +18775,7 @@ class ListComponentBase extends ComponentBase {
|
|
|
18699
18775
|
const temp = userService.getCurrentUser();
|
|
18700
18776
|
if (temp != null) {
|
|
18701
18777
|
this.currentUser = new TnUser(userService.getCurrentUser());
|
|
18778
|
+
this.isSuperUser = this.currentUser.issuperuser.toLowerCase() === 'true';
|
|
18702
18779
|
}
|
|
18703
18780
|
if (this.currentUser == null) {
|
|
18704
18781
|
for (const buttonPermissionCode of this.lstButtonPermission) {
|
|
@@ -19220,7 +19297,6 @@ class ListComponentBase extends ComponentBase {
|
|
|
19220
19297
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19221
19298
|
this.filter_commonSearch = data.filters;
|
|
19222
19299
|
this.dataSearchCommon = data.dataForm;
|
|
19223
|
-
yield this.onSearched.emit(data);
|
|
19224
19300
|
this.setting.pageSetting.page = 1;
|
|
19225
19301
|
this.getData();
|
|
19226
19302
|
});
|
|
@@ -19473,15 +19549,17 @@ class ListComponentBase extends ComponentBase {
|
|
|
19473
19549
|
getMenuButtonAuthorized(menuButtons) {
|
|
19474
19550
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19475
19551
|
const authorizedButtons = [];
|
|
19476
|
-
const serviceCodeByBase = this.setting.baseService != null ? this.setting.baseService.serviceCode : '';
|
|
19552
|
+
const serviceCodeByBase = this.setting.baseService != null ? this.setting.baseService.serviceCode.toUpperCase() : '';
|
|
19477
19553
|
const promises = [];
|
|
19478
19554
|
for (const item of menuButtons) {
|
|
19479
|
-
|
|
19555
|
+
const permission = this.lstBtnAuthorizeMenu.find(p => p.rawText == item.label);
|
|
19556
|
+
if (!item.authorizationPermission && !permission) {
|
|
19480
19557
|
authorizedButtons.push(item);
|
|
19481
19558
|
continue;
|
|
19482
19559
|
}
|
|
19483
19560
|
const serviceCode = item.authorizationServiceCode ? item.authorizationServiceCode : serviceCodeByBase;
|
|
19484
|
-
|
|
19561
|
+
const permissionCode = permission ? permission.permissionCode : item.authorizationPermission;
|
|
19562
|
+
promises.push(this._permissionService.isAuthorized(serviceCode, permissionCode, true).then(authorized => {
|
|
19485
19563
|
if (authorized !== true) {
|
|
19486
19564
|
return;
|
|
19487
19565
|
}
|
|
@@ -20524,7 +20602,8 @@ class ListComponentBase extends ComponentBase {
|
|
|
20524
20602
|
return __awaiter(this, void 0, void 0, function* () {
|
|
20525
20603
|
for (const rowData of this.model.dataSource) {
|
|
20526
20604
|
try {
|
|
20527
|
-
|
|
20605
|
+
const total = (yield this.getMenuButtonAuthorized((_a = yield this.menuButtons(rowData)) !== null && _a !== void 0 ? _a : []));
|
|
20606
|
+
rowData.disableFunctionRow = total.length < 1 && this.setting.disableShare;
|
|
20528
20607
|
}
|
|
20529
20608
|
catch (ex) {
|
|
20530
20609
|
this.hiddenBtnFunction = true;
|
|
@@ -21247,6 +21326,96 @@ class ListComponentBase extends ComponentBase {
|
|
|
21247
21326
|
});
|
|
21248
21327
|
});
|
|
21249
21328
|
}
|
|
21329
|
+
handleShowFormSettingButton() {
|
|
21330
|
+
var _a, _b, _c, _d, _e;
|
|
21331
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21332
|
+
// Tổng hợp dữ liệu các nút từ ngTemplate + base + menuButton
|
|
21333
|
+
this.buttonAuthorizeModel.data.dataSource = [];
|
|
21334
|
+
const lstBtnCustom = this.lstButtonElement[EnumProperties.RESULTS].concat(this.lstButtonTemplate);
|
|
21335
|
+
const lstBtnAction = [];
|
|
21336
|
+
for (const item of lstBtnCustom) {
|
|
21337
|
+
const buttonText = (_c = (_b = (_a = item.nativeElement.getAttribute(EnumProperties.LABEL)) !== null && _a !== void 0 ? _a : item.nativeElement.getAttribute(EnumProperties.NG_REFLECT_TEXT)) !== null && _b !== void 0 ? _b : item.nativeElement.getAttribute(EnumProperties.NG_REFLECT_LABEL)) !== null && _c !== void 0 ? _c : item.nativeElement.innerText;
|
|
21338
|
+
if (!buttonText || lstBtnAction.some(p => p.rawText === buttonText)) {
|
|
21339
|
+
continue;
|
|
21340
|
+
}
|
|
21341
|
+
this.addButtonAction(lstBtnAction, this.authorizeButtonKey, buttonText);
|
|
21342
|
+
}
|
|
21343
|
+
const lstMenuButtons = (_d = yield this.menuButtons({})) !== null && _d !== void 0 ? _d : [];
|
|
21344
|
+
if (lstMenuButtons.length) {
|
|
21345
|
+
lstMenuButtons.forEach(item => this.addButtonAction(lstBtnAction, this.authorizeButtonKey, item.label));
|
|
21346
|
+
}
|
|
21347
|
+
const buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
|
|
21348
|
+
((_e = buttonSetting[this.authorizeButtonKey]) === null || _e === void 0 ? void 0 : _e.length) && buttonSetting[this.authorizeButtonKey].forEach(item => {
|
|
21349
|
+
const permissionItem = lstBtnAction.find(p => p.permissionCode == item.code);
|
|
21350
|
+
if (permissionItem) {
|
|
21351
|
+
permissionItem.isAuthorize = true;
|
|
21352
|
+
permissionItem.id = item.id;
|
|
21353
|
+
}
|
|
21354
|
+
});
|
|
21355
|
+
this.buttonAuthorizeModel.data.dataSource = lstBtnAction;
|
|
21356
|
+
this.buttonAuthorizeModel.showEditForm = true;
|
|
21357
|
+
});
|
|
21358
|
+
}
|
|
21359
|
+
onShowFormSettingButton() {
|
|
21360
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21361
|
+
this.checkedAll = true;
|
|
21362
|
+
this.handleCheckAll();
|
|
21363
|
+
setTimeout(() => {
|
|
21364
|
+
this.handleShowFormSettingButton();
|
|
21365
|
+
}, 100);
|
|
21366
|
+
});
|
|
21367
|
+
}
|
|
21368
|
+
setBtnReady(isReady) {
|
|
21369
|
+
this.isBtnReady = isReady;
|
|
21370
|
+
}
|
|
21371
|
+
addButtonAction(lstBtnAction, key, rawText, id) {
|
|
21372
|
+
id !== null && id !== void 0 ? id : (id = this._commonService.guid());
|
|
21373
|
+
const permissionCode = this._commonService.convertStringToUnSign(rawText).replace(/ /g, '_').toUpperCase();
|
|
21374
|
+
lstBtnAction.push(new ButtonAction({
|
|
21375
|
+
id: id,
|
|
21376
|
+
rawText: rawText,
|
|
21377
|
+
permissionCode: `[${key}]_[${permissionCode}]`
|
|
21378
|
+
}));
|
|
21379
|
+
}
|
|
21380
|
+
setAuthorizeButton(lstButtonTemplate) {
|
|
21381
|
+
var _a, _b;
|
|
21382
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21383
|
+
this.authorizeButtonKey = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
|
|
21384
|
+
if (isDevMode()) {
|
|
21385
|
+
this.authorizeButtonKey = `${this.serviceCode.toUpperCase()}_${window.location.pathname.substring(1).toUpperCase()}`;
|
|
21386
|
+
}
|
|
21387
|
+
const filterPermission = [this.newFilter('code', Operator.contain, `[${this.authorizeButtonKey}]`)];
|
|
21388
|
+
const lstPermissionCode = (_a = (yield this._basePermissionService.getAllWithIgnore(filterPermission, 'code,id')).data) !== null && _a !== void 0 ? _a : [];
|
|
21389
|
+
const buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
|
|
21390
|
+
buttonSetting[this.authorizeButtonKey] = lstPermissionCode;
|
|
21391
|
+
this.lstButtonTemplate = lstButtonTemplate;
|
|
21392
|
+
if (!buttonSetting[this.authorizeButtonKey].length) {
|
|
21393
|
+
this.isBtnReady = true;
|
|
21394
|
+
return;
|
|
21395
|
+
}
|
|
21396
|
+
sessionStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE, JSON.stringify(buttonSetting));
|
|
21397
|
+
const lstMenuButton = [];
|
|
21398
|
+
const lstMenuButtons = (_b = yield this.menuButtons({})) !== null && _b !== void 0 ? _b : [];
|
|
21399
|
+
if (!lstMenuButtons.length) {
|
|
21400
|
+
this.isBtnReady = true;
|
|
21401
|
+
return;
|
|
21402
|
+
}
|
|
21403
|
+
lstMenuButtons.forEach(item => this.addButtonAction(lstMenuButton, this.authorizeButtonKey, item.label));
|
|
21404
|
+
buttonSetting[this.authorizeButtonKey].forEach(item => {
|
|
21405
|
+
const itemBtnMenu = lstMenuButton.find(p => p.permissionCode == item.code);
|
|
21406
|
+
if (itemBtnMenu) {
|
|
21407
|
+
this.lstBtnAuthorizeMenu.push(itemBtnMenu);
|
|
21408
|
+
}
|
|
21409
|
+
});
|
|
21410
|
+
this.isBtnReady = true;
|
|
21411
|
+
this.handleTableRendered();
|
|
21412
|
+
});
|
|
21413
|
+
}
|
|
21414
|
+
handleCloseAuthorizeButtonForm() {
|
|
21415
|
+
this.checkedAll = false;
|
|
21416
|
+
this.handleCheckAll();
|
|
21417
|
+
this.buttonAuthorizeModel.showEditForm = false;
|
|
21418
|
+
}
|
|
21250
21419
|
}
|
|
21251
21420
|
ListComponentBase.decorators = [
|
|
21252
21421
|
{ type: Directive }
|
|
@@ -21258,6 +21427,7 @@ ListComponentBase.ctorParameters = () => [
|
|
|
21258
21427
|
ListComponentBase.propDecorators = {
|
|
21259
21428
|
treeTable: [{ type: ViewChild, args: ['treetable',] }],
|
|
21260
21429
|
_table: [{ type: ViewChild, args: [Table, { static: false },] }],
|
|
21430
|
+
lstButtonElement: [{ type: ViewChildren, args: ['buttonBase',] }],
|
|
21261
21431
|
container: [{ type: ViewChild, args: ['container', { static: true },] }],
|
|
21262
21432
|
iconToggleRowGroup: [{ type: ViewChild, args: ['iconToggleRowGroup', { static: true },] }],
|
|
21263
21433
|
iconToggleRowData: [{ type: ViewChild, args: ['iconToggleRowData', { static: true },] }],
|
|
@@ -21781,7 +21951,7 @@ CrudListComponent.decorators = [
|
|
|
21781
21951
|
{ type: Component, args: [{
|
|
21782
21952
|
// tslint:disable-next-line: component-selector
|
|
21783
21953
|
selector: 'crud-list',
|
|
21784
|
-
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\n [ngStyle]=\"_style\">\n <div class=\"ui-helper-clearfix crud-list-header-area\">\n <div *ngIf=\"!setting.hiddenSearch\">\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <ng-container *ngIf=\"!setting.useCommonSearch\">\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"setting.useCommonSearch && !hasTemplate('searchCustom')\"\n class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <div style=\"width: 100%;\">\n <common-search-form #commonSearch [parentSetting]=\"setting\" [parentModel]=\"model\"\n [templateFilter]=\"templateFilter\" [parentContext]=\"context\"\n [searchBoxTooltip]=\"setting.toolTipSearhBoxCommon\"\n (onClickSearch)=\"handleSearch($event)\"></common-search-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\n </h1>\n\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\n [ngTemplateOutletContext]=\"{\n crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\n <ng-container *ngIf=\"!paginationTemplate\">\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\n (onChangeLimitPage)=\"savePageSize()\">\n </paging-next-back-only>\n </ng-container>\n <ng-container *ngIf=\"paginationTemplate\">\n <ng-container [ngTemplateOutlet]=\"paginationTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"fit-content crud-list-body-area\">\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\n <ng-container>\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\n (click)=\"danhSoThuTuGroupLastest()\"></button>\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\n </ng-container>\n <ng-container *ngIf=\"setting.showExportWordSelectedItems\"\n [ngTemplateOutlet]=\"buttonExportWord\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenReorder\" [ngTemplateOutlet]=\"buttonReorder\">\n </ng-container>\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\n (click)=\"createShareLinkMultiple()\"></button>\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n </div>\n </ng-container>\n <div *ngIf=\"!setting.hiddenAdvanceSearch && !setting.useCommonSearch\"\n class=\"p-col-12 advance-search-container\"\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\n (onInit)=\"handleInitAdvanceSearch($event)\">\n </advance-search>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\n <div class=\"container-table-inner\">\n <ng-container *ngIf=\"!_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n </div>\n </ng-container>\n\n <div class=\"table-border-line --top\"></div>\n <div class=\"table-border-line --right\"></div>\n <div class=\"table-border-line --bottom\"></div>\n <div class=\"table-border-line --left\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\n (onDelete)=\"onDeleteSettings()\" (onCancel)=\"_showSettings = false\">\n</settings>\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\n (onCancel)=\"_showSettingsRowColor = false\">\n</settings-row>\n<!-- <workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\">\n</workflow-setting-dialog> -->\n<div #workflowSettingDialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\"></div>\n<tn-dialog #dialogWfSettingNew [visible]=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\n <div #workflowsettingnew></div>\n</tn-dialog>\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\n (onCancel)=\"_showSettingsPermission = false\">\n</entity-permission>\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\n</p-contextMenu>\n<tn-dialog #dialogProcessWorkflowForm [visible]=\"processWorkflowModel.showEditForm\" [header]=\"processWorkflowModel.header | translate\"\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"processWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%; padding: 1rem\">\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\n </process-workflow-form> -->\n <div #processWorkflowForm></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogChoYKienForm [visible]=\"choYKienModel.showEditForm\" [header]=\"choYKienModel.header | translate\"\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"choYKienModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\n (onCancel)=\"choYKienModel.showEditForm = false\">\n </cho-y-kien-form> -->\n <div #choYKienForm></div>\n </div>\n</tn-dialog>\n<tn-dialog [visible]=\"workflowHistoryModel.showEditForm\" [header]=\"workflowHistoryModel.header | translate\"\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\n </workflow-history-new> -->\n <div #workflowHistoryNew></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogDetailTask [visible]=\"detailTaskModel.showEditForm\" [header]=\"detailTaskModel.header | translate\"\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"detailTaskModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\n (onCancel)=\"detailTaskModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #detailTask></div>\n</tn-dialog>\n\n<tn-dialog #dialogPermissionSharing [visible]=\"permissionSharingModel.showEditForm\" [header]=\"permissionSharingModel.header | translate\"\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"permissionSharingModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\n </permission-sharing> -->\n <div #permissionSharing></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogWorkflowPermission [visible]=\"permissionListModel.showEditForm\" [header]=\"permissionListModel.header | translate\"\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"permissionListModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\n (onCancel)=\"permissionListModel.showEditForm = false\">\n </workflow-permission> -->\n <div #workflowPermission></div>\n </div>\n</tn-dialog>\n<!-- <workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\n</workflow-history-dialog> -->\n<div #workflowPermission *ngIf=\"showHistoryWorkflow\"></div>\n<tn-dialog #dialogstartWorkflow [visible]=\"startWorkflowModel.showEditForm\" [header]=\"startWorkflowModel.header | translate\"\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"startWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\n </start-workflow> -->\n <div #startWorkflow></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViecForm [visible]=\"congViecModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\n (onHide)=\"congViecModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #baseCongViecForm></div>\n</tn-dialog>\n<tn-dialog #dialog *ngIf=\"shareLinkModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"shareLinkModel.showEditForm = false\">\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </share-link-by-permission>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViec [visible]=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"attachedTaskModel.showEditForm = false\">\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\n <div #baseCongViec></div>\n</tn-dialog>\n<ng-template #tableGetGroupFieldFalse>\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\n [expandedRowKeys]=\"model.expandedRowKeys\" [(selection)]=\"model.selectedItems\"\n (onRowReorder)=\"handleRowOrdered($event)\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"rowExpansion; context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n</ng-template>\n<ng-template #tableGetGroupFieldTrue>\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\n (onChange)=\"handleCheckRowGroup(rowData)\">\n </p-checkbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!rowGroup\">\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\n <div class=\"container-row-group\">\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\n [class.sticky]=\"setting.stickyColumn\">\n <i style=\"margin-right:5px\"\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n <div class=\"content-row-group\">\n <ng-container *ngIf=\"!contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n </div>\n </a>\n </div>\n </td>\n </ng-container>\n <ng-container *ngIf=\"rowGroup\">\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n <after-view-checked></after-view-checked>\n</ng-template>\n<ng-template #baseColgroup let-columns>\n <colgroup>\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\n <col *ngIf=\"rowExpansion\" style=\"width: 2.5rem\" />\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\n </ng-container>\n <col *ngIf=\"enableReorderRow\" style=\"width: 30px\" />\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\n </colgroup>\n</ng-template>\n<ng-template #buttonAdd>\n <span [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.ADD]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.ADD]\">\n <button type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\n [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\n </span>\n</ng-template>\n<ng-template #buttonExport>\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\n</ng-template>\n<ng-template #buttonExportWord>\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\n label=\"In c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-word\"\n class=\"p-button-text p-button-success\" (click)=\"printByReadingHtml()\"></button>\n</ng-template>\n<ng-template #buttonDelete>\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.DELETE_MULTIPLE]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE_MULTIPLE]\" type=\"button\" pButton pRipple\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\n</ng-template>\n<ng-template #buttonReorder>\n <button\n *ngIf=\"showSaveReorder && enableReorderRow && (_sortField == setting.columnSetting.sortField || _sortDir == 0)\"\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.REORDER_SAVE]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.REORDER_SAVE]\" type=\"button\" pButton pRipple\n [label]=\"'L\u01B0u s\u1EAFp x\u1EBFp' | translate\" icon=\"pi pi-save\" class=\"p-button-text p-button-success\"\n (click)=\"saveReorder()\"></button>\n</ng-template>\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"title-row\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!hasTemplate('headerCheckbox') && !setting.useCommonSearch\" type=\"button\" pButton pRipple\n icon=\"pi pi-refresh\" class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"reload()\"></button>\n <p-triStateCheckbox *ngIf=\"setting.useCommonSearch\" [(ngModel)]=\"checkedAll\" binary=\"true\"\n (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\n (dblclick)=\"reload()\">\n {{ 'TT' |translate}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\n [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngIf=\"hasTemplate('trHeaderBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\" [pTooltip]=\"col.fullLabel\"\n tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\n [className]=\"col.isPinned && col.width ? col.class : ''\" [class.first-th]=\"i==0\" [escape]=\"false\"\n tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\" [tnSortableColumnDisabled]=\"!col.sort\">\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\n <ng-container *ngIf=\"col.sort || col.sortClient\">\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\n </ng-container>\n </th>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('trHeaderAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\n </tr>\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\n </ng-container>\n</ng-template>\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [className]=\"col.isPinned && col.width ? col.class + ' cell-header-filter center': 'cell-header-filter center'\">\n <ng-container *ngIf=\"col.allowFilter\">\n <ng-container *ngIf=\"col.templateFilter\">\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngSwitch]=\"col.dataType\">\n <ng-container *ngSwitchCase=\"'int'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'intWithoutMask'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'decimal'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'boolean'\">\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"filterText\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </tr>\n</ng-template>\n<ng-template #buttonBaseSetting>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <th class=\"center setting-cell column-function\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\n (click)=\"showSettings()\"></button>\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\n (click)=\"showSettingsWorkflowNew(dialogWfSettingNew)\"></button>\n <div *ngIf=\"setting.hiddenSetting && setting.hiddenSettingPermission && setting.hiddenSettingWorkflow\"\n class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n\n</ng-template>\n<ng-template #colFunctionHeader>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <ng-container *ngIf=\"setting.hiddenFilterRow\">\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!setting.hiddenFilterRow\">\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\n <div class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTh let-col>\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\n {{col.label}}\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n</ng-template>\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\n </p-checkbox>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\n {{rowData[fieldOrder]}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <td *ngIf=\"rowExpansion && !rowData.hidden[fieldColExpand]\" class=\"no-padding center row-expansion-toggle\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!hasTemplate('dynamicColBodys')\">\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodys')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodys')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </div>\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\n (click)=\"showListVersion(rowData)\"></button>\n <button *ngIf=\"!rowData.hiddenEdit\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.EDIT]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EDIT]\" type=\"button\" pButton pRipple\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\n (click)=\"edit(rowData)\"></button>\n <button *ngIf=\"!rowData.hiddenDelete\" [appAuthorize]=\"serviceCode\"\n [permission]=\"authorizePaths[commonConst.DELETE]\"\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE]\" type=\"button\" pButton pRipple\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\n (click)=\"delete(rowData)\"></button>\n <ng-container *ngIf=\"!hiddenBtnFunction\">\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\" [disabled]=\"rowData.disableFunctionRow\"\n (click)=\"showContextMenu($event, rowData)\"></button>\n </ng-container>\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n </tr>\n <ng-container *ngIf=\"rowData.template\">\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\n }\"></ng-container>\n </ng-container>\n</ng-template>\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\n <td *ngIf=\"col && col.visible && col.field != 'function' && !rowData.hidden[col.field]\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\n <span *ngIf=\"col.pipe\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n {{rowData['pipe__' + col.field]}}\n </span>\n <span *ngIf=\"!col.pipe\" class=\"contentTd\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\n class=\"link-or-action\">\n <ng-container *ngIf=\"col.click\">\n <a href=\"javascript:;\" (click)=\"col.click(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container *ngIf=\"!col.click\">\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n </span>\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\" class=\"\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </span>\n </span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n</ng-template>\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\n let-expanded=\"expanded\">\n <ng-container *ngIf=\"col.template\">\n <ng-container [ngTemplateOutlet]=\"col.template\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.template\">\n <ng-container [ngSwitch]=\"col.dataType\">\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\n </span>\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\n [ngClass]=\"rowData[field]\"></i>\n </span>\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\n tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'int'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'intWithoutMask'\">\n {{rowData[field]}}\n </span>\n <span *ngSwitchCase=\"'currency'\">\n {{rowData[field] | currency:\"VND\"}}\n </span>\n <span *ngSwitchCase=\"'decimal'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'boolean'\">\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\n [disabled]=\"col.disableCheckBox\">\n </p-checkbox>\n </span>\n <span *ngSwitchCase=\"'html'\">\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\n </span>\n <span *ngSwitchCase=\"'metadataStatus'\">\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\n duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\n </span>\n <ng-container *ngSwitchCase=\"'fileUpload'\">\n <ng-container\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fileManager'\">\n <ng-container\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'string'\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"null\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentCellString let-rowData let-field=\"field\">\n <span>\n <!-- __sv: Short Value -->\n <ng-container *ngIf=\"rowData[field + '__sv']\">\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\n {{rowData[field + '__sv']}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\n tooltipPosition=\"top\">[...]</span>\n </ng-container>\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\n {{rowData[field]}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\n {{rowData[field]}}\n </ng-container>\n </span>\n</ng-template>\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n </a>\n</ng-template>\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n (click)=\"handleToggleRow(rowData, $event)\"></button>\n</ng-template>\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\n </ng-container>\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\n</ng-template>\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\n <div class=\"container-text-workflow\">\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\n (click)=\"showFormStartWorkflow(rowData, dialogstartWorkflow)\"></button>\n <ng-container *ngIf=\"rowData.__workflowCode\">\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData, dialogProcessWorkflowForm, dialogDetailTask, dialogChoYKienForm)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #viewHistory let-rowData=\"rowData\">\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\n</ng-template>\n<ng-template #containerSticky>\n <span class=\"fix-sticky top\"></span>\n <span class=\"fix-sticky right\"></span>\n <!-- <span class=\"fix-sticky bottom\"></span> -->\n <span class=\"fix-sticky left\"></span>\n</ng-template>\n<ng-template #sortIcon let-field=\"field\">\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\n</ng-template>\n<ng-template #filterDropdown let-col=\"col\">\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\n (onChanged)=\"prepareSearch(col)\" (onHideSmartEvent)=\"onSearch()\"\n (onShow)=\"onShowFilterDropdownPanel($event)\" (onHide)=\"onHideFilterDropdownPanel($event)\"\n (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\n </div>\n</ng-template>\n<ng-template #filterText let-col=\"col\">\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\n </div>\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterNumber let-col=\"col\">\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\n [min]=\"col.min\" [max]=\"col.max\" [placeholder]=\"col.placeholder\" (change)=\"onSearch()\">\n </tn-number-picker-range>\n </div>\n <span\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\n tabindex=\"-1\">\n <i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterDate let-col=\"col\" let-control=\"control\">\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-datetime-picker-range #dateRange [control]=\"control\" (onChanged)=\"onChangeDateTime($event, col.field)\">\n </tn-datetime-picker-range>\n </div>\n <span\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\n class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterBoolean let-col=\"col\">\n <div class=\"filter-boolean-box\">\n <p-selectButton *ngIf=\"!col.minimizeFilter\"\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\n <ng-template let-item>\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\n </ng-template>\n </p-selectButton>\n <ng-container *ngIf=\"col.minimizeFilter\">\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\n class=\"btn-filter-boolean p-button-primary\"\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\n <file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingFileInstanceId\"\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </file-upload>\n\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [(ngModel)]=\"rowData.field\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </service-file-upload>\n</ng-template>\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [maxFileSize]=\"fileSetting.control.maxFileSize\"\n [inTaiLieu]=\"fileSetting.control.inTaiLieu\" [(value)]=\"rowData[field]\" [disabled]=\"fileSetting.control.disabled\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\"\n (uploaded)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.UPLOADED)\">\n </file-manager>\n</ng-template>",
|
|
21954
|
+
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\n [ngStyle]=\"_style\">\n <div class=\"ui-helper-clearfix crud-list-header-area\">\n <div *ngIf=\"!setting.hiddenSearch\">\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <ng-container *ngIf=\"!setting.useCommonSearch\">\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"setting.useCommonSearch && !hasTemplate('searchCustom')\"\n class=\"p-grid ui-fluid custom-p-col custom-search-area\">\n <div class=\"p-col-12 main-container-search\">\n <div class=\"p-grid main-container-search-inner\">\n <div style=\"width: 100%;\">\n <common-search-form #commonSearch [parentSetting]=\"setting\" [parentModel]=\"model\"\n [templateFilter]=\"templateFilter\" [parentContext]=\"context\"\n [searchBoxTooltip]=\"setting.toolTipSearhBoxCommon\"\n (onClickSearch)=\"handleSearch($event)\"></common-search-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\n </h1>\n\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\n [ngTemplateOutletContext]=\"{\n crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\n <ng-container *ngIf=\"!paginationTemplate\">\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\n (onChangeLimitPage)=\"savePageSize()\">\n </paging-next-back-only>\n </ng-container>\n <ng-container *ngIf=\"paginationTemplate\">\n <ng-container [ngTemplateOutlet]=\"paginationTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"fit-content crud-list-body-area\">\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\n <div *ngIf=\"!setting.hiddenToolbar && isBtnReady\" class=\"p-grid crudListToolbar\">\n <ng-container>\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\n selectedItems: model.selectedItems, crudList: this,\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\n }\">\n </ng-container>\n </div>\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\n class=\"p-col-12 button-group function-topbar\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\n (click)=\"danhSoThuTuGroupLastest()\"></button>\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\n </ng-container>\n <ng-container *ngIf=\"setting.showExportWordSelectedItems\"\n [ngTemplateOutlet]=\"buttonExportWord\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\n </ng-container>\n <ng-container *ngIf=\"!hiddenReorder\" [ngTemplateOutlet]=\"buttonReorder\">\n </ng-container>\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\n (click)=\"createShareLinkMultiple()\"></button>\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\n\n <ng-container *ngIf=\"isSuperUser\" [ngTemplateOutlet]=\"buttonAuthorize\">\n </ng-container>\n </div>\n </ng-container>\n <div *ngIf=\"!setting.hiddenAdvanceSearch && !setting.useCommonSearch\"\n class=\"p-col-12 advance-search-container\"\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\n (onInit)=\"handleInitAdvanceSearch($event)\">\n </advance-search>\n </div>\n </div>\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\n </div>\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\n <div class=\"container-table-inner\">\n <ng-container *ngIf=\"!_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"_groupField\">\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\n [showScrollHorizontal]=\"showScrollHorizontal\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\n </ng-container>\n </tn-custom-scrollbar>\n <div *ngIf=\"!showScrollBar\">\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\n </ng-container>\n </div>\n </ng-container>\n\n <div class=\"table-border-line --top\"></div>\n <div class=\"table-border-line --right\"></div>\n <div class=\"table-border-line --bottom\"></div>\n <div class=\"table-border-line --left\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\n (onDelete)=\"onDeleteSettings()\" (onCancel)=\"_showSettings = false\">\n</settings>\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\n (onCancel)=\"_showSettingsRowColor = false\">\n</settings-row>\n<!-- <workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\">\n</workflow-setting-dialog> -->\n<div #workflowSettingDialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\"></div>\n<tn-dialog #dialogWfSettingNew [visible]=\"workflowSettingModel.showEditForm\"\n [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\" [popupSize]=\"workflowSettingModel.popupSize\"\n (onHide)=\"workflowSettingModel.showEditForm = false\">\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\n <div #workflowsettingnew></div>\n</tn-dialog>\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\n (onCancel)=\"_showSettingsPermission = false\">\n</entity-permission>\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\n</p-contextMenu>\n<tn-dialog #dialogProcessWorkflowForm [visible]=\"processWorkflowModel.showEditForm\"\n [header]=\"processWorkflowModel.header | translate\" [popupSize]=\"processWorkflowModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"processWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%; padding: 1rem\">\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\n </process-workflow-form> -->\n <div #processWorkflowForm></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogChoYKienForm [visible]=\"choYKienModel.showEditForm\" [header]=\"choYKienModel.header | translate\"\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"choYKienModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\n (onCancel)=\"choYKienModel.showEditForm = false\">\n </cho-y-kien-form> -->\n <div #choYKienForm></div>\n </div>\n</tn-dialog>\n<tn-dialog *ngIf=\"buttonAuthorizeModel.showEditForm\" #dialog [header]=\"buttonAuthorizeModel.header | translate\"\n [popupSize]=\"buttonAuthorizeModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"handleCloseAuthorizeButtonForm()\">\n <settings-authorize-button [authorizeButtonKey]=\"authorizeButtonKey\"\n [dataSource]=\"buttonAuthorizeModel.data.dataSource\"></settings-authorize-button>\n</tn-dialog>\n\n<tn-dialog [visible]=\"workflowHistoryModel.showEditForm\" [header]=\"workflowHistoryModel.header | translate\"\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\n </workflow-history-new> -->\n <div #workflowHistoryNew></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogDetailTask [visible]=\"detailTaskModel.showEditForm\" [header]=\"detailTaskModel.header | translate\"\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\n (onHide)=\"detailTaskModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\n (onCancel)=\"detailTaskModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #detailTask></div>\n</tn-dialog>\n\n<tn-dialog #dialogPermissionSharing [visible]=\"permissionSharingModel.showEditForm\"\n [header]=\"permissionSharingModel.header | translate\" [popupSize]=\"permissionSharingModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"permissionSharingModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\n </permission-sharing> -->\n <div #permissionSharing></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogWorkflowPermission [visible]=\"permissionListModel.showEditForm\"\n [header]=\"permissionListModel.header | translate\" [popupSize]=\"permissionListModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"permissionListModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\n (onCancel)=\"permissionListModel.showEditForm = false\">\n </workflow-permission> -->\n <div #workflowPermission></div>\n </div>\n</tn-dialog>\n<!-- <workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\n</workflow-history-dialog> -->\n<div #workflowPermission *ngIf=\"showHistoryWorkflow\"></div>\n<tn-dialog #dialogstartWorkflow [visible]=\"startWorkflowModel.showEditForm\"\n [header]=\"startWorkflowModel.header | translate\" [popupSize]=\"startWorkflowModel.popupSize\"\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"startWorkflowModel.showEditForm = false\">\n <div style=\"height: 100%\">\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\n </start-workflow> -->\n <div #startWorkflow></div>\n </div>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViecForm [visible]=\"congViecModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\n (onHide)=\"congViecModel.showEditForm = false\">\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </base-congviec-form> -->\n <div #baseCongViecForm></div>\n</tn-dialog>\n<tn-dialog #dialog *ngIf=\"shareLinkModel.showEditForm\" [styleClass]=\"'congviec-form tn-form-dialog'\"\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\n (onHide)=\"shareLinkModel.showEditForm = false\">\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\n (onCancel)=\"congViecModel.showEditForm = false\">\n </share-link-by-permission>\n</tn-dialog>\n<tn-dialog #dialogBaseCongViec [visible]=\"attachedTaskModel.showEditForm\"\n [header]=\"attachedTaskModel.header | translate\" [popupSize]=\"attachedTaskModel.popupSize\"\n [useDefaultScrollBar]=\"true\" (onHide)=\"attachedTaskModel.showEditForm = false\">\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\n <div #baseCongViec></div>\n</tn-dialog>\n<ng-template #tableGetGroupFieldFalse>\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\n [expandedRowKeys]=\"model.expandedRowKeys\" [(selection)]=\"model.selectedItems\"\n (onRowReorder)=\"handleRowOrdered($event)\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\n <ng-container\n *ngTemplateOutlet=\"rowExpansion; context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n</ng-template>\n<ng-template #tableGetGroupFieldTrue>\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\n </ng-container>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\n (onChange)=\"handleCheckRowGroup(rowData)\">\n </p-checkbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!rowGroup\">\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\n <div class=\"container-row-group\">\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\n [class.sticky]=\"setting.stickyColumn\">\n <i style=\"margin-right:5px\"\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n <div class=\"content-row-group\">\n <ng-container *ngIf=\"!contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"contentRowGroup\">\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\n </ng-container>\n </ng-container>\n </div>\n </a>\n </div>\n </td>\n </ng-container>\n <ng-container *ngIf=\"rowGroup\">\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\n <ng-container\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\n </ng-container>\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\n (loaded)=\"handleTableRendered()\">\n </after-view-checked>\n </ng-template>\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\n </ng-template>\n </p-table>\n <after-view-checked></after-view-checked>\n</ng-template>\n<ng-template #baseColgroup let-columns>\n <colgroup>\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\n <col *ngIf=\"rowExpansion\" style=\"width: 2.5rem\" />\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\n </ng-container>\n <col *ngIf=\"enableReorderRow\" style=\"width: 30px\" />\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\n </colgroup>\n</ng-template>\n<ng-template #buttonAdd>\n <button #buttonBase appAuthorize type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\n class=\"p-button-text\" [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\n</ng-template>\n<ng-template #buttonExport>\n <button #buttonBase appAuthorize *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\" icon=\"fas fa-file-excel\" class=\"p-button-text p-button-success\"\n (click)=\"xuatCacMucDaChon()\"></button>\n</ng-template>\n<ng-template #buttonAuthorize>\n <button *ngIf=\"!setting.hiddenAuthorizeButton && authorizeButtonKey\" type=\"button\" pButton\n pRipple label=\"Ph\u00E2n quy\u1EC1n n\u00FAt\" icon=\"fas fa-tools\" class=\"p-button-text\"\n (click)=\"onShowFormSettingButton()\"></button>\n</ng-template>\n\n<ng-template #buttonExportWord>\n <button #buttonBase appAuthorize *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple label=\"In c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\"\n icon=\"fas fa-file-word\" class=\"p-button-text p-button-success\" (click)=\"printByReadingHtml()\"></button>\n</ng-template>\n<ng-template #buttonDelete>\n <button #buttonBase *ngIf=\"(!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete())\"\n appAuthorize type=\"button\" pButton pRipple label=\"X\u00F3a c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn\" icon=\"pi pi-trash\"\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\n</ng-template>\n<ng-template #buttonReorder>\n <button #buttonBase\n *ngIf=\"showSaveReorder && enableReorderRow && (_sortField == setting.columnSetting.sortField || _sortDir == 0)\"\n appAuthorize type=\"button\" pButton pRipple label=\"L\u01B0u s\u1EAFp x\u1EBFp\" icon=\"pi pi-save\"\n class=\"p-button-text p-button-success\" (click)=\"saveReorder()\"></button>\n</ng-template>\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"title-row\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!hasTemplate('headerCheckbox') && !setting.useCommonSearch\" type=\"button\" pButton pRipple\n icon=\"pi pi-refresh\" class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"reload()\"></button>\n <p-triStateCheckbox *ngIf=\"setting.useCommonSearch\" [(ngModel)]=\"checkedAll\" binary=\"true\"\n (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\n (dblclick)=\"reload()\">\n {{ 'TT' |translate}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\n [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngIf=\"hasTemplate('trHeaderBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\" [pTooltip]=\"col.fullLabel\"\n tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\n [className]=\"col.isPinned && col.width ? col.class : ''\" [class.first-th]=\"i==0\" [escape]=\"false\"\n tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\" [tnSortableColumnDisabled]=\"!col.sort\">\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\n <ng-container *ngIf=\"col.sort || col.sortClient\">\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\n </ng-container>\n </th>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('trHeaderAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('trHeaderAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns}\"></ng-container>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\n </tr>\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\n </ng-container>\n</ng-template>\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\n </p-triStateCheckbox>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [className]=\"col.isPinned && col.width ? col.class + ' cell-header-filter center': 'cell-header-filter center'\">\n <ng-container *ngIf=\"col.allowFilter\">\n <ng-container *ngIf=\"col.templateFilter\">\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngSwitch]=\"col.dataType\">\n <ng-container *ngSwitchCase=\"'int'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'intWithoutMask'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'decimal'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <ng-container [ngTemplateOutlet]=\"filterDate\"\n [ngTemplateOutletContext]=\"{col: col, control: filterSchema.dateTimeRange}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'boolean'\">\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"filterText\"\n [ngTemplateOutletContext]=\"{col: col}\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </tr>\n</ng-template>\n<ng-template #buttonBaseSetting>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <th class=\"center setting-cell column-function\" [class.sticky]=\"setting.stickyColumn\">\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\n (click)=\"showSettings()\"></button>\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\n [disabled]=\"!checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\n (click)=\"showSettingsWorkflowNew(dialogWfSettingNew)\"></button>\n <div *ngIf=\"setting.hiddenSetting && setting.hiddenSettingPermission && setting.hiddenSettingWorkflow\"\n class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n\n</ng-template>\n<ng-template #colFunctionHeader>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\n <ng-container *ngIf=\"setting.hiddenFilterRow\">\n <ng-container *ngTemplateOutlet=\"buttonBaseSetting\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!setting.hiddenFilterRow\">\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\n <div class=\"cell-header-function\">\n <span>{{'GRID.FUNCTION'| translate}}</span>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTh let-col>\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\n {{col.label}}\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n</ng-template>\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\n </p-checkbox>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\n {{rowData[fieldOrder]}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <td *ngIf=\"rowExpansion && !rowData.hidden[fieldColExpand]\" class=\"no-padding center row-expansion-toggle\"\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\n </ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!hasTemplate('dynamicColBodys')\">\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysBefore')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysBefore')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodysAfter')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodysAfter')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasTemplate('dynamicColBodys')\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('dynamicColBodys')\"\n [ngTemplateOutletContext]=\"{$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\n </ng-container>\n </ng-container>\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </div>\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\n (click)=\"showListVersion(rowData)\"></button>\n <button #buttonBase *ngIf=\"!rowData.hiddenEdit\" appAuthorize type=\"button\" pButton pRipple\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\n (click)=\"edit(rowData)\"></button>\n <button #buttonBase *ngIf=\"!rowData.hiddenDelete\" appAuthorize type=\"button\" pButton pRipple\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\n (click)=\"delete(rowData)\"></button>\n <ng-container *ngIf=\"!hiddenBtnFunction\">\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\" [disabled]=\"rowData.disableFunctionRow\"\n (click)=\"showContextMenu($event, rowData)\"></button>\n </ng-container>\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n </tr>\n <ng-container *ngIf=\"rowData.template\">\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\n }\"></ng-container>\n </ng-container>\n</ng-template>\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <ng-container\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\n <td *ngIf=\"col && col.visible && col.field != 'function' && !rowData.hidden[col.field]\"\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\n [style.left]=\"col.isPinned && col.left ? (col.left + 'px') : ''\"\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\n <span *ngIf=\"col.pipe\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n {{rowData['pipe__' + col.field]}}\n </span>\n <span *ngIf=\"!col.pipe\" class=\"contentTd\">\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\n tooltipPosition=\"top\">{{col.label}}</span>\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\n class=\"link-or-action\">\n <ng-container *ngIf=\"col.click\">\n <a href=\"javascript:;\" (click)=\"col.click(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container *ngIf=\"!col.click\">\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\"\n tooltipPosition=\"top\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </a>\n </ng-container>\n </span>\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\" class=\"\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\n </ng-container>\n </span>\n </span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n</ng-template>\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\n let-expanded=\"expanded\">\n <ng-container *ngIf=\"col.template\">\n <ng-container [ngTemplateOutlet]=\"col.template\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!col.template\">\n <ng-container [ngSwitch]=\"col.dataType\">\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\n </span>\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\n [ngClass]=\"rowData[field]\"></i>\n </span>\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\n tooltipPosition=\"top\">\n {{rowData[field] | tnDate:col.dataType:col.format}}\n </span>\n <span *ngSwitchCase=\"'int'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'intWithoutMask'\">\n {{rowData[field]}}\n </span>\n <span *ngSwitchCase=\"'currency'\">\n {{rowData[field] | currency:\"VND\"}}\n </span>\n <span *ngSwitchCase=\"'decimal'\">\n {{rowData[field] | number}}\n </span>\n <span *ngSwitchCase=\"'boolean'\">\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\n [disabled]=\"col.disableCheckBox\">\n </p-checkbox>\n </span>\n <span *ngSwitchCase=\"'html'\">\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\n </span>\n <span *ngSwitchCase=\"'metadataStatus'\">\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\n duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\n </span>\n <ng-container *ngSwitchCase=\"'fileUpload'\">\n <ng-container\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fileManager'\">\n <ng-container\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'string'\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"null\">\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n<ng-template #contentCellString let-rowData let-field=\"field\">\n <span>\n <!-- __sv: Short Value -->\n <ng-container *ngIf=\"rowData[field + '__sv']\">\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\n {{rowData[field + '__sv']}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\n tooltipPosition=\"top\">[...]</span>\n </ng-container>\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\n {{rowData[field]}}\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\n {{rowData[field]}}\n </ng-container>\n </span>\n</ng-template>\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\n </a>\n</ng-template>\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n (click)=\"handleToggleRow(rowData, $event)\"></button>\n</ng-template>\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\n <ng-container [ngTemplateOutlet]=\"contentCell\"\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\n </ng-container>\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\n</ng-template>\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\n <div class=\"container-text-workflow\">\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\n (click)=\"showFormStartWorkflow(rowData, dialogstartWorkflow)\"></button>\n <ng-container *ngIf=\"rowData.__workflowCode\">\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\n [disabled]=\"showingActionWorkflow\"\n (click)=\"showActionWorkflow($event, rowData, dialogProcessWorkflowForm, dialogDetailTask, dialogChoYKienForm)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #viewHistory let-rowData=\"rowData\">\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\n</ng-template>\n<ng-template #containerSticky>\n <span class=\"fix-sticky top\"></span>\n <span class=\"fix-sticky right\"></span>\n <!-- <span class=\"fix-sticky bottom\"></span> -->\n <span class=\"fix-sticky left\"></span>\n</ng-template>\n<ng-template #sortIcon let-field=\"field\">\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\n</ng-template>\n<ng-template #filterDropdown let-col=\"col\">\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\n (onChanged)=\"prepareSearch(col)\" (onHideSmartEvent)=\"onSearch()\"\n (onShow)=\"onShowFilterDropdownPanel($event)\" (onHide)=\"onHideFilterDropdownPanel($event)\"\n (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\n </div>\n</ng-template>\n<ng-template #filterText let-col=\"col\">\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\n </div>\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterNumber let-col=\"col\">\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\n [min]=\"col.min\" [max]=\"col.max\" [placeholder]=\"col.placeholder\" (change)=\"onSearch()\">\n </tn-number-picker-range>\n </div>\n <span\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\n tabindex=\"-1\">\n <i class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterDate let-col=\"col\" let-control=\"control\">\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\n <div tabindex=\"-1\">\n <tn-datetime-picker-range #dateRange [control]=\"control\" (onChanged)=\"onChangeDateTime($event, col.field)\">\n </tn-datetime-picker-range>\n </div>\n <span\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\n class=\"pi pi-filter-slash\"></i></span>\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\n </after-view-checked>\n </div>\n</ng-template>\n<ng-template #filterBoolean let-col=\"col\">\n <div class=\"filter-boolean-box\">\n <p-selectButton *ngIf=\"!col.minimizeFilter\"\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\n <ng-template let-item>\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\n </ng-template>\n </p-selectButton>\n <ng-container *ngIf=\"col.minimizeFilter\">\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\n class=\"btn-filter-boolean p-button-primary\"\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\n <file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingFileInstanceId\"\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </file-upload>\n\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [(ngModel)]=\"rowData.field\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\n </service-file-upload>\n</ng-template>\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\n [fileDataService]=\"fileSetting.control.fileDataService\" [maxFileSize]=\"fileSetting.control.maxFileSize\"\n [inTaiLieu]=\"fileSetting.control.inTaiLieu\" [(value)]=\"rowData[field]\" [disabled]=\"fileSetting.control.disabled\"\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\"\n (uploaded)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.UPLOADED)\">\n </file-manager>\n</ng-template>",
|
|
21785
21955
|
providers: [DecimalPipe, DatePipe],
|
|
21786
21956
|
styles: [".container-table{display:flex;overflow:hidden;flex-direction:column}.container-table .container-table-inner{display:flex;position:relative;height:auto;max-height:100%;min-height:60px}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{top:0;left:0;right:0;bottom:0;margin:auto;position:absolute;display:flex;flex-wrap:wrap;width:1.4em;height:1.4em;border:1px solid #d1d1d1;border-radius:2px;cursor:pointer}.pick-color-row>div{flex:0 0 50%;background:#84d140;border:1px solid #fff}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.group-icon{font-weight:400;color:#256aa2}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{position:absolute;left:0;top:0;width:5px;height:100%}.column-function{min-width:100px;padding:0}.custom-search-area{margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em;background-color:#f2f2f2}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{display:flex;align-items:center;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem!important;width:2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;white-space:nowrap;font-weight:700}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{width:26px;height:26px}.btn-filter-boolean:not(.p-button-primary),.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;color:#6c757d;border-color:#ced4da}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .main-title>*>h1{font-size:1.2em}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{position:absolute;width:0;height:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{display:flex;min-width:0;background-color:#fff;border-radius:3px}::ng-deep crud-list .cell-header-filter .filter-box>div{flex:1;border:1px solid #ced4da;border-right:none;border-radius:3px 0 0 3px;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{cursor:pointer;min-width:unset;flex-basis:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:#f5f6f8;color:#6c757d;border:1px solid #ced4da;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{position:absolute;top:calc(50% - 16px);min-width:250px;z-index:2;box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763)}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{flex:1;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{left:0;right:0;height:1px}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list .custom-search-area .main-container-search-inner .container-control{overflow:hidden;padding-bottom:0}::ng-deep crud-list>p-contextmenu{display:none}::ng-deep crud-list .contentTd{overflow:hidden;display:-webkit-box;-webkit-line-clamp:7;-webkit-box-orient:vertical}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
|
|
21787
21957
|
},] }
|
|
@@ -22082,6 +22252,7 @@ class ListBase extends ComponentBaseWithButton {
|
|
|
22082
22252
|
this.hasCrudList = true;
|
|
22083
22253
|
this.customGetData = false;
|
|
22084
22254
|
this.readyToTrinhKy = false;
|
|
22255
|
+
this.showAllButtons = false;
|
|
22085
22256
|
this.plusUrl = '';
|
|
22086
22257
|
this.dataSearchCommon = {};
|
|
22087
22258
|
this.popupSizeMax = new PopupSize({ maximize: true });
|
|
@@ -22169,7 +22340,7 @@ class ListBase extends ComponentBaseWithButton {
|
|
|
22169
22340
|
this.getMenuButtons = this.getMenuButtons.bind(this);
|
|
22170
22341
|
}
|
|
22171
22342
|
mergeInfoToColumnSchema() {
|
|
22172
|
-
let i = 0, constWidth = 83, sumWidth = 0, widthColBefore = 0; // 83 tổng chiều dài checkbox + stt crud-list
|
|
22343
|
+
let i = 0, constWidth = 83, sumWidth = 0, widthColBefore = 0; // 83 tổng chiều dài checkbox + stt crud-list
|
|
22173
22344
|
if (this.setting.hiddenCheckbox)
|
|
22174
22345
|
constWidth -= 35;
|
|
22175
22346
|
if (this.setting.hiddenOrderColumn)
|
|
@@ -22458,6 +22629,18 @@ class ListBase extends ComponentBaseWithButton {
|
|
|
22458
22629
|
// this._getRefDataDropdown(this.model.dataSource);
|
|
22459
22630
|
// K dùng hàm ở trên vì đối với tree list thì model.dataSource đã bị tái cấu trúc
|
|
22460
22631
|
this._getRefDataDropdown(rawDataSource);
|
|
22632
|
+
setTimeout(() => {
|
|
22633
|
+
this.setAuthorizeButtons();
|
|
22634
|
+
}, 10);
|
|
22635
|
+
});
|
|
22636
|
+
}
|
|
22637
|
+
setAuthorizeButtons() {
|
|
22638
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22639
|
+
if (this.setting.hiddenAuthorizeButton) {
|
|
22640
|
+
this.crudList.setBtnReady(true);
|
|
22641
|
+
return;
|
|
22642
|
+
}
|
|
22643
|
+
this.crudList.setAuthorizeButton(this.lstButtonElement['_results']);
|
|
22461
22644
|
});
|
|
22462
22645
|
}
|
|
22463
22646
|
beforeRenderDataSource(datasource) {
|
|
@@ -22979,6 +23162,7 @@ ListBase.ctorParameters = () => [
|
|
|
22979
23162
|
{ type: Boolean }
|
|
22980
23163
|
];
|
|
22981
23164
|
ListBase.propDecorators = {
|
|
23165
|
+
lstButtonElement: [{ type: ViewChildren, args: ['button',] }],
|
|
22982
23166
|
contentCrudList: [{ type: ViewChild, args: [CrudListComponent,] }],
|
|
22983
23167
|
contentTreeTable: [{ type: ViewChild, args: [TreeTableComponent,] }],
|
|
22984
23168
|
parentModel: [{ type: Input }],
|
|
@@ -33421,10 +33605,11 @@ TnComponentConfig.ctorParameters = () => [
|
|
|
33421
33605
|
];
|
|
33422
33606
|
|
|
33423
33607
|
class AuthorizeDirective {
|
|
33424
|
-
constructor(_el, _permissionService, _userService, _moduleConfigService) {
|
|
33608
|
+
constructor(_el, _permissionService, _userService, _commonService, _moduleConfigService) {
|
|
33425
33609
|
this._el = _el;
|
|
33426
33610
|
this._permissionService = _permissionService;
|
|
33427
33611
|
this._userService = _userService;
|
|
33612
|
+
this._commonService = _commonService;
|
|
33428
33613
|
this._moduleConfigService = _moduleConfigService;
|
|
33429
33614
|
this._permissionTypes = PermissionTypes.CONTROL;
|
|
33430
33615
|
this.ignoreAdmin = false;
|
|
@@ -33444,12 +33629,15 @@ class AuthorizeDirective {
|
|
|
33444
33629
|
this._permissionTypes = value;
|
|
33445
33630
|
}
|
|
33446
33631
|
ngOnInit() {
|
|
33447
|
-
|
|
33448
|
-
|
|
33449
|
-
|
|
33632
|
+
}
|
|
33633
|
+
ngAfterViewInit() {
|
|
33634
|
+
this.setAuthorizeButton();
|
|
33450
33635
|
if (this._moduleCode) {
|
|
33451
33636
|
this.appCode = this._moduleCode;
|
|
33452
33637
|
}
|
|
33638
|
+
if (!this.enableAuthorize) {
|
|
33639
|
+
return;
|
|
33640
|
+
}
|
|
33453
33641
|
const currentUser = this._userService.getCurrentUser();
|
|
33454
33642
|
if (!currentUser || !(this.appCode)) {
|
|
33455
33643
|
console.log('Không đọc được user hoặc appCode');
|
|
@@ -33481,6 +33669,31 @@ class AuthorizeDirective {
|
|
|
33481
33669
|
}
|
|
33482
33670
|
});
|
|
33483
33671
|
}
|
|
33672
|
+
setAuthorizeButton() {
|
|
33673
|
+
var _a, _b, _c;
|
|
33674
|
+
let key = window.location.pathname.substring(1).toUpperCase().replace(/\//g, '_');
|
|
33675
|
+
if (isDevMode()) {
|
|
33676
|
+
key = `${this.appCode}_${window.location.pathname.substring(1).toUpperCase()}`;
|
|
33677
|
+
}
|
|
33678
|
+
// const componentName = this._element.closest(EnumProperties.CRUD_LIST)?.parentNode[EnumProperties.TAG_NAME];
|
|
33679
|
+
// if (componentName && !key.endsWith(componentName)) {
|
|
33680
|
+
// key += `_${componentName}`;
|
|
33681
|
+
// }
|
|
33682
|
+
const buttonText = (_b = (_a = this._element.getAttribute(EnumProperties.LABEL)) !== null && _a !== void 0 ? _a : this._element.getAttribute(EnumProperties.NG_REFLECT_TEXT)) !== null && _b !== void 0 ? _b : this._element.getAttribute(EnumProperties.NG_REFLECT_LABEL);
|
|
33683
|
+
if (!buttonText) {
|
|
33684
|
+
this.enableAuthorize = false;
|
|
33685
|
+
return;
|
|
33686
|
+
}
|
|
33687
|
+
this.buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
|
|
33688
|
+
const permissionCode = `[${key}]_[${this._commonService.convertStringToUnSign(buttonText).replace(/ /g, '_').toUpperCase()}]`;
|
|
33689
|
+
const isSetAuthorize = (_c = this.buttonSetting[key]) === null || _c === void 0 ? void 0 : _c.find(p => p.code == permissionCode);
|
|
33690
|
+
if (isSetAuthorize) {
|
|
33691
|
+
this.permission = permissionCode;
|
|
33692
|
+
}
|
|
33693
|
+
else {
|
|
33694
|
+
this.enableAuthorize = false;
|
|
33695
|
+
}
|
|
33696
|
+
}
|
|
33484
33697
|
ngAfterContentChecked() {
|
|
33485
33698
|
if (this._label && !this._bind && this._element.innerHTML !== '' && this.keepHTML) {
|
|
33486
33699
|
this._label.innerHTML = this._element.innerHTML;
|
|
@@ -33498,6 +33711,7 @@ AuthorizeDirective.ctorParameters = () => [
|
|
|
33498
33711
|
{ type: ElementRef },
|
|
33499
33712
|
{ type: PermissionService },
|
|
33500
33713
|
{ type: UserService },
|
|
33714
|
+
{ type: CommonService },
|
|
33501
33715
|
{ type: ModuleConfigService }
|
|
33502
33716
|
];
|
|
33503
33717
|
AuthorizeDirective.propDecorators = {
|
|
@@ -42949,6 +43163,144 @@ SettingsWorkflowComponent.propDecorators = {
|
|
|
42949
43163
|
parentSetting: [{ type: Input }]
|
|
42950
43164
|
};
|
|
42951
43165
|
|
|
43166
|
+
class SettingAuthorizeButtonComponent extends DataListBase {
|
|
43167
|
+
constructor(_injector, _basePermissionService, _moduleConfigService) {
|
|
43168
|
+
super(_injector);
|
|
43169
|
+
this._injector = _injector;
|
|
43170
|
+
this._basePermissionService = _basePermissionService;
|
|
43171
|
+
this._moduleConfigService = _moduleConfigService;
|
|
43172
|
+
this.authorizeButtonKey = '';
|
|
43173
|
+
this.dataSource = [];
|
|
43174
|
+
this.appCode = '';
|
|
43175
|
+
}
|
|
43176
|
+
ngOnInit() {
|
|
43177
|
+
this.appCode = this._moduleConfigService.getConfig().appCode;
|
|
43178
|
+
this.setting.baseService = this._basePermissionService;
|
|
43179
|
+
this.customGetData = true;
|
|
43180
|
+
this.setting.hiddenAdvanceSearch = true;
|
|
43181
|
+
this.setting.hiddenHeader = true;
|
|
43182
|
+
this.setting.heightType = HeightType.dynamic;
|
|
43183
|
+
this.setting.hiddenOrderColumn = true;
|
|
43184
|
+
this.setting.hiddenFilterRow = true;
|
|
43185
|
+
this.setting.hiddenSettingWorkflow = true;
|
|
43186
|
+
this.setting.hiddenAuthorizeButton = true;
|
|
43187
|
+
this.setting.hiddenSettingPermission = true;
|
|
43188
|
+
this.setting.fixHeightTypeInDialog = false;
|
|
43189
|
+
this.setting.hiddenCheckbox = false;
|
|
43190
|
+
this.setting.showEditLink = false;
|
|
43191
|
+
this.setting.modelSchemas = [
|
|
43192
|
+
new ModelSchema({
|
|
43193
|
+
field: 'permissionCode',
|
|
43194
|
+
name: 'Mã',
|
|
43195
|
+
}),
|
|
43196
|
+
new ModelSchema({
|
|
43197
|
+
field: 'rawText',
|
|
43198
|
+
name: 'Tên',
|
|
43199
|
+
}),
|
|
43200
|
+
new ModelSchema({
|
|
43201
|
+
field: 'isAuthorize',
|
|
43202
|
+
name: 'Đã tạo quyền',
|
|
43203
|
+
}),
|
|
43204
|
+
new ModelSchema({
|
|
43205
|
+
field: 'ma1',
|
|
43206
|
+
name: 'Mã',
|
|
43207
|
+
}),
|
|
43208
|
+
];
|
|
43209
|
+
this.setting.cols = [
|
|
43210
|
+
new ColumnSchemaBase({ field: 'permissionCode', sort: false, showEditLink: false }),
|
|
43211
|
+
new ColumnSchemaBase({ field: 'rawText', width: '230px', sort: false }),
|
|
43212
|
+
new ColumnSchemaBase({ field: 'isAuthorize', dataType: DataType.boolean, width: '100px', sort: false }),
|
|
43213
|
+
];
|
|
43214
|
+
super.ngOnInit();
|
|
43215
|
+
}
|
|
43216
|
+
getDataCustom(gridInfo) {
|
|
43217
|
+
this.model.dataSource = this.dataSource;
|
|
43218
|
+
this.afterGetData();
|
|
43219
|
+
}
|
|
43220
|
+
addBasePermission(rowData) {
|
|
43221
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43222
|
+
const insertRes = yield this._basePermissionService.post(rowData);
|
|
43223
|
+
if (insertRes.success) {
|
|
43224
|
+
this._notifierService.showSuccess('Thêm quyền thành công');
|
|
43225
|
+
this.updateDataSource(insertRes.data);
|
|
43226
|
+
return;
|
|
43227
|
+
}
|
|
43228
|
+
this._notifierService.showWarning('Có lỗi trong quá trình xử lý, vui lòng thử lại');
|
|
43229
|
+
});
|
|
43230
|
+
}
|
|
43231
|
+
deleteBasePermission(rowData) {
|
|
43232
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43233
|
+
this._notifierService.showConfirm('Xác nhận xóa quyền').then((res) => __awaiter(this, void 0, void 0, function* () {
|
|
43234
|
+
if (!res)
|
|
43235
|
+
return;
|
|
43236
|
+
const deleteRes = yield this._basePermissionService.delete(rowData.id);
|
|
43237
|
+
if (deleteRes.success) {
|
|
43238
|
+
this._notifierService.showSuccess('Xóa quyền thành công');
|
|
43239
|
+
this.updateDataSource(rowData.id, true);
|
|
43240
|
+
return;
|
|
43241
|
+
}
|
|
43242
|
+
this._notifierService.showWarning(deleteRes.message);
|
|
43243
|
+
}));
|
|
43244
|
+
});
|
|
43245
|
+
}
|
|
43246
|
+
updateDataSource(id, isDeleted = false) {
|
|
43247
|
+
const currentRow = this.model.dataSource.find(p => p.id == id);
|
|
43248
|
+
if (!currentRow)
|
|
43249
|
+
return;
|
|
43250
|
+
if (isDeleted) {
|
|
43251
|
+
currentRow.id = this._commonService.guid();
|
|
43252
|
+
}
|
|
43253
|
+
currentRow.isAuthorize = !isDeleted;
|
|
43254
|
+
this.afterGetData();
|
|
43255
|
+
}
|
|
43256
|
+
afterGetData() {
|
|
43257
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43258
|
+
this._unmarkLoading();
|
|
43259
|
+
if (!this.model.dataSource.length)
|
|
43260
|
+
return;
|
|
43261
|
+
this.model.dataSource.forEach(item => {
|
|
43262
|
+
item.name = item.rawText;
|
|
43263
|
+
item.code = item.permissionCode;
|
|
43264
|
+
item.moduleCode = this.appCode;
|
|
43265
|
+
});
|
|
43266
|
+
});
|
|
43267
|
+
}
|
|
43268
|
+
ngOnDestroy() {
|
|
43269
|
+
const buttonSetting = JSON.parse(sessionStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE) || '{}');
|
|
43270
|
+
this.model.dataSource.forEach(rowData => {
|
|
43271
|
+
const buttonItem = buttonSetting[this.authorizeButtonKey].find(p => p.code == rowData.code);
|
|
43272
|
+
if (rowData.isAuthorize && !buttonItem) {
|
|
43273
|
+
buttonSetting[this.authorizeButtonKey].push({
|
|
43274
|
+
id: rowData.id,
|
|
43275
|
+
code: rowData.code,
|
|
43276
|
+
});
|
|
43277
|
+
}
|
|
43278
|
+
else if (!rowData.isAuthorize && buttonItem) {
|
|
43279
|
+
const index = buttonSetting[this.authorizeButtonKey].indexOf(buttonItem);
|
|
43280
|
+
buttonSetting[this.authorizeButtonKey].splice(index, 1);
|
|
43281
|
+
}
|
|
43282
|
+
});
|
|
43283
|
+
sessionStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.BUTTON_AUTHORIZE, JSON.stringify(buttonSetting));
|
|
43284
|
+
}
|
|
43285
|
+
}
|
|
43286
|
+
SettingAuthorizeButtonComponent.decorators = [
|
|
43287
|
+
{ type: Component, args: [{
|
|
43288
|
+
selector: 'settings-authorize-button',
|
|
43289
|
+
template: "<crud-list #crudList [menuButtons]=\"getMenuButtons\" [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\n [hiddenAdd]=\"true\" [hiddenDelete]=\"true\" [hiddenCopyLink]=\"true\" (onReload)=\"_triggerProcessData($event)\"\n (onAdd)=\"_add($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_handleReloaded($event)\" (onCopyLink)=\"_copyLink($event)\"\n (onCopyLinkMultiple)=\"_copyLinkMultiple()\">\n <ng-template #function let-rowData=\"rowData\">\n <button *ngIf=\"!rowData.isAuthorize\" class=\"p-button-rounded p-button-text p-button-info link-or-action\"\n type=\"button\" pButton icon=\"pi pi-plus\" pTooltip=\"Th\u00EAm m\u1EDBi\" (click)=\"addBasePermission(rowData)\"></button>\n <button *ngIf=\"rowData.isAuthorize\"\n class=\"p-button-rounded p-button-text p-button-danger p-button-info link-or-action\" type=\"button\" pButton\n icon=\"pi pi-trash\" pTooltip=\"X\u00F3a\" (click)=\"deleteBasePermission(rowData)\"></button>\n </ng-template>\n</crud-list>",
|
|
43290
|
+
providers: [ComponentContextService],
|
|
43291
|
+
styles: [""]
|
|
43292
|
+
},] }
|
|
43293
|
+
];
|
|
43294
|
+
SettingAuthorizeButtonComponent.ctorParameters = () => [
|
|
43295
|
+
{ type: Injector },
|
|
43296
|
+
{ type: BasePermissionService },
|
|
43297
|
+
{ type: ModuleConfigService }
|
|
43298
|
+
];
|
|
43299
|
+
SettingAuthorizeButtonComponent.propDecorators = {
|
|
43300
|
+
authorizeButtonKey: [{ type: Input }],
|
|
43301
|
+
dataSource: [{ type: Input }]
|
|
43302
|
+
};
|
|
43303
|
+
|
|
42952
43304
|
class SettingsComponent extends ComponentBase {
|
|
42953
43305
|
constructor(_injector, _domService, _userService) {
|
|
42954
43306
|
super(_injector);
|
|
@@ -46663,6 +47015,7 @@ function coreDeclaration() {
|
|
|
46663
47015
|
TnAccordionTabComponent,
|
|
46664
47016
|
SplashComponentComponent,
|
|
46665
47017
|
SettingsWorkflowComponent,
|
|
47018
|
+
SettingAuthorizeButtonComponent,
|
|
46666
47019
|
SettingsWorkflowNo1Component,
|
|
46667
47020
|
CommonLibComponent
|
|
46668
47021
|
];
|
|
@@ -46833,5 +47186,5 @@ class Pair {
|
|
|
46833
47186
|
* Generated bundle index. Do not edit.
|
|
46834
47187
|
*/
|
|
46835
47188
|
|
|
46836
|
-
export { AccessDeniedComponent, Action, ActionChoYKienBase, ActionThuHoiBase, ActionUpdateModel, AddressControlSchema, AddressService, AdvanceSearchData, AdvanceSearchSetting, AfterViewCheckedComponent, AnnouncementReadsService, AnnouncementsService, AppComponentBase, AppListService, ApplicationContextService, ApprovalPipe, ArrayPair, AtLeastOneRowTableValidator, AuthenService, AuthorizeDirective, AutoCompleteControlSchema, AutoCompletePickerControlSchema, AutocompleteDatasourceComponent, AvatarUploaderComponent, BaseMenuService, BaseModule, BaseService, BooleanFormatPipe, ButtonControlSchema, ButtonPermission, ButtonPermissions, ButtonTextActionCongViec, CONFIG_CALENDAR_VIETNAMESE, CalculationEngineService, CanBoHoSoService, CanBo_HoSo_CoCauToChucService, CauHinhWorkflowService, CccdValidator, CellExcel, ChatBoxComponent, ChatSendMessageBoxComponent, CheckBoxListControlSchema, CheckControlVisibleService, CheckDuplicateFieldsValidator, CheckDuplicateValidator, CheckboxControlSchema, ChipsControlSchema, ClientV5Service, CoCauToChucControlSchema, CoCauToChucNewService, CoCauToChucPickerComponent, CoCauToChucPickerControlSchema, CoCauToChucPickerControlSchemaNew, CoCauToChucService, CodeValidator, ColorBlack, ColorControlSchema, ColorPickerControlSchema, ColorWhite, Column, ColumnSchemaBase, ColumnSetting, ColumnSettingDetail, ComCtxConstants, CommandType, CommonDashboardComponent, CommonErrorCode, CommonLibComponent, CommonSearchFormComponent, CommonService, CompareValidator, ComponentBase, ComponentBaseWithButton, ComponentConstants, ComponentContextService, ConditionalBuilderService, CongViecPickerControlSchema, ContainerSchema, ControlTreeNode, ControlType, ConvertMoneyToWordPipe, CoreConfigService, CrudBase, CrudFormComponent, CrudFormCustomFunction, CrudFormData, CrudFormSetting, CrudListComponent, CrudListConfig, CrudListCustomFunction, CrudListData, CrudListHelper, CrudListSetting, CrudService, CustomControlSchema, CustomRouterService, CustomizeUiModel, CustomizeUiService, DanhmucApiService, DataExcel, DataFormBase, DataListBase, DataSourceControlSchema, DataSourceGioiTinh, DataSourcePermissionBase, DataSourceWorkflowCoreStatus, DataType, DateCompareValidator, DateTimeControlSchema, DateTimeRangeControlSchema, DbOrganizationOrganizationService, DbOrganizationPositionService, Deadline, DeadlineType, DhvinhGuardService, DialogModel, DmChucVuService, DmLoaiCongViecService, DomService, DownloadLinkService, DropdownComponent, DropdownControlSchema, DropdownOptions, DummyWorkflowCode, DynamicComponentService, ENUM_DON_VI_HANH_CHINH, EXPLORER_TYPES, EXPORT_VERSION_V4, EXPORT_VERSION_V5, EditFileCommand, EditorControlSchema, EformService, EmailValidator, EntityMedataDataSetting, EntityMetadataService, EntityPickerColumn, EntityPickerControlSchema, EntityWorkflowHistoryService, EntityWorkflowType, EnumActionType, EnumAppSwitcherCode, EnumCanBo, EnumControlPickerType, EnumFileLayout, EnumGetRefType, EnumGioiTinh, EnumHocHamHocVi, EnumLoaiVanBanBase$1 as EnumLoaiVanBanBase, EnumPermissionType, EnumProcessWorkflowType, EnumStateType, EnumTargetType, EnumTypeSplash, EnumUserRule, EnumUserSource, EnumWFNhomTrangThai, EnumWorkflowCheckboxOption, EnumWorkflowCoreCodeSettingKey, EnumWorkflowHistoryStatus, ErrorType, EventData, EventType, ExactOneValueInTableValidator, ExportAllMode, ExportItem, ExportItemType, ExportItemsMode, ExportManyModel, ExportManyResultModel, ExportModel, ExportService, ExportWithoutTemplateModel, Extension, ExtensionsConst, FILE_TYPES, FederationService, FieldCheckboxCrudList, FieldColExpandCrudList, FieldColReorderCrudList, FieldDefineHasTask, FieldDefineIsTaskFormControl, FieldDefineIsWorkflowControl, FieldFunctionCrudList, FieldIndexInDataSource, FieldOrderCrudList, FieldRowSpan, FieldWorkflowCodeInCrudForm, FileDataService, FileExplorerService, FileExtensions, FileManagerComponent, FileManagerControlSchema, FileManagerMode, FileManagerSetting, FileObjectService, FilePickerDialogComponent, FilePickerSetting, FileType, FileTypeFlag, FileUploadComponent, FileUploadControlSchema, FileUploadMode, FileUploadSetting, FileV4Service, Filter, FolderService, FormControlBase, FormControlBaseWithService, FormSchemaBase, FormSchemaBaseWithService, FormState, Gender, GenerateLinkDownloadDTO, GenericGuardChildService, GenericGuardService, GlobalService, GmailCorrector, GridInfo, GuardService, GuardSvService, HeightType, HighPerformanceService, HighlightPipe, HoSoDoiTacService, HtmlFormatPipe, HttpOptions, ImageService, ImageUploaderControlSchema, Include, KeyFieldGetRefType, KeyFilterStateByMenuCongViec, KeyFlashShow, KeyFunctionReload, KeyValueComponent, KeyValueControlSchema, LabelSchema, LabelWFNhomTrangThai, LabelWorkflowCoreStatus, LengthValidator, ListHelperService, LoaiPhieuDeXuat, LocalCacheService, LowerCorrector, MA_THONG_BAO_PHAN_HE, MaActionBatDauQuyTrinh, ManagerType, MaskControlSchema, MasterDataItem, MasterDataPipe, MasterDataService, MenuService, MenuSource, MergeConfigModel, MethodResult, ModelKySoDonVi, ModelSchema, ModuleConfigService, MultiTranslateHttpLoader, MultipleReferenceDataFormatPipe, NameValidator, NotificationObjectType, NotificationService, NotifierService, NotifierType, NumberCompareValidator, NumberOnlyValidator, NumberRangeControlSchema, Operator, OrganizationFormatPipe, OrganizationNameFormatPipe, OrganizationPickerControlSchema, OrganizationService, OrganizationsFormatPipe, PageInfo, PageSetting, Pair, PassportValidator, PasswordValidator, Pattern, PercentControlSchema, PermissionBase, PermissionConstant, PermissionService, PermissionStorage, PermissionTypes, PermissionUtilsComponent, PersonalSetting, PhanQuyenModel, PhoneNumberValidator, PhoneValidator, PopupSize, PositionService, PrintService, PublicFunction, QueryBuilderComponent, QueryBuilderGroupComponent, QueryBuilderRuleComponent, QueryGroup, QueryRule, RELOAD_FILE_LIST, RadioButtonListControlSchema, RandomDataService, RefField, ReferenceDataFormatPipe, ReferenceTextControlSchema, RegexSplitFieldByItem, ReponseResult, ReportQueueComponent, RequiredFieldsValidator, RequiredValidator, RowColorOption, RowExcel, SHARE_COMPONENT_ID, SHARE_EVENT, SafeHtmlPipe, SafeStylePipe, SafeUrlPipe, SameValueValidator, ScalarValueValidator, SchemaBase, SecurePipe, ServiceFileUploadComponent, ServiceRequestModel, ServiceRequestModelV5, SessionTypes, SharedFolderType, SignalRService, SimpleDicItem, SimpleDictionary, Sort, SortDirs, SpanControlSchema, SplashComponentComponent, StartupBusinessComponentBase, StateMachinesService, Status, StatusAction, StatusGroup, StatusOption, StatusOrg, StatusUser, StorageService, StorageUpdatedService, StringCompareOption, StringFormatPipe, SummaryPipe, SwitchControlSchema, TBL_DM_COSODAOTAO_CONSTS, TBL_DM_PHONGHOC_CONSTS, TBL_KTX_NGUOITHUE_HOSO, TBL_TS_PHIEUDEXUAT, TBL_TS_TAISANCODINH_CONSTS, TabViewData, TableSchema, TagSeparator, TaiLieuComponent, TaxCodeValidator, TemplateConstant, TemplateControlSchema, TemplateInstanceService, TemplateService, TemplateTextItem, TemplateTextMany, TemplateTextV4Service, TemplateType, TemplateV4Service, TenContainer, TextAlign, TextAreaControlSchema, TextControlSchema, TextControlSchemaWithService, TitleSchema, TnClientCommand, TnClientService, TnComponentConfig, TnCustomScrollbarComponent, TnDatePipe, TnMenu, TnMenuItem, TnReorderableColumnDirective, TnReorderableRowDirective, TnSortIcon, TnSortableColumnDirective, TnTreeTableToggler, TnUser, TnxSharedModule, TopicReloadCongViecV5, TopicReloadCountCongViecV5, TopicReloadNotification, TrangThaiMasterData, TrangThais, TreeDataOption, TreeListBase, TreeNode, TrimCorrector, TrimEndCorrector, TrimStartCorrector, TypeDanhMucAPI, UniqueFieldInTableValidator, UniqueNumberService, UpperCorrector, UserGroupRealService, UserGroupService, UserOnlineDetailsService, UserPickerControlSchema, UserPickerDialogComponent, UserPublicInfo, UserService, UserType, UserV5Service, Validation, ValueType, VanBanPickerControlSchema, ViewContainerRefDirective, VirtualBaseService, WfAction, WfItem, WfMachine, WfSchema, WorkflowConfigAdvance, WorkflowCoreStatusEnum, WorkflowFieldStateCode, WorkflowHistoryService, WorkflowPermissionDetailService, WorkflowService, WorkflowSetting, WorkflowSettingNew, WorkflowSettingsService, WorkflowTargetDefaultValue, WrapPickerControlSchema, addDay, addZero, appendDefaultFilter, clearAll, clone, cloneOld, coreDeclaration, coreModuleImport, coreProvider, dataSourceIcon, dateDiff, fileTypeSource, genQueryFromFilters, getDateFromStringDateVN, getDayOfWeek, getEnvironmentByName, getEnvironmentData, getListMenuByName, getMenuData, getMonday, getStringDate, getStringDateTime, getStringDateVN, getStringDateVNLocal, getTimeSpan, isArray, isBoolean, isDate, isFunction, isLiteralObject, isNumber, isObjectOld, isRegular, isSimpleType, isString, isValidDate, isValidTime, keyUserSurveyLocal, loadRemoteModule, loadRemotePageModule, mapProperty, maximumPageSize, mergeJSON, mergeJSONOld, moduleConfigFunc, monthDiff, multipleSort, romanize, ɵ0$2 as ɵ0, ɵ1$1 as ɵ1, ɵ2$1 as ɵ2, ɵ3, ɵ4, LoggerService as ɵa, DropdownService as ɵb, ImageUploaderComponent as ɵba, CheckBoxListComponent as ɵbb, CoCauToChucPickerListComponent as ɵbc, CoCauToChucPickerListNewComponent as ɵbd, FormBuilderComponent as ɵbe, DatetimePickerComponent as ɵbf, DatetimePickerRangeComponent as ɵbg, EntityPickerBoxComponent as ɵbh, EntityPickerDataComponent as ɵbi, EntityPickerSelectedComponent as ɵbj, EntityPickerComponent as ɵbk, EntityPickerSearchFormComponent as ɵbl, EntityPickerDialogComponent as ɵbm, EntityPickerTreeDataComponent as ɵbn, EntityPickerTreeSelectedComponent as ɵbo, EntityPermissionComponent as ɵbp, EquationEditorComponent as ɵbq, MaskComponent as ɵbr, NumberPickerRangeComponent as ɵbs, PagingNextBackOnlyComponent as ɵbt, RadioButtonListComponent as ɵbu, VanBanPickerComponent as ɵbv, VanBanDenService as ɵbw, VanBanDiService as ɵbx, VanBanPickerDialogComponent as ɵby, VanbanDiPickerComponent as ɵbz, EntityPickerService as ɵc, VanbanDenPickerComponent as ɵca, CongViecPickerComponent as ɵcb, SettingsComponent as ɵcc, SettingsRowComponent as ɵcd, ShareLinkByPermissionComponent as ɵce, TnCheckboxComponent as ɵcf, TnDialogComponent as ɵcg, TnColorPickerComponent as ɵch, TnTinymceComponent as ɵci, TnTabViewComponent as ɵcj, TableDetailFormComponent as ɵck, FileIconPipe as ɵcl, FileSizePipe as ɵcm, QuickAddFormComponent as ɵcn, PreventShiftTabDirective as ɵco, TnTemplateDirective as ɵcp, UserPickerComponent as ɵcq, UserPickerBoxComponent as ɵcr, CoCauToChucTestService as ɵcs, TnAppHelpComponent as ɵct, PathNameService as ɵcu, HelperCurrentPageComponent as ɵcv, TnAppNotificationListComponent as ɵcw, TnAppNotificationComponent as ɵcx, FolderFormComponent as ɵcy, FileFormComponent as ɵcz, ExceptionHandlerService as ɵd, FileViewerComponent as ɵda, FileVersionListComponent as ɵdb, ViewDetailComponent as ɵdc, ReferenceTextBoxComponent as ɵdd, QrCodeGeneratorComponent as ɵde, AddNewsComponent as ɵdf, ArticleService as ɵdg, NewsCategoryService as ɵdh, UniversalLinkProcessorComponent as ɵdi, SignatureDetailComponent as ɵdj, KySoSimDanhSachChuKyComponent as ɵdk, KySoSimChuKyUserService as ɵdl, FileKySoSimComponent as ɵdm, KySoSimSignPDFService as ɵdn, TaiLieuCuaToiComponent as ɵdo, KhaiThacTaiLieuDungChungComponent as ɵdp, DanhMucDungChungService as ɵdq, TnTemplateComponent as ɵdr, DropdownSettingFormComponent as ɵds, CheckReadyComponent as ɵdt, TnAccordionTabComponent as ɵdu, SettingsWorkflowComponent as ɵdv, SettingsWorkflowNo1Component as ɵdw, ListBase as ɵe, ListComponentBase as ɵf, TreeTableComponent as ɵg, NotFoundComponent as ɵh, SendAccessTokenInterceptor as ɵi, LogInterceptor as ɵj, PermissionUtilsInterceptor as ɵk, TraceInterceptor as ɵl, EntityPermissionService as ɵm, ChatService as ɵn, MyDriveService as ɵo, ContentsService as ɵp, StatusExtendsService as ɵq, MessageBoardService as ɵr, FileExplorerNewService as ɵs, FileVersionService as ɵt, FileManagerService as ɵu, DM_ChucVuService as ɵv, RoleService as ɵw, AddressComponent as ɵx, AdvanceSearchComponent as ɵy, AutoCompletePickerComponent as ɵz };
|
|
47189
|
+
export { AccessDeniedComponent, Action, ActionChoYKienBase, ActionThuHoiBase, ActionUpdateModel, AddressControlSchema, AddressService, AdvanceSearchData, AdvanceSearchSetting, AfterViewCheckedComponent, AnnouncementReadsService, AnnouncementsService, AppComponentBase, AppListService, ApplicationContextService, ApprovalPipe, ArrayPair, AtLeastOneRowTableValidator, AuthenService, AuthorizeDirective, AutoCompleteControlSchema, AutoCompletePickerControlSchema, AutocompleteDatasourceComponent, AvatarUploaderComponent, BaseMenuService, BaseModule, BaseService, BooleanFormatPipe, ButtonAction, ButtonControlSchema, ButtonPermission, ButtonPermissions, ButtonTextActionCongViec, CONFIG_CALENDAR_VIETNAMESE, CalculationEngineService, CanBoHoSoService, CanBo_HoSo_CoCauToChucService, CauHinhWorkflowService, CccdValidator, CellExcel, ChatBoxComponent, ChatSendMessageBoxComponent, CheckBoxListControlSchema, CheckControlVisibleService, CheckDuplicateFieldsValidator, CheckDuplicateValidator, CheckboxControlSchema, ChipsControlSchema, ClientV5Service, CoCauToChucControlSchema, CoCauToChucNewService, CoCauToChucPickerComponent, CoCauToChucPickerControlSchema, CoCauToChucPickerControlSchemaNew, CoCauToChucService, CodeValidator, ColorBlack, ColorControlSchema, ColorPickerControlSchema, ColorWhite, Column, ColumnSchemaBase, ColumnSetting, ColumnSettingDetail, ComCtxConstants, CommandType, CommonDashboardComponent, CommonErrorCode, CommonLibComponent, CommonSearchFormComponent, CommonService, CompareValidator, ComponentBase, ComponentBaseWithButton, ComponentConstants, ComponentContextService, ConditionalBuilderService, CongViecPickerControlSchema, ContainerSchema, ControlTreeNode, ControlType, ConvertMoneyToWordPipe, CoreConfigService, CrudBase, CrudFormComponent, CrudFormCustomFunction, CrudFormData, CrudFormSetting, CrudListComponent, CrudListConfig, CrudListCustomFunction, CrudListData, CrudListHelper, CrudListSetting, CrudService, CustomControlSchema, CustomRouterService, CustomizeUiModel, CustomizeUiService, DanhmucApiService, DataExcel, DataFormBase, DataListBase, DataSourceControlSchema, DataSourceGioiTinh, DataSourcePermissionBase, DataSourceWorkflowCoreStatus, DataType, DateCompareValidator, DateTimeControlSchema, DateTimeRangeControlSchema, DbOrganizationOrganizationService, DbOrganizationPositionService, Deadline, DeadlineType, DhvinhGuardService, DialogModel, DmChucVuService, DmLoaiCongViecService, DomService, DownloadLinkService, DropdownComponent, DropdownControlSchema, DropdownOptions, DummyWorkflowCode, DynamicComponentService, ENUM_DON_VI_HANH_CHINH, EXPLORER_TYPES, EXPORT_VERSION_V4, EXPORT_VERSION_V5, EditFileCommand, EditorControlSchema, EformService, EmailValidator, EntityMedataDataSetting, EntityMetadataService, EntityPickerColumn, EntityPickerControlSchema, EntityWorkflowHistoryService, EntityWorkflowType, EnumActionType, EnumAppSwitcherCode, EnumCanBo, EnumControlPickerType, EnumFileLayout, EnumGetRefType, EnumGioiTinh, EnumHocHamHocVi, EnumLoaiVanBanBase$1 as EnumLoaiVanBanBase, EnumPermissionType, EnumProcessWorkflowType, EnumProperties, EnumStateType, EnumTargetType, EnumTypeSplash, EnumUserRule, EnumUserSource, EnumWFNhomTrangThai, EnumWorkflowCheckboxOption, EnumWorkflowCoreCodeSettingKey, EnumWorkflowHistoryStatus, ErrorType, EventData, EventType, ExactOneValueInTableValidator, ExportAllMode, ExportItem, ExportItemType, ExportItemsMode, ExportManyModel, ExportManyResultModel, ExportModel, ExportService, ExportWithoutTemplateModel, Extension, ExtensionsConst, FILE_TYPES, FederationService, FieldCheckboxCrudList, FieldColExpandCrudList, FieldColReorderCrudList, FieldDefineHasTask, FieldDefineIsTaskFormControl, FieldDefineIsWorkflowControl, FieldFunctionCrudList, FieldIndexInDataSource, FieldOrderCrudList, FieldRowSpan, FieldWorkflowCodeInCrudForm, FileDataService, FileExplorerService, FileExtensions, FileManagerComponent, FileManagerControlSchema, FileManagerMode, FileManagerSetting, FileObjectService, FilePickerDialogComponent, FilePickerSetting, FileType, FileTypeFlag, FileUploadComponent, FileUploadControlSchema, FileUploadMode, FileUploadSetting, FileV4Service, Filter, FolderService, FormControlBase, FormControlBaseWithService, FormSchemaBase, FormSchemaBaseWithService, FormState, Gender, GenerateLinkDownloadDTO, GenericGuardChildService, GenericGuardService, GlobalService, GmailCorrector, GridInfo, GuardService, GuardSvService, HeightType, HighPerformanceService, HighlightPipe, HoSoDoiTacService, HtmlFormatPipe, HttpOptions, ImageService, ImageUploaderControlSchema, Include, KeyFieldGetRefType, KeyFilterStateByMenuCongViec, KeyFlashShow, KeyFunctionReload, KeyValueComponent, KeyValueControlSchema, LabelSchema, LabelWFNhomTrangThai, LabelWorkflowCoreStatus, LengthValidator, ListHelperService, LoaiPhieuDeXuat, LocalCacheService, LowerCorrector, MA_THONG_BAO_PHAN_HE, MaActionBatDauQuyTrinh, ManagerType, MaskControlSchema, MasterDataItem, MasterDataPipe, MasterDataService, MenuService, MenuSource, MergeConfigModel, MethodResult, ModelKySoDonVi, ModelSchema, ModuleConfigService, MultiTranslateHttpLoader, MultipleReferenceDataFormatPipe, NameValidator, NotificationObjectType, NotificationService, NotifierService, NotifierType, NumberCompareValidator, NumberOnlyValidator, NumberRangeControlSchema, Operator, OrganizationFormatPipe, OrganizationNameFormatPipe, OrganizationPickerControlSchema, OrganizationService, OrganizationsFormatPipe, PageInfo, PageSetting, Pair, PassportValidator, PasswordValidator, Pattern, PercentControlSchema, PermissionBase, PermissionConstant, PermissionName, PermissionService, PermissionStorage, PermissionTypes, PermissionUtilsComponent, PersonalSetting, PhanQuyenModel, PhoneNumberValidator, PhoneValidator, PopupSize, PositionService, PrintService, PublicFunction, QueryBuilderComponent, QueryBuilderGroupComponent, QueryBuilderRuleComponent, QueryGroup, QueryRule, RELOAD_FILE_LIST, RadioButtonListControlSchema, RandomDataService, RefField, ReferenceDataFormatPipe, ReferenceTextControlSchema, RegexSplitFieldByItem, ReponseResult, ReportQueueComponent, RequiredFieldsValidator, RequiredValidator, RowColorOption, RowExcel, SHARE_COMPONENT_ID, SHARE_EVENT, SafeHtmlPipe, SafeStylePipe, SafeUrlPipe, SameValueValidator, ScalarValueValidator, SchemaBase, SecurePipe, ServiceFileUploadComponent, ServiceRequestModel, ServiceRequestModelV5, SessionTypes, SharedFolderType, SignalRService, SimpleDicItem, SimpleDictionary, Sort, SortDirs, SpanControlSchema, SplashComponentComponent, StartupBusinessComponentBase, StateMachinesService, Status, StatusAction, StatusGroup, StatusOption, StatusOrg, StatusUser, StorageService, StorageUpdatedService, StringCompareOption, StringFormatPipe, SummaryPipe, SwitchControlSchema, TBL_DM_COSODAOTAO_CONSTS, TBL_DM_PHONGHOC_CONSTS, TBL_KTX_NGUOITHUE_HOSO, TBL_TS_PHIEUDEXUAT, TBL_TS_TAISANCODINH_CONSTS, TabViewData, TableSchema, TagSeparator, TaiLieuComponent, TaxCodeValidator, TemplateConstant, TemplateControlSchema, TemplateInstanceService, TemplateService, TemplateTextItem, TemplateTextMany, TemplateTextV4Service, TemplateType, TemplateV4Service, TenContainer, TextAlign, TextAreaControlSchema, TextControlSchema, TextControlSchemaWithService, TitleSchema, TnClientCommand, TnClientService, TnComponentConfig, TnCustomScrollbarComponent, TnDatePipe, TnMenu, TnMenuItem, TnReorderableColumnDirective, TnReorderableRowDirective, TnSortIcon, TnSortableColumnDirective, TnTreeTableToggler, TnUser, TnxSharedModule, TopicReloadCongViecV5, TopicReloadCountCongViecV5, TopicReloadNotification, TrangThaiMasterData, TrangThais, TreeDataOption, TreeListBase, TreeNode, TrimCorrector, TrimEndCorrector, TrimStartCorrector, TypeDanhMucAPI, UniqueFieldInTableValidator, UniqueNumberService, UpperCorrector, UserGroupRealService, UserGroupService, UserOnlineDetailsService, UserPickerControlSchema, UserPickerDialogComponent, UserPublicInfo, UserService, UserType, UserV5Service, Validation, ValueType, VanBanPickerControlSchema, ViewContainerRefDirective, VirtualBaseService, WfAction, WfItem, WfMachine, WfSchema, WorkflowConfigAdvance, WorkflowCoreStatusEnum, WorkflowFieldStateCode, WorkflowHistoryService, WorkflowPermissionDetailService, WorkflowService, WorkflowSetting, WorkflowSettingNew, WorkflowSettingsService, WorkflowTargetDefaultValue, WrapPickerControlSchema, addDay, addZero, appendDefaultFilter, clearAll, clone, cloneOld, coreDeclaration, coreModuleImport, coreProvider, dataSourceIcon, dateDiff, fileTypeSource, genQueryFromFilters, getDateFromStringDateVN, getDayOfWeek, getEnvironmentByName, getEnvironmentData, getListMenuByName, getMenuData, getMonday, getStringDate, getStringDateTime, getStringDateVN, getStringDateVNLocal, getTimeSpan, isArray, isBoolean, isDate, isFunction, isLiteralObject, isNumber, isObjectOld, isRegular, isSimpleType, isString, isValidDate, isValidTime, keyUserSurveyLocal, loadRemoteModule, loadRemotePageModule, mapProperty, maximumPageSize, mergeJSON, mergeJSONOld, moduleConfigFunc, monthDiff, multipleSort, romanize, ɵ0$2 as ɵ0, ɵ1$1 as ɵ1, ɵ2$1 as ɵ2, ɵ3, ɵ4, LoggerService as ɵa, DropdownService as ɵb, ImageUploaderComponent as ɵba, CheckBoxListComponent as ɵbb, CoCauToChucPickerListComponent as ɵbc, CoCauToChucPickerListNewComponent as ɵbd, FormBuilderComponent as ɵbe, DatetimePickerComponent as ɵbf, DatetimePickerRangeComponent as ɵbg, EntityPickerBoxComponent as ɵbh, EntityPickerDataComponent as ɵbi, EntityPickerSelectedComponent as ɵbj, EntityPickerComponent as ɵbk, EntityPickerSearchFormComponent as ɵbl, EntityPickerDialogComponent as ɵbm, EntityPickerTreeDataComponent as ɵbn, EntityPickerTreeSelectedComponent as ɵbo, EntityPermissionComponent as ɵbp, EquationEditorComponent as ɵbq, MaskComponent as ɵbr, NumberPickerRangeComponent as ɵbs, PagingNextBackOnlyComponent as ɵbt, RadioButtonListComponent as ɵbu, VanBanPickerComponent as ɵbv, VanBanDenService as ɵbw, VanBanDiService as ɵbx, VanBanPickerDialogComponent as ɵby, VanbanDiPickerComponent as ɵbz, EntityPickerService as ɵc, VanbanDenPickerComponent as ɵca, CongViecPickerComponent as ɵcb, SettingsComponent as ɵcc, SettingsRowComponent as ɵcd, ShareLinkByPermissionComponent as ɵce, TnCheckboxComponent as ɵcf, TnDialogComponent as ɵcg, TnColorPickerComponent as ɵch, TnTinymceComponent as ɵci, TnTabViewComponent as ɵcj, TableDetailFormComponent as ɵck, FileIconPipe as ɵcl, FileSizePipe as ɵcm, QuickAddFormComponent as ɵcn, PreventShiftTabDirective as ɵco, TnTemplateDirective as ɵcp, UserPickerComponent as ɵcq, UserPickerBoxComponent as ɵcr, CoCauToChucTestService as ɵcs, TnAppHelpComponent as ɵct, PathNameService as ɵcu, HelperCurrentPageComponent as ɵcv, TnAppNotificationListComponent as ɵcw, TnAppNotificationComponent as ɵcx, FolderFormComponent as ɵcy, FileFormComponent as ɵcz, ExceptionHandlerService as ɵd, FileViewerComponent as ɵda, FileVersionListComponent as ɵdb, ViewDetailComponent as ɵdc, ReferenceTextBoxComponent as ɵdd, QrCodeGeneratorComponent as ɵde, AddNewsComponent as ɵdf, ArticleService as ɵdg, NewsCategoryService as ɵdh, UniversalLinkProcessorComponent as ɵdi, SignatureDetailComponent as ɵdj, KySoSimDanhSachChuKyComponent as ɵdk, KySoSimChuKyUserService as ɵdl, FileKySoSimComponent as ɵdm, KySoSimSignPDFService as ɵdn, TaiLieuCuaToiComponent as ɵdo, KhaiThacTaiLieuDungChungComponent as ɵdp, DanhMucDungChungService as ɵdq, TnTemplateComponent as ɵdr, DropdownSettingFormComponent as ɵds, CheckReadyComponent as ɵdt, TnAccordionTabComponent as ɵdu, SettingsWorkflowComponent as ɵdv, SettingAuthorizeButtonComponent as ɵdw, BasePermissionService as ɵdx, SettingsWorkflowNo1Component as ɵdy, ListBase as ɵe, ListComponentBase as ɵf, TreeTableComponent as ɵg, NotFoundComponent as ɵh, SendAccessTokenInterceptor as ɵi, LogInterceptor as ɵj, PermissionUtilsInterceptor as ɵk, TraceInterceptor as ɵl, EntityPermissionService as ɵm, ChatService as ɵn, MyDriveService as ɵo, ContentsService as ɵp, StatusExtendsService as ɵq, MessageBoardService as ɵr, FileExplorerNewService as ɵs, FileVersionService as ɵt, FileManagerService as ɵu, DM_ChucVuService as ɵv, RoleService as ɵw, AddressComponent as ɵx, AdvanceSearchComponent as ɵy, AutoCompletePickerComponent as ɵz };
|
|
46837
47190
|
//# sourceMappingURL=tnx-shared.js.map
|