tnx-shared 5.1.342 → 5.1.345

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 (106) hide show
  1. package/bundles/tnx-shared.umd.js +274 -67
  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/list-base.d.ts.map +1 -1
  6. package/classes/form-schema.d.ts +4 -0
  7. package/classes/form-schema.d.ts.map +1 -1
  8. package/components/address/address.component.d.ts +1 -0
  9. package/components/address/address.component.d.ts.map +1 -1
  10. package/components/autocomplete-datasource/autocomplete-datasource.component.d.ts +1 -0
  11. package/components/autocomplete-datasource/autocomplete-datasource.component.d.ts.map +1 -1
  12. package/components/autocomplete-picker/autocomplete-picker.component.d.ts +2 -0
  13. package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
  14. package/components/check-box-list/check-box-list.component.d.ts +1 -0
  15. package/components/check-box-list/check-box-list.component.d.ts.map +1 -1
  16. package/components/cocautochuc/cocautochuc-picker/cocautochuc-picker.component.d.ts +1 -0
  17. package/components/cocautochuc/cocautochuc-picker/cocautochuc-picker.component.d.ts.map +1 -1
  18. package/components/cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component.d.ts +1 -0
  19. package/components/cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component.d.ts.map +1 -1
  20. package/components/congviec-picker/congviec-picker.component.d.ts +1 -0
  21. package/components/congviec-picker/congviec-picker.component.d.ts.map +1 -1
  22. package/components/crud/crud-form/crud-form.component.d.ts +7 -0
  23. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  24. package/components/datetime-picker/datetime-picker.component.d.ts +1 -0
  25. package/components/datetime-picker/datetime-picker.component.d.ts.map +1 -1
  26. package/components/datetime-picker-range/datetime-picker-range.component.d.ts +1 -0
  27. package/components/datetime-picker-range/datetime-picker-range.component.d.ts.map +1 -1
  28. package/components/dropdown/dropdown.component.d.ts +1 -0
  29. package/components/dropdown/dropdown.component.d.ts.map +1 -1
  30. package/components/entity-picker/entity-picker.component.d.ts +1 -0
  31. package/components/entity-picker/entity-picker.component.d.ts.map +1 -1
  32. package/components/file-explorer/file-manager/file-manager.component.d.ts +1 -0
  33. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  34. package/components/file-upload/file-upload.component.d.ts +1 -0
  35. package/components/file-upload/file-upload.component.d.ts.map +1 -1
  36. package/components/mask/mask.component.d.ts +1 -0
  37. package/components/mask/mask.component.d.ts.map +1 -1
  38. package/components/number-picker-range/number-picker-range.component.d.ts +1 -0
  39. package/components/number-picker-range/number-picker-range.component.d.ts.map +1 -1
  40. package/components/radio-button-list/radio-button-list.component.d.ts +1 -0
  41. package/components/radio-button-list/radio-button-list.component.d.ts.map +1 -1
  42. package/components/reference-textbox/reference-textbox.component.d.ts +2 -1
  43. package/components/reference-textbox/reference-textbox.component.d.ts.map +1 -1
  44. package/components/service-file-upload/service-file-upload.component.d.ts +1 -0
  45. package/components/service-file-upload/service-file-upload.component.d.ts.map +1 -1
  46. package/components/splash-component/splash-component-v1/splash-component-v1.component.d.ts.map +1 -1
  47. package/components/splash-component/splash-component-v2/splash-component-v2.component.d.ts.map +1 -1
  48. package/components/splash-component/splash-component.component.d.ts.map +1 -1
  49. package/components/statemachines/models/enums.d.ts +1 -0
  50. package/components/statemachines/models/enums.d.ts.map +1 -1
  51. package/components/tn-color-picker/tn-color-picker.component.d.ts +1 -0
  52. package/components/tn-color-picker/tn-color-picker.component.d.ts.map +1 -1
  53. package/components/tn-tabview/tn-tabview.component.d.ts +7 -1
  54. package/components/tn-tabview/tn-tabview.component.d.ts.map +1 -1
  55. package/components/tn-tinymce/tn-tinymce.component.d.ts +1 -0
  56. package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
  57. package/components/user-picker/user-picker.component.d.ts +1 -0
  58. package/components/user-picker/user-picker.component.d.ts.map +1 -1
  59. package/components/vanban-picker/vanban-picker.component.d.ts +1 -0
  60. package/components/vanban-picker/vanban-picker.component.d.ts.map +1 -1
  61. package/esm2015/classes/base/list-base.js +13 -8
  62. package/esm2015/classes/form-schema.js +4 -1
  63. package/esm2015/components/address/address.component.js +4 -1
  64. package/esm2015/components/autocomplete-datasource/autocomplete-datasource.component.js +4 -1
  65. package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +13 -7
  66. package/esm2015/components/check-box-list/check-box-list.component.js +4 -1
  67. package/esm2015/components/cocautochuc/cocautochuc-picker/cocautochuc-picker.component.js +4 -1
  68. package/esm2015/components/cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component.js +4 -1
  69. package/esm2015/components/congviec-picker/congviec-picker.component.js +4 -1
  70. package/esm2015/components/crud/crud-form/crud-form.component.js +67 -11
  71. package/esm2015/components/crud/crud-list/crud-list.component.js +2 -2
  72. package/esm2015/components/datetime-picker/datetime-picker.component.js +4 -1
  73. package/esm2015/components/datetime-picker-range/datetime-picker-range.component.js +5 -2
  74. package/esm2015/components/dropdown/dropdown.component.js +4 -1
  75. package/esm2015/components/entity-picker/entity-picker.component.js +4 -1
  76. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +4 -1
  77. package/esm2015/components/file-upload/file-upload.component.js +4 -1
  78. package/esm2015/components/mask/mask.component.js +4 -1
  79. package/esm2015/components/number-picker-range/number-picker-range.component.js +5 -2
  80. package/esm2015/components/radio-button-list/radio-button-list.component.js +4 -1
  81. package/esm2015/components/reference-textbox/reference-textbox.component.js +6 -3
  82. package/esm2015/components/service-file-upload/service-file-upload.component.js +4 -1
  83. package/esm2015/components/splash-component/splash-component-v1/splash-component-v1.component.js +4 -1
  84. package/esm2015/components/splash-component/splash-component-v2/splash-component-v2.component.js +4 -1
  85. package/esm2015/components/splash-component/splash-component.component.js +4 -1
  86. package/esm2015/components/statemachines/models/constants.js +14 -14
  87. package/esm2015/components/statemachines/models/enums.js +2 -2
  88. package/esm2015/components/tn-color-picker/tn-color-picker.component.js +4 -2
  89. package/esm2015/components/tn-dialog/tn-dialog.component.js +2 -2
  90. package/esm2015/components/tn-tabview/tn-tabview.component.js +32 -5
  91. package/esm2015/components/tn-tinymce/tn-tinymce.component.js +4 -1
  92. package/esm2015/components/user-picker/user-picker.component.js +4 -1
  93. package/esm2015/components/vanban-picker/vanban-picker.component.js +4 -1
  94. package/esm2015/services/common.service.js +39 -32
  95. package/esm2015/services/menu.service.js +20 -1
  96. package/esm2015/services/permission.service.js +1 -1
  97. package/esm2015/services/user.service.js +1 -1
  98. package/fesm2015/tnx-shared.js +269 -75
  99. package/fesm2015/tnx-shared.js.map +1 -1
  100. package/package.json +2 -2
  101. package/services/common.service.d.ts.map +1 -1
  102. package/services/menu.service.d.ts +1 -0
  103. package/services/menu.service.d.ts.map +1 -1
  104. package/services/permission.service.d.ts.map +1 -1
  105. package/services/user.service.d.ts.map +1 -1
  106. package/tnx-shared.metadata.json +1 -1
@@ -1286,6 +1286,7 @@ class CheckBoxListControlSchema extends DataSourceControlSchema {
1286
1286
  class TableSchema extends FormControlBase {
1287
1287
  constructor(init) {
1288
1288
  super();
1289
+ this.autoGenerateId = false;
1289
1290
  this.showNumber = true;
1290
1291
  this.showFunction = true;
1291
1292
  this.showFooter = true;
@@ -1502,6 +1503,8 @@ class EventData {
1502
1503
  class TabViewData {
1503
1504
  constructor(init) {
1504
1505
  this.hidden = false;
1506
+ this.alwayRender = false;
1507
+ this.useScrollbar = false; // Config để xác định có sử dụng custom-scrollbar không, nếu không thì dùng scrollbar mặc định của trình duyệt
1505
1508
  for (const key in init) {
1506
1509
  this[key] = init[key];
1507
1510
  }
@@ -2369,8 +2372,8 @@ class CommonService {
2369
2372
  result[field] = data;
2370
2373
  }
2371
2374
  else {
2372
- if (typeof result[field] === 'undefined' ||
2373
- !isObject(result[field])) {
2375
+ if (typeof result[field] === 'undefined'
2376
+ || !isObject(result[field])) {
2374
2377
  result[field] = {};
2375
2378
  }
2376
2379
  result = result[field];
@@ -2436,8 +2439,8 @@ class CommonService {
2436
2439
  });
2437
2440
  }
2438
2441
  if (colVal) {
2439
- rowString +=
2440
- colVal
2442
+ rowString
2443
+ += colVal
2441
2444
  .toString()
2442
2445
  .replace(',', '.')
2443
2446
  .replace('\n', '')
@@ -2499,8 +2502,8 @@ class CommonService {
2499
2502
  });
2500
2503
  }
2501
2504
  if (colVal) {
2502
- rowString +=
2503
- colVal
2505
+ rowString
2506
+ += colVal
2504
2507
  .toString()
2505
2508
  .replace(',', '.')
2506
2509
  .replace('\n', '')
@@ -2564,8 +2567,8 @@ class CommonService {
2564
2567
  });
2565
2568
  }
2566
2569
  if (colVal) {
2567
- rowString +=
2568
- colVal
2570
+ rowString
2571
+ += colVal
2569
2572
  .toString()
2570
2573
  .replace(',', '.')
2571
2574
  .replace('\n', '')
@@ -2611,11 +2614,11 @@ class CommonService {
2611
2614
  }
2612
2615
  getLabel(item, textField, textField2, prefixTextField2) {
2613
2616
  if (textField2) {
2614
- return (item[textField] +
2615
- ' - ' +
2616
- prefixTextField2 +
2617
- ' ' +
2618
- item[textField2]);
2617
+ return (item[textField]
2618
+ + ' - '
2619
+ + prefixTextField2
2620
+ + ' '
2621
+ + item[textField2]);
2619
2622
  }
2620
2623
  else {
2621
2624
  return item[textField];
@@ -2958,12 +2961,13 @@ class CommonService {
2958
2961
  return `DEFAULT_${action}`.toUpperCase();
2959
2962
  }
2960
2963
  cloneObject(obj) {
2961
- if (obj !== undefined)
2964
+ if (obj !== undefined) {
2962
2965
  return JSON.parse(JSON.stringify(obj));
2966
+ }
2963
2967
  return undefined;
2964
2968
  }
2965
2969
  setProperty(prop, val, model) {
2966
- let clone = this.cloneObject(model);
2970
+ const clone = this.cloneObject(model);
2967
2971
  if (clone) {
2968
2972
  clone[prop] = val;
2969
2973
  }
@@ -3038,10 +3042,10 @@ class CommonService {
3038
3042
  words.forEach((word) => {
3039
3043
  if (word.trim() != '') {
3040
3044
  if (word.length > 1) {
3041
- result +=
3042
- word.substring(0, 1).toUpperCase() +
3043
- word.substring(1) +
3044
- ' ';
3045
+ result
3046
+ += word.substring(0, 1).toUpperCase()
3047
+ + word.substring(1)
3048
+ + ' ';
3045
3049
  }
3046
3050
  else {
3047
3051
  result += word.toUpperCase() + ' ';
@@ -3080,22 +3084,26 @@ class CommonService {
3080
3084
  return n !== Infinity && String(n) === str;
3081
3085
  }
3082
3086
  hasAnyMask() {
3083
- return (document.body.querySelector('div[class~="ui-dialog-mask"]') ||
3084
- document.body.querySelector('div[class~="ui-sidebar-mask"]'));
3087
+ return (document.body.querySelector('div[class~="ui-dialog-mask"]')
3088
+ || document.body.querySelector('div[class~="ui-sidebar-mask"]'));
3085
3089
  }
3086
3090
  safeStringify(data) {
3087
3091
  const item = stringify.stableStringify(data, null, 2);
3088
3092
  return item;
3089
3093
  }
3090
3094
  compareString(value1, value2) {
3091
- if (value1 == null && value2 != null)
3095
+ if (value1 == null && value2 != null) {
3092
3096
  return -1;
3093
- else if (value1 != null && value2 == null)
3097
+ }
3098
+ else if (value1 != null && value2 == null) {
3094
3099
  return 1;
3095
- else if (value1 == null && value2 == null)
3100
+ }
3101
+ else if (value1 == null && value2 == null) {
3096
3102
  return 0;
3097
- else if (typeof value1 === 'string' && typeof value2 === 'string')
3103
+ }
3104
+ else if (typeof value1 === 'string' && typeof value2 === 'string') {
3098
3105
  return value1.localeCompare(value2);
3106
+ }
3099
3107
  else {
3100
3108
  return 0;
3101
3109
  }
@@ -3168,7 +3176,7 @@ class CommonService {
3168
3176
  return output;
3169
3177
  }
3170
3178
  distinctArray(array) {
3171
- var arrResult = array.filter((item, index) => array.indexOf(item) === index);
3179
+ const arrResult = array.filter((item, index) => array.indexOf(item) === index);
3172
3180
  return arrResult;
3173
3181
  }
3174
3182
  distinctField(array, field) {
@@ -3235,7 +3243,7 @@ class CommonService {
3235
3243
  * chỉ giao một đầu mút.
3236
3244
  */
3237
3245
  hasIntersection(start, end, compareStart, compareEnd) {
3238
- var hasIntersection = (start < compareStart && compareStart < end)
3246
+ const hasIntersection = (start < compareStart && compareStart < end)
3239
3247
  || (start < compareEnd && compareEnd < end)
3240
3248
  || (compareStart <= start && end <= compareEnd);
3241
3249
  return hasIntersection;
@@ -3252,8 +3260,8 @@ class CommonService {
3252
3260
  if (!strDate1 || !strDate2) {
3253
3261
  return null;
3254
3262
  }
3255
- let d1 = new Date(strDate1);
3256
- let d2 = new Date(strDate2);
3263
+ const d1 = new Date(strDate1);
3264
+ const d2 = new Date(strDate2);
3257
3265
  let offset = (d1.getTime() - d2.getTime()) / 1000 / 60;
3258
3266
  if (round) {
3259
3267
  offset = Math.round(offset);
@@ -3276,11 +3284,13 @@ class CommonService {
3276
3284
  : null;
3277
3285
  }
3278
3286
  isSameArray(array1, array2) {
3279
- if (array1.length != array2.length)
3287
+ if (array1.length != array2.length) {
3280
3288
  return false;
3289
+ }
3281
3290
  for (var item of array1) {
3282
- if (!array2.some(q => q == item))
3291
+ if (!array2.some(q => q == item)) {
3283
3292
  return false;
3293
+ }
3284
3294
  }
3285
3295
  return true;
3286
3296
  }
@@ -10034,7 +10044,7 @@ var EnumUserRule;
10034
10044
  (function (EnumUserRule) {
10035
10045
  // NGUOI_TAO = 1,
10036
10046
  EnumUserRule[EnumUserRule["CAP_TREN"] = 2] = "CAP_TREN";
10037
- // NGUOI_CUOI_CUNG = 3,
10047
+ EnumUserRule[EnumUserRule["NGUOI_CUOI_CUNG"] = 3] = "NGUOI_CUOI_CUNG";
10038
10048
  EnumUserRule[EnumUserRule["NGUOI_THAM_GIA_QUY_TRINH"] = 4] = "NGUOI_THAM_GIA_QUY_TRINH";
10039
10049
  // Cấp trên mà xử lý bản ghi đối tượng trình lên
10040
10050
  // CAP_TREN_DA_GUI = 5,
@@ -13751,8 +13761,10 @@ class CrudFormComponent extends ComponentBase {
13751
13761
  continue;
13752
13762
  }
13753
13763
  }
13754
- else if (childNode.control['_hidden'])
13755
- continue;
13764
+ else {
13765
+ if (childNode['_hidden'] || childNode.control['_hidden'])
13766
+ continue;
13767
+ }
13756
13768
  if (!(yield this.validate(childNode, true))) {
13757
13769
  this._inValidForm = true;
13758
13770
  }
@@ -13864,6 +13876,13 @@ class CrudFormComponent extends ComponentBase {
13864
13876
  }
13865
13877
  });
13866
13878
  }
13879
+ handleLoadedControl(_component, control, parentPath) {
13880
+ const parentNode = this._rootNode.getNodeByPath(parentPath);
13881
+ const currentNode = parentNode.getChildNode(control.field);
13882
+ if (_component && currentNode) {
13883
+ currentNode._component = _component;
13884
+ }
13885
+ }
13867
13886
  handleControlReadyEvent(control, parentPath) {
13868
13887
  return __awaiter(this, void 0, void 0, function* () {
13869
13888
  const parentNode = this._rootNode.getNodeByPath(parentPath);
@@ -14285,6 +14304,10 @@ class CrudFormComponent extends ComponentBase {
14285
14304
  const index = tableNode.childNodes.length;
14286
14305
  const parentPath = tablePath + '[' + index + ']';
14287
14306
  const data = {};
14307
+ if (control.autoGenerateId) {
14308
+ data.id = this._commonService.guid();
14309
+ }
14310
+ // Thêm id để ngăn render liên tục
14288
14311
  for (const subControl of control.rowTemplate) {
14289
14312
  this.initControlDefaultValue(data, subControl, parentPath);
14290
14313
  }
@@ -14545,7 +14568,7 @@ class CrudFormComponent extends ComponentBase {
14545
14568
  || (parentModel._status[control.field].hidden === undefined
14546
14569
  && (control.hidden
14547
14570
  || (control.hiddenCheck && control.hiddenCheck(this._minimizedData, currentNode))));
14548
- control['_hidden'] = !!result;
14571
+ currentNode['_hidden'] = !!result;
14549
14572
  return result;
14550
14573
  }
14551
14574
  getContextTd(control, data, index, tablePath) {
@@ -14622,7 +14645,7 @@ class CrudFormComponent extends ComponentBase {
14622
14645
  CrudFormComponent.decorators = [
14623
14646
  { type: Component, args: [{
14624
14647
  selector: 'crud-form',
14625
- 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 [placeholder]=\"control.placeholder\"\r\n [required]=\"control.validators && control.validators.required\"\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\" [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=\"'reference-text'\">\r\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\"></reference-textbox>\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\" [autoFormat]=\"control.autoFormat\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\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 </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]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea [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 [readOnlyValues]=\"data[control.field + '_readOnly']\" [(ngModel)]=\"data[control.field]\"\r\n [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 <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></tn-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\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(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\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(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'\"\r\n [autoFormat]=\"control.autoFormat\" [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 class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\r\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template pTemplate=\"colgroup\">\r\n <colgroup>\r\n <col *ngIf=\"control.showNumber\" style=\"width: 40px\" />\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <col [style.width]=\"subControl.width\" />\r\n </ng-container>\r\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\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\">\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=\"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\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\r\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\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 *ngIf=\"control.showNumber\" class=\"stt\"\r\n style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </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 [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\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 *ngIf=\"control.showFunction\" style=\"text-align: center\"\r\n class=\"column-function text-center\">\r\n <div *ngIf=\"!control.rowButtonTemplate\"\r\n 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 p-button-rounded\"\r\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton\r\n class=\"p-button-text p-button-danger p-button-rounded\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n (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 </div>\r\n <div *ngIf=\"control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\r\n </ng-container>\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 *ngIf=\"control.showDialog\" 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>",
14648
+ 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 [placeholder]=\"control.placeholder\"\r\n [required]=\"control.validators && control.validators.required\"\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\" [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=\"'reference-text'\">\r\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"></reference-textbox>\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\" [autoFormat]=\"control.autoFormat\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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\" [min]=\"control.min\"\r\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 </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]\"\r\n (change)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\" />\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea pInputTextarea [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 [height]=\"control.height ? control.height : 250\" [languageCode]=\"control.languageCode\"\r\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\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\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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\"\r\n [suggestions]=\"data._source[control.field] || control.dataSource\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 [disabled]=\"control.disabled\" [control]=\"control\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (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 [readonly]=\"control.readonly\" [accept]=\"control.accept\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\r\n (onChanged)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\">\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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 [readOnlyValues]=\"data[control.field + '_readOnly']\" [(ngModel)]=\"data[control.field]\"\r\n [multiple]=\"control.multiple\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\r\n [(ngModel)]=\"data[control.field]\"\r\n (onChange)=\"handleFieldValueChange(control, $event, 'change', data, parentPath)\"></tn-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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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\" [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\"\r\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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'\"\r\n [autoFormat]=\"control.autoFormat\" [min]=\"0\" [max]=\"100\"\r\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\r\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\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 class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\r\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\r\n [rowTrackBy]=\"trackByFuncId\"\r\n (onRowReorder)=\"handleRowOrdered(control, $event, 'rowReorder', data, parentPath)\">\r\n <ng-template pTemplate=\"colgroup\">\r\n <colgroup>\r\n <col *ngIf=\"control.showNumber\" style=\"width: 40px\" />\r\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\r\n <col [style.width]=\"subControl.width\" />\r\n </ng-container>\r\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\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\">\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=\"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\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\r\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\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 *ngIf=\"control.showNumber\" class=\"stt\"\r\n style=\"text-align: center; vertical-align: inherit\">\r\n <span>\r\n {{ri + 1}}\r\n </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 [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\r\n <span class=\"p-column-title\">{{subControl.label}}</span>\r\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customControl; context: getContextTd(subControl, rowData, ri, path)\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\r\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\r\n </ng-template>\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 *ngIf=\"control.showFunction\" style=\"text-align: center\"\r\n class=\"column-function text-center\">\r\n <div *ngIf=\"!control.rowButtonTemplate\"\r\n 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 p-button-rounded\"\r\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\r\n (click)=\"saveRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\r\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\r\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\r\n (click)=\"editRow(ri, control, path)\"></button>\r\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\r\n type=\"button\" pButton\r\n class=\"p-button-text p-button-danger p-button-rounded\"\r\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\r\n (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 </div>\r\n <div *ngIf=\"control.rowButtonTemplate\"\r\n class=\"p-toolbar-group-center button-group\">\r\n <ng-container\r\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\r\n </ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\r\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\r\n </ng-container>\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 *ngIf=\"control.showDialog\" 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>",
14626
14649
  providers: [ComponentContextService],
14627
14650
  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;margin-bottom:5px;padding: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}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}::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}"]
14628
14651
  },] }
@@ -14715,7 +14738,12 @@ class ControlTreeNode {
14715
14738
  }
14716
14739
  else {
14717
14740
  if (!this.schemaPath) {
14718
- keysPlus = Object.keys(schemas);
14741
+ Object.keys(schemas).forEach(key => {
14742
+ const item = schemas[key];
14743
+ if (item.uniqueField == item.field) {
14744
+ keysPlus.push(key);
14745
+ }
14746
+ });
14719
14747
  }
14720
14748
  }
14721
14749
  this.keysPlus = keysPlus;
@@ -14736,6 +14764,22 @@ class ControlTreeNode {
14736
14764
  this.childNodeDic[childNode.field] = childNode;
14737
14765
  }
14738
14766
  }
14767
+ // Sau khi đã init xong node cho row thì fire event cho các control trong row
14768
+ // Thường dùng với mục đích cần disabled, hidden các control của row khi có nhu cầu
14769
+ try {
14770
+ this.childNodes.forEach(_ => {
14771
+ if (_.control && _.control.onRowNodeFinishInit) {
14772
+ const eventData = new EventData({
14773
+ sourceNode: _,
14774
+ currentNode: _,
14775
+ eventType: 'rowFinishInit'
14776
+ });
14777
+ _.control.onRowNodeFinishInit(eventData);
14778
+ }
14779
+ });
14780
+ }
14781
+ catch (err) {
14782
+ }
14739
14783
  }
14740
14784
  else if (isArray(model)) {
14741
14785
  let i = 0;
@@ -14795,6 +14839,12 @@ class ControlTreeNode {
14795
14839
  else
14796
14840
  this.data = val;
14797
14841
  }
14842
+ get component() {
14843
+ return this._component;
14844
+ }
14845
+ set component(val) {
14846
+ this._component = val;
14847
+ }
14798
14848
  setHidden(field, hidden = true) {
14799
14849
  if (Array.isArray(field)) {
14800
14850
  field.forEach(f => {
@@ -14806,13 +14856,29 @@ class ControlTreeNode {
14806
14856
  }
14807
14857
  }
14808
14858
  setHiddenField(field, hidden) {
14859
+ this.setPrivateStatus(field, 'hidden', hidden);
14860
+ }
14861
+ setDisabled(field, disabled = true) {
14862
+ if (Array.isArray(field)) {
14863
+ field.forEach(f => {
14864
+ this.setDisabledField(f, disabled);
14865
+ });
14866
+ }
14867
+ else {
14868
+ this.setDisabledField(field, disabled);
14869
+ }
14870
+ }
14871
+ setDisabledField(field, disabled) {
14872
+ this.setPrivateStatus(field, 'disabled', disabled);
14873
+ }
14874
+ setPrivateStatus(field, prop, value) {
14809
14875
  if (field.indexOf('.') > -1) {
14810
14876
  const childNode = this.getNodeByPath(`${this.modelPath}.${field}`);
14811
14877
  const lastField = field.split('.').pop();
14812
- childNode.parentNode.data._status[lastField].hidden = hidden;
14878
+ childNode.parentNode.data._status[lastField][prop] = value;
14813
14879
  }
14814
14880
  else {
14815
- this.data._status[field].hidden = hidden;
14881
+ this.data._status[field][prop] = value;
14816
14882
  }
14817
14883
  }
14818
14884
  getNodeByPath(modelPath) {
@@ -17508,10 +17574,10 @@ class CrudListComponent extends ComponentBase {
17508
17574
  }
17509
17575
  }
17510
17576
  extendColumns(cols, appendCol = true) {
17577
+ this.setting.advanceData.fieldNeedGetRef = [];
17511
17578
  if (!cols) {
17512
17579
  return;
17513
17580
  }
17514
- this.setting.advanceData.fieldNeedGetRef = [];
17515
17581
  const temp = [];
17516
17582
  const tmpCols = [...cols];
17517
17583
  if (this.setting.columnSetting.details) {
@@ -21656,14 +21722,17 @@ class ListBase extends ComponentBase {
21656
21722
  dataSource,
21657
21723
  allowFilter: this.setting.allowFilterWorkflowColumn
21658
21724
  });
21659
- this.setting.advanceData.fieldNeedGetRef.unshift(colParent);
21725
+ // Nếu chưa có this.setting.advanceData.fieldNeedGetRef thì bên crud-list sẽ add cột này sau
21726
+ if (this.setting.advanceData.fieldNeedGetRef) {
21727
+ this.setting.advanceData.fieldNeedGetRef.unshift(colParent);
21728
+ }
21660
21729
  const children = Object.assign(Object.assign({}, colParent), { rawColumn: colParent, controlType: ControlType.dropdown, dataType: colParent.dataTypeRefField, field: 'str' + colParent.field, allowFilter: colParent.allowFilter, sort: false, visible: !this.setting.hiddenWorkflowColumn });
21661
21730
  colParent.visible = false;
21662
21731
  this.setting.cols.push(colParent, children);
21663
- this.crudList.formatColumns([colParent, children]);
21664
- // this.setting.cols.push(colParent);
21665
- // this.crudList.formatColumns([colParent]);
21666
- this.crudList.buildFilterColumn([colParent]);
21732
+ if (this.crudList) {
21733
+ this.crudList.formatColumns([colParent, children]);
21734
+ this.crudList.buildFilterColumn([colParent]);
21735
+ }
21667
21736
  const userCurrent = this._userService.getCurrentUser();
21668
21737
  if (userCurrent.userName == 'admin') {
21669
21738
  const colForAdmin = new ColumnSchemaBase({
@@ -21676,8 +21745,10 @@ class ListBase extends ComponentBase {
21676
21745
  sort: false
21677
21746
  });
21678
21747
  this.setting.cols.push(colForAdmin);
21679
- this.crudList.formatColumns([colForAdmin]);
21680
- this.crudList.buildFilterColumn([colForAdmin]);
21748
+ if (this.crudList) {
21749
+ this.crudList.formatColumns([colForAdmin]);
21750
+ this.crudList.buildFilterColumn([colForAdmin]);
21751
+ }
21681
21752
  }
21682
21753
  }
21683
21754
  getDataSourceTrangThaiWorkflow() {
@@ -22547,6 +22618,7 @@ class AddressComponent extends DataFormBase {
22547
22618
  this._showSubLabel = true;
22548
22619
  this.readyToReload = false;
22549
22620
  this._readyStatus = {};
22621
+ this.onInit = new EventEmitter();
22550
22622
  this.onSelect = new EventEmitter();
22551
22623
  this.dataChange = new EventEmitter();
22552
22624
  this.onReady = new EventEmitter();
@@ -22649,6 +22721,7 @@ class AddressComponent extends DataFormBase {
22649
22721
  if (this.viewMode) {
22650
22722
  this.getModelText();
22651
22723
  }
22724
+ this.onInit.emit(this);
22652
22725
  }
22653
22726
  setDisabledControl() {
22654
22727
  const disabled = this._disabled ? true : null;
@@ -22752,6 +22825,7 @@ AddressComponent.propDecorators = {
22752
22825
  viewMode: [{ type: Input }],
22753
22826
  data: [{ type: Input }],
22754
22827
  showSubLabel: [{ type: Input }],
22828
+ onInit: [{ type: Output }],
22755
22829
  onSelect: [{ type: Output }],
22756
22830
  dataChange: [{ type: Output }],
22757
22831
  onReady: [{ type: Output }]
@@ -22811,6 +22885,7 @@ class AutocompleteDatasourceComponent {
22811
22885
  this._deviceDetectorService = _deviceDetectorService;
22812
22886
  this.dataSource = [];
22813
22887
  this.control = new AutoCompleteControlSchema();
22888
+ this.onInit = new EventEmitter();
22814
22889
  this.onValueChanged = new EventEmitter();
22815
22890
  this.lstDataSuggest = [];
22816
22891
  this.hideTransitionOptions = '195ms ease-in';
@@ -22824,6 +22899,7 @@ class AutocompleteDatasourceComponent {
22824
22899
  if (!this._deviceDetectorService.isDesktop()) {
22825
22900
  this.hideTransitionOptions = this.showTransitionOptions = '';
22826
22901
  }
22902
+ this.onInit.emit(this);
22827
22903
  }
22828
22904
  handleBlur(event) {
22829
22905
  if (this.selectedValueBefore != this.selectedValue) {
@@ -22912,6 +22988,7 @@ AutocompleteDatasourceComponent.ctorParameters = () => [
22912
22988
  AutocompleteDatasourceComponent.propDecorators = {
22913
22989
  suggestions: [{ type: Input }],
22914
22990
  control: [{ type: Input }],
22991
+ onInit: [{ type: Output }],
22915
22992
  onValueChanged: [{ type: Output }]
22916
22993
  };
22917
22994
 
@@ -22951,6 +23028,7 @@ class AutoCompletePickerComponent extends ComponentBase {
22951
23028
  height: 900,
22952
23029
  maximize: true
22953
23030
  });
23031
+ this.onInit = new EventEmitter();
22954
23032
  this.onSelect = new EventEmitter();
22955
23033
  this.onUnSelect = new EventEmitter();
22956
23034
  this.onChanged = new EventEmitter();
@@ -22984,6 +23062,7 @@ class AutoCompletePickerComponent extends ComponentBase {
22984
23062
  this.buildFilterKeyword();
22985
23063
  this.buildSettingEntityPicker();
22986
23064
  this.updateFuncCheckReadOnlyItem();
23065
+ this.onInit.emit(this);
22987
23066
  }
22988
23067
  updateFuncCheckReadOnlyItem() {
22989
23068
  if (this.readOnlyValues && this.readOnlyValues.length) {
@@ -23410,14 +23489,17 @@ class AutoCompletePickerComponent extends ComponentBase {
23410
23489
  this.getDataSelectedValue(obj)
23411
23490
  .then(res => {
23412
23491
  this.updateSelectedValue();
23413
- if (this.hasValue && !this.isFiredReady) {
23414
- this.isFiredReady = true;
23415
- // Hàm ready này chỉ CẦN DÙNG trong trường hợp autocomplete-picker có value => Dùng để lấy dữ liệu các component con
23416
- // Nếu có trường hợp nào khác thì cần phải xử lý khác
23417
- this.onReady.emit();
23418
- }
23492
+ this.checkFireReady();
23419
23493
  });
23420
23494
  }
23495
+ checkFireReady() {
23496
+ if (!this.isFiredReady && this.hasValue) {
23497
+ this.isFiredReady = true;
23498
+ // Hàm ready này chỉ CẦN DÙNG trong trường hợp autocomplete-picker có value => Dùng để lấy dữ liệu các component con
23499
+ // Nếu có trường hợp nào khác thì cần phải xử lý khác
23500
+ this.onReady.emit();
23501
+ }
23502
+ }
23421
23503
  registerOnChange(fn) {
23422
23504
  this.onChangeBase = fn;
23423
23505
  }
@@ -23451,6 +23533,7 @@ AutoCompletePickerComponent.propDecorators = {
23451
23533
  disabled: [{ type: Input }],
23452
23534
  popupSize: [{ type: Input }],
23453
23535
  readOnlyValues: [{ type: Input }],
23536
+ onInit: [{ type: Output }],
23454
23537
  onSelect: [{ type: Output }],
23455
23538
  onUnSelect: [{ type: Output }],
23456
23539
  onChanged: [{ type: Output }],
@@ -25391,6 +25474,7 @@ class FileUploadComponent extends ComponentBase {
25391
25474
  this.invalidFileLimitMessageSummary = 'Quá số lượng file cho phép, ';
25392
25475
  this.invalidFileLimitMessageDetail = 'tối đa {0} file.';
25393
25476
  this.sharedFolderType = SharedFolderType.Tempt;
25477
+ this.onInit = new EventEmitter();
25394
25478
  this.onSelect = new EventEmitter();
25395
25479
  this.onRemove = new EventEmitter();
25396
25480
  this.onChanged = new EventEmitter();
@@ -25416,6 +25500,7 @@ class FileUploadComponent extends ComponentBase {
25416
25500
  this.isDisabled = isDisabled;
25417
25501
  }
25418
25502
  ngOnInit() {
25503
+ this.onInit.emit(this);
25419
25504
  }
25420
25505
  getFile() {
25421
25506
  return __awaiter(this, void 0, void 0, function* () {
@@ -25557,6 +25642,7 @@ FileUploadComponent.propDecorators = {
25557
25642
  invalidFileLimitMessageSummary: [{ type: Input }],
25558
25643
  invalidFileLimitMessageDetail: [{ type: Input }],
25559
25644
  sharedFolderType: [{ type: Input }],
25645
+ onInit: [{ type: Output }],
25560
25646
  onSelect: [{ type: Output }],
25561
25647
  onRemove: [{ type: Output }],
25562
25648
  onChanged: [{ type: Output }]
@@ -25802,6 +25888,7 @@ class CheckBoxListComponent {
25802
25888
  this._dropDownService = _dropDownService;
25803
25889
  this._deviceDetectorService = _deviceDetectorService;
25804
25890
  this._styleClass = 'p-grid tn-check-box-list';
25891
+ this.onInit = new EventEmitter();
25805
25892
  this.onSelect = new EventEmitter();
25806
25893
  this.onReady = new EventEmitter();
25807
25894
  this.dataSourceInternal = [];
@@ -25852,6 +25939,7 @@ class CheckBoxListComponent {
25852
25939
  if (this.control.pColClass) {
25853
25940
  this.classCheckBox += ` p-col-${this.control.pColClass}`;
25854
25941
  }
25942
+ this.onInit.emit(this);
25855
25943
  }
25856
25944
  bindDataSource(serviceUri, baseService) {
25857
25945
  var _a, _b;
@@ -25978,6 +26066,7 @@ CheckBoxListComponent.propDecorators = {
25978
26066
  control: [{ type: Input }],
25979
26067
  dataSource: [{ type: Input }],
25980
26068
  disabled: [{ type: Input }],
26069
+ onInit: [{ type: Output }],
25981
26070
  onSelect: [{ type: Output }],
25982
26071
  onReady: [{ type: Output }]
25983
26072
  };
@@ -26062,6 +26151,7 @@ class CoCauToChucPickerListComponent extends ComponentBase {
26062
26151
  this._coCauToChucService = _coCauToChucService;
26063
26152
  this._translateService = _translateService;
26064
26153
  this.disabled = false;
26154
+ this.onInit = new EventEmitter();
26065
26155
  this.onChanged = new EventEmitter();
26066
26156
  this.onSelect = new EventEmitter();
26067
26157
  this.onUnSelect = new EventEmitter();
@@ -26092,6 +26182,7 @@ class CoCauToChucPickerListComponent extends ComponentBase {
26092
26182
  sort: false
26093
26183
  })
26094
26184
  ], mdWidth: 12 }));
26185
+ this.onInit.emit(this);
26095
26186
  }
26096
26187
  handleFocus(evt) {
26097
26188
  this.onFocus.emit(evt);
@@ -26147,6 +26238,7 @@ CoCauToChucPickerListComponent.propDecorators = {
26147
26238
  control: [{ type: Input }],
26148
26239
  disabled: [{ type: Input }],
26149
26240
  readOnlyValues: [{ type: Input }],
26241
+ onInit: [{ type: Output }],
26150
26242
  onChanged: [{ type: Output }],
26151
26243
  onSelect: [{ type: Output }],
26152
26244
  onUnSelect: [{ type: Output }],
@@ -26170,6 +26262,7 @@ class CoCauToChucPickerComponent {
26170
26262
  this.showClear = false;
26171
26263
  this.disabledParentItem = true;
26172
26264
  this.rootParentId = null;
26265
+ this.onInit = new EventEmitter();
26173
26266
  this.onChanged = new EventEmitter();
26174
26267
  this.guidEmpty = '00000000-0000-0000-0000-000000000000';
26175
26268
  this.flashCacheParent = [];
@@ -26207,6 +26300,7 @@ class CoCauToChucPickerComponent {
26207
26300
  if (this.control)
26208
26301
  this.control._component = this;
26209
26302
  this.bindingUser();
26303
+ this.onInit.emit(this);
26210
26304
  }
26211
26305
  bindingUser() {
26212
26306
  this._organizationService.getAll().then(staffResult => {
@@ -26353,6 +26447,7 @@ CoCauToChucPickerComponent.propDecorators = {
26353
26447
  showClear: [{ type: Input }],
26354
26448
  disabledParentItem: [{ type: Input }],
26355
26449
  rootParentId: [{ type: Input }],
26450
+ onInit: [{ type: Output }],
26356
26451
  onChanged: [{ type: Output, args: ['onChanged',] }]
26357
26452
  };
26358
26453
 
@@ -27413,10 +27508,29 @@ class MenuService {
27413
27508
  const menuUrl = `assets/menus/${appCode.toLocaleLowerCase()}.json`;
27414
27509
  fetch(menuUrl).then((rs) => __awaiter(this, void 0, void 0, function* () {
27415
27510
  const menu = JSON.parse(yield rs.text());
27511
+ this.setDefaultIcon(menu, 0);
27416
27512
  yield this.setMenuItems(menu);
27417
27513
  }));
27418
27514
  });
27419
27515
  }
27516
+ setDefaultIcon(menus, level) {
27517
+ if (!menus)
27518
+ return;
27519
+ menus.forEach(itemMenu => {
27520
+ if (!itemMenu.icon) {
27521
+ if (level === 0) {
27522
+ itemMenu.icon = 'pi pi-th-large';
27523
+ }
27524
+ else if (level === 1) {
27525
+ itemMenu.icon = 'pi pi-star-o';
27526
+ }
27527
+ else {
27528
+ itemMenu.icon = 'pi pi-circle-on';
27529
+ }
27530
+ }
27531
+ this.setDefaultIcon(itemMenu.items, level + 1);
27532
+ });
27533
+ }
27420
27534
  }
27421
27535
  MenuService.ɵprov = ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(ɵɵinject(ModuleConfigService), ɵɵinject(PermissionService), ɵɵinject(CommonService), ɵɵinject(ApplicationContextService)); }, token: MenuService, providedIn: "root" });
27422
27536
  MenuService.decorators = [
@@ -30047,11 +30161,13 @@ class CongViecPickerComponent extends ComponentBase {
30047
30161
  constructor(_injector, _notifierService) {
30048
30162
  super(_injector);
30049
30163
  this._notifierService = _notifierService;
30164
+ this.onInit = new EventEmitter();
30050
30165
  this.onChanged = new EventEmitter();
30051
30166
  this.idCongViecs = [];
30052
30167
  this.formState = FormState;
30053
30168
  }
30054
30169
  ngOnInit() {
30170
+ this.onInit.emit(this);
30055
30171
  }
30056
30172
  handleIdsChange(ids) {
30057
30173
  this.idCongViecs = ids;
@@ -30100,6 +30216,7 @@ CongViecPickerComponent.ctorParameters = () => [
30100
30216
  ];
30101
30217
  CongViecPickerComponent.propDecorators = {
30102
30218
  control: [{ type: Input }],
30219
+ onInit: [{ type: Output }],
30103
30220
  onChanged: [{ type: Output }]
30104
30221
  };
30105
30222
 
@@ -30667,14 +30784,16 @@ TableDetailFormComponent.propDecorators = {
30667
30784
  class DatetimePickerRangeComponent {
30668
30785
  constructor() {
30669
30786
  this.control = new DateTimeRangeControlSchema();
30787
+ this.onInit = new EventEmitter();
30670
30788
  this.onClose = new EventEmitter();
30671
30789
  this.onChanged = new EventEmitter();
30672
30790
  this._controlModelData = [undefined, undefined];
30673
30791
  }
30674
30792
  ngOnInit() {
30793
+ this.onInit.emit(this);
30675
30794
  }
30676
30795
  clear() {
30677
- let re = (this._controlModelData[0] != null) || (this._controlModelData[1] != null);
30796
+ const re = (this._controlModelData[0] != null) || (this._controlModelData[1] != null);
30678
30797
  this._controlModelData = [undefined, undefined];
30679
30798
  return re;
30680
30799
  }
@@ -30723,6 +30842,7 @@ DatetimePickerRangeComponent.ctorParameters = () => [];
30723
30842
  DatetimePickerRangeComponent.propDecorators = {
30724
30843
  control: [{ type: Input }],
30725
30844
  disabled: [{ type: Input }],
30845
+ onInit: [{ type: Output }],
30726
30846
  onClose: [{ type: Output }],
30727
30847
  onChanged: [{ type: Output }]
30728
30848
  };
@@ -30735,6 +30855,7 @@ class DatetimePickerComponent {
30735
30855
  this.hideTransitionOptions = '195ms ease-in';
30736
30856
  this.showTransitionOptions = '225ms ease-out';
30737
30857
  this.control = new DateTimeControlSchema();
30858
+ this.onInit = new EventEmitter();
30738
30859
  this.onSelect = new EventEmitter();
30739
30860
  this.onChanged = new EventEmitter();
30740
30861
  this.onFocus = new EventEmitter();
@@ -30742,6 +30863,7 @@ class DatetimePickerComponent {
30742
30863
  this.onClose = new EventEmitter();
30743
30864
  }
30744
30865
  ngOnInit() {
30866
+ this.onInit.emit(this);
30745
30867
  }
30746
30868
  writeValue(obj) {
30747
30869
  if (obj) {
@@ -30913,6 +31035,7 @@ DatetimePickerComponent.propDecorators = {
30913
31035
  calendar: [{ type: ViewChild, args: ['calendar', { static: true },] }],
30914
31036
  control: [{ type: Input }],
30915
31037
  disabled: [{ type: Input }],
31038
+ onInit: [{ type: Output }],
30916
31039
  onSelect: [{ type: Output }],
30917
31040
  onChanged: [{ type: Output }],
30918
31041
  onFocus: [{ type: Output }],
@@ -30930,6 +31053,7 @@ class DropdownComponent extends ComponentBase {
30930
31053
  this.appendTo = 'body';
30931
31054
  this.defaultSelectedStyleClass = 'custom-select-item';
30932
31055
  this._itemSelectedStyleClass = this.defaultSelectedStyleClass;
31056
+ this.onInit = new EventEmitter();
30933
31057
  this.onChanged = new EventEmitter();
30934
31058
  this.onCollapse = new EventEmitter();
30935
31059
  this.onExpand = new EventEmitter();
@@ -31060,6 +31184,7 @@ class DropdownComponent extends ComponentBase {
31060
31184
  if (this.control.onInit) {
31061
31185
  this.control.onInit(this);
31062
31186
  }
31187
+ this.onInit.emit(this);
31063
31188
  }
31064
31189
  setDefaultSetting() {
31065
31190
  if (this.control.isTree) {
@@ -31760,6 +31885,7 @@ DropdownComponent.propDecorators = {
31760
31885
  dataSource: [{ type: Input }],
31761
31886
  value: [{ type: Input }],
31762
31887
  itemSelectedStyleClass: [{ type: Input }],
31888
+ onInit: [{ type: Output }],
31763
31889
  onChanged: [{ type: Output }],
31764
31890
  onCollapse: [{ type: Output }],
31765
31891
  onExpand: [{ type: Output }],
@@ -33077,6 +33203,7 @@ class EntityPickerComponent extends DataListBase {
33077
33203
  this._translateService = _translateService;
33078
33204
  this.disabled = false;
33079
33205
  this.readOnly = false;
33206
+ this.onInit = new EventEmitter();
33080
33207
  this.onSelect = new EventEmitter();
33081
33208
  this.onUnSelect = new EventEmitter();
33082
33209
  this.onChanged = new EventEmitter();
@@ -33132,6 +33259,7 @@ class EntityPickerComponent extends DataListBase {
33132
33259
  });
33133
33260
  this.advanceData.fields = this.getFields();
33134
33261
  super.ngOnInit();
33262
+ this.onInit.emit(this);
33135
33263
  }
33136
33264
  selectEntity() {
33137
33265
  this.showDetailForm = true;
@@ -33301,6 +33429,7 @@ EntityPickerComponent.propDecorators = {
33301
33429
  disabled: [{ type: Input }],
33302
33430
  readOnly: [{ type: Input }],
33303
33431
  children: [{ type: Input }],
33432
+ onInit: [{ type: Output }],
33304
33433
  onSelect: [{ type: Output, args: ['onSelect',] }],
33305
33434
  onUnSelect: [{ type: Output, args: ['onUnSelect',] }],
33306
33435
  onChanged: [{ type: Output, args: ['onChanged',] }]
@@ -34361,6 +34490,7 @@ class ServiceFileUploadComponent extends ComponentBase {
34361
34490
  this.serviceCode = '';
34362
34491
  this.entity = '';
34363
34492
  this.chooseLabel = 'Chọn';
34493
+ this.onInit = new EventEmitter();
34364
34494
  this.onSelect = new EventEmitter();
34365
34495
  this.onRemove = new EventEmitter();
34366
34496
  this.onChanged = new EventEmitter();
@@ -34399,6 +34529,7 @@ class ServiceFileUploadComponent extends ComponentBase {
34399
34529
  ngOnInit() {
34400
34530
  this.setUp();
34401
34531
  this.subscribe();
34532
+ this.onInit.emit(this);
34402
34533
  }
34403
34534
  setUp() {
34404
34535
  this.accept = this.control.accept;
@@ -34760,6 +34891,7 @@ ServiceFileUploadComponent.propDecorators = {
34760
34891
  entity: [{ type: Input }],
34761
34892
  entityKey: [{ type: Input }],
34762
34893
  chooseLabel: [{ type: Input }],
34894
+ onInit: [{ type: Output }],
34763
34895
  onSelect: [{ type: Output }],
34764
34896
  onRemove: [{ type: Output }],
34765
34897
  onChanged: [{ type: Output }]
@@ -34912,6 +35044,7 @@ class FileManagerComponent extends DataListBase {
34912
35044
  this.inTaiLieuChung = false;
34913
35045
  this.copyToFolderId = this._commonService.guidEmpty();
34914
35046
  this.multipleCheckWhenClickRow = true;
35047
+ this.onInit = new EventEmitter();
34915
35048
  this.onReady = new EventEmitter();
34916
35049
  this.entityKeyChange = new EventEmitter();
34917
35050
  this.closePopup = new EventEmitter();
@@ -35002,6 +35135,7 @@ class FileManagerComponent extends DataListBase {
35002
35135
  }
35003
35136
  this.reloadData();
35004
35137
  this.checkAndLoadRootFolderContent();
35138
+ this.onInit.emit(this);
35005
35139
  }
35006
35140
  checkAndLoadRootFolderContent() {
35007
35141
  if (!this.inited || this.fileDataService)
@@ -36121,6 +36255,7 @@ FileManagerComponent.propDecorators = {
36121
36255
  copyToFolderId: [{ type: Input }],
36122
36256
  value: [{ type: Input }],
36123
36257
  multipleCheckWhenClickRow: [{ type: Input }],
36258
+ onInit: [{ type: Output }],
36124
36259
  onReady: [{ type: Output }],
36125
36260
  entityKeyChange: [{ type: Output }],
36126
36261
  closePopup: [{ type: Output }],
@@ -37098,6 +37233,7 @@ class MaskComponent {
37098
37233
  this.viewMode = false;
37099
37234
  this.inputStyleClass = '';
37100
37235
  this.autoFormat = true;
37236
+ this.onInit = new EventEmitter();
37101
37237
  this.onFocus = new EventEmitter();
37102
37238
  this.onBlur = new EventEmitter();
37103
37239
  this.onChanged = new EventEmitter();
@@ -37112,6 +37248,7 @@ class MaskComponent {
37112
37248
  if (!this.autoFormat) {
37113
37249
  this.thousandSeperator = '';
37114
37250
  }
37251
+ this.onInit.emit(this);
37115
37252
  }
37116
37253
  writeValue(obj) {
37117
37254
  if (obj) {
@@ -37210,6 +37347,7 @@ MaskComponent.propDecorators = {
37210
37347
  viewMode: [{ type: Input }],
37211
37348
  inputStyleClass: [{ type: Input }],
37212
37349
  autoFormat: [{ type: Input }],
37350
+ onInit: [{ type: Output }],
37213
37351
  onFocus: [{ type: Output }],
37214
37352
  onBlur: [{ type: Output }],
37215
37353
  onChanged: [{ type: Output }]
@@ -37272,6 +37410,7 @@ class NumberPickerRangeComponent {
37272
37410
  this.suffix = '';
37273
37411
  this.prefix = '';
37274
37412
  this.decimalPlaces = 2;
37413
+ this.onInit = new EventEmitter();
37275
37414
  this.focus = new EventEmitter();
37276
37415
  this.enterSmart = new EventEmitter();
37277
37416
  this.enter = new EventEmitter();
@@ -37279,9 +37418,10 @@ class NumberPickerRangeComponent {
37279
37418
  this.change = new EventEmitter();
37280
37419
  }
37281
37420
  ngOnInit() {
37421
+ this.onInit.emit(this);
37282
37422
  }
37283
37423
  clear() {
37284
- let re = (this.model[0] != null && this.model[0] !== '') || (this.model[1] != null && this.model[1] !== '');
37424
+ const re = (this.model[0] != null && this.model[0] !== '') || (this.model[1] != null && this.model[1] !== '');
37285
37425
  this.model = [null, null];
37286
37426
  this.onChange(this.model);
37287
37427
  return re;
@@ -37390,6 +37530,7 @@ NumberPickerRangeComponent.propDecorators = {
37390
37530
  min: [{ type: Input }],
37391
37531
  max: [{ type: Input }],
37392
37532
  decimalPlaces: [{ type: Input }],
37533
+ onInit: [{ type: Output }],
37393
37534
  focus: [{ type: Output }],
37394
37535
  enterSmart: [{ type: Output }],
37395
37536
  enter: [{ type: Output }],
@@ -37804,6 +37945,7 @@ class RadioButtonListComponent {
37804
37945
  constructor(_crudService, _deviceDetectorService) {
37805
37946
  this._crudService = _crudService;
37806
37947
  this._deviceDetectorService = _deviceDetectorService;
37948
+ this.onInit = new EventEmitter();
37807
37949
  this.valueChange = new EventEmitter();
37808
37950
  this.onChanged = new EventEmitter();
37809
37951
  this.onDataSourceLoaded = new EventEmitter();
@@ -37837,6 +37979,7 @@ class RadioButtonListComponent {
37837
37979
  if (!this._deviceDetectorService.isDesktop()) {
37838
37980
  this.hideTransitionOptions = this.showTransitionOptions = '';
37839
37981
  }
37982
+ this.onInit.emit(this);
37840
37983
  }
37841
37984
  setDefaultSetting() {
37842
37985
  if (this.control.returnType == 'value') {
@@ -38034,6 +38177,7 @@ RadioButtonListComponent.propDecorators = {
38034
38177
  dataSource: [{ type: Input }],
38035
38178
  value: [{ type: Input }],
38036
38179
  disabled: [{ type: Input }],
38180
+ onInit: [{ type: Output }],
38037
38181
  valueChange: [{ type: Output }],
38038
38182
  onChanged: [{ type: Output }],
38039
38183
  onDataSourceLoaded: [{ type: Output }],
@@ -38797,6 +38941,9 @@ class SplashComponentV1Component extends ComponentBase {
38797
38941
  }
38798
38942
  }
38799
38943
  });
38944
+ if (this.appSwitcherItems.length === 1) {
38945
+ this.switchApp(this.appSwitcherItems[0]);
38946
+ }
38800
38947
  }
38801
38948
  });
38802
38949
  }
@@ -38979,6 +39126,9 @@ class SplashComponentV2Component extends ComponentBase {
38979
39126
  }
38980
39127
  }
38981
39128
  });
39129
+ if (this.appSwitcherItems.length === 1) {
39130
+ this.switchApp(this.appSwitcherItems[0]);
39131
+ }
38982
39132
  }
38983
39133
  });
38984
39134
  }
@@ -39168,6 +39318,9 @@ class SplashComponentComponent extends ComponentBase {
39168
39318
  }
39169
39319
  }
39170
39320
  });
39321
+ if (this.appSwitcherItems.length === 1) {
39322
+ this.switchApp(this.appSwitcherItems[0]);
39323
+ }
39171
39324
  }
39172
39325
  });
39173
39326
  }
@@ -39340,32 +39493,32 @@ const DataSourceTargetType = [
39340
39493
  { id: ɵ4, ten: 'Đơn vị' },
39341
39494
  { id: ɵ5, ten: 'Nhóm người dùng' },
39342
39495
  ];
39343
- const ɵ6 = EnumUserRule.CAP_TREN, ɵ7 = EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH, ɵ8 = EnumUserRule.NGUOI_NHAN, ɵ9 = EnumUserRule.NGUOI_THEO_DOI, ɵ10 = EnumUserRule.NGUOI_THAO_TAC;
39496
+ const ɵ6 = EnumUserRule.CAP_TREN, ɵ7 = EnumUserRule.NGUOI_CUOI_CUNG, ɵ8 = EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH, ɵ9 = EnumUserRule.NGUOI_NHAN, ɵ10 = EnumUserRule.NGUOI_THEO_DOI, ɵ11 = EnumUserRule.NGUOI_THAO_TAC;
39344
39497
  const DataSourceUserRule = [
39345
39498
  // { id: EnumUserRule.NGUOI_TAO, ten: 'Người tạo' },
39346
39499
  { id: ɵ6, ten: 'Cấp trên' },
39347
39500
  // { id: EnumUserRule.CAP_TREN, ten: 'Cấp dưới' },
39348
39501
  // { id: EnumUserRule.CAP_TREN_DA_GUI, ten: 'Cấp trên đã trình' },
39349
- // { id: EnumUserRule.NGUOI_CUOI_CUNG, ten: 'Người cuối cùng' },
39350
- { id: ɵ7, ten: 'Người tham gia quy trình' },
39502
+ { id: ɵ7, ten: 'Người cuối cùng' },
39503
+ { id: ɵ8, ten: 'Người tham gia quy trình' },
39351
39504
  // { id: EnumUserRule.NGUOI_DA_NHAN, ten: 'Người đã nhận', tooltip: 'Người đã từng nhận' },
39352
- { id: ɵ8, ten: 'Người nhận' },
39353
- { id: ɵ9, ten: 'Người theo dõi' },
39354
- { id: ɵ10, ten: 'Người thực hiện thao tác' }
39505
+ { id: ɵ9, ten: 'Người nhận' },
39506
+ { id: ɵ10, ten: 'Người theo dõi' },
39507
+ { id: ɵ11, ten: 'Người thực hiện thao tác' }
39355
39508
  ];
39356
- const ɵ11 = EnumUserRule.CAP_TREN, ɵ12 = EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH;
39509
+ const ɵ12 = EnumUserRule.CAP_TREN, ɵ13 = EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH;
39357
39510
  const DataSourceUserSender = [
39358
39511
  // { id: EnumUserRule.NGUOI_TAO, ten: 'Người tạo' },
39359
- { id: ɵ11, ten: 'Cấp trên' },
39512
+ { id: ɵ12, ten: 'Cấp trên' },
39360
39513
  // { id: EnumUserRule.CAP_TREN_DA_GUI, ten: 'Cấp trên đã trình' },
39361
39514
  // { id: EnumUserRule.NGUOI_CUOI_CUNG, ten: 'Người cuối cùng' },
39362
- { id: ɵ12, ten: 'Người tham gia quy trình' }
39515
+ { id: ɵ13, ten: 'Người tham gia quy trình' }
39363
39516
  ];
39364
- const ɵ13 = EnumWorkflowCheckboxOption.TAO_CONG_VIEC, ɵ14 = EnumWorkflowCheckboxOption.AUTO_START_TASK;
39517
+ const ɵ14 = EnumWorkflowCheckboxOption.TAO_CONG_VIEC, ɵ15 = EnumWorkflowCheckboxOption.AUTO_START_TASK;
39365
39518
  const DataSourceWorkflowCheckboxOption = [
39366
- { id: ɵ13, ten: 'Tạo công việc' },
39519
+ { id: ɵ14, ten: 'Tạo công việc' },
39367
39520
  // { id: EnumWorkflowCheckboxOption.AUTO_NEXT_STEP, ten: 'Tự động chuyển bước đầu tiên' },
39368
- { id: ɵ14, ten: 'Bắt đầu nhanh công việc' }
39521
+ { id: ɵ15, ten: 'Bắt đầu nhanh công việc' }
39369
39522
  ];
39370
39523
 
39371
39524
  function createJsPlumnInstance(containerId, options = null) {
@@ -42437,6 +42590,7 @@ class TnColorPickerComponent extends ComponentBase {
42437
42590
  super(injector);
42438
42591
  this.disabled = false;
42439
42592
  this.appendTo = 'body';
42593
+ this.onInit = new EventEmitter();
42440
42594
  this.change = new EventEmitter();
42441
42595
  }
42442
42596
  writeValue(obj) {
@@ -42458,7 +42612,7 @@ class TnColorPickerComponent extends ComponentBase {
42458
42612
  this.disabled = isDisabled;
42459
42613
  }
42460
42614
  ngOnInit() {
42461
- // this.model.value = '#ffffff';
42615
+ this.onInit.emit(this);
42462
42616
  }
42463
42617
  changePicker(evt) {
42464
42618
  this.model.inputValue = this.model.value;
@@ -42492,6 +42646,7 @@ TnColorPickerComponent.ctorParameters = () => [
42492
42646
  TnColorPickerComponent.propDecorators = {
42493
42647
  disabled: [{ type: Input }],
42494
42648
  appendTo: [{ type: Input }],
42649
+ onInit: [{ type: Output }],
42495
42650
  change: [{ type: Output }]
42496
42651
  };
42497
42652
 
@@ -42643,7 +42798,7 @@ class TnDialogComponent {
42643
42798
  TnDialogComponent.decorators = [
42644
42799
  { type: Component, args: [{
42645
42800
  selector: 'tn-dialog',
42646
- template: "<p-dialog #dialog [closeOnEscape]=\"closeOnEscape\" [appendTo]=\"'body'\" [focusOnShow]=\"false\" [focusTrap]=\"false\"\r\n [header]=\"header | translate\" [(visible)]=\"visible\" [modal]=\"modal\" [responsive]=\"true\" [maximizable]=\"maximizable\"\r\n [autoZIndex]=\"true\" [styleClass]=\"styleClass\" [maskStyleClass]=\"maskClass\"\r\n [style]=\"{'width': popupSize.width + 'px', 'min-width': popupSize.width + 'px', 'height': popupSize.height + 'px', 'min-height': popupSize.height + 'px'}\"\r\n (onShow)=\"handleShowDialog($event)\" (onHide)=\"handleHideDialog($event)\">\r\n <tn-custom-scrollbar #scrollbar [useDefaultScrollBar]=\"useDefaultScrollBar\" [class]=\"scrollBarStyleClass\"\r\n [config]=\"scrollConfig\" [style]=\"scrollStyle\" class=\"tn-dialog-scrollbar\">\r\n <ng-content></ng-content>\r\n </tn-custom-scrollbar>\r\n <p-footer *ngIf=\"showFooter\">\r\n <p-footer *ngIf=\"formBase && formBase.buttonTemplate\">\r\n <ng-container *ngTemplateOutlet=\"formBase.buttonTemplate\">\r\n </ng-container>\r\n </p-footer>\r\n <p-footer *ngIf=\"footer\">\r\n <ng-container *ngTemplateOutlet=\"footer\"></ng-container>\r\n </p-footer>\r\n <p-footer *ngIf=\"!footer\">\r\n <button pButton preventTab type=\"button\" icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" (click)=\"handleHideDialog($event)\"></button>\r\n </p-footer>\r\n </p-footer>\r\n</p-dialog>",
42801
+ template: "<p-dialog #dialog [closeOnEscape]=\"closeOnEscape\" [appendTo]=\"'body'\" [focusOnShow]=\"false\" [focusTrap]=\"false\"\r\n [header]=\"header | translate\" [(visible)]=\"visible\" [modal]=\"modal\" [responsive]=\"true\" [maximizable]=\"maximizable\"\r\n [autoZIndex]=\"true\" [styleClass]=\"styleClass\" [maskStyleClass]=\"maskClass\"\r\n [style]=\"{'width': popupSize.width + 'px', 'min-width': popupSize.width + 'px', 'height': popupSize.height + 'px', 'min-height': popupSize.height + 'px'}\"\r\n (onShow)=\"handleShowDialog($event)\" (onHide)=\"handleHideDialog($event)\">\r\n <tn-custom-scrollbar #scrollbar [useDefaultScrollBar]=\"useDefaultScrollBar\" [class]=\"scrollBarStyleClass\"\r\n [config]=\"scrollConfig\" [style]=\"scrollStyle\" class=\"tn-dialog-scrollbar\">\r\n <ng-content></ng-content>\r\n </tn-custom-scrollbar>\r\n <p-footer *ngIf=\"showFooter\">\r\n <p-footer *ngIf=\"formBase && formBase.buttonTemplate\">\r\n <ng-container *ngTemplateOutlet=\"formBase.buttonTemplate\">\r\n </ng-container>\r\n </p-footer>\r\n <ng-container *ngIf=\"!formBase || !formBase.buttonTemplate\">\r\n <p-footer *ngIf=\"footer\">\r\n <ng-container *ngTemplateOutlet=\"footer\"></ng-container>\r\n </p-footer>\r\n <p-footer *ngIf=\"!footer\">\r\n <button pButton preventTab type=\"button\" icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'FORM.CANCEL' | translate\" (click)=\"handleHideDialog($event)\"></button>\r\n </p-footer>\r\n </ng-container>\r\n </p-footer>\r\n</p-dialog>",
42647
42802
  styles: [""]
42648
42803
  },] }
42649
42804
  ];
@@ -42683,21 +42838,34 @@ class TnTabViewComponent {
42683
42838
  constructor(_commonService) {
42684
42839
  this._commonService = _commonService;
42685
42840
  this.data = [];
42841
+ this._hiddenTab = [];
42842
+ this.hiddenInfo = {};
42686
42843
  this.allowViewAll = false;
42687
42844
  this.isDynamicHeight = false;
42688
- this.useScrollbar = false;
42689
42845
  this.onTabChange = new EventEmitter();
42690
42846
  this.activeIndexChange = new EventEmitter();
42691
42847
  this.template = {};
42692
42848
  this.onlyIcon = false;
42693
42849
  this.styleClass = 'tn-tabview-beauty';
42694
42850
  this.height = '100%';
42851
+ this.ready = false;
42695
42852
  }
42696
42853
  set vertical(value) {
42697
42854
  this._vertical = value;
42698
42855
  this.setStyleClass();
42699
42856
  }
42700
42857
  ;
42858
+ set hiddenTab(value) {
42859
+ if (value) {
42860
+ this._hiddenTab = value;
42861
+ }
42862
+ else {
42863
+ this._hiddenTab = [];
42864
+ }
42865
+ if (this.ready) {
42866
+ this.setHiddenInfo();
42867
+ }
42868
+ }
42701
42869
  set activeIndex(value) {
42702
42870
  this.currentTabIndex = value;
42703
42871
  }
@@ -42713,6 +42881,8 @@ class TnTabViewComponent {
42713
42881
  }
42714
42882
  this.currentTabIndex = currentTabIndex;
42715
42883
  }
42884
+ this.ready = true;
42885
+ this.setHiddenInfo();
42716
42886
  }
42717
42887
  ngAfterContentInit() {
42718
42888
  this.onlyIcon = true;
@@ -42724,6 +42894,12 @@ class TnTabViewComponent {
42724
42894
  });
42725
42895
  this.setStyleClass();
42726
42896
  }
42897
+ setHiddenInfo() {
42898
+ this.hiddenInfo = {};
42899
+ this._hiddenTab.forEach(tabCode => {
42900
+ this.hiddenInfo[tabCode] = true;
42901
+ });
42902
+ }
42727
42903
  setStyleClass() {
42728
42904
  let result = 'tn-tabview-beauty';
42729
42905
  if (this._vertical) {
@@ -42737,13 +42913,19 @@ class TnTabViewComponent {
42737
42913
  handleTabChange(evt) {
42738
42914
  this.currentTabIndex = evt.index;
42739
42915
  this.activeIndexChange.emit(this.currentTabIndex);
42740
- this.onTabChange.emit(evt);
42916
+ }
42917
+ handleTabLoaded(item) {
42918
+ this.currentTabCode = item.code;
42919
+ this.onTabChange.emit({
42920
+ index: this.currentTabIndex,
42921
+ code: this.currentTabCode
42922
+ });
42741
42923
  }
42742
42924
  }
42743
42925
  TnTabViewComponent.decorators = [
42744
42926
  { type: Component, args: [{
42745
42927
  selector: 'tn-tabview',
42746
- 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 <tn-custom-scrollbar *ngIf=\"useScrollbar\">\r\n <ng-container *ngTemplateOutlet=\"template[item.code]; context: {$implicit: item}\">\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <ng-container *ngIf=\"!useScrollbar\">\r\n <ng-container *ngTemplateOutlet=\"template[item.code]; context: {$implicit: item}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </p-tabPanel>\r\n </ng-container>\r\n </p-tabView>\r\n</div>",
42928
+ 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 && !hiddenInfo[item.code]\" [leftIcon]=\"item.icon\" [header]=\"item.label\"\r\n [headerStyleClass]=\"item.headerStyleClass\">\r\n <ng-container *ngIf=\"allowViewAll || item.alwayRender || currentTabIndex == i\">\r\n <tn-custom-scrollbar *ngIf=\"item.useScrollbar\">\r\n <ng-container *ngTemplateOutlet=\"template[item.code]; context: {$implicit: item}\">\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <ng-container *ngIf=\"!item.useScrollbar\">\r\n <ng-container *ngTemplateOutlet=\"template[item.code]; context: {$implicit: item}\">\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked (loaded)=\"handleTabLoaded(item)\"></after-view-checked>\r\n </ng-container>\r\n </p-tabPanel>\r\n </ng-container>\r\n </p-tabView>\r\n</div>",
42747
42929
  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}}"]
42748
42930
  },] }
42749
42931
  ];
@@ -42754,10 +42936,10 @@ TnTabViewComponent.propDecorators = {
42754
42936
  children: [{ type: ContentChildren, args: [TemplateRef,] }],
42755
42937
  vertical: [{ type: Input }],
42756
42938
  data: [{ type: Input }],
42939
+ hiddenTab: [{ type: Input }],
42757
42940
  allowViewAll: [{ type: Input }],
42758
42941
  activeIndex: [{ type: Input }],
42759
42942
  isDynamicHeight: [{ type: Input }],
42760
- useScrollbar: [{ type: Input }],
42761
42943
  onTabChange: [{ type: Output }],
42762
42944
  activeIndexChange: [{ type: Output }]
42763
42945
  };
@@ -42797,6 +42979,7 @@ class TnTinymceComponent extends ComponentBase {
42797
42979
  this.required = false;
42798
42980
  this.height = 200;
42799
42981
  this.field = '';
42982
+ this.onInit = new EventEmitter();
42800
42983
  this.keydown = new EventEmitter();
42801
42984
  this.onBlur = new EventEmitter();
42802
42985
  this.onChanged = new EventEmitter();
@@ -42824,6 +43007,7 @@ class TnTinymceComponent extends ComponentBase {
42824
43007
  }
42825
43008
  ngOnInit() {
42826
43009
  this.subscribeContentInsert();
43010
+ this.onInit.emit(this);
42827
43011
  }
42828
43012
  ngAfterViewInit() {
42829
43013
  let mode = this.mode;
@@ -43174,6 +43358,7 @@ TnTinymceComponent.propDecorators = {
43174
43358
  height: [{ type: Input }],
43175
43359
  field: [{ type: Input }],
43176
43360
  languageCode: [{ type: Input }],
43361
+ onInit: [{ type: Output }],
43177
43362
  keydown: [{ type: Output }],
43178
43363
  onBlur: [{ type: Output }],
43179
43364
  onChanged: [{ type: Output }]
@@ -43504,6 +43689,7 @@ class UserPickerComponent extends ComponentBase {
43504
43689
  });
43505
43690
  this.multiple = false;
43506
43691
  this.disabled = false;
43692
+ this.onInit = new EventEmitter();
43507
43693
  this.onSelect = new EventEmitter();
43508
43694
  this.onUnSelect = new EventEmitter();
43509
43695
  this.onChanged = new EventEmitter();
@@ -43609,6 +43795,7 @@ class UserPickerComponent extends ComponentBase {
43609
43795
  this.createSchemaSearch();
43610
43796
  this.updateFuncCheckReadOnlyItem();
43611
43797
  this.onReady.emit();
43798
+ this.onInit.emit(this);
43612
43799
  }
43613
43800
  updateFuncCheckReadOnlyItem() {
43614
43801
  if (this.readOnlyValues && this.readOnlyValues.length) {
@@ -44040,6 +44227,7 @@ UserPickerComponent.propDecorators = {
44040
44227
  multiple: [{ type: Input }],
44041
44228
  disabled: [{ type: Input }],
44042
44229
  readOnlyValues: [{ type: Input }],
44230
+ onInit: [{ type: Output }],
44043
44231
  onSelect: [{ type: Output, args: ['onSelect',] }],
44044
44232
  onUnSelect: [{ type: Output, args: ['onUnSelect',] }],
44045
44233
  onChanged: [{ type: Output, args: ['onChanged',] }],
@@ -44517,6 +44705,7 @@ class VanBanPickerComponent extends DataListBase {
44517
44705
  super(_injector);
44518
44706
  this._vanBanDenService = _vanBanDenService;
44519
44707
  this._vanBanDiService = _vanBanDiService;
44708
+ this.onInit = new EventEmitter();
44520
44709
  this.onChanged = new EventEmitter();
44521
44710
  this.onReady = new EventEmitter();
44522
44711
  this.environment = {};
@@ -44562,6 +44751,7 @@ class VanBanPickerComponent extends DataListBase {
44562
44751
  this.setting.fieldSearchText = ['code', 'name'];
44563
44752
  this.setting.objectName = ' văn bản';
44564
44753
  super.ngOnInit();
44754
+ this.onInit.emit(this);
44565
44755
  }
44566
44756
  getVanBanDen(originGridInfo) {
44567
44757
  const gridInfo = new GridInfo(Object.assign(Object.assign({}, originGridInfo), { filters: [...originGridInfo.filters.map(q => (Object.assign({}, q)))] }));
@@ -44781,6 +44971,7 @@ VanBanPickerComponent.propDecorators = {
44781
44971
  loaiVanBan: [{ type: Input }],
44782
44972
  readOnly: [{ type: Input }],
44783
44973
  control: [{ type: Input }],
44974
+ onInit: [{ type: Output }],
44784
44975
  onChanged: [{ type: Output }],
44785
44976
  onReady: [{ type: Output }]
44786
44977
  };
@@ -50246,6 +50437,7 @@ UsersFormatPipe.ctorParameters = () => [
50246
50437
  class ReferenceTextBoxComponent extends ComponentBase {
50247
50438
  constructor(injector) {
50248
50439
  super(injector);
50440
+ this.onInit = new EventEmitter();
50249
50441
  this.data = '';
50250
50442
  this.ready = false;
50251
50443
  }
@@ -50260,6 +50452,7 @@ class ReferenceTextBoxComponent extends ComponentBase {
50260
50452
  this.control._component = this;
50261
50453
  this.ready = true;
50262
50454
  this.checkAndGetData();
50455
+ this.onInit.emit(this);
50263
50456
  }
50264
50457
  checkAndGetData() {
50265
50458
  return __awaiter(this, void 0, void 0, function* () {
@@ -50302,7 +50495,8 @@ ReferenceTextBoxComponent.ctorParameters = () => [
50302
50495
  ];
50303
50496
  ReferenceTextBoxComponent.propDecorators = {
50304
50497
  control: [{ type: Input }],
50305
- value: [{ type: Input }]
50498
+ value: [{ type: Input }],
50499
+ onInit: [{ type: Output }]
50306
50500
  };
50307
50501
 
50308
50502
  class LoadingPageV1Component {
@@ -52383,5 +52577,5 @@ DynamicComponentService.ctorParameters = () => [
52383
52577
  * Generated bundle index. Do not edit.
52384
52578
  */
52385
52579
 
52386
- export { AccessDeniedComponent, Action, ActionChoYKienBase, ActionThuHoiBase, ActionUpdateModel, AddressControlSchema, AddressService, AdvanceSearchData, AdvanceSearchSetting, AppComponentBase, AppListService, ApplicationContextService, ApprovalPipe, ArrayPair, AtLeastOneRowTableValidator, AuthenService, AuthorizeDirective, AutoCompleteControlSchema, AutoCompletePickerControlSchema, AutocompleteDatasourceComponent, AvatarUploaderComponent, BaseCauHinhWorkflowComponent, BaseCongViecComponent, BaseCongViecFormComponent, BaseDmLinhVucCongViecComponent, BaseDmLoaiCongViecComponent, BaseDmPriorityComponent, BaseMenuService, BaseModule, BaseService, BooleanFormatPipe, ButtonControlSchema, ButtonPermission, ButtonPermissions, ButtonTextActionCongViec, CONFIG_CALENDAR_VIETNAMESE, CalculationEngineService, CanBoHoSoService, CauHinhWorkflowService, CellExcel, ChatBoxComponent, ChatSendMessageBoxComponent, CheckBoxListControlSchema, CheckControlVisibleService, CheckDuplicateFieldsValidator, CheckDuplicateValidator, CheckboxControlSchema, ClientV5Service, CoCauToChucControlSchema, CoCauToChucPickerComponent, CoCauToChucPickerControlSchema, CoCauToChucService, ColorBlack, ColorControlSchema, ColorPickerControlSchema, ColorWhite, Column, ColumnSchemaBase, ColumnSetting, ColumnSettingDetail, ComCtxConstants, CommandType, CommonAppComponentComponent, CommonDashboardComponent, CommonErrorCode, CommonService, CompareValidator, ComponentBase, ComponentConstants, ComponentContextService, ConditionalBuilderService, CongViecLienQuanService, CongViecNextFirstStepComponent, CongViecPickerControlSchema, CongViecService, ContainerSchema, ControlTreeNode, ControlType, ConvertMoneyToWordPipe, CoreConfigService, CrudBase, CrudFormComponent, CrudFormCustomFunction, CrudFormData, CrudFormSetting, CrudListComponent, CrudListConfig, CrudListCustomFunction, CrudListData, CrudListHelper, CrudListSetting, CrudService, CustomControlSchema, CustomRouterService, CustomizeUiModel, CustomizeUiService, DanhmucApiService, DataExcel, DataFormBase, DataListBase, DataSourceControlSchema, DataSourcePermissionBase, DataSourceStateType, DataSourceTargetType, DataSourceUserRule, DataSourceUserSender, DataSourceWorkflowCheckboxOption, DataSourceWorkflowCoreStatus, DataType, DateCompareValidator, DateTimeControlSchema, DateTimeRangeControlSchema, DbOrganizationOrganizationService, DbOrganizationPositionService, Deadline, DeadlineType, DhvinhGuardService, DialogModel, DmLinhVucCongViecService, DmLoaiCongViecService, DmPriorityService, DomService, DownloadLinkService, DropdownComponent, DropdownControlSchema, DropdownOptions, DummyWorkflowCode, DynamicComponentService, ENUM_DON_VI_HANH_CHINH, EXPLORER_TYPES, EXPORT_VERSION_V4, EXPORT_VERSION_V5, EditFileCommand, EditorControlSchema, EformService, EmailValidator, EntityMedataDataSetting, EntityMetadataService, EntityPickerColumn, EntityPickerControlSchema, EntityWorkflowType, EnumActionType, EnumControlPickerType, EnumFileLayout, EnumGetRefType, EnumLoaiDanhSachCongViec, EnumLoaiVanBanBase, EnumPermissionType, EnumProcessWorkflowType, EnumStateByMenuCongViec, EnumStateType, EnumTargetType, EnumTypeSplash, EnumUserRule, EnumWFNhomTrangThai, EnumWorkflowCheckboxOption, EnumWorkflowCoreCodeSettingKey, EnumWorkflowHistoryStatus, ErrorType, EventData, ExactOneValueInTableValidator, ExportAllMode, ExportItem, ExportItemType, ExportItemsMode, ExportManyModel, ExportManyResultModel, ExportModel, ExportService, ExportWithoutTemplateModel, Extension, FILE_TYPES, FieldDefineHasTask, FieldDefineIsTaskFormControl, FieldDefineIsWorkflowControl, FieldOrderCrudList, FieldRowSpan, FieldWorkflowCodeInCrudForm, FileDataService, FileExplorerService, FileManagerComponent, FileManagerControlSchema, FileManagerMode, FileManagerSetting, FileObjectService, FilePickerDialogComponent, FileUploadComponent, FileUploadControlSchema, FileUploadMode, FileUploadSetting, FileV4Service, Filter, FolderService, FormControlBase, FormControlBaseWithService, FormSchemaBase, FormSchemaBaseWithService, FormState, Gender, GenerateLinkDownloadDTO, GenericGuardService, GetRefDataSchema, GlobalService, GmailCorrector, GridInfo, GuardService, GuardSvService, HeightType, HighPerformanceService, HighlightPipe, HtmlFormatPipe, HttpOptions, ImageService, Include, JsPlumbOption, KeyFieldGetRefType, KeyFilterStateByMenuCongViec, KeyFlashShow, KeyFunctionReload, KeyValueComponent, KeyValueControlSchema, LabelSchema, LabelWFNhomTrangThai, LabelWorkflowCoreStatus, LengthValidator, ListHelperService, LoaiPhieuDeXuat, LocalCacheService, LowerCorrector, MA_THONG_BAO_PHAN_HE, MaActionBatDauQuyTrinh, ManagerType, MaskControlSchema, MasterDataItem, MasterDataPipe, MasterDataService, MenuService, MethodResult, ModelKySoDonVi, ModelSchema, ModuleConfigService, MultiTranslateHttpLoader, MultipleReferenceDataFormatPipe, NodeService, NotificationObjectType, NotificationService, NotifierService, NotifierType, NumberCompareValidator, NumberOnlyValidator, NumberRangeControlSchema, Operator, OrganizationFormatPipe, OrganizationNameFormatPipe, OrganizationPickerControlSchema, OrganizationService, OrganizationsFormatPipe, PageInfo, PageSetting, Pair, Pattern, PercentControlSchema, PermissionBase, PermissionConstant, PermissionService, PermissionStorage, PermissionTypes, PermissionUtilsComponent, PersonalSetting, PhanQuyenModel, PhoneNumberValidator, PhoneValidator, PopupSize, PositionService, PrintService, PublicFunction, QueryBuilderComponent, QueryBuilderGroupComponent, QueryBuilderRuleComponent, QueryGroup, QueryRule, RELOAD_FILE_LIST, RadioButtonListControlSchema, RandomDataService, RefField, ReferenceDataFormatPipe, ReferenceTextControlSchema, RegexSplitFieldByItem, RequiredFieldsValidator, RequiredValidator, RowColorOption, RowExcel, SHARE_COMPONENT_ID, SHARE_EVENT, SafeHtmlPipe, SafeStylePipe, SafeUrlPipe, SameValueValidator, SchemaBase, SecurePipe, ServiceFileUploadComponent, SessionTypes, SharedFolderType, SignalRService, SimpleDicItem, SimpleDictionary, Sort, SortDirs, SpanControlSchema, SplashComponentComponent, StartupBusinessComponentBase, StateComponent, StateMachineTopic, StateMachinesConnectionMetadataComponent, StateMachinesDesignerComponent, StateMachinesService, StateMetadataComponent, Status, StatusAction, StatusGroup, StatusOption, StatusOrg, StatusUser, StorageService, StorageUpdatedService, StringCompareOption, StringFormatPipe, SummaryPipe, SwitchControlSchema, TBL_DM_COSODAOTAO_CONSTS, TBL_DM_PHONGHOC_CONSTS, TBL_KTX_NGUOITHUE_HOSO, TBL_TS_PHIEUDEXUAT, TBL_TS_TAISANCODINH_CONSTS, TabViewData, TableSchema, TagSeparator, TaiLieuComponent, TemplateConstant, TemplateControlSchema, TemplateInstanceService, TemplateService, TemplateTextItem, TemplateTextMany, TemplateTextV4Service, TemplateType, TemplateV4Service, TenContainer, TextAlign, TextAreaControlSchema, TextControlSchema, TextControlSchemaWithService, TitleSchema, TnClientCommand, TnClientService, TnComponentConfig, TnCustomScrollbarComponent, TnDatePipe, TnMenuItem, TnReorderableColumnDirective, TnReorderableRowDirective, TnSortIcon, TnSortableColumnDirective, TnTreeTableToggler, TnUser, TnxSharedModule, TopicReloadCongViecV5, TopicReloadCountCongViecV5, TopicReloadNotification, TrangThaiMasterData, TrangThais, TreeDataOption, TreeListBase, TrimCorrector, TrimEndCorrector, TrimStartCorrector, TypeDanhMucAPI, UniqueFieldInTableValidator, UniqueNumberService, UpperCorrector, UserFormatPipe, UserGroupRealService, UserGroupService, UserPickerControlSchema, UserPickerDialogComponent, UserService, UserType, UserV5Service, UsersFormatPipe, Validation, VanBanPickerControlSchema, VirtualBaseService, WorkflowConfigAdvance, WorkflowCoreStatusEnum, WorkflowFieldStateCode, WorkflowHistoryService, WorkflowPermissionDetailService, WorkflowPickerComponent, WorkflowService, WorkflowSetting, WorkflowSettingNew, WorkflowSettingsService, WrapPickerControlSchema, addDay, addZero, appendDefaultFilter, clearAll, clone, cloneOld, coreDeclaration, coreModuleImport, coreProvider, createJsPlumnInstance, createOrgPickerControl, createRolePickerControl, createUserGroupPickerControl, createUserPickerControl, dataSourceIcon$1 as dataSourceIcon, dateDiff, genQueryFromFilters, getDateFromStringDateVN, getDayOfWeek, getEnvironmentByName, getEnvironmentData, getListMenuByName, getMenuData, getMonday, getStringDate, getStringDateTime, getStringDateVN, getStringDateVNLocal, getTimeSpan, isArray, isBoolean, isDate, isFunction, isLiteralObject, isNumber, isObjectOld, isRegular, isSimpleType, isString, isValidDate, isValidTime, keyUserSurveyLocal, maximumPageSize, mergeJSON, mergeJSONOld, moduleConfigFunc, monthDiff, multipleSort, romanize, setMetadataConnection, setMetadataState, translateStateMachine, ɵ0, ɵ1, ɵ10, ɵ11, ɵ12, ɵ13, ɵ14, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9, AddressComponent as ɵa, DropdownService as ɵb, BaseDmLinhVucCongViecFormComponent as ɵba, BaseDmPriorityFormComponent as ɵbb, BaseCongviecDinhkemComponent as ɵbc, BaseCongviecDinhkemFormComponent as ɵbd, DatetimePickerComponent as ɵbe, DatetimePickerRangeComponent as ɵbf, DynamicNodeComponent as ɵbg, EntityPickerBoxComponent as ɵbh, EntityPickerDataComponent as ɵbi, EntityPickerSelectedComponent as ɵbj, EntityPickerComponent as ɵbk, EntityPickerDialogComponent as ɵbl, EntityPermissionComponent as ɵbm, DM_ChucVuService as ɵbn, RoleService as ɵbo, EntityPermissionService as ɵbp, EquationEditorComponent as ɵbq, MaskComponent as ɵbr, NumberPickerRangeComponent as ɵbs, PagingNextBackOnlyComponent as ɵbt, RadioButtonListComponent as ɵbu, VanBanPickerComponent as ɵbv, VanBanDenService as ɵbw, VanBanDiService as ɵbx, VanBanPickerDialogComponent as ɵby, VanbanDiPickerComponent as ɵbz, EntityPickerService as ɵc, VanbanDenPickerComponent as ɵca, CongViecPickerComponent as ɵcb, SettingsComponent as ɵcc, SettingsRowComponent as ɵcd, SettingsWorkflowComponent as ɵce, SettingsWorkflowNo1Component as ɵcf, SimpleWorkflowFormComponent as ɵcg, ProcessWorkflowTargetComponent as ɵch, DmChucVuService as ɵci, ChoYKienFormComponent as ɵcj, SplashComponentV1Component as ɵck, SplashComponentV2Component as ɵcl, StateMachinesConnectionReceiverComponent as ɵcm, StateMachinesConnectionReceiverConditionComponent as ɵcn, StateMachinesConnectionReceiverDepartmentComponent as ɵco, StateMachinesConnectionReceiverGroupComponent as ɵcp, StateMachinesConnectionReceiverUserComponent as ɵcq, StateMachinesConnectionReceiverRoleComponent as ɵcr, StateMachinesConnectionSenderComponent as ɵcs, StartWorkflowComponent as ɵct, ShareLinkByPermissionComponent as ɵcu, WorkflowSettingNewComponent as ɵcv, PermissionSharingComponent as ɵcw, WorkflowPermissionService as ɵcx, TnCheckboxComponent as ɵcy, TnDialogComponent as ɵcz, ExceptionHandlerService as ɵd, TnColorPickerComponent as ɵda, TnTinymceComponent as ɵdb, TnTabViewComponent as ɵdc, TableDetailFormComponent as ɵdd, FileIconPipe as ɵde, FileSizePipe as ɵdf, QuickAddFormComponent as ɵdg, PreventShiftTabDirective as ɵdh, TnTemplateDirective as ɵdi, UserPickerComponent as ɵdj, UserPickerBoxComponent as ɵdk, CoCauToChucTestService as ɵdl, TnAppHelpComponent as ɵdm, PathNameService as ɵdn, HelperCurrentPageComponent as ɵdo, TnAppNotificationListComponent as ɵdp, TnAppNotificationComponent as ɵdq, MyDriveService as ɵdr, FileVersionService as ɵds, FileExplorerNewService as ɵdt, FileManagerService as ɵdu, FolderFormComponent as ɵdv, FileFormComponent as ɵdw, FileViewerComponent as ɵdx, FileVersionListComponent as ɵdy, WorkflowHistoryComponent as ɵdz, CanBo_HoSoService as ɵe, EntityWorkflowHistoryService as ɵea, WorkflowHistoryDialogComponent as ɵeb, WorkflowHistoryNewComponent as ɵec, WorkflowSettingComponent as ɵed, EntityWorkflowSettingService as ɵee, WorkflowSettingDialogComponent as ɵef, WorkflowPermissionComponent as ɵeg, WorkflowPermissionFormComponent as ɵeh, ReferenceTextBoxComponent as ɵei, QrCodeGeneratorComponent as ɵej, AccessDeniedV1Component as ɵek, AddNewsComponent as ɵel, ArticleService as ɵem, NewsCategoryService as ɵen, NotFoundComponent as ɵeo, UniversalLinkProcessorComponent as ɵep, SignatureDetailComponent as ɵeq, ChatService as ɵer, ContentsService as ɵes, StatusExtendsService as ɵet, MessageBoardService as ɵeu, KySoSimDanhSachChuKyComponent as ɵev, KySoSimChuKyUserService as ɵew, FileKySoSimComponent as ɵex, KySoSimSignPDFService as ɵey, TaiLieuCuaToiComponent as ɵez, AfterViewCheckedComponent as ɵf, KhaiThacTaiLieuDungChungComponent as ɵfa, DanhMucDungChungService as ɵfb, TnTemplateComponent as ɵfc, LoadingPageV1Component as ɵfd, CheckReadyComponent as ɵfe, SendAccessTokenInterceptor as ɵff, LogInterceptor as ɵfg, PermissionUtilsInterceptor as ɵfh, TraceInterceptor as ɵfi, AdvanceSearchComponent as ɵg, AppRootMenuComponent as ɵh, AppTopBarComponent as ɵi, AppTopBarV1Component as ɵj, AppTopBarV2Component as ɵk, AppProfileComponent as ɵl, AppSubMenuComponent as ɵm, AppMenuComponent as ɵn, AutoCompletePickerComponent as ɵo, CheckBoxListComponent as ɵp, ReportQueueComponent as ɵq, CoCauToChucPickerListComponent as ɵr, TreeTableComponent as ɵs, BaseCongViecTestComponent as ɵt, ListBase as ɵu, CongViecDinhKemService as ɵv, CongViecThayDoiService as ɵw, ProcessWorkflowFormComponent as ɵx, BaseCauHinhWorkflowDetailComponent as ɵy, BaseDmLoaiCongViecFormComponent as ɵz };
52580
+ export { AccessDeniedComponent, Action, ActionChoYKienBase, ActionThuHoiBase, ActionUpdateModel, AddressControlSchema, AddressService, AdvanceSearchData, AdvanceSearchSetting, AppComponentBase, AppListService, ApplicationContextService, ApprovalPipe, ArrayPair, AtLeastOneRowTableValidator, AuthenService, AuthorizeDirective, AutoCompleteControlSchema, AutoCompletePickerControlSchema, AutocompleteDatasourceComponent, AvatarUploaderComponent, BaseCauHinhWorkflowComponent, BaseCongViecComponent, BaseCongViecFormComponent, BaseDmLinhVucCongViecComponent, BaseDmLoaiCongViecComponent, BaseDmPriorityComponent, BaseMenuService, BaseModule, BaseService, BooleanFormatPipe, ButtonControlSchema, ButtonPermission, ButtonPermissions, ButtonTextActionCongViec, CONFIG_CALENDAR_VIETNAMESE, CalculationEngineService, CanBoHoSoService, CauHinhWorkflowService, CellExcel, ChatBoxComponent, ChatSendMessageBoxComponent, CheckBoxListControlSchema, CheckControlVisibleService, CheckDuplicateFieldsValidator, CheckDuplicateValidator, CheckboxControlSchema, ClientV5Service, CoCauToChucControlSchema, CoCauToChucPickerComponent, CoCauToChucPickerControlSchema, CoCauToChucService, ColorBlack, ColorControlSchema, ColorPickerControlSchema, ColorWhite, Column, ColumnSchemaBase, ColumnSetting, ColumnSettingDetail, ComCtxConstants, CommandType, CommonAppComponentComponent, CommonDashboardComponent, CommonErrorCode, CommonService, CompareValidator, ComponentBase, ComponentConstants, ComponentContextService, ConditionalBuilderService, CongViecLienQuanService, CongViecNextFirstStepComponent, CongViecPickerControlSchema, CongViecService, ContainerSchema, ControlTreeNode, ControlType, ConvertMoneyToWordPipe, CoreConfigService, CrudBase, CrudFormComponent, CrudFormCustomFunction, CrudFormData, CrudFormSetting, CrudListComponent, CrudListConfig, CrudListCustomFunction, CrudListData, CrudListHelper, CrudListSetting, CrudService, CustomControlSchema, CustomRouterService, CustomizeUiModel, CustomizeUiService, DanhmucApiService, DataExcel, DataFormBase, DataListBase, DataSourceControlSchema, DataSourcePermissionBase, DataSourceStateType, DataSourceTargetType, DataSourceUserRule, DataSourceUserSender, DataSourceWorkflowCheckboxOption, DataSourceWorkflowCoreStatus, DataType, DateCompareValidator, DateTimeControlSchema, DateTimeRangeControlSchema, DbOrganizationOrganizationService, DbOrganizationPositionService, Deadline, DeadlineType, DhvinhGuardService, DialogModel, DmLinhVucCongViecService, DmLoaiCongViecService, DmPriorityService, DomService, DownloadLinkService, DropdownComponent, DropdownControlSchema, DropdownOptions, DummyWorkflowCode, DynamicComponentService, ENUM_DON_VI_HANH_CHINH, EXPLORER_TYPES, EXPORT_VERSION_V4, EXPORT_VERSION_V5, EditFileCommand, EditorControlSchema, EformService, EmailValidator, EntityMedataDataSetting, EntityMetadataService, EntityPickerColumn, EntityPickerControlSchema, EntityWorkflowType, EnumActionType, EnumControlPickerType, EnumFileLayout, EnumGetRefType, EnumLoaiDanhSachCongViec, EnumLoaiVanBanBase, EnumPermissionType, EnumProcessWorkflowType, EnumStateByMenuCongViec, EnumStateType, EnumTargetType, EnumTypeSplash, EnumUserRule, EnumWFNhomTrangThai, EnumWorkflowCheckboxOption, EnumWorkflowCoreCodeSettingKey, EnumWorkflowHistoryStatus, ErrorType, EventData, ExactOneValueInTableValidator, ExportAllMode, ExportItem, ExportItemType, ExportItemsMode, ExportManyModel, ExportManyResultModel, ExportModel, ExportService, ExportWithoutTemplateModel, Extension, FILE_TYPES, FieldDefineHasTask, FieldDefineIsTaskFormControl, FieldDefineIsWorkflowControl, FieldOrderCrudList, FieldRowSpan, FieldWorkflowCodeInCrudForm, FileDataService, FileExplorerService, FileManagerComponent, FileManagerControlSchema, FileManagerMode, FileManagerSetting, FileObjectService, FilePickerDialogComponent, FileUploadComponent, FileUploadControlSchema, FileUploadMode, FileUploadSetting, FileV4Service, Filter, FolderService, FormControlBase, FormControlBaseWithService, FormSchemaBase, FormSchemaBaseWithService, FormState, Gender, GenerateLinkDownloadDTO, GenericGuardService, GetRefDataSchema, GlobalService, GmailCorrector, GridInfo, GuardService, GuardSvService, HeightType, HighPerformanceService, HighlightPipe, HtmlFormatPipe, HttpOptions, ImageService, Include, JsPlumbOption, KeyFieldGetRefType, KeyFilterStateByMenuCongViec, KeyFlashShow, KeyFunctionReload, KeyValueComponent, KeyValueControlSchema, LabelSchema, LabelWFNhomTrangThai, LabelWorkflowCoreStatus, LengthValidator, ListHelperService, LoaiPhieuDeXuat, LocalCacheService, LowerCorrector, MA_THONG_BAO_PHAN_HE, MaActionBatDauQuyTrinh, ManagerType, MaskControlSchema, MasterDataItem, MasterDataPipe, MasterDataService, MenuService, MethodResult, ModelKySoDonVi, ModelSchema, ModuleConfigService, MultiTranslateHttpLoader, MultipleReferenceDataFormatPipe, NodeService, NotificationObjectType, NotificationService, NotifierService, NotifierType, NumberCompareValidator, NumberOnlyValidator, NumberRangeControlSchema, Operator, OrganizationFormatPipe, OrganizationNameFormatPipe, OrganizationPickerControlSchema, OrganizationService, OrganizationsFormatPipe, PageInfo, PageSetting, Pair, Pattern, PercentControlSchema, PermissionBase, PermissionConstant, PermissionService, PermissionStorage, PermissionTypes, PermissionUtilsComponent, PersonalSetting, PhanQuyenModel, PhoneNumberValidator, PhoneValidator, PopupSize, PositionService, PrintService, PublicFunction, QueryBuilderComponent, QueryBuilderGroupComponent, QueryBuilderRuleComponent, QueryGroup, QueryRule, RELOAD_FILE_LIST, RadioButtonListControlSchema, RandomDataService, RefField, ReferenceDataFormatPipe, ReferenceTextControlSchema, RegexSplitFieldByItem, RequiredFieldsValidator, RequiredValidator, RowColorOption, RowExcel, SHARE_COMPONENT_ID, SHARE_EVENT, SafeHtmlPipe, SafeStylePipe, SafeUrlPipe, SameValueValidator, SchemaBase, SecurePipe, ServiceFileUploadComponent, SessionTypes, SharedFolderType, SignalRService, SimpleDicItem, SimpleDictionary, Sort, SortDirs, SpanControlSchema, SplashComponentComponent, StartupBusinessComponentBase, StateComponent, StateMachineTopic, StateMachinesConnectionMetadataComponent, StateMachinesDesignerComponent, StateMachinesService, StateMetadataComponent, Status, StatusAction, StatusGroup, StatusOption, StatusOrg, StatusUser, StorageService, StorageUpdatedService, StringCompareOption, StringFormatPipe, SummaryPipe, SwitchControlSchema, TBL_DM_COSODAOTAO_CONSTS, TBL_DM_PHONGHOC_CONSTS, TBL_KTX_NGUOITHUE_HOSO, TBL_TS_PHIEUDEXUAT, TBL_TS_TAISANCODINH_CONSTS, TabViewData, TableSchema, TagSeparator, TaiLieuComponent, TemplateConstant, TemplateControlSchema, TemplateInstanceService, TemplateService, TemplateTextItem, TemplateTextMany, TemplateTextV4Service, TemplateType, TemplateV4Service, TenContainer, TextAlign, TextAreaControlSchema, TextControlSchema, TextControlSchemaWithService, TitleSchema, TnClientCommand, TnClientService, TnComponentConfig, TnCustomScrollbarComponent, TnDatePipe, TnMenuItem, TnReorderableColumnDirective, TnReorderableRowDirective, TnSortIcon, TnSortableColumnDirective, TnTreeTableToggler, TnUser, TnxSharedModule, TopicReloadCongViecV5, TopicReloadCountCongViecV5, TopicReloadNotification, TrangThaiMasterData, TrangThais, TreeDataOption, TreeListBase, TrimCorrector, TrimEndCorrector, TrimStartCorrector, TypeDanhMucAPI, UniqueFieldInTableValidator, UniqueNumberService, UpperCorrector, UserFormatPipe, UserGroupRealService, UserGroupService, UserPickerControlSchema, UserPickerDialogComponent, UserService, UserType, UserV5Service, UsersFormatPipe, Validation, VanBanPickerControlSchema, VirtualBaseService, WorkflowConfigAdvance, WorkflowCoreStatusEnum, WorkflowFieldStateCode, WorkflowHistoryService, WorkflowPermissionDetailService, WorkflowPickerComponent, WorkflowService, WorkflowSetting, WorkflowSettingNew, WorkflowSettingsService, WrapPickerControlSchema, addDay, addZero, appendDefaultFilter, clearAll, clone, cloneOld, coreDeclaration, coreModuleImport, coreProvider, createJsPlumnInstance, createOrgPickerControl, createRolePickerControl, createUserGroupPickerControl, createUserPickerControl, dataSourceIcon$1 as dataSourceIcon, dateDiff, genQueryFromFilters, getDateFromStringDateVN, getDayOfWeek, getEnvironmentByName, getEnvironmentData, getListMenuByName, getMenuData, getMonday, getStringDate, getStringDateTime, getStringDateVN, getStringDateVNLocal, getTimeSpan, isArray, isBoolean, isDate, isFunction, isLiteralObject, isNumber, isObjectOld, isRegular, isSimpleType, isString, isValidDate, isValidTime, keyUserSurveyLocal, maximumPageSize, mergeJSON, mergeJSONOld, moduleConfigFunc, monthDiff, multipleSort, romanize, setMetadataConnection, setMetadataState, translateStateMachine, ɵ0, ɵ1, ɵ10, ɵ11, ɵ12, ɵ13, ɵ14, ɵ15, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9, AddressComponent as ɵa, DropdownService as ɵb, BaseDmLinhVucCongViecFormComponent as ɵba, BaseDmPriorityFormComponent as ɵbb, BaseCongviecDinhkemComponent as ɵbc, BaseCongviecDinhkemFormComponent as ɵbd, DatetimePickerComponent as ɵbe, DatetimePickerRangeComponent as ɵbf, DynamicNodeComponent as ɵbg, EntityPickerBoxComponent as ɵbh, EntityPickerDataComponent as ɵbi, EntityPickerSelectedComponent as ɵbj, EntityPickerComponent as ɵbk, EntityPickerDialogComponent as ɵbl, EntityPermissionComponent as ɵbm, DM_ChucVuService as ɵbn, RoleService as ɵbo, EntityPermissionService as ɵbp, EquationEditorComponent as ɵbq, MaskComponent as ɵbr, NumberPickerRangeComponent as ɵbs, PagingNextBackOnlyComponent as ɵbt, RadioButtonListComponent as ɵbu, VanBanPickerComponent as ɵbv, VanBanDenService as ɵbw, VanBanDiService as ɵbx, VanBanPickerDialogComponent as ɵby, VanbanDiPickerComponent as ɵbz, EntityPickerService as ɵc, VanbanDenPickerComponent as ɵca, CongViecPickerComponent as ɵcb, SettingsComponent as ɵcc, SettingsRowComponent as ɵcd, SettingsWorkflowComponent as ɵce, SettingsWorkflowNo1Component as ɵcf, SimpleWorkflowFormComponent as ɵcg, ProcessWorkflowTargetComponent as ɵch, DmChucVuService as ɵci, ChoYKienFormComponent as ɵcj, SplashComponentV1Component as ɵck, SplashComponentV2Component as ɵcl, StateMachinesConnectionReceiverComponent as ɵcm, StateMachinesConnectionReceiverConditionComponent as ɵcn, StateMachinesConnectionReceiverDepartmentComponent as ɵco, StateMachinesConnectionReceiverGroupComponent as ɵcp, StateMachinesConnectionReceiverUserComponent as ɵcq, StateMachinesConnectionReceiverRoleComponent as ɵcr, StateMachinesConnectionSenderComponent as ɵcs, StartWorkflowComponent as ɵct, ShareLinkByPermissionComponent as ɵcu, WorkflowSettingNewComponent as ɵcv, PermissionSharingComponent as ɵcw, WorkflowPermissionService as ɵcx, TnCheckboxComponent as ɵcy, TnDialogComponent as ɵcz, ExceptionHandlerService as ɵd, TnColorPickerComponent as ɵda, TnTinymceComponent as ɵdb, TnTabViewComponent as ɵdc, TableDetailFormComponent as ɵdd, FileIconPipe as ɵde, FileSizePipe as ɵdf, QuickAddFormComponent as ɵdg, PreventShiftTabDirective as ɵdh, TnTemplateDirective as ɵdi, UserPickerComponent as ɵdj, UserPickerBoxComponent as ɵdk, CoCauToChucTestService as ɵdl, TnAppHelpComponent as ɵdm, PathNameService as ɵdn, HelperCurrentPageComponent as ɵdo, TnAppNotificationListComponent as ɵdp, TnAppNotificationComponent as ɵdq, MyDriveService as ɵdr, FileVersionService as ɵds, FileExplorerNewService as ɵdt, FileManagerService as ɵdu, FolderFormComponent as ɵdv, FileFormComponent as ɵdw, FileViewerComponent as ɵdx, FileVersionListComponent as ɵdy, WorkflowHistoryComponent as ɵdz, CanBo_HoSoService as ɵe, EntityWorkflowHistoryService as ɵea, WorkflowHistoryDialogComponent as ɵeb, WorkflowHistoryNewComponent as ɵec, WorkflowSettingComponent as ɵed, EntityWorkflowSettingService as ɵee, WorkflowSettingDialogComponent as ɵef, WorkflowPermissionComponent as ɵeg, WorkflowPermissionFormComponent as ɵeh, ReferenceTextBoxComponent as ɵei, QrCodeGeneratorComponent as ɵej, AccessDeniedV1Component as ɵek, AddNewsComponent as ɵel, ArticleService as ɵem, NewsCategoryService as ɵen, NotFoundComponent as ɵeo, UniversalLinkProcessorComponent as ɵep, SignatureDetailComponent as ɵeq, ChatService as ɵer, ContentsService as ɵes, StatusExtendsService as ɵet, MessageBoardService as ɵeu, KySoSimDanhSachChuKyComponent as ɵev, KySoSimChuKyUserService as ɵew, FileKySoSimComponent as ɵex, KySoSimSignPDFService as ɵey, TaiLieuCuaToiComponent as ɵez, AfterViewCheckedComponent as ɵf, KhaiThacTaiLieuDungChungComponent as ɵfa, DanhMucDungChungService as ɵfb, TnTemplateComponent as ɵfc, LoadingPageV1Component as ɵfd, CheckReadyComponent as ɵfe, SendAccessTokenInterceptor as ɵff, LogInterceptor as ɵfg, PermissionUtilsInterceptor as ɵfh, TraceInterceptor as ɵfi, AdvanceSearchComponent as ɵg, AppRootMenuComponent as ɵh, AppTopBarComponent as ɵi, AppTopBarV1Component as ɵj, AppTopBarV2Component as ɵk, AppProfileComponent as ɵl, AppSubMenuComponent as ɵm, AppMenuComponent as ɵn, AutoCompletePickerComponent as ɵo, CheckBoxListComponent as ɵp, ReportQueueComponent as ɵq, CoCauToChucPickerListComponent as ɵr, TreeTableComponent as ɵs, BaseCongViecTestComponent as ɵt, ListBase as ɵu, CongViecDinhKemService as ɵv, CongViecThayDoiService as ɵw, ProcessWorkflowFormComponent as ɵx, BaseCauHinhWorkflowDetailComponent as ɵy, BaseDmLoaiCongViecFormComponent as ɵz };
52387
52581
  //# sourceMappingURL=tnx-shared.js.map