tnx-shared 5.1.173 → 5.1.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/bundles/tnx-shared.umd.js +269 -138
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/component-base.d.ts +1 -1
  6. package/classes/base/component-base.d.ts.map +1 -1
  7. package/classes/base/data-form-base.d.ts.map +1 -1
  8. package/classes/base/data-list-base.d.ts.map +1 -1
  9. package/classes/form-schema.d.ts +12 -0
  10. package/classes/form-schema.d.ts.map +1 -1
  11. package/components/check-box-list/check-box-list.component.d.ts.map +1 -1
  12. package/components/common-app-component/app.menu.component.d.ts.map +1 -1
  13. package/components/congviec-picker/models/enums.d.ts +5 -0
  14. package/components/congviec-picker/models/enums.d.ts.map +1 -0
  15. package/components/crud/crud-form/crud-form.component.d.ts +1 -2
  16. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  17. package/components/crud/crud-list/crud-list.component.d.ts +1 -0
  18. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  19. package/components/tn-app-help/tn-app-help.component.d.ts +1 -0
  20. package/components/tn-app-help/tn-app-help.component.d.ts.map +1 -1
  21. package/components/tn-tabview/tn-tabview.component.d.ts +2 -1
  22. package/components/tn-tabview/tn-tabview.component.d.ts.map +1 -1
  23. package/components/vanban-picker/vanban-picker.component.d.ts +3 -0
  24. package/components/vanban-picker/vanban-picker.component.d.ts.map +1 -1
  25. package/components/workflow/services/workflow-history.service.d.ts +4 -0
  26. package/components/workflow/services/workflow-history.service.d.ts.map +1 -1
  27. package/components/workflow/services/workflow-settings.service.d.ts +4 -0
  28. package/components/workflow/services/workflow-settings.service.d.ts.map +1 -1
  29. package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts +5 -4
  30. package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts.map +1 -1
  31. package/congviec/congviec/congviec.component.d.ts +6 -0
  32. package/congviec/congviec/congviec.component.d.ts.map +1 -1
  33. package/congviec/dm-loai-congviec/dm-loai-congviec-form/dm-loai-congviec-form.component.d.ts.map +1 -1
  34. package/congviec/dm-loai-congviec/dm-loai-congviec.component.d.ts.map +1 -1
  35. package/enums/common.d.ts +2 -1
  36. package/enums/common.d.ts.map +1 -1
  37. package/esm2015/classes/base/component-base.js +4 -3
  38. package/esm2015/classes/base/data-form-base.js +5 -1
  39. package/esm2015/classes/base/data-list-base.js +3 -2
  40. package/esm2015/classes/form-schema.js +12 -1
  41. package/esm2015/components/check-box-list/check-box-list.component.js +19 -60
  42. package/esm2015/components/common-app-component/app.menu.component.js +9 -1
  43. package/esm2015/components/congviec-picker/models/enums.js +6 -0
  44. package/esm2015/components/crud/crud-form/crud-form.component.js +3 -7
  45. package/esm2015/components/crud/crud-list/crud-list.component.js +7 -1
  46. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +2 -2
  47. package/esm2015/components/file-explorer/file-viewer/file-viewer.component.js +2 -2
  48. package/esm2015/components/tn-app-help/tn-app-help.component.js +6 -2
  49. package/esm2015/components/tn-tabview/tn-tabview.component.js +2 -2
  50. package/esm2015/components/vanban-picker/vanban-picker.component.js +29 -11
  51. package/esm2015/components/workflow/services/workflow-history.service.js +12 -1
  52. package/esm2015/components/workflow/services/workflow-settings.service.js +45 -11
  53. package/esm2015/components/workflow/workflow-history-new/workflow-history-new.component.js +52 -14
  54. package/esm2015/congviec/congviec/congviec.component.js +19 -3
  55. package/esm2015/congviec/dm-loai-congviec/dm-loai-congviec-form/dm-loai-congviec-form.component.js +7 -3
  56. package/esm2015/congviec/dm-loai-congviec/dm-loai-congviec.component.js +3 -2
  57. package/esm2015/enums/common.js +2 -1
  58. package/esm2015/models/grid-info.js +2 -1
  59. package/esm2015/public-api.js +2 -1
  60. package/esm2015/services/base.service.js +4 -3
  61. package/esm2015/services/common.service.js +3 -2
  62. package/fesm2015/tnx-shared.js +237 -114
  63. package/fesm2015/tnx-shared.js.map +1 -1
  64. package/models/grid-info.d.ts +1 -0
  65. package/models/grid-info.d.ts.map +1 -1
  66. package/package.json +2 -2
  67. package/public-api.d.ts +1 -0
  68. package/public-api.d.ts.map +1 -1
  69. package/services/base.service.d.ts +1 -1
  70. package/services/base.service.d.ts.map +1 -1
  71. package/services/common.service.d.ts +1 -1
  72. package/services/common.service.d.ts.map +1 -1
  73. package/tnx-shared.metadata.json +1 -1
@@ -624,6 +624,7 @@
624
624
  }());
625
625
  var Filter = /** @class */ (function () {
626
626
  function Filter(init) {
627
+ this.valueIsField = false;
627
628
  this.filters = [];
628
629
  for (var key in init) {
629
630
  this[key] = init[key];
@@ -2287,10 +2288,12 @@
2287
2288
  filters: __spread(filters),
2288
2289
  });
2289
2290
  };
2290
- CommonService.prototype.newFilter = function (field, operator, value) {
2291
+ CommonService.prototype.newFilter = function (field, operator, value, valueIsField) {
2292
+ if (valueIsField === void 0) { valueIsField = false; }
2291
2293
  return new Filter({
2292
2294
  field: field, operator: operator,
2293
2295
  value: JSON.stringify(value),
2296
+ valueIsField: valueIsField,
2294
2297
  });
2295
2298
  };
2296
2299
  CommonService.prototype.newFilterV4 = function (field, operator, value) {
@@ -2988,6 +2991,7 @@
2988
2991
  PermissionBase[PermissionBase["READ"] = 1] = "READ";
2989
2992
  PermissionBase[PermissionBase["EDIT"] = 2] = "EDIT";
2990
2993
  PermissionBase[PermissionBase["DELETE"] = 4] = "DELETE";
2994
+ PermissionBase[PermissionBase["FULL"] = 7] = "FULL";
2991
2995
  })(exports.PermissionBase || (exports.PermissionBase = {}));
2992
2996
 
2993
2997
  var ExportItem = /** @class */ (function () {
@@ -3305,6 +3309,11 @@
3305
3309
  ButtonTextActionCongViec["XEM_LICH_SU"] = "Xem l\u1ECBch s\u1EED";
3306
3310
  })(exports.ButtonTextActionCongViec || (exports.ButtonTextActionCongViec = {}));
3307
3311
 
3312
+ (function (EnumLoaiVanBanBase) {
3313
+ EnumLoaiVanBanBase[EnumLoaiVanBanBase["VB_DEN"] = 1] = "VB_DEN";
3314
+ EnumLoaiVanBanBase[EnumLoaiVanBanBase["VB_DI"] = 2] = "VB_DI";
3315
+ })(exports.EnumLoaiVanBanBase || (exports.EnumLoaiVanBanBase = {}));
3316
+
3308
3317
  var ModelSchema = /** @class */ (function () {
3309
3318
  function ModelSchema(init) {
3310
3319
  this.dataType = 'string';
@@ -4223,6 +4232,8 @@
4223
4232
  _this.mdWidth = 12;
4224
4233
  _this.useVbDen = true;
4225
4234
  _this.useVbDi = true;
4235
+ _this.readonly = false;
4236
+ _this.loaiVanBan = exports.EnumLoaiVanBanBase.VB_DI;
4226
4237
  for (var key in init) {
4227
4238
  _this[key] = init[key];
4228
4239
  }
@@ -4565,6 +4576,15 @@
4565
4576
  });
4566
4577
  return EventData;
4567
4578
  }());
4579
+ var TabViewData = /** @class */ (function () {
4580
+ function TabViewData(init) {
4581
+ this.hidden = false;
4582
+ for (var key in init) {
4583
+ this[key] = init[key];
4584
+ }
4585
+ }
4586
+ return TabViewData;
4587
+ }());
4568
4588
  (function (DataType) {
4569
4589
  DataType["date"] = "date";
4570
4590
  DataType["datetime"] = "datetime";
@@ -7139,10 +7159,12 @@
7139
7159
  });
7140
7160
  });
7141
7161
  };
7142
- BaseService.prototype.newFilter = function (field, operator, value) {
7162
+ BaseService.prototype.newFilter = function (field, operator, value, valueIsField) {
7163
+ if (valueIsField === void 0) { valueIsField = false; }
7143
7164
  return new Filter({
7144
7165
  field: field, operator: operator,
7145
- value: JSON.stringify(value)
7166
+ value: JSON.stringify(value),
7167
+ valueIsField: valueIsField
7146
7168
  });
7147
7169
  };
7148
7170
  BaseService.prototype.newFilterV4 = function (field, operator, value) {
@@ -8693,10 +8715,12 @@
8693
8715
  filters: __spread(filters)
8694
8716
  });
8695
8717
  };
8696
- ComponentBase.prototype.newFilter = function (field, operator, value) {
8718
+ ComponentBase.prototype.newFilter = function (field, operator, value, valueIsField) {
8719
+ if (valueIsField === void 0) { valueIsField = false; }
8697
8720
  return new Filter({
8698
8721
  field: field, operator: operator,
8699
- value: JSON.stringify(value)
8722
+ value: JSON.stringify(value),
8723
+ valueIsField: valueIsField
8700
8724
  });
8701
8725
  };
8702
8726
  ComponentBase.prototype.newFilterV4 = function (field, operator, value) {
@@ -11454,6 +11478,7 @@
11454
11478
  __extends(WorkflowHistoryService, _super);
11455
11479
  function WorkflowHistoryService(http, injector, _moduleConfigService) {
11456
11480
  var _this = _super.call(this, http, injector, _moduleConfigService.getConfig().environment.apiDomain.workflowEndpoint + "/" + _moduleConfigService.getConfig().environment.apiVersion + "/WorkflowHistory") || this;
11481
+ _this.serviceManagers = {};
11457
11482
  _this.entityName = 'WorkflowHistory';
11458
11483
  _this.serviceCode = 'workflow';
11459
11484
  _this.apiDomain = _moduleConfigService.getConfig().environment.apiDomain;
@@ -11462,6 +11487,16 @@
11462
11487
  _this.apiVersion = _moduleConfigService.getConfig().environment.apiVersion;
11463
11488
  return _this;
11464
11489
  }
11490
+ WorkflowHistoryService.prototype.registerService = function (settingKey, service) {
11491
+ this.serviceManagers[settingKey] = service;
11492
+ };
11493
+ WorkflowHistoryService.prototype.getEndpointByService = function (service) {
11494
+ return service.endPoint + "/" + this._moduleConfig.environment.apiVersion;
11495
+ };
11496
+ WorkflowHistoryService.prototype.changeEndpoint = function (baseService) {
11497
+ this.serviceUri = this.getEndpointByService(baseService) + "/WorkflowHistory";
11498
+ return this;
11499
+ };
11465
11500
  WorkflowHistoryService.prototype.getLastByItemId = function (itemId) {
11466
11501
  // return this.getDetailByFilter(
11467
11502
  // [
@@ -15469,13 +15504,6 @@
15469
15504
  });
15470
15505
  });
15471
15506
  };
15472
- CrudFormComponent.prototype.handleDataSourceLoadComplete = function (control, parentPath, dataSource) {
15473
- return __awaiter(this, void 0, void 0, function () {
15474
- return __generator(this, function (_d) {
15475
- return [2 /*return*/];
15476
- });
15477
- });
15478
- };
15479
15507
  CrudFormComponent.prototype.handleDataSourceLoaded = function (control, parentPath, dataFromDropdown) {
15480
15508
  return __awaiter(this, void 0, void 0, function () {
15481
15509
  var parentNode, currentNode, eventData, _a_3;
@@ -16390,7 +16418,7 @@
16390
16418
  CrudFormComponent.decorators = [
16391
16419
  { type: i0.Component, args: [{
16392
16420
  selector: 'crud-form',
16393
- template: "<div [class]=\"_styleClass\">\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\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 </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\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]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [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]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [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 [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(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]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(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]=\"checkDisabled(data, control) ? true : null\" [(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 *ngIf=\"!checkDisabled(data, control)\" [(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\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\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\" [layout]=\"control.layout\"\r\n [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\r\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\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]\" (onSelected)=\"control.onSelected($event)\"\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]\" [disabled]=\"checkDisabled(data, control)\"\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=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-slider>\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)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\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<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\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>",
16421
+ template: "<div [class]=\"_styleClass\">\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\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 </div>\r\n </form>\r\n</div>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\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]=\"checkDisabled(data, control) ? true : null\" pInputText\r\n [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]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\r\n [(ngModel)]=\"data[control.field]\" [max]=\"control.max\" [min]=\"control.min\"\r\n [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 [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\r\n [(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]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\r\n [(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]=\"checkDisabled(data, control) ? true : null\" [(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 *ngIf=\"!checkDisabled(data, control)\" [(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\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\">\r\n </tn-tinymce>\r\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\r\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\r\n </div>\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]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\r\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [maxFileSize]=\"control.maxFileSize\"\r\n [inTaiLieu]=\"control.inTaiLieu\" [inTaiLieuChung]=\"control.inTaiLieuChung\"\r\n [copyToFolderId]=\"control.copyToFolderId\"\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]\" (onSelected)=\"control.onSelected($event)\"\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]\" [disabled]=\"checkDisabled(data, control)\"\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]\" [readOnly]=\"control.readOnly\"\r\n [loaiVanBan]=\"control.loaiVanBan\"\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=\"'percent'\">\r\n <div>\r\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </tn-mask>\r\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onSlideEnd)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\r\n </p-slider>\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)\" [ngTemplateOutletContext]=\"{\r\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\r\n }\">\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<ng-template #templateCongViecForm let-control=\"control\">\r\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\r\n </base-congviec-form>\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>",
16394
16422
  providers: [ComponentContextService],
16395
16423
  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}.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{-webkit-animation:shrink .1s;animation:shrink .1s;min-height:20px;overflow:visible;padding-top:5px}::ng-deep .crud-form-control>.error-container .error-item .error-content{-webkit-animation:fadeIn .1s;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}@-webkit-keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@-webkit-keyframes shrink{0%{height:0}to{height:20px}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}::ng-deep crud-form .crud-form-container{padding:.5rem .5rem 0}::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control),::ng-deep crud-form base-congviec-form crud-form>.crud-form-container{padding:0}: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}"]
16396
16424
  },] }
@@ -17331,6 +17359,10 @@
17331
17359
  });
17332
17360
  }
17333
17361
  data.__disableEdit = this.model.data.__disableEdit;
17362
+ // Set basePermission từ crudlist
17363
+ if (this.model.data.basePermission && this.model.data.basePermission === exports.PermissionBase.FULL) {
17364
+ data.basePermission = this.model.data.basePermission;
17365
+ }
17334
17366
  this.model.data = data;
17335
17367
  if (data.pid && data.pid != this.guidEmpty && data.basePermissionByPid !== undefined) {
17336
17368
  this.checkPermission(data.basePermissionByPid);
@@ -20358,6 +20390,7 @@
20358
20390
  }
20359
20391
  buttonContexts.sort(multipleSort('soThuTu'));
20360
20392
  workflowHistoryService = this._injector.get(WorkflowHistoryService);
20393
+ workflowHistoryService.changeEndpoint(this.setting.baseService);
20361
20394
  userService = this._injector.get(UserService);
20362
20395
  userId = userService.getId();
20363
20396
  userIdStringUpper = '';
@@ -21995,6 +22028,11 @@
21995
22028
  }
21996
22029
  return !this.buttonPermissionMap.get(this.setting.baseService.serviceCode + "/" + this.setting.baseService.entityName + "/" + buttonPermissionCode);
21997
22030
  };
22031
+ CrudListComponent.prototype.setDropdownDatasource = function (field, dataSource) {
22032
+ if (this.filterSchema.dropdown[field]) {
22033
+ this.filterSchema.dropdown[field].dataSource = dataSource;
22034
+ }
22035
+ };
21998
22036
  return CrudListComponent;
21999
22037
  }(ComponentBase));
22000
22038
  CrudListComponent.decorators = [
@@ -22158,7 +22196,6 @@
22158
22196
  this.serviceUri = this.getEndpointByService(service) + "/WorkflowSetting";
22159
22197
  };
22160
22198
  WorkflowSettingsService.prototype.renderDataSourceActionWorkflow = function (workflowSchema) {
22161
- var _this = this;
22162
22199
  var dataSourceAction = [];
22163
22200
  var dicSameName = {};
22164
22201
  workflowSchema.connections.sort(multipleSort('soThuTu')).forEach(function (action) {
@@ -22189,6 +22226,51 @@
22189
22226
  dataSourceAction.push(itemAdd_1);
22190
22227
  }
22191
22228
  });
22229
+ this.makeUniqueName(dicSameName);
22230
+ return dataSourceAction;
22231
+ };
22232
+ WorkflowSettingsService.prototype.generateTenWithCode = function (item) {
22233
+ item.ten = item.name + " - " + item.rawCode;
22234
+ };
22235
+ WorkflowSettingsService.prototype.generateTenWithSource = function (item) {
22236
+ item.ten = item.name + " (" + item.sourceName + " - " + item.sourceCode + ")";
22237
+ };
22238
+ WorkflowSettingsService.prototype.generateTenFull = function (item) {
22239
+ item.ten = item.name + " - " + item.rawCode + " (" + item.sourceName + " - " + item.sourceCode + ")";
22240
+ };
22241
+ WorkflowSettingsService.prototype.minimizeDatasourceAction = function (actions, lstWorkflowHistory) {
22242
+ var dataSourceAction = [];
22243
+ var dicSameName = {};
22244
+ actions.forEach(function (action) {
22245
+ if (action.buildIn) {
22246
+ dataSourceAction.push(action);
22247
+ return;
22248
+ }
22249
+ action.ten = action.shortTen;
22250
+ if (lstWorkflowHistory) {
22251
+ if (!lstWorkflowHistory.some(function (q) { return q.sourceStatusCode == action.sourceCode && q.actionCode == action.rawCode; })) {
22252
+ return;
22253
+ }
22254
+ }
22255
+ var itemExist = dataSourceAction.find(function (q) { return q.nameLower == action.nameLower; });
22256
+ if (itemExist) {
22257
+ if (!dicSameName[action.nameLower]) {
22258
+ dicSameName[action.nameLower] = [];
22259
+ }
22260
+ if (dicSameName[action.nameLower].indexOf(itemExist) == -1) {
22261
+ dicSameName[action.nameLower].push(itemExist);
22262
+ }
22263
+ if (dicSameName[action.nameLower].indexOf(action) == -1) {
22264
+ dicSameName[action.nameLower].push(action);
22265
+ }
22266
+ }
22267
+ dataSourceAction.push(action);
22268
+ });
22269
+ this.makeUniqueName(dicSameName);
22270
+ return dataSourceAction;
22271
+ };
22272
+ WorkflowSettingsService.prototype.makeUniqueName = function (dicSameName) {
22273
+ var _this = this;
22192
22274
  Object.values(dicSameName).forEach(function (lstItem) {
22193
22275
  var arrTen = [];
22194
22276
  var error = false;
@@ -22220,16 +22302,6 @@
22220
22302
  _this.generateTenFull(lstItem[i]);
22221
22303
  }
22222
22304
  });
22223
- return dataSourceAction;
22224
- };
22225
- WorkflowSettingsService.prototype.generateTenWithCode = function (item) {
22226
- item.ten = item.name + " - " + item.rawCode;
22227
- };
22228
- WorkflowSettingsService.prototype.generateTenWithSource = function (item) {
22229
- item.ten = item.name + " (" + item.sourceName + " - " + item.sourceCode + ")";
22230
- };
22231
- WorkflowSettingsService.prototype.generateTenFull = function (item) {
22232
- item.ten = item.name + " - " + item.rawCode + " (" + item.sourceName + " - " + item.sourceCode + ")";
22233
22305
  };
22234
22306
  return WorkflowSettingsService;
22235
22307
  }(BaseService));
@@ -22859,7 +22931,8 @@
22859
22931
  return {
22860
22932
  pid: rowData.pid,
22861
22933
  basePermissionByPid: rowData.basePermissionByPid,
22862
- id: rowData[this.setting.entityKey]
22934
+ id: rowData[this.setting.entityKey],
22935
+ basePermission: rowData.basePermission
22863
22936
  };
22864
22937
  };
22865
22938
  DataListBase.prototype.getPromiseDeleteItem = function (rowData) {
@@ -27505,12 +27578,9 @@
27505
27578
  CheckBoxListComponent.prototype.ngOnInit = function () {
27506
27579
  this.fieldValue = this.control.valueField;
27507
27580
  if (this.control.dataSource == null || this.control.dataSource.length == 0) {
27508
- this.bindDataSource(this.control.serviceUri, this.control.baseService);
27509
- // if (this.control.serviceUri) {
27510
- // }
27511
- // else if(this.control.baseService) {
27512
- //
27513
- // }
27581
+ if (this.control.serviceUri) {
27582
+ this.bindDataSource();
27583
+ }
27514
27584
  }
27515
27585
  else {
27516
27586
  this.dataSourceInternal = this.control.dataSource;
@@ -27528,56 +27598,20 @@
27528
27598
  this.classCheckBox += " p-col-" + this.control.pColClass;
27529
27599
  }
27530
27600
  };
27531
- CheckBoxListComponent.prototype.bindDataSource = function (serviceUri, baseService) {
27601
+ CheckBoxListComponent.prototype.bindDataSource = function () {
27532
27602
  var _this = this;
27533
- var _a, _b;
27534
- if (baseService) {
27535
- if (baseService instanceof BaseService) {
27536
- var dropdownOptions = new DropdownOptions({
27537
- displayField: (_a = this.control.displayField) !== null && _a !== void 0 ? _a : 'ten',
27538
- valueField: (_b = this.control.valueField) !== null && _b !== void 0 ? _b : 'id',
27539
- });
27540
- baseService.getDataDropdown(dropdownOptions).then(function (res) {
27541
- _this.dataSourceInternal = res;
27542
- _this.gotData = true;
27543
- if (_this.wroteValue)
27544
- _this.fixValue();
27545
- _this.onReady.emit(_this.control.field);
27546
- }).catch(function (err) {
27547
- _this.onReady.emit(_this.control.field);
27548
- console.log(err);
27549
- });
27550
- }
27551
- else if (baseService instanceof MasterDataService) {
27552
- baseService.getDropdown(this.control.groupCode).then(function (res) {
27553
- // const displayField = this.control.displayField ?? 'id';
27554
- // const valueField = this.control.valueField ?? 'code';
27555
- _this.dataSourceInternal = res.map(function (item) {
27556
- return { id: item.value, ten: item.label };
27557
- });
27558
- if (_this.wroteValue)
27559
- _this.fixValue();
27560
- _this.onReady.emit(_this.control.field);
27561
- }).catch(function (err) {
27562
- console.log(err);
27563
- _this.onReady.emit(_this.control.field);
27564
- });
27603
+ this._dropDownService.getDataSource(this.control.serviceUri).then(function (rs) {
27604
+ var arr = [];
27605
+ // for (let i = 0; i < rs.data.length; i++) {
27606
+ // arr.push({ label: rs.data[i][this.control.displayField], title: rs.data[i][this.control.displayField], value: rs.data[i][this.control.valueField] });
27607
+ // }
27608
+ _this.dataSourceInternal = rs.data;
27609
+ _this.gotData = true;
27610
+ if (_this.wroteValue) {
27611
+ _this.fixValue();
27565
27612
  }
27566
- }
27567
- else if (serviceUri) {
27568
- this._dropDownService.getDataSource(serviceUri).then(function (rs) {
27569
- var arr = [];
27570
- // for (let i = 0; i < rs.data.length; i++) {
27571
- // arr.push({ label: rs.data[i][this.control.displayField], title: rs.data[i][this.control.displayField], value: rs.data[i][this.control.valueField] });
27572
- // }
27573
- _this.dataSourceInternal = rs.data;
27574
- _this.gotData = true;
27575
- if (_this.wroteValue) {
27576
- _this.fixValue();
27577
- }
27578
- }, function (error) {
27579
- });
27580
- }
27613
+ }, function (error) {
27614
+ });
27581
27615
  };
27582
27616
  CheckBoxListComponent.prototype.change = function (event) {
27583
27617
  var totalValue = __spread(this.selectedValue);
@@ -27645,8 +27679,8 @@
27645
27679
  {
27646
27680
  provide: forms.NG_VALUE_ACCESSOR,
27647
27681
  useExisting: i0.forwardRef(function () { return CheckBoxListComponent; }),
27648
- multi: true,
27649
- },
27682
+ multi: true
27683
+ }
27650
27684
  ],
27651
27685
  styles: [".tn-check-box-list.p-grid{margin-bottom:-.5em}.p-col-horizontal{padding:.5em;position:relative}.tn-check-box-list{position:relative}.tn-check-box-list.flex-end{justify-content:flex-end}.tn-check-box-list.flex-center{justify-content:center}"]
27652
27686
  },] }
@@ -28774,6 +28808,10 @@
28774
28808
  return _this;
28775
28809
  }
28776
28810
  AppSubMenuComponent.prototype.itemClick = function (event, item) {
28811
+ if (item.url) {
28812
+ // go to external url, default target="_blank"
28813
+ window.open(item.url);
28814
+ }
28777
28815
  if (this.root) {
28778
28816
  this._commonService.menuHoverActive = !this._commonService.menuHoverActive;
28779
28817
  }
@@ -28920,6 +28958,10 @@
28920
28958
  AppMenuComponent.prototype.ngOnInit = function () {
28921
28959
  };
28922
28960
  AppMenuComponent.prototype.activeItem = function (item) {
28961
+ if (item.url) {
28962
+ item.activated = false;
28963
+ return false;
28964
+ }
28923
28965
  if (item.items && item.items.length > 0) {
28924
28966
  item.activated = undefined;
28925
28967
  for (var i in item.items) {
@@ -36788,7 +36830,7 @@
36788
36830
  { type: i0.Component, args: [{
36789
36831
  // tslint:disable-next-line: component-selector
36790
36832
  selector: 'file-manager',
36791
- template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\">\r\n <div class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton pRipple type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\"\r\n tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\" label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\"\r\n (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i t\u1EC7p tin t\u1EEB m\u00E1y t\u00EDnh c\u1EE7a b\u1EA1n\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i l\u00EAn\"\r\n (click)=\"selectFile()\"></button>\r\n\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\" tooltipPosition=\"top\"\r\n type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n\r\n <!--<button *ngIf=\"model.selectedItems && model.selectedItems.length > 1\" class=\"p-button-text\" pButton\r\n type=\"button\"\r\n pTooltip=\"N\u00E9n & sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\"\r\n iconPos=\"left\" label=\"N\u00E9n & sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\"\r\n (click)=\"generateZipLinkAndCopy()\">\r\n </button>-->\r\n\r\n <button *ngIf=\"!inTaiLieu && !inTaiLieuChung\" pButton icon=\"pi pi-book\"\r\n pTooltip=\"Sao ch\u00E9p t\u1EEB t\u00E0i li\u1EC7u d\u00F9ng chung ho\u1EB7c c\u00E1 nh\u00E2n\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-text\" label=\"T\u00E0i li\u1EC7u\" (click)=\"showTaiLieuDungChung = true;\">\r\n </button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\"\r\n iconPos=\"left\" label=\"Di chuy\u1EC3n\" (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn t\u1EDBi \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\"\r\n iconPos=\"left\" label=\"\u0110\u1EB7t t\u1EA1i \u0111\u00E2y\" (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" icon=\"pi pi-undo\" pButton class=\"p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" label=\"B\u1ECF qua\"\r\n (click)=\"cancelMove()\">\r\n </button>\r\n\r\n <button *ngIf=\"hasSelect()\" pButton type=\"button\"\r\n pTooltip=\"{{ 'X\u00F3a th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn' | translate }}\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n iconPos=\"left\" class=\"p-button-text p-button-danger\" label=\"X\u00F3a\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n\r\n <button *ngIf=\"hasSelect()\" class=\"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 label=\"T\u1EA3i v\u1EC1\" (click)=\"downloadMultiple()\">\r\n </button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\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 [widthFunctionColumn]=\"'8.2rem'\" (onReload)=\"_triggerProcessData($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span (click)=\"openObject(rowData)\" class=\"pull-left file-ex-icon\"\r\n [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\">\r\n </span>\r\n\r\n <span (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n {{rowData.name}}\r\n </span>\r\n <span *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 </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 <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text link-or-action\" pButton type=\"button\"\r\n tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\" (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\" pButton\r\n type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\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 <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"pi pi-cloud-download\"\r\n (click)=\"download(rowData)\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button>\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 *ngIf=\"!readonly || data.breadcrumbs.length > 0\" class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" (click)=\"createFolder()\" pButton pRipple type=\"button\"\r\n pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\" tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\"\r\n label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\">\r\n </button>\r\n <button type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-cloud-upload\" (click)=\"selectFile()\" label=\"T\u1EA3i l\u00EAn\"></button>\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\" tooltipPosition=\"top\"\r\n type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n <button *ngIf=\"!inTaiLieu\" pButton icon=\"pi pi-book\" pTooltip=\"T\u00E0i li\u1EC7u d\u00F9ng chung\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text\" label=\"T\u00E0i li\u1EC7u\"\r\n (click)=\"showTaiLieuDungChung = true;\">\r\n </button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\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 : !rowData.isFile\">\r\n </span>\r\n <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>\r\n <span>{{rowData.name}}</span>\r\n </span>\r\n </a>\r\n </div>\r\n <div *ngIf=\"rowData.signatures\" class=\"nfl-signature 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 <div *ngIf=\"rowData.isFile\" 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 link-or-action\" (click)=\"onButtonClick(rowData)\"\r\n pButton type=\"button\" tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\"\r\n (click)=\"deleteFile(rowData)\" pButton type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\"></button>\r\n </ng-container>\r\n\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n (click)=\"download(rowData)\" pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\"\r\n icon=\"pi pi-cloud-download\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button>\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 </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<div *ngIf=\"layout == _layout.SIMPLE_FOR_LIST\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div *ngIf=\"!readonly || data.breadcrumbs.length > 0\" class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" (click)=\"createFolder()\" pButton pRipple type=\"button\"\r\n pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\" tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\"\r\n label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\">\r\n </button>\r\n <button type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-cloud-upload\" (click)=\"selectFile()\" label=\"T\u1EA3i l\u00EAn\"></button>\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\" tooltipPosition=\"top\"\r\n type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n <button *ngIf=\"!inTaiLieu\" pButton icon=\"pi pi-book\" pTooltip=\"T\u00E0i li\u1EC7u d\u00F9ng chung\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text\" label=\"T\u00E0i li\u1EC7u\"\r\n (click)=\"showTaiLieuDungChung = true;\">\r\n </button>\r\n </ng-container>\r\n </div>\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 : !rowData.isFile\">\r\n </span>\r\n\r\n <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>\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 </span>\r\n <!-- <span class=\"file-ex-extension\">{{rowData.extension}}</span> -->\r\n </a>\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 link-or-action\" (click)=\"onButtonClick(rowData)\"\r\n pButton type=\"button\" tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\"\r\n (click)=\"deleteFile(rowData)\" pButton type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\"></button>\r\n </ng-container>\r\n <!--\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n (click)=\"download(rowData)\" pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\"\r\n icon=\"pi pi-cloud-download\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button> -->\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 </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<ng-template #breadCrumb>\r\n <div *ngIf=\"data.breadcrumbs.length > 0\" class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n</ng-template>\r\n\r\n<p-fileUpload #fileControl [ngStyle]=\"{'display': 'none'}\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file\"\r\n [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 [accept]=\"control ? control.accept: null\">\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\" [readonly]=\"readonly\"\r\n [model]=\"forms.fileViewer.formData\" (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<tn-dialog *ngIf=\"showAttachLinkBox\" #dialog2 [maximizable]=\"false\" [header]=\"'Nh\u1EADp li\u00EAn k\u1EBFt' | translate\"\r\n [popupSize]=\"{ width: 600, height: 50}\" (onHide)=\"showAttachLinkBox = false; typedLink=''\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-grid\">\r\n <div class=\"p-md-10\">\r\n <input #input type=\"text\" placeholder=\"Nh\u1EADp li\u00EAn k\u1EBFt sao ch\u00E9p t\u1EEB t\u1EC7p tin kh\u00E1c...\"\r\n (keyup.enter)=\"addAttachLink()\" pInputText [(ngModel)]=\"typedLink\" class=\"p-col-12\" />\r\n </div>\r\n <div class=\"p-md-2\">\r\n <button type=\"button\" (click)=\"addAttachLink()\" [disabled]=\"typedLink != ''? null : true\" pButton\r\n class=\"p-button-primary p-col-12\" label=\"Ok\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <after-view-checked (loaded)=\"focusInput(input)\"></after-view-checked>\r\n</tn-dialog>\r\n\r\n<tn-dialog #dialog3 *ngIf=\"showTaiLieuDungChung\" [header]=\"'T\u00E0i li\u1EC7u' |translate\"\r\n [popupSize]=\"{ width:1024, height: 800 }\" (onHide)=\"showTaiLieuDungChung = false\">\r\n <file-tai-lieu #formBase [originalFolderId]=\"data.currentFolderId\"\r\n (onSaved)=\"showTaiLieuDungChung = false; this._triggerProcessData()\" (onCancel)=\"showTaiLieuDungChung = false\">\r\n </file-tai-lieu>\r\n</tn-dialog>\r\n\r\n<!--\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\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>\r\n<!--K\u00FD s\u1ED1 sim-->\r\n<tn-dialog *ngIf=\"forms.kySoSim.show\" #dialog [styleClass]=\"'address-form'\" [header]=\"forms.kySoSim.header | translate\"\r\n [popupSize]=\"forms.kySoSim.popupSize\" [showFooter]=\"true\" (onHide)=\"onCancelForm(formIds.kySoSim)\">\r\n <app-file-ky-so-sim #fileKySoSim [parentModel]=\"model\" [parentContext]=\"context\">\r\n </app-file-ky-so-sim>\r\n <ng-template #footer>\r\n <button type=\"button\" pButton icon=\"fas fa-images\" [disabled]=\"model.submitting\" class=\"p-button-text\"\r\n [label]=\"'Ch\u1ECDn ch\u1EEF k\u00FD' | translate\" (click)=\"chonChuKy()\"></button>\r\n <button type=\"button\" pButton icon=\"fas fa-signature\" class=\"p-button-text ui-button-success\"\r\n [disabled]=\"model.submitting\" [label]=\"'Th\u1EF1c hi\u1EC7n k\u00FD' | translate\" (click)=\"kySo()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" preventTab (click)=\"forms.kySoSim.show=false\"></button>\r\n </ng-template>\r\n</tn-dialog>",
36833
+ template: "<div *ngIf=\"layout == _layout.LIST\" class=\"full-layout\">\r\n <div class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" pButton pRipple type=\"button\" pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\"\r\n tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\" label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\"\r\n (click)=\"createFolder()\">\r\n </button>\r\n\r\n <button pButton icon=\"pi pi-cloud-upload\" pTooltip=\"T\u1EA3i t\u1EC7p tin t\u1EEB m\u00E1y t\u00EDnh c\u1EE7a b\u1EA1n\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i l\u00EAn\"\r\n (click)=\"selectFile()\"></button>\r\n\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\" tooltipPosition=\"top\"\r\n type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n\r\n <!--<button *ngIf=\"model.selectedItems && model.selectedItems.length > 1\" class=\"p-button-text\" pButton\r\n type=\"button\"\r\n pTooltip=\"N\u00E9n & sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"fas fa-file-archive\"\r\n iconPos=\"left\" label=\"N\u00E9n & sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\"\r\n (click)=\"generateZipLinkAndCopy()\">\r\n </button>-->\r\n\r\n <button *ngIf=\"!inTaiLieu && !inTaiLieuChung\" pButton icon=\"pi pi-book\"\r\n pTooltip=\"Sao ch\u00E9p t\u1EEB t\u00E0i li\u1EC7u d\u00F9ng chung ho\u1EB7c c\u00E1 nh\u00E2n\" tooltipPosition=\"top\" type=\"button\"\r\n class=\"p-button-text\" label=\"T\u00E0i li\u1EC7u\" (click)=\"showTaiLieuDungChung = true;\">\r\n </button>\r\n\r\n <button *ngIf=\"canSelect()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" icon=\"fas fa-arrows-alt\"\r\n iconPos=\"left\" label=\"Di chuy\u1EC3n\" (click)=\"moveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" class=\"p-button-text p-button-success\" pButton type=\"button\"\r\n pTooltip=\"Di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn t\u1EDBi \u0111\u00E2y\" tooltipPosition=\"top\" icon=\"far fa-hand-paper\"\r\n iconPos=\"left\" label=\"\u0110\u1EB7t t\u1EA1i \u0111\u00E2y\" (click)=\"setMoveExplorerItems()\">\r\n </button>\r\n\r\n <button *ngIf=\"canSetMove()\" icon=\"pi pi-undo\" pButton class=\"p-button-text p-button-secondary\"\r\n type=\"button\" pTooltip=\"B\u1ECF di chuy\u1EC3n th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\" label=\"B\u1ECF qua\"\r\n (click)=\"cancelMove()\">\r\n </button>\r\n\r\n <button *ngIf=\"hasSelect()\" pButton type=\"button\"\r\n pTooltip=\"{{ 'X\u00F3a th\u01B0 m\u1EE5c/t\u1EC7p tin \u0111\u00E3 ch\u1ECDn' | translate }}\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n iconPos=\"left\" class=\"p-button-text p-button-danger\" label=\"X\u00F3a\"\r\n (click)=\"deleteMutiple(model.selectedItems)\"></button>\r\n\r\n <button *ngIf=\"hasSelect()\" class=\"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 label=\"T\u1EA3i v\u1EC1\" (click)=\"downloadMultiple()\">\r\n </button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\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 [widthFunctionColumn]=\"'8.2rem'\" (onReload)=\"_triggerProcessData($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\">\r\n\r\n <ng-template #explorerItem let-rowData='rowData' let-col='col'>\r\n <span (click)=\"openObject(rowData)\" class=\"pull-left file-ex-icon\"\r\n [innerHTML]=\"rowData.name | fileIcon : !rowData.isFile\">\r\n </span>\r\n\r\n <span (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n {{rowData.name}}\r\n </span>\r\n <span *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 </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 <ng-container *ngIf=\"!readonly\">\r\n <button class=\"p-button-rounded p-button-text link-or-action\" pButton type=\"button\"\r\n tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\" (click)=\"onButtonClick(rowData)\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\" pButton\r\n type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\" icon=\"pi pi-trash\"\r\n (click)=\"deleteFile(rowData)\"></button>\r\n\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 <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\" icon=\"pi pi-cloud-download\"\r\n (click)=\"download(rowData)\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button>\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 *ngIf=\"!readonly || data.breadcrumbs.length > 0\" class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" (click)=\"createFolder()\" pButton pRipple type=\"button\"\r\n pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\" tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\"\r\n label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\">\r\n </button>\r\n <button type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-cloud-upload\" (click)=\"selectFile()\" label=\"T\u1EA3i l\u00EAn\"></button>\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\" tooltipPosition=\"top\"\r\n type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n <button *ngIf=\"!inTaiLieu\" pButton icon=\"pi pi-book\" pTooltip=\"T\u00E0i li\u1EC7u d\u00F9ng chung\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text\" label=\"T\u00E0i li\u1EC7u\"\r\n (click)=\"showTaiLieuDungChung = true;\">\r\n </button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\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 : !rowData.isFile\">\r\n </span>\r\n <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>\r\n <span>{{rowData.name}}</span>\r\n </span>\r\n </a>\r\n </div>\r\n <div *ngIf=\"rowData.signatures\" class=\"nfl-signature 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 <div *ngIf=\"rowData.isFile\" 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 link-or-action\" (click)=\"onButtonClick(rowData)\"\r\n pButton type=\"button\" tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\"\r\n (click)=\"deleteFile(rowData)\" pButton type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\"></button>\r\n </ng-container>\r\n\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n (click)=\"download(rowData)\" pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\"\r\n icon=\"pi pi-cloud-download\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button>\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 </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<div *ngIf=\"layout == _layout.SIMPLE_FOR_LIST\" class=\"not-full-layout\" [class.readonly]=\"readonly\">\r\n <div *ngIf=\"!readonly || data.breadcrumbs.length > 0\" class=\"fm-toolbar\">\r\n <div class=\"fm-toolbar-buttons\">\r\n <ng-container *ngIf=\"!readonly\">\r\n <button *ngIf=\"!hiddenCreateFolder\" (click)=\"createFolder()\" pButton pRipple type=\"button\"\r\n pTooltip=\"T\u1EA1o th\u01B0 m\u1EE5c m\u1EDBi\" tooltipPosition=\"top\" icon=\"pi pi-folder\" class=\"p-button-text\"\r\n label=\"T\u1EA1o th\u01B0 m\u1EE5c\" iconPos=\"left\">\r\n </button>\r\n <button type=\"button\" pButton class=\"p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-cloud-upload\" (click)=\"selectFile()\" label=\"T\u1EA3i l\u00EAn\"></button>\r\n <button pButton icon=\"pi pi-link\" pTooltip=\"T\u1EA3i t\u1EEB li\u00EAn k\u1EBFt trong h\u1EC7 th\u1ED1ng\" tooltipPosition=\"top\"\r\n type=\"button\" class=\"p-button-text p-button-primary\" label=\"T\u1EA3i li\u00EAn k\u1EBFt\"\r\n (click)=\"showAttachLinkBox = true\"></button>\r\n <button *ngIf=\"!inTaiLieu\" pButton icon=\"pi pi-book\" pTooltip=\"T\u00E0i li\u1EC7u d\u00F9ng chung\"\r\n tooltipPosition=\"top\" type=\"button\" class=\"p-button-text\" label=\"T\u00E0i li\u1EC7u\"\r\n (click)=\"showTaiLieuDungChung = true;\">\r\n </button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"breadCrumb\"></ng-container>\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 : !rowData.isFile\">\r\n </span>\r\n\r\n <a (click)=\"openObject(rowData)\" class=\"{{rowData.class}} file-ex-name\">\r\n <span>\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 </span>\r\n <!-- <span class=\"file-ex-extension\">{{rowData.extension}}</span> -->\r\n </a>\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 link-or-action\" (click)=\"onButtonClick(rowData)\"\r\n pButton type=\"button\" tooltipPosition=\"top\" pTooltip=\"{{getButtonTooltip(rowData)}}\"\r\n icon=\"{{getButtonIcon(rowData)}}\"></button>\r\n\r\n <button class=\"p-button-danger p-button-rounded p-button-text link-or-action\"\r\n (click)=\"deleteFile(rowData)\" pButton type=\"button\" pTooltip=\"X\u00F3a\" tooltipPosition=\"top\"\r\n icon=\"pi pi-trash\"></button>\r\n </ng-container>\r\n <!--\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n (click)=\"download(rowData)\" pButton type=\"button\" pTooltip=\"T\u1EA3i v\u1EC1\" tooltipPosition=\"top\"\r\n icon=\"pi pi-cloud-download\"></button>\r\n <button *ngIf=\"readonly\" class=\"p-button-secondary p-button-rounded p-button-text link-or-action\"\r\n pButton type=\"button\" pTooltip=\"Sao ch\u00E9p \u0111\u01B0\u1EDDng d\u1EABn\" tooltipPosition=\"top\" icon=\"pi pi-link\"\r\n (click)=\"copyDownloadLink(rowData)\"></button> -->\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 </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<ng-template #breadCrumb>\r\n <div *ngIf=\"data.breadcrumbs.length > 1\" class=\"fm-toolbar-path\">\r\n <p-breadcrumb class=\"customBreadCrumb\" [model]=\"data.breadcrumbs\"></p-breadcrumb>\r\n </div>\r\n</ng-template>\r\n\r\n<p-fileUpload #fileControl [ngStyle]=\"{'display': 'none'}\" mode=\"basic\" [chooseLabel]=\"chooseLabel\" name=\"file\"\r\n [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 [accept]=\"control ? control.accept: null\">\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\" [readonly]=\"readonly\"\r\n [model]=\"forms.fileViewer.formData\" (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<tn-dialog *ngIf=\"showAttachLinkBox\" #dialog2 [maximizable]=\"false\" [header]=\"'Nh\u1EADp li\u00EAn k\u1EBFt' | translate\"\r\n [popupSize]=\"{ width: 600, height: 50}\" (onHide)=\"showAttachLinkBox = false; typedLink=''\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-grid\">\r\n <div class=\"p-md-10\">\r\n <input #input type=\"text\" placeholder=\"Nh\u1EADp li\u00EAn k\u1EBFt sao ch\u00E9p t\u1EEB t\u1EC7p tin kh\u00E1c...\"\r\n (keyup.enter)=\"addAttachLink()\" pInputText [(ngModel)]=\"typedLink\" class=\"p-col-12\" />\r\n </div>\r\n <div class=\"p-md-2\">\r\n <button type=\"button\" (click)=\"addAttachLink()\" [disabled]=\"typedLink != ''? null : true\" pButton\r\n class=\"p-button-primary p-col-12\" label=\"Ok\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <after-view-checked (loaded)=\"focusInput(input)\"></after-view-checked>\r\n</tn-dialog>\r\n\r\n<tn-dialog #dialog3 *ngIf=\"showTaiLieuDungChung\" [header]=\"'T\u00E0i li\u1EC7u' |translate\"\r\n [popupSize]=\"{ width:1024, height: 800 }\" (onHide)=\"showTaiLieuDungChung = false\">\r\n <file-tai-lieu #formBase [originalFolderId]=\"data.currentFolderId\"\r\n (onSaved)=\"showTaiLieuDungChung = false; this._triggerProcessData()\" (onCancel)=\"showTaiLieuDungChung = false\">\r\n </file-tai-lieu>\r\n</tn-dialog>\r\n\r\n<!--\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\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>\r\n<!--K\u00FD s\u1ED1 sim-->\r\n<tn-dialog *ngIf=\"forms.kySoSim.show\" #dialog [styleClass]=\"'address-form'\" [header]=\"forms.kySoSim.header | translate\"\r\n [popupSize]=\"forms.kySoSim.popupSize\" [showFooter]=\"true\" (onHide)=\"onCancelForm(formIds.kySoSim)\">\r\n <app-file-ky-so-sim #fileKySoSim [parentModel]=\"model\" [parentContext]=\"context\">\r\n </app-file-ky-so-sim>\r\n <ng-template #footer>\r\n <button type=\"button\" pButton icon=\"fas fa-images\" [disabled]=\"model.submitting\" class=\"p-button-text\"\r\n [label]=\"'Ch\u1ECDn ch\u1EEF k\u00FD' | translate\" (click)=\"chonChuKy()\"></button>\r\n <button type=\"button\" pButton icon=\"fas fa-signature\" class=\"p-button-text ui-button-success\"\r\n [disabled]=\"model.submitting\" [label]=\"'Th\u1EF1c hi\u1EC7n k\u00FD' | translate\" (click)=\"kySo()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" preventTab (click)=\"forms.kySoSim.show=false\"></button>\r\n </ng-template>\r\n</tn-dialog>",
36792
36834
  providers: [
36793
36835
  {
36794
36836
  provide: forms.NG_VALUE_ACCESSOR,
@@ -37698,7 +37740,7 @@
37698
37740
  var model = this.getGenerateDownloadLinkModel();
37699
37741
  this._downloadLinkService.generateDownloadLink(model)
37700
37742
  .then(function (rs) {
37701
- _this.model.fileUrl = _this._downloadLinkService.getAnonymousDownloadUrlForViewer(rs.data);
37743
+ _this.model.fileUrl = _this._downloadLinkService.getAnonymousDownloadUrl(rs.data);
37702
37744
  });
37703
37745
  };
37704
37746
  FileViewerComponent.prototype.processOtherFileExtension = function () {
@@ -43546,6 +43588,7 @@
43546
43588
  _this._moduleConfigService = _moduleConfigService;
43547
43589
  _this.display = false;
43548
43590
  _this.showHelperCurrentPageState = true;
43591
+ _this.helps = [];
43549
43592
  _this.environment = _moduleConfigService.getConfig().environment;
43550
43593
  if (_this.environment.helpConfig) {
43551
43594
  _this.phoneNumber = _this.environment.helpConfig.expertPhoneNummber;
@@ -43562,6 +43605,9 @@
43562
43605
  else {
43563
43606
  _this.hrefMail = "javascript:void(0)";
43564
43607
  }
43608
+ if (_this.environment.helpConfig.documents) {
43609
+ _this.helps = _this.environment.helpConfig.documents;
43610
+ }
43565
43611
  }
43566
43612
  return _this;
43567
43613
  }
@@ -43582,7 +43628,7 @@
43582
43628
  TnAppHelpComponent.decorators = [
43583
43629
  { type: i0.Component, args: [{
43584
43630
  selector: 'li[tn-app-help]',
43585
- template: "<a href=\"javascript:;\" tabindex=\"9\" (click)=\"showHelper()\" style=\"height: 30px;\" pTooltip=\"Tr\u1EE3 gi\u00FAp\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"topbar-icon-left\">\r\n <!-- <svg focusable=\"false\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\r\n class=\"topbar-icon animated swing svgmodule\">\r\n <path fill=\"currentColor\"\r\n d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"\r\n class=\"\"></path>\r\n </svg> -->\r\n <i class=\"topbar-icon animated swing pi pi-question-circle\"></i>\r\n </span>\r\n <span class=\"topbar-item-name\">{{ \"Tr\u1EE3 gi\u00FAp\" | translate }}</span>\r\n</a>\r\n\r\n<p-sidebar [styleClass]=\"'HelperSlideBar tn-l-sidebar-wrapper'\" [(visible)]=\"display\" position=\"right\"\r\n [appendTo]=\"'body'\" [style]=\"{ width: '30em', border: 0, 'max-width': '100vw' }\">\r\n <div style=\"background-color: #fff; box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.35);\">\r\n <h1 style=\"font-size: 16px; color: #212529;\">Trung t\u00E2m tr\u1EE3 gi\u00FAp</h1>\r\n </div>\r\n\r\n <div class=\"tn-l-help-wrapper\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'max-height':'calc(100vh - 50px)'}\">\r\n <div class=\"HelpCenter\">\r\n <div class=\"p-grid\" style=\"margin-top:10px; margin-bottom: 25px;\">\r\n <div class=\"p-col-8\">\r\n <p style=\"font-weight:bold;font-size: 16px;margin-bottom: 8px; margin-top:20px\">\r\n {{environment.helpConfig?.expertName}}\r\n </p>\r\n <p style=\"margin: 0px;\">\r\n <a [href]=\"hrefTelephone\"><i class=\"fas fa-phone\"\r\n style=\"margin-right: 8px; width: 15px\"></i>{{phoneNumber}}</a>\r\n </p>\r\n <p style=\"margin-top: 8px;\">\r\n <a [href]=\"hrefMail\"><i class=\"fas fa-envelope\"\r\n style=\"margin-right: 8px; width: 15px\"></i>{{mail}}</a>\r\n </p>\r\n </div>\r\n <div class=\"p-col-4\">\r\n <img src=\"/assets/images/tri-nam-group-logo.png\"\r\n style=\"width: 100%; float: right; margin-top: 15px; opacity: 0.7;\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"p-grid p-m-0 HelpCenter-video\" style=\"margin-top: 0px\">\r\n <div class=\"p-col-12 help-title\">\r\n <span class=\"tit-name\">Xem h\u01B0\u1EDBng d\u1EABn</span>\r\n </div>\r\n <div class=\"p-col-12 help-content\">\r\n <h2 *ngIf=\"showHelperCurrentPageState\" style=\"margin-top: 0px\">\r\n <a href=\"javascript:;\" (click)=\"showHelperCurrentPage(null)\"\r\n style=\"display:inline-block; position: relative; border-top: 1px solid #52abf5;\">\r\n <img src=\"/assets/images/bgvideo.png\" alt=\"screen shot\"\r\n style=\"width:100%; filter: brightness(0.88);\" />\r\n <i class=\"fab fa-youtube fa-2x\"></i>\r\n </a>\r\n </h2>\r\n </div>\r\n </div>\r\n\r\n <div class=\"p-grid p-m-0 HelpCenter-download\" style=\"margin-top: 0px; margin-bottom: 40px;\">\r\n <div class=\"p-col-12 help-title\">\r\n <span class=\"tit-name\">Ph\u1EA7n m\u1EC1m ti\u1EC7n \u00EDch</span>\r\n </div>\r\n <div class=\"tn-l-pmti\" style=\"border: 1px solid #ccc; width: 100%\">\r\n <div class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" href=\"{{environment.signalr.linkDownloadClientApp}}\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <img src=\"/assets/images/icon-appTN64x64.png\" />\r\n <br />TN Client\r\n </a>\r\n </p>\r\n </div>\r\n <div class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" href=\"https://ultraviewer.net/vi/UltraViewer_setup_6.2_vi.exe\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <img src=\"/assets/images/ultraviewer.ico\" />\r\n <br />Ultraviewer\r\n </a>\r\n </p>\r\n </div>\r\n <div class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" href=\"https://www.teamviewer.com/vi/tai-xuong-tu-dong-teamviewer/\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <img src=\"/assets/images/icon-teamviewer.png\" />\r\n <br />Teamviewer\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</p-sidebar>",
43631
+ template: "<a href=\"javascript:;\" tabindex=\"9\" (click)=\"showHelper()\" style=\"height: 30px;\" pTooltip=\"Tr\u1EE3 gi\u00FAp\"\r\n tooltipPosition=\"bottom\">\r\n <span class=\"topbar-icon-left\">\r\n <!-- <svg focusable=\"false\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\r\n class=\"topbar-icon animated swing svgmodule\">\r\n <path fill=\"currentColor\"\r\n d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"\r\n class=\"\"></path>\r\n </svg> -->\r\n <i class=\"topbar-icon animated swing pi pi-question-circle\"></i>\r\n </span>\r\n <span class=\"topbar-item-name\">{{ \"Tr\u1EE3 gi\u00FAp\" | translate }}</span>\r\n</a>\r\n\r\n<p-sidebar [styleClass]=\"'HelperSlideBar tn-l-sidebar-wrapper'\" [(visible)]=\"display\" position=\"right\"\r\n [appendTo]=\"'body'\" [style]=\"{ width: '30em', border: 0, 'max-width': '100vw' }\">\r\n <div style=\"background-color: #fff; box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.35);\">\r\n <h1 style=\"font-size: 16px; color: #212529;\">Trung t\u00E2m tr\u1EE3 gi\u00FAp</h1>\r\n </div>\r\n\r\n <div class=\"tn-l-help-wrapper\">\r\n <tn-custom-scrollbar #scrollbar [style]=\"{'max-height':'calc(100vh - 50px)'}\">\r\n <div class=\"HelpCenter\">\r\n <div class=\"p-grid\" style=\"margin-top:10px; margin-bottom: 25px;\">\r\n <div class=\"p-col-8\">\r\n <p style=\"font-weight:bold;font-size: 16px;margin-bottom: 8px; margin-top:20px\">\r\n {{environment.helpConfig?.expertName}}\r\n </p>\r\n <p style=\"margin: 0px;\">\r\n <a [href]=\"hrefTelephone\"><i class=\"fas fa-phone\"\r\n style=\"margin-right: 8px; width: 15px\"></i>{{phoneNumber}}</a>\r\n </p>\r\n <p style=\"margin-top: 8px;\">\r\n <a [href]=\"hrefMail\"><i class=\"fas fa-envelope\"\r\n style=\"margin-right: 8px; width: 15px\"></i>{{mail}}</a>\r\n </p>\r\n </div>\r\n <div class=\"p-col-4\">\r\n <img [src]=\"environment.helpConfig?.logoCompany\"\r\n style=\"width: 100%; float: right; opacity: 0.7;\" />\r\n </div>\r\n </div>\r\n <div class=\"p-grid p-m-0 HelpCenter-download\" style=\"margin-top: 0px; margin-bottom: 40px;\">\r\n <div class=\"p-col-12 help-title\">\r\n <span class=\"tit-name\">T\u00E0i li\u1EC7u - H\u01B0\u1EDBng d\u1EABn s\u1EED d\u1EE5ng c\u00E1c ph\u00E2n h\u1EC7 </span>\r\n </div>\r\n <div class=\"tn-l-pmti p-grid\"\r\n style=\"border: 1px solid #ccc; width: 100%;margin:0;margin-bottom:20px;\">\r\n <div *ngFor=\"let item of helps\" class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" [href]=\"item.href\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <i class=\"{{item.icon}} app-switcher-item-icon\"\r\n style=\"color: rgb(44 126 210);font-size: 3.5em;padding-bottom: 10px;\"></i>\r\n <br />{{item.label}}\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"p-grid p-m-0 HelpCenter-video\" style=\"margin-top: 0px\">\r\n <div class=\"p-col-12 help-title\">\r\n <span class=\"tit-name\">Xem h\u01B0\u1EDBng d\u1EABn</span>\r\n </div>\r\n <div class=\"p-col-12 help-content\">\r\n <h2 *ngIf=\"showHelperCurrentPageState\" style=\"margin-top: 0px\">\r\n <a href=\"javascript:;\" (click)=\"showHelperCurrentPage(null)\"\r\n style=\"display:inline-block; position: relative; border-top: 1px solid #52abf5;\">\r\n <img src=\"/assets/images/bgvideo.png\" alt=\"screen shot\"\r\n style=\"width:100%; filter: brightness(0.88);\" />\r\n <i class=\"fab fa-youtube fa-2x\"></i>\r\n </a>\r\n </h2>\r\n </div>\r\n </div>\r\n\r\n <div class=\"p-grid p-m-0 HelpCenter-download\" style=\"margin-top: 0px; margin-bottom: 40px;\">\r\n <div class=\"p-col-12 help-title\">\r\n <span class=\"tit-name\">Ph\u1EA7n m\u1EC1m ti\u1EC7n \u00EDch</span>\r\n </div>\r\n <div class=\"tn-l-pmti\" style=\"border: 1px solid #ccc; width: 100%\">\r\n <div class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" href=\"{{environment.signalr.linkDownloadClientApp}}\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <img src=\"/assets/images/icon-appTN64x64.png\" />\r\n <br />TN Client\r\n </a>\r\n </p>\r\n </div>\r\n <div class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" href=\"https://ultraviewer.net/vi/UltraViewer_setup_6.2_vi.exe\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <img src=\"/assets/images/ultraviewer.ico\" />\r\n <br />Ultraviewer\r\n </a>\r\n </p>\r\n </div>\r\n <div class=\"p-col-4 help-content\">\r\n <p style=\"margin-top: 18px; text-align: center;\">\r\n <a target=\"_blank\" href=\"https://www.teamviewer.com/vi/tai-xuong-tu-dong-teamviewer/\"\r\n style=\"display: inline-block; text-align: center;\">\r\n <img src=\"/assets/images/icon-teamviewer.png\" />\r\n <br />Teamviewer\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</p-sidebar>",
43586
43632
  providers: [ComponentContextService],
43587
43633
  styles: [".HelpCenter{color:#555;padding:0 20px}::ng-deep .tn-l-sidebar-wrapper{padding:0}.tn-l-pmti{display:flex}.HelpCenter p:first-child img{margin-bottom:10px}::ng-deep .HelperSlideBar .p-sidebar-content>button{color:#212529;cursor:pointer;font-size:20px;margin-right:14px;margin-top:10px}::ng-deep .ui-sidebar{padding:0}::ng-deep .HelperSlideBar h1{height:50px;line-height:50px;margin:0;padding-left:20px;text-transform:uppercase}.HelpCenter-video{position:relative}.HelpCenter-video i{color:#454545;cursor:pointer;left:50%;opacity:.5;position:absolute;top:calc(50% - 10px);transform:translateX(-50%) translateY(-50%);transition:.5s}.HelpCenter-video video{opacity:1}.HelpCenter-video:hover video{cursor:pointer;opacity:.5}.HelpCenter-video:hover i{opacity:1}.HelpCenter-download img{height:45px;width:45px}.HelpCenter .help-title{background-color:rgba(49,146,225,.8784313725490196);color:#fff}.HelpCenter .help-title .tit-name{font-size:14px;font-weight:700}.HelpCenter .help-content{padding:0}.HelpCenter .HelpCenter-comment .help-content{padding:0;text-align:center}.HelpCenter-comment,.HelpCenter-download,.HelpCenter-video{margin-bottom:15px}.tn-l-help-wrapper{display:flex;max-height:calc(100vh - 60px);overflow:auto}"]
43588
43634
  },] }
@@ -44977,7 +45023,7 @@
44977
45023
  TnTabViewComponent.decorators = [
44978
45024
  { type: i0.Component, args: [{
44979
45025
  selector: 'tn-tabview',
44980
- template: "<div [style.height]=\"height\">\r\n <p-tabView #tab orientation=\"top\" [styleClass]=\"styleClass\" [activeIndex]=\"currentTabIndex\"\r\n (onChange)=\"handleTabChange($event)\">\r\n <ng-container *ngFor=\"let item of data; let i = index\">\r\n <p-tabPanel *ngIf=\"!item.hidden\" [leftIcon]=\"item.icon\" [header]=\"item.label\">\r\n <ng-container *ngIf=\"allowViewAll || currentTabIndex == i\">\r\n <ng-container *ngTemplateOutlet=\"template[item.code]; context: {$implicit: item}\">\r\n </ng-container>\r\n </ng-container>\r\n </p-tabPanel>\r\n </ng-container>\r\n </p-tabView>\r\n</div>",
45026
+ template: "<div [style.height]=\"height\">\r\n <p-tabView #tab orientation=\"top\" [styleClass]=\"styleClass\" [activeIndex]=\"currentTabIndex\"\r\n (onChange)=\"handleTabChange($event)\">\r\n <ng-container *ngFor=\"let item of data; let i = index\">\r\n <p-tabPanel *ngIf=\"!item.hidden\" [leftIcon]=\"item.icon\" [header]=\"item.label\"\r\n [headerStyleClass]=\"item.headerStyleClass\">\r\n <ng-container *ngIf=\"allowViewAll || currentTabIndex == i\">\r\n <ng-container *ngTemplateOutlet=\"template[item.code]; context: {$implicit: item}\">\r\n </ng-container>\r\n </ng-container>\r\n </p-tabPanel>\r\n </ng-container>\r\n </p-tabView>\r\n</div>",
44981
45027
  styles: [".accordion-link{flex:1 1;text-align:right}.accordion-link ul{list-style:none;margin-bottom:0;margin-top:0;padding-left:0}.accordion-link ul li{background-color:#a4a5a4;border-radius:4px;color:#fff;display:inline-block;line-height:20px;margin-bottom:.5rem;margin-left:.5rem;padding:6px 12px;transition:all .3s ease-out}.accordion-link ul li:hover{background-color:#3db762;cursor:pointer}.accordion-link ul li.tab-active{background-color:#23a349}.tn-l-toolbar{display:flex;padding:.5rem .5rem 0}.hoso-container{height:auto;max-height:none}.tab-number{align-items:center;background:#a4a5a4;border-radius:2px;color:#fff;display:inline-flex;font-size:.9em;height:20px;justify-content:center;margin-right:.5rem;padding-top:2px;width:20px}.tab-number.active{background:#23a349}::ng-deep tn-accordion-tab{display:flex;flex-direction:column;height:100%}::ng-deep tn-accordion-tab .p-accordion-header{position:-webkit-sticky;position:sticky;top:1px;z-index:6}::ng-deep tn-accordion-tab .tn-l-p-accordion-wrapper{border-radius:4px;display:flex;flex:1;margin-left:.5rem;margin-right:.5rem;overflow:auto}::ng-deep tn-accordion-tab .tn-l-p-accordion-wrapper tn-custom-scrollbar{width:100%}::ng-deep tn-accordion-tab .ps__rail-x,::ng-deep tn-accordion-tab .ps__rail-y{z-index:7}::ng-deep tn-accordion-tab .tn-l-toolbar .toolbar{flex:0 0 auto;padding-top:0}@media (max-width:640px){.accordion-link,.toolbar{overflow-x:auto;white-space:nowrap}.tn-l-custom-wrapper{display:block}.accordion-link ul{margin-top:0}.tn-l-toolbar{display:block}}"]
44982
45028
  },] }
44983
45029
  ];
@@ -46826,15 +46872,18 @@
46826
46872
  this.setting.hiddenSettingPermission = true;
46827
46873
  this.setting.hiddenSettingWorkflow = true;
46828
46874
  this.setting.showEditLink = false;
46875
+ this.setting.hiddenSettingWorkflowNew = true;
46876
+ // RedOnly
46877
+ this.setting.hiddenToolbar = !this.readOnly;
46829
46878
  this.setting.modelSchemas = [
46830
- new ModelSchema({ field: 'soDen', dataType: 'int', name: 'Số đến/đi', fullName: 'Số đến/đi', description: 'Số đến/đi' }),
46879
+ new ModelSchema({ field: 'soDenDi', dataType: 'int', name: 'Số đến/đi', fullName: 'Số đến/đi', description: 'Số đến/đi' }),
46831
46880
  new ModelSchema({ field: 'soKyHieu', name: 'Số, ký hiệu', fullName: 'Số, ký hiệu', description: 'Số, ký hiệu' }),
46832
46881
  new ModelSchema({ field: 'trichYeu', name: 'Trích yếu', fullName: '', description: '' }),
46833
46882
  new ModelSchema({ field: 'ngayBanHanh', dataType: 'date', name: 'Ngày ban hành', fullName: '', description: '' })
46834
46883
  ];
46835
46884
  this.setting.cols = [
46836
46885
  new ColumnSchemaBase({
46837
- field: 'soDen',
46886
+ field: 'soDenDi',
46838
46887
  width: '100px'
46839
46888
  }),
46840
46889
  new ColumnSchemaBase({
@@ -46864,7 +46913,7 @@
46864
46913
  });
46865
46914
  return;
46866
46915
  }
46867
- gridInfo.filters.push(_this.newFilter('instanceId', exports.Operator.in, _this.idVanBanDens));
46916
+ gridInfo.filters.push(_this.newFilter('id', exports.Operator.in, _this.idVanBanDens));
46868
46917
  _this._vanBanDenService.getByGridRequestWithBodyOld(gridInfo, 'Permission')
46869
46918
  .then(function (response) { return __awaiter(_this, void 0, void 0, function () {
46870
46919
  return __generator(this, function (_a) {
@@ -46909,8 +46958,9 @@
46909
46958
  });
46910
46959
  return;
46911
46960
  }
46912
- gridInfo.filters.push(_this.newFilter('instanceId', exports.Operator.in, _this.idVanBanDis));
46913
- _this._vanBanDiService.getByGridRequestWithBodyOld(gridInfo, 'Permission')
46961
+ gridInfo.filters.push(_this.newFilter('id', exports.Operator.in, _this.idVanBanDis));
46962
+ _this.plusUrl = 'GetDataByPermission';
46963
+ _this._vanBanDiService.getByGridRequest(gridInfo, _this.plusUrl)
46914
46964
  .then(function (response) { return __awaiter(_this, void 0, void 0, function () {
46915
46965
  return __generator(this, function (_a) {
46916
46966
  if (response.success) {
@@ -46954,6 +47004,21 @@
46954
47004
  });
46955
47005
  });
46956
47006
  };
47007
+ VanBanPickerComponent.prototype.beforeRenderDataSource = function (datasource) {
47008
+ return __awaiter(this, void 0, void 0, function () {
47009
+ return __generator(this, function (_a) {
47010
+ datasource.forEach(function (element) {
47011
+ if (element.type == EnumLoaiVanBanBase.VB_DEN) {
47012
+ element.soDenDi = element.soDen;
47013
+ }
47014
+ else {
47015
+ element.soDenDi = element.soDi;
47016
+ }
47017
+ });
47018
+ return [2 /*return*/];
47019
+ });
47020
+ });
47021
+ };
46957
47022
  VanBanPickerComponent.prototype.navigateToVanBan = function (rowData) {
46958
47023
  if (rowData.type == EnumLoaiVanBanBase.VB_DEN)
46959
47024
  this.navigateToVanBanDen(rowData);
@@ -46961,10 +47026,10 @@
46961
47026
  this.navigateToVanBanDi(rowData);
46962
47027
  };
46963
47028
  VanBanPickerComponent.prototype.navigateToVanBanDen = function (rowData) {
46964
- window.open(this.environment.clientDomain.vanbanDomain + "/vanbanden#_a=1&_i=" + rowData.id, '_blank');
47029
+ window.open(this.environment.clientDomain.vanban + "/tracuu-vanbanden#i=" + rowData.id, '_blank');
46965
47030
  };
46966
47031
  VanBanPickerComponent.prototype.navigateToVanBanDi = function (rowData) {
46967
- window.open(this.environment.clientDomain.vanbanDomain + "/vanbandi#_a=1&_i=" + rowData.id, '_blank');
47032
+ window.open(this.environment.clientDomain.vanban + "/tracuu-vanbandi#i=" + rowData.id, '_blank');
46968
47033
  };
46969
47034
  VanBanPickerComponent.prototype.showFormPickVanBan = function () {
46970
47035
  this.beforeAdd();
@@ -46989,9 +47054,9 @@
46989
47054
  var idVanBanDens = [], idVanBanDis = [];
46990
47055
  rowDatas.forEach(function (item) {
46991
47056
  if (item.type == EnumLoaiVanBanBase.VB_DEN)
46992
- idVanBanDens.push(item.instanceId);
47057
+ idVanBanDens.push(item.id);
46993
47058
  else
46994
- idVanBanDis.push(item.instanceId);
47059
+ idVanBanDis.push(item.id);
46995
47060
  });
46996
47061
  if (idVanBanDens.length > 0)
46997
47062
  _this.idVanBanDens = _this.idVanBanDens.filter(function (q) { return idVanBanDens.indexOf(q) == -1; });
@@ -47051,7 +47116,7 @@
47051
47116
  VanBanPickerComponent.decorators = [
47052
47117
  { type: i0.Component, args: [{
47053
47118
  selector: 'vanban-picker',
47054
- template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\r\n [style]=\"{'min-height': '300px'}\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\" (onEdit)=\"_edit($event)\"\r\n (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\"\r\n (onReloaded)=\"_unmarkLoading()\">\r\n <ng-template #toolbar>\r\n <button type=\"button\" pButton icon=\"pi pi-clone\" class=\"p-button-text p-button-rounded p-button-success\"\r\n label=\"Ch\u1ECDn v\u0103n b\u1EA3n\" (click)=\"showFormPickVanBan()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-trash\" class=\"p-button-text p-button-rounded p-button-danger\"\r\n label=\"X\u00F3a v\u0103n b\u1EA3n\" (click)=\"xoaVanBanSelected()\"></button>\r\n </ng-template>\r\n <ng-template #function let-rowData=\"rowData\">\r\n <button type=\"button\" pButton icon=\"pi pi-eye\"\r\n class=\"p-button-text p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem chi ti\u1EBFt v\u0103n b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"navigateToVanBan(rowData)\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-rounded p-button-danger link-or-action\" pTooltip=\"X\u00F3a v\u0103n b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"xoaVanBan(rowData)\"></button>\r\n </ng-template>\r\n</crud-list>\r\n<tn-dialog *ngIf=\"showFormPicker\" #dialog [styleClass]=\"'tn-form-dialog'\" [header]=\"setting.popupHeader | translate\"\r\n [popupSize]=\"setting.popupSize\" [useDefaultScrollBar]=\"true\" (onHide)=\"_handleCancel($event)\">\r\n <app-vanban-picker-dialog [parentModel]=\"model\" [parentContext]=\"context\" [control]=\"control\"\r\n [idVanBanDens]=\"idVanBanDens\" [idVanBanDis]=\"idVanBanDis\" (onCancel)=\"_handleCancel($event)\"\r\n (onChanged)=\"handleChangeValue($event)\">\r\n </app-vanban-picker-dialog>\r\n</tn-dialog>",
47119
+ template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\r\n [style]=\"{'min-height': '300px'}\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\r\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\r\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\r\n <ng-template #toolbar>\r\n <button type=\"button\" pButton icon=\"pi pi-clone\" class=\"p-button-text p-button-rounded p-button-success\"\r\n label=\"Ch\u1ECDn v\u0103n b\u1EA3n\" (click)=\"showFormPickVanBan()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-trash\" class=\"p-button-text p-button-rounded p-button-danger\"\r\n label=\"X\u00F3a v\u0103n b\u1EA3n\" (click)=\"xoaVanBanSelected()\"></button>\r\n </ng-template>\r\n <ng-template #function let-rowData=\"rowData\">\r\n <button type=\"button\" pButton icon=\"pi pi-eye\"\r\n class=\"p-button-text p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem chi ti\u1EBFt v\u0103n b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"navigateToVanBan(rowData)\"></button>\r\n <button *ngIf=\"readOnly\" type=\"button\" pButton icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-rounded p-button-danger link-or-action\" pTooltip=\"X\u00F3a v\u0103n b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"xoaVanBan(rowData)\"></button>\r\n </ng-template>\r\n</crud-list>\r\n<tn-dialog *ngIf=\"showFormPicker\" #dialog [styleClass]=\"'tn-form-dialog'\" [header]=\"setting.popupHeader | translate\"\r\n [popupSize]=\"setting.popupSize\" [useDefaultScrollBar]=\"true\" (onHide)=\"_handleCancel($event)\">\r\n <app-vanban-picker-dialog [parentModel]=\"model\" [parentContext]=\"context\" [control]=\"control\"\r\n [idVanBanDens]=\"idVanBanDens\" [idVanBanDis]=\"idVanBanDis\" (onCancel)=\"_handleCancel($event)\"\r\n (onChanged)=\"handleChangeValue($event)\">\r\n </app-vanban-picker-dialog>\r\n</tn-dialog>",
47055
47120
  providers: [
47056
47121
  ComponentContextService,
47057
47122
  {
@@ -47070,6 +47135,8 @@
47070
47135
  { type: ModuleConfigService }
47071
47136
  ]; };
47072
47137
  VanBanPickerComponent.propDecorators = {
47138
+ loaiVanBan: [{ type: i0.Input }],
47139
+ readOnly: [{ type: i0.Input }],
47073
47140
  control: [{ type: i0.Input }],
47074
47141
  onChanged: [{ type: i0.Output }],
47075
47142
  onReady: [{ type: i0.Output }]
@@ -48146,6 +48213,8 @@
48146
48213
  StraightConnection: true,
48147
48214
  CenterConnectionLabel: true
48148
48215
  });
48216
+ _this.generated = false;
48217
+ _this.dataSourceAction = [];
48149
48218
  _this.stateDistance = 350;
48150
48219
  _this.topDistance = 80;
48151
48220
  _this.fileDataService = _fileDataService;
@@ -48155,6 +48224,7 @@
48155
48224
  var _this = this;
48156
48225
  this.loadDetailFromQueryParam = false;
48157
48226
  this.setting.baseService = this._workflowHistoryService;
48227
+ this._workflowHistoryService.changeEndpoint(this.businessSetting.baseService);
48158
48228
  this.setting.multipleCheckWhenClickRow = false;
48159
48229
  this.setting.settingKey = '__workflow';
48160
48230
  this.currentWorkflow = this.workflowSetting.workflows.find(function (q) { return q.code == _this.item.__workflowCode; });
@@ -48198,7 +48268,6 @@
48198
48268
  };
48199
48269
  WorkflowHistoryNewComponent.prototype.init = function () {
48200
48270
  this.machineCodeKetThucs = this.currentWorkflow.data.machines.filter(function (q) { return q.type == exports.EnumStateType.STOP; }).map(function (q) { return q.code; });
48201
- var datasourceAction = this.createDatasourceAction();
48202
48271
  this.setting.modelSchemas = [
48203
48272
  new ModelSchema({ field: 'userIdCreated', name: 'Người gửi', fullName: 'Người gửi', description: '' }),
48204
48273
  new ModelSchema({ field: 'actionCode', name: 'Thao tác', fullName: 'Thao tác', description: '' }),
@@ -48213,6 +48282,8 @@
48213
48282
  new ModelSchema({ field: 'roleViewIds', name: 'Chức vụ theo dõi', fullName: 'Chức vụ theo dõi', description: '' }),
48214
48283
  new ModelSchema({ field: 'note', name: 'Ý kiến', fullName: 'Ý kiến', description: '' })
48215
48284
  ];
48285
+ this.dataSourceAction = this.createDatasourceAction();
48286
+ this.setting.fieldSearchText = ['code', 'ten'];
48216
48287
  this.setting.cols = [
48217
48288
  new ColumnSchemaBase({
48218
48289
  field: 'userIdCreated',
@@ -48222,11 +48293,13 @@
48222
48293
  }),
48223
48294
  new ColumnSchemaBase({
48224
48295
  field: 'fullActionCode',
48296
+ fieldFilter: 'actionCode',
48225
48297
  label: 'Hành động',
48226
48298
  width: '9%',
48227
- dataSource: datasourceAction,
48299
+ dataSource: this.dataSourceAction,
48228
48300
  displayFieldInGrid: 'shortTen',
48229
- valueField: 'code'
48301
+ valueField: 'code',
48302
+ fullTextSearch: true
48230
48303
  }),
48231
48304
  new ColumnSchemaBase({
48232
48305
  field: 'userIds',
@@ -48332,6 +48405,7 @@
48332
48405
  })
48333
48406
  ];
48334
48407
  this.model.ready = true;
48408
+ this.minimizeDatasourceAction();
48335
48409
  _super.prototype.ngOnInit.call(this);
48336
48410
  };
48337
48411
  WorkflowHistoryNewComponent.prototype.findLastHistoryAndGetData = function () {
@@ -48443,40 +48517,32 @@
48443
48517
  };
48444
48518
  WorkflowHistoryNewComponent.prototype.appendStateAfterLastState = function (machinesData, machinesDataRaw, left) {
48445
48519
  return __awaiter(this, void 0, void 0, function () {
48446
- var lastMachine_1, actionAllows_1, index_1;
48520
+ var lastMachine_1, index_1;
48447
48521
  var _this = this;
48448
48522
  return __generator(this, function (_a) {
48449
- switch (_a.label) {
48450
- case 0:
48451
- if (!(machinesData.machines.length > 0)) return [3 /*break*/, 2];
48452
- lastMachine_1 = machinesData.machines[machinesData.machines.length - 1];
48453
- if (lastMachine_1.type == exports.EnumStateType.STOP)
48454
- return [2 /*return*/];
48455
- return [4 /*yield*/, this.businessSetting.baseService.getActionAllow(this.item.id)];
48456
- case 1:
48457
- actionAllows_1 = (_a.sent()).data;
48458
- if (!actionAllows_1)
48459
- return [2 /*return*/];
48460
- index_1 = 1;
48461
- machinesDataRaw.connections.filter(function (q) { return q.source == lastMachine_1.rawId && actionAllows_1.indexOf(q.code) > -1; })
48462
- .forEach(function (conn) {
48463
- var targetMachine = machinesDataRaw.machines.find(function (q) { return q.id == conn.target; });
48464
- if (targetMachine.code == lastMachine_1.code) {
48465
- var connection = _this.cloneConnection(conn, lastMachine_1, lastMachine_1);
48466
- connection.connector = 'StateMachine';
48467
- machinesData.connections.push(connection);
48468
- }
48469
- else {
48470
- var newTargetMachine = _this.cloneMachine(targetMachine, {});
48471
- newTargetMachine.location = [left, _this.topDistance + 150 * (index_1 - 1)];
48472
- index_1++;
48473
- machinesData.connections.push(_this.cloneConnection(conn, lastMachine_1, newTargetMachine));
48474
- machinesData.machines.push(newTargetMachine);
48475
- }
48476
- });
48477
- _a.label = 2;
48478
- case 2: return [2 /*return*/];
48523
+ if (machinesData.machines.length > 0) {
48524
+ lastMachine_1 = machinesData.machines[machinesData.machines.length - 1];
48525
+ if (lastMachine_1.type == exports.EnumStateType.STOP)
48526
+ return [2 /*return*/];
48527
+ index_1 = 1;
48528
+ machinesDataRaw.connections.filter(function (q) { return q.source == lastMachine_1.rawId; })
48529
+ .forEach(function (conn) {
48530
+ var targetMachine = machinesDataRaw.machines.find(function (q) { return q.id == conn.target; });
48531
+ if (targetMachine.code == lastMachine_1.code) {
48532
+ var connection = _this.cloneConnection(conn, lastMachine_1, lastMachine_1);
48533
+ connection.connector = 'StateMachine';
48534
+ machinesData.connections.push(connection);
48535
+ }
48536
+ else {
48537
+ var newTargetMachine = _this.cloneMachine(targetMachine, {});
48538
+ newTargetMachine.location = [left, _this.topDistance + 150 * (index_1 - 1)];
48539
+ index_1++;
48540
+ machinesData.connections.push(_this.cloneConnection(conn, lastMachine_1, newTargetMachine));
48541
+ machinesData.machines.push(newTargetMachine);
48542
+ }
48543
+ });
48479
48544
  }
48545
+ return [2 /*return*/];
48480
48546
  });
48481
48547
  });
48482
48548
  };
@@ -48489,18 +48555,52 @@
48489
48555
  WorkflowHistoryNewComponent.prototype.cloneConnection = function (connection, sourceState, targetState) {
48490
48556
  return Object.assign(Object.assign({}, connection), { source: sourceState.id, target: targetState.id });
48491
48557
  };
48558
+ WorkflowHistoryNewComponent.prototype.minimizeDatasourceAction = function () {
48559
+ return __awaiter(this, void 0, void 0, function () {
48560
+ var lstWorkflowHistory, dataSource;
48561
+ return __generator(this, function (_a) {
48562
+ switch (_a.label) {
48563
+ case 0: return [4 /*yield*/, this._workflowHistoryService.getAll(this.getDefaultFilter(), 'sourceStatusCode,actionCode')];
48564
+ case 1:
48565
+ lstWorkflowHistory = (_a.sent()).data;
48566
+ dataSource = this._workflowSettingService.minimizeDatasourceAction(this.dataSourceAction, lstWorkflowHistory);
48567
+ this.crudList.setDropdownDatasource('fullActionCode', dataSource);
48568
+ return [2 /*return*/];
48569
+ }
48570
+ });
48571
+ });
48572
+ };
48492
48573
  WorkflowHistoryNewComponent.prototype.createDatasourceAction = function () {
48493
48574
  var result = [
48494
- { code: MaActionBatDauQuyTrinh, ten: 'Bắt đầu quy trình' }
48575
+ { code: MaActionBatDauQuyTrinh, ten: 'Bắt đầu quy trình', buildIn: true }
48495
48576
  ];
48496
48577
  result.push.apply(result, __spread(this._workflowSettingService.renderDataSourceActionWorkflow(this.currentWorkflow.data)));
48497
- result.push({ code: ActionUpdateModel, ten: 'Chỉnh sửa' }, { code: ActionChoYKienBase, ten: 'Cho ý kiến' }, { code: ActionThuHoiBase, ten: 'Thu hồi thao tác' });
48578
+ result.push({ code: ActionUpdateModel, ten: 'Chỉnh sửa', buildIn: true }, { code: ActionChoYKienBase, ten: 'Cho ý kiến', buildIn: true }, { code: ActionThuHoiBase, ten: 'Thu hồi thao tác', buildIn: true });
48579
+ result.filter(function (q) { return q.buildIn; }).forEach(function (item) {
48580
+ item.rawCode = item.code;
48581
+ item.shortTen = item.ten;
48582
+ });
48498
48583
  return result;
48499
48584
  };
48585
+ WorkflowHistoryNewComponent.prototype.getDefaultFilter = function () {
48586
+ return [
48587
+ this.newFilter('tableName', exports.Operator.equal, this.tableName),
48588
+ this.newFilter('itemId', exports.Operator.equal, this.item.id),
48589
+ this.newFilter('workflowCode', exports.Operator.equal, this.item.__workflowCode)
48590
+ ];
48591
+ };
48500
48592
  WorkflowHistoryNewComponent.prototype.modifyGridInfo = function (gridInfo) {
48501
48593
  return __awaiter(this, void 0, void 0, function () {
48502
- return __generator(this, function (_a) {
48503
- gridInfo.filters.unshift(this.newFilter('tableName', exports.Operator.equal, this.tableName), this.newFilter('itemId', exports.Operator.equal, this.item.id), this.newFilter('workflowCode', exports.Operator.equal, this.item.__workflowCode));
48594
+ var filterByActionCode, arrValue_1, arrActionCode;
48595
+ var _a;
48596
+ return __generator(this, function (_b) {
48597
+ filterByActionCode = gridInfo.filters.find(function (q) { return q.field == 'actionCode'; });
48598
+ if (filterByActionCode) {
48599
+ arrValue_1 = JSON.parse(filterByActionCode.value);
48600
+ arrActionCode = this.dataSourceAction.filter(function (q) { return arrValue_1.some(function (x) { return x == q.code; }); }).map(function (x) { return x.rawCode; });
48601
+ filterByActionCode.value = JSON.stringify(arrActionCode);
48602
+ }
48603
+ (_a = gridInfo.filters).unshift.apply(_a, __spread(this.getDefaultFilter()));
48504
48604
  gridInfo.sorts.unshift(this.newSort('created', -1));
48505
48605
  return [2 /*return*/];
48506
48606
  });
@@ -48512,7 +48612,13 @@
48512
48612
  return __generator(this, function (_a) {
48513
48613
  // Duyệt từng history để chỉ hiển thị luồng hiện tại của quy trình. k hiển thị các bước thừa
48514
48614
  dataSource.forEach(function (item) {
48515
- item.fullActionCode = item.sourceStatusCode + "___" + item.actionCode;
48615
+ item.fullActionCode = item.actionCode;
48616
+ if (item.actionCode != MaActionBatDauQuyTrinh
48617
+ && item.actionCode != ActionUpdateModel
48618
+ && item.actionCode != ActionChoYKienBase
48619
+ && item.actionCode != ActionThuHoiBase) {
48620
+ item.fullActionCode = item.sourceStatusCode + "___" + item.actionCode;
48621
+ }
48516
48622
  _this.splitList(item, 'userIds');
48517
48623
  _this.splitList(item, 'userViewIds');
48518
48624
  _this.splitList(item, 'donViIds');
@@ -48551,7 +48657,10 @@
48551
48657
  WorkflowHistoryNewComponent.prototype.afterGetData = function () {
48552
48658
  return __awaiter(this, void 0, void 0, function () {
48553
48659
  return __generator(this, function (_a) {
48554
- this.regenerateMachineData();
48660
+ if (!this.generated) {
48661
+ this.generated = true;
48662
+ this.regenerateMachineData();
48663
+ }
48555
48664
  return [2 /*return*/];
48556
48665
  });
48557
48666
  });
@@ -50691,7 +50800,10 @@
50691
50800
  isTree: true,
50692
50801
  fieldTree: 'idParent',
50693
50802
  valueParentRoot: null,
50694
- sorts: [{ field: 'maPhanCap', dir: 1 }]
50803
+ sorts: [{ field: 'maPhanCap', dir: 1 }],
50804
+ defaultFilters: [
50805
+ this.newFilter('hienThiTrongCongViec', exports.Operator.equal, true)
50806
+ ]
50695
50807
  });
50696
50808
  };
50697
50809
  BaseCongViecComponent.prototype.ngOnDestroy = function () {
@@ -50946,12 +51058,25 @@
50946
51058
  var _this = this;
50947
51059
  this._congViecService.updateBulkIdCha(model).then(function (response) { return _this.handleResponse(response, '', function (f) { return _this.reload(); }); });
50948
51060
  };
51061
+ BaseCongViecComponent.prototype.getMenuButtons = function (rowData) {
51062
+ if (this.stateCode === exports.EnumStateByMenuCongViec.DA_XU_LY) {
51063
+ this.rowDataCurrent = rowData;
51064
+ return [
51065
+ { label: 'Dự thảo văn bản', icon: 'far fa-file-alt', command: this.duThaoVanBan.bind(this) }
51066
+ ];
51067
+ }
51068
+ return [];
51069
+ };
51070
+ BaseCongViecComponent.prototype.duThaoVanBan = function () {
51071
+ var link = this._moduleConfigService.getConfig().environment.clientDomain.vanban + "/vanbandi/du-thao#task=" + this.rowDataCurrent.id;
51072
+ window.open(link, '_blank');
51073
+ };
50949
51074
  return BaseCongViecComponent;
50950
51075
  }(DataListBase));
50951
51076
  BaseCongViecComponent.decorators = [
50952
51077
  { type: i0.Component, args: [{
50953
51078
  selector: 'base-congviec',
50954
- template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [hiddenAdd]=\"hiddenAdd\"\r\n [hiddenEdit]=\"hiddenEdit\" [hiddenDelete]=\"hiddenDelete\" [hiddenCopyLink]=\"true\" [hiddenAdd]=\"isFromDashboard\"\r\n [showScrollHorizontal]=\"true\" (onCopyLink)=\"_copyLink($event)\" (onCopyLinkMultiple)=\"_copyLinkMultiple()\"\r\n (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"addCongViec($event)\" (onEdit)=\"_edit($event)\"\r\n (onView)=\"_edit($event)\" (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\"\r\n (onReloaded)=\"_unmarkLoading()\" (onChangedStatusWorkflow)=\"handleChangedStatusWorkflow($event)\">\r\n <ng-template #buttonAfterToolbar>\r\n <button *ngIf=\"loaiDanhSach > 0 && !isPicker\" type=\"button\" pButton pRipple label=\"Ch\u1ECDn c\u00F4ng vi\u1EC7c\"\r\n icon=\"pi pi-plus\" class=\"p-button-text p-button-success\" (click)=\"onChonCongViec()\"></button>\r\n </ng-template>\r\n <ng-template #congViecInfo let-rowData=\"rowData\">\r\n <div class=\"container-task-info\">\r\n <div class=\"cell-task-info\">\r\n {{rowData.ten}}\r\n </div>\r\n <div class=\"percent-done\">\r\n <div class=\"detail transition-width\" [ngStyle]=\"{\r\n width: rowData.percentWidth\r\n }\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #idPriority let-rowData=\"rowData\">\r\n <div class=\"priority\">\r\n <span [ngStyle]=\"{\r\n color: rowData.priorityColor,\r\n background: rowData.priorityBackground\r\n }\">{{rowData.stridPriority}}</span>\r\n </div>\r\n </ng-template>\r\n <ng-template *ngIf=\"loaiDanhSach > 0\" #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <button type=\"button\" pButton pRipple pTooltip=\"{{'FORM.DELETE' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"deleteCongViecTheoLoaiDanhSach(rowData)\"></button>\r\n </ng-template>\r\n</crud-list>\r\n\r\n<tn-dialog *ngIf=\"loaiCongViecModel.showEditForm\" [styleClass]=\"'tn-form-dialog'\"\r\n [header]=\"loaiCongViecModel.header | translate\" [popupSize]=\"loaiCongViecModel.popupSize\"\r\n (onHide)=\"loaiCongViecModel.showEditForm = false\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-grid\">\r\n <div class=\"p-md-10 tn-dropdown p-fluid\">\r\n <dropdown [control]=\"searchSchema.loaiCongViec\" [(value)]=\"searchData.loaiCongViec\"></dropdown>\r\n </div>\r\n <div class=\"p-md-2\">\r\n <button type=\"button\" pButton class=\"p-button-primary p-col-12\" label=\"Ok\"\r\n (click)=\"showFormAddTask($event)\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"showDetailForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"setting.popupHeader | translate\" [popupSize]=\"setting.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"showDetailForm = false\">\r\n <base-congviec-form #formBase [parentModel]=\"model\" [parentSetting]=\"setting\" [parentContext]=\"context\"\r\n [model]=\"formModel\" [crudList]=\"crudList\" (onSaved)=\"showDetailForm = false;crudList.reload()\"\r\n (onCancel)=\"_handleCancel($event)\" (onAfterSaved)=\"onAfterSaved($event)\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"showPickerForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"'Ch\u1ECDn c\u00F4ng vi\u1EC7c' | translate\" [popupSize]=\"setting.popupSize\" [showFooter]=\"true\"\r\n [useDefaultScrollBar]=\"true\" (onHide)=\"showPickerForm = false\">\r\n <base-congviec #congViecPicker [isPicker]=\"true\" [formState]=\"formState\" [loaiDanhSach]=\"loaiDanhSach\"\r\n [idCongViec]=\"idCongViec\">\r\n </base-congviec>\r\n <ng-template #footer>\r\n <button type=\"button\" pButton icon=\"pi pi-save\" class=\"p-button-text\" [label]=\"'Ch\u1ECDn' | translate\"\r\n (click)=\"onSelectCongViec()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" preventTab (click)=\"showPickerForm=false\"></button>\r\n </ng-template>\r\n</tn-dialog>",
51079
+ template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [hiddenAdd]=\"hiddenAdd\"\r\n [hiddenEdit]=\"hiddenEdit\" [hiddenDelete]=\"hiddenDelete\" [hiddenCopyLink]=\"true\" [hiddenAdd]=\"isFromDashboard\"\r\n [showScrollHorizontal]=\"true\" [menuButtons]=\"getMenuButtons\" (onCopyLink)=\"_copyLink($event)\"\r\n (onCopyLinkMultiple)=\"_copyLinkMultiple()\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"addCongViec($event)\"\r\n (onEdit)=\"_edit($event)\" (onView)=\"_edit($event)\" (onDelete)=\"_delete($event)\"\r\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\"\r\n (onChangedStatusWorkflow)=\"handleChangedStatusWorkflow($event)\">\r\n <ng-template #buttonAfterToolbar>\r\n <button *ngIf=\"loaiDanhSach > 0 && !isPicker\" type=\"button\" pButton pRipple label=\"Ch\u1ECDn c\u00F4ng vi\u1EC7c\"\r\n icon=\"pi pi-plus\" class=\"p-button-text p-button-success\" (click)=\"onChonCongViec()\"></button>\r\n </ng-template>\r\n <ng-template #congViecInfo let-rowData=\"rowData\">\r\n <div class=\"container-task-info\">\r\n <div class=\"cell-task-info\">\r\n {{rowData.ten}}\r\n </div>\r\n <div class=\"percent-done\">\r\n <div class=\"detail transition-width\" [ngStyle]=\"{\r\n width: rowData.percentWidth\r\n }\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template #idPriority let-rowData=\"rowData\">\r\n <div class=\"priority\">\r\n <span [ngStyle]=\"{\r\n color: rowData.priorityColor,\r\n background: rowData.priorityBackground\r\n }\">{{rowData.stridPriority}}</span>\r\n </div>\r\n </ng-template>\r\n <ng-template *ngIf=\"loaiDanhSach > 0\" #function let-rowData=\"rowData\" let-crudList=\"crudList\">\r\n <button type=\"button\" pButton pRipple pTooltip=\"{{'FORM.DELETE' | translate}}\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"deleteCongViecTheoLoaiDanhSach(rowData)\"></button>\r\n </ng-template>\r\n</crud-list>\r\n\r\n<tn-dialog *ngIf=\"loaiCongViecModel.showEditForm\" [styleClass]=\"'tn-form-dialog'\"\r\n [header]=\"loaiCongViecModel.header | translate\" [popupSize]=\"loaiCongViecModel.popupSize\"\r\n (onHide)=\"loaiCongViecModel.showEditForm = false\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-grid\">\r\n <div class=\"p-md-10 tn-dropdown p-fluid\">\r\n <dropdown [control]=\"searchSchema.loaiCongViec\" [(value)]=\"searchData.loaiCongViec\"></dropdown>\r\n </div>\r\n <div class=\"p-md-2\">\r\n <button type=\"button\" pButton class=\"p-button-primary p-col-12\" label=\"Ok\"\r\n (click)=\"showFormAddTask($event)\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"showDetailForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"setting.popupHeader | translate\" [popupSize]=\"setting.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"showDetailForm = false\">\r\n <base-congviec-form #formBase [parentModel]=\"model\" [parentSetting]=\"setting\" [parentContext]=\"context\"\r\n [model]=\"formModel\" [crudList]=\"crudList\" (onSaved)=\"showDetailForm = false;crudList.reload()\"\r\n (onCancel)=\"_handleCancel($event)\" (onAfterSaved)=\"onAfterSaved($event)\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"showPickerForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"'Ch\u1ECDn c\u00F4ng vi\u1EC7c' | translate\" [popupSize]=\"setting.popupSize\" [showFooter]=\"true\"\r\n [useDefaultScrollBar]=\"true\" (onHide)=\"showPickerForm = false\">\r\n <base-congviec #congViecPicker [isPicker]=\"true\" [formState]=\"formState\" [loaiDanhSach]=\"loaiDanhSach\"\r\n [idCongViec]=\"idCongViec\">\r\n </base-congviec>\r\n <ng-template #footer>\r\n <button type=\"button\" pButton icon=\"pi pi-save\" class=\"p-button-text\" [label]=\"'Ch\u1ECDn' | translate\"\r\n (click)=\"onSelectCongViec()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" preventTab (click)=\"showPickerForm=false\"></button>\r\n </ng-template>\r\n</tn-dialog>",
50955
51080
  providers: [ComponentContextService],
50956
51081
  styles: [".container-task-info .percent-done{background-color:#f0f0f0;border-radius:2px;height:5px;margin-top:5px;overflow:hidden;position:relative}.container-task-info .percent-done .detail{background:#3eb839;border-radius:2px;font-size:13px;height:5px;left:0;position:absolute;text-align:center;top:0}.priority{text-align:center}.priority>span{border-radius:3px;font-size:.8em;padding:3px 7px}"]
50957
51082
  },] }
@@ -51136,7 +51261,11 @@
51136
51261
  field: 'ten',
51137
51262
  label: 'Tên loại',
51138
51263
  required: true,
51139
- mdWidth: 12
51264
+ }),
51265
+ new SwitchControlSchema({
51266
+ field: 'hienThiTrongCongViec',
51267
+ label: 'Sử dụng ở phân hệ công việc',
51268
+ defaultValue: true
51140
51269
  })
51141
51270
  ];
51142
51271
  };
@@ -51221,6 +51350,7 @@
51221
51350
  return __awaiter(this, void 0, void 0, function () {
51222
51351
  return __generator(this, function (_a) {
51223
51352
  gridInfo.sorts = [{ field: 'maPhanCap', dir: 1 }];
51353
+ gridInfo.filters.push(this.newFilter('soThuTu', exports.Operator.equal, 'soThuTu', true));
51224
51354
  return [2 /*return*/];
51225
51355
  });
51226
51356
  });
@@ -56053,6 +56183,7 @@
56053
56183
  exports.TBL_KTX_NGUOITHUE_HOSO = TBL_KTX_NGUOITHUE_HOSO;
56054
56184
  exports.TBL_TS_PHIEUDEXUAT = TBL_TS_PHIEUDEXUAT;
56055
56185
  exports.TBL_TS_TAISANCODINH_CONSTS = TBL_TS_TAISANCODINH_CONSTS;
56186
+ exports.TabViewData = TabViewData;
56056
56187
  exports.TableSchema = TableSchema;
56057
56188
  exports.TagSeparator = TagSeparator;
56058
56189
  exports.TaiLieuComponent = TaiLieuComponent;