tnx-shared 5.0.68 → 5.0.69
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 +807 -575
- 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 +12 -151
- 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 -7
- 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/esm2015/tnx-shared.js +24 -22
- package/esm2015/tnx-shared.module.js +2 -4
- package/fesm2015/tnx-shared.js +530 -341
- 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 -6
- 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.d.ts +23 -21
- package/tnx-shared.d.ts.map +1 -1
- package/tnx-shared.metadata.json +1 -1
- package/tnx-shared.module.d.ts +2 -2
- package/tnx-shared.module.d.ts.map +1 -1
- package/tnx-shared.module.ngfactory.d.ts.map +1 -1
- package/components/file-explorer/signature-detail/signature-detail.component.d.ts +0 -8
- package/components/file-explorer/signature-detail/signature-detail.component.d.ts.map +0 -1
- package/components/file-explorer/signature-detail/signature-detail.component.ngfactory.d.ts.map +0 -1
- package/components/file-explorer/signature-detail/signature-detail.component.scss.shim.ngstyle.d.ts.map +0 -1
- package/esm2015/components/file-explorer/signature-detail/signature-detail.component.js +0 -66
|
@@ -28,9 +28,6 @@
|
|
|
28
28
|
|
|
29
29
|
var stringify__default = /*#__PURE__*/_interopDefaultLegacy(stringify);
|
|
30
30
|
var moment___namespace = /*#__PURE__*/_interopNamespace(moment_);
|
|
31
|
-
var moment___default = /*#__PURE__*/_interopDefaultLegacy(moment_);
|
|
32
|
-
var FileSaver__default = /*#__PURE__*/_interopDefaultLegacy(FileSaver);
|
|
33
|
-
var printJS___default = /*#__PURE__*/_interopDefaultLegacy(printJS_);
|
|
34
31
|
var printJS___namespace = /*#__PURE__*/_interopNamespace(printJS_);
|
|
35
32
|
var JWT___namespace = /*#__PURE__*/_interopNamespace(JWT_);
|
|
36
33
|
var jQuery___namespace = /*#__PURE__*/_interopNamespace(jQuery_);
|
|
@@ -398,7 +395,8 @@
|
|
|
398
395
|
MENU_CHANGED: 'MENU_CHANGED',
|
|
399
396
|
ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER: 'ADVANCE_SEARCH_INIT_WITHOUT_UPDATE_ROUTER',
|
|
400
397
|
SHOW_WAIT_BOX: 'SHOW_WAIT_BOX',
|
|
401
|
-
SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM'
|
|
398
|
+
SHOW_REJECT_CONFIRM: 'SHOW_REJECT_CONFIRM',
|
|
399
|
+
NEED_CLEAR_PERMISSION_CACHE: 'NEED_CLEAR_PERMISSION_CACHE'
|
|
402
400
|
};
|
|
403
401
|
ComCtxConstants.ROOT_USMART = {
|
|
404
402
|
SHOW_CONFIG_DATA_DEFAULT: 'SHOW_CONFIG_DATA_DEFAULT',
|
|
@@ -910,7 +908,7 @@
|
|
|
910
908
|
NotifierService.prototype.showWarningByReponse = function (res) {
|
|
911
909
|
var message = res.message;
|
|
912
910
|
if (!message)
|
|
913
|
-
message =
|
|
911
|
+
message = 'Có lỗi xảy ra, vui lòng liên hệ quản trị viên!';
|
|
914
912
|
this.showWarning(message);
|
|
915
913
|
};
|
|
916
914
|
NotifierService.prototype.showBusinessError = function (message, key, header, life) {
|
|
@@ -2363,6 +2361,14 @@
|
|
|
2363
2361
|
errorDetail: err
|
|
2364
2362
|
};
|
|
2365
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
|
+
};
|
|
2366
2372
|
return CommonService;
|
|
2367
2373
|
}());
|
|
2368
2374
|
CommonService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CommonService_Factory() { return new CommonService(i0.ɵɵinject(ModuleConfigService)); }, token: CommonService, providedIn: "root" });
|
|
@@ -3248,7 +3254,11 @@
|
|
|
3248
3254
|
EnumWorkflowCoreCodeSettingKey["MAC_DINH"] = "workflowCoreTrinhKy";
|
|
3249
3255
|
EnumWorkflowCoreCodeSettingKey["PHE_DUYET_2_BUOC"] = "workflowCoreTrinhKy2Buoc";
|
|
3250
3256
|
EnumWorkflowCoreCodeSettingKey["PHE_DUYET_3_BUOC"] = "workflowCoreTrinhKy3Buoc";
|
|
3251
|
-
})(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 = {}));
|
|
3252
3262
|
|
|
3253
3263
|
var ModelSchema = /** @class */ (function () {
|
|
3254
3264
|
function ModelSchema(init) {
|
|
@@ -3324,6 +3334,7 @@
|
|
|
3324
3334
|
this.function = new CrudListCustomFunction();
|
|
3325
3335
|
this.popupHeader = '';
|
|
3326
3336
|
this.popupSize = new PopupSize();
|
|
3337
|
+
this.showMenuButtons = true;
|
|
3327
3338
|
this.getCustomDataTrinhKy = function (rowData) { return ({}); };
|
|
3328
3339
|
this.getLabelButtonTrinhKy = function (rowData) { return 'Trình ký'; };
|
|
3329
3340
|
this.checkReadyToTrinhKy = function () { return true; };
|
|
@@ -3638,6 +3649,7 @@
|
|
|
3638
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
|
|
3639
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
|
|
3640
3651
|
_this.fireCallBackInside = true;
|
|
3652
|
+
_this.coreVersion = exports.EnumCoreVersion.V5;
|
|
3641
3653
|
_this.funcCompare = function (item, value) { return item[_this.valueField] == value; };
|
|
3642
3654
|
for (var key in init) {
|
|
3643
3655
|
_this[key] = init[key];
|
|
@@ -3691,6 +3703,7 @@
|
|
|
3691
3703
|
_this.prefix = '';
|
|
3692
3704
|
_this.suffix = '';
|
|
3693
3705
|
_this.decimalPlaces = 2;
|
|
3706
|
+
_this.thousandSeperator = '.';
|
|
3694
3707
|
for (var key in init) {
|
|
3695
3708
|
_this[key] = init[key];
|
|
3696
3709
|
}
|
|
@@ -3870,7 +3883,6 @@
|
|
|
3870
3883
|
_this.mode = exports.FileManagerMode.multiple;
|
|
3871
3884
|
_this.layout = exports.EnumFileLayout.LIST;
|
|
3872
3885
|
_this.readonly = false;
|
|
3873
|
-
_this.uploadOnly = false;
|
|
3874
3886
|
// Trường hợp ở trong form, dùng trường này để lấy
|
|
3875
3887
|
// entityKey từ model.data thay vì truyền vào entityKey
|
|
3876
3888
|
_this.entityKeyField = 'id';
|
|
@@ -4485,6 +4497,7 @@
|
|
|
4485
4497
|
DataType["decimal"] = "decimal";
|
|
4486
4498
|
DataType["boolean"] = "boolean";
|
|
4487
4499
|
DataType["enum"] = "enum";
|
|
4500
|
+
DataType["currency"] = "currency";
|
|
4488
4501
|
})(exports.DataType || (exports.DataType = {}));
|
|
4489
4502
|
(function (ControlType) {
|
|
4490
4503
|
ControlType["dropdown"] = "dropdown";
|
|
@@ -4556,7 +4569,34 @@
|
|
|
4556
4569
|
(function (ExportAllMode) {
|
|
4557
4570
|
ExportAllMode[ExportAllMode["ManualGetData"] = 0] = "ManualGetData";
|
|
4558
4571
|
ExportAllMode[ExportAllMode["AutoGetData"] = 1] = "AutoGetData";
|
|
4559
|
-
})(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 = {}));
|
|
4560
4600
|
|
|
4561
4601
|
var _a;
|
|
4562
4602
|
(function (WorkflowCoreStatusEnum) {
|
|
@@ -5998,14 +6038,24 @@
|
|
|
5998
6038
|
if (model.hasOwnProperty(sourceField)) {
|
|
5999
6039
|
valueFilter = model[sourceField];
|
|
6000
6040
|
if (canAccessSubField(valueFilter)) {
|
|
6001
|
-
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
|
+
}
|
|
6002
6047
|
}
|
|
6003
6048
|
}
|
|
6004
6049
|
else if (rootModel) {
|
|
6005
6050
|
if (rootModel.hasOwnProperty(sourceField)) {
|
|
6006
6051
|
valueFilter = rootModel[sourceField];
|
|
6007
6052
|
if (canAccessSubField(valueFilter)) {
|
|
6008
|
-
valueFilter
|
|
6053
|
+
if (isArray(valueFilter)) {
|
|
6054
|
+
valueFilter = valueFilter.map(function (x) { return x[subField]; });
|
|
6055
|
+
}
|
|
6056
|
+
else {
|
|
6057
|
+
valueFilter = valueFilter[subField];
|
|
6058
|
+
}
|
|
6009
6059
|
}
|
|
6010
6060
|
}
|
|
6011
6061
|
else {
|
|
@@ -6031,7 +6081,12 @@
|
|
|
6031
6081
|
finally { if (e_1) throw e_1.error; }
|
|
6032
6082
|
}
|
|
6033
6083
|
if (canAccessSubField(temp)) {
|
|
6034
|
-
|
|
6084
|
+
if (isArray(temp)) {
|
|
6085
|
+
valueFilter = temp.map(function (x) { return x[subField]; });
|
|
6086
|
+
}
|
|
6087
|
+
else {
|
|
6088
|
+
valueFilter = temp[subField];
|
|
6089
|
+
}
|
|
6035
6090
|
}
|
|
6036
6091
|
}
|
|
6037
6092
|
}
|
|
@@ -6044,6 +6099,9 @@
|
|
|
6044
6099
|
valueFilter = tmpFilter.funcGetValue(valueFilter);
|
|
6045
6100
|
}
|
|
6046
6101
|
tmpFilter.value = JSON.stringify(valueFilter);
|
|
6102
|
+
if (tmpFilter.modifyValue) {
|
|
6103
|
+
valueFilter = tmpFilter.modifyValue(valueFilter);
|
|
6104
|
+
}
|
|
6047
6105
|
tmpFilter.filters = [];
|
|
6048
6106
|
if (filter.logic && filter.filters) {
|
|
6049
6107
|
filter.filters.forEach(function (f) { return _this.deQuyReplaceValue(tmpFilter.filters, f, model, rootModel); });
|
|
@@ -6194,6 +6252,7 @@
|
|
|
6194
6252
|
});
|
|
6195
6253
|
};
|
|
6196
6254
|
CrudService.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
|
|
6255
|
+
data !== null && data !== void 0 ? data : (data = []);
|
|
6197
6256
|
var field = schema.field;
|
|
6198
6257
|
var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
|
|
6199
6258
|
if (schema.funcGetLabel) {
|
|
@@ -6486,6 +6545,24 @@
|
|
|
6486
6545
|
});
|
|
6487
6546
|
return this.postGridInfo(apiUrl, gridInfo);
|
|
6488
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
|
+
};
|
|
6489
6566
|
BaseService.prototype.getAllByGridInfo = function (gridInfo, plusUrl) {
|
|
6490
6567
|
if (plusUrl === void 0) { plusUrl = ''; }
|
|
6491
6568
|
var apiUrl = this.apiGetAll;
|
|
@@ -6956,7 +7033,7 @@
|
|
|
6956
7033
|
}());
|
|
6957
7034
|
|
|
6958
7035
|
// fix for build prod
|
|
6959
|
-
var printJS =
|
|
7036
|
+
var printJS = printJS___namespace;
|
|
6960
7037
|
var FileExplorerService = /** @class */ (function () {
|
|
6961
7038
|
function FileExplorerService(_http, _moduleConfig, _authenService, _commonSerivce, _moduleConfigService, _notifierService) {
|
|
6962
7039
|
this._http = _http;
|
|
@@ -7166,11 +7243,11 @@
|
|
|
7166
7243
|
return this._serviceUri + "/DownloadLink/" + hash;
|
|
7167
7244
|
};
|
|
7168
7245
|
FileExplorerService.prototype.getDownloadForSignUrl = function (hash) {
|
|
7169
|
-
return this._serviceUri + "/
|
|
7246
|
+
return this._serviceUri + "/Download/downloadforsign/" + hash;
|
|
7170
7247
|
};
|
|
7171
7248
|
FileExplorerService.prototype.generateLinkDownload = function (model) {
|
|
7172
7249
|
var _this = this;
|
|
7173
|
-
var svUrl = this._serviceUri + "/
|
|
7250
|
+
var svUrl = this._serviceUri + "/Download/GenerateDownloadLink";
|
|
7174
7251
|
if (model.isFileVersion && !model.fileVersionId) {
|
|
7175
7252
|
model.fileVersionId = model.fileId;
|
|
7176
7253
|
}
|
|
@@ -7200,7 +7277,7 @@
|
|
|
7200
7277
|
this._http.get(url, { responseType: 'blob' })
|
|
7201
7278
|
.toPromise()
|
|
7202
7279
|
.then(function (rs) {
|
|
7203
|
-
|
|
7280
|
+
FileSaver.saveAs(rs, fileName);
|
|
7204
7281
|
})
|
|
7205
7282
|
.catch(function (err) {
|
|
7206
7283
|
_this._notifierService.showWarning('Lỗi tải file');
|
|
@@ -7362,13 +7439,13 @@
|
|
|
7362
7439
|
return regex.test(ext);
|
|
7363
7440
|
};
|
|
7364
7441
|
FileExplorerService.prototype.saveSignedFile = function (data) {
|
|
7365
|
-
return this._http.post(this._serviceUri + "/
|
|
7442
|
+
return this._http.post(this._serviceUri + "/Signature/SaveSignedFile", data).toPromise();
|
|
7366
7443
|
};
|
|
7367
7444
|
FileExplorerService.prototype.getSignatureInfoByFileId = function (fileId) {
|
|
7368
|
-
return this._http.get(this._serviceUri + "/
|
|
7445
|
+
return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileId?fileId=" + fileId).toPromise();
|
|
7369
7446
|
};
|
|
7370
7447
|
FileExplorerService.prototype.getSignatureInfoByFileVersionId = function (fileVersionId) {
|
|
7371
|
-
return this._http.get(this._serviceUri + "/
|
|
7448
|
+
return this._http.get(this._serviceUri + "/Signature/GetListSignatureByFileVersionId?fileVersionId=" + fileVersionId).toPromise();
|
|
7372
7449
|
};
|
|
7373
7450
|
FileExplorerService.prototype.getUploadFileVersionApiUrl = function () {
|
|
7374
7451
|
return this._serviceUri + "/FileVersion/SaveVersionOnEdit";
|
|
@@ -7426,20 +7503,6 @@
|
|
|
7426
7503
|
var svUrl = this._serviceUri + "/FileObject/CreateServiceFileAnonymous";
|
|
7427
7504
|
return this._http.post(svUrl, serviceFileObjectDTO).pipe(operators.catchError(function (err) { return _this.handleError(err); })).toPromise();
|
|
7428
7505
|
};
|
|
7429
|
-
FileExplorerService.prototype.needConvertBeforeSign = function (fileName) {
|
|
7430
|
-
if (fileName.lastIndexOf('.') === -1) {
|
|
7431
|
-
return false;
|
|
7432
|
-
}
|
|
7433
|
-
var fileType = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
|
|
7434
|
-
if ((/(doc|docx|dot|dotm|dotx|xls|xlsx|ppt|pptx)$/i).test(fileType)) {
|
|
7435
|
-
return true;
|
|
7436
|
-
}
|
|
7437
|
-
return false;
|
|
7438
|
-
};
|
|
7439
|
-
FileExplorerService.prototype.changeFileExtension = function (fileName, newExtension) {
|
|
7440
|
-
var arr = fileName.split('.');
|
|
7441
|
-
return fileName.replace("." + arr[arr.length - 1], "." + newExtension);
|
|
7442
|
-
};
|
|
7443
7506
|
return FileExplorerService;
|
|
7444
7507
|
}());
|
|
7445
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" });
|
|
@@ -7887,9 +7950,6 @@
|
|
|
7887
7950
|
});
|
|
7888
7951
|
return promise;
|
|
7889
7952
|
};
|
|
7890
|
-
DownloadLinkService.prototype.getDownloadForSignUrl = function (hash) {
|
|
7891
|
-
return this.serviceUri + "/DownloadForSign/" + hash;
|
|
7892
|
-
};
|
|
7893
7953
|
return DownloadLinkService;
|
|
7894
7954
|
}(BaseService));
|
|
7895
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" });
|
|
@@ -8881,6 +8941,7 @@
|
|
|
8881
8941
|
}
|
|
8882
8942
|
else {
|
|
8883
8943
|
this._applicationContext.getRootContext().replaySubscribeOnce(ComCtxConstants.ROOT.USER_READY, function (rs) {
|
|
8944
|
+
var firstTimeLogin = rs;
|
|
8884
8945
|
var accessToken = _this._oauthService.getAccessToken();
|
|
8885
8946
|
var decoded = JWT.default(accessToken);
|
|
8886
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
|
|
@@ -8922,7 +8983,12 @@
|
|
|
8922
8983
|
localStorage.setItem(_this.CURRENT_USER_KEY, JSON.stringify(user));
|
|
8923
8984
|
}
|
|
8924
8985
|
_this._applicationContext.getRootContext().data.currentUser = user;
|
|
8925
|
-
|
|
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
|
+
}
|
|
8926
8992
|
}, function (err) {
|
|
8927
8993
|
});
|
|
8928
8994
|
});
|
|
@@ -9482,9 +9548,12 @@
|
|
|
9482
9548
|
_this.delayCheckPermissions = [];
|
|
9483
9549
|
_this.ignoreAdmin = false;
|
|
9484
9550
|
_this.appCode = null;
|
|
9551
|
+
if (_moduleConfigService.getConfig().environment.authenticationSettings.coreVersion == 'v4') {
|
|
9552
|
+
_this.serviceUri = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint + "/permission";
|
|
9553
|
+
}
|
|
9485
9554
|
_this.endPoint = _moduleConfigService.getConfig().environment.apiDomain.authorizationEndpoint;
|
|
9486
|
-
_this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
|
|
9487
9555
|
_this.appCode = _this._moduleConfigService.getConfig().appCode;
|
|
9556
|
+
_this.ignoreAdmin = _this._moduleConfigService.getConfig().environment.isIgnoreAdmin;
|
|
9488
9557
|
return _this;
|
|
9489
9558
|
}
|
|
9490
9559
|
/**
|
|
@@ -9706,6 +9775,10 @@
|
|
|
9706
9775
|
}
|
|
9707
9776
|
});
|
|
9708
9777
|
};
|
|
9778
|
+
PermissionService.prototype.clearPermissionCache = function (lstModule) {
|
|
9779
|
+
var url = this.serviceUri + "/ClearPermissionCache";
|
|
9780
|
+
return this.defaultPost(url, lstModule);
|
|
9781
|
+
};
|
|
9709
9782
|
return PermissionService;
|
|
9710
9783
|
}(BaseService));
|
|
9711
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" });
|
|
@@ -10080,7 +10153,7 @@
|
|
|
10080
10153
|
if (service == undefined) {
|
|
10081
10154
|
(this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
|
|
10082
10155
|
}
|
|
10083
|
-
this.serviceUri = service.endPoint + "/EntityWorkflowHistory";
|
|
10156
|
+
this.serviceUri = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory";
|
|
10084
10157
|
};
|
|
10085
10158
|
EntityWorkflowHistoryService.prototype.getLastHistory = function (tableName, filters) {
|
|
10086
10159
|
if (filters === void 0) { filters = []; }
|
|
@@ -10088,7 +10161,7 @@
|
|
|
10088
10161
|
if (service == undefined) {
|
|
10089
10162
|
(this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow history');
|
|
10090
10163
|
}
|
|
10091
|
-
var url = service.endPoint + "/EntityWorkflowHistory/GetLastByFilter";
|
|
10164
|
+
var url = service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowHistory/GetLastByFilter";
|
|
10092
10165
|
var gridInfo = {
|
|
10093
10166
|
pageInfo: {
|
|
10094
10167
|
page: 1,
|
|
@@ -10245,7 +10318,7 @@
|
|
|
10245
10318
|
(this._injector.get(NotifierService)).showWarning('Bạn chưa đăng ký base service cho entity workflow setting');
|
|
10246
10319
|
}
|
|
10247
10320
|
return new Promise(function (resolve, reject) {
|
|
10248
|
-
_this.defaultPost(service.endPoint + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
|
|
10321
|
+
_this.defaultPost(service.endPoint + "/" + _this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/GetSetting/" + service.entityName, {})
|
|
10249
10322
|
.then(function (res) {
|
|
10250
10323
|
if (res.success) {
|
|
10251
10324
|
var itemSetting = res.data;
|
|
@@ -10330,11 +10403,11 @@
|
|
|
10330
10403
|
};
|
|
10331
10404
|
EntityWorkflowSettingService.prototype.saveSetting = function (settingKey, data) {
|
|
10332
10405
|
var service = this.serviceManagers[settingKey];
|
|
10333
|
-
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);
|
|
10334
10407
|
};
|
|
10335
10408
|
EntityWorkflowSettingService.prototype.removeSetting = function (settingKey) {
|
|
10336
10409
|
var service = this.serviceManagers[settingKey];
|
|
10337
|
-
return this.defaultPost(service.endPoint + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
|
|
10410
|
+
return this.defaultPost(service.endPoint + "/" + this._moduleConfig.environment.apiVersion + "/EntityWorkflowSetting/RemoveSetting/" + service.entityName, {});
|
|
10338
10411
|
};
|
|
10339
10412
|
return EntityWorkflowSettingService;
|
|
10340
10413
|
}(BaseService));
|
|
@@ -11148,25 +11221,37 @@
|
|
|
11148
11221
|
});
|
|
11149
11222
|
});
|
|
11150
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
|
+
};
|
|
11151
11231
|
DataListBase.prototype._edit = function (rowData, scopeDataEdit) {
|
|
11152
11232
|
if (scopeDataEdit === void 0) { scopeDataEdit = {}; }
|
|
11153
11233
|
return __awaiter(this, void 0, void 0, function () {
|
|
11154
|
-
var flashShow;
|
|
11234
|
+
var resultValidate, flashShow;
|
|
11155
11235
|
return __generator(this, function (_a) {
|
|
11156
11236
|
switch (_a.label) {
|
|
11157
|
-
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
|
+
}
|
|
11158
11243
|
flashShow = rowData[KeyFlashShow];
|
|
11159
11244
|
delete rowData[KeyFlashShow];
|
|
11160
11245
|
this.formModel.formState = exports.FormState.EDIT;
|
|
11161
11246
|
return [4 /*yield*/, this.beforeEdit()];
|
|
11162
|
-
case
|
|
11247
|
+
case 2:
|
|
11163
11248
|
_a.sent();
|
|
11164
11249
|
this.setting.popupHeader = "C\u1EADp nh\u1EADt " + this.setting.objectName;
|
|
11165
11250
|
this.setting.maskClass = flashShow ? 'hide' : null;
|
|
11166
11251
|
this.scopeDataEdit = scopeDataEdit;
|
|
11167
11252
|
this.formModel.data = this.cloneData(rowData);
|
|
11168
11253
|
return [4 /*yield*/, this.modifyEditModel(rowData)];
|
|
11169
|
-
case
|
|
11254
|
+
case 3:
|
|
11170
11255
|
_a.sent();
|
|
11171
11256
|
this.formModel.data[KeyFlashShow] = flashShow;
|
|
11172
11257
|
this.showDetailForm = true;
|
|
@@ -11197,34 +11282,56 @@
|
|
|
11197
11282
|
DataListBase.prototype.getPromiseDeleteItem = function (rowData) {
|
|
11198
11283
|
return this.setting.baseService.delete(rowData.id);
|
|
11199
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
|
+
};
|
|
11200
11292
|
DataListBase.prototype._delete = function (rowData) {
|
|
11201
|
-
|
|
11202
|
-
|
|
11203
|
-
|
|
11204
|
-
|
|
11205
|
-
|
|
11206
|
-
|
|
11207
|
-
|
|
11208
|
-
|
|
11209
|
-
if (_this.setting.baseService) {
|
|
11210
|
-
_this.getPromiseDeleteItem(rowData)
|
|
11211
|
-
.then(function (response) {
|
|
11212
|
-
if (response.success) {
|
|
11213
|
-
if (_this.setting.showVersionButton) {
|
|
11214
|
-
_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*/];
|
|
11215
11301
|
}
|
|
11216
|
-
|
|
11217
|
-
|
|
11302
|
+
return [4 /*yield*/, this.validateDelete(rowData)];
|
|
11303
|
+
case 1:
|
|
11304
|
+
resultValidate = _a.sent();
|
|
11305
|
+
if (!resultValidate) {
|
|
11306
|
+
return [2 /*return*/];
|
|
11218
11307
|
}
|
|
11219
|
-
|
|
11220
|
-
|
|
11221
|
-
|
|
11222
|
-
|
|
11223
|
-
|
|
11224
|
-
|
|
11225
|
-
|
|
11226
|
-
|
|
11227
|
-
|
|
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
|
+
});
|
|
11228
11335
|
});
|
|
11229
11336
|
};
|
|
11230
11337
|
DataListBase.prototype.getPromiseDeleteItems = function (items) {
|
|
@@ -11565,7 +11672,7 @@
|
|
|
11565
11672
|
arrPromiseDontNeedWait = [];
|
|
11566
11673
|
arrSchemaDontNeedWait = [];
|
|
11567
11674
|
_loop_1 = function (schema) {
|
|
11568
|
-
var field, arrValue_1, promise, result, funcGetLabel_1;
|
|
11675
|
+
var field, arrValue_1, promise, filters, result, funcGetLabel_1;
|
|
11569
11676
|
return __generator(this, function (_a) {
|
|
11570
11677
|
switch (_a.label) {
|
|
11571
11678
|
case 0:
|
|
@@ -11600,7 +11707,11 @@
|
|
|
11600
11707
|
promise = schema.baseService.getDataDropdown(schema.groupCode, arrValue_1, this_1.createDropdownOptions(schema));
|
|
11601
11708
|
}
|
|
11602
11709
|
else {
|
|
11603
|
-
|
|
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));
|
|
11604
11715
|
}
|
|
11605
11716
|
if (!(schema.order != null)) return [3 /*break*/, 2];
|
|
11606
11717
|
return [4 /*yield*/, promise];
|
|
@@ -11678,6 +11789,7 @@
|
|
|
11678
11789
|
});
|
|
11679
11790
|
};
|
|
11680
11791
|
DataListBase.prototype.mergeRefDataToDatasource = function (dataSource, schema, data) {
|
|
11792
|
+
data !== null && data !== void 0 ? data : (data = []);
|
|
11681
11793
|
var field = schema.field;
|
|
11682
11794
|
var funcGetLabel = function (item) { return item[schema.displayField] || item['label']; };
|
|
11683
11795
|
if (schema.funcGetLabel) {
|
|
@@ -14726,6 +14838,10 @@
|
|
|
14726
14838
|
});
|
|
14727
14839
|
this.onModelChanged.emit(event);
|
|
14728
14840
|
}
|
|
14841
|
+
else {
|
|
14842
|
+
this._rootNode = new ControlTreeNode(this._modelData, this.formControls);
|
|
14843
|
+
this._rootNode.setCrudForm(this);
|
|
14844
|
+
}
|
|
14729
14845
|
},
|
|
14730
14846
|
enumerable: false,
|
|
14731
14847
|
configurable: true
|
|
@@ -15985,18 +16101,24 @@
|
|
|
15985
16101
|
return __generator(this, function (_d) {
|
|
15986
16102
|
switch (_d.label) {
|
|
15987
16103
|
case 0:
|
|
15988
|
-
if (!control.multiple) return [3 /*break*/,
|
|
16104
|
+
if (!control.multiple) return [3 /*break*/, 5];
|
|
15989
16105
|
if (!(eventType == 'hide')) return [3 /*break*/, 2];
|
|
15990
16106
|
return [4 /*yield*/, this.handleFieldValueChange(control, event, 'change', parentModel, parentPath, sourceNode, bubble)];
|
|
15991
16107
|
case 1:
|
|
15992
16108
|
_d.sent();
|
|
15993
|
-
|
|
15994
|
-
case 2:
|
|
15995
|
-
|
|
15996
|
-
|
|
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:
|
|
15997
16114
|
_d.sent();
|
|
15998
|
-
_d.label =
|
|
15999
|
-
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*/];
|
|
16000
16122
|
}
|
|
16001
16123
|
});
|
|
16002
16124
|
});
|
|
@@ -16949,7 +17071,7 @@
|
|
|
16949
17071
|
CrudFormComponent.decorators = [
|
|
16950
17072
|
{ type: i0.Component, args: [{
|
|
16951
17073
|
selector: 'crud-form',
|
|
16952
|
-
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",
|
|
16953
17075
|
providers: [ComponentContextService],
|
|
16954
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}"]
|
|
16955
17077
|
},] }
|
|
@@ -18132,7 +18254,7 @@
|
|
|
18132
18254
|
this.onSaved.emit();
|
|
18133
18255
|
return [3 /*break*/, 3];
|
|
18134
18256
|
case 2:
|
|
18135
|
-
this.handleInsertError();
|
|
18257
|
+
this.handleInsertError(response);
|
|
18136
18258
|
_a.label = 3;
|
|
18137
18259
|
case 3: return [2 /*return*/];
|
|
18138
18260
|
}
|
|
@@ -18152,7 +18274,7 @@
|
|
|
18152
18274
|
DataFormBase.prototype.getPromiseActionInsert = function () {
|
|
18153
18275
|
return this.setting.baseService.post(this.model.data, this.insertPlusUrl);
|
|
18154
18276
|
};
|
|
18155
|
-
DataFormBase.prototype.handleInsertError = function () {
|
|
18277
|
+
DataFormBase.prototype.handleInsertError = function (response) {
|
|
18156
18278
|
};
|
|
18157
18279
|
DataFormBase.prototype.onUpdate = function () {
|
|
18158
18280
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -18173,7 +18295,7 @@
|
|
|
18173
18295
|
this.onSaved.emit();
|
|
18174
18296
|
return [3 /*break*/, 3];
|
|
18175
18297
|
case 2:
|
|
18176
|
-
this.handleUpdateError();
|
|
18298
|
+
this.handleUpdateError(response);
|
|
18177
18299
|
_a.label = 3;
|
|
18178
18300
|
case 3: return [2 /*return*/];
|
|
18179
18301
|
}
|
|
@@ -18190,7 +18312,7 @@
|
|
|
18190
18312
|
});
|
|
18191
18313
|
});
|
|
18192
18314
|
};
|
|
18193
|
-
DataFormBase.prototype.handleUpdateError = function () {
|
|
18315
|
+
DataFormBase.prototype.handleUpdateError = function (response) {
|
|
18194
18316
|
};
|
|
18195
18317
|
DataFormBase.prototype.getPromiseActionUpdate = function () {
|
|
18196
18318
|
return this.setting.baseService.put(this.model.data.id.toString(), this.model.data, this.updatePlusUrl);
|
|
@@ -18822,27 +18944,49 @@
|
|
|
18822
18944
|
AutoCompletePickerComponent.prototype.buildFilterKeyword = function () {
|
|
18823
18945
|
var _this = this;
|
|
18824
18946
|
if (this.fieldSearchText.length == 1) {
|
|
18825
|
-
|
|
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
|
+
}
|
|
18826
18953
|
}
|
|
18827
18954
|
else {
|
|
18828
18955
|
this.getFilterOnSearch = function (value) {
|
|
18829
|
-
var e_1, _a;
|
|
18956
|
+
var e_1, _a, e_2, _b;
|
|
18830
18957
|
var result = new Filter({
|
|
18831
18958
|
logic: 'or',
|
|
18832
18959
|
filters: []
|
|
18833
18960
|
});
|
|
18834
|
-
|
|
18835
|
-
|
|
18836
|
-
var
|
|
18837
|
-
|
|
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; }
|
|
18838
18974
|
}
|
|
18839
18975
|
}
|
|
18840
|
-
|
|
18841
|
-
finally {
|
|
18976
|
+
else {
|
|
18842
18977
|
try {
|
|
18843
|
-
|
|
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; }
|
|
18844
18989
|
}
|
|
18845
|
-
finally { if (e_1) throw e_1.error; }
|
|
18846
18990
|
}
|
|
18847
18991
|
return result;
|
|
18848
18992
|
};
|
|
@@ -18918,34 +19062,50 @@
|
|
|
18918
19062
|
return __generator(this, function (_a) {
|
|
18919
19063
|
switch (_a.label) {
|
|
18920
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:
|
|
18921
19071
|
filters = [];
|
|
18922
19072
|
if (this.control.multiple) {
|
|
18923
19073
|
if (this.value && this.value.length > 0) {
|
|
18924
|
-
|
|
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
|
+
}
|
|
18925
19080
|
}
|
|
18926
19081
|
}
|
|
18927
19082
|
else {
|
|
18928
19083
|
if (this.value) {
|
|
18929
|
-
|
|
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
|
+
}
|
|
18930
19090
|
}
|
|
18931
19091
|
}
|
|
18932
19092
|
return [4 /*yield*/, appendDefaultFilter(filters, this.control.defaultFilters)];
|
|
18933
|
-
case
|
|
19093
|
+
case 3:
|
|
18934
19094
|
_a.sent();
|
|
18935
19095
|
if (this.keyword && this.keyword.length > 0) {
|
|
18936
19096
|
filters.push(this.getFilterOnSearch(this.keyword));
|
|
18937
19097
|
}
|
|
18938
|
-
if (!this.control.modifyFilter) return [3 /*break*/,
|
|
19098
|
+
if (!this.control.modifyFilter) return [3 /*break*/, 5];
|
|
18939
19099
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
18940
|
-
case
|
|
19100
|
+
case 4:
|
|
18941
19101
|
allow = _a.sent();
|
|
18942
19102
|
if (allow === false) {
|
|
18943
19103
|
this.results = [];
|
|
18944
19104
|
return [2 /*return*/];
|
|
18945
19105
|
}
|
|
18946
|
-
_a.label =
|
|
18947
|
-
case
|
|
18948
|
-
case
|
|
19106
|
+
_a.label = 5;
|
|
19107
|
+
case 5: return [4 /*yield*/, this.control.baseService.getDataDropdownByFilter(filters, this.getDropdownOptions())];
|
|
19108
|
+
case 6:
|
|
18949
19109
|
dataSource = _a.sent();
|
|
18950
19110
|
this.fireEventAfterGetDataDropDown(dataSource);
|
|
18951
19111
|
this.reStructureDataSource(dataSource);
|
|
@@ -19126,9 +19286,17 @@
|
|
|
19126
19286
|
if (!this.control.multiple) return [3 /*break*/, 5];
|
|
19127
19287
|
dataSource = [];
|
|
19128
19288
|
if (!(this.value && this.value.length > 0)) return [3 /*break*/, 4];
|
|
19129
|
-
filters = [
|
|
19130
|
-
|
|
19131
|
-
|
|
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
|
+
}
|
|
19132
19300
|
if (!this.control.modifyFilter) return [3 /*break*/, 2];
|
|
19133
19301
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19134
19302
|
case 1:
|
|
@@ -19152,9 +19320,17 @@
|
|
|
19152
19320
|
case 5:
|
|
19153
19321
|
dataSource = [];
|
|
19154
19322
|
if (!this.value) return [3 /*break*/, 9];
|
|
19155
|
-
filters = [
|
|
19156
|
-
|
|
19157
|
-
|
|
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
|
+
}
|
|
19158
19334
|
if (!this.control.modifyFilter) return [3 /*break*/, 7];
|
|
19159
19335
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19160
19336
|
case 6:
|
|
@@ -19199,7 +19375,7 @@
|
|
|
19199
19375
|
}
|
|
19200
19376
|
};
|
|
19201
19377
|
AutoCompletePickerComponent.prototype.reStructureDataSource = function (sources) {
|
|
19202
|
-
var
|
|
19378
|
+
var e_3, _a;
|
|
19203
19379
|
if (sources != null && sources.length > 0) {
|
|
19204
19380
|
var arr = [];
|
|
19205
19381
|
try {
|
|
@@ -19209,12 +19385,12 @@
|
|
|
19209
19385
|
arr.push(item);
|
|
19210
19386
|
}
|
|
19211
19387
|
}
|
|
19212
|
-
catch (
|
|
19388
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
19213
19389
|
finally {
|
|
19214
19390
|
try {
|
|
19215
19391
|
if (sources_1_1 && !sources_1_1.done && (_a = sources_1.return)) _a.call(sources_1);
|
|
19216
19392
|
}
|
|
19217
|
-
finally { if (
|
|
19393
|
+
finally { if (e_3) throw e_3.error; }
|
|
19218
19394
|
}
|
|
19219
19395
|
this.dataSource = arr;
|
|
19220
19396
|
}
|
|
@@ -19244,7 +19420,12 @@
|
|
|
19244
19420
|
if (!this.control.multiple) return [3 /*break*/, 6];
|
|
19245
19421
|
if (!(obj != null && obj.length > 0)) return [3 /*break*/, 4];
|
|
19246
19422
|
filters = [];
|
|
19247
|
-
|
|
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
|
+
}
|
|
19248
19429
|
if (!this.control.modifyFilter) return [3 /*break*/, 2];
|
|
19249
19430
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19250
19431
|
case 1:
|
|
@@ -19269,9 +19450,17 @@
|
|
|
19269
19450
|
case 5: return [3 /*break*/, 10];
|
|
19270
19451
|
case 6:
|
|
19271
19452
|
if (!(obj != null)) return [3 /*break*/, 9];
|
|
19272
|
-
filters = [
|
|
19273
|
-
|
|
19274
|
-
|
|
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
|
+
}
|
|
19275
19464
|
if (!this.control.modifyFilter) return [3 /*break*/, 8];
|
|
19276
19465
|
return [4 /*yield*/, this.control.modifyFilter(filters)];
|
|
19277
19466
|
case 7:
|
|
@@ -19347,6 +19536,7 @@
|
|
|
19347
19536
|
AutoCompletePickerComponent.propDecorators = {
|
|
19348
19537
|
control: [{ type: i0.Input }],
|
|
19349
19538
|
disabled: [{ type: i0.Input }],
|
|
19539
|
+
parentPath: [{ type: i0.Input }],
|
|
19350
19540
|
popupSize: [{ type: i0.Input }],
|
|
19351
19541
|
onSelect: [{ type: i0.Output }],
|
|
19352
19542
|
onUnSelect: [{ type: i0.Output }],
|
|
@@ -19465,20 +19655,6 @@
|
|
|
19465
19655
|
FileObjectService.prototype.getScanFileUploadEndpoint = function (correlationId) {
|
|
19466
19656
|
return this.serviceCode + "/CreateScannedFile/" + correlationId;
|
|
19467
19657
|
};
|
|
19468
|
-
FileObjectService.prototype.isTypeFileKySo = function (fileName) {
|
|
19469
|
-
var fileExtension = this.getFileExtension(fileName);
|
|
19470
|
-
if (fileExtension) {
|
|
19471
|
-
fileExtension = fileExtension.toLowerCase();
|
|
19472
|
-
if (fileExtension.indexOf('.') > -1) {
|
|
19473
|
-
var arr = fileExtension.split('.');
|
|
19474
|
-
fileExtension = arr[arr.length - 1];
|
|
19475
|
-
}
|
|
19476
|
-
if ((/(pdf|doc|docx|xls|xlsm|xlsx)$/i).test(fileExtension)) {
|
|
19477
|
-
return true;
|
|
19478
|
-
}
|
|
19479
|
-
}
|
|
19480
|
-
return false;
|
|
19481
|
-
};
|
|
19482
19658
|
return FileObjectService;
|
|
19483
19659
|
}(BaseService));
|
|
19484
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" });
|
|
@@ -20566,13 +20742,16 @@
|
|
|
20566
20742
|
});
|
|
20567
20743
|
});
|
|
20568
20744
|
};
|
|
20569
|
-
MenuService.prototype.renderMenuByAppCode = function (appCode) {
|
|
20745
|
+
MenuService.prototype.renderMenuByAppCode = function (scopeName, appCode) {
|
|
20570
20746
|
return __awaiter(this, void 0, void 0, function () {
|
|
20571
20747
|
var menuUrl;
|
|
20572
20748
|
var _this = this;
|
|
20573
20749
|
return __generator(this, function (_a) {
|
|
20574
20750
|
this._menuItems = [];
|
|
20575
20751
|
menuUrl = "assets/menus/" + appCode.toLocaleLowerCase() + ".json";
|
|
20752
|
+
if (scopeName) {
|
|
20753
|
+
menuUrl = "assets/menus/" + scopeName.toLocaleLowerCase() + "/" + appCode.toLocaleLowerCase() + ".json";
|
|
20754
|
+
}
|
|
20576
20755
|
fetch(menuUrl).then(function (rs) { return __awaiter(_this, void 0, void 0, function () {
|
|
20577
20756
|
var menu, _a, _b;
|
|
20578
20757
|
return __generator(this, function (_c) {
|
|
@@ -20726,7 +20905,7 @@
|
|
|
20726
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
|
|
20727
20906
|
funcSetNewTabLink = function (link) { return "/" + appCodeLowerCase + link; };
|
|
20728
20907
|
}
|
|
20729
|
-
this._menuService.renderMenuByAppCode(appCode);
|
|
20908
|
+
this._menuService.renderMenuByAppCode(this.environment.scopeName, appCode);
|
|
20730
20909
|
this.model = this._menuService.getMenuItems();
|
|
20731
20910
|
this._router.events.pipe(operators.filter(function (event) { return event instanceof i3.NavigationEnd; }))
|
|
20732
20911
|
.subscribe(function (event) {
|
|
@@ -23287,7 +23466,7 @@
|
|
|
23287
23466
|
};
|
|
23288
23467
|
|
|
23289
23468
|
var CommonAppComponentComponent = /** @class */ (function () {
|
|
23290
|
-
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) {
|
|
23291
23470
|
var _this = this;
|
|
23292
23471
|
this._globalService = _globalService;
|
|
23293
23472
|
this._commonService = _commonService;
|
|
@@ -23317,6 +23496,7 @@
|
|
|
23317
23496
|
this._menuService = _menuService;
|
|
23318
23497
|
this._primengConfig = _primengConfig;
|
|
23319
23498
|
this._storageService = _storageService;
|
|
23499
|
+
this._permissionService = _permissionService;
|
|
23320
23500
|
this.showQuickNote = true;
|
|
23321
23501
|
this.allowAnonymous = false;
|
|
23322
23502
|
this._unsubscribeAll = new rxjs.Subject();
|
|
@@ -23470,6 +23650,25 @@
|
|
|
23470
23650
|
root.data.allowAnonymous = this.allowAnonymous;
|
|
23471
23651
|
// get current User
|
|
23472
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
|
+
}); });
|
|
23473
23672
|
this._componentContextService.subscribe(ComCtxConstants.ROOT.KEY_DOWN_ARROWLEFT, function (e) {
|
|
23474
23673
|
if (document.activeElement === _this.cancelButton.nativeElement) {
|
|
23475
23674
|
_this.okButton.nativeElement.focus();
|
|
@@ -23985,6 +24184,17 @@
|
|
|
23985
24184
|
}
|
|
23986
24185
|
}
|
|
23987
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
|
+
};
|
|
23988
24198
|
return CommonAppComponentComponent;
|
|
23989
24199
|
}());
|
|
23990
24200
|
CommonAppComponentComponent.decorators = [
|
|
@@ -24023,7 +24233,8 @@
|
|
|
24023
24233
|
{ type: i1.ConfirmationService },
|
|
24024
24234
|
{ type: MenuService },
|
|
24025
24235
|
{ type: i1.PrimeNGConfig },
|
|
24026
|
-
{ type: StorageService }
|
|
24236
|
+
{ type: StorageService },
|
|
24237
|
+
{ type: PermissionService }
|
|
24027
24238
|
]; };
|
|
24028
24239
|
CommonAppComponentComponent.propDecorators = {
|
|
24029
24240
|
okButton: [{ type: i0.ViewChild, args: ['okButton',] }],
|
|
@@ -26180,6 +26391,8 @@
|
|
|
26180
26391
|
});
|
|
26181
26392
|
_this.sourceIcon = {};
|
|
26182
26393
|
_this.stopCalculatingFunctionColumnWidth = false;
|
|
26394
|
+
_this.FileUploadMode = exports.FileUploadMode;
|
|
26395
|
+
_this.eventType = exports.EventType;
|
|
26183
26396
|
_this._unSubscribeAll = new rxjs.Subject();
|
|
26184
26397
|
_this.handleSelectRow = function (evt, data) {
|
|
26185
26398
|
if (_this.setting.hasCustomHandleClickRow) {
|
|
@@ -26362,6 +26575,94 @@
|
|
|
26362
26575
|
_this.setting.pageSetting.page = 1;
|
|
26363
26576
|
_this.getData();
|
|
26364
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
|
+
}); };
|
|
26365
26666
|
_this._activatedRoute = _this._injector.get(i3.ActivatedRoute);
|
|
26366
26667
|
_this._router = _this._injector.get(i3.Router);
|
|
26367
26668
|
_this._customRouterService = _this._injector.get(CustomRouterService);
|
|
@@ -26669,7 +26970,7 @@
|
|
|
26669
26970
|
});
|
|
26670
26971
|
};
|
|
26671
26972
|
CrudListComponent.prototype.formatColumns = function (cols) {
|
|
26672
|
-
var e_1,
|
|
26973
|
+
var e_1, _f;
|
|
26673
26974
|
try {
|
|
26674
26975
|
for (var cols_1 = __values(cols), cols_1_1 = cols_1.next(); !cols_1_1.done; cols_1_1 = cols_1.next()) {
|
|
26675
26976
|
var col = cols_1_1.value;
|
|
@@ -26681,7 +26982,7 @@
|
|
|
26681
26982
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
26682
26983
|
finally {
|
|
26683
26984
|
try {
|
|
26684
|
-
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);
|
|
26685
26986
|
}
|
|
26686
26987
|
finally { if (e_1) throw e_1.error; }
|
|
26687
26988
|
}
|
|
@@ -26880,7 +27181,7 @@
|
|
|
26880
27181
|
CrudListComponent.prototype.validatePermission = function (rowData) {
|
|
26881
27182
|
return __awaiter(this, void 0, void 0, function () {
|
|
26882
27183
|
var itemStatus, hasPermission, userData, userId, userIdUpper, userGroupIds, userOrgIds, managerTypes, userIdLastUpper_1, donViIdLastUpper_1;
|
|
26883
|
-
return __generator(this, function (
|
|
27184
|
+
return __generator(this, function (_f) {
|
|
26884
27185
|
this.currentItem = rowData;
|
|
26885
27186
|
itemStatus = this.setting.workflowSetting.statuses.find(function (p) { return p.trangThaiContainer.ma == rowData.currentStateCode; });
|
|
26886
27187
|
hasPermission = false;
|
|
@@ -26947,12 +27248,12 @@
|
|
|
26947
27248
|
};
|
|
26948
27249
|
CrudListComponent.prototype.showActionWorkflow = function (evt, rowData) {
|
|
26949
27250
|
return __awaiter(this, void 0, void 0, function () {
|
|
26950
|
-
var
|
|
26951
|
-
return __generator(this, function (
|
|
26952
|
-
switch (
|
|
27251
|
+
var _f, buttonContexts, hasPermission;
|
|
27252
|
+
return __generator(this, function (_g) {
|
|
27253
|
+
switch (_g.label) {
|
|
26953
27254
|
case 0: return [4 /*yield*/, this.getActionWorkflow(rowData)];
|
|
26954
27255
|
case 1:
|
|
26955
|
-
|
|
27256
|
+
_f = __read.apply(void 0, [_g.sent(), 2]), buttonContexts = _f[0], hasPermission = _f[1];
|
|
26956
27257
|
this.buttonContexts = buttonContexts;
|
|
26957
27258
|
rowData.__hasPermission = hasPermission;
|
|
26958
27259
|
rowData.__actions = this.buttonContexts;
|
|
@@ -26966,11 +27267,11 @@
|
|
|
26966
27267
|
return __awaiter(this, void 0, void 0, function () {
|
|
26967
27268
|
var hasPermission, buttonContexts, statusAction, actions;
|
|
26968
27269
|
var _this = this;
|
|
26969
|
-
return __generator(this, function (
|
|
26970
|
-
switch (
|
|
27270
|
+
return __generator(this, function (_f) {
|
|
27271
|
+
switch (_f.label) {
|
|
26971
27272
|
case 0: return [4 /*yield*/, this.validatePermission(rowData)];
|
|
26972
27273
|
case 1:
|
|
26973
|
-
hasPermission =
|
|
27274
|
+
hasPermission = _f.sent();
|
|
26974
27275
|
buttonContexts = [];
|
|
26975
27276
|
if (!hasPermission) {
|
|
26976
27277
|
buttonContexts = [];
|
|
@@ -27036,8 +27337,8 @@
|
|
|
27036
27337
|
return __awaiter(this, void 0, void 0, function () {
|
|
27037
27338
|
var dataProcess_1, validateWf;
|
|
27038
27339
|
var _this = this;
|
|
27039
|
-
return __generator(this, function (
|
|
27040
|
-
switch (
|
|
27340
|
+
return __generator(this, function (_f) {
|
|
27341
|
+
switch (_f.label) {
|
|
27041
27342
|
case 0:
|
|
27042
27343
|
if (!(workflowAction.actionOptions && !workflowAction.actionOptions.openDialog)) return [3 /*break*/, 2];
|
|
27043
27344
|
dataProcess_1 = {
|
|
@@ -27047,7 +27348,7 @@
|
|
|
27047
27348
|
};
|
|
27048
27349
|
return [4 /*yield*/, this.setting.baseService.validateProcessWorkflow(this.currentItem.id, workflowAction.ma, dataProcess_1)];
|
|
27049
27350
|
case 1:
|
|
27050
|
-
validateWf =
|
|
27351
|
+
validateWf = _f.sent();
|
|
27051
27352
|
this.handleResponse(validateWf, '', function (f) {
|
|
27052
27353
|
_this.setting.baseService.processWorkflow(_this.currentItem.id, workflowAction.ma, dataProcess_1)
|
|
27053
27354
|
.then(function (res) { return _this.handleResponse(res, workflowAction.ten + " th\u00E0nh c\u00F4ng", function (f) {
|
|
@@ -27071,7 +27372,7 @@
|
|
|
27071
27372
|
this.actionWorkflow = workflowAction;
|
|
27072
27373
|
this.headerWorkflow = workflowAction.ten;
|
|
27073
27374
|
this.showFormWorkflow = true;
|
|
27074
|
-
|
|
27375
|
+
_f.label = 3;
|
|
27075
27376
|
case 3: return [2 /*return*/];
|
|
27076
27377
|
}
|
|
27077
27378
|
});
|
|
@@ -27174,7 +27475,7 @@
|
|
|
27174
27475
|
this.onAdd.emit();
|
|
27175
27476
|
};
|
|
27176
27477
|
CrudListComponent.prototype.xuatCacMucDaChon_backup = function () {
|
|
27177
|
-
var e_2,
|
|
27478
|
+
var e_2, _f;
|
|
27178
27479
|
if (this._groupField) {
|
|
27179
27480
|
this._notifierService.showWarning('Giao diện hiện tại chưa hỗ trợ xuất excel');
|
|
27180
27481
|
return;
|
|
@@ -27216,7 +27517,7 @@
|
|
|
27216
27517
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
27217
27518
|
finally {
|
|
27218
27519
|
try {
|
|
27219
|
-
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);
|
|
27220
27521
|
}
|
|
27221
27522
|
finally { if (e_2) throw e_2.error; }
|
|
27222
27523
|
}
|
|
@@ -27359,8 +27660,8 @@
|
|
|
27359
27660
|
CrudListComponent.prototype.checkHasPermissionInLastStatus = function (rowData) {
|
|
27360
27661
|
return __awaiter(this, void 0, void 0, function () {
|
|
27361
27662
|
var statusKetThuc;
|
|
27362
|
-
return __generator(this, function (
|
|
27363
|
-
switch (
|
|
27663
|
+
return __generator(this, function (_f) {
|
|
27664
|
+
switch (_f.label) {
|
|
27364
27665
|
case 0:
|
|
27365
27666
|
statusKetThuc = this.setting.workflowSetting.statuses.find(function (q) { return q.type == exports.EnumWFNhomTrangThai.KET_THUC; });
|
|
27366
27667
|
if (statusKetThuc == null) {
|
|
@@ -27373,46 +27674,46 @@
|
|
|
27373
27674
|
return [4 /*yield*/, this.validatePermission(rowData)];
|
|
27374
27675
|
case 1:
|
|
27375
27676
|
// Kiểm tra permission
|
|
27376
|
-
return [2 /*return*/,
|
|
27677
|
+
return [2 /*return*/, _f.sent()];
|
|
27377
27678
|
}
|
|
27378
27679
|
});
|
|
27379
27680
|
});
|
|
27380
27681
|
};
|
|
27381
27682
|
CrudListComponent.prototype.showContextMenu = function (evt, rowData) {
|
|
27382
27683
|
return __awaiter(this, void 0, void 0, function () {
|
|
27383
|
-
var
|
|
27384
|
-
return __generator(this, function (
|
|
27385
|
-
switch (
|
|
27684
|
+
var _f, _g, _h, _j;
|
|
27685
|
+
return __generator(this, function (_k) {
|
|
27686
|
+
switch (_k.label) {
|
|
27386
27687
|
case 0:
|
|
27387
27688
|
this.rowDataCurrent = rowData;
|
|
27388
|
-
|
|
27689
|
+
_f = this;
|
|
27389
27690
|
return [4 /*yield*/, this.menuButtons(rowData)];
|
|
27390
27691
|
case 1:
|
|
27391
|
-
|
|
27692
|
+
_f.buttonContexts = _k.sent();
|
|
27392
27693
|
if (!(!this.setting.hiddenTrinhKy && !rowData.__hiddenTrinhKy)) return [3 /*break*/, 7];
|
|
27393
|
-
|
|
27394
|
-
if (!
|
|
27694
|
+
_h = this.setting.checkReadyToTrinhKy();
|
|
27695
|
+
if (!_h) return [3 /*break*/, 3];
|
|
27395
27696
|
return [4 /*yield*/, this.setting.checkAllowTrinhKy(rowData)];
|
|
27396
27697
|
case 2:
|
|
27397
|
-
|
|
27398
|
-
|
|
27698
|
+
_h = (_k.sent());
|
|
27699
|
+
_k.label = 3;
|
|
27399
27700
|
case 3:
|
|
27400
|
-
|
|
27401
|
-
if (!
|
|
27402
|
-
|
|
27403
|
-
if (
|
|
27701
|
+
_g = _h;
|
|
27702
|
+
if (!_g) return [3 /*break*/, 6];
|
|
27703
|
+
_j = !this.setting.checkPermisionTrinhKy;
|
|
27704
|
+
if (_j) return [3 /*break*/, 5];
|
|
27404
27705
|
return [4 /*yield*/, this.checkHasPermissionInLastStatus(rowData)];
|
|
27405
27706
|
case 4:
|
|
27406
|
-
|
|
27407
|
-
|
|
27707
|
+
_j = (_k.sent());
|
|
27708
|
+
_k.label = 5;
|
|
27408
27709
|
case 5:
|
|
27409
|
-
|
|
27410
|
-
|
|
27710
|
+
_g = (_j);
|
|
27711
|
+
_k.label = 6;
|
|
27411
27712
|
case 6:
|
|
27412
|
-
if (
|
|
27713
|
+
if (_g) {
|
|
27413
27714
|
this.buttonContexts.unshift({ label: this.setting.getLabelButtonTrinhKy(rowData), icon: 'pi pi-send', command: this.trinhKy.bind(this) });
|
|
27414
27715
|
}
|
|
27415
|
-
|
|
27716
|
+
_k.label = 7;
|
|
27416
27717
|
case 7:
|
|
27417
27718
|
if (this.buttonContexts.length > 0) {
|
|
27418
27719
|
this._showContextMenu(evt);
|
|
@@ -27989,7 +28290,7 @@
|
|
|
27989
28290
|
return col.dataType == exports.DataType.datetime || col.dataType == exports.DataType.date || col.dataType == exports.DataType.boolean || col.dataType == exports.DataType.enum;
|
|
27990
28291
|
};
|
|
27991
28292
|
CrudListComponent.prototype.alignRightColumn = function (col) {
|
|
27992
|
-
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;
|
|
27993
28294
|
};
|
|
27994
28295
|
CrudListComponent.prototype.ngOnDestroy = function () {
|
|
27995
28296
|
if (!this.disableKeypressControl) {
|
|
@@ -28005,10 +28306,10 @@
|
|
|
28005
28306
|
clearTimeout(this.timeout);
|
|
28006
28307
|
};
|
|
28007
28308
|
CrudListComponent.prototype.disableMultipleDelete = function () {
|
|
28008
|
-
var e_3,
|
|
28309
|
+
var e_3, _f;
|
|
28009
28310
|
try {
|
|
28010
|
-
for (var
|
|
28011
|
-
var item =
|
|
28311
|
+
for (var _g = __values(this.model.selectedItems), _h = _g.next(); !_h.done; _h = _g.next()) {
|
|
28312
|
+
var item = _h.value;
|
|
28012
28313
|
if (this.disableDelete(item)) {
|
|
28013
28314
|
return true;
|
|
28014
28315
|
}
|
|
@@ -28017,7 +28318,7 @@
|
|
|
28017
28318
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
28018
28319
|
finally {
|
|
28019
28320
|
try {
|
|
28020
|
-
if (
|
|
28321
|
+
if (_h && !_h.done && (_f = _g.return)) _f.call(_g);
|
|
28021
28322
|
}
|
|
28022
28323
|
finally { if (e_3) throw e_3.error; }
|
|
28023
28324
|
}
|
|
@@ -28087,11 +28388,11 @@
|
|
|
28087
28388
|
};
|
|
28088
28389
|
CrudListComponent.prototype.processBaseData = function () {
|
|
28089
28390
|
return __awaiter(this, void 0, void 0, function () {
|
|
28090
|
-
return __generator(this, function (
|
|
28091
|
-
switch (
|
|
28391
|
+
return __generator(this, function (_f) {
|
|
28392
|
+
switch (_f.label) {
|
|
28092
28393
|
case 0: return [4 /*yield*/, this.preProcessData(this.model.dataSource)];
|
|
28093
28394
|
case 1:
|
|
28094
|
-
|
|
28395
|
+
_f.sent();
|
|
28095
28396
|
return [2 /*return*/];
|
|
28096
28397
|
}
|
|
28097
28398
|
});
|
|
@@ -28100,14 +28401,14 @@
|
|
|
28100
28401
|
CrudListComponent.prototype.preProcessData = function (dataSource) {
|
|
28101
28402
|
return __awaiter(this, void 0, void 0, function () {
|
|
28102
28403
|
var colHasPipe, _loop_3, this_2, colHasPipe_1, colHasPipe_1_1, col;
|
|
28103
|
-
var e_4,
|
|
28104
|
-
return __generator(this, function (
|
|
28404
|
+
var e_4, _f;
|
|
28405
|
+
return __generator(this, function (_g) {
|
|
28105
28406
|
colHasPipe = this.setting.cols.filter(function (x) { return x.pipe; });
|
|
28106
28407
|
_loop_3 = function (col) {
|
|
28107
|
-
var e_5,
|
|
28408
|
+
var e_5, _f;
|
|
28108
28409
|
var _loop_4 = function (item) {
|
|
28109
28410
|
this_2.transform(col.pipe, col.asyncPipe, item[col.field]).then(function (rs) {
|
|
28110
|
-
item["pipe__" + col.field
|
|
28411
|
+
item["pipe__" + col.field] = rs;
|
|
28111
28412
|
});
|
|
28112
28413
|
};
|
|
28113
28414
|
try {
|
|
@@ -28119,7 +28420,7 @@
|
|
|
28119
28420
|
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
28120
28421
|
finally {
|
|
28121
28422
|
try {
|
|
28122
|
-
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);
|
|
28123
28424
|
}
|
|
28124
28425
|
finally { if (e_5) throw e_5.error; }
|
|
28125
28426
|
}
|
|
@@ -28134,7 +28435,7 @@
|
|
|
28134
28435
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
28135
28436
|
finally {
|
|
28136
28437
|
try {
|
|
28137
|
-
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);
|
|
28138
28439
|
}
|
|
28139
28440
|
finally { if (e_4) throw e_4.error; }
|
|
28140
28441
|
}
|
|
@@ -28145,8 +28446,8 @@
|
|
|
28145
28446
|
CrudListComponent.prototype.transform = function (pipe, asyncPipe, value) {
|
|
28146
28447
|
return __awaiter(this, void 0, void 0, function () {
|
|
28147
28448
|
var val, val;
|
|
28148
|
-
return __generator(this, function (
|
|
28149
|
-
switch (
|
|
28449
|
+
return __generator(this, function (_f) {
|
|
28450
|
+
switch (_f.label) {
|
|
28150
28451
|
case 0:
|
|
28151
28452
|
if (this.cachedTransforms[value]) {
|
|
28152
28453
|
return [2 /*return*/, this.cachedTransforms[value]];
|
|
@@ -28154,7 +28455,7 @@
|
|
|
28154
28455
|
if (!asyncPipe) return [3 /*break*/, 2];
|
|
28155
28456
|
return [4 /*yield*/, pipe.transform(value)];
|
|
28156
28457
|
case 1:
|
|
28157
|
-
val =
|
|
28458
|
+
val = _f.sent();
|
|
28158
28459
|
this.cachedTransforms[value] = val;
|
|
28159
28460
|
return [2 /*return*/, val];
|
|
28160
28461
|
case 2:
|
|
@@ -28248,7 +28549,7 @@
|
|
|
28248
28549
|
return {};
|
|
28249
28550
|
};
|
|
28250
28551
|
CrudListComponent.prototype.getMinimizeData = function (model) {
|
|
28251
|
-
var e_6,
|
|
28552
|
+
var e_6, _f;
|
|
28252
28553
|
if (isLiteralObject(model)) {
|
|
28253
28554
|
if (model._dropdownvalue != null && model._dropdownvalue !== '') {
|
|
28254
28555
|
return model[model._dropdownvalue];
|
|
@@ -28274,7 +28575,7 @@
|
|
|
28274
28575
|
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
28275
28576
|
finally {
|
|
28276
28577
|
try {
|
|
28277
|
-
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);
|
|
28278
28579
|
}
|
|
28279
28580
|
finally { if (e_6) throw e_6.error; }
|
|
28280
28581
|
}
|
|
@@ -28422,7 +28723,7 @@
|
|
|
28422
28723
|
};
|
|
28423
28724
|
CrudListComponent.prototype.showSettingsPermission = function () {
|
|
28424
28725
|
return __awaiter(this, void 0, void 0, function () {
|
|
28425
|
-
return __generator(this, function (
|
|
28726
|
+
return __generator(this, function (_f) {
|
|
28426
28727
|
if (this.creatingSearchInfo)
|
|
28427
28728
|
return [2 /*return*/];
|
|
28428
28729
|
this._showSettingsPermission = true;
|
|
@@ -28432,10 +28733,10 @@
|
|
|
28432
28733
|
};
|
|
28433
28734
|
CrudListComponent.prototype.createSearchSchema = function () {
|
|
28434
28735
|
return __awaiter(this, void 0, void 0, function () {
|
|
28435
|
-
var searchInfo,
|
|
28436
|
-
var e_7,
|
|
28437
|
-
return __generator(this, function (
|
|
28438
|
-
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) {
|
|
28439
28740
|
case 0:
|
|
28440
28741
|
if (this.setting.cols == null) {
|
|
28441
28742
|
return [2 /*return*/, this._notifierService.showWarning('Bạn chưa cấu hình cột cho danh sách')];
|
|
@@ -28445,14 +28746,14 @@
|
|
|
28445
28746
|
searchInfo.schema = [];
|
|
28446
28747
|
searchInfo.fieldDropdown = {};
|
|
28447
28748
|
searchInfo.fieldSearchText = [];
|
|
28448
|
-
|
|
28749
|
+
_o.label = 1;
|
|
28449
28750
|
case 1:
|
|
28450
|
-
|
|
28451
|
-
|
|
28452
|
-
|
|
28751
|
+
_o.trys.push([1, 6, 7, 8]);
|
|
28752
|
+
_f = __values(this.setting.cols), _g = _f.next();
|
|
28753
|
+
_o.label = 2;
|
|
28453
28754
|
case 2:
|
|
28454
|
-
if (!!
|
|
28455
|
-
col =
|
|
28755
|
+
if (!!_g.done) return [3 /*break*/, 5];
|
|
28756
|
+
col = _g.value;
|
|
28456
28757
|
if (!(col.allowFilter != false && col.rawColumn == null)) return [3 /*break*/, 4];
|
|
28457
28758
|
if (col.fullTextSearch) {
|
|
28458
28759
|
if (searchInfo.fieldSearchText.indexOf(col.field) == -1) {
|
|
@@ -28465,9 +28766,9 @@
|
|
|
28465
28766
|
}
|
|
28466
28767
|
return [4 /*yield*/, this.setting.function.getSearchControl(col.field)];
|
|
28467
28768
|
case 3:
|
|
28468
|
-
control =
|
|
28769
|
+
control = _o.sent();
|
|
28469
28770
|
if (control != null) {
|
|
28470
|
-
(
|
|
28771
|
+
(_l = searchInfo.schema).push.apply(_l, __spread(control));
|
|
28471
28772
|
}
|
|
28472
28773
|
else {
|
|
28473
28774
|
if (col.baseService || (col.dataSource && col.dataSource.length > 0)) {
|
|
@@ -28521,18 +28822,18 @@
|
|
|
28521
28822
|
}
|
|
28522
28823
|
}
|
|
28523
28824
|
}
|
|
28524
|
-
|
|
28825
|
+
_o.label = 4;
|
|
28525
28826
|
case 4:
|
|
28526
|
-
|
|
28827
|
+
_g = _f.next();
|
|
28527
28828
|
return [3 /*break*/, 2];
|
|
28528
28829
|
case 5: return [3 /*break*/, 8];
|
|
28529
28830
|
case 6:
|
|
28530
|
-
e_7_1 =
|
|
28831
|
+
e_7_1 = _o.sent();
|
|
28531
28832
|
e_7 = { error: e_7_1 };
|
|
28532
28833
|
return [3 /*break*/, 8];
|
|
28533
28834
|
case 7:
|
|
28534
28835
|
try {
|
|
28535
|
-
if (
|
|
28836
|
+
if (_g && !_g.done && (_k = _f.return)) _k.call(_f);
|
|
28536
28837
|
}
|
|
28537
28838
|
finally { if (e_7) throw e_7.error; }
|
|
28538
28839
|
return [7 /*endfinally*/];
|
|
@@ -28552,15 +28853,15 @@
|
|
|
28552
28853
|
};
|
|
28553
28854
|
this_3 = this;
|
|
28554
28855
|
try {
|
|
28555
|
-
for (
|
|
28556
|
-
field =
|
|
28856
|
+
for (_h = __values(searchInfo.fieldSearchText), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
28857
|
+
field = _j.value;
|
|
28557
28858
|
_loop_5(field);
|
|
28558
28859
|
}
|
|
28559
28860
|
}
|
|
28560
28861
|
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
28561
28862
|
finally {
|
|
28562
28863
|
try {
|
|
28563
|
-
if (
|
|
28864
|
+
if (_j && !_j.done && (_m = _h.return)) _m.call(_h);
|
|
28564
28865
|
}
|
|
28565
28866
|
finally { if (e_8) throw e_8.error; }
|
|
28566
28867
|
}
|
|
@@ -28626,15 +28927,19 @@
|
|
|
28626
28927
|
}
|
|
28627
28928
|
}, 20);
|
|
28628
28929
|
};
|
|
28930
|
+
CrudListComponent.prototype.getTooltip = function (tooltip, field) {
|
|
28931
|
+
var result = tooltip && tooltip[field] ? tooltip[field] : null;
|
|
28932
|
+
return result;
|
|
28933
|
+
};
|
|
28629
28934
|
return CrudListComponent;
|
|
28630
28935
|
}(ComponentBase));
|
|
28631
28936
|
CrudListComponent.decorators = [
|
|
28632
28937
|
{ type: i0.Component, args: [{
|
|
28633
28938
|
// tslint:disable-next-line: component-selector
|
|
28634
28939
|
selector: 'crud-list',
|
|
28635
|
-
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>",
|
|
28636
28941
|
providers: [i2$1.DecimalPipe, i2$1.DatePipe],
|
|
28637
|
-
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}}"]
|
|
28638
28943
|
},] }
|
|
28639
28944
|
];
|
|
28640
28945
|
CrudListComponent.ctorParameters = function () { return [
|
|
@@ -30551,31 +30856,67 @@
|
|
|
30551
30856
|
};
|
|
30552
30857
|
EntityPickerDataComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
30553
30858
|
return __awaiter(this, void 0, void 0, function () {
|
|
30554
|
-
var allow;
|
|
30555
|
-
|
|
30556
|
-
|
|
30859
|
+
var _a, _b, filter, value, allow;
|
|
30860
|
+
var e_1, _c;
|
|
30861
|
+
return __generator(this, function (_d) {
|
|
30862
|
+
switch (_d.label) {
|
|
30557
30863
|
case 0:
|
|
30558
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
|
+
}
|
|
30559
30890
|
if (this.control.multiple) {
|
|
30560
30891
|
if (this._value && this._value.length > 0) {
|
|
30561
|
-
|
|
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
|
+
}
|
|
30562
30898
|
}
|
|
30563
30899
|
}
|
|
30564
30900
|
else {
|
|
30565
30901
|
if (this._value) {
|
|
30566
|
-
|
|
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
|
+
}
|
|
30567
30908
|
}
|
|
30568
30909
|
}
|
|
30569
30910
|
return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
|
|
30570
30911
|
case 1:
|
|
30571
|
-
|
|
30912
|
+
_d.sent();
|
|
30572
30913
|
if (!this.control.modifyFilter) return [3 /*break*/, 3];
|
|
30573
30914
|
return [4 /*yield*/, this.control.modifyFilter(gridInfo.filters, this)];
|
|
30574
30915
|
case 2:
|
|
30575
|
-
allow =
|
|
30916
|
+
allow = _d.sent();
|
|
30576
30917
|
if (allow === false)
|
|
30577
30918
|
return [2 /*return*/, false];
|
|
30578
|
-
|
|
30919
|
+
_d.label = 3;
|
|
30579
30920
|
case 3:
|
|
30580
30921
|
if (this.setting.columnSetting.sortField) {
|
|
30581
30922
|
gridInfo.sorts.push({
|
|
@@ -30740,13 +31081,45 @@
|
|
|
30740
31081
|
};
|
|
30741
31082
|
EntityPickerSelectedComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
30742
31083
|
return __awaiter(this, void 0, void 0, function () {
|
|
30743
|
-
|
|
30744
|
-
|
|
31084
|
+
var _a, _b, filter, value;
|
|
31085
|
+
var e_1, _c;
|
|
31086
|
+
return __generator(this, function (_d) {
|
|
31087
|
+
switch (_d.label) {
|
|
30745
31088
|
case 0:
|
|
30746
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
|
+
}
|
|
30747
31115
|
if (this.control.multiple) {
|
|
30748
31116
|
if (this._value != null && this._value.length > 0) {
|
|
30749
|
-
|
|
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
|
+
}
|
|
30750
31123
|
}
|
|
30751
31124
|
else {
|
|
30752
31125
|
return [2 /*return*/, false];
|
|
@@ -30754,7 +31127,12 @@
|
|
|
30754
31127
|
}
|
|
30755
31128
|
else {
|
|
30756
31129
|
if (this._value != null) {
|
|
30757
|
-
|
|
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
|
+
}
|
|
30758
31136
|
}
|
|
30759
31137
|
else {
|
|
30760
31138
|
return [2 /*return*/, false];
|
|
@@ -30762,7 +31140,7 @@
|
|
|
30762
31140
|
}
|
|
30763
31141
|
return [4 /*yield*/, appendDefaultFilter(gridInfo.filters, this.control.defaultFilters)];
|
|
30764
31142
|
case 1:
|
|
30765
|
-
|
|
31143
|
+
_d.sent();
|
|
30766
31144
|
return [2 /*return*/];
|
|
30767
31145
|
}
|
|
30768
31146
|
});
|
|
@@ -31587,10 +31965,11 @@
|
|
|
31587
31965
|
}
|
|
31588
31966
|
return FileExplorerItem;
|
|
31589
31967
|
}());
|
|
31968
|
+
var FileExplorerItemType;
|
|
31590
31969
|
(function (FileExplorerItemType) {
|
|
31591
31970
|
FileExplorerItemType[FileExplorerItemType["File"] = 0] = "File";
|
|
31592
31971
|
FileExplorerItemType[FileExplorerItemType["Folder"] = 1] = "Folder";
|
|
31593
|
-
})(
|
|
31972
|
+
})(FileExplorerItemType || (FileExplorerItemType = {}));
|
|
31594
31973
|
|
|
31595
31974
|
// fix for build prod
|
|
31596
31975
|
var printJS$2 = printJS___namespace;
|
|
@@ -32546,24 +32925,7 @@
|
|
|
32546
32925
|
if (dataSource === void 0) { dataSource = []; }
|
|
32547
32926
|
this._dataSource = dataSource;
|
|
32548
32927
|
this._oldValue = this._value;
|
|
32549
|
-
|
|
32550
|
-
dataSource.forEach(function (item) {
|
|
32551
|
-
value.push(item.id);
|
|
32552
|
-
if (item.name) {
|
|
32553
|
-
item.nameWithoutExtension = item.name;
|
|
32554
|
-
var index = item.name.lastIndexOf('.');
|
|
32555
|
-
if (index > -1) {
|
|
32556
|
-
item.nameWithoutExtension = item.name.substring(0, index);
|
|
32557
|
-
}
|
|
32558
|
-
if (item.extension) {
|
|
32559
|
-
item.extension = item.extension.toLowerCase();
|
|
32560
|
-
}
|
|
32561
|
-
item.tailFile = item.name.substring(index);
|
|
32562
|
-
item.tailFileUpper = item.tailFile.toUpperCase();
|
|
32563
|
-
item.isFile = item.fileExplorerItemType == exports.FileExplorerItemType.File;
|
|
32564
|
-
}
|
|
32565
|
-
});
|
|
32566
|
-
this._value = value;
|
|
32928
|
+
this._value = dataSource.map(function (item) { return item.id; });
|
|
32567
32929
|
if (this._oldValue != null) {
|
|
32568
32930
|
if (JSON.stringify(this._oldValue) != JSON.stringify(this._value)) {
|
|
32569
32931
|
this.fireEventChange();
|
|
@@ -32683,10 +33045,6 @@
|
|
|
32683
33045
|
show: false,
|
|
32684
33046
|
formData: {}
|
|
32685
33047
|
};
|
|
32686
|
-
this.forms[this.formIds.signatureDetail] = {
|
|
32687
|
-
header: 'Thông tin chữ ký số',
|
|
32688
|
-
show: false,
|
|
32689
|
-
};
|
|
32690
33048
|
this.forms[this.formIds.fileVersionList] = {
|
|
32691
33049
|
header: 'Danh sách phiên bản',
|
|
32692
33050
|
show: false,
|
|
@@ -32777,7 +33135,7 @@
|
|
|
32777
33135
|
};
|
|
32778
33136
|
FileManagerComponent.prototype.modifyGridInfo = function (gridInfo) {
|
|
32779
33137
|
return __awaiter(this, void 0, void 0, function () {
|
|
32780
|
-
return __generator(this, function (
|
|
33138
|
+
return __generator(this, function (_a) {
|
|
32781
33139
|
gridInfo.filters.push(this.newFilter('parentFolderId', exports.Operator.equal, this.data.currentFolderId));
|
|
32782
33140
|
return [2 /*return*/];
|
|
32783
33141
|
});
|
|
@@ -32786,7 +33144,7 @@
|
|
|
32786
33144
|
FileManagerComponent.prototype.afterGetData = function () {
|
|
32787
33145
|
return __awaiter(this, void 0, void 0, function () {
|
|
32788
33146
|
var _loop_1, this_1, ind;
|
|
32789
|
-
return __generator(this, function (
|
|
33147
|
+
return __generator(this, function (_a) {
|
|
32790
33148
|
_loop_1 = function (ind) {
|
|
32791
33149
|
var item = this_1.model.dataSource[ind];
|
|
32792
33150
|
if (this_1._fileExplorerService.supportDigitalSignature(item.name)) {
|
|
@@ -32797,7 +33155,7 @@
|
|
|
32797
33155
|
}
|
|
32798
33156
|
});
|
|
32799
33157
|
}
|
|
32800
|
-
if (item.fileExplorerItemType ===
|
|
33158
|
+
if (item.fileExplorerItemType === FileExplorerItemType.Folder) {
|
|
32801
33159
|
item.class = '';
|
|
32802
33160
|
}
|
|
32803
33161
|
if (item.extension) {
|
|
@@ -32959,7 +33317,7 @@
|
|
|
32959
33317
|
FileManagerComponent.prototype.openObject = function (explorerItem) {
|
|
32960
33318
|
return __awaiter(this, void 0, void 0, function () {
|
|
32961
33319
|
var canViewOnline;
|
|
32962
|
-
return __generator(this, function (
|
|
33320
|
+
return __generator(this, function (_a) {
|
|
32963
33321
|
if (explorerItem.isFile) {
|
|
32964
33322
|
canViewOnline = this._fileObjectService.isSupportedViewOnline(explorerItem.name);
|
|
32965
33323
|
if (canViewOnline) {
|
|
@@ -33000,7 +33358,7 @@
|
|
|
33000
33358
|
FileManagerComponent.prototype.download = function (explorerItem) {
|
|
33001
33359
|
return __awaiter(this, void 0, void 0, function () {
|
|
33002
33360
|
var model;
|
|
33003
|
-
return __generator(this, function (
|
|
33361
|
+
return __generator(this, function (_a) {
|
|
33004
33362
|
model = this._downloadLinkService.getGenerateDownloadLinkModel(explorerItem);
|
|
33005
33363
|
this._downloadLinkService.download(model);
|
|
33006
33364
|
return [2 /*return*/];
|
|
@@ -33012,7 +33370,7 @@
|
|
|
33012
33370
|
return __awaiter(this, void 0, void 0, function () {
|
|
33013
33371
|
var selectedItems, hasItems, arrModel;
|
|
33014
33372
|
var _this = this;
|
|
33015
|
-
return __generator(this, function (
|
|
33373
|
+
return __generator(this, function (_a) {
|
|
33016
33374
|
selectedItems = this.model.selectedItems;
|
|
33017
33375
|
hasItems = selectedItems && selectedItems.length;
|
|
33018
33376
|
if (hasItems) {
|
|
@@ -33162,13 +33520,13 @@
|
|
|
33162
33520
|
return __awaiter(this, void 0, void 0, function () {
|
|
33163
33521
|
var rs, breadcrumbs;
|
|
33164
33522
|
var _this = this;
|
|
33165
|
-
return __generator(this, function (
|
|
33166
|
-
switch (
|
|
33523
|
+
return __generator(this, function (_a) {
|
|
33524
|
+
switch (_a.label) {
|
|
33167
33525
|
case 0:
|
|
33168
33526
|
if (!this.data.currentFolderId) return [3 /*break*/, 2];
|
|
33169
33527
|
return [4 /*yield*/, this._folderService.getFullFolderPath(this.data.currentFolderId)];
|
|
33170
33528
|
case 1:
|
|
33171
|
-
rs =
|
|
33529
|
+
rs = _a.sent();
|
|
33172
33530
|
if (rs.success) {
|
|
33173
33531
|
breadcrumbs = rs.data.map(function (f) {
|
|
33174
33532
|
var item = {
|
|
@@ -33190,7 +33548,7 @@
|
|
|
33190
33548
|
return [3 /*break*/, 3];
|
|
33191
33549
|
case 2:
|
|
33192
33550
|
this.data.breadcrumbs = [];
|
|
33193
|
-
|
|
33551
|
+
_a.label = 3;
|
|
33194
33552
|
case 3: return [2 /*return*/];
|
|
33195
33553
|
}
|
|
33196
33554
|
});
|
|
@@ -33200,75 +33558,36 @@
|
|
|
33200
33558
|
// TODO: Lưu ý xử lý trường double click vào nút
|
|
33201
33559
|
FileManagerComponent.prototype.signFile = function (file) {
|
|
33202
33560
|
var _this = this;
|
|
33203
|
-
this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số văn bản này?').then(function (rs) {
|
|
33204
|
-
|
|
33205
|
-
|
|
33206
|
-
|
|
33207
|
-
|
|
33208
|
-
|
|
33209
|
-
|
|
33210
|
-
|
|
33211
|
-
|
|
33212
|
-
|
|
33213
|
-
|
|
33214
|
-
|
|
33215
|
-
|
|
33216
|
-
|
|
33217
|
-
|
|
33218
|
-
|
|
33219
|
-
|
|
33220
|
-
|
|
33221
|
-
})
|
|
33222
|
-
|
|
33223
|
-
rsConvert = _b.sent();
|
|
33224
|
-
if (!rsConvert || !rsConvert.success) {
|
|
33225
|
-
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");
|
|
33226
|
-
return [2 /*return*/];
|
|
33227
|
-
}
|
|
33228
|
-
else {
|
|
33229
|
-
this._notifierService.showSuccess("Chuy\u1EC3n \u0111\u1ED5i t\u00E0i li\u1EC7u " + file.name + " th\u00E0nh pdf th\u00E0nh c\u00F4ng");
|
|
33230
|
-
sourceFileId = rsConvert.data;
|
|
33231
|
-
sourceFile_1 = { id: sourceFileId };
|
|
33232
|
-
this._triggerProcessData();
|
|
33233
|
-
}
|
|
33234
|
-
return [3 /*break*/, 4];
|
|
33235
|
-
case 3:
|
|
33236
|
-
e_1 = _b.sent();
|
|
33237
|
-
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");
|
|
33238
|
-
return [2 /*return*/];
|
|
33239
|
-
case 4:
|
|
33240
|
-
this._fileExplorerService.generateLinkDownload({
|
|
33241
|
-
fileId: sourceFileId,
|
|
33242
|
-
}).then(function (rs) {
|
|
33243
|
-
var url = _this._downloadLinkService.getDownloadForSignUrl(rs.data);
|
|
33244
|
-
var prms = {};
|
|
33245
|
-
prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + _this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
|
|
33246
|
-
prms['SessionId'] = '';
|
|
33247
|
-
prms['FileName'] = url;
|
|
33248
|
-
// tslint:disable-next-line: variable-name
|
|
33249
|
-
var json_prms = JSON.stringify(prms);
|
|
33250
|
-
vgca_sign_approved(json_prms, function (result) {
|
|
33251
|
-
var resultObj = JSON.parse(result);
|
|
33252
|
-
if (resultObj.FileServer != '') {
|
|
33253
|
-
_this._fileExplorerService.saveSignedFile({
|
|
33254
|
-
sourceFile: sourceFile_1,
|
|
33255
|
-
tempFileId: resultObj.FileServer,
|
|
33256
|
-
}).then(function (rss) {
|
|
33257
|
-
_this._triggerProcessData();
|
|
33258
|
-
_this._notifierService.showSuccess('Ký số thành công');
|
|
33259
|
-
});
|
|
33260
|
-
}
|
|
33561
|
+
this._notifierService.showConfirm('Bạn có chắc chắn muốn ký số văn bản này?').then(function (rs) {
|
|
33562
|
+
if (rs) {
|
|
33563
|
+
_this._fileExplorerService.generateLinkDownload({
|
|
33564
|
+
fileId: file.id
|
|
33565
|
+
}).then(function (rs) {
|
|
33566
|
+
var url = _this._fileExplorerService.getDownloadForSignUrl(rs.data);
|
|
33567
|
+
var prms = {};
|
|
33568
|
+
prms['FileUploadHandler'] = _this._moduleConfig.environment.apiDomain.fileEndpoint + "/Signature/SavePhysicalSignedFile";
|
|
33569
|
+
prms['SessionId'] = '';
|
|
33570
|
+
prms['FileName'] = url;
|
|
33571
|
+
// tslint:disable-next-line: variable-name
|
|
33572
|
+
var json_prms = JSON.stringify(prms);
|
|
33573
|
+
vgca_sign_file(json_prms, function (result) {
|
|
33574
|
+
var resultObj = JSON.parse(result);
|
|
33575
|
+
if (resultObj.FileServer != '') {
|
|
33576
|
+
_this._fileExplorerService.saveSignedFile({
|
|
33577
|
+
sourceFile: file,
|
|
33578
|
+
tempFileId: resultObj.FileServer
|
|
33579
|
+
}).then(function (rss) {
|
|
33580
|
+
_this._notifierService.showSuccess('Ký số thành công');
|
|
33261
33581
|
});
|
|
33262
|
-
}
|
|
33263
|
-
|
|
33264
|
-
|
|
33265
|
-
|
|
33266
|
-
|
|
33267
|
-
}); });
|
|
33582
|
+
}
|
|
33583
|
+
});
|
|
33584
|
+
});
|
|
33585
|
+
}
|
|
33586
|
+
});
|
|
33268
33587
|
};
|
|
33269
33588
|
FileManagerComponent.prototype.shareFolder = function (file) {
|
|
33270
33589
|
return __awaiter(this, void 0, void 0, function () {
|
|
33271
|
-
return __generator(this, function (
|
|
33590
|
+
return __generator(this, function (_a) {
|
|
33272
33591
|
this.forms.shareFolder.data = file;
|
|
33273
33592
|
this.forms.shareFolder.show = true;
|
|
33274
33593
|
return [2 /*return*/];
|
|
@@ -33277,7 +33596,7 @@
|
|
|
33277
33596
|
};
|
|
33278
33597
|
FileManagerComponent.prototype.shareFile = function (file) {
|
|
33279
33598
|
return __awaiter(this, void 0, void 0, function () {
|
|
33280
|
-
return __generator(this, function (
|
|
33599
|
+
return __generator(this, function (_a) {
|
|
33281
33600
|
this.forms.shareFile.data = file;
|
|
33282
33601
|
this.forms.shareFile.show = true;
|
|
33283
33602
|
return [2 /*return*/];
|
|
@@ -33291,154 +33610,19 @@
|
|
|
33291
33610
|
};
|
|
33292
33611
|
FileManagerComponent.prototype.viewListSign = function (e, signatures) {
|
|
33293
33612
|
e.stopPropagation();
|
|
33294
|
-
this.
|
|
33613
|
+
this.forms.signatureDetail.data = signatures;
|
|
33295
33614
|
this.forms.signatureDetail.show = true;
|
|
33296
33615
|
};
|
|
33297
33616
|
FileManagerComponent.prototype.onRowSelect = function (evt) {
|
|
33298
33617
|
this.onSelected.emit(this.model.selectedItems);
|
|
33299
33618
|
};
|
|
33300
|
-
FileManagerComponent.prototype.signMultiple = function () {
|
|
33301
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
33302
|
-
var selectedItems, hasItems;
|
|
33303
|
-
return __generator(this, function (_b) {
|
|
33304
|
-
selectedItems = this.model.selectedItems;
|
|
33305
|
-
hasItems = selectedItems && selectedItems.length;
|
|
33306
|
-
if (hasItems) {
|
|
33307
|
-
if (selectedItems.length == 1) {
|
|
33308
|
-
this.signFile(selectedItems[0]);
|
|
33309
|
-
}
|
|
33310
|
-
else {
|
|
33311
|
-
this.signFileMultiple(selectedItems);
|
|
33312
|
-
}
|
|
33313
|
-
}
|
|
33314
|
-
return [2 /*return*/];
|
|
33315
|
-
});
|
|
33316
|
-
});
|
|
33317
|
-
};
|
|
33318
|
-
FileManagerComponent.prototype.signFileMultiple = function (lstFile) {
|
|
33319
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
33320
|
-
var prms, rs, lstFile_1, lstFile_1_1, file, sourceFileId, sourceFile, rsConvert, result, url, e_2, result, url, e_3_1, json_prms;
|
|
33321
|
-
var e_3, _b;
|
|
33322
|
-
var _this = this;
|
|
33323
|
-
return __generator(this, function (_c) {
|
|
33324
|
-
switch (_c.label) {
|
|
33325
|
-
case 0:
|
|
33326
|
-
prms = {};
|
|
33327
|
-
prms['Files'] = [];
|
|
33328
|
-
prms['FileUploadHandler'] = this._moduleConfig.environment.apiDomain.fileEndpoint + "/" + this._moduleConfig.environment.apiVersion + "/KySoFile/SavePhysicalSignedFile";
|
|
33329
|
-
prms['SessionId'] = '';
|
|
33330
|
-
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?')];
|
|
33331
|
-
case 1:
|
|
33332
|
-
rs = _c.sent();
|
|
33333
|
-
if (!rs) return [3 /*break*/, 18];
|
|
33334
|
-
_c.label = 2;
|
|
33335
|
-
case 2:
|
|
33336
|
-
_c.trys.push([2, 15, 16, 17]);
|
|
33337
|
-
lstFile_1 = __values(lstFile), lstFile_1_1 = lstFile_1.next();
|
|
33338
|
-
_c.label = 3;
|
|
33339
|
-
case 3:
|
|
33340
|
-
if (!!lstFile_1_1.done) return [3 /*break*/, 14];
|
|
33341
|
-
file = lstFile_1_1.value;
|
|
33342
|
-
if (!this._fileObjectService.isTypeFileKySo(file.name))
|
|
33343
|
-
return [3 /*break*/, 13];
|
|
33344
|
-
sourceFileId = file.id;
|
|
33345
|
-
sourceFile = file;
|
|
33346
|
-
if (!this._fileExplorerService.needConvertBeforeSign(file.name)) return [3 /*break*/, 11];
|
|
33347
|
-
_c.label = 4;
|
|
33348
|
-
case 4:
|
|
33349
|
-
_c.trys.push([4, 9, , 10]);
|
|
33350
|
-
return [4 /*yield*/, this._fileExplorerService.convertDocumentToPdfAndSave({
|
|
33351
|
-
id: sourceFileId,
|
|
33352
|
-
name: this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
|
|
33353
|
-
folderId: file.parentFolderId,
|
|
33354
|
-
ownerType: this._userService.getCurrentUser().userId.toString(),
|
|
33355
|
-
})];
|
|
33356
|
-
case 5:
|
|
33357
|
-
rsConvert = _c.sent();
|
|
33358
|
-
if (!(!rsConvert || !rsConvert.success)) return [3 /*break*/, 6];
|
|
33359
|
-
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");
|
|
33360
|
-
return [3 /*break*/, 13];
|
|
33361
|
-
case 6: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: rsConvert.data })];
|
|
33362
|
-
case 7:
|
|
33363
|
-
result = _c.sent();
|
|
33364
|
-
if (result.success) {
|
|
33365
|
-
url = this._downloadLinkService.getDownloadForSignUrl(result.data);
|
|
33366
|
-
prms['Files'].push({
|
|
33367
|
-
"FileID": rsConvert.data,
|
|
33368
|
-
"FileName": this._fileExplorerService.changeFileExtension(file.name, 'pdf'),
|
|
33369
|
-
"URL": url,
|
|
33370
|
-
});
|
|
33371
|
-
}
|
|
33372
|
-
_c.label = 8;
|
|
33373
|
-
case 8: return [3 /*break*/, 10];
|
|
33374
|
-
case 9:
|
|
33375
|
-
e_2 = _c.sent();
|
|
33376
|
-
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");
|
|
33377
|
-
return [3 /*break*/, 13];
|
|
33378
|
-
case 10: return [3 /*break*/, 13];
|
|
33379
|
-
case 11: return [4 /*yield*/, this._fileExplorerService.generateLinkDownload({ fileId: sourceFileId })];
|
|
33380
|
-
case 12:
|
|
33381
|
-
result = _c.sent();
|
|
33382
|
-
if (result.success) {
|
|
33383
|
-
url = this._downloadLinkService.getDownloadForSignUrl(result.data);
|
|
33384
|
-
prms['Files'].push({
|
|
33385
|
-
"FileID": sourceFileId,
|
|
33386
|
-
"FileName": file.name,
|
|
33387
|
-
"URL": url,
|
|
33388
|
-
});
|
|
33389
|
-
}
|
|
33390
|
-
_c.label = 13;
|
|
33391
|
-
case 13:
|
|
33392
|
-
lstFile_1_1 = lstFile_1.next();
|
|
33393
|
-
return [3 /*break*/, 3];
|
|
33394
|
-
case 14: return [3 /*break*/, 17];
|
|
33395
|
-
case 15:
|
|
33396
|
-
e_3_1 = _c.sent();
|
|
33397
|
-
e_3 = { error: e_3_1 };
|
|
33398
|
-
return [3 /*break*/, 17];
|
|
33399
|
-
case 16:
|
|
33400
|
-
try {
|
|
33401
|
-
if (lstFile_1_1 && !lstFile_1_1.done && (_b = lstFile_1.return)) _b.call(lstFile_1);
|
|
33402
|
-
}
|
|
33403
|
-
finally { if (e_3) throw e_3.error; }
|
|
33404
|
-
return [7 /*endfinally*/];
|
|
33405
|
-
case 17:
|
|
33406
|
-
json_prms = JSON.stringify(prms);
|
|
33407
|
-
vgca_sign_files(json_prms, function (result) {
|
|
33408
|
-
var _a;
|
|
33409
|
-
var resultObj = JSON.parse(result);
|
|
33410
|
-
if ((_a = resultObj.Files) === null || _a === void 0 ? void 0 : _a.length) {
|
|
33411
|
-
resultObj.Files.forEach(function (item) { return __awaiter(_this, void 0, void 0, function () {
|
|
33412
|
-
var _this = this;
|
|
33413
|
-
return __generator(this, function (_b) {
|
|
33414
|
-
this._fileExplorerService.saveSignedFile({
|
|
33415
|
-
sourceFile: { id: item.FileID },
|
|
33416
|
-
tempFileId: item.FileSignedURL,
|
|
33417
|
-
}).then(function (rss) {
|
|
33418
|
-
_this._triggerProcessData();
|
|
33419
|
-
_this._notifierService.showSuccess('Ký số thành công');
|
|
33420
|
-
});
|
|
33421
|
-
return [2 /*return*/];
|
|
33422
|
-
});
|
|
33423
|
-
}); });
|
|
33424
|
-
}
|
|
33425
|
-
;
|
|
33426
|
-
});
|
|
33427
|
-
_c.label = 18;
|
|
33428
|
-
case 18:
|
|
33429
|
-
;
|
|
33430
|
-
return [2 /*return*/];
|
|
33431
|
-
}
|
|
33432
|
-
});
|
|
33433
|
-
});
|
|
33434
|
-
};
|
|
33435
33619
|
return FileManagerComponent;
|
|
33436
33620
|
}(DataListBase));
|
|
33437
33621
|
FileManagerComponent.decorators = [
|
|
33438
33622
|
{ type: i0.Component, args: [{
|
|
33439
33623
|
// tslint:disable-next-line: component-selector
|
|
33440
33624
|
selector: 'file-manager',
|
|
33441
|
-
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<!-- Xem ch\u1EEF k\u00FD s\u1ED1 -->\r\n<tn-dialog *ngIf=\"forms.signatureDetail.show\" #dialog [styleClass]=\"'address-form'\"\r\n [header]=\"forms.signatureDetail.header | translate\" [popupSize]=\"forms[formIds.signatureDetail].popupSize\"\r\n (onHide)=\"onCancelForm(formIds.signatureDetail)\">\r\n <signature-detail [parentModel]=\"model\" [parentContext]=\"context\">\r\n </signature-detail>\r\n</tn-dialog>",
|
|
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> -->",
|
|
33442
33626
|
providers: [
|
|
33443
33627
|
{
|
|
33444
33628
|
provide: forms.NG_VALUE_ACCESSOR,
|
|
@@ -34707,9 +34891,11 @@
|
|
|
34707
34891
|
this.decimalPlaces = 2;
|
|
34708
34892
|
this.viewMode = false;
|
|
34709
34893
|
this.inputStyleClass = '';
|
|
34894
|
+
this.thousandSeperator = '.';
|
|
34710
34895
|
this.onFocus = new i0.EventEmitter();
|
|
34711
34896
|
this.onBlur = new i0.EventEmitter();
|
|
34712
34897
|
this.onChanged = new i0.EventEmitter();
|
|
34898
|
+
this.locale = 'vi-VN';
|
|
34713
34899
|
}
|
|
34714
34900
|
Object.defineProperty(MaskComponent.prototype, "placeholder", {
|
|
34715
34901
|
set: function (value) {
|
|
@@ -34721,10 +34907,11 @@
|
|
|
34721
34907
|
configurable: true
|
|
34722
34908
|
});
|
|
34723
34909
|
MaskComponent.prototype.ngOnInit = function () {
|
|
34910
|
+
this.locale = this.thousandSeperator == '.' ? 'vi-VN' : 'en-US';
|
|
34724
34911
|
};
|
|
34725
34912
|
MaskComponent.prototype.writeValue = function (obj) {
|
|
34726
34913
|
if (obj) {
|
|
34727
|
-
this.model = this._numberPipe.transform(obj, '',
|
|
34914
|
+
this.model = this._numberPipe.transform(obj, '', this.locale);
|
|
34728
34915
|
this.value = Number(this.model);
|
|
34729
34916
|
}
|
|
34730
34917
|
else if (obj === 0) {
|
|
@@ -34742,7 +34929,7 @@
|
|
|
34742
34929
|
return 'separator.0';
|
|
34743
34930
|
};
|
|
34744
34931
|
MaskComponent.prototype.getThousandSeperator = function () {
|
|
34745
|
-
return '.';
|
|
34932
|
+
return this.thousandSeperator || '.';
|
|
34746
34933
|
};
|
|
34747
34934
|
MaskComponent.prototype.handleFocus = function () {
|
|
34748
34935
|
this.onFocus.emit(this.value);
|
|
@@ -34774,7 +34961,7 @@
|
|
|
34774
34961
|
}
|
|
34775
34962
|
};
|
|
34776
34963
|
MaskComponent.prototype.numberToStringVN = function (number) {
|
|
34777
|
-
return this._numberPipe.transform(number, '',
|
|
34964
|
+
return this._numberPipe.transform(number, '', this.locale);
|
|
34778
34965
|
};
|
|
34779
34966
|
MaskComponent.prototype.registerOnChange = function (fn) {
|
|
34780
34967
|
this.onChange = fn;
|
|
@@ -34819,6 +35006,7 @@
|
|
|
34819
35006
|
decimalPlaces: [{ type: i0.Input }],
|
|
34820
35007
|
viewMode: [{ type: i0.Input }],
|
|
34821
35008
|
inputStyleClass: [{ type: i0.Input }],
|
|
35009
|
+
thousandSeperator: [{ type: i0.Input }],
|
|
34822
35010
|
onFocus: [{ type: i0.Output }],
|
|
34823
35011
|
onBlur: [{ type: i0.Output }],
|
|
34824
35012
|
onChanged: [{ type: i0.Output }]
|
|
@@ -45326,8 +45514,10 @@
|
|
|
45326
45514
|
},] }
|
|
45327
45515
|
];
|
|
45328
45516
|
|
|
45517
|
+
var moment$1 = moment___namespace;
|
|
45329
45518
|
var TnDatePipe = /** @class */ (function () {
|
|
45330
|
-
function TnDatePipe() {
|
|
45519
|
+
function TnDatePipe(format) {
|
|
45520
|
+
this.format = format;
|
|
45331
45521
|
}
|
|
45332
45522
|
TnDatePipe.prototype.addZero = function (value) {
|
|
45333
45523
|
if (value < 10)
|
|
@@ -45337,6 +45527,8 @@
|
|
|
45337
45527
|
TnDatePipe.prototype.transform = function (value, args) {
|
|
45338
45528
|
if (value == null)
|
|
45339
45529
|
return '';
|
|
45530
|
+
if (this.format)
|
|
45531
|
+
return moment$1(value).format(this.format);
|
|
45340
45532
|
var date = new Date(value);
|
|
45341
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();
|
|
45342
45534
|
};
|
|
@@ -45346,7 +45538,10 @@
|
|
|
45346
45538
|
{ type: i0.Pipe, args: [{
|
|
45347
45539
|
name: 'tnDate'
|
|
45348
45540
|
},] }
|
|
45349
|
-
];
|
|
45541
|
+
];
|
|
45542
|
+
TnDatePipe.ctorParameters = function () { return [
|
|
45543
|
+
{ type: undefined, decorators: [{ type: i0.Inject, args: [i0.LOCALE_ID,] }] }
|
|
45544
|
+
]; };
|
|
45350
45545
|
|
|
45351
45546
|
var UserFormatPipe = /** @class */ (function () {
|
|
45352
45547
|
function UserFormatPipe(_userService) {
|
|
@@ -45511,70 +45706,6 @@
|
|
|
45511
45706
|
{ type: UserService }
|
|
45512
45707
|
]; };
|
|
45513
45708
|
|
|
45514
|
-
// fix for build prod
|
|
45515
|
-
var moment$1 = moment___default['default'];
|
|
45516
|
-
var SignatureDetailComponent = /** @class */ (function (_super) {
|
|
45517
|
-
__extends(SignatureDetailComponent, _super);
|
|
45518
|
-
function SignatureDetailComponent(injector) {
|
|
45519
|
-
return _super.call(this, injector) || this;
|
|
45520
|
-
}
|
|
45521
|
-
SignatureDetailComponent.prototype.ngOnInit = function () {
|
|
45522
|
-
this.model.data = this.parentModel.advanceData;
|
|
45523
|
-
this.buildTree();
|
|
45524
|
-
};
|
|
45525
|
-
SignatureDetailComponent.prototype.buildTree = function () {
|
|
45526
|
-
var nodes = [];
|
|
45527
|
-
for (var ind in this.model.data) {
|
|
45528
|
-
var item = this.model.data[ind];
|
|
45529
|
-
var childNodes = { expanded: true, children: [] };
|
|
45530
|
-
childNodes.label = "" + item.reason;
|
|
45531
|
-
childNodes.expandedIcon = 'fas fa-signature';
|
|
45532
|
-
childNodes.collapsedIcon = 'fas fa-signature';
|
|
45533
|
-
childNodes.leaf = false;
|
|
45534
|
-
if (item.reason) {
|
|
45535
|
-
childNodes.children.push({
|
|
45536
|
-
label: 'Người ký: ' + item.certificate.subject.nameOfSigner,
|
|
45537
|
-
expandedIcon: 'fas fa-user-tag',
|
|
45538
|
-
collapsedIcon: 'fas fa-user-tag',
|
|
45539
|
-
leaf: true
|
|
45540
|
-
});
|
|
45541
|
-
}
|
|
45542
|
-
childNodes.children.push({
|
|
45543
|
-
label: 'Đơn vị: ' + item.certificate.subject.organizationUnit + ' - ' + item.certificate.subject.organization,
|
|
45544
|
-
expandedIcon: 'fas fa-building',
|
|
45545
|
-
collapsedIcon: 'fas fa-building',
|
|
45546
|
-
leaf: true
|
|
45547
|
-
});
|
|
45548
|
-
childNodes.children.push({
|
|
45549
|
-
label: 'Chứng thư cấp bởi: ' + item.certificate.issuerDN.nameOfIssuer,
|
|
45550
|
-
expandedIcon: 'fas fa-certificate',
|
|
45551
|
-
collapsedIcon: 'fas fa-certificate',
|
|
45552
|
-
leaf: true
|
|
45553
|
-
});
|
|
45554
|
-
childNodes.children.push({
|
|
45555
|
-
label: 'Thời gian ký: ' + moment$1(item.signDate).format('D/MM/Y hh:mm:ss Z'),
|
|
45556
|
-
expandedIcon: 'fas fa-clock',
|
|
45557
|
-
collapsedIcon: 'fas fa-clock',
|
|
45558
|
-
leaf: true
|
|
45559
|
-
});
|
|
45560
|
-
nodes.push(childNodes);
|
|
45561
|
-
}
|
|
45562
|
-
this.model.dataSource = nodes;
|
|
45563
|
-
};
|
|
45564
|
-
return SignatureDetailComponent;
|
|
45565
|
-
}(ComponentBase));
|
|
45566
|
-
SignatureDetailComponent.decorators = [
|
|
45567
|
-
{ type: i0.Component, args: [{
|
|
45568
|
-
selector: 'signature-detail',
|
|
45569
|
-
template: "<div class=\"tree-signature\">\r\n <p-tree [value]=\"model.dataSource\" [filter]=\"true\" [emptyMessage]=\"'Kh\u00F4ng c\u00F3 ch\u1EEF k\u00FD'\" styleClass=\"signature-tree\">\r\n </p-tree>\r\n</div>",
|
|
45570
|
-
providers: [ComponentContextService],
|
|
45571
|
-
styles: [":host::ng-deep .signature-tree{border:none;width:100%}:host::ng-deep .signature-tree .ui-treenode-icon{color:#888;padding-right:10px}:host::ng-deep .signature-tree span.fas.fa-signature+span{font-weight:700}:host::ng-deep .signature-tree span.ui-treenode-icon.fas.fa-signature{color:#212529!important;padding-left:5px}:host::ng-deep .signature-tree span.ui-tree-toggler{color:#212529!important}"]
|
|
45572
|
-
},] }
|
|
45573
|
-
];
|
|
45574
|
-
SignatureDetailComponent.ctorParameters = function () { return [
|
|
45575
|
-
{ type: i0.Injector }
|
|
45576
|
-
]; };
|
|
45577
|
-
|
|
45578
45709
|
function coreDeclaration() {
|
|
45579
45710
|
return [
|
|
45580
45711
|
AddressComponent,
|
|
@@ -45704,8 +45835,7 @@
|
|
|
45704
45835
|
FilePickerDialogComponent,
|
|
45705
45836
|
AddNewsComponent,
|
|
45706
45837
|
CommonDashboardComponent,
|
|
45707
|
-
NotFoundComponent
|
|
45708
|
-
SignatureDetailComponent
|
|
45838
|
+
NotFoundComponent
|
|
45709
45839
|
];
|
|
45710
45840
|
}
|
|
45711
45841
|
function coreModuleImport() {
|
|
@@ -47258,6 +47388,67 @@
|
|
|
47258
47388
|
{ type: ModuleConfigService }
|
|
47259
47389
|
]; };
|
|
47260
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
|
+
|
|
47261
47452
|
var ErrorType = /** @class */ (function () {
|
|
47262
47453
|
function ErrorType() {
|
|
47263
47454
|
}
|
|
@@ -47386,22 +47577,64 @@
|
|
|
47386
47577
|
return TemplateTextMany;
|
|
47387
47578
|
}());
|
|
47388
47579
|
|
|
47389
|
-
var
|
|
47390
|
-
function
|
|
47391
|
-
this.
|
|
47392
|
-
this.
|
|
47393
|
-
this.
|
|
47394
|
-
this.
|
|
47395
|
-
this.
|
|
47396
|
-
this.
|
|
47397
|
-
|
|
47398
|
-
|
|
47399
|
-
|
|
47400
|
-
|
|
47401
|
-
|
|
47402
|
-
|
|
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
|
+
});
|
|
47403
47636
|
}
|
|
47404
|
-
return
|
|
47637
|
+
return FileManagerSetting;
|
|
47405
47638
|
}());
|
|
47406
47639
|
|
|
47407
47640
|
(function (PermissionBase) {
|
|
@@ -47759,18 +47992,16 @@
|
|
|
47759
47992
|
exports.FILE_TYPES = FILE_TYPES;
|
|
47760
47993
|
exports.FieldDefineIsWorkflowControl = FieldDefineIsWorkflowControl;
|
|
47761
47994
|
exports.FileDataService = FileDataService;
|
|
47762
|
-
exports.FileExplorerItem = FileExplorerItem;
|
|
47763
|
-
exports.FileExplorerNewService = FileExplorerNewService;
|
|
47764
47995
|
exports.FileExplorerService = FileExplorerService;
|
|
47765
47996
|
exports.FileManagerComponent = FileManagerComponent;
|
|
47766
47997
|
exports.FileManagerControlSchema = FileManagerControlSchema;
|
|
47998
|
+
exports.FileManagerSetting = FileManagerSetting;
|
|
47767
47999
|
exports.FileObjectService = FileObjectService;
|
|
47768
48000
|
exports.FilePickerDialogComponent = FilePickerDialogComponent;
|
|
47769
48001
|
exports.FileUploadComponent = FileUploadComponent;
|
|
47770
48002
|
exports.FileUploadControlSchema = FileUploadControlSchema;
|
|
48003
|
+
exports.FileUploadSetting = FileUploadSetting;
|
|
47771
48004
|
exports.FileV4Service = FileV4Service;
|
|
47772
|
-
exports.FileVersionDTO = FileVersionDTO;
|
|
47773
|
-
exports.FileVersionService = FileVersionService;
|
|
47774
48005
|
exports.Filter = Filter;
|
|
47775
48006
|
exports.FolderService = FolderService;
|
|
47776
48007
|
exports.FormControlBase = FormControlBase;
|
|
@@ -47811,7 +48042,6 @@
|
|
|
47811
48042
|
exports.ModuleConfigService = ModuleConfigService;
|
|
47812
48043
|
exports.MultiTranslateHttpLoader = MultiTranslateHttpLoader;
|
|
47813
48044
|
exports.MultipleReferenceDataFormatPipe = MultipleReferenceDataFormatPipe;
|
|
47814
|
-
exports.MyDriveService = MyDriveService;
|
|
47815
48045
|
exports.NodeService = NodeService;
|
|
47816
48046
|
exports.NotFoundComponent = NotFoundComponent;
|
|
47817
48047
|
exports.NotificationService = NotificationService;
|
|
@@ -47819,6 +48049,7 @@
|
|
|
47819
48049
|
exports.NumberCompareValidator = NumberCompareValidator;
|
|
47820
48050
|
exports.NumberOnlyValidator = NumberOnlyValidator;
|
|
47821
48051
|
exports.NumberRangeControlSchema = NumberRangeControlSchema;
|
|
48052
|
+
exports.OrganizationBaseService = OrganizationBaseService;
|
|
47822
48053
|
exports.OrganizationFormatPipe = OrganizationFormatPipe;
|
|
47823
48054
|
exports.OrganizationNameFormatPipe = OrganizationNameFormatPipe;
|
|
47824
48055
|
exports.OrganizationPickerControlSchema = OrganizationPickerControlSchema;
|
|
@@ -47860,7 +48091,6 @@
|
|
|
47860
48091
|
exports.SchemaBase = SchemaBase;
|
|
47861
48092
|
exports.SecurePipe = SecurePipe;
|
|
47862
48093
|
exports.ServiceFileUploadComponent = ServiceFileUploadComponent;
|
|
47863
|
-
exports.ServiceRequestModel = ServiceRequestModel;
|
|
47864
48094
|
exports.SessionTypes = SessionTypes;
|
|
47865
48095
|
exports.SignalRService = SignalRService;
|
|
47866
48096
|
exports.SimpleDicItem = SimpleDicItem;
|
|
@@ -48063,27 +48293,29 @@
|
|
|
48063
48293
|
exports.ɵd = ExceptionHandlerService;
|
|
48064
48294
|
exports.ɵda = TnAppNotificationListComponent;
|
|
48065
48295
|
exports.ɵdb = TnAppNotificationComponent;
|
|
48066
|
-
exports.ɵdc =
|
|
48067
|
-
exports.ɵdd =
|
|
48068
|
-
exports.ɵde =
|
|
48069
|
-
exports.ɵdf =
|
|
48070
|
-
exports.ɵdg =
|
|
48071
|
-
exports.ɵdh =
|
|
48072
|
-
exports.ɵdi =
|
|
48073
|
-
exports.ɵdj =
|
|
48074
|
-
exports.ɵdk =
|
|
48075
|
-
exports.ɵdl =
|
|
48076
|
-
exports.ɵdm =
|
|
48077
|
-
exports.ɵdn =
|
|
48078
|
-
exports.ɵdo =
|
|
48079
|
-
exports.ɵdp =
|
|
48080
|
-
exports.ɵdq =
|
|
48081
|
-
exports.ɵdr =
|
|
48082
|
-
exports.ɵds =
|
|
48083
|
-
exports.ɵdt =
|
|
48084
|
-
exports.ɵdu =
|
|
48085
|
-
exports.ɵdv =
|
|
48086
|
-
exports.ɵdw =
|
|
48296
|
+
exports.ɵdc = MyDriveService;
|
|
48297
|
+
exports.ɵdd = FileVersionService;
|
|
48298
|
+
exports.ɵde = FileExplorerNewService;
|
|
48299
|
+
exports.ɵdf = FolderFormComponent;
|
|
48300
|
+
exports.ɵdg = FileFormComponent;
|
|
48301
|
+
exports.ɵdh = FileViewerComponent;
|
|
48302
|
+
exports.ɵdi = FileVersionListComponent;
|
|
48303
|
+
exports.ɵdj = WorkflowHistoryComponent;
|
|
48304
|
+
exports.ɵdk = EntityWorkflowHistoryService;
|
|
48305
|
+
exports.ɵdl = WorkflowHistoryDialogComponent;
|
|
48306
|
+
exports.ɵdm = WorkflowHistoryNewComponent;
|
|
48307
|
+
exports.ɵdn = WorkflowSettingComponent;
|
|
48308
|
+
exports.ɵdo = EntityWorkflowSettingService;
|
|
48309
|
+
exports.ɵdp = WorkflowSettingDialogComponent;
|
|
48310
|
+
exports.ɵdq = QrCodeGeneratorComponent;
|
|
48311
|
+
exports.ɵdr = AccessDeniedV1Component;
|
|
48312
|
+
exports.ɵds = AddNewsComponent;
|
|
48313
|
+
exports.ɵdt = ArticleService;
|
|
48314
|
+
exports.ɵdu = NewsCategoryService;
|
|
48315
|
+
exports.ɵdv = CheckReadyComponent;
|
|
48316
|
+
exports.ɵdw = SendAccessTokenInterceptor;
|
|
48317
|
+
exports.ɵdx = LogInterceptor;
|
|
48318
|
+
exports.ɵdy = PermissionUtilsInterceptor;
|
|
48087
48319
|
exports.ɵe = CanBo_HoSoService;
|
|
48088
48320
|
exports.ɵf = AfterViewCheckedComponent;
|
|
48089
48321
|
exports.ɵg = AdvanceSearchComponent;
|