tnx-shared 5.0.64 → 5.0.65
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 +758 -379
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/data-form-base.d.ts +2 -2
- package/classes/base/data-form-base.d.ts.map +1 -1
- package/classes/base/data-list-base.d.ts +3 -1
- package/classes/base/data-list-base.d.ts.map +1 -1
- package/classes/constants.d.ts +4 -0
- package/classes/constants.d.ts.map +1 -1
- package/classes/form-schema.d.ts +38 -4
- package/classes/form-schema.d.ts.map +1 -1
- package/components/autocomplete-picker/autocomplete-picker.component.d.ts +1 -0
- package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
- package/components/common-app-component/common-app-component.d.ts +4 -1
- package/components/common-app-component/common-app-component.d.ts.map +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
- package/components/crud/crud-list/crud-list.component.d.ts +6 -1
- package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
- package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
- package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts.map +1 -1
- package/components/file-explorer/file-manager/file-manager.component.d.ts +0 -2
- package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
- package/components/file-explorer/models/file-settings.d.ts +46 -0
- package/components/file-explorer/models/file-settings.d.ts.map +1 -0
- package/components/file-explorer/services/download-link.service.d.ts +0 -1
- package/components/file-explorer/services/download-link.service.d.ts.map +1 -1
- package/components/file-explorer/services/file-explorer.service.d.ts +0 -2
- package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
- package/components/file-explorer/services/file-object.service.d.ts +0 -1
- package/components/file-explorer/services/file-object.service.d.ts.map +1 -1
- package/components/mask/mask.component.d.ts +2 -0
- package/components/mask/mask.component.d.ts.map +1 -1
- package/configs/component-context.constant.d.ts +1 -0
- package/configs/component-context.constant.d.ts.map +1 -1
- package/esm2015/classes/base/data-form-base.js +5 -5
- package/esm2015/classes/base/data-list-base.js +48 -23
- package/esm2015/classes/constants.js +6 -1
- package/esm2015/classes/form-schema.js +34 -3
- package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +72 -16
- package/esm2015/components/common-app-component/app.menu.component.js +2 -2
- package/esm2015/components/common-app-component/common-app-component.js +26 -3
- package/esm2015/components/crud/crud-form/crud-form.component.js +9 -2
- package/esm2015/components/crud/crud-list/crud-list.component.js +71 -6
- package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +29 -3
- package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +29 -3
- package/esm2015/components/file-explorer/file-manager/file-manager.component.js +4 -93
- package/esm2015/components/file-explorer/models/file-settings.js +60 -0
- package/esm2015/components/file-explorer/services/download-link.service.js +1 -4
- package/esm2015/components/file-explorer/services/file-explorer.service.js +8 -22
- package/esm2015/components/file-explorer/services/file-object.service.js +1 -15
- package/esm2015/components/mask/mask.component.js +8 -4
- package/esm2015/components/workflow/services/entity-workflow-history.service.js +3 -3
- package/esm2015/components/workflow/services/entity-workflow-setting.service.js +4 -4
- package/esm2015/configs/component-context.constant.js +3 -2
- package/esm2015/models/grid-info.js +1 -1
- package/esm2015/pipes/tn-date.pipe.js +12 -2
- package/esm2015/public-api.js +3 -1
- package/esm2015/services/base.service.js +16 -1
- package/esm2015/services/common.service.js +9 -1
- package/esm2015/services/crud.service.js +23 -4
- package/esm2015/services/menu.service.js +6 -3
- package/esm2015/services/notifier.service.js +2 -2
- package/esm2015/services/organization-base.service.js +57 -0
- package/esm2015/services/permission.service.js +9 -2
- package/esm2015/services/template-text-v4.service.js +1 -1
- package/esm2015/services/user-v5.service.js +1 -1
- package/esm2015/services/user.service.js +8 -2
- package/fesm2015/tnx-shared.js +524 -207
- package/fesm2015/tnx-shared.js.map +1 -1
- package/models/grid-info.d.ts +1 -0
- package/models/grid-info.d.ts.map +1 -1
- package/package.json +2 -2
- package/pipes/tn-date.pipe.d.ts +2 -0
- package/pipes/tn-date.pipe.d.ts.map +1 -1
- package/public-api.d.ts +2 -0
- package/public-api.d.ts.map +1 -1
- package/services/base.service.d.ts +1 -0
- package/services/base.service.d.ts.map +1 -1
- package/services/common.service.d.ts +4 -0
- package/services/common.service.d.ts.map +1 -1
- package/services/crud.service.d.ts.map +1 -1
- package/services/menu.service.d.ts +1 -1
- package/services/menu.service.d.ts.map +1 -1
- package/services/organization-base.service.d.ts +16 -0
- package/services/organization-base.service.d.ts.map +1 -0
- package/services/organization-base.service.ngfactory.d.ts.map +1 -0
- package/services/permission.service.d.ts +1 -0
- package/services/permission.service.d.ts.map +1 -1
- package/services/template-text-v4.service.d.ts.map +1 -1
- package/services/user.service.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
|
@@ -28,8 +28,6 @@
|
|
|
28
28
|
|
|
29
29
|
var stringify__default = /*#__PURE__*/_interopDefaultLegacy(stringify);
|
|
30
30
|
var moment___namespace = /*#__PURE__*/_interopNamespace(moment_);
|
|
31
|
-
var FileSaver__default = /*#__PURE__*/_interopDefaultLegacy(FileSaver);
|
|
32
|
-
var printJS___default = /*#__PURE__*/_interopDefaultLegacy(printJS_);
|
|
33
31
|
var printJS___namespace = /*#__PURE__*/_interopNamespace(printJS_);
|
|
34
32
|
var JWT___namespace = /*#__PURE__*/_interopNamespace(JWT_);
|
|
35
33
|
var jQuery___namespace = /*#__PURE__*/_interopNamespace(jQuery_);
|
|
@@ -397,7 +395,8 @@
|
|
|
397
395
|
MENU_CHANGED: 'MENU_CHANGED',
|
|
398
396
|
ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER: 'ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER',
|
|
399
397
|
SHOW_WAIT_BOX: 'SHOW_WAIT_BOX',
|
|
400
|
-
SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM'
|
|
398
|
+
SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM',
|
|
399
|
+
NEED_CLEAR_PERMISSION_CACHE: 'NEED_CLEAR_PERMISSION_CACHE'
|
|
401
400
|
};
|
|
402
401
|
ComCtxConstants.ROOT_USMART = {
|
|
403
402
|
SHOW_CONFIG_DATA_DEFAULT: 'SHOW_CONFIG_DATA_DEFAULT',
|
|
@@ -909,7 +908,7 @@
|
|
|
909
908
|
NotifierService.prototype.showWarningByReponse = function (res) {
|
|
910
909
|
var message = res.message;
|
|
911
910
|
if (!message)
|
|
912
|
-
message =
|
|
911
|
+
message = 'Có lỗi xảy ra, vui lòng liên hệ quản trị viên!';
|
|
913
912
|
this.showWarning(message);
|
|
914
913
|
};
|
|
915
914
|
NotifierService.prototype.showBusinessError = function (message, key, header, life) {
|
|
@@ -2362,6 +2361,14 @@
|
|
|
2362
2361
|
errorDetail: err
|
|
2363
2362
|
};
|
|
2364
2363
|
};
|
|
2364
|
+
CommonService.prototype.tryParseJson = function (data) {
|
|
2365
|
+
try {
|
|
2366
|
+
return { valid: true, value: JSON.parse(data) };
|
|
2367
|
+
}
|
|
2368
|
+
catch (e) {
|
|
2369
|
+
return { valid: false, value: data };
|
|
2370
|
+
}
|
|
2371
|
+
};
|
|
2365
2372
|
return CommonService;
|
|
2366
2373
|
}());
|
|
2367
2374
|
CommonService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CommonService_Factory() { return new CommonService(i0.ɵɵinject(ModuleConfigService)); }, token: CommonService, providedIn: "root" });
|
|
@@ -3247,7 +3254,11 @@
|
|
|
3247
3254
|
EnumWorkflowCoreCodeSettingKey["MAC_DINH"] = "workflowCoreTrinhKy";
|
|
3248
3255
|
EnumWorkflowCoreCodeSettingKey["PHE_DUYET_2_BUOC"] = "workflowCoreTrinhKy2Buoc";
|
|
3249
3256
|
EnumWorkflowCoreCodeSettingKey["PHE_DUYET_3_BUOC"] = "workflowCoreTrinhKy3Buoc";
|
|
3250
|
-
})(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
|
|
3257
|
+
})(exports.EnumWorkflowCoreCodeSettingKey || (exports.EnumWorkflowCoreCodeSettingKey = {}));
|
|
3258
|
+
(function (EnumCoreVersion) {
|
|
3259
|
+
EnumCoreVersion["V4"] = "V4";
|
|
3260
|
+
EnumCoreVersion["V5"] = "V5";
|
|
3261
|
+
})(exports.EnumCoreVersion || (exports.EnumCoreVersion = {}));
|
|
3251
3262
|
|
|
3252
3263
|
var ModelSchema = /** @class */ (function () {
|
|
3253
3264
|
function ModelSchema(init) {
|
|
@@ -3323,6 +3334,7 @@
|
|
|
3323
3334
|
this.function = new CrudListCustomFunction();
|
|
3324
3335
|
this.popupHeader = '';
|
|
3325
3336
|
this.popupSize = new PopupSize();
|
|
3337
|
+
this.showMenuButtons = true;
|
|
3326
3338
|
this.getCustomDataTrinhKy = function (rowData) { return ({}); };
|
|
3327
3339
|
this.getLabelButtonTrinhKy = function (rowData) { return 'Trình ký'; };
|
|
3328
3340
|
this.checkReadyToTrinhKy = function () { return true; };
|
|
@@ -3637,6 +3649,7 @@
|
|
|
3637
3649
|
_this.fieldPlus = ''; // Danh sách những trường bổ sung cần lấy thêm ngoài id, ten; Ví dụ ,ma
|
|
3638
3650
|
_this.fieldValueParent = 'value'; // Trường sử dụng để lấy dữ liệu làm khóa từ bảng cha của item drop down được chọn
|
|
3639
3651
|
_this.fireCallBackInside = true;
|
|
3652
|
+
_this.coreVersion = exports.EnumCoreVersion.V5;
|
|
3640
3653
|
_this.funcCompare = function (item, value) { return item[_this.valueField] == value; };
|
|
3641
3654
|
for (var key in init) {
|
|
3642
3655
|
_this[key] = init[key];
|
|
@@ -3690,6 +3703,7 @@
|
|
|
3690
3703
|
_this.prefix = '';
|
|
3691
3704
|
_this.suffix = '';
|
|
3692
3705
|
_this.decimalPlaces = 2;
|
|
3706
|
+
_this.thousandSeperator = '.';
|
|
3693
3707
|
for (var key in init) {
|
|
3694
3708
|
_this[key] = init[key];
|
|
3695
3709
|
}
|
|
@@ -3869,7 +3883,6 @@
|
|
|
3869
3883
|
_this.mode = exports.FileManagerMode.multiple;
|
|
3870
3884
|
_this.layout = exports.EnumFileLayout.LIST;
|
|
3871
3885
|
_this.readonly = false;
|
|
3872
|
-
_this.uploadOnly = false;
|
|
3873
3886
|
// Trường hợp ở trong form, dùng trường này để lấy
|
|
3874
3887
|
// entityKey từ model.data thay vì truyền vào entityKey
|
|
3875
3888
|
_this.entityKeyField = 'id';
|
|
@@ -4484,6 +4497,7 @@
|
|
|
4484
4497
|
DataType["decimal"] = "decimal";
|
|
4485
4498
|
DataType["boolean"] = "boolean";
|
|
4486
4499
|
DataType["enum"] = "enum";
|
|
4500
|
+
DataType["currency"] = "currency";
|
|
4487
4501
|
})(exports.DataType || (exports.DataType = {}));
|
|
4488
4502
|
(function (ControlType) {
|
|
4489
4503
|
ControlType["dropdown"] = "dropdown";
|
|
@@ -4555,7 +4569,34 @@
|
|
|
4555
4569
|
(function (ExportAllMode) {
|
|
4556
4570
|
ExportAllMode[ExportAllMode["ManualGetData"] = 0] = "ManualGetData";
|
|
4557
4571
|
ExportAllMode[ExportAllMode["AutoGetData"] = 1] = "AutoGetData";
|
|
4558
|
-
})(exports.ExportAllMode || (exports.ExportAllMode = {}));
|
|
4572
|
+
})(exports.ExportAllMode || (exports.ExportAllMode = {}));
|
|
4573
|
+
(function (EventType) {
|
|
4574
|
+
EventType["CHANGE"] = "change";
|
|
4575
|
+
EventType["ADJUST_VALUE"] = "adjustValue";
|
|
4576
|
+
EventType["MODEL_CHANGED"] = "modelChanged";
|
|
4577
|
+
EventType["FORM_READY"] = "formReady";
|
|
4578
|
+
EventType["ENTER"] = "enter";
|
|
4579
|
+
EventType["HIDE"] = "hide";
|
|
4580
|
+
EventType["ROW_REORDER"] = "rowReorder";
|
|
4581
|
+
EventType["BLUR"] = "blur";
|
|
4582
|
+
EventType["READY"] = "READY";
|
|
4583
|
+
EventType["DATASOURCE_LOADED"] = "dataSourceLoaded";
|
|
4584
|
+
EventType["CLICK"] = "click";
|
|
4585
|
+
EventType["AUTO_CORRECT"] = "autoCorrect";
|
|
4586
|
+
EventType["VALIDATE"] = "validate";
|
|
4587
|
+
EventType["INIT"] = "init";
|
|
4588
|
+
EventType["ADDING"] = "adding";
|
|
4589
|
+
EventType["ADDED"] = "added";
|
|
4590
|
+
EventType["DELETING"] = "deleting";
|
|
4591
|
+
EventType["DELETED"] = "deleted";
|
|
4592
|
+
EventType["SELECT"] = "select";
|
|
4593
|
+
EventType["TABLE_CHANGED"] = "tableChanged";
|
|
4594
|
+
EventType["SAVE"] = "save";
|
|
4595
|
+
EventType["MESSAGE"] = "message";
|
|
4596
|
+
EventType["ROW_FINISH_INIT"] = "rowFinishInit";
|
|
4597
|
+
EventType["TABLE_FINISH_INIT"] = "tableFinishInit";
|
|
4598
|
+
EventType["UPLOADED"] = "uploaded";
|
|
4599
|
+
})(exports.EventType || (exports.EventType = {}));
|
|
4559
4600
|
|
|
4560
4601
|
var _a;
|
|
4561
4602
|
(function (WorkflowCoreStatusEnum) {
|
|
@@ -5997,14 +6038,24 @@
|
|
|
5997
6038
|
if (model.hasOwnProperty(sourceField)) {
|
|
5998
6039
|
valueFilter = model[sourceField];
|
|
5999
6040
|
if (canAccessSubField(valueFilter)) {
|
|
6000
|
-
valueFilter
|
|
6041
|
+
if (isArray(valueFilter) && typeof subField === 'string') {
|
|
6042
|
+
valueFilter = valueFilter.map(function (x) { return x[subField]; });
|
|
6043
|
+
}
|
|
6044
|
+
else {
|
|
6045
|
+
valueFilter = valueFilter[subField];
|
|
6046
|
+
}
|
|
6001
6047
|
}
|
|
6002
6048
|
}
|
|
6003
6049
|
else if (rootModel) {
|
|
6004
6050
|
if (rootModel.hasOwnProperty(sourceField)) {
|
|
6005
6051
|
valueFilter = rootModel[sourceField];
|
|
6006
6052
|
if (canAccessSubField(valueFilter)) {
|
|
6007
|
-
valueFilter
|
|
6053
|
+
if (isArray(valueFilter)) {
|
|
6054
|
+
valueFilter = valueFilter.map(function (x) { return x[subField]; });
|
|
6055
|
+
}
|
|
6056
|
+
else {
|
|
6057
|
+
valueFilter = valueFilter[subField];
|
|
6058
|
+
}
|
|
6008
6059
|
}
|
|
6009
6060
|
}
|
|
6010
6061
|
else {
|
|
@@ -6030,7 +6081,12 @@
|
|
|
6030
6081
|
finally { if (e_1) throw e_1.error; }
|
|
6031
6082
|
}
|
|
6032
6083
|
if (canAccessSubField(temp)) {
|
|
6033
|
-
|
|
6084
|
+
if (isArray(temp)) {
|
|
6085
|
+
valueFilter = temp.map(function (x) { return x[subField]; });
|
|
6086
|
+
}
|
|
6087
|
+
else {
|
|
6088
|
+
valueFilter = temp[subField];
|
|
6089
|
+
}
|
|
6034
6090
|
}
|
|
6035
6091
|
}
|
|
6036
6092
|
}
|
|
@@ -6043,6 +6099,9 @@
|
|
|
6043
6099
|
valueFilter = tmpFilter.funcGetValue(valueFilter);
|
|
6044
6100
|
}
|
|
6045
6101
|
tmpFilter.value = JSON.stringify(valueFilter);
|
|
6102
|
+
if (tmpFilter.modifyValue) {
|
|
6103
|
+
valueFilter = tmpFilter.modifyValue(valueFilter);
|
|
6104
|
+
}
|
|
6046
6105
|
tmpFilter.filters = [];
|
|
6047
6106
|
if (filter.logic && filter.filters) {
|
|
6048
6107
|
filter.filters.forEach(function (f) { return _this.deQuyReplaceValue(tmpFilter.filters, f, model, rootModel); });
|
|
@@ -6193,6 +6252,7 @@
|
|
|
6193
6252
|
});
|
|
6194
6253
|
};
|
|
6195
6254
|
CrudService.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
|
|
6255
|
+
data !== null && data !== void 0 ? data : (data = []);
|
|
6196
6256
|
var field = schema.field;
|
|
6197
6257
|
var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
|
|
6198
6258
|
if (schema.funcGetLabel) {
|
|
@@ -6485,6 +6545,24 @@
|
|
|
6485
6545
|
});
|
|
6486
6546
|
return this.postGridInfo(apiUrl, gridInfo);
|
|
6487
6547
|
};
|
|
6548
|
+
BaseService.prototype.getAllByFilter = function (filters, fields, sorts, plusUrl) {
|
|
6549
|
+
if (fields === void 0) { fields = ''; }
|
|
6550
|
+
if (sorts === void 0) { sorts = []; }
|
|
6551
|
+
if (plusUrl === void 0) { plusUrl = ''; }
|
|
6552
|
+
var apiUrl = this.apiGetAll;
|
|
6553
|
+
if (plusUrl != null && plusUrl != '')
|
|
6554
|
+
apiUrl += "/" + plusUrl;
|
|
6555
|
+
var gridInfo = new GridInfo({
|
|
6556
|
+
fields: fields,
|
|
6557
|
+
pageInfo: {
|
|
6558
|
+
page: 1,
|
|
6559
|
+
pageSize: 9999
|
|
6560
|
+
},
|
|
6561
|
+
sorts: sorts,
|
|
6562
|
+
filters: filters ? filters : []
|
|
6563
|
+
});
|
|
6564
|
+
return this.postGridInfo(apiUrl, gridInfo);
|
|
6565
|
+
};
|
|
6488
6566
|
BaseService.prototype.getAllByGridInfo = function (gridInfo, plusUrl) {
|
|
6489
6567
|
if (plusUrl === void 0) { plusUrl = ''; }
|
|
6490
6568
|
var apiUrl = this.apiGetAll;
|
|
@@ -6955,7 +7033,7 @@
|
|
|
6955
7033
|
}());
|
|
6956
7034
|
|
|
6957
7035
|
// fix for build prod
|
|
6958
|
-
var printJS =
|
|
7036
|
+
var printJS = printJS___namespace;
|
|
6959
7037
|
var FileExplorerService = /** @class */ (function () {
|
|
6960
7038
|
function FileExplorerService(_http, _moduleConfig, _authenService, _commonSerivce, _moduleConfigService, _notifierService) {
|
|
6961
7039
|
this._http = _http;
|
|
@@ -7165,11 +7243,11 @@
|
|
|
7165
7243
|
return this._serviceUri + "/DownloadLink/" + hash;
|
|
7166
7244
|
};
|
|
7167
7245
|
FileExplorerService.prototype.getDownloadForSignUrl = function (hash) {
|
|
7168
|
-
return this._serviceUri + "/
|
|
7246
|
+
return this._serviceUri + "/Download/downloadforsign/" + hash;
|
|
7169
7247
|
};
|
|
7170
7248
|
FileExplorerService.prototype.generateLinkDownload = function (model) {
|
|
7171
7249
|
var _this = this;
|
|
7172
|
-
var svUrl = this._serviceUri + "/
|
|
7250
|
+
var svUrl = this._serviceUri + "/Download/GenerateDownloadLink";
|
|
7173
7251
|
if (model.isFileVersion && !model.fileVersionId) {
|
|
7174
7252
|
model.fileVersionId = model.fileId;
|
|
7175
7253
|
}
|
|
@@ -7199,7 +7277,7 @@
|
|
|
7199
7277
|
this._http.get(url, { responseType: 'blob' })
|
|
7200
7278
|
.toPromise()
|
|
7201
7279
|
.then(function (rs) {
|
|
7202
|
-
|
|
7280
|
+
FileSaver.saveAs(rs, fileName);
|
|
7203
7281
|
})
|
|
7204
7282
|
.catch(function (err) {
|
|
7205
7283
|
_this._notifierService.showWarning('Lỗi tải file');
|
|
@@ -7361,13 +7439,13 @@
|
|
|
7361
7439
|
return regex.test(ext);
|
|
7362
7440
|
};
|
|
7363
7441
|
FileExplorerService.prototype.saveSignedFile = function (data) {
|
|
7364
|
-
return this._http.post(this._serviceUri + "/
|
|
7442
|
+
return this._http.post(this._serviceUri + "/Signature/SaveSignedFile", data).toPromise();
|
|
7365
7443
|
};
|
|
7366
7444
|
FileExplorerService.prototype.getSignatureInfoByFileId = function (fileId) {
|
|
7367
|
-
return this._http.get(this._serviceUri + "/
|
|
7445
|
+
return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileId?fileId=" + fileId).toPromise();
|
|
7368
7446
|
};
|
|
7369
7447
|
FileExplorerService.prototype.getSignatureInfoByFileVersionId = function (fileVersionId) {
|
|
7370
|
-
return this._http.get(this._serviceUri + "/
|
|
7448
|
+
return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
|
|
7371
7449
|
};
|
|
7372
7450
|
FileExplorerService.prototype.getUploadFileVersionApiUrl = function () {
|
|
7373
7451
|
return this._serviceUri + "/FileVersion/SaveVersionOnEdit";
|
|
@@ -7425,20 +7503,6 @@
|
|
|
7425
7503
|
var svUrl = this._serviceUri + "/FileObject/CreateServiceFileAnonymous";
|
|
7426
7504
|
return this._http.post(svUrl, serviceFileObjectDTO).pipe(operators.catchError(function (err) { return _this.handleError(err); })).toPromise();
|
|
7427
7505
|
};
|
|
7428
|
-
FileExplorerService.prototype.needConvertBeforeSign = function (fileName) {
|
|
7429
|
-
if (fileName.lastIndexOf('.') === -1) {
|
|
7430
|
-
return false;
|
|
7431
|
-
}
|
|
7432
|
-
var fileType = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
|
|
7433
|
-
if ((/(doc|docx|dot|dotm|dotx|xls|xlsx|ppt|pptx)$/i).test(fileType)) {
|
|
7434
|
-
return true;
|
|
7435
|
-
}
|
|
7436
|
-
return false;
|
|
7437
|
-
};
|
|
7438
|
-
FileExplorerService.prototype.changeFileExtension = function (fileName, newExtension) {
|
|
7439
|
-
var arr = fileName.split('.');
|
|
7440
|
-
return fileName.replace("." + arr[arr.length - 1], "." + newExtension);
|
|
7441
|
-
};
|
|
7442
7506
|
return FileExplorerService;
|
|
7443
7507
|
}());
|
|
7444
7508
|
FileExplorerService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FileExplorerService_Factory() { return new FileExplorerService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(AuthenService), i0.ɵɵinject(CommonService), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(NotifierService)); }, token: FileExplorerService, providedIn: "root" });
|
|
@@ -7886,9 +7950,6 @@
|
|
|
7886
7950
|
});
|
|
7887
7951
|
return promise;
|
|
7888
7952
|
};
|
|
7889
|
-
DownloadLinkService.prototype.getDownloadForSignUrl = function (hash) {
|
|
7890
|
-
return this.serviceUri + "/DownloadForSign/" + hash;
|
|
7891
|
-
};
|
|
7892
7953
|
return DownloadLinkService;
|
|
7893
7954
|
}(BaseService));
|
|
7894
7955
|
DownloadLinkService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DownloadLinkService_Factory() { return new DownloadLinkService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(CrudService), i0.ɵɵinject(NotifierService)); }, token: DownloadLinkService, providedIn: "root" });
|
|
@@ -8880,6 +8941,7 @@
|
|
|
8880
8941
|
}
|
|
8881
8942
|
else {
|
|
8882
8943
|
this._applicationContext.getRootContext().replaySubscribeOnce(ComCtxConstants.ROOT.USER_READY, function (rs) {
|
|
8944
|
+
var firstTimeLogin = rs;
|
|
8883
8945
|
var accessToken = _this._oauthService.getAccessToken();
|
|
8884
8946
|
var decoded = JWT.default(accessToken);
|
|
8885
8947
|
// Chuyển đổi sang dùng instanceId nếu đăng nhập bằng identityv4 nhưng phải sử dụng base userOrgv5
|
|
@@ -8921,7 +8983,12 @@
|
|
|
8921
8983
|
localStorage.setItem(_this.CURRENT_USER_KEY, JSON.stringify(user));
|
|
8922
8984
|
}
|
|
8923
8985
|
_this._applicationContext.getRootContext().data.currentUser = user;
|
|
8924
|
-
|
|
8986
|
+
if (firstTimeLogin) {
|
|
8987
|
+
_this._applicationContext.getRootContext().fireEvent(ComCtxConstants.ROOT.NEED_CLEAR_PERMISSION_CACHE);
|
|
8988
|
+
}
|
|
8989
|
+
else {
|
|
8990
|
+
_this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED, true);
|
|
8991
|
+
}
|
|
8925
8992
|
}, function (err) {
|
|
8926
8993
|
});
|
|
8927
8994
|
});
|
|
@@ -9481,9 +9548,12 @@
|
|
|
9481
9548
|
_this.delayCheckPermissions = [];
|
|
9482
9549
|
_this.ignoreAdmin = false;
|
|
9483
9550
|
_this.appCode = null;
|
|
9551
|
+
if (_moduleConfigService.getConfig().environment.authenticationSettings.coreVersion == 'v4') {
|
|
9552
|
+
_this.serviceUri = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint + "/permission";
|
|
9553
|
+
}
|
|
9484
9554
|
_this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
|
|
9485
|
-
_this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
|
|
9486
9555
|
_this.appCode = _this._moduleConfigService.getConfig().appCode;
|
|
9556
|
+
_this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
|
|
9487
9557
|
return _this;
|
|
9488
9558
|
}
|
|
9489
9559
|
/**
|
|
@@ -9705,6 +9775,10 @@
|
|
|
9705
9775
|
}
|
|
9706
9776
|
});
|
|
9707
9777
|
};
|
|
9778
|
+
PermissionService.prototype.clearPermissionCache = function (lstModule) {
|
|
9779
|
+
var url = this.serviceUri + "/ClearPermissionCache";
|
|
9780
|
+
return this.defaultPost(url, lstModule);
|
|
9781
|
+
};
|
|
9708
9782
|
return PermissionService;
|
|
9709
9783
|
}(BaseService));
|
|
9710
9784
|
PermissionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PermissionService_Factory() { return new PermissionService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(UserService), i0.ɵɵinject(i4.OAuthService), i0.ɵɵinject(ApplicationContextService)); }, token: PermissionService, providedIn: "root" });
|
|
@@ -10079,7 +10153,7 @@
|
|
|
10079
10153
|
if (service == undefined) {
|
|
10080
10154
|
(this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
|
|
10081
10155
|
}
|
|
10082
|
-
this.serviceUri = service.endPoint + "/EntityWorkflowHistory";
|
|
10156
|
+
this.serviceUri = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory";
|
|
10083
10157
|
};
|
|
10084
10158
|
EntityWorkflowHistoryService.prototype.getLastHistory = function (tableName, filters) {
|
|
10085
10159
|
if (filters === void 0) { filters = []; }
|
|
@@ -10087,7 +10161,7 @@
|
|
|
10087
10161
|
if (service == undefined) {
|
|
10088
10162
|
(this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
|
|
10089
10163
|
}
|
|
10090
|
-
var url = service.endPoint + "/EntityWorkflowHistory/GetLastByFilter";
|
|
10164
|
+
var url = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory/GetLastByFilter";
|
|
10091
10165
|
var gridInfo = {
|
|
10092
10166
|
pageInfo: {
|
|
10093
10167
|
page: 1,
|
|
@@ -10244,7 +10318,7 @@
|
|
|
10244
10318
|
(this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow setting');
|
|
10245
10319
|
}
|
|
10246
10320
|
return new Promise(function (resolve, reject) {
|
|
10247
|
-
_this.defaultPost(service.endPoint + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
|
|
10321
|
+
_this.defaultPost(service.endPoint + "/" + _this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
|
|
10248
10322
|
.then(function (res) {
|
|
10249
10323
|
if (res.success) {
|
|
10250
10324
|
var itemSetting = res.data;
|
|
@@ -10329,11 +10403,11 @@
|
|
|
10329
10403
|
};
|
|
10330
10404
|
EntityWorkflowSettingService.prototype.saveSetting = function (settingKey, data) {
|
|
10331
10405
|
var service = this.serviceManagers[settingKey];
|
|
10332
|
-
return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
|
|
10406
|
+
return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/SaveSetting/" + service.entityName, data);
|
|
10333
10407
|
};
|
|
10334
10408
|
EntityWorkflowSettingService.prototype.removeSetting = function (settingKey) {
|
|
10335
10409
|
var service = this.serviceManagers[settingKey];
|
|
10336
|
-
return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
|
|
10410
|
+
return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
|
|
10337
10411
|
};
|
|
10338
10412
|
return EntityWorkflowSettingService;
|
|
10339
10413
|
}(BaseService));
|
|
@@ -11147,25 +11221,37 @@
|
|
|
11147
11221
|
});
|
|
11148
11222
|
});
|
|
11149
11223
|
};
|
|
11224
|
+
DataListBase.prototype.validateEdit = function (rowData) {
|
|
11225
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11226
|
+
return __generator(this, function (_a) {
|
|
11227
|
+
return [2 /*return*/, true];
|
|
11228
|
+
});
|
|
11229
|
+
});
|
|
11230
|
+
};
|
|
11150
11231
|
DataListBase.prototype._edit = function (rowData, scopeDataEdit) {
|
|
11151
11232
|
if (scopeDataEdit === void 0) { scopeDataEdit = {}; }
|
|
11152
11233
|
return __awaiter(this, void 0, void 0, function () {
|
|
11153
|
-
var flashShow;
|
|
11234
|
+
var resultValidate, flashShow;
|
|
11154
11235
|
return __generator(this, function (_a) {
|
|
11155
11236
|
switch (_a.label) {
|
|
11156
|
-
case 0:
|
|
11237
|
+
case 0: return [4 /*yield*/, this.validateEdit(rowData)];
|
|
11238
|
+
case 1:
|
|
11239
|
+
resultValidate = _a.sent();
|
|
11240
|
+
if (!resultValidate) {
|
|
11241
|
+
return [2 /*return*/];
|
|
11242
|
+
}
|
|
11157
11243
|
flashShow = rowData[KeyFlashShow];
|
|
11158
11244
|
delete rowData[KeyFlashShow];
|
|
11159
11245
|
this.formModel.formState = exports.FormState.EDIT;
|
|
11160
11246
|
return [4 /*yield*/, this.beforeEdit()];
|
|
11161
|
-
case
|
|
11247
|
+
case 2:
|
|
11162
11248
|
_a.sent();
|
|
11163
11249
|
this.setting.popupHeader = "C\u1EADp nh\u1EADt " + this.setting.objectName;
|
|
11164
11250
|
this.setting.maskClass = flashShow ? 'hide' : null;
|
|
11165
11251
|
this.scopeDataEdit = scopeDataEdit;
|
|
11166
11252
|
this.formModel.data = this.cloneData(rowData);
|
|
11167
11253
|
return [4 /*yield*/, this.modifyEditModel(rowData)];
|
|
11168
|
-
case
|
|
11254
|
+
case 3:
|
|
11169
11255
|
_a.sent();
|
|
11170
11256
|
this.formModel.data[KeyFlashShow] = flashShow;
|
|
11171
11257
|
this.showDetailForm = true;
|
|
@@ -11196,34 +11282,56 @@
|
|
|
11196
11282
|
DataListBase.prototype.getPromiseDeleteItem = function (rowData) {
|
|
11197
11283
|
return this.setting.baseService.delete(rowData.id);
|
|
11198
11284
|
};
|
|
11285
|
+
DataListBase.prototype.validateDelete = function (rowData) {
|
|
11286
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11287
|
+
return __generator(this, function (_a) {
|
|
11288
|
+
return [2 /*return*/, true];
|
|
11289
|
+
});
|
|
11290
|
+
});
|
|
11291
|
+
};
|
|
11199
11292
|
DataListBase.prototype._delete = function (rowData) {
|
|
11200
|
-
|
|
11201
|
-
|
|
11202
|
-
|
|
11203
|
-
|
|
11204
|
-
|
|
11205
|
-
|
|
11206
|
-
|
|
11207
|
-
|
|
11208
|
-
if (_this.setting.baseService) {
|
|
11209
|
-
_this.getPromiseDeleteItem(rowData)
|
|
11210
|
-
.then(function (response) {
|
|
11211
|
-
if (response.success) {
|
|
11212
|
-
if (_this.setting.showVersionButton) {
|
|
11213
|
-
_this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
|
|
11293
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
11294
|
+
var resultValidate;
|
|
11295
|
+
var _this = this;
|
|
11296
|
+
return __generator(this, function (_a) {
|
|
11297
|
+
switch (_a.label) {
|
|
11298
|
+
case 0:
|
|
11299
|
+
if (rowData.__disableDelete) {
|
|
11300
|
+
return [2 /*return*/];
|
|
11214
11301
|
}
|
|
11215
|
-
|
|
11216
|
-
|
|
11302
|
+
return [4 /*yield*/, this.validateDelete(rowData)];
|
|
11303
|
+
case 1:
|
|
11304
|
+
resultValidate = _a.sent();
|
|
11305
|
+
if (!resultValidate) {
|
|
11306
|
+
return [2 /*return*/];
|
|
11217
11307
|
}
|
|
11218
|
-
|
|
11219
|
-
|
|
11220
|
-
|
|
11221
|
-
|
|
11222
|
-
|
|
11223
|
-
|
|
11224
|
-
|
|
11225
|
-
|
|
11226
|
-
|
|
11308
|
+
this._notifierService.showDeleteConfirm().then(function (rs) {
|
|
11309
|
+
if (!rs) {
|
|
11310
|
+
return;
|
|
11311
|
+
}
|
|
11312
|
+
if (_this.setting.baseService) {
|
|
11313
|
+
_this.getPromiseDeleteItem(rowData)
|
|
11314
|
+
.then(function (response) {
|
|
11315
|
+
if (response.success) {
|
|
11316
|
+
if (_this.setting.showVersionButton) {
|
|
11317
|
+
_this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
|
|
11318
|
+
}
|
|
11319
|
+
else {
|
|
11320
|
+
_this._triggerProcessData();
|
|
11321
|
+
}
|
|
11322
|
+
_this._notifierService.showDeleteDataSuccess();
|
|
11323
|
+
}
|
|
11324
|
+
else {
|
|
11325
|
+
_this._notifierService.showWarningByReponse(response);
|
|
11326
|
+
}
|
|
11327
|
+
}, function (error) {
|
|
11328
|
+
_this._notifierService.showDeleteDataError();
|
|
11329
|
+
});
|
|
11330
|
+
}
|
|
11331
|
+
});
|
|
11332
|
+
return [2 /*return*/];
|
|
11333
|
+
}
|
|
11334
|
+
});
|
|
11227
11335
|
});
|
|
11228
11336
|
};
|
|
11229
11337
|
DataListBase.prototype.getPromiseDeleteItems = function (items) {
|
|
@@ -11564,7 +11672,7 @@
|
|
|
11564
11672
|
arrPromiseDontNeedWait = [];
|
|
11565
11673
|
arrSchemaDontNeedWait = [];
|
|
11566
11674
|
_loop_1 = function (schema) {
|
|
11567
|
-
var field, arrValue_1, promise, result, funcGetLabel_1;
|
|
11675
|
+
var field, arrValue_1, promise, filters, result, funcGetLabel_1;
|
|
11568
11676
|
return __generator(this, function (_a) {
|
|
11569
11677
|
switch (_a.label) {
|
|
11570
11678
|
case 0:
|
|
@@ -11599,7 +11707,11 @@
|
|
|
11599
11707
|
promise = schema.baseService.getDataDropdown(schema.groupCode, arrValue_1, this_1.createDropdownOptions(schema));
|
|
11600
11708
|
}
|
|
11601
11709
|
else {
|
|
11602
|
-
|
|
11710
|
+
filters = [this_1.newFilter(schema.valueField, exports.Operator.in, arrValue_1)];
|
|
11711
|
+
if (schema.modifyFilter) {
|
|
11712
|
+
schema.modifyFilter(filters);
|
|
11713
|
+
}
|
|
11714
|
+
promise = schema.baseService.getDataDropdownByFilter(filters, this_1.createDropdownOptions(schema));
|
|
11603
11715
|
}
|
|
11604
11716
|
if (!(schema.order != null)) return [3 /*break*/, 2];
|
|
11605
11717
|
return [4 /*yield*/, promise];
|
|
@@ -11677,6 +11789,7 @@
|
|
|
11677
11789
|
});
|
|
11678
11790
|
};
|
|
11679
11791
|
DataListBase.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
|
|
11792
|
+
data !== null && data !== void 0 ? data : (data = []);
|
|
11680
11793
|
var field = schema.field;
|
|
11681
11794
|
var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
|
|
11682
11795
|
if (schema.funcGetLabel) {
|
|
@@ -14725,6 +14838,10 @@
|
|
|
14725
14838
|
});
|
|
14726
14839
|
this.onModelChanged.emit(event);
|
|
14727
14840
|
}
|
|
14841
|
+
else {
|
|
14842
|
+
this._rootNode = new ControlTreeNode(this._modelData, this.formControls);
|
|
14843
|
+
this._rootNode.setCrudForm(this);
|
|
14844
|
+
}
|
|
14728
14845
|
},
|
|
14729
14846
|
enumerable: false,
|
|
14730
14847
|
configurable: true
|
|
@@ -15984,18 +16101,24 @@
|
|
|
15984
16101
|
return __generator(this, function (_d) {
|
|
15985
16102
|
switch (_d.label) {
|
|
15986
16103
|
case 0:
|
|
15987
|
-
if (!control.multiple) return [3 /*break*/,
|
|
16104
|
+
if (!control.multiple) return [3 /*break*/, 5];
|
|
15988
16105
|
if (!(eventType == 'hide')) return [3 /*break*/, 2];
|
|
15989
16106
|
return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
|
|
15990
16107
|
case 1:
|
|
15991
16108
|
_d.sent();
|
|
15992
|
-
|
|
15993
|
-
case 2:
|
|
15994
|
-
|
|
15995
|
-
|
|
16109
|
+
return [3 /*break*/, 4];
|
|
16110
|
+
case 2:
|
|
16111
|
+
if (!(control.bindingFilters && eventType == 'change')) return [3 /*break*/, 4];
|
|
16112
|
+
return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
|
|
16113
|
+
case 3:
|
|
15996
16114
|
_d.sent();
|
|
15997
|
-
_d.label =
|
|
15998
|
-
case
|
|
16115
|
+
_d.label = 4;
|
|
16116
|
+
case 4: return [3 /*break*/, 7];
|
|
16117
|
+
case 5: return [4 /*yield*/, this.handleFieldValueChange(control, event, eventType, parentModel, parentPath, sourceNode, bubble)];
|
|
16118
|
+
case 6:
|
|
16119
|
+
_d.sent();
|
|
16120
|
+
_d.label = 7;
|
|
16121
|
+
case 7: return [2 /*return*/];
|
|
15999
16122
|
}
|
|
16000
16123
|
});
|
|
16001
16124
|
});
|
|
@@ -16948,7 +17071,7 @@
|
|
|
16948
17071
|
CrudFormComponent.decorators = [
|
|
16949
17072
|
{ type: i0.Component, args: [{
|
|
16950
17073
|
selector: 'crud-form',
|
|
16951
|
-
template: "<div [class]=\"_styleClass\" style=\"padding: 0.5rem 0.5rem 0\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #labelValueViewMode let-data=\"data\" let-control=\"control\" let-path=\"path\" let-parentPath=\"parentPath\"\r\n let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} type-{{control.dataType}} view-mode\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel && control.label\">\r\n <label [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}<span *ngIf=\"control.required\"\r\n class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container *ngIf=\"data[control.field] === null || data[control.field] === undefined\">\r\n <span class=\"no-value\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(data[control.field] === null || data[control.field] === undefined)\">\r\n <ng-container [ngSwitch]=\"control.dataType\">\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: subControl, data: data[control.field], showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\"\r\n [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\"\r\n [attr.label-index]=\"control.indexLabel\" [pTooltip]=\"control.title\" tooltipPosition=\"top\"\r\n tooltipStyleClass=\"wrap\" [escape]=\"false\" [for]=\"control.for\">{{control.text |\r\n translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'text'\">\r\n {{data[control.field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'money'\">\r\n {{data[control.field] | number}} VN\u0110\r\n </span>\r\n <span *ngSwitchCase=\"'date'\">\r\n {{data[control.field] | date:'dd/MM/yyyy'}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\">\r\n {{_crudService.renderDateTime(data[control.field], control.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\">\r\n {{data[control.field] | userFormat | async}}\r\n </span>\r\n <span *ngSwitchCase=\"'hasDataSource'\">\r\n <span *ngIf=\"!control.freeText\">\r\n {{getItemInArrayByValue(data._source[control.field] || control.dataSource,\r\n data[control.field], control)}}\r\n </span>\r\n <span *ngIf=\"control.freeText\">\r\n {{getItemInArrayByTextValue(data._source[control.field] || control.dataSource,\r\n data[control.field])}}\r\n </span>\r\n </span>\r\n <span *ngSwitchCase=\"'colorPicker'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.field]}\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.sourceField]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.sourceField]\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'colorControl'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\">\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <i class=\"{{data[control.field] | booleanFormat}}\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div [innerHTML]=\"data[control.field]\" *ngIf=\"data[control.field]==null?'':data[control.field]\">\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"'mask'\">\r\n <tn-mask [viewMode]=\"true\" [prefix]=\"control.prefix\" [suffix]=\"control.suffix\"\r\n [disabled]=\"checkDisabled(data, control)\" [decimalPlaces]=\"control.decimalPlaces\"\r\n [maskType]=\"control.maskType\" [(ngModel)]=\"data[control.field]\" [min]=\"control.min\"\r\n [max]=\"control.max\">\r\n </tn-mask>\r\n </span>\r\n <span *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-picker>\r\n </span>\r\n <span *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\">\r\n </tn-number-picker-range>\r\n </span>\r\n <span *ngSwitchCase=\"'string'\">{{data[control.field]}}</span>\r\n <span *ngSwitchCase=\"'button'\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\"\r\n [responsive]=\"true\" class=\"new-table scr-table table-control\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\"\r\n tooltipPosition=\"top\" [style.width]=\"subControl.width\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr>\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n class=\"control-inside\" [style]=\"subControl.style\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.viewModedataType)\"\r\n [ngTemplateOutletContext]=\"{data: data, control: control, isViewMode: true}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText type=\"tel\" [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n type=\"tel\" pInputText [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\"\r\n [ngTemplateOutletContext]=\"{crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
|
|
17074
|
+
template: "<div [class]=\"_styleClass\" style=\"padding: 0.5rem 0.5rem 0\">\r\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\r\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\r\n (keydown.shift.tab)=\"preventBlur($event)\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\">\r\n <ng-container *ngFor=\"let control of setting.schema\">\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"isViewMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<ng-template #labelValueViewMode let-data=\"data\" let-control=\"control\" let-path=\"path\" let-parentPath=\"parentPath\"\r\n let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} type-{{control.dataType}} view-mode\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel && control.label\">\r\n <label [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}<span *ngIf=\"control.required\"\r\n class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container *ngIf=\"data[control.field] === null || data[control.field] === undefined\">\r\n <span class=\"no-value\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(data[control.field] === null || data[control.field] === undefined)\">\r\n <ng-container [ngSwitch]=\"control.dataType\">\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: {control: subControl, data: data[control.field], showLabel: control.showLabel, mdWidth: control.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [readonly]=\"true\"\r\n [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\"\r\n [attr.label-index]=\"control.indexLabel\" [pTooltip]=\"control.title\" tooltipPosition=\"top\"\r\n tooltipStyleClass=\"wrap\" [escape]=\"false\" [for]=\"control.for\">{{control.text |\r\n translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'text'\">\r\n {{data[control.field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'money'\">\r\n {{data[control.field] | number}} VN\u0110\r\n </span>\r\n <span *ngSwitchCase=\"'date'\">\r\n {{data[control.field] | date:'dd/MM/yyyy'}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\">\r\n {{_crudService.renderDateTime(data[control.field], control.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\">\r\n {{data[control.field] | userFormat | async}}\r\n </span>\r\n <span *ngSwitchCase=\"'hasDataSource'\">\r\n <span *ngIf=\"!control.freeText\">\r\n {{getItemInArrayByValue(data._source[control.field] || control.dataSource,\r\n data[control.field], control)}}\r\n </span>\r\n <span *ngIf=\"control.freeText\">\r\n {{getItemInArrayByTextValue(data._source[control.field] || control.dataSource,\r\n data[control.field])}}\r\n </span>\r\n </span>\r\n <span *ngSwitchCase=\"'colorPicker'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.field]}\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.sourceField]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.sourceField]\"></span>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'colorControl'\" class=\"show-color-control\"\r\n [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\">\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <i class=\"{{data[control.field] | booleanFormat}}\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div [innerHTML]=\"data[control.field]\" *ngIf=\"data[control.field]==null?'':data[control.field]\">\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"'mask'\">\r\n <tn-mask [viewMode]=\"true\" [prefix]=\"control.prefix\" [suffix]=\"control.suffix\"\r\n [disabled]=\"checkDisabled(data, control)\" [decimalPlaces]=\"control.decimalPlaces\"\r\n [maskType]=\"control.maskType\" [thousandSeperator]=\"control.thousandSeperator\" [(ngModel)]=\"data[control.field]\" [min]=\"control.min\"\r\n [max]=\"control.max\">\r\n </tn-mask>\r\n </span>\r\n <span *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\" [viewMode]=\"true\"\r\n [(data)]=\"data[control.field]\">\r\n </address-picker>\r\n </span>\r\n <span *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\">\r\n </tn-number-picker-range>\r\n </span>\r\n <span *ngSwitchCase=\"'string'\">{{data[control.field]}}</span>\r\n <span *ngSwitchCase=\"'button'\">\r\n </span>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\"\r\n [responsive]=\"true\" class=\"new-table scr-table table-control\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\"\r\n tooltipPosition=\"top\" [style.width]=\"subControl.width\"\r\n style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr>\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n class=\"control-inside\" [style]=\"subControl.style\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"labelValueViewMode; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.viewModedataType)\"\r\n [ngTemplateOutletContext]=\"{data: data, control: control, isViewMode: true}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\r\n let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\r\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\r\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} {{control.class}} crud-form-control type-{{control.dataType}}\"\r\n [class.error]=\"data._errors[control.field].length > 0\"\r\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\r\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\r\n <div class=\"label\" *ngIf=\"showLabel\">\r\n <label *ngIf=\"control.label\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">{{control.label}}\r\n <span *ngIf=\"control.required\" class=\"star-required\">*</span></label>\r\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\r\n </div>\r\n <ng-container [ngSwitch]=\"control.controlType\">\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelControl\"\r\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'title'\">\r\n <label *ngIf=\"!control.ishtml\" [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | translate\"></label>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\r\n <input (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\r\n </div>\r\n <input *ngIf=\"!control.suffFix\" (focus)=\"onFocusTextControl($event)\" [placeholder]=\"control.placeholder\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText [type]=\"control.dataFormat\" [(ngModel)]=\"data[control.field]\" [max]=\"control.max\"\r\n [min]=\"control.min\" [maxlength]=\"control.maxLength\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (key.enter)=\"handleFieldValueChange(control, $event, 'enter', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'template'\">\r\n <ng-container [ngTemplateOutlet]=\"control.template\"\r\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\r\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\r\n [maskType]=\"control.maskType\" [min]=\"control.min\" [max]=\"control.max\" [thousandSeperator]=\"control.thousandSeperator\"\r\n [(ngModel)]=\"data[control.field]\" (onFocus)=\"onFocusTextControl($event)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numberrange'\">\r\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\r\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\"\r\n [(ngModel)]=\"data[control.field]\" [min]=\"control.min\" [max]=\"control.max\"\r\n (search)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (blur)=\"handleFieldValueChange(control, $event, 'blur', data, parentPath)\">\r\n </tn-number-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'money'\">\r\n <input currencyMask\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n pInputText type=\"tel\" [(ngModel)]=\"data[control.field]\"\r\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (focus)=\"onFocusTextControl($event)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\r\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n type=\"tel\" pInputText [(ngModel)]=\"data[control.field]\" (focus)=\"onFocusTextControl($event)\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea (focus)=\"onFocusTextControl($event)\" [rows]=\"control.rows ? control.rows : 5\"\r\n [attr.disabled]=\"data._status[control.field].disabled === true || (data._status[control.field].disabled === undefined && control.disabled) ? true : null\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'editor'\">\r\n <tn-tinymce [(ngModel)]=\"data[control.field]\"\r\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [height]=\"control.height ? control.height : 250\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <datetime-picker [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </datetime-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <app-autocomplete-datasource [control]=\"control\" [(ngModel)]=\"data[control.field]\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\"\r\n (onValueChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </app-autocomplete-datasource>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetimerange'\">\r\n <tn-datetime-picker-range [(ngModel)]=\"data[control.field]\" [disabled]=\"control.disabled\"\r\n [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-datetime-picker-range>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleChangeDropdown(control, $event, 'change', data, parentPath)\"\r\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, 'hide', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <file-manager [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [readonly]=\"control.disabled\"\r\n [rootFolderName]=\"control.rootFolderName || control.label\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </file-manager>\r\n </ng-container>\r\n <span *ngSwitchCase=\"'fileUpload'\">\r\n <file-upload [(ngModel)]=\"data[control.field]\" [sharedFolderType]=\"control.sharedFolderType\"\r\n [maxFileSize]=\"control.maxFileSize\"\r\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n [readonly]=\"control.readonly\" [accept]=\"control.accept\">\r\n </file-upload>\r\n </span>\r\n <span *ngSwitchCase=\"'serviceFileUpload'\">\r\n <service-file-upload [(ngModel)]=\"data[control.field]\" [parentContext]=\"context\"\r\n [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\r\n [entityKey]=\"data[control.entityKeyField]\" [control]=\"control\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </service-file-upload>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'user-picker'\">\r\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\" [multiple]=\"control.multiple\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </user-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"data[control.field]\" [disabled]=\"checkDisabled(data, control)\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-inputSwitch>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <div [class]=\"control.class\" role=\"checkbox-alone\">\r\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n [label]=\"!control.hiddenLabel ? control.checkboxLabel ? control.checkboxLabel : control.label : null\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" binary=\"true\">\r\n </p-checkbox>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\r\n [label]=\"control.label | translate\" [ngStyle]=\"control.btStyle\"\r\n (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'container'\">\r\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\r\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\r\n <ng-container *ngFor=\"let subControl of control.controls\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: {control: subControl, data: data[control.field], parentPath: path, rowIndex: rowIndex, path: path + '.' + subControl.field, showLabel: subControl.showLabel, mdWidth: subControl.mdWidth}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\r\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </check-box-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\r\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\r\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\r\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\r\n </radio-button-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorPicker'\">\r\n <tn-color-picker [(ngModel)]=\"data[control.field]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-color-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'spanControl'\">\r\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\r\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'colorControl'\">\r\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'address'\">\r\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\r\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\r\n (onSelect)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\r\n </address-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\r\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [parentPath]=\"parentPath\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </autocomplete-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'entity-picker'\">\r\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </entity-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\r\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\r\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\r\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\r\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\r\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </cocautochuc-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\r\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"\r\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\r\n </cocautochuc-picker-list>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'vanban'\">\r\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </vanban-picker>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'congviec'\">\r\n <div>\r\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </congviec-picker>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div [class]=\"control.class\">\r\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\r\n <p-table [value]=\"data[control.field]\" [columns]=\"control.headerTemplate\" [responsive]=\"true\"\r\n class=\"new-table scr-table table-control\" [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\r\n pTemplate=\"header\" let-rowData let-columns>\r\n <tr>\r\n <th *ngIf=\"control.showNumber\" style=\"text-align: center; width: 2.5rem\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\r\n [style.width]=\"subControl.width\" style=\"text-align: center;\">\r\n {{subControl.label}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"control.enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\"\r\n [style.width]=\"getTableFunctionColumnWidth(control)\"\r\n class=\"table-function column-function\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\r\n <tr [pReorderableRow]=\"ri\">\r\n <td style=\"text-align: center; padding-left: 0; padding-right: 0;\"\r\n *ngIf=\"control.showNumber\" class=\"stt\">\r\n <span style=\"padding: 12px 5px; display: inline-block;\">{{ri+1}}</span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\r\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\r\n [class.control-inside]=\"true\" [class]=\"subControl.class\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\r\n pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td style=\"text-align:center\" *ngIf=\"control.showFunction\" class=\"column-function\">\r\n <div class=\"p-toolbar-group-center button-group\">\r\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-save\"\r\n [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text\" icon=\"pi pi-pencil\"\r\n [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton class=\"p-button-text p-button-danger\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n style=\"width: 2.143em;\" (click)=\"deleteRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\r\n icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData, control)\"></button>\r\n <!-- <button *ngFor=\"let bt of control.rowButtons\" type=\"button\" pButton\r\n [class]=\"bt.class\" [icon]=\"bt.icon\" [pTooltip]=\"bt.label | translate\"\r\n tooltipPosition=\"top\" style=\"width: 2.143em;\"\r\n (click)=\"messageRow(ri, control, path)\"></button> -->\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\r\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\r\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\r\n <span style=\"font-weight: normal;\">\r\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\r\n </p-checkbox>\r\n </span>\r\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\r\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\r\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\r\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\r\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\r\n (click)=\"messageRow( -1, control, path)\"></button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(control.field)\"\r\n [ngTemplateOutletContext]=\"{crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #validation let-control=\"control\" let-data=\"data\">\r\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\r\n <div class=\"error-container\">\r\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\r\n <div class=\"error-item\" *ngIf=\"error\">\r\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #errorMessage let-content=\"content\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-ban\"></i>\r\n <span> {{content}}</span>\r\n </div>\r\n</ng-template>\r\n<ng-template #labelControl let-control=\"control\">\r\n <ng-container>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.ishtml\" [attr.label-index]=\"control.indexLabel\"\r\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\r\n [for]=\"control.for\">{{control.text | translate}}</label>\r\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.ishtml\" [innerHTML]=\"control.text | safeHtml\"\r\n [attr.label-index]=\"control.indexLabel\"></label>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<tn-dialog *ngIf=\"tableFormShow\" #dialog [styleClass]=\"'address-form'\" [header]=\"tableFormTitle | translate\"\r\n [popupSize]=\"tableFormPopupSize\" (onHide)=\"tableFormShow = false\">\r\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormData\"\r\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormShow = false\">\r\n </table-detail-form>\r\n</tn-dialog>\r\n",
|
|
16952
17075
|
providers: [ComponentContextService],
|
|
16953
17076
|
styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;padding-left:.2em;padding-top:.3em;position:absolute}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{align-items:center;background:#f8f9fa;border:1px solid #e9ecef;color:#495057;display:flex;font-weight:600;padding:.5em}::ng-deep .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control){padding:0}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-size:.85em;font-weight:700}.view-mode>span:not(:empty){display:inline-block;padding:5px 0;width:100%}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{border-bottom:1px solid #cfcfcf;color:#025ba7;font-size:1.2rem;font-weight:700;padding:10px 0 10px 5px;text-transform:uppercase}.crud-form-control.type-title>.label{margin-bottom:0}.control-description{color:#6c757d;font-size:.8rem;margin-bottom:5px;margin-left:10px}::ng-deep .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep .crud-form-control>div.label{font-size:.9em;height:1.15em;margin-bottom:5px}::ng-deep .crud-form-control>div.label+*{width:100%}::ng-deep .crud-form-control>.error-container .error-item{animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{animation:fadeIn .1s;color:red;display:flex;font-size:.9em;position:relative}::ng-deep .crud-form-control>.error-container .error-item .error-content i{display:flex;font-size:.9em;padding-top:1px}::ng-deep .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep .crud-form-control.no-label>div.label{display:none}::ng-deep .crud-form-control.error .p-dropdown,::ng-deep .crud-form-control.error .p-inputtext,::ng-deep .crud-form-control.error .p-multiselect,::ng-deep .crud-form-control.error .tn-dropdown,::ng-deep .crud-form-control.error input,::ng-deep .crud-form-control.error select,::ng-deep .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-delay:0s,0s;transition-duration:.3s,.3s;transition-property:box-shadow,border-color;transition-timing-function:ease,ease}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}.no-value{font-size:.8em}:host ::ng-deep .table-schema-paging{display:block;margin-bottom:40px}"]
|
|
16954
17077
|
},] }
|
|
@@ -18131,7 +18254,7 @@
|
|
|
18131
18254
|
this.onSaved.emit();
|
|
18132
18255
|
return [3 /*break*/, 3];
|
|
18133
18256
|
case 2:
|
|
18134
|
-
this.handleInsertError();
|
|
18257
|
+
this.handleInsertError(response);
|
|
18135
18258
|
_a.label = 3;
|
|
18136
18259
|
case 3: return [2 /*return*/];
|
|
18137
18260
|
}
|
|
@@ -18151,7 +18274,7 @@
|
|
|
18151
18274
|
DataFormBase.prototype.getPromiseActionInsert = function () {
|
|
18152
18275
|
return this.setting.baseService.post(this.model.data, this.insertPlusUrl);
|
|
18153
18276
|
};
|
|
18154
|
-
DataFormBase.prototype.handleInsertError = function () {
|
|
18277
|
+
DataFormBase.prototype.handleInsertError = function (response) {
|
|
18155
18278
|
};
|
|
18156
18279
|
DataFormBase.prototype.onUpdate = function () {
|
|
18157
18280
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -18172,7 +18295,7 @@
|
|
|
18172
18295
|
this.onSaved.emit();
|
|
18173
18296
|
return [3 /*break*/, 3];
|
|
18174
18297
|
case 2:
|
|
18175
|
-
this.handleUpdateError();
|
|
18298
|
+
this.handleUpdateError(response);
|
|
18176
18299
|
_a.label = 3;
|
|
18177
18300
|
case 3: return [2 /*return*/];
|
|
18178
18301
|
}
|
|
@@ -18189,7 +18312,7 @@
|
|
|
18189
18312
|
});
|
|
18190
18313
|
});
|
|
18191
18314
|
};
|
|
18192
|
-
DataFormBase.prototype.handleUpdateError = function () {
|
|
18315
|
+
DataFormBase.prototype.handleUpdateError = function (response) {
|
|
18193
18316
|
};
|
|
18194
18317
|
DataFormBase.prototype.getPromiseActionUpdate = function () {
|
|
18195
18318
|
return this.setting.baseService.put(this.model.data.id.toString(), this.model.data, this.updatePlusUrl);
|
|
@@ -18821,27 +18944,49 @@
|
|
|
18821
18944
|
AutoCompletePickerComponent.prototype.buildFilterKeyword = function () {
|
|
18822
18945
|
var _this = this;
|
|
18823
18946
|
if (this.fieldSearchText.length == 1) {
|
|
18824
|
-
|
|
18947
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
18948
|
+
this.getFilterOnSearch = function (value) { return _this.newFilterV4(_this.control.displayField, exports.Operator.contain, value.toString()); };
|
|
18949
|
+
}
|
|
18950
|
+
else {
|
|
18951
|
+
this.getFilterOnSearch = function (value) { return _this.newFilter(_this.control.displayField, exports.Operator.contain, value); };
|
|
18952
|
+
}
|
|
18825
18953
|
}
|
|
18826
18954
|
else {
|
|
18827
18955
|
this.getFilterOnSearch = function (value) {
|
|
18828
|
-
var e_1, _a;
|
|
18956
|
+
var e_1, _a, e_2, _b;
|
|
18829
18957
|
var result = new Filter({
|
|
18830
18958
|
logic: 'or',
|
|
18831
18959
|
filters: []
|
|
18832
18960
|
});
|
|
18833
|
-
|
|
18834
|
-
|
|
18835
|
-
var
|
|
18836
|
-
|
|
18961
|
+
if (_this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
18962
|
+
try {
|
|
18963
|
+
for (var _c = __values(_this.fieldSearchText), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
18964
|
+
var fieldSearch = _d.value;
|
|
18965
|
+
result.filters.push(_this.newFilterV4(fieldSearch, exports.Operator.contain, value.toString()));
|
|
18966
|
+
}
|
|
18967
|
+
}
|
|
18968
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
18969
|
+
finally {
|
|
18970
|
+
try {
|
|
18971
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
18972
|
+
}
|
|
18973
|
+
finally { if (e_1) throw e_1.error; }
|
|
18837
18974
|
}
|
|
18838
18975
|
}
|
|
18839
|
-
|
|
18840
|
-
finally {
|
|
18976
|
+
else {
|
|
18841
18977
|
try {
|
|
18842
|
-
|
|
18978
|
+
for (var _e = __values(_this.fieldSearchText), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
18979
|
+
var fieldSearch = _f.value;
|
|
18980
|
+
result.filters.push(_this.newFilter(fieldSearch, exports.Operator.contain, value));
|
|
18981
|
+
}
|
|
18982
|
+
}
|
|
18983
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
18984
|
+
finally {
|
|
18985
|
+
try {
|
|
18986
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
18987
|
+
}
|
|
18988
|
+
finally { if (e_2) throw e_2.error; }
|
|
18843
18989
|
}
|
|
18844
|
-
finally { if (e_1) throw e_1.error; }
|
|
18845
18990
|
}
|
|
18846
18991
|
return result;
|
|
18847
18992
|
};
|
|
@@ -18917,34 +19062,50 @@
|
|
|
18917
19062
|
return __generator(this, function (_a) {
|
|
18918
19063
|
switch (_a.label) {
|
|
18919
19064
|
case 0:
|
|
19065
|
+
if (!this.control.modifyInitSearchData) return [3 /*break*/, 2];
|
|
19066
|
+
return [4 /*yield*/, this.control.modifyInitSearchData(this)];
|
|
19067
|
+
case 1:
|
|
19068
|
+
_a.sent();
|
|
19069
|
+
_a.label = 2;
|
|
19070
|
+
case 2:
|
|
18920
19071
|
filters = [];
|
|
18921
19072
|
if (this.control.multiple) {
|
|
18922
19073
|
if (this.value && this.value.length > 0) {
|
|
18923
|
-
|
|
19074
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
19075
|
+
filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notIn, this.value.join(',')));
|
|
19076
|
+
}
|
|
19077
|
+
else {
|
|
19078
|
+
filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this.value));
|
|
19079
|
+
}
|
|
18924
19080
|
}
|
|
18925
19081
|
}
|
|
18926
19082
|
else {
|
|
18927
19083
|
if (this.value) {
|
|
18928
|
-
|
|
19084
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
19085
|
+
filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notEqual, this.value.toString()));
|
|
19086
|
+
}
|
|
19087
|
+
else {
|
|
19088
|
+
filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this.value));
|
|
19089
|
+
}
|
|
18929
19090
|
}
|
|
18930
19091
|
}
|
|
18931
19092
|
return [4 /*yield*/, appendDefaultFilter(filters, this.control.defaultFilters)];
|
|
18932
|
-
case
|
|
19093
|
+
case 3:
|
|
18933
19094
|
_a.sent();
|
|
18934
19095
|
if (this.keyword && this.keyword.length > 0) {
|
|
18935
19096
|
filters.push(this.getFilterOnSearch(this.keyword));
|
|
18936
19097
|
}
|
|
18937
|
-
if (!this.control.modifyFilter) return [3 /*break*/,
|
|
19098
|
+
if (!this.control.modifyFilter) return [3 /*break*/, 5];
|
|
18938
19099
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
18939
|
-
case
|
|
19100
|
+
case 4:
|
|
18940
19101
|
allow = _a.sent();
|
|
18941
19102
|
if (allow === false) {
|
|
18942
19103
|
this.results = [];
|
|
18943
19104
|
return [2 /*return*/];
|
|
18944
19105
|
}
|
|
18945
|
-
_a.label =
|
|
18946
|
-
case
|
|
18947
|
-
case
|
|
19106
|
+
_a.label = 5;
|
|
19107
|
+
case 5: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
|
|
19108
|
+
case 6:
|
|
18948
19109
|
dataSource = _a.sent();
|
|
18949
19110
|
this.fireEventAfterGetDataDropDown(dataSource);
|
|
18950
19111
|
this.reStructureDataSource(dataSource);
|
|
@@ -19125,9 +19286,17 @@
|
|
|
19125
19286
|
if (!this.control.multiple) return [3 /*break*/, 5];
|
|
19126
19287
|
dataSource = [];
|
|
19127
19288
|
if (!(this.value && this.value.length > 0)) return [3 /*break*/, 4];
|
|
19128
|
-
filters = [
|
|
19129
|
-
|
|
19130
|
-
|
|
19289
|
+
filters = [];
|
|
19290
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
19291
|
+
filters = [
|
|
19292
|
+
this.newFilterV4(this.control.valueField, exports.Operator.in, this.value.join(','))
|
|
19293
|
+
];
|
|
19294
|
+
}
|
|
19295
|
+
else {
|
|
19296
|
+
filters = [
|
|
19297
|
+
this.newFilter(this.control.valueField, exports.Operator.in, this.value)
|
|
19298
|
+
];
|
|
19299
|
+
}
|
|
19131
19300
|
if (!this.control.modifyFilter) return [3 /*break*/, 2];
|
|
19132
19301
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19133
19302
|
case 1:
|
|
@@ -19151,9 +19320,17 @@
|
|
|
19151
19320
|
case 5:
|
|
19152
19321
|
dataSource = [];
|
|
19153
19322
|
if (!this.value) return [3 /*break*/, 9];
|
|
19154
|
-
filters = [
|
|
19155
|
-
|
|
19156
|
-
|
|
19323
|
+
filters = [];
|
|
19324
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
19325
|
+
filters = [
|
|
19326
|
+
this.newFilterV4(this.control.valueField, exports.Operator.equal, this.value.toString())
|
|
19327
|
+
];
|
|
19328
|
+
}
|
|
19329
|
+
else {
|
|
19330
|
+
filters = [
|
|
19331
|
+
this.newFilter(this.control.valueField, exports.Operator.equal, this.value)
|
|
19332
|
+
];
|
|
19333
|
+
}
|
|
19157
19334
|
if (!this.control.modifyFilter) return [3 /*break*/, 7];
|
|
19158
19335
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19159
19336
|
case 6:
|
|
@@ -19198,7 +19375,7 @@
|
|
|
19198
19375
|
}
|
|
19199
19376
|
};
|
|
19200
19377
|
AutoCompletePickerComponent.prototype.reStructureDataSource = function (sources) {
|
|
19201
|
-
var
|
|
19378
|
+
var e_3, _a;
|
|
19202
19379
|
if (sources != null && sources.length > 0) {
|
|
19203
19380
|
var arr = [];
|
|
19204
19381
|
try {
|
|
@@ -19208,12 +19385,12 @@
|
|
|
19208
19385
|
arr.push(item);
|
|
19209
19386
|
}
|
|
19210
19387
|
}
|
|
19211
|
-
catch (
|
|
19388
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
19212
19389
|
finally {
|
|
19213
19390
|
try {
|
|
19214
19391
|
if (sources_1_1 && !sources_1_1.done && (_a = sources_1.return)) _a.call(sources_1);
|
|
19215
19392
|
}
|
|
19216
|
-
finally { if (
|
|
19393
|
+
finally { if (e_3) throw e_3.error; }
|
|
19217
19394
|
}
|
|
19218
19395
|
this.dataSource = arr;
|
|
19219
19396
|
}
|
|
@@ -19243,7 +19420,12 @@
|
|
|
19243
19420
|
if (!this.control.multiple) return [3 /*break*/, 6];
|
|
19244
19421
|
if (!(obj != null && obj.length > 0)) return [3 /*break*/, 4];
|
|
19245
19422
|
filters = [];
|
|
19246
|
-
|
|
19423
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
19424
|
+
filters.push(this.newFilterV4(this.control.valueField, exports.Operator.in, obj.join(',')));
|
|
19425
|
+
}
|
|
19426
|
+
else {
|
|
19427
|
+
filters.push(this.newFilter(this.control.valueField, exports.Operator.in, obj));
|
|
19428
|
+
}
|
|
19247
19429
|
if (!this.control.modifyFilter) return [3 /*break*/, 2];
|
|
19248
19430
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19249
19431
|
case 1:
|
|
@@ -19268,9 +19450,17 @@
|
|
|
19268
19450
|
case 5: return [3 /*break*/, 10];
|
|
19269
19451
|
case 6:
|
|
19270
19452
|
if (!(obj != null)) return [3 /*break*/, 9];
|
|
19271
|
-
filters = [
|
|
19272
|
-
|
|
19273
|
-
|
|
19453
|
+
filters = [];
|
|
19454
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
19455
|
+
filters = [
|
|
19456
|
+
this.newFilterV4(this.control.valueField, exports.Operator.equal, obj.toString())
|
|
19457
|
+
];
|
|
19458
|
+
}
|
|
19459
|
+
else {
|
|
19460
|
+
filters = [
|
|
19461
|
+
this.newFilter(this.control.valueField, exports.Operator.equal, obj)
|
|
19462
|
+
];
|
|
19463
|
+
}
|
|
19274
19464
|
if (!this.control.modifyFilter) return [3 /*break*/, 8];
|
|
19275
19465
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19276
19466
|
case 7:
|
|
@@ -19346,6 +19536,7 @@
|
|
|
19346
19536
|
AutoCompletePickerComponent.propDecorators = {
|
|
19347
19537
|
control: [{ type: i0.Input }],
|
|
19348
19538
|
disabled: [{ type: i0.Input }],
|
|
19539
|
+
parentPath: [{ type: i0.Input }],
|
|
19349
19540
|
popupSize: [{ type: i0.Input }],
|
|
19350
19541
|
onSelect: [{ type: i0.Output }],
|
|
19351
19542
|
onUnSelect: [{ type: i0.Output }],
|
|
@@ -19464,20 +19655,6 @@
|
|
|
19464
19655
|
FileObjectService.prototype.getScanFileUploadEndpoint = function (correlationId) {
|
|
19465
19656
|
return this.serviceCode + "/CreateScannedFile/" + correlationId;
|
|
19466
19657
|
};
|
|
19467
|
-
FileObjectService.prototype.isTypeFileKySo = function (fileName) {
|
|
19468
|
-
var fileExtension = this.getFileExtension(fileName);
|
|
19469
|
-
if (fileExtension) {
|
|
19470
|
-
fileExtension = fileExtension.toLowerCase();
|
|
19471
|
-
if (fileExtension.indexOf('.') > -1) {
|
|
19472
|
-
var arr = fileExtension.split('.');
|
|
19473
|
-
fileExtension = arr[arr.length - 1];
|
|
19474
|
-
}
|
|
19475
|
-
if ((/(pdf|doc|docx|xls|xlsm|xlsx)$/i).test(fileExtension)) {
|
|
19476
|
-
return true;
|
|
19477
|
-
}
|
|
19478
|
-
}
|
|
19479
|
-
return false;
|
|
19480
|
-
};
|
|
19481
19658
|
return FileObjectService;
|
|
19482
19659
|
}(BaseService));
|
|
19483
19660
|
FileObjectService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FileObjectService_Factory() { return new FileObjectService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: FileObjectService, providedIn: "root" });
|
|
@@ -20565,13 +20742,16 @@
|
|
|
20565
20742
|
});
|
|
20566
20743
|
});
|
|
20567
20744
|
};
|
|
20568
|
-
MenuService.prototype.renderMenuByAppCode = function (appCode) {
|
|
20745
|
+
MenuService.prototype.renderMenuByAppCode = function (scopeName, appCode) {
|
|
20569
20746
|
return __awaiter(this, void 0, void 0, function () {
|
|
20570
20747
|
var menuUrl;
|
|
20571
20748
|
var _this = this;
|
|
20572
20749
|
return __generator(this, function (_a) {
|
|
20573
20750
|
this._menuItems = [];
|
|
20574
20751
|
menuUrl = "assets/menus/" + appCode.toLocaleLowerCase() + ".json";
|
|
20752
|
+
if (scopeName) {
|
|
20753
|
+
menuUrl = "assets/menus/" + scopeName.toLocaleLowerCase() + "/" + appCode.toLocaleLowerCase() + ".json";
|
|
20754
|
+
}
|
|
20575
20755
|
fetch(menuUrl).then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
|
|
20576
20756
|
var menu, _a, _b;
|
|
20577
20757
|
return __generator(this, function (_c) {
|
|
@@ -20725,7 +20905,7 @@
|
|
|
20725
20905
|
// Nếu là môi trường triển khai thì cộng thêm tiền tố phân hệ vào router link để có thể chuột phải mở tab mới
|
|
20726
20906
|
funcSetNewTabLink = function (link) { return "/" + appCodeLowerCase + link; };
|
|
20727
20907
|
}
|
|
20728
|
-
this._menuService.renderMenuByAppCode(appCode);
|
|
20908
|
+
this._menuService.renderMenuByAppCode(this.environment.scopeName, appCode);
|
|
20729
20909
|
this.model = this._menuService.getMenuItems();
|
|
20730
20910
|
this._router.events.pipe(operators.filter(function (event) { return event instanceof i3.NavigationEnd; }))
|
|
20731
20911
|
.subscribe(function (event) {
|
|
@@ -23286,7 +23466,7 @@
|
|
|
23286
23466
|
};
|
|
23287
23467
|
|
|
23288
23468
|
var CommonAppComponentComponent = /** @class */ (function () {
|
|
23289
|
-
function CommonAppComponentComponent(_globalService, _commonService, renderer, translate, _oauthService, _authenService, _userService, _router, _title, _signalRService, _storageUpdatedService, _customRouteService, _applicationContext, _componentContextService, _activatedRoute, _deviceDetectorService, _cd, _tnClientService, _coreConfigService, _notifierService, _entityMetadataService, _moduleConfigService, _translateService, _messageService, _confirmService, _menuService, _primengConfig, _storageService) {
|
|
23469
|
+
function CommonAppComponentComponent(_globalService, _commonService, renderer, translate, _oauthService, _authenService, _userService, _router, _title, _signalRService, _storageUpdatedService, _customRouteService, _applicationContext, _componentContextService, _activatedRoute, _deviceDetectorService, _cd, _tnClientService, _coreConfigService, _notifierService, _entityMetadataService, _moduleConfigService, _translateService, _messageService, _confirmService, _menuService, _primengConfig, _storageService, _permissionService) {
|
|
23290
23470
|
var _this = this;
|
|
23291
23471
|
this._globalService = _globalService;
|
|
23292
23472
|
this._commonService = _commonService;
|
|
@@ -23316,6 +23496,7 @@
|
|
|
23316
23496
|
this._menuService = _menuService;
|
|
23317
23497
|
this._primengConfig = _primengConfig;
|
|
23318
23498
|
this._storageService = _storageService;
|
|
23499
|
+
this._permissionService = _permissionService;
|
|
23319
23500
|
this.showQuickNote = true;
|
|
23320
23501
|
this.allowAnonymous = false;
|
|
23321
23502
|
this._unsubscribeAll = new rxjs.Subject();
|
|
@@ -23469,6 +23650,25 @@
|
|
|
23469
23650
|
root.data.allowAnonymous = this.allowAnonymous;
|
|
23470
23651
|
// get current User
|
|
23471
23652
|
this._userService.populateCurrentUser();
|
|
23653
|
+
this._componentContextService.subscribe(ComCtxConstants.ROOT.NEED_CLEAR_PERMISSION_CACHE, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
23654
|
+
var clear;
|
|
23655
|
+
return __generator(this, function (_a) {
|
|
23656
|
+
switch (_a.label) {
|
|
23657
|
+
case 0:
|
|
23658
|
+
if (!(this.environment.authenticationSettings.coreVersion == 'v4')) return [3 /*break*/, 2];
|
|
23659
|
+
return [4 /*yield*/, this.clearPermissionCacheByModule()];
|
|
23660
|
+
case 1:
|
|
23661
|
+
clear = _a.sent();
|
|
23662
|
+
if (!clear.success) {
|
|
23663
|
+
this._notifierService.showWarning('Có vấn đề trong lúc clear cache quyền');
|
|
23664
|
+
}
|
|
23665
|
+
_a.label = 2;
|
|
23666
|
+
case 2:
|
|
23667
|
+
this._applicationContext.getRootContext().fireReplayEvent(ComCtxConstants.ROOT.USER_LOADED);
|
|
23668
|
+
return [2 /*return*/];
|
|
23669
|
+
}
|
|
23670
|
+
});
|
|
23671
|
+
}); });
|
|
23472
23672
|
this._componentContextService.subscribe(ComCtxConstants.ROOT.KEY_DOWN_ARROWLEFT, function (e) {
|
|
23473
23673
|
if (document.activeElement === _this.cancelButton.nativeElement) {
|
|
23474
23674
|
_this.okButton.nativeElement.focus();
|
|
@@ -23984,6 +24184,17 @@
|
|
|
23984
24184
|
}
|
|
23985
24185
|
}
|
|
23986
24186
|
};
|
|
24187
|
+
CommonAppComponentComponent.prototype.clearPermissionCacheByModule = function () {
|
|
24188
|
+
var appSwitcher = this._moduleConfigService.getConfig().environment.appMetadata.appSwitcher;
|
|
24189
|
+
if (!appSwitcher || !appSwitcher.length) {
|
|
24190
|
+
appSwitcher = [];
|
|
24191
|
+
}
|
|
24192
|
+
var lstModule = appSwitcher.map(function (x) { return x.code; });
|
|
24193
|
+
if (!lstModule) {
|
|
24194
|
+
lstModule = [];
|
|
24195
|
+
}
|
|
24196
|
+
return this._permissionService.clearPermissionCache(lstModule);
|
|
24197
|
+
};
|
|
23987
24198
|
return CommonAppComponentComponent;
|
|
23988
24199
|
}());
|
|
23989
24200
|
CommonAppComponentComponent.decorators = [
|
|
@@ -24022,7 +24233,8 @@
|
|
|
24022
24233
|
{ type: i1.ConfirmationService },
|
|
24023
24234
|
{ type: MenuService },
|
|
24024
24235
|
{ type: i1.PrimeNGConfig },
|
|
24025
|
-
{ type: StorageService }
|
|
24236
|
+
{ type: StorageService },
|
|
24237
|
+
{ type: PermissionService }
|
|
24026
24238
|
]; };
|
|
24027
24239
|
CommonAppComponentComponent.propDecorators = {
|
|
24028
24240
|
okButton: [{ type: i0.ViewChild, args: ['okButton',] }],
|
|
@@ -26179,6 +26391,8 @@
|
|
|
26179
26391
|
});
|
|
26180
26392
|
_this.sourceIcon = {};
|
|
26181
26393
|
_this.stopCalculatingFunctionColumnWidth = false;
|
|
26394
|
+
_this.FileUploadMode = exports.FileUploadMode;
|
|
26395
|
+
_this.eventType = exports.EventType;
|
|
26182
26396
|
_this._unSubscribeAll = new rxjs.Subject();
|
|
26183
26397
|
_this.handleSelectRow = function (evt, data) {
|
|
26184
26398
|
if (_this.setting.hasCustomHandleClickRow) {
|
|
@@ -26361,6 +26575,94 @@
|
|
|
26361
26575
|
_this.setting.pageSetting.page = 1;
|
|
26362
26576
|
_this.getData();
|
|
26363
26577
|
};
|
|
26578
|
+
_this.handleFieldValueChange = function (control, event, rowData, type) { return __awaiter(_this, void 0, void 0, function () {
|
|
26579
|
+
var eventData, _f, _a_1, _b_1, _c_1, _d_1, _e_1;
|
|
26580
|
+
return __generator(this, function (_g) {
|
|
26581
|
+
switch (_g.label) {
|
|
26582
|
+
case 0:
|
|
26583
|
+
eventData = {
|
|
26584
|
+
event: event,
|
|
26585
|
+
rowData: rowData,
|
|
26586
|
+
type: type
|
|
26587
|
+
};
|
|
26588
|
+
_f = type;
|
|
26589
|
+
switch (_f) {
|
|
26590
|
+
case exports.EventType.CHANGE: return [3 /*break*/, 1];
|
|
26591
|
+
case exports.EventType.INIT: return [3 /*break*/, 6];
|
|
26592
|
+
case exports.EventType.DELETED: return [3 /*break*/, 11];
|
|
26593
|
+
case exports.EventType.SELECT: return [3 /*break*/, 16];
|
|
26594
|
+
case exports.EventType.UPLOADED: return [3 /*break*/, 21];
|
|
26595
|
+
}
|
|
26596
|
+
return [3 /*break*/, 26];
|
|
26597
|
+
case 1:
|
|
26598
|
+
if (!control.onChanged) return [3 /*break*/, 5];
|
|
26599
|
+
_g.label = 2;
|
|
26600
|
+
case 2:
|
|
26601
|
+
_g.trys.push([2, 4, , 5]);
|
|
26602
|
+
return [4 /*yield*/, control.onChanged(eventData)];
|
|
26603
|
+
case 3:
|
|
26604
|
+
_g.sent();
|
|
26605
|
+
return [3 /*break*/, 5];
|
|
26606
|
+
case 4:
|
|
26607
|
+
_a_1 = _g.sent();
|
|
26608
|
+
return [3 /*break*/, 5];
|
|
26609
|
+
case 5: return [3 /*break*/, 26];
|
|
26610
|
+
case 6:
|
|
26611
|
+
if (!control.onInit) return [3 /*break*/, 10];
|
|
26612
|
+
_g.label = 7;
|
|
26613
|
+
case 7:
|
|
26614
|
+
_g.trys.push([7, 9, , 10]);
|
|
26615
|
+
return [4 /*yield*/, control.onInit(eventData)];
|
|
26616
|
+
case 8:
|
|
26617
|
+
_g.sent();
|
|
26618
|
+
return [3 /*break*/, 10];
|
|
26619
|
+
case 9:
|
|
26620
|
+
_b_1 = _g.sent();
|
|
26621
|
+
return [3 /*break*/, 10];
|
|
26622
|
+
case 10: return [3 /*break*/, 26];
|
|
26623
|
+
case 11:
|
|
26624
|
+
if (!control.onRemove) return [3 /*break*/, 15];
|
|
26625
|
+
_g.label = 12;
|
|
26626
|
+
case 12:
|
|
26627
|
+
_g.trys.push([12, 14, , 15]);
|
|
26628
|
+
return [4 /*yield*/, control.onRemove(eventData)];
|
|
26629
|
+
case 13:
|
|
26630
|
+
_g.sent();
|
|
26631
|
+
return [3 /*break*/, 15];
|
|
26632
|
+
case 14:
|
|
26633
|
+
_c_1 = _g.sent();
|
|
26634
|
+
return [3 /*break*/, 15];
|
|
26635
|
+
case 15: return [3 /*break*/, 26];
|
|
26636
|
+
case 16:
|
|
26637
|
+
if (!control.onSelected) return [3 /*break*/, 20];
|
|
26638
|
+
_g.label = 17;
|
|
26639
|
+
case 17:
|
|
26640
|
+
_g.trys.push([17, 19, , 20]);
|
|
26641
|
+
return [4 /*yield*/, control.onSelected(eventData)];
|
|
26642
|
+
case 18:
|
|
26643
|
+
_g.sent();
|
|
26644
|
+
return [3 /*break*/, 20];
|
|
26645
|
+
case 19:
|
|
26646
|
+
_d_1 = _g.sent();
|
|
26647
|
+
return [3 /*break*/, 20];
|
|
26648
|
+
case 20: return [3 /*break*/, 26];
|
|
26649
|
+
case 21:
|
|
26650
|
+
if (!control.onUploaded) return [3 /*break*/, 25];
|
|
26651
|
+
_g.label = 22;
|
|
26652
|
+
case 22:
|
|
26653
|
+
_g.trys.push([22, 24, , 25]);
|
|
26654
|
+
return [4 /*yield*/, control.onUploaded(eventData)];
|
|
26655
|
+
case 23:
|
|
26656
|
+
_g.sent();
|
|
26657
|
+
return [3 /*break*/, 25];
|
|
26658
|
+
case 24:
|
|
26659
|
+
_e_1 = _g.sent();
|
|
26660
|
+
return [3 /*break*/, 25];
|
|
26661
|
+
case 25: return [3 /*break*/, 26];
|
|
26662
|
+
case 26: return [2 /*return*/];
|
|
26663
|
+
}
|
|
26664
|
+
});
|
|
26665
|
+
}); };
|
|
26364
26666
|
_this._activatedRoute = _this._injector.get(i3.ActivatedRoute);
|
|
26365
26667
|
_this._router = _this._injector.get(i3.Router);
|
|
26366
26668
|
_this._customRouterService = _this._injector.get(CustomRouterService);
|
|
@@ -26668,7 +26970,7 @@
|
|
|
26668
26970
|
});
|
|
26669
26971
|
};
|
|
26670
26972
|
CrudListComponent.prototype.formatColumns = function (cols) {
|
|
26671
|
-
var e_1,
|
|
26973
|
+
var e_1, _f;
|
|
26672
26974
|
try {
|
|
26673
26975
|
for (var cols_1 = __values(cols), cols_1_1 = cols_1.next(); !cols_1_1.done; cols_1_1 = cols_1.next()) {
|
|
26674
26976
|
var col = cols_1_1.value;
|
|
@@ -26680,7 +26982,7 @@
|
|
|
26680
26982
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
26681
26983
|
finally {
|
|
26682
26984
|
try {
|
|
26683
|
-
if (cols_1_1 && !cols_1_1.done && (
|
|
26985
|
+
if (cols_1_1 && !cols_1_1.done && (_f = cols_1.return)) _f.call(cols_1);
|
|
26684
26986
|
}
|
|
26685
26987
|
finally { if (e_1) throw e_1.error; }
|
|
26686
26988
|
}
|
|
@@ -26879,7 +27181,7 @@
|
|
|
26879
27181
|
CrudListComponent.prototype.validatePermission = function (rowData) {
|
|
26880
27182
|
return __awaiter(this, void 0, void 0, function () {
|
|
26881
27183
|
var itemStatus, hasPermission, userData, userId, userIdUpper, userGroupIds, userOrgIds, managerTypes, userIdLastUpper_1, donViIdLastUpper_1;
|
|
26882
|
-
return __generator(this, function (
|
|
27184
|
+
return __generator(this, function (_f) {
|
|
26883
27185
|
this.currentItem = rowData;
|
|
26884
27186
|
itemStatus = this.setting.workflowSetting.statuses.find(function (p) { return p.trangThaiContainer.ma == rowData.currentStateCode; });
|
|
26885
27187
|
hasPermission = false;
|
|
@@ -26946,12 +27248,12 @@
|
|
|
26946
27248
|
};
|
|
26947
27249
|
CrudListComponent.prototype.showActionWorkflow = function (evt, rowData) {
|
|
26948
27250
|
return __awaiter(this, void 0, void 0, function () {
|
|
26949
|
-
var
|
|
26950
|
-
return __generator(this, function (
|
|
26951
|
-
switch (
|
|
27251
|
+
var _f, buttonContexts, hasPermission;
|
|
27252
|
+
return __generator(this, function (_g) {
|
|
27253
|
+
switch (_g.label) {
|
|
26952
27254
|
case 0: return [4 /*yield*/, this.getActionWorkflow(rowData)];
|
|
26953
27255
|
case 1:
|
|
26954
|
-
|
|
27256
|
+
_f = __read.apply(void 0, [_g.sent(), 2]), buttonContexts = _f[0], hasPermission = _f[1];
|
|
26955
27257
|
this.buttonContexts = buttonContexts;
|
|
26956
27258
|
rowData.__hasPermission = hasPermission;
|
|
26957
27259
|
rowData.__actions = this.buttonContexts;
|
|
@@ -26965,11 +27267,11 @@
|
|
|
26965
27267
|
return __awaiter(this, void 0, void 0, function () {
|
|
26966
27268
|
var hasPermission, buttonContexts, statusAction, actions;
|
|
26967
27269
|
var _this = this;
|
|
26968
|
-
return __generator(this, function (
|
|
26969
|
-
switch (
|
|
27270
|
+
return __generator(this, function (_f) {
|
|
27271
|
+
switch (_f.label) {
|
|
26970
27272
|
case 0: return [4 /*yield*/, this.validatePermission(rowData)];
|
|
26971
27273
|
case 1:
|
|
26972
|
-
hasPermission =
|
|
27274
|
+
hasPermission = _f.sent();
|
|
26973
27275
|
buttonContexts = [];
|
|
26974
27276
|
if (!hasPermission) {
|
|
26975
27277
|
buttonContexts = [];
|
|
@@ -27035,8 +27337,8 @@
|
|
|
27035
27337
|
return __awaiter(this, void 0, void 0, function () {
|
|
27036
27338
|
var dataProcess_1, validateWf;
|
|
27037
27339
|
var _this = this;
|
|
27038
|
-
return __generator(this, function (
|
|
27039
|
-
switch (
|
|
27340
|
+
return __generator(this, function (_f) {
|
|
27341
|
+
switch (_f.label) {
|
|
27040
27342
|
case 0:
|
|
27041
27343
|
if (!(workflowAction.actionOptions && !workflowAction.actionOptions.openDialog)) return [3 /*break*/, 2];
|
|
27042
27344
|
dataProcess_1 = {
|
|
@@ -27046,7 +27348,7 @@
|
|
|
27046
27348
|
};
|
|
27047
27349
|
return [4 /*yield*/, this.setting.baseService.validateProcessWorkflow(this.currentItem.id, workflowAction.ma, dataProcess_1)];
|
|
27048
27350
|
case 1:
|
|
27049
|
-
validateWf =
|
|
27351
|
+
validateWf = _f.sent();
|
|
27050
27352
|
this.handleResponse(validateWf, '', function (f) {
|
|
27051
27353
|
_this.setting.baseService.processWorkflow(_this.currentItem.id, workflowAction.ma, dataProcess_1)
|
|
27052
27354
|
.then(function (res) { return _this.handleResponse(res, workflowAction.ten + " th\u00E0nh c\u00F4ng", function (f) {
|
|
@@ -27070,7 +27372,7 @@
|
|
|
27070
27372
|
this.actionWorkflow = workflowAction;
|
|
27071
27373
|
this.headerWorkflow = workflowAction.ten;
|
|
27072
27374
|
this.showFormWorkflow = true;
|
|
27073
|
-
|
|
27375
|
+
_f.label = 3;
|
|
27074
27376
|
case 3: return [2 /*return*/];
|
|
27075
27377
|
}
|
|
27076
27378
|
});
|
|
@@ -27173,7 +27475,7 @@
|
|
|
27173
27475
|
this.onAdd.emit();
|
|
27174
27476
|
};
|
|
27175
27477
|
CrudListComponent.prototype.xuatCacMucDaChon_backup = function () {
|
|
27176
|
-
var e_2,
|
|
27478
|
+
var e_2, _f;
|
|
27177
27479
|
if (this._groupField) {
|
|
27178
27480
|
this._notifierService.showWarning('Giao diện hiện tại chưa hỗ trợ xuất excel');
|
|
27179
27481
|
return;
|
|
@@ -27215,7 +27517,7 @@
|
|
|
27215
27517
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
27216
27518
|
finally {
|
|
27217
27519
|
try {
|
|
27218
|
-
if (rowData_1_1 && !rowData_1_1.done && (
|
|
27520
|
+
if (rowData_1_1 && !rowData_1_1.done && (_f = rowData_1.return)) _f.call(rowData_1);
|
|
27219
27521
|
}
|
|
27220
27522
|
finally { if (e_2) throw e_2.error; }
|
|
27221
27523
|
}
|
|
@@ -27358,8 +27660,8 @@
|
|
|
27358
27660
|
CrudListComponent.prototype.checkHasPermissionInLastStatus = function (rowData) {
|
|
27359
27661
|
return __awaiter(this, void 0, void 0, function () {
|
|
27360
27662
|
var statusKetThuc;
|
|
27361
|
-
return __generator(this, function (
|
|
27362
|
-
switch (
|
|
27663
|
+
return __generator(this, function (_f) {
|
|
27664
|
+
switch (_f.label) {
|
|
27363
27665
|
case 0:
|
|
27364
27666
|
statusKetThuc = this.setting.workflowSetting.statuses.find(function (q) { return q.type == exports.EnumWFNhomTrangThai.KET_THUC; });
|
|
27365
27667
|
if (statusKetThuc == null) {
|
|
@@ -27372,46 +27674,46 @@
|
|
|
27372
27674
|
return [4 /*yield*/, this.validatePermission(rowData)];
|
|
27373
27675
|
case 1:
|
|
27374
27676
|
// Kiểm tra permission
|
|
27375
|
-
return [2 /*return*/,
|
|
27677
|
+
return [2 /*return*/, _f.sent()];
|
|
27376
27678
|
}
|
|
27377
27679
|
});
|
|
27378
27680
|
});
|
|
27379
27681
|
};
|
|
27380
27682
|
CrudListComponent.prototype.showContextMenu = function (evt, rowData) {
|
|
27381
27683
|
return __awaiter(this, void 0, void 0, function () {
|
|
27382
|
-
var
|
|
27383
|
-
return __generator(this, function (
|
|
27384
|
-
switch (
|
|
27684
|
+
var _f, _g, _h, _j;
|
|
27685
|
+
return __generator(this, function (_k) {
|
|
27686
|
+
switch (_k.label) {
|
|
27385
27687
|
case 0:
|
|
27386
27688
|
this.rowDataCurrent = rowData;
|
|
27387
|
-
|
|
27689
|
+
_f = this;
|
|
27388
27690
|
return [4 /*yield*/, this.menuButtons(rowData)];
|
|
27389
27691
|
case 1:
|
|
27390
|
-
|
|
27692
|
+
_f.buttonContexts = _k.sent();
|
|
27391
27693
|
if (!(!this.setting.hiddenTrinhKy && !rowData.__hiddenTrinhKy)) return [3 /*break*/, 7];
|
|
27392
|
-
|
|
27393
|
-
if (!
|
|
27694
|
+
_h = this.setting.checkReadyToTrinhKy();
|
|
27695
|
+
if (!_h) return [3 /*break*/, 3];
|
|
27394
27696
|
return [4 /*yield*/, this.setting.checkAllowTrinhKy(rowData)];
|
|
27395
27697
|
case 2:
|
|
27396
|
-
|
|
27397
|
-
|
|
27698
|
+
_h = (_k.sent());
|
|
27699
|
+
_k.label = 3;
|
|
27398
27700
|
case 3:
|
|
27399
|
-
|
|
27400
|
-
if (!
|
|
27401
|
-
|
|
27402
|
-
if (
|
|
27701
|
+
_g = _h;
|
|
27702
|
+
if (!_g) return [3 /*break*/, 6];
|
|
27703
|
+
_j = !this.setting.checkPermisionTrinhKy;
|
|
27704
|
+
if (_j) return [3 /*break*/, 5];
|
|
27403
27705
|
return [4 /*yield*/, this.checkHasPermissionInLastStatus(rowData)];
|
|
27404
27706
|
case 4:
|
|
27405
|
-
|
|
27406
|
-
|
|
27707
|
+
_j = (_k.sent());
|
|
27708
|
+
_k.label = 5;
|
|
27407
27709
|
case 5:
|
|
27408
|
-
|
|
27409
|
-
|
|
27710
|
+
_g = (_j);
|
|
27711
|
+
_k.label = 6;
|
|
27410
27712
|
case 6:
|
|
27411
|
-
if (
|
|
27713
|
+
if (_g) {
|
|
27412
27714
|
this.buttonContexts.unshift({ label: this.setting.getLabelButtonTrinhKy(rowData), icon: 'pi pi-send', command: this.trinhKy.bind(this) });
|
|
27413
27715
|
}
|
|
27414
|
-
|
|
27716
|
+
_k.label = 7;
|
|
27415
27717
|
case 7:
|
|
27416
27718
|
if (this.buttonContexts.length > 0) {
|
|
27417
27719
|
this._showContextMenu(evt);
|
|
@@ -27988,7 +28290,7 @@
|
|
|
27988
28290
|
return col.dataType == exports.DataType.datetime || col.dataType == exports.DataType.date || col.dataType == exports.DataType.boolean || col.dataType == exports.DataType.enum;
|
|
27989
28291
|
};
|
|
27990
28292
|
CrudListComponent.prototype.alignRightColumn = function (col) {
|
|
27991
|
-
return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal;
|
|
28293
|
+
return col.dataType == exports.DataType.int || col.dataType == exports.DataType.decimal || col.dataType == exports.DataType.currency;
|
|
27992
28294
|
};
|
|
27993
28295
|
CrudListComponent.prototype.ngOnDestroy = function () {
|
|
27994
28296
|
if (!this.disableKeypressControl) {
|
|
@@ -28004,10 +28306,10 @@
|
|
|
28004
28306
|
clearTimeout(this.timeout);
|
|
28005
28307
|
};
|
|
28006
28308
|
CrudListComponent.prototype.disableMultipleDelete = function () {
|
|
28007
|
-
var e_3,
|
|
28309
|
+
var e_3, _f;
|
|
28008
28310
|
try {
|
|
28009
|
-
for (var
|
|
28010
|
-
var item =
|
|
28311
|
+
for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
|
|
28312
|
+
var item = _h.value;
|
|
28011
28313
|
if (this.disableDelete(item)) {
|
|
28012
28314
|
return true;
|
|
28013
28315
|
}
|
|
@@ -28016,7 +28318,7 @@
|
|
|
28016
28318
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
28017
28319
|
finally {
|
|
28018
28320
|
try {
|
|
28019
|
-
if (
|
|
28321
|
+
if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
|
|
28020
28322
|
}
|
|
28021
28323
|
finally { if (e_3) throw e_3.error; }
|
|
28022
28324
|
}
|
|
@@ -28086,11 +28388,11 @@
|
|
|
28086
28388
|
};
|
|
28087
28389
|
CrudListComponent.prototype.processBaseData = function () {
|
|
28088
28390
|
return __awaiter(this, void 0, void 0, function () {
|
|
28089
|
-
return __generator(this, function (
|
|
28090
|
-
switch (
|
|
28391
|
+
return __generator(this, function (_f) {
|
|
28392
|
+
switch (_f.label) {
|
|
28091
28393
|
case 0: return [4 /*yield*/, this.preProcessData(this.model.dataSource)];
|
|
28092
28394
|
case 1:
|
|
28093
|
-
|
|
28395
|
+
_f.sent();
|
|
28094
28396
|
return [2 /*return*/];
|
|
28095
28397
|
}
|
|
28096
28398
|
});
|
|
@@ -28099,14 +28401,14 @@
|
|
|
28099
28401
|
CrudListComponent.prototype.preProcessData = function (dataSource) {
|
|
28100
28402
|
return __awaiter(this, void 0, void 0, function () {
|
|
28101
28403
|
var colHasPipe, _loop_3, this_2, colHasPipe_1, colHasPipe_1_1, col;
|
|
28102
|
-
var e_4,
|
|
28103
|
-
return __generator(this, function (
|
|
28404
|
+
var e_4, _f;
|
|
28405
|
+
return __generator(this, function (_g) {
|
|
28104
28406
|
colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
|
|
28105
28407
|
_loop_3 = function (col) {
|
|
28106
|
-
var e_5,
|
|
28408
|
+
var e_5, _f;
|
|
28107
28409
|
var _loop_4 = function (item) {
|
|
28108
28410
|
this_2.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
|
|
28109
|
-
item["pipe__" + col.field
|
|
28411
|
+
item["pipe__" + col.field] = rs;
|
|
28110
28412
|
});
|
|
28111
28413
|
};
|
|
28112
28414
|
try {
|
|
@@ -28118,7 +28420,7 @@
|
|
|
28118
28420
|
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
28119
28421
|
finally {
|
|
28120
28422
|
try {
|
|
28121
|
-
if (dataSource_1_1 && !dataSource_1_1.done && (
|
|
28423
|
+
if (dataSource_1_1 && !dataSource_1_1.done && (_f = dataSource_1.return)) _f.call(dataSource_1);
|
|
28122
28424
|
}
|
|
28123
28425
|
finally { if (e_5) throw e_5.error; }
|
|
28124
28426
|
}
|
|
@@ -28133,7 +28435,7 @@
|
|
|
28133
28435
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
28134
28436
|
finally {
|
|
28135
28437
|
try {
|
|
28136
|
-
if (colHasPipe_1_1 && !colHasPipe_1_1.done && (
|
|
28438
|
+
if (colHasPipe_1_1 && !colHasPipe_1_1.done && (_f = colHasPipe_1.return)) _f.call(colHasPipe_1);
|
|
28137
28439
|
}
|
|
28138
28440
|
finally { if (e_4) throw e_4.error; }
|
|
28139
28441
|
}
|
|
@@ -28144,8 +28446,8 @@
|
|
|
28144
28446
|
CrudListComponent.prototype.transform = function (pipe, asyncPipe, value) {
|
|
28145
28447
|
return __awaiter(this, void 0, void 0, function () {
|
|
28146
28448
|
var val, val;
|
|
28147
|
-
return __generator(this, function (
|
|
28148
|
-
switch (
|
|
28449
|
+
return __generator(this, function (_f) {
|
|
28450
|
+
switch (_f.label) {
|
|
28149
28451
|
case 0:
|
|
28150
28452
|
if (this.cachedTransforms[value]) {
|
|
28151
28453
|
return [2 /*return*/, this.cachedTransforms[value]];
|
|
@@ -28153,7 +28455,7 @@
|
|
|
28153
28455
|
if (!asyncPipe) return [3 /*break*/, 2];
|
|
28154
28456
|
return [4 /*yield*/, pipe.transform(value)];
|
|
28155
28457
|
case 1:
|
|
28156
|
-
val =
|
|
28458
|
+
val = _f.sent();
|
|
28157
28459
|
this.cachedTransforms[value] = val;
|
|
28158
28460
|
return [2 /*return*/, val];
|
|
28159
28461
|
case 2:
|
|
@@ -28247,7 +28549,7 @@
|
|
|
28247
28549
|
return {};
|
|
28248
28550
|
};
|
|
28249
28551
|
CrudListComponent.prototype.getMinimizeData = function (model) {
|
|
28250
|
-
var e_6,
|
|
28552
|
+
var e_6, _f;
|
|
28251
28553
|
if (isLiteralObject(model)) {
|
|
28252
28554
|
if (model._dropdownvalue != null && model._dropdownvalue !== '') {
|
|
28253
28555
|
return model[model._dropdownvalue];
|
|
@@ -28273,7 +28575,7 @@
|
|
|
28273
28575
|
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
28274
28576
|
finally {
|
|
28275
28577
|
try {
|
|
28276
|
-
if (model_1_1 && !model_1_1.done && (
|
|
28578
|
+
if (model_1_1 && !model_1_1.done && (_f = model_1.return)) _f.call(model_1);
|
|
28277
28579
|
}
|
|
28278
28580
|
finally { if (e_6) throw e_6.error; }
|
|
28279
28581
|
}
|
|
@@ -28421,7 +28723,7 @@
|
|
|
28421
28723
|
};
|
|
28422
28724
|
CrudListComponent.prototype.showSettingsPermission = function () {
|
|
28423
28725
|
return __awaiter(this, void 0, void 0, function () {
|
|
28424
|
-
return __generator(this, function (
|
|
28726
|
+
return __generator(this, function (_f) {
|
|
28425
28727
|
if (this.creatingSearchInfo)
|
|
28426
28728
|
return [2 /*return*/];
|
|
28427
28729
|
this._showSettingsPermission = true;
|
|
@@ -28431,10 +28733,10 @@
|
|
|
28431
28733
|
};
|
|
28432
28734
|
CrudListComponent.prototype.createSearchSchema = function () {
|
|
28433
28735
|
return __awaiter(this, void 0, void 0, function () {
|
|
28434
|
-
var searchInfo,
|
|
28435
|
-
var e_7,
|
|
28436
|
-
return __generator(this, function (
|
|
28437
|
-
switch (
|
|
28736
|
+
var searchInfo, _f, _g, col, control, e_7_1, _loop_5, this_3, _h, _j, field;
|
|
28737
|
+
var e_7, _k, _l, e_8, _m;
|
|
28738
|
+
return __generator(this, function (_o) {
|
|
28739
|
+
switch (_o.label) {
|
|
28438
28740
|
case 0:
|
|
28439
28741
|
if (this.setting.cols == null) {
|
|
28440
28742
|
return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
|
|
@@ -28444,14 +28746,14 @@
|
|
|
28444
28746
|
searchInfo.schema = [];
|
|
28445
28747
|
searchInfo.fieldDropdown = {};
|
|
28446
28748
|
searchInfo.fieldSearchText = [];
|
|
28447
|
-
|
|
28749
|
+
_o.label = 1;
|
|
28448
28750
|
case 1:
|
|
28449
|
-
|
|
28450
|
-
|
|
28451
|
-
|
|
28751
|
+
_o.trys.push([1, 6, 7, 8]);
|
|
28752
|
+
_f = __values(this.setting.cols), _g = _f.next();
|
|
28753
|
+
_o.label = 2;
|
|
28452
28754
|
case 2:
|
|
28453
|
-
if (!!
|
|
28454
|
-
col =
|
|
28755
|
+
if (!!_g.done) return [3 /*break*/, 5];
|
|
28756
|
+
col = _g.value;
|
|
28455
28757
|
if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
|
|
28456
28758
|
if (col.fullTextSearch) {
|
|
28457
28759
|
if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
|
|
@@ -28464,9 +28766,9 @@
|
|
|
28464
28766
|
}
|
|
28465
28767
|
return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
|
|
28466
28768
|
case 3:
|
|
28467
|
-
control =
|
|
28769
|
+
control = _o.sent();
|
|
28468
28770
|
if (control != null) {
|
|
28469
|
-
(
|
|
28771
|
+
(_l = searchInfo.schema).push.apply(_l, __spread(control));
|
|
28470
28772
|
}
|
|
28471
28773
|
else {
|
|
28472
28774
|
if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
|
|
@@ -28520,18 +28822,18 @@
|
|
|
28520
28822
|
}
|
|
28521
28823
|
}
|
|
28522
28824
|
}
|
|
28523
|
-
|
|
28825
|
+
_o.label = 4;
|
|
28524
28826
|
case 4:
|
|
28525
|
-
|
|
28827
|
+
_g = _f.next();
|
|
28526
28828
|
return [3 /*break*/, 2];
|
|
28527
28829
|
case 5: return [3 /*break*/, 8];
|
|
28528
28830
|
case 6:
|
|
28529
|
-
e_7_1 =
|
|
28831
|
+
e_7_1 = _o.sent();
|
|
28530
28832
|
e_7 = { error: e_7_1 };
|
|
28531
28833
|
return [3 /*break*/, 8];
|
|
28532
28834
|
case 7:
|
|
28533
28835
|
try {
|
|
28534
|
-
if (
|
|
28836
|
+
if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
|
|
28535
28837
|
}
|
|
28536
28838
|
finally { if (e_7) throw e_7.error; }
|
|
28537
28839
|
return [7 /*endfinally*/];
|
|
@@ -28551,15 +28853,15 @@
|
|
|
28551
28853
|
};
|
|
28552
28854
|
this_3 = this;
|
|
28553
28855
|
try {
|
|
28554
|
-
for (
|
|
28555
|
-
field =
|
|
28856
|
+
for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
28857
|
+
field = _j.value;
|
|
28556
28858
|
_loop_5(field);
|
|
28557
28859
|
}
|
|
28558
28860
|
}
|
|
28559
28861
|
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
28560
28862
|
finally {
|
|
28561
28863
|
try {
|
|
28562
|
-
if (
|
|
28864
|
+
if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
|
|
28563
28865
|
}
|
|
28564
28866
|
finally { if (e_8) throw e_8.error; }
|
|
28565
28867
|
}
|
|
@@ -28625,15 +28927,19 @@
|
|
|
28625
28927
|
}
|
|
28626
28928
|
}, 20);
|
|
28627
28929
|
};
|
|
28930
|
+
CrudListComponent.prototype.getTooltip = function (tooltip, field) {
|
|
28931
|
+
var result = tooltip && tooltip[field] ? tooltip[field] : null;
|
|
28932
|
+
return result;
|
|
28933
|
+
};
|
|
28628
28934
|
return CrudListComponent;
|
|
28629
28935
|
}(ComponentBase));
|
|
28630
28936
|
CrudListComponent.decorators = [
|
|
28631
28937
|
{ type: i0.Component, args: [{
|
|
28632
28938
|
// tslint:disable-next-line: component-selector
|
|
28633
28939
|
selector: 'crud-list',
|
|
28634
|
-
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" (click)=\"add()\"></button>\r\n <button *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"hasTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <process-workflow-form #formBase [bussinessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\" [style.width]=\"widthCheckbox\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflow()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { 'ui-state-highlight': rowData._checked })\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"fas fa-history\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>",
|
|
28940
|
+
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" (click)=\"add()\"></button>\r\n <button *ngIf=\"model.selectedItems.length > 0\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"hasTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <process-workflow-form #formBase [bussinessSetting]=\"setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\" style=\"z-index: 3 !important;\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.hidden-checkbox]=\"setting.hiddenCheckbox\" style=\"z-index: 3 !important;\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" style=\"z-index: 3 !important;\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.tricheckbox-custom-false]=\"checkedAll === false\"\r\n [style.width]=\"widthCheckbox\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" style=\"z-index: 3 !important;\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.hidden-checkbox]=\"setting.hiddenCheckbox\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileUpload'\">\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n style=\"z-index: 3 !important;\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n (click)=\"showSettingsWorkflow()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" style=\"z-index: 3 !important;\" [class.sticky]=\"setting.stickyColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr class=\"table-row\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { 'ui-state-highlight': rowData._checked })\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [class.hidden-checkbox]=\"setting.hiddenCheckbox\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"fas fa-history\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n <button *ngIf=\"setting.showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'intWithoutMask'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{rowData[field] | currency:\"VND\"}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <ng-container *ngIf=\"!col.useTriStateCheckbox\">\r\n <p-checkbox class=\"boolean-data-type\" binary=\"true\" [pTooltip]=\"getTooltip(rowData._tooltip, field)\"\r\n tooltipPosition=\"top\" [disabled]=\"col.disableCheckBox\" [(ngModel)]=\"rowData[field]\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"col.useTriStateCheckbox\">\r\n <p-triStateCheckbox class=\"boolean-data-type\" binary=\"true\"\r\n [pTooltip]=\"getTooltip(rowData._tooltip, field)\" tooltipPosition=\"top\"\r\n [disabled]=\"col.disableCheckBox\" [(ngModel)]=\"rowData[field]\">\r\n </p-triStateCheckbox>\r\n </ng-container>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'fileUpload'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>\r\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\"\r\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\r\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\r\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\r\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\r\n </file-upload>\r\n\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\r\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\r\n [(ngModel)]=\"rowData.field\"\r\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\r\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\r\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\r\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [fileDataService]=\"fileSetting.control.fileDataService\" [maxFileSize]=\"fileSetting.control.maxFileSize\"\r\n [(value)]=\"rowData[field]\"\r\n (onChanged)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.CHANGE)\"\r\n (onInit)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.INIT)\"\r\n (onSelect)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.SELECT)\"\r\n (onRemove)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.DELETED)\"\r\n (uploaded)=\"handleFieldValueChange(fileSetting, $event, rowData, eventType.UPLOADED)\">\r\n </file-manager>\r\n</ng-template>",
|
|
28635
28941
|
providers: [i2$1.DecimalPipe, i2$1.DatePipe],
|
|
28636
|
-
styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{min-width:80px;padding:0}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem!important;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}::ng-deep crud-list .advance-search-container{display:flex;justify-content:flex-end}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .main-container-search-inner .container-control>div{overflow:hidden}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
|
|
28942
|
+
styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{background-color:#fff;min-width:80px;padding:0;position:sticky!important;right:0!important;z-index:2!important}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.chkbox{left:0!important}.chkbox,.stt{background-color:#fff;position:sticky!important;z-index:2!important}.stt{left:35px!important}.stt.hidden-checkbox,.table-row>td:not(.chkbox) .stt,.title-row>th:not(.sticky):not(.chkbox) .stt{left:0!important}.table-row>tr:has(.ui-state-highlight) .stt{background-color:#a6d5fa}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem!important;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}::ng-deep crud-list .advance-search-container{display:flex;justify-content:flex-end}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .main-container-search-inner .container-control>div{overflow:hidden}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
|
|
28637
28943
|
},] }
|
|
28638
28944
|
];
|
|
28639
28945
|
CrudListComponent.ctorParameters = function () { return [
|
|
@@ -30550,31 +30856,67 @@
|
|
|
30550
30856
|
};
|
|
30551
30857
|
EntityPickerDataComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
30552
30858
|
return __awaiter(this, void 0, void 0, function () {
|
|
30553
|
-
var allow;
|
|
30554
|
-
|
|
30555
|
-
|
|
30859
|
+
var _a, _b, filter, value, allow;
|
|
30860
|
+
var e_1, _c;
|
|
30861
|
+
return __generator(this, function (_d) {
|
|
30862
|
+
switch (_d.label) {
|
|
30556
30863
|
case 0:
|
|
30557
30864
|
gridInfo.fields = this.advanceData.fields;
|
|
30865
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
30866
|
+
if (gridInfo.filters.length > 0) {
|
|
30867
|
+
try {
|
|
30868
|
+
for (_a = __values(gridInfo.filters), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
30869
|
+
filter = _b.value;
|
|
30870
|
+
value = this._commonService.tryParseJson(filter.value);
|
|
30871
|
+
if (value.valid) {
|
|
30872
|
+
if (filter.operator == exports.Operator.in) {
|
|
30873
|
+
filter.value = JSON.parse(filter.value).join(',');
|
|
30874
|
+
}
|
|
30875
|
+
else {
|
|
30876
|
+
filter.value = JSON.parse(filter.value).toString();
|
|
30877
|
+
}
|
|
30878
|
+
}
|
|
30879
|
+
}
|
|
30880
|
+
}
|
|
30881
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
30882
|
+
finally {
|
|
30883
|
+
try {
|
|
30884
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
30885
|
+
}
|
|
30886
|
+
finally { if (e_1) throw e_1.error; }
|
|
30887
|
+
}
|
|
30888
|
+
}
|
|
30889
|
+
}
|
|
30558
30890
|
if (this.control.multiple) {
|
|
30559
30891
|
if (this._value && this._value.length > 0) {
|
|
30560
|
-
|
|
30892
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
30893
|
+
gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notIn, this._value.join(',')));
|
|
30894
|
+
}
|
|
30895
|
+
else {
|
|
30896
|
+
gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notIn, this._value));
|
|
30897
|
+
}
|
|
30561
30898
|
}
|
|
30562
30899
|
}
|
|
30563
30900
|
else {
|
|
30564
30901
|
if (this._value) {
|
|
30565
|
-
|
|
30902
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
30903
|
+
gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.notEqual, this._value.toString()));
|
|
30904
|
+
}
|
|
30905
|
+
else {
|
|
30906
|
+
gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.notEqual, this._value));
|
|
30907
|
+
}
|
|
30566
30908
|
}
|
|
30567
30909
|
}
|
|
30568
30910
|
return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
|
|
30569
30911
|
case 1:
|
|
30570
|
-
|
|
30912
|
+
_d.sent();
|
|
30571
30913
|
if (!this.control.modifyFilter) return [3 /*break*/, 3];
|
|
30572
30914
|
return [4 /*yield*/, this.control.modifyFilter(gridInfo.filters, this)];
|
|
30573
30915
|
case 2:
|
|
30574
|
-
allow =
|
|
30916
|
+
allow = _d.sent();
|
|
30575
30917
|
if (allow === false)
|
|
30576
30918
|
return [2 /*return*/, false];
|
|
30577
|
-
|
|
30919
|
+
_d.label = 3;
|
|
30578
30920
|
case 3:
|
|
30579
30921
|
if (this.setting.columnSetting.sortField) {
|
|
30580
30922
|
gridInfo.sorts.push({
|
|
@@ -30739,13 +31081,45 @@
|
|
|
30739
31081
|
};
|
|
30740
31082
|
EntityPickerSelectedComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
30741
31083
|
return __awaiter(this, void 0, void 0, function () {
|
|
30742
|
-
|
|
30743
|
-
|
|
31084
|
+
var _a, _b, filter, value;
|
|
31085
|
+
var e_1, _c;
|
|
31086
|
+
return __generator(this, function (_d) {
|
|
31087
|
+
switch (_d.label) {
|
|
30744
31088
|
case 0:
|
|
30745
31089
|
gridInfo.fields = this.advanceData.fields;
|
|
31090
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
31091
|
+
if (gridInfo.filters.length > 0) {
|
|
31092
|
+
try {
|
|
31093
|
+
for (_a = __values(gridInfo.filters), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
31094
|
+
filter = _b.value;
|
|
31095
|
+
value = this._commonService.tryParseJson(filter.value);
|
|
31096
|
+
if (value.valid) {
|
|
31097
|
+
if (filter.operator == exports.Operator.in) {
|
|
31098
|
+
filter.value = JSON.parse(filter.value).join(',');
|
|
31099
|
+
}
|
|
31100
|
+
else {
|
|
31101
|
+
filter.value = JSON.parse(filter.value).toString();
|
|
31102
|
+
}
|
|
31103
|
+
}
|
|
31104
|
+
}
|
|
31105
|
+
}
|
|
31106
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
31107
|
+
finally {
|
|
31108
|
+
try {
|
|
31109
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
31110
|
+
}
|
|
31111
|
+
finally { if (e_1) throw e_1.error; }
|
|
31112
|
+
}
|
|
31113
|
+
}
|
|
31114
|
+
}
|
|
30746
31115
|
if (this.control.multiple) {
|
|
30747
31116
|
if (this._value != null && this._value.length > 0) {
|
|
30748
|
-
|
|
31117
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
31118
|
+
gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.in, this._value.join(',')));
|
|
31119
|
+
}
|
|
31120
|
+
else {
|
|
31121
|
+
gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
|
|
31122
|
+
}
|
|
30749
31123
|
}
|
|
30750
31124
|
else {
|
|
30751
31125
|
return [2 /*return*/, false];
|
|
@@ -30753,7 +31127,12 @@
|
|
|
30753
31127
|
}
|
|
30754
31128
|
else {
|
|
30755
31129
|
if (this._value != null) {
|
|
30756
|
-
|
|
31130
|
+
if (this.control.coreVersion == exports.EnumCoreVersion.V4) {
|
|
31131
|
+
gridInfo.filters.push(this.newFilterV4(this.control.valueField, exports.Operator.in, this._value.toString()));
|
|
31132
|
+
}
|
|
31133
|
+
else {
|
|
31134
|
+
gridInfo.filters.push(this.newFilter(this.control.valueField, exports.Operator.in, this._value));
|
|
31135
|
+
}
|
|
30757
31136
|
}
|
|
30758
31137
|
else {
|
|
30759
31138
|
return [2 /*return*/, false];
|
|
@@ -30761,7 +31140,7 @@
|
|
|
30761
31140
|
}
|
|
30762
31141
|
return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
|
|
30763
31142
|
case 1:
|
|
30764
|
-
|
|
31143
|
+
_d.sent();
|
|
30765
31144
|
return [2 /*return*/];
|
|
30766
31145
|
}
|
|
30767
31146
|
});
|
|
@@ -32756,7 +33135,7 @@
|
|
|
32756
33135
|
};
|
|
32757
33136
|
FileManagerComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
32758
33137
|
return __awaiter(this, void 0, void 0, function () {
|
|
32759
|
-
return __generator(this, function (
|
|
33138
|
+
return __generator(this, function (_a) {
|
|
32760
33139
|
gridInfo.filters.push(this.newFilter('parentFolderId', exports.Operator.equal, this.data.currentFolderId));
|
|
32761
33140
|
return [2 /*return*/];
|
|
32762
33141
|
});
|
|
@@ -32765,7 +33144,7 @@
|
|
|
32765
33144
|
FileManagerComponent.prototype.afterGetData = function () {
|
|
32766
33145
|
return __awaiter(this, void 0, void 0, function () {
|
|
32767
33146
|
var _loop_1, this_1, ind;
|
|
32768
|
-
return __generator(this, function (
|
|
33147
|
+
return __generator(this, function (_a) {
|
|
32769
33148
|
_loop_1 = function (ind) {
|
|
32770
33149
|
var item = this_1.model.dataSource[ind];
|
|
32771
33150
|
if (this_1._fileExplorerService.supportDigitalSignature(item.name)) {
|
|
@@ -32938,7 +33317,7 @@
|
|
|
32938
33317
|
FileManagerComponent.prototype.openObject = function (explorerItem) {
|
|
32939
33318
|
return __awaiter(this, void 0, void 0, function () {
|
|
32940
33319
|
var canViewOnline;
|
|
32941
|
-
return __generator(this, function (
|
|
33320
|
+
return __generator(this, function (_a) {
|
|
32942
33321
|
if (explorerItem.isFile) {
|
|
32943
33322
|
canViewOnline = this._fileObjectService.isSupportedViewOnline(explorerItem.name);
|
|
32944
33323
|
if (canViewOnline) {
|
|
@@ -32979,7 +33358,7 @@
|
|
|
32979
33358
|
FileManagerComponent.prototype.download = function (explorerItem) {
|
|
32980
33359
|
return __awaiter(this, void 0, void 0, function () {
|
|
32981
33360
|
var model;
|
|
32982
|
-
return __generator(this, function (
|
|
33361
|
+
return __generator(this, function (_a) {
|
|
32983
33362
|
model = this._downloadLinkService.getGenerateDownloadLinkModel(explorerItem);
|
|
32984
33363
|
this._downloadLinkService.download(model);
|
|
32985
33364
|
return [2 /*return*/];
|
|
@@ -32991,7 +33370,7 @@
|
|
|
32991
33370
|
return __awaiter(this, void 0, void 0, function () {
|
|
32992
33371
|
var selectedItems, hasItems, arrModel;
|
|
32993
33372
|
var _this = this;
|
|
32994
|
-
return __generator(this, function (
|
|
33373
|
+
return __generator(this, function (_a) {
|
|
32995
33374
|
selectedItems = this.model.selectedItems;
|
|
32996
33375
|
hasItems = selectedItems && selectedItems.length;
|
|
32997
33376
|
if (hasItems) {
|
|
@@ -33141,13 +33520,13 @@
|
|
|
33141
33520
|
return __awaiter(this, void 0, void 0, function () {
|
|
33142
33521
|
var rs, breadcrumbs;
|
|
33143
33522
|
var _this = this;
|
|
33144
|
-
return __generator(this, function (
|
|
33145
|
-
switch (
|
|
33523
|
+
return __generator(this, function (_a) {
|
|
33524
|
+
switch (_a.label) {
|
|
33146
33525
|
case 0:
|
|
33147
33526
|
if (!this.data.currentFolderId) return [3 /*break*/, 2];
|
|
33148
33527
|
return [4 /*yield*/, this._folderService.getFullFolderPath(this.data.currentFolderId)];
|
|
33149
33528
|
case 1:
|
|
33150
|
-
rs =
|
|
33529
|
+
rs = _a.sent();
|
|
33151
33530
|
if (rs.success) {
|
|
33152
33531
|
breadcrumbs = rs.data.map(function (f) {
|
|
33153
33532
|
var item = {
|
|
@@ -33169,7 +33548,7 @@
|
|
|
33169
33548
|
return [3 /*break*/, 3];
|
|
33170
33549
|
case 2:
|
|
33171
33550
|
this.data.breadcrumbs = [];
|
|
33172
|
-
|
|
33551
|
+
_a.label = 3;
|
|
33173
33552
|
case 3: return [2 /*return*/];
|
|
33174
33553
|
}
|
|
33175
33554
|
});
|
|
@@ -33186,12 +33565,12 @@
|
|
|
33186
33565
|
}).then(function (rs) {
|
|
33187
33566
|
var url = _this._fileExplorerService.getDownloadForSignUrl(rs.data);
|
|
33188
33567
|
var prms = {};
|
|
33189
|
-
prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/
|
|
33568
|
+
prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/Signature/SavePhysicalSignedFile";
|
|
33190
33569
|
prms['SessionId'] = '';
|
|
33191
33570
|
prms['FileName'] = url;
|
|
33192
33571
|
// tslint:disable-next-line: variable-name
|
|
33193
33572
|
var json_prms = JSON.stringify(prms);
|
|
33194
|
-
|
|
33573
|
+
vgca_sign_file(json_prms, function (result) {
|
|
33195
33574
|
var resultObj = JSON.parse(result);
|
|
33196
33575
|
if (resultObj.FileServer != '') {
|
|
33197
33576
|
_this._fileExplorerService.saveSignedFile({
|
|
@@ -33208,7 +33587,7 @@
|
|
|
33208
33587
|
};
|
|
33209
33588
|
FileManagerComponent.prototype.shareFolder = function (file) {
|
|
33210
33589
|
return __awaiter(this, void 0, void 0, function () {
|
|
33211
|
-
return __generator(this, function (
|
|
33590
|
+
return __generator(this, function (_a) {
|
|
33212
33591
|
this.forms.shareFolder.data = file;
|
|
33213
33592
|
this.forms.shareFolder.show = true;
|
|
33214
33593
|
return [2 /*return*/];
|
|
@@ -33217,7 +33596,7 @@
|
|
|
33217
33596
|
};
|
|
33218
33597
|
FileManagerComponent.prototype.shareFile = function (file) {
|
|
33219
33598
|
return __awaiter(this, void 0, void 0, function () {
|
|
33220
|
-
return __generator(this, function (
|
|
33599
|
+
return __generator(this, function (_a) {
|
|
33221
33600
|
this.forms.shareFile.data = file;
|
|
33222
33601
|
this.forms.shareFile.show = true;
|
|
33223
33602
|
return [2 /*return*/];
|
|
@@ -33237,148 +33616,13 @@
|
|
|
33237
33616
|
FileManagerComponent.prototype.onRowSelect = function (evt) {
|
|
33238
33617
|
this.onSelected.emit(this.model.selectedItems);
|
|
33239
33618
|
};
|
|
33240
|
-
FileManagerComponent.prototype.signMultiple = function () {
|
|
33241
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
33242
|
-
var selectedItems, hasItems;
|
|
33243
|
-
return __generator(this, function (_b) {
|
|
33244
|
-
selectedItems = this.model.selectedItems;
|
|
33245
|
-
hasItems = selectedItems && selectedItems.length;
|
|
33246
|
-
if (hasItems) {
|
|
33247
|
-
if (selectedItems.length == 1) {
|
|
33248
|
-
this.signFile(selectedItems[0]);
|
|
33249
|
-
}
|
|
33250
|
-
else {
|
|
33251
|
-
this.signFileMultiple(selectedItems);
|
|
33252
|
-
}
|
|
33253
|
-
}
|
|
33254
|
-
return [2 /*return*/];
|
|
33255
|
-
});
|
|
33256
|
-
});
|
|
33257
|
-
};
|
|
33258
|
-
FileManagerComponent.prototype.signFileMultiple = function (lstFile) {
|
|
33259
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
33260
|
-
var prms, rs, lstFile_1, lstFile_1_1, file, sourceFileId, sourceFile, rsConvert, result, url, e_1, result, url, e_2_1, json_prms;
|
|
33261
|
-
var e_2, _b;
|
|
33262
|
-
var _this = this;
|
|
33263
|
-
return __generator(this, function (_c) {
|
|
33264
|
-
switch (_c.label) {
|
|
33265
|
-
case 0:
|
|
33266
|
-
prms = {};
|
|
33267
|
-
prms['Files'] = [];
|
|
33268
|
-
prms['FileUploadHandler'] = this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
|
|
33269
|
-
prms['SessionId'] = '';
|
|
33270
|
-
return [4 /*yield*/, this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số các văn bản này?')];
|
|
33271
|
-
case 1:
|
|
33272
|
-
rs = _c.sent();
|
|
33273
|
-
if (!rs) return [3 /*break*/, 18];
|
|
33274
|
-
_c.label = 2;
|
|
33275
|
-
case 2:
|
|
33276
|
-
_c.trys.push([2, 15, 16, 17]);
|
|
33277
|
-
lstFile_1 = __values(lstFile), lstFile_1_1 = lstFile_1.next();
|
|
33278
|
-
_c.label = 3;
|
|
33279
|
-
case 3:
|
|
33280
|
-
if (!!lstFile_1_1.done) return [3 /*break*/, 14];
|
|
33281
|
-
file = lstFile_1_1.value;
|
|
33282
|
-
if (!this._fileObjectService.isTypeFileKySo(file.name))
|
|
33283
|
-
return [3 /*break*/, 13];
|
|
33284
|
-
sourceFileId = file.id;
|
|
33285
|
-
sourceFile = file;
|
|
33286
|
-
if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 11];
|
|
33287
|
-
_c.label = 4;
|
|
33288
|
-
case 4:
|
|
33289
|
-
_c.trys.push([4, 9, , 10]);
|
|
33290
|
-
return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
|
|
33291
|
-
id: sourceFileId,
|
|
33292
|
-
name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
|
|
33293
|
-
folderId: file.parentFolderId,
|
|
33294
|
-
ownerType: this._userService.getCurrentUser().userId.toString(),
|
|
33295
|
-
})];
|
|
33296
|
-
case 5:
|
|
33297
|
-
rsConvert = _c.sent();
|
|
33298
|
-
if (!(!rsConvert || !rsConvert.success)) return [3 /*break*/, 6];
|
|
33299
|
-
this._notifierService.showWarning("C\u00F3 l\u1ED7i x\u1EA3y ra khi chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf \u0111\u1EC3 k\u00FD. Vui l\u00F2ng th\u1EED l\u1EA1i sau");
|
|
33300
|
-
return [3 /*break*/, 13];
|
|
33301
|
-
case 6: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: rsConvert.data })];
|
|
33302
|
-
case 7:
|
|
33303
|
-
result = _c.sent();
|
|
33304
|
-
if (result.success) {
|
|
33305
|
-
url = this._downloadLinkService.getDownloadForSignUrl(result.data);
|
|
33306
|
-
prms['Files'].push({
|
|
33307
|
-
"FileID": rsConvert.data,
|
|
33308
|
-
"FileName": this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
|
|
33309
|
-
"URL": url,
|
|
33310
|
-
});
|
|
33311
|
-
}
|
|
33312
|
-
_c.label = 8;
|
|
33313
|
-
case 8: return [3 /*break*/, 10];
|
|
33314
|
-
case 9:
|
|
33315
|
-
e_1 = _c.sent();
|
|
33316
|
-
this._notifierService.showWarning("C\u00F3 l\u1ED7i x\u1EA3y ra khi chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf \u0111\u1EC3 k\u00FD. Vui l\u00F2ng th\u1EED l\u1EA1i sau");
|
|
33317
|
-
return [3 /*break*/, 13];
|
|
33318
|
-
case 10: return [3 /*break*/, 13];
|
|
33319
|
-
case 11: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: sourceFileId })];
|
|
33320
|
-
case 12:
|
|
33321
|
-
result = _c.sent();
|
|
33322
|
-
if (result.success) {
|
|
33323
|
-
url = this._downloadLinkService.getDownloadForSignUrl(result.data);
|
|
33324
|
-
prms['Files'].push({
|
|
33325
|
-
"FileID": sourceFileId,
|
|
33326
|
-
"FileName": file.name,
|
|
33327
|
-
"URL": url,
|
|
33328
|
-
});
|
|
33329
|
-
}
|
|
33330
|
-
_c.label = 13;
|
|
33331
|
-
case 13:
|
|
33332
|
-
lstFile_1_1 = lstFile_1.next();
|
|
33333
|
-
return [3 /*break*/, 3];
|
|
33334
|
-
case 14: return [3 /*break*/, 17];
|
|
33335
|
-
case 15:
|
|
33336
|
-
e_2_1 = _c.sent();
|
|
33337
|
-
e_2 = { error: e_2_1 };
|
|
33338
|
-
return [3 /*break*/, 17];
|
|
33339
|
-
case 16:
|
|
33340
|
-
try {
|
|
33341
|
-
if (lstFile_1_1 && !lstFile_1_1.done && (_b = lstFile_1.return)) _b.call(lstFile_1);
|
|
33342
|
-
}
|
|
33343
|
-
finally { if (e_2) throw e_2.error; }
|
|
33344
|
-
return [7 /*endfinally*/];
|
|
33345
|
-
case 17:
|
|
33346
|
-
json_prms = JSON.stringify(prms);
|
|
33347
|
-
vgca_sign_files(json_prms, function (result) {
|
|
33348
|
-
var _a;
|
|
33349
|
-
var resultObj = JSON.parse(result);
|
|
33350
|
-
if ((_a = resultObj.Files) === null || _a === void 0 ? void 0 : _a.length) {
|
|
33351
|
-
resultObj.Files.forEach(function (item) { return __awaiter(_this, void 0, void 0, function () {
|
|
33352
|
-
var _this = this;
|
|
33353
|
-
return __generator(this, function (_b) {
|
|
33354
|
-
this._fileExplorerService.saveSignedFile({
|
|
33355
|
-
sourceFile: { id: item.FileID },
|
|
33356
|
-
tempFileId: item.FileSignedURL,
|
|
33357
|
-
}).then(function (rss) {
|
|
33358
|
-
_this._triggerProcessData();
|
|
33359
|
-
_this._notifierService.showSuccess('Ký số thành công');
|
|
33360
|
-
});
|
|
33361
|
-
return [2 /*return*/];
|
|
33362
|
-
});
|
|
33363
|
-
}); });
|
|
33364
|
-
}
|
|
33365
|
-
;
|
|
33366
|
-
});
|
|
33367
|
-
_c.label = 18;
|
|
33368
|
-
case 18:
|
|
33369
|
-
;
|
|
33370
|
-
return [2 /*return*/];
|
|
33371
|
-
}
|
|
33372
|
-
});
|
|
33373
|
-
});
|
|
33374
|
-
};
|
|
33375
33619
|
return FileManagerComponent;
|
|
33376
33620
|
}(DataListBase));
|
|
33377
33621
|
FileManagerComponent.decorators = [
|
|
33378
33622
|
{ type: i0.Component, args: [{
|
|
33379
33623
|
// tslint:disable-next-line: component-selector
|
|
33380
33624
|
selector: 'file-manager',
|
|
33381
|
-
template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"p-grid fm-toolbar\">\r\n <div class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n <div *ngIf=\"!readonly && rootFolderId\" class=\"fm-toolbar-buttons\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c\" tooltipPosition=\"top\"\r\n icon=\"pi pi-folder\" class=\"p-button-text p-button-rounded\" iconPos=\"left\" (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i l\u00EAn\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-rounded p-button-text p-button-primary\" (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\" iconPos=\"left\"\r\n (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <ng-container *ngIf=\"canSetMove()\">\r\n <button class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"\u0110\u1EB7t \u1EDF \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\" iconPos=\"left\"\r\n (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button icon=\"pi pi-undo\" pButton class=\"p-button-rounded p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF qua\" tooltipPosition=\"top\" (click)=\"cancelMove()\">\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasSelect()\">\r\n <button class=\"p-button-rounded p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n <button *ngIf=\"!control.uploadOnly\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"K\u00FD s\u1ED1 nhi\u1EC1u\" tooltipPosition=\"top\" icon=\"fas fa-signature\" iconPos=\"left\"\r\n label=\"K\u00FD s\u1ED1 nhi\u1EC1u\" (click)=\"signMultiple()\">\r\n </button>\r\n <button pButton type=\"button\" pTooltip=\"{{ 'X\u00F3a' | translate }}\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\" iconPos=\"left\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" class=\"--auto-height-content --no-wrapper-padding\"\r\n (onReload)=\"_triggerProcessData($event)\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\"\r\n (click)=\"openObject(rowData)\">\r\n </span>\r\n\r\n <span class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n {{rowData.name}}\r\n <div *ngIf=\"rowData.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\"\r\n pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"nfl-toolbar\">\r\n <button *ngIf=\"!readonly\" type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"fas fa-cloud-upload-alt\" label=\"T\u1EA3i l\u00EAn\" (click)=\"selectFile()\"></button>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon\">\r\n </span>\r\n <a class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n <span>{{rowData.name}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n </div>\r\n\r\n <div class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\" pTooltip=\"X\u00F3a\"\r\n tooltipPosition=\"top\" icon=\"pi pi-trash\" (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p-fileUpload #fileControl [name]=\"fileInForm\" mode=\"basic\" [ngStyle]=\"{'display': 'none'}\" [chooseLabel]=\"chooseLabel\"\r\n [multiple]=\"control?control.multiple:false\" [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" [readonly]=\"readonly\" (onClose)=\"closeFileViewer()\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<!--<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>\r\n\r\n<signature-detail *ngIf=\"forms.signatureDetail.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.signatureDetail.formData\">\r\n</signature-detail> -->",
|
|
33625
|
+
template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"p-grid fm-toolbar\">\r\n <div class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n <div *ngIf=\"!readonly && rootFolderId\" class=\"fm-toolbar-buttons\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c\" tooltipPosition=\"top\"\r\n icon=\"pi pi-folder\" class=\"p-button-text p-button-rounded\" iconPos=\"left\" (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i l\u00EAn\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-rounded p-button-text p-button-primary\" (click)=\"selectFile()\"></button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\" iconPos=\"left\"\r\n (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <ng-container *ngIf=\"canSetMove()\">\r\n <button class=\"p-button-rounded p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"\u0110\u1EB7t \u1EDF \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\" iconPos=\"left\"\r\n (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button icon=\"pi pi-undo\" pButton class=\"p-button-rounded p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF qua\" tooltipPosition=\"top\" (click)=\"cancelMove()\">\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"hasSelect()\">\r\n <button class=\"p-button-rounded p-button-text p-button-secondary\" pButton type=\"button\"\r\n pTooltip=\"N\u00E9n & t\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\" iconPos=\"left\"\r\n (click)=\"downloadMultiple()\">\r\n </button>\r\n\r\n <button pButton type=\"button\" pTooltip=\"{{ 'X\u00F3a' | translate }}\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\" iconPos=\"left\" class=\"p-button-rounded p-button-text p-button-danger\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"fm-grid\">\r\n <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"_dataSource\"\r\n [disableKeypressControl]=\"true\" [showScrollBar]=\"false\" class=\"--auto-height-content --no-wrapper-padding\"\r\n (onReload)=\"_triggerProcessData($event)\" (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\"\r\n (click)=\"openObject(rowData)\">\r\n </span>\r\n\r\n <span class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n {{rowData.name}}\r\n <div *ngIf=\"rowData.signatures\" class=\"pull-right signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template #fileSize let-rowData='rowData'>\r\n <div *ngIf=\"rowData.isFile\">{{rowData.fileSize | fileSize}}</div>\r\n </ng-template>\r\n\r\n <ng-template #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <div class=\"function-list\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\"\r\n pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </crud-list>\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"layout == _layout.SIMPLE\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div class=\"nfl-toolbar\">\r\n <button *ngIf=\"!readonly\" type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"fas fa-cloud-upload-alt\" label=\"T\u1EA3i l\u00EAn\" (click)=\"selectFile()\"></button>\r\n </div>\r\n\r\n <div class=\"nfl-grid\">\r\n <div *ngFor=\"let rowData of _dataSource; index as i\" class=\"nfl-item\">\r\n <div class=\"nfl-no\">\r\n {{i + 1}}.\r\n </div>\r\n\r\n <div class=\"nfl-name\">\r\n <span class=\"pull-left file-ex-icon\" [innerHTML]=\"rowData.name | fileIcon\">\r\n </span>\r\n <a class=\"{{rowData.class}} file-ex-name\" (click)=\"openObject(rowData)\">\r\n <span>{{rowData.name}}</span>\r\n <div *ngIf=\"rowData.signatures\" class=\"signature\" pTooltip=\"Xem chi ti\u1EBFt k\u00FD s\u1ED1\"\r\n tooltipPosition=\"top\" (click)=\"viewListSign($event, rowData.signatures)\">\r\n <i class=\"fas fa-signature\"></i>\r\n </div>\r\n </a>\r\n </div>\r\n\r\n <div class=\"nfl-version\">\r\n v{{rowData.currentFileVersion}}\r\n </div>\r\n\r\n <div class=\"nfl-function\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text\" pButton type=\"button\" tooltipPosition=\"top\"\r\n pTooltip=\"{{getButtonTooltip(rowData)}}\" icon=\"{{getButtonIcon(rowData)}}\"\r\n (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text\" pButton type=\"button\" pTooltip=\"X\u00F3a\"\r\n tooltipPosition=\"top\" icon=\"pi pi-trash\" (click)=\"deleteFile(rowData)\"></button>\r\n\r\n <button type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Th\u00EAm\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!_dataSource || !_dataSource.length\" class=\"nfl-no-item\">\r\n Ch\u01B0a c\u00F3 t\u00E0i li\u1EC7u \u0111\u01B0\u1EE3c t\u1EA3i l\u00EAn\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p-fileUpload #fileControl [name]=\"fileInForm\" mode=\"basic\" [ngStyle]=\"{'display': 'none'}\" [chooseLabel]=\"chooseLabel\"\r\n [multiple]=\"control.multiple\" [url]=\"apiUploadUrl\" [maxFileSize]=\"maxFileSize\" auto=\"true\"\r\n [invalidFileSizeMessageSummary]=\"invalidFileSizeMessageSummary\"\r\n [invalidFileSizeMessageDetail]=\"invalidFileSizeMessageDetail\"\r\n [invalidFileTypeMessageSummary]=\"invalidFileTypeMessageSummary\"\r\n [invalidFileTypeMessageDetail]=\"invalidFileTypeMessageDetail\"\r\n [invalidFileLimitMessageSummary]=\"invalidFileLimitMessageSummary\"\r\n [invalidFileLimitMessageDetail]=\"invalidFileLimitMessageDetail\" (onProgress)=\"onUploadProgress($event)\"\r\n (onBeforeUpload)=\"onBeforeUpload($event)\" (onSelect)=\"handleSelectFile($event)\" (onUpload)=\"onUploaded($event)\">\r\n</p-fileUpload>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"data.itemsMenuFile\" styleClass=\"fm-contextMenu-panel\">\r\n</p-contextMenu>\r\n\r\n<!-- T\u1EA1o m\u1EDBi/ \u0111\u1ED5i t\u00EAn th\u01B0 m\u1EE5c -->\r\n<tn-dialog *ngIf=\"forms.createFolder.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.createFolder.header | translate\" [popupSize]=\"forms[formIds.createFolder].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.createFolder)\">\r\n <folder-form #formBase [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms[formIds.createFolder].formData\" (onSaved)=\"onSavedForm(formIds.createFolder)\"\r\n (onCancel)=\"onCancelForm(formIds.createFolder)\">\r\n </folder-form>\r\n</tn-dialog>\r\n\r\n<!-- \u0110\u1ED5i t\u00EAn file -->\r\n<tn-dialog *ngIf=\"forms.renameFile.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.renameFile.header | translate\" [popupSize]=\"forms[formIds.renameFile].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.renameFile)\">\r\n <file-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"forms[formIds.renameFile].formData\"\r\n (onSaved)=\"onSavedForm(formIds.renameFile)\" (onCancel)=\"onCancelForm(formIds.renameFile)\">\r\n </file-form>\r\n</tn-dialog>\r\n\r\n<!-- Xem file tr\u1EF1c tuy\u1EBFn -->\r\n<file-viewer *ngIf=\"forms.fileViewer.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [model]=\"forms.fileViewer.formData\" [readonly]=\"readonly\" (onClose)=\"closeFileViewer()\">\r\n</file-viewer>\r\n\r\n<!-- Xem phi\u00EAn b\u1EA3n -->\r\n<tn-dialog *ngIf=\"forms.fileVersionList.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.fileVersionList.header | translate\" [popupSize]=\"forms[formIds.fileVersionList].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.fileVersionList)\">\r\n <file-version-list *ngIf=\"forms.fileVersionList.show\" [parentModel]=\"model\" [parentContext]=\"context\"\r\n [fileId]=\"forms[formIds.fileVersionList].fileId\" [readonly]=\"readonly\">\r\n </file-version-list>\r\n</tn-dialog>\r\n\r\n<!--<share-file *ngIf=\"forms.shareFile.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFile.formData\">\r\n</share-file>\r\n\r\n<share-folder *ngIf=\"forms.shareFolder.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.shareFolder.formData\">\r\n</share-folder>\r\n\r\n<signature-detail *ngIf=\"forms.signatureDetail.show\" [parentDataModel]=\"model\" [parentDataContext]=\"context\"\r\n [model]=\"forms.signatureDetail.formData\">\r\n</signature-detail> -->",
|
|
33382
33626
|
providers: [
|
|
33383
33627
|
{
|
|
33384
33628
|
provide: forms.NG_VALUE_ACCESSOR,
|
|
@@ -34647,9 +34891,11 @@
|
|
|
34647
34891
|
this.decimalPlaces = 2;
|
|
34648
34892
|
this.viewMode = false;
|
|
34649
34893
|
this.inputStyleClass = '';
|
|
34894
|
+
this.thousandSeperator = '.';
|
|
34650
34895
|
this.onFocus = new i0.EventEmitter();
|
|
34651
34896
|
this.onBlur = new i0.EventEmitter();
|
|
34652
34897
|
this.onChanged = new i0.EventEmitter();
|
|
34898
|
+
this.locale = 'vi-VN';
|
|
34653
34899
|
}
|
|
34654
34900
|
Object.defineProperty(MaskComponent.prototype, "placeholder", {
|
|
34655
34901
|
set: function (value) {
|
|
@@ -34661,10 +34907,11 @@
|
|
|
34661
34907
|
configurable: true
|
|
34662
34908
|
});
|
|
34663
34909
|
MaskComponent.prototype.ngOnInit = function () {
|
|
34910
|
+
this.locale = this.thousandSeperator == '.' ? 'vi-VN' : 'en-US';
|
|
34664
34911
|
};
|
|
34665
34912
|
MaskComponent.prototype.writeValue = function (obj) {
|
|
34666
34913
|
if (obj) {
|
|
34667
|
-
this.model = this._numberPipe.transform(obj, '',
|
|
34914
|
+
this.model = this._numberPipe.transform(obj, '', this.locale);
|
|
34668
34915
|
this.value = Number(this.model);
|
|
34669
34916
|
}
|
|
34670
34917
|
else if (obj === 0) {
|
|
@@ -34682,7 +34929,7 @@
|
|
|
34682
34929
|
return 'separator.0';
|
|
34683
34930
|
};
|
|
34684
34931
|
MaskComponent.prototype.getThousandSeperator = function () {
|
|
34685
|
-
return '.';
|
|
34932
|
+
return this.thousandSeperator || '.';
|
|
34686
34933
|
};
|
|
34687
34934
|
MaskComponent.prototype.handleFocus = function () {
|
|
34688
34935
|
this.onFocus.emit(this.value);
|
|
@@ -34714,7 +34961,7 @@
|
|
|
34714
34961
|
}
|
|
34715
34962
|
};
|
|
34716
34963
|
MaskComponent.prototype.numberToStringVN = function (number) {
|
|
34717
|
-
return this._numberPipe.transform(number, '',
|
|
34964
|
+
return this._numberPipe.transform(number, '', this.locale);
|
|
34718
34965
|
};
|
|
34719
34966
|
MaskComponent.prototype.registerOnChange = function (fn) {
|
|
34720
34967
|
this.onChange = fn;
|
|
@@ -34759,6 +35006,7 @@
|
|
|
34759
35006
|
decimalPlaces: [{ type: i0.Input }],
|
|
34760
35007
|
viewMode: [{ type: i0.Input }],
|
|
34761
35008
|
inputStyleClass: [{ type: i0.Input }],
|
|
35009
|
+
thousandSeperator: [{ type: i0.Input }],
|
|
34762
35010
|
onFocus: [{ type: i0.Output }],
|
|
34763
35011
|
onBlur: [{ type: i0.Output }],
|
|
34764
35012
|
onChanged: [{ type: i0.Output }]
|
|
@@ -45266,8 +45514,10 @@
|
|
|
45266
45514
|
},] }
|
|
45267
45515
|
];
|
|
45268
45516
|
|
|
45517
|
+
var moment$1 = moment___namespace;
|
|
45269
45518
|
var TnDatePipe = /** @class */ (function () {
|
|
45270
|
-
function TnDatePipe() {
|
|
45519
|
+
function TnDatePipe(format) {
|
|
45520
|
+
this.format = format;
|
|
45271
45521
|
}
|
|
45272
45522
|
TnDatePipe.prototype.addZero = function (value) {
|
|
45273
45523
|
if (value < 10)
|
|
@@ -45277,6 +45527,8 @@
|
|
|
45277
45527
|
TnDatePipe.prototype.transform = function (value, args) {
|
|
45278
45528
|
if (value == null)
|
|
45279
45529
|
return '';
|
|
45530
|
+
if (this.format)
|
|
45531
|
+
return moment$1(value).format(this.format);
|
|
45280
45532
|
var date = new Date(value);
|
|
45281
45533
|
return this.addZero(date.getHours()) + ":" + this.addZero(date.getMinutes()) + ":" + this.addZero(date.getSeconds()) + ", Ng\u00E0y " + this.addZero(date.getDate()) + "/" + this.addZero(date.getMonth() + 1) + "/" + date.getFullYear();
|
|
45282
45534
|
};
|
|
@@ -45286,7 +45538,10 @@
|
|
|
45286
45538
|
{ type: i0.Pipe, args: [{
|
|
45287
45539
|
name: 'tnDate'
|
|
45288
45540
|
},] }
|
|
45289
|
-
];
|
|
45541
|
+
];
|
|
45542
|
+
TnDatePipe.ctorParameters = function () { return [
|
|
45543
|
+
{ type: undefined, decorators: [{ type: i0.Inject, args: [i0.LOCALE_ID,] }] }
|
|
45544
|
+
]; };
|
|
45290
45545
|
|
|
45291
45546
|
var UserFormatPipe = /** @class */ (function () {
|
|
45292
45547
|
function UserFormatPipe(_userService) {
|
|
@@ -47133,6 +47388,67 @@
|
|
|
47133
47388
|
{ type: ModuleConfigService }
|
|
47134
47389
|
]; };
|
|
47135
47390
|
|
|
47391
|
+
var OrganizationBaseService = /** @class */ (function (_super) {
|
|
47392
|
+
__extends(OrganizationBaseService, _super);
|
|
47393
|
+
function OrganizationBaseService(http, injector, _moduleConfigService) {
|
|
47394
|
+
var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.organizationEndpoint + "/organization") || this;
|
|
47395
|
+
_this.ORGANIZATION_INFO_KEY = 'organization_info';
|
|
47396
|
+
_this.RETRY_COUNT = 0;
|
|
47397
|
+
_this.REPLAY_COUNT = 10;
|
|
47398
|
+
_this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.organizationEndpoint;
|
|
47399
|
+
_this._moduleConfig = _moduleConfigService.getConfig();
|
|
47400
|
+
_this.organizationEndpoint = _this._moduleConfig.environment.apiDomain.organizationEndpoint + "/organization/";
|
|
47401
|
+
return _this;
|
|
47402
|
+
}
|
|
47403
|
+
OrganizationBaseService.prototype.getOrganizationInfo = function (organizationId) {
|
|
47404
|
+
var _this = this;
|
|
47405
|
+
var storageItem = localStorage.getItem(this.ORGANIZATION_INFO_KEY + "_" + organizationId);
|
|
47406
|
+
var organization = JSON.parse(storageItem);
|
|
47407
|
+
if (organization) {
|
|
47408
|
+
return new Promise(function (resolve, reject) { return resolve(organization); });
|
|
47409
|
+
}
|
|
47410
|
+
else {
|
|
47411
|
+
return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
47412
|
+
var svUrl, result;
|
|
47413
|
+
var _this = this;
|
|
47414
|
+
return __generator(this, function (_a) {
|
|
47415
|
+
switch (_a.label) {
|
|
47416
|
+
case 0:
|
|
47417
|
+
if (!(organizationId == null)) return [3 /*break*/, 1];
|
|
47418
|
+
reject({});
|
|
47419
|
+
return [3 /*break*/, 3];
|
|
47420
|
+
case 1:
|
|
47421
|
+
if (!(organizationId > 0)) return [3 /*break*/, 3];
|
|
47422
|
+
svUrl = this.serviceUri + "/GetOrganizationInfo?id=" + organizationId;
|
|
47423
|
+
return [4 /*yield*/, this._http.get(svUrl).pipe(operators.shareReplay(this.REPLAY_COUNT), operators.retry(this.RETRY_COUNT), operators.map(function (repsonse) {
|
|
47424
|
+
// save response to local storage here
|
|
47425
|
+
localStorage.setItem(_this.ORGANIZATION_INFO_KEY + "_" + repsonse.data.id, JSON.stringify(repsonse.data));
|
|
47426
|
+
return repsonse.data;
|
|
47427
|
+
}, operators.catchError(function (err) { return _this.handleError(err, _this._injector); }))).toPromise()];
|
|
47428
|
+
case 2:
|
|
47429
|
+
result = _a.sent();
|
|
47430
|
+
resolve(result);
|
|
47431
|
+
_a.label = 3;
|
|
47432
|
+
case 3: return [2 /*return*/];
|
|
47433
|
+
}
|
|
47434
|
+
});
|
|
47435
|
+
}); });
|
|
47436
|
+
}
|
|
47437
|
+
};
|
|
47438
|
+
return OrganizationBaseService;
|
|
47439
|
+
}(BaseService));
|
|
47440
|
+
OrganizationBaseService.ɵprov = i0.ɵɵdefineInjectable({ factory: function OrganizationBaseService_Factory() { return new OrganizationBaseService(i0.ɵɵinject(i1$1.HttpClient), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(ModuleConfigService)); }, token: OrganizationBaseService, providedIn: "root" });
|
|
47441
|
+
OrganizationBaseService.decorators = [
|
|
47442
|
+
{ type: i0.Injectable, args: [{
|
|
47443
|
+
providedIn: 'root'
|
|
47444
|
+
},] }
|
|
47445
|
+
];
|
|
47446
|
+
OrganizationBaseService.ctorParameters = function () { return [
|
|
47447
|
+
{ type: i1$1.HttpClient },
|
|
47448
|
+
{ type: i0.Injector },
|
|
47449
|
+
{ type: ModuleConfigService }
|
|
47450
|
+
]; };
|
|
47451
|
+
|
|
47136
47452
|
var ErrorType = /** @class */ (function () {
|
|
47137
47453
|
function ErrorType() {
|
|
47138
47454
|
}
|
|
@@ -47261,6 +47577,66 @@
|
|
|
47261
47577
|
return TemplateTextMany;
|
|
47262
47578
|
}());
|
|
47263
47579
|
|
|
47580
|
+
var FileUploadSetting = /** @class */ (function () {
|
|
47581
|
+
function FileUploadSetting(init) {
|
|
47582
|
+
this.entityKeyField = 'id';
|
|
47583
|
+
this.readonly = false;
|
|
47584
|
+
this.disabled = false;
|
|
47585
|
+
this.sharedFolderType = exports.SharedFolderType.Tempt;
|
|
47586
|
+
this.mode = exports.FileUploadMode.usingServiceFile;
|
|
47587
|
+
this.layout = exports.EnumFileLayout.LIST;
|
|
47588
|
+
this.multiple = false;
|
|
47589
|
+
this.uploadOnly = false;
|
|
47590
|
+
this.useBreadcrumbs = true;
|
|
47591
|
+
this.useSignature = true;
|
|
47592
|
+
this.control = new FileUploadControlSchema();
|
|
47593
|
+
for (var key in init) {
|
|
47594
|
+
this[key] = init[key];
|
|
47595
|
+
}
|
|
47596
|
+
this.control = new FileUploadControlSchema({
|
|
47597
|
+
serviceCode: this.serviceCode,
|
|
47598
|
+
entity: this.entity,
|
|
47599
|
+
entityKeyField: this.entityKeyField,
|
|
47600
|
+
readonly: this.readonly,
|
|
47601
|
+
accept: this.accept,
|
|
47602
|
+
mode: this.mode,
|
|
47603
|
+
layout: this.layout,
|
|
47604
|
+
sharedFolderType: this.sharedFolderType,
|
|
47605
|
+
fileDataService: this.fileDataService,
|
|
47606
|
+
multiple: this.multiple,
|
|
47607
|
+
disabled: this.disabled
|
|
47608
|
+
});
|
|
47609
|
+
}
|
|
47610
|
+
return FileUploadSetting;
|
|
47611
|
+
}());
|
|
47612
|
+
var FileManagerSetting = /** @class */ (function () {
|
|
47613
|
+
function FileManagerSetting(init) {
|
|
47614
|
+
this.mode = exports.FileManagerMode.multiple;
|
|
47615
|
+
this.layout = exports.EnumFileLayout.SIMPLE;
|
|
47616
|
+
this.readonly = true;
|
|
47617
|
+
this.inTaiLieu = false;
|
|
47618
|
+
this.inTaiLieuChung = false;
|
|
47619
|
+
this.copyToFolderId = '';
|
|
47620
|
+
this.entityKeyField = 'id';
|
|
47621
|
+
this.control = new FileManagerControlSchema();
|
|
47622
|
+
for (var key in init) {
|
|
47623
|
+
this[key] = init[key];
|
|
47624
|
+
}
|
|
47625
|
+
this.control = new FileManagerControlSchema({
|
|
47626
|
+
serviceCode: this.serviceCode,
|
|
47627
|
+
entity: this.entity,
|
|
47628
|
+
entityKeyField: this.entityKeyField,
|
|
47629
|
+
readonly: this.readonly,
|
|
47630
|
+
accept: this.accept,
|
|
47631
|
+
mode: this.mode,
|
|
47632
|
+
layout: this.layout,
|
|
47633
|
+
fileDataService: this.fileDataService,
|
|
47634
|
+
rootFolderName: this.rootFolderName
|
|
47635
|
+
});
|
|
47636
|
+
}
|
|
47637
|
+
return FileManagerSetting;
|
|
47638
|
+
}());
|
|
47639
|
+
|
|
47264
47640
|
(function (PermissionBase) {
|
|
47265
47641
|
PermissionBase[PermissionBase["READ"] = 1] = "READ";
|
|
47266
47642
|
PermissionBase[PermissionBase["EDIT"] = 2] = "EDIT";
|
|
@@ -47619,10 +47995,12 @@
|
|
|
47619
47995
|
exports.FileExplorerService = FileExplorerService;
|
|
47620
47996
|
exports.FileManagerComponent = FileManagerComponent;
|
|
47621
47997
|
exports.FileManagerControlSchema = FileManagerControlSchema;
|
|
47998
|
+
exports.FileManagerSetting = FileManagerSetting;
|
|
47622
47999
|
exports.FileObjectService = FileObjectService;
|
|
47623
48000
|
exports.FilePickerDialogComponent = FilePickerDialogComponent;
|
|
47624
48001
|
exports.FileUploadComponent = FileUploadComponent;
|
|
47625
48002
|
exports.FileUploadControlSchema = FileUploadControlSchema;
|
|
48003
|
+
exports.FileUploadSetting = FileUploadSetting;
|
|
47626
48004
|
exports.FileV4Service = FileV4Service;
|
|
47627
48005
|
exports.Filter = Filter;
|
|
47628
48006
|
exports.FolderService = FolderService;
|
|
@@ -47671,6 +48049,7 @@
|
|
|
47671
48049
|
exports.NumberCompareValidator = NumberCompareValidator;
|
|
47672
48050
|
exports.NumberOnlyValidator = NumberOnlyValidator;
|
|
47673
48051
|
exports.NumberRangeControlSchema = NumberRangeControlSchema;
|
|
48052
|
+
exports.OrganizationBaseService = OrganizationBaseService;
|
|
47674
48053
|
exports.OrganizationFormatPipe = OrganizationFormatPipe;
|
|
47675
48054
|
exports.OrganizationNameFormatPipe = OrganizationNameFormatPipe;
|
|
47676
48055
|
exports.OrganizationPickerControlSchema = OrganizationPickerControlSchema;
|