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
@@ -1691,6 +1691,7 @@
1691
1691
  __extends(TableSchema, _super);
1692
1692
  function TableSchema(init) {
1693
1693
  var _this = _super.call(this) || this;
1694
+ _this.autoGenerateId = false;
1694
1695
  _this.showNumber = true;
1695
1696
  _this.showFunction = true;
1696
1697
  _this.showFooter = true;
@@ -1961,6 +1962,8 @@
1961
1962
  var TabViewData = /** @class */ (function () {
1962
1963
  function TabViewData(init) {
1963
1964
  this.hidden = false;
1965
+ this.alwayRender = false;
1966
+ 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
1964
1967
  for (var key in init) {
1965
1968
  this[key] = init[key];
1966
1969
  }
@@ -2902,8 +2905,8 @@
2902
2905
  result[field] = data;
2903
2906
  }
2904
2907
  else {
2905
- if (typeof result[field] === 'undefined' ||
2906
- !_.isObject(result[field])) {
2908
+ if (typeof result[field] === 'undefined'
2909
+ || !_.isObject(result[field])) {
2907
2910
  result[field] = {};
2908
2911
  }
2909
2912
  result = result[field];
@@ -2971,8 +2974,8 @@
2971
2974
  });
2972
2975
  }
2973
2976
  if (colVal) {
2974
- rowString +=
2975
- colVal
2977
+ rowString
2978
+ += colVal
2976
2979
  .toString()
2977
2980
  .replace(',', '.')
2978
2981
  .replace('\n', '')
@@ -3046,8 +3049,8 @@
3046
3049
  });
3047
3050
  }
3048
3051
  if (colVal) {
3049
- rowString +=
3050
- colVal
3052
+ rowString
3053
+ += colVal
3051
3054
  .toString()
3052
3055
  .replace(',', '.')
3053
3056
  .replace('\n', '')
@@ -3123,8 +3126,8 @@
3123
3126
  });
3124
3127
  }
3125
3128
  if (colVal) {
3126
- rowString +=
3127
- colVal
3129
+ rowString
3130
+ += colVal
3128
3131
  .toString()
3129
3132
  .replace(',', '.')
3130
3133
  .replace('\n', '')
@@ -3184,11 +3187,11 @@
3184
3187
  };
3185
3188
  CommonService.prototype.getLabel = function (item, textField, textField2, prefixTextField2) {
3186
3189
  if (textField2) {
3187
- return (item[textField] +
3188
- ' - ' +
3189
- prefixTextField2 +
3190
- ' ' +
3191
- item[textField2]);
3190
+ return (item[textField]
3191
+ + ' - '
3192
+ + prefixTextField2
3193
+ + ' '
3194
+ + item[textField2]);
3192
3195
  }
3193
3196
  else {
3194
3197
  return item[textField];
@@ -3536,8 +3539,9 @@
3536
3539
  return ("DEFAULT_" + action).toUpperCase();
3537
3540
  };
3538
3541
  CommonService.prototype.cloneObject = function (obj) {
3539
- if (obj !== undefined)
3542
+ if (obj !== undefined) {
3540
3543
  return JSON.parse(JSON.stringify(obj));
3544
+ }
3541
3545
  return undefined;
3542
3546
  };
3543
3547
  CommonService.prototype.setProperty = function (prop, val, model) {
@@ -3617,10 +3621,10 @@
3617
3621
  words.forEach(function (word) {
3618
3622
  if (word.trim() != '') {
3619
3623
  if (word.length > 1) {
3620
- result +=
3621
- word.substring(0, 1).toUpperCase() +
3622
- word.substring(1) +
3623
- ' ';
3624
+ result
3625
+ += word.substring(0, 1).toUpperCase()
3626
+ + word.substring(1)
3627
+ + ' ';
3624
3628
  }
3625
3629
  else {
3626
3630
  result += word.toUpperCase() + ' ';
@@ -3659,22 +3663,26 @@
3659
3663
  return n !== Infinity && String(n) === str;
3660
3664
  };
3661
3665
  CommonService.prototype.hasAnyMask = function () {
3662
- return (document.body.querySelector('div[class~="ui-dialog-mask"]') ||
3663
- document.body.querySelector('div[class~="ui-sidebar-mask"]'));
3666
+ return (document.body.querySelector('div[class~="ui-dialog-mask"]')
3667
+ || document.body.querySelector('div[class~="ui-sidebar-mask"]'));
3664
3668
  };
3665
3669
  CommonService.prototype.safeStringify = function (data) {
3666
3670
  var item = stringify__default['default'].stableStringify(data, null, 2);
3667
3671
  return item;
3668
3672
  };
3669
3673
  CommonService.prototype.compareString = function (value1, value2) {
3670
- if (value1 == null && value2 != null)
3674
+ if (value1 == null && value2 != null) {
3671
3675
  return -1;
3672
- else if (value1 != null && value2 == null)
3676
+ }
3677
+ else if (value1 != null && value2 == null) {
3673
3678
  return 1;
3674
- else if (value1 == null && value2 == null)
3679
+ }
3680
+ else if (value1 == null && value2 == null) {
3675
3681
  return 0;
3676
- else if (typeof value1 === 'string' && typeof value2 === 'string')
3682
+ }
3683
+ else if (typeof value1 === 'string' && typeof value2 === 'string') {
3677
3684
  return value1.localeCompare(value2);
3685
+ }
3678
3686
  else {
3679
3687
  return 0;
3680
3688
  }
@@ -3873,13 +3881,15 @@
3873
3881
  };
3874
3882
  CommonService.prototype.isSameArray = function (array1, array2) {
3875
3883
  var e_4, _b;
3876
- if (array1.length != array2.length)
3884
+ if (array1.length != array2.length) {
3877
3885
  return false;
3886
+ }
3878
3887
  try {
3879
3888
  for (var array1_1 = __values(array1), array1_1_1 = array1_1.next(); !array1_1_1.done; array1_1_1 = array1_1.next()) {
3880
3889
  var item = array1_1_1.value;
3881
- if (!array2.some(function (q) { return q == item; }))
3890
+ if (!array2.some(function (q) { return q == item; })) {
3882
3891
  return false;
3892
+ }
3883
3893
  }
3884
3894
  }
3885
3895
  catch (e_4_1) { e_4 = { error: e_4_1 }; }
@@ -11746,7 +11756,7 @@
11746
11756
  (function (EnumUserRule) {
11747
11757
  // NGUOI_TAO = 1,
11748
11758
  EnumUserRule[EnumUserRule["CAP_TREN"] = 2] = "CAP_TREN";
11749
- // NGUOI_CUOI_CUNG = 3,
11759
+ EnumUserRule[EnumUserRule["NGUOI_CUOI_CUNG"] = 3] = "NGUOI_CUOI_CUNG";
11750
11760
  EnumUserRule[EnumUserRule["NGUOI_THAM_GIA_QUY_TRINH"] = 4] = "NGUOI_THAM_GIA_QUY_TRINH";
11751
11761
  // Cấp trên mà xử lý bản ghi đối tượng trình lên
11752
11762
  // CAP_TREN_DA_GUI = 5,
@@ -15851,8 +15861,10 @@
15851
15861
  return [3 /*break*/, 4];
15852
15862
  }
15853
15863
  }
15854
- else if (childNode.control['_hidden'])
15855
- return [3 /*break*/, 4];
15864
+ else {
15865
+ if (childNode['_hidden'] || childNode.control['_hidden'])
15866
+ return [3 /*break*/, 4];
15867
+ }
15856
15868
  return [4 /*yield*/, this.validate(childNode, true)];
15857
15869
  case 2:
15858
15870
  if (!(_g.sent())) {
@@ -16039,6 +16051,13 @@
16039
16051
  });
16040
16052
  });
16041
16053
  };
16054
+ CrudFormComponent.prototype.handleLoadedControl = function (_component, control, parentPath) {
16055
+ var parentNode = this._rootNode.getNodeByPath(parentPath);
16056
+ var currentNode = parentNode.getChildNode(control.field);
16057
+ if (_component && currentNode) {
16058
+ currentNode._component = _component;
16059
+ }
16060
+ };
16042
16061
  CrudFormComponent.prototype.handleControlReadyEvent = function (control, parentPath) {
16043
16062
  return __awaiter(this, void 0, void 0, function () {
16044
16063
  var parentNode;
@@ -16526,7 +16545,11 @@
16526
16545
  index = tableNode.childNodes.length;
16527
16546
  parentPath = tablePath + '[' + index + ']';
16528
16547
  data = {};
16548
+ if (control.autoGenerateId) {
16549
+ data.id = this._commonService.guid();
16550
+ }
16529
16551
  try {
16552
+ // Thêm id để ngăn render liên tục
16530
16553
  for (_d = __values(control.rowTemplate), _e = _d.next(); !_e.done; _e = _d.next()) {
16531
16554
  subControl = _e.value;
16532
16555
  this.initControlDefaultValue(data, subControl, parentPath);
@@ -16851,7 +16874,7 @@
16851
16874
  || (parentModel._status[control.field].hidden === undefined
16852
16875
  && (control.hidden
16853
16876
  || (control.hiddenCheck && control.hiddenCheck(this._minimizedData, currentNode))));
16854
- control['_hidden'] = !!result;
16877
+ currentNode['_hidden'] = !!result;
16855
16878
  return result;
16856
16879
  };
16857
16880
  CrudFormComponent.prototype.getContextTd = function (control, data, index, tablePath) {
@@ -16930,7 +16953,7 @@
16930
16953
  CrudFormComponent.decorators = [
16931
16954
  { type: i0.Component, args: [{
16932
16955
  selector: 'crud-form',
16933
- 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>",
16956
+ 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>",
16934
16957
  providers: [ComponentContextService],
16935
16958
  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}"]
16936
16959
  },] }
@@ -17023,7 +17046,12 @@
17023
17046
  }
17024
17047
  else {
17025
17048
  if (!this.schemaPath) {
17026
- keysPlus = Object.keys(schemas);
17049
+ Object.keys(schemas).forEach(function (key) {
17050
+ var item = schemas[key];
17051
+ if (item.uniqueField == item.field) {
17052
+ keysPlus.push(key);
17053
+ }
17054
+ });
17027
17055
  }
17028
17056
  }
17029
17057
  this.keysPlus = keysPlus;
@@ -17055,6 +17083,22 @@
17055
17083
  }
17056
17084
  finally { if (e_32) throw e_32.error; }
17057
17085
  }
17086
+ // Sau khi đã init xong node cho row thì fire event cho các control trong row
17087
+ // Thường dùng với mục đích cần disabled, hidden các control của row khi có nhu cầu
17088
+ try {
17089
+ this.childNodes.forEach(function (_) {
17090
+ if (_.control && _.control.onRowNodeFinishInit) {
17091
+ var eventData = new EventData({
17092
+ sourceNode: _,
17093
+ currentNode: _,
17094
+ eventType: 'rowFinishInit'
17095
+ });
17096
+ _.control.onRowNodeFinishInit(eventData);
17097
+ }
17098
+ });
17099
+ }
17100
+ catch (err) {
17101
+ }
17058
17102
  }
17059
17103
  else if (isArray(model)) {
17060
17104
  var i = 0;
@@ -17144,6 +17188,16 @@
17144
17188
  enumerable: false,
17145
17189
  configurable: true
17146
17190
  });
17191
+ Object.defineProperty(ControlTreeNode.prototype, "component", {
17192
+ get: function () {
17193
+ return this._component;
17194
+ },
17195
+ set: function (val) {
17196
+ this._component = val;
17197
+ },
17198
+ enumerable: false,
17199
+ configurable: true
17200
+ });
17147
17201
  ControlTreeNode.prototype.setHidden = function (field, hidden) {
17148
17202
  var _this = this;
17149
17203
  if (hidden === void 0) { hidden = true; }
@@ -17157,13 +17211,31 @@
17157
17211
  }
17158
17212
  };
17159
17213
  ControlTreeNode.prototype.setHiddenField = function (field, hidden) {
17214
+ this.setPrivateStatus(field, 'hidden', hidden);
17215
+ };
17216
+ ControlTreeNode.prototype.setDisabled = function (field, disabled) {
17217
+ var _this = this;
17218
+ if (disabled === void 0) { disabled = true; }
17219
+ if (Array.isArray(field)) {
17220
+ field.forEach(function (f) {
17221
+ _this.setDisabledField(f, disabled);
17222
+ });
17223
+ }
17224
+ else {
17225
+ this.setDisabledField(field, disabled);
17226
+ }
17227
+ };
17228
+ ControlTreeNode.prototype.setDisabledField = function (field, disabled) {
17229
+ this.setPrivateStatus(field, 'disabled', disabled);
17230
+ };
17231
+ ControlTreeNode.prototype.setPrivateStatus = function (field, prop, value) {
17160
17232
  if (field.indexOf('.') > -1) {
17161
17233
  var childNode = this.getNodeByPath(this.modelPath + "." + field);
17162
17234
  var lastField = field.split('.').pop();
17163
- childNode.parentNode.data._status[lastField].hidden = hidden;
17235
+ childNode.parentNode.data._status[lastField][prop] = value;
17164
17236
  }
17165
17237
  else {
17166
- this.data._status[field].hidden = hidden;
17238
+ this.data._status[field][prop] = value;
17167
17239
  }
17168
17240
  };
17169
17241
  ControlTreeNode.prototype.getNodeByPath = function (modelPath) {
@@ -20226,10 +20298,10 @@
20226
20298
  CrudListComponent.prototype.extendColumns = function (cols, appendCol) {
20227
20299
  var _this = this;
20228
20300
  if (appendCol === void 0) { appendCol = true; }
20301
+ this.setting.advanceData.fieldNeedGetRef = [];
20229
20302
  if (!cols) {
20230
20303
  return;
20231
20304
  }
20232
- this.setting.advanceData.fieldNeedGetRef = [];
20233
20305
  var temp = [];
20234
20306
  var tmpCols = __spread(cols);
20235
20307
  if (this.setting.columnSetting.details) {
@@ -24991,14 +25063,17 @@
24991
25063
  dataSource: dataSource,
24992
25064
  allowFilter: this.setting.allowFilterWorkflowColumn
24993
25065
  });
24994
- this.setting.advanceData.fieldNeedGetRef.unshift(colParent);
25066
+ // Nếu chưa có this.setting.advanceData.fieldNeedGetRef thì bên crud-list sẽ add cột này sau
25067
+ if (this.setting.advanceData.fieldNeedGetRef) {
25068
+ this.setting.advanceData.fieldNeedGetRef.unshift(colParent);
25069
+ }
24995
25070
  var children = Object.assign(Object.assign({}, colParent), { rawColumn: colParent, controlType: exports.ControlType.dropdown, dataType: colParent.dataTypeRefField, field: 'str' + colParent.field, allowFilter: colParent.allowFilter, sort: false, visible: !this.setting.hiddenWorkflowColumn });
24996
25071
  colParent.visible = false;
24997
25072
  this.setting.cols.push(colParent, children);
24998
- this.crudList.formatColumns([colParent, children]);
24999
- // this.setting.cols.push(colParent);
25000
- // this.crudList.formatColumns([colParent]);
25001
- this.crudList.buildFilterColumn([colParent]);
25073
+ if (this.crudList) {
25074
+ this.crudList.formatColumns([colParent, children]);
25075
+ this.crudList.buildFilterColumn([colParent]);
25076
+ }
25002
25077
  var userCurrent = this._userService.getCurrentUser();
25003
25078
  if (userCurrent.userName == 'admin') {
25004
25079
  var colForAdmin = new ColumnSchemaBase({
@@ -25011,8 +25086,10 @@
25011
25086
  sort: false
25012
25087
  });
25013
25088
  this.setting.cols.push(colForAdmin);
25014
- this.crudList.formatColumns([colForAdmin]);
25015
- this.crudList.buildFilterColumn([colForAdmin]);
25089
+ if (this.crudList) {
25090
+ this.crudList.formatColumns([colForAdmin]);
25091
+ this.crudList.buildFilterColumn([colForAdmin]);
25092
+ }
25016
25093
  }
25017
25094
  };
25018
25095
  ListBase.prototype.getDataSourceTrangThaiWorkflow = function () {
@@ -26031,6 +26108,7 @@
26031
26108
  _this._showSubLabel = true;
26032
26109
  _this.readyToReload = false;
26033
26110
  _this._readyStatus = {};
26111
+ _this.onInit = new i0.EventEmitter();
26034
26112
  _this.onSelect = new i0.EventEmitter();
26035
26113
  _this.dataChange = new i0.EventEmitter();
26036
26114
  _this.onReady = new i0.EventEmitter();
@@ -26147,6 +26225,7 @@
26147
26225
  if (this.viewMode) {
26148
26226
  this.getModelText();
26149
26227
  }
26228
+ this.onInit.emit(this);
26150
26229
  };
26151
26230
  AddressComponent.prototype.setDisabledControl = function () {
26152
26231
  var disabled = this._disabled ? true : null;
@@ -26252,6 +26331,7 @@
26252
26331
  viewMode: [{ type: i0.Input }],
26253
26332
  data: [{ type: i0.Input }],
26254
26333
  showSubLabel: [{ type: i0.Input }],
26334
+ onInit: [{ type: i0.Output }],
26255
26335
  onSelect: [{ type: i0.Output }],
26256
26336
  dataChange: [{ type: i0.Output }],
26257
26337
  onReady: [{ type: i0.Output }]
@@ -26319,6 +26399,7 @@
26319
26399
  this._deviceDetectorService = _deviceDetectorService;
26320
26400
  this.dataSource = [];
26321
26401
  this.control = new AutoCompleteControlSchema();
26402
+ this.onInit = new i0.EventEmitter();
26322
26403
  this.onValueChanged = new i0.EventEmitter();
26323
26404
  this.lstDataSuggest = [];
26324
26405
  this.hideTransitionOptions = '195ms ease-in';
@@ -26336,6 +26417,7 @@
26336
26417
  if (!this._deviceDetectorService.isDesktop()) {
26337
26418
  this.hideTransitionOptions = this.showTransitionOptions = '';
26338
26419
  }
26420
+ this.onInit.emit(this);
26339
26421
  };
26340
26422
  AutocompleteDatasourceComponent.prototype.handleBlur = function (event) {
26341
26423
  if (this.selectedValueBefore != this.selectedValue) {
@@ -26426,6 +26508,7 @@
26426
26508
  AutocompleteDatasourceComponent.propDecorators = {
26427
26509
  suggestions: [{ type: i0.Input }],
26428
26510
  control: [{ type: i0.Input }],
26511
+ onInit: [{ type: i0.Output }],
26429
26512
  onValueChanged: [{ type: i0.Output }]
26430
26513
  };
26431
26514
 
@@ -26476,6 +26559,7 @@
26476
26559
  height: 900,
26477
26560
  maximize: true
26478
26561
  });
26562
+ _this.onInit = new i0.EventEmitter();
26479
26563
  _this.onSelect = new i0.EventEmitter();
26480
26564
  _this.onUnSelect = new i0.EventEmitter();
26481
26565
  _this.onChanged = new i0.EventEmitter();
@@ -26514,6 +26598,7 @@
26514
26598
  this.buildFilterKeyword();
26515
26599
  this.buildSettingEntityPicker();
26516
26600
  this.updateFuncCheckReadOnlyItem();
26601
+ this.onInit.emit(this);
26517
26602
  };
26518
26603
  AutoCompletePickerComponent.prototype.updateFuncCheckReadOnlyItem = function () {
26519
26604
  if (this.readOnlyValues && this.readOnlyValues.length) {
@@ -27016,14 +27101,17 @@
27016
27101
  this.getDataSelectedValue(obj)
27017
27102
  .then(function (res) {
27018
27103
  _this.updateSelectedValue();
27019
- if (_this.hasValue && !_this.isFiredReady) {
27020
- _this.isFiredReady = true;
27021
- // 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
27022
- // Nếu có trường hợp nào khác thì cần phải xử lý khác
27023
- _this.onReady.emit();
27024
- }
27104
+ _this.checkFireReady();
27025
27105
  });
27026
27106
  };
27107
+ AutoCompletePickerComponent.prototype.checkFireReady = function () {
27108
+ if (!this.isFiredReady && this.hasValue) {
27109
+ this.isFiredReady = true;
27110
+ // 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
27111
+ // Nếu có trường hợp nào khác thì cần phải xử lý khác
27112
+ this.onReady.emit();
27113
+ }
27114
+ };
27027
27115
  AutoCompletePickerComponent.prototype.registerOnChange = function (fn) {
27028
27116
  this.onChangeBase = fn;
27029
27117
  };
@@ -27058,6 +27146,7 @@
27058
27146
  disabled: [{ type: i0.Input }],
27059
27147
  popupSize: [{ type: i0.Input }],
27060
27148
  readOnlyValues: [{ type: i0.Input }],
27149
+ onInit: [{ type: i0.Output }],
27061
27150
  onSelect: [{ type: i0.Output }],
27062
27151
  onUnSelect: [{ type: i0.Output }],
27063
27152
  onChanged: [{ type: i0.Output }],
@@ -29495,6 +29584,7 @@
29495
29584
  this._dropDownService = _dropDownService;
29496
29585
  this._deviceDetectorService = _deviceDetectorService;
29497
29586
  this._styleClass = 'p-grid tn-check-box-list';
29587
+ this.onInit = new i0.EventEmitter();
29498
29588
  this.onSelect = new i0.EventEmitter();
29499
29589
  this.onReady = new i0.EventEmitter();
29500
29590
  this.dataSourceInternal = [];
@@ -29553,6 +29643,7 @@
29553
29643
  if (this.control.pColClass) {
29554
29644
  this.classCheckBox += " p-col-" + this.control.pColClass;
29555
29645
  }
29646
+ this.onInit.emit(this);
29556
29647
  };
29557
29648
  CheckBoxListComponent.prototype.bindDataSource = function (serviceUri, baseService) {
29558
29649
  var _this = this;
@@ -29686,6 +29777,7 @@
29686
29777
  control: [{ type: i0.Input }],
29687
29778
  dataSource: [{ type: i0.Input }],
29688
29779
  disabled: [{ type: i0.Input }],
29780
+ onInit: [{ type: i0.Output }],
29689
29781
  onSelect: [{ type: i0.Output }],
29690
29782
  onReady: [{ type: i0.Output }]
29691
29783
  };
@@ -29776,6 +29868,7 @@
29776
29868
  _this._coCauToChucService = _coCauToChucService;
29777
29869
  _this._translateService = _translateService;
29778
29870
  _this.disabled = false;
29871
+ _this.onInit = new i0.EventEmitter();
29779
29872
  _this.onChanged = new i0.EventEmitter();
29780
29873
  _this.onSelect = new i0.EventEmitter();
29781
29874
  _this.onUnSelect = new i0.EventEmitter();
@@ -29807,6 +29900,7 @@
29807
29900
  sort: false
29808
29901
  })
29809
29902
  ], mdWidth: 12 }));
29903
+ this.onInit.emit(this);
29810
29904
  };
29811
29905
  CoCauToChucPickerListComponent.prototype.handleFocus = function (evt) {
29812
29906
  this.onFocus.emit(evt);
@@ -29863,6 +29957,7 @@
29863
29957
  control: [{ type: i0.Input }],
29864
29958
  disabled: [{ type: i0.Input }],
29865
29959
  readOnlyValues: [{ type: i0.Input }],
29960
+ onInit: [{ type: i0.Output }],
29866
29961
  onChanged: [{ type: i0.Output }],
29867
29962
  onSelect: [{ type: i0.Output }],
29868
29963
  onUnSelect: [{ type: i0.Output }],
@@ -29887,6 +29982,7 @@
29887
29982
  this.showClear = false;
29888
29983
  this.disabledParentItem = true;
29889
29984
  this.rootParentId = null;
29985
+ this.onInit = new i0.EventEmitter();
29890
29986
  this.onChanged = new i0.EventEmitter();
29891
29987
  this.guidEmpty = '00000000-0000-0000-0000-000000000000';
29892
29988
  this.flashCacheParent = [];
@@ -29924,6 +30020,7 @@
29924
30020
  if (this.control)
29925
30021
  this.control._component = this;
29926
30022
  this.bindingUser();
30023
+ this.onInit.emit(this);
29927
30024
  };
29928
30025
  CoCauToChucPickerComponent.prototype.bindingUser = function () {
29929
30026
  var _this = this;
@@ -30072,6 +30169,7 @@
30072
30169
  showClear: [{ type: i0.Input }],
30073
30170
  disabledParentItem: [{ type: i0.Input }],
30074
30171
  rootParentId: [{ type: i0.Input }],
30172
+ onInit: [{ type: i0.Output }],
30075
30173
  onChanged: [{ type: i0.Output, args: ['onChanged',] }]
30076
30174
  };
30077
30175
 
@@ -31275,6 +31373,7 @@
31275
31373
  return [4 /*yield*/, rs.text()];
31276
31374
  case 1:
31277
31375
  menu = _b.apply(_a, [_c.sent()]);
31376
+ this.setDefaultIcon(menu, 0);
31278
31377
  return [4 /*yield*/, this.setMenuItems(menu)];
31279
31378
  case 2:
31280
31379
  _c.sent();
@@ -31286,6 +31385,25 @@
31286
31385
  });
31287
31386
  });
31288
31387
  };
31388
+ MenuService.prototype.setDefaultIcon = function (menus, level) {
31389
+ var _this = this;
31390
+ if (!menus)
31391
+ return;
31392
+ menus.forEach(function (itemMenu) {
31393
+ if (!itemMenu.icon) {
31394
+ if (level === 0) {
31395
+ itemMenu.icon = 'pi pi-th-large';
31396
+ }
31397
+ else if (level === 1) {
31398
+ itemMenu.icon = 'pi pi-star-o';
31399
+ }
31400
+ else {
31401
+ itemMenu.icon = 'pi pi-circle-on';
31402
+ }
31403
+ }
31404
+ _this.setDefaultIcon(itemMenu.items, level + 1);
31405
+ });
31406
+ };
31289
31407
  return MenuService;
31290
31408
  }());
31291
31409
  MenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MenuService_Factory() { return new MenuService(i0.ɵɵinject(ModuleConfigService), i0.ɵɵinject(PermissionService), i0.ɵɵinject(CommonService), i0.ɵɵinject(ApplicationContextService)); }, token: MenuService, providedIn: "root" });
@@ -34078,12 +34196,14 @@
34078
34196
  function CongViecPickerComponent(_injector, _notifierService) {
34079
34197
  var _this = _super.call(this, _injector) || this;
34080
34198
  _this._notifierService = _notifierService;
34199
+ _this.onInit = new i0.EventEmitter();
34081
34200
  _this.onChanged = new i0.EventEmitter();
34082
34201
  _this.idCongViecs = [];
34083
34202
  _this.formState = exports.FormState;
34084
34203
  return _this;
34085
34204
  }
34086
34205
  CongViecPickerComponent.prototype.ngOnInit = function () {
34206
+ this.onInit.emit(this);
34087
34207
  };
34088
34208
  CongViecPickerComponent.prototype.handleIdsChange = function (ids) {
34089
34209
  this.idCongViecs = ids;
@@ -34133,6 +34253,7 @@
34133
34253
  ]; };
34134
34254
  CongViecPickerComponent.propDecorators = {
34135
34255
  control: [{ type: i0.Input }],
34256
+ onInit: [{ type: i0.Output }],
34136
34257
  onChanged: [{ type: i0.Output }]
34137
34258
  };
34138
34259
 
@@ -34735,11 +34856,13 @@
34735
34856
  var DatetimePickerRangeComponent = /** @class */ (function () {
34736
34857
  function DatetimePickerRangeComponent() {
34737
34858
  this.control = new DateTimeRangeControlSchema();
34859
+ this.onInit = new i0.EventEmitter();
34738
34860
  this.onClose = new i0.EventEmitter();
34739
34861
  this.onChanged = new i0.EventEmitter();
34740
34862
  this._controlModelData = [undefined, undefined];
34741
34863
  }
34742
34864
  DatetimePickerRangeComponent.prototype.ngOnInit = function () {
34865
+ this.onInit.emit(this);
34743
34866
  };
34744
34867
  DatetimePickerRangeComponent.prototype.clear = function () {
34745
34868
  var re = (this._controlModelData[0] != null) || (this._controlModelData[1] != null);
@@ -34792,6 +34915,7 @@
34792
34915
  DatetimePickerRangeComponent.propDecorators = {
34793
34916
  control: [{ type: i0.Input }],
34794
34917
  disabled: [{ type: i0.Input }],
34918
+ onInit: [{ type: i0.Output }],
34795
34919
  onClose: [{ type: i0.Output }],
34796
34920
  onChanged: [{ type: i0.Output }]
34797
34921
  };
@@ -34804,6 +34928,7 @@
34804
34928
  this.hideTransitionOptions = '195ms ease-in';
34805
34929
  this.showTransitionOptions = '225ms ease-out';
34806
34930
  this.control = new DateTimeControlSchema();
34931
+ this.onInit = new i0.EventEmitter();
34807
34932
  this.onSelect = new i0.EventEmitter();
34808
34933
  this.onChanged = new i0.EventEmitter();
34809
34934
  this.onFocus = new i0.EventEmitter();
@@ -34811,6 +34936,7 @@
34811
34936
  this.onClose = new i0.EventEmitter();
34812
34937
  }
34813
34938
  DatetimePickerComponent.prototype.ngOnInit = function () {
34939
+ this.onInit.emit(this);
34814
34940
  };
34815
34941
  DatetimePickerComponent.prototype.writeValue = function (obj) {
34816
34942
  if (obj) {
@@ -34983,6 +35109,7 @@
34983
35109
  calendar: [{ type: i0.ViewChild, args: ['calendar', { static: true },] }],
34984
35110
  control: [{ type: i0.Input }],
34985
35111
  disabled: [{ type: i0.Input }],
35112
+ onInit: [{ type: i0.Output }],
34986
35113
  onSelect: [{ type: i0.Output }],
34987
35114
  onChanged: [{ type: i0.Output }],
34988
35115
  onFocus: [{ type: i0.Output }],
@@ -35001,6 +35128,7 @@
35001
35128
  _this.appendTo = 'body';
35002
35129
  _this.defaultSelectedStyleClass = 'custom-select-item';
35003
35130
  _this._itemSelectedStyleClass = _this.defaultSelectedStyleClass;
35131
+ _this.onInit = new i0.EventEmitter();
35004
35132
  _this.onChanged = new i0.EventEmitter();
35005
35133
  _this.onCollapse = new i0.EventEmitter();
35006
35134
  _this.onExpand = new i0.EventEmitter();
@@ -35164,6 +35292,7 @@
35164
35292
  if (this.control.onInit) {
35165
35293
  this.control.onInit(this);
35166
35294
  }
35295
+ this.onInit.emit(this);
35167
35296
  };
35168
35297
  DropdownComponent.prototype.setDefaultSetting = function () {
35169
35298
  var _this = this;
@@ -35971,6 +36100,7 @@
35971
36100
  dataSource: [{ type: i0.Input }],
35972
36101
  value: [{ type: i0.Input }],
35973
36102
  itemSelectedStyleClass: [{ type: i0.Input }],
36103
+ onInit: [{ type: i0.Output }],
35974
36104
  onChanged: [{ type: i0.Output }],
35975
36105
  onCollapse: [{ type: i0.Output }],
35976
36106
  onExpand: [{ type: i0.Output }],
@@ -37403,6 +37533,7 @@
37403
37533
  _this._translateService = _translateService;
37404
37534
  _this.disabled = false;
37405
37535
  _this.readOnly = false;
37536
+ _this.onInit = new i0.EventEmitter();
37406
37537
  _this.onSelect = new i0.EventEmitter();
37407
37538
  _this.onUnSelect = new i0.EventEmitter();
37408
37539
  _this.onChanged = new i0.EventEmitter();
@@ -37460,6 +37591,7 @@
37460
37591
  });
37461
37592
  this.advanceData.fields = this.getFields();
37462
37593
  _super.prototype.ngOnInit.call(this);
37594
+ this.onInit.emit(this);
37463
37595
  };
37464
37596
  EntityPickerComponent.prototype.selectEntity = function () {
37465
37597
  this.showDetailForm = true;
@@ -37649,6 +37781,7 @@
37649
37781
  disabled: [{ type: i0.Input }],
37650
37782
  readOnly: [{ type: i0.Input }],
37651
37783
  children: [{ type: i0.Input }],
37784
+ onInit: [{ type: i0.Output }],
37652
37785
  onSelect: [{ type: i0.Output, args: ['onSelect',] }],
37653
37786
  onUnSelect: [{ type: i0.Output, args: ['onUnSelect',] }],
37654
37787
  onChanged: [{ type: i0.Output, args: ['onChanged',] }]
@@ -38351,6 +38484,7 @@
38351
38484
  _this.inTaiLieuChung = false;
38352
38485
  _this.copyToFolderId = _this._commonService.guidEmpty();
38353
38486
  _this.multipleCheckWhenClickRow = true;
38487
+ _this.onInit = new i0.EventEmitter();
38354
38488
  _this.onReady = new i0.EventEmitter();
38355
38489
  _this.entityKeyChange = new i0.EventEmitter();
38356
38490
  _this.closePopup = new i0.EventEmitter();
@@ -38455,6 +38589,7 @@
38455
38589
  }
38456
38590
  this.reloadData();
38457
38591
  this.checkAndLoadRootFolderContent();
38592
+ this.onInit.emit(this);
38458
38593
  };
38459
38594
  FileManagerComponent.prototype.checkAndLoadRootFolderContent = function () {
38460
38595
  if (!this.inited || this.fileDataService)
@@ -39696,6 +39831,7 @@
39696
39831
  copyToFolderId: [{ type: i0.Input }],
39697
39832
  value: [{ type: i0.Input }],
39698
39833
  multipleCheckWhenClickRow: [{ type: i0.Input }],
39834
+ onInit: [{ type: i0.Output }],
39699
39835
  onReady: [{ type: i0.Output }],
39700
39836
  entityKeyChange: [{ type: i0.Output }],
39701
39837
  closePopup: [{ type: i0.Output }],
@@ -41174,6 +41310,7 @@
41174
41310
  _this.invalidFileLimitMessageSummary = 'Quá số lượng file cho phép, ';
41175
41311
  _this.invalidFileLimitMessageDetail = 'tối đa {0} file.';
41176
41312
  _this.sharedFolderType = exports.SharedFolderType.Tempt;
41313
+ _this.onInit = new i0.EventEmitter();
41177
41314
  _this.onSelect = new i0.EventEmitter();
41178
41315
  _this.onRemove = new i0.EventEmitter();
41179
41316
  _this.onChanged = new i0.EventEmitter();
@@ -41200,6 +41337,7 @@
41200
41337
  this.isDisabled = isDisabled;
41201
41338
  };
41202
41339
  FileUploadComponent.prototype.ngOnInit = function () {
41340
+ this.onInit.emit(this);
41203
41341
  };
41204
41342
  FileUploadComponent.prototype.getFile = function () {
41205
41343
  return __awaiter(this, void 0, void 0, function () {
@@ -41354,6 +41492,7 @@
41354
41492
  invalidFileLimitMessageSummary: [{ type: i0.Input }],
41355
41493
  invalidFileLimitMessageDetail: [{ type: i0.Input }],
41356
41494
  sharedFolderType: [{ type: i0.Input }],
41495
+ onInit: [{ type: i0.Output }],
41357
41496
  onSelect: [{ type: i0.Output }],
41358
41497
  onRemove: [{ type: i0.Output }],
41359
41498
  onChanged: [{ type: i0.Output }]
@@ -41476,6 +41615,7 @@
41476
41615
  this.viewMode = false;
41477
41616
  this.inputStyleClass = '';
41478
41617
  this.autoFormat = true;
41618
+ this.onInit = new i0.EventEmitter();
41479
41619
  this.onFocus = new i0.EventEmitter();
41480
41620
  this.onBlur = new i0.EventEmitter();
41481
41621
  this.onChanged = new i0.EventEmitter();
@@ -41494,6 +41634,7 @@
41494
41634
  if (!this.autoFormat) {
41495
41635
  this.thousandSeperator = '';
41496
41636
  }
41637
+ this.onInit.emit(this);
41497
41638
  };
41498
41639
  MaskComponent.prototype.writeValue = function (obj) {
41499
41640
  if (obj) {
@@ -41593,6 +41734,7 @@
41593
41734
  viewMode: [{ type: i0.Input }],
41594
41735
  inputStyleClass: [{ type: i0.Input }],
41595
41736
  autoFormat: [{ type: i0.Input }],
41737
+ onInit: [{ type: i0.Output }],
41596
41738
  onFocus: [{ type: i0.Output }],
41597
41739
  onBlur: [{ type: i0.Output }],
41598
41740
  onChanged: [{ type: i0.Output }]
@@ -41658,6 +41800,7 @@
41658
41800
  this.suffix = '';
41659
41801
  this.prefix = '';
41660
41802
  this.decimalPlaces = 2;
41803
+ this.onInit = new i0.EventEmitter();
41661
41804
  this.focus = new i0.EventEmitter();
41662
41805
  this.enterSmart = new i0.EventEmitter();
41663
41806
  this.enter = new i0.EventEmitter();
@@ -41665,6 +41808,7 @@
41665
41808
  this.change = new i0.EventEmitter();
41666
41809
  }
41667
41810
  NumberPickerRangeComponent.prototype.ngOnInit = function () {
41811
+ this.onInit.emit(this);
41668
41812
  };
41669
41813
  NumberPickerRangeComponent.prototype.clear = function () {
41670
41814
  var re = (this.model[0] != null && this.model[0] !== '') || (this.model[1] != null && this.model[1] !== '');
@@ -41777,6 +41921,7 @@
41777
41921
  min: [{ type: i0.Input }],
41778
41922
  max: [{ type: i0.Input }],
41779
41923
  decimalPlaces: [{ type: i0.Input }],
41924
+ onInit: [{ type: i0.Output }],
41780
41925
  focus: [{ type: i0.Output }],
41781
41926
  enterSmart: [{ type: i0.Output }],
41782
41927
  enter: [{ type: i0.Output }],
@@ -42209,6 +42354,7 @@
42209
42354
  function RadioButtonListComponent(_crudService, _deviceDetectorService) {
42210
42355
  this._crudService = _crudService;
42211
42356
  this._deviceDetectorService = _deviceDetectorService;
42357
+ this.onInit = new i0.EventEmitter();
42212
42358
  this.valueChange = new i0.EventEmitter();
42213
42359
  this.onChanged = new i0.EventEmitter();
42214
42360
  this.onDataSourceLoaded = new i0.EventEmitter();
@@ -42250,6 +42396,7 @@
42250
42396
  if (!this._deviceDetectorService.isDesktop()) {
42251
42397
  this.hideTransitionOptions = this.showTransitionOptions = '';
42252
42398
  }
42399
+ this.onInit.emit(this);
42253
42400
  };
42254
42401
  RadioButtonListComponent.prototype.setDefaultSetting = function () {
42255
42402
  var _this = this;
@@ -42501,6 +42648,7 @@
42501
42648
  dataSource: [{ type: i0.Input }],
42502
42649
  value: [{ type: i0.Input }],
42503
42650
  disabled: [{ type: i0.Input }],
42651
+ onInit: [{ type: i0.Output }],
42504
42652
  valueChange: [{ type: i0.Output }],
42505
42653
  onChanged: [{ type: i0.Output }],
42506
42654
  onDataSourceLoaded: [{ type: i0.Output }],
@@ -42525,6 +42673,7 @@
42525
42673
  _this.serviceCode = '';
42526
42674
  _this.entity = '';
42527
42675
  _this.chooseLabel = 'Chọn';
42676
+ _this.onInit = new i0.EventEmitter();
42528
42677
  _this.onSelect = new i0.EventEmitter();
42529
42678
  _this.onRemove = new i0.EventEmitter();
42530
42679
  _this.onChanged = new i0.EventEmitter();
@@ -42568,6 +42717,7 @@
42568
42717
  ServiceFileUploadComponent.prototype.ngOnInit = function () {
42569
42718
  this.setUp();
42570
42719
  this.subscribe();
42720
+ this.onInit.emit(this);
42571
42721
  };
42572
42722
  ServiceFileUploadComponent.prototype.setUp = function () {
42573
42723
  this.accept = this.control.accept;
@@ -42944,6 +43094,7 @@
42944
43094
  entity: [{ type: i0.Input }],
42945
43095
  entityKey: [{ type: i0.Input }],
42946
43096
  chooseLabel: [{ type: i0.Input }],
43097
+ onInit: [{ type: i0.Output }],
42947
43098
  onSelect: [{ type: i0.Output }],
42948
43099
  onRemove: [{ type: i0.Output }],
42949
43100
  onChanged: [{ type: i0.Output }]
@@ -43770,6 +43921,9 @@
43770
43921
  }
43771
43922
  }
43772
43923
  });
43924
+ if (_this.appSwitcherItems.length === 1) {
43925
+ _this.switchApp(_this.appSwitcherItems[0]);
43926
+ }
43773
43927
  }
43774
43928
  });
43775
43929
  };
@@ -43977,6 +44131,9 @@
43977
44131
  }
43978
44132
  }
43979
44133
  });
44134
+ if (_this.appSwitcherItems.length === 1) {
44135
+ _this.switchApp(_this.appSwitcherItems[0]);
44136
+ }
43980
44137
  }
43981
44138
  });
43982
44139
  };
@@ -44190,6 +44347,9 @@
44190
44347
  }
44191
44348
  }
44192
44349
  });
44350
+ if (_this.appSwitcherItems.length === 1) {
44351
+ _this.switchApp(_this.appSwitcherItems[0]);
44352
+ }
44193
44353
  }
44194
44354
  });
44195
44355
  };
@@ -44366,32 +44526,32 @@
44366
44526
  { id: ɵ4, ten: 'Đơn vị' },
44367
44527
  { id: ɵ5, ten: 'Nhóm người dùng' },
44368
44528
  ];
44369
- var ɵ6 = exports.EnumUserRule.CAP_TREN, ɵ7 = exports.EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH, ɵ8 = exports.EnumUserRule.NGUOI_NHAN, ɵ9 = exports.EnumUserRule.NGUOI_THEO_DOI, ɵ10 = exports.EnumUserRule.NGUOI_THAO_TAC;
44529
+ var ɵ6 = exports.EnumUserRule.CAP_TREN, ɵ7 = exports.EnumUserRule.NGUOI_CUOI_CUNG, ɵ8 = exports.EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH, ɵ9 = exports.EnumUserRule.NGUOI_NHAN, ɵ10 = exports.EnumUserRule.NGUOI_THEO_DOI, ɵ11 = exports.EnumUserRule.NGUOI_THAO_TAC;
44370
44530
  var DataSourceUserRule = [
44371
44531
  // { id: EnumUserRule.NGUOI_TAO, ten: 'Người tạo' },
44372
44532
  { id: ɵ6, ten: 'Cấp trên' },
44373
44533
  // { id: EnumUserRule.CAP_TREN, ten: 'Cấp dưới' },
44374
44534
  // { id: EnumUserRule.CAP_TREN_DA_GUI, ten: 'Cấp trên đã trình' },
44375
- // { id: EnumUserRule.NGUOI_CUOI_CUNG, ten: 'Người cuối cùng' },
44376
- { id: ɵ7, ten: 'Người tham gia quy trình' },
44535
+ { id: ɵ7, ten: 'Người cuối cùng' },
44536
+ { id: ɵ8, ten: 'Người tham gia quy trình' },
44377
44537
  // { id: EnumUserRule.NGUOI_DA_NHAN, ten: 'Người đã nhận', tooltip: 'Người đã từng nhận' },
44378
- { id: ɵ8, ten: 'Người nhận' },
44379
- { id: ɵ9, ten: 'Người theo dõi' },
44380
- { id: ɵ10, ten: 'Người thực hiện thao tác' }
44538
+ { id: ɵ9, ten: 'Người nhận' },
44539
+ { id: ɵ10, ten: 'Người theo dõi' },
44540
+ { id: ɵ11, ten: 'Người thực hiện thao tác' }
44381
44541
  ];
44382
- var ɵ11 = exports.EnumUserRule.CAP_TREN, ɵ12 = exports.EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH;
44542
+ var ɵ12 = exports.EnumUserRule.CAP_TREN, ɵ13 = exports.EnumUserRule.NGUOI_THAM_GIA_QUY_TRINH;
44383
44543
  var DataSourceUserSender = [
44384
44544
  // { id: EnumUserRule.NGUOI_TAO, ten: 'Người tạo' },
44385
- { id: ɵ11, ten: 'Cấp trên' },
44545
+ { id: ɵ12, ten: 'Cấp trên' },
44386
44546
  // { id: EnumUserRule.CAP_TREN_DA_GUI, ten: 'Cấp trên đã trình' },
44387
44547
  // { id: EnumUserRule.NGUOI_CUOI_CUNG, ten: 'Người cuối cùng' },
44388
- { id: ɵ12, ten: 'Người tham gia quy trình' }
44548
+ { id: ɵ13, ten: 'Người tham gia quy trình' }
44389
44549
  ];
44390
- var ɵ13 = exports.EnumWorkflowCheckboxOption.TAO_CONG_VIEC, ɵ14 = exports.EnumWorkflowCheckboxOption.AUTO_START_TASK;
44550
+ var ɵ14 = exports.EnumWorkflowCheckboxOption.TAO_CONG_VIEC, ɵ15 = exports.EnumWorkflowCheckboxOption.AUTO_START_TASK;
44391
44551
  var DataSourceWorkflowCheckboxOption = [
44392
- { id: ɵ13, ten: 'Tạo công việc' },
44552
+ { id: ɵ14, ten: 'Tạo công việc' },
44393
44553
  // { id: EnumWorkflowCheckboxOption.AUTO_NEXT_STEP, ten: 'Tự động chuyển bước đầu tiên' },
44394
- { id: ɵ14, ten: 'Bắt đầu nhanh công việc' }
44554
+ { id: ɵ15, ten: 'Bắt đầu nhanh công việc' }
44395
44555
  ];
44396
44556
 
44397
44557
  function createJsPlumnInstance(containerId, options) {
@@ -47721,6 +47881,7 @@
47721
47881
  var _this = _super.call(this, injector) || this;
47722
47882
  _this.disabled = false;
47723
47883
  _this.appendTo = 'body';
47884
+ _this.onInit = new i0.EventEmitter();
47724
47885
  _this.change = new i0.EventEmitter();
47725
47886
  return _this;
47726
47887
  }
@@ -47743,7 +47904,7 @@
47743
47904
  this.disabled = isDisabled;
47744
47905
  };
47745
47906
  TnColorPickerComponent.prototype.ngOnInit = function () {
47746
- // this.model.value = '#ffffff';
47907
+ this.onInit.emit(this);
47747
47908
  };
47748
47909
  TnColorPickerComponent.prototype.changePicker = function (evt) {
47749
47910
  this.model.inputValue = this.model.value;
@@ -47778,6 +47939,7 @@
47778
47939
  TnColorPickerComponent.propDecorators = {
47779
47940
  disabled: [{ type: i0.Input }],
47780
47941
  appendTo: [{ type: i0.Input }],
47942
+ onInit: [{ type: i0.Output }],
47781
47943
  change: [{ type: i0.Output }]
47782
47944
  };
47783
47945
 
@@ -48214,7 +48376,7 @@
48214
48376
  TnDialogComponent.decorators = [
48215
48377
  { type: i0.Component, args: [{
48216
48378
  selector: 'tn-dialog',
48217
- 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>",
48379
+ 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>",
48218
48380
  styles: [""]
48219
48381
  },] }
48220
48382
  ];
@@ -48254,15 +48416,17 @@
48254
48416
  function TnTabViewComponent(_commonService) {
48255
48417
  this._commonService = _commonService;
48256
48418
  this.data = [];
48419
+ this._hiddenTab = [];
48420
+ this.hiddenInfo = {};
48257
48421
  this.allowViewAll = false;
48258
48422
  this.isDynamicHeight = false;
48259
- this.useScrollbar = false;
48260
48423
  this.onTabChange = new i0.EventEmitter();
48261
48424
  this.activeIndexChange = new i0.EventEmitter();
48262
48425
  this.template = {};
48263
48426
  this.onlyIcon = false;
48264
48427
  this.styleClass = 'tn-tabview-beauty';
48265
48428
  this.height = '100%';
48429
+ this.ready = false;
48266
48430
  }
48267
48431
  Object.defineProperty(TnTabViewComponent.prototype, "vertical", {
48268
48432
  set: function (value) {
@@ -48273,6 +48437,21 @@
48273
48437
  configurable: true
48274
48438
  });
48275
48439
  ;
48440
+ Object.defineProperty(TnTabViewComponent.prototype, "hiddenTab", {
48441
+ set: function (value) {
48442
+ if (value) {
48443
+ this._hiddenTab = value;
48444
+ }
48445
+ else {
48446
+ this._hiddenTab = [];
48447
+ }
48448
+ if (this.ready) {
48449
+ this.setHiddenInfo();
48450
+ }
48451
+ },
48452
+ enumerable: false,
48453
+ configurable: true
48454
+ });
48276
48455
  Object.defineProperty(TnTabViewComponent.prototype, "activeIndex", {
48277
48456
  set: function (value) {
48278
48457
  this.currentTabIndex = value;
@@ -48292,6 +48471,8 @@
48292
48471
  }
48293
48472
  this.currentTabIndex = currentTabIndex;
48294
48473
  }
48474
+ this.ready = true;
48475
+ this.setHiddenInfo();
48295
48476
  };
48296
48477
  TnTabViewComponent.prototype.ngAfterContentInit = function () {
48297
48478
  var _this = this;
@@ -48304,6 +48485,13 @@
48304
48485
  });
48305
48486
  this.setStyleClass();
48306
48487
  };
48488
+ TnTabViewComponent.prototype.setHiddenInfo = function () {
48489
+ var _this = this;
48490
+ this.hiddenInfo = {};
48491
+ this._hiddenTab.forEach(function (tabCode) {
48492
+ _this.hiddenInfo[tabCode] = true;
48493
+ });
48494
+ };
48307
48495
  TnTabViewComponent.prototype.setStyleClass = function () {
48308
48496
  var result = 'tn-tabview-beauty';
48309
48497
  if (this._vertical) {
@@ -48317,14 +48505,20 @@
48317
48505
  TnTabViewComponent.prototype.handleTabChange = function (evt) {
48318
48506
  this.currentTabIndex = evt.index;
48319
48507
  this.activeIndexChange.emit(this.currentTabIndex);
48320
- this.onTabChange.emit(evt);
48508
+ };
48509
+ TnTabViewComponent.prototype.handleTabLoaded = function (item) {
48510
+ this.currentTabCode = item.code;
48511
+ this.onTabChange.emit({
48512
+ index: this.currentTabIndex,
48513
+ code: this.currentTabCode
48514
+ });
48321
48515
  };
48322
48516
  return TnTabViewComponent;
48323
48517
  }());
48324
48518
  TnTabViewComponent.decorators = [
48325
48519
  { type: i0.Component, args: [{
48326
48520
  selector: 'tn-tabview',
48327
- 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>",
48521
+ 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>",
48328
48522
  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}}"]
48329
48523
  },] }
48330
48524
  ];
@@ -48335,10 +48529,10 @@
48335
48529
  children: [{ type: i0.ContentChildren, args: [i0.TemplateRef,] }],
48336
48530
  vertical: [{ type: i0.Input }],
48337
48531
  data: [{ type: i0.Input }],
48532
+ hiddenTab: [{ type: i0.Input }],
48338
48533
  allowViewAll: [{ type: i0.Input }],
48339
48534
  activeIndex: [{ type: i0.Input }],
48340
48535
  isDynamicHeight: [{ type: i0.Input }],
48341
- useScrollbar: [{ type: i0.Input }],
48342
48536
  onTabChange: [{ type: i0.Output }],
48343
48537
  activeIndexChange: [{ type: i0.Output }]
48344
48538
  };
@@ -48382,6 +48576,7 @@
48382
48576
  _this.required = false;
48383
48577
  _this.height = 200;
48384
48578
  _this.field = '';
48579
+ _this.onInit = new i0.EventEmitter();
48385
48580
  _this.keydown = new i0.EventEmitter();
48386
48581
  _this.onBlur = new i0.EventEmitter();
48387
48582
  _this.onChanged = new i0.EventEmitter();
@@ -48410,6 +48605,7 @@
48410
48605
  }
48411
48606
  TnTinymceComponent.prototype.ngOnInit = function () {
48412
48607
  this.subscribeContentInsert();
48608
+ this.onInit.emit(this);
48413
48609
  };
48414
48610
  TnTinymceComponent.prototype.ngAfterViewInit = function () {
48415
48611
  var mode = this.mode;
@@ -48767,6 +48963,7 @@
48767
48963
  height: [{ type: i0.Input }],
48768
48964
  field: [{ type: i0.Input }],
48769
48965
  languageCode: [{ type: i0.Input }],
48966
+ onInit: [{ type: i0.Output }],
48770
48967
  keydown: [{ type: i0.Output }],
48771
48968
  onBlur: [{ type: i0.Output }],
48772
48969
  onChanged: [{ type: i0.Output }]
@@ -49132,6 +49329,7 @@
49132
49329
  });
49133
49330
  _this.multiple = false;
49134
49331
  _this.disabled = false;
49332
+ _this.onInit = new i0.EventEmitter();
49135
49333
  _this.onSelect = new i0.EventEmitter();
49136
49334
  _this.onUnSelect = new i0.EventEmitter();
49137
49335
  _this.onChanged = new i0.EventEmitter();
@@ -49243,6 +49441,7 @@
49243
49441
  this.createSchemaSearch();
49244
49442
  this.updateFuncCheckReadOnlyItem();
49245
49443
  this.onReady.emit();
49444
+ this.onInit.emit(this);
49246
49445
  };
49247
49446
  UserPickerComponent.prototype.updateFuncCheckReadOnlyItem = function () {
49248
49447
  if (this.readOnlyValues && this.readOnlyValues.length) {
@@ -49763,6 +49962,7 @@
49763
49962
  multiple: [{ type: i0.Input }],
49764
49963
  disabled: [{ type: i0.Input }],
49765
49964
  readOnlyValues: [{ type: i0.Input }],
49965
+ onInit: [{ type: i0.Output }],
49766
49966
  onSelect: [{ type: i0.Output, args: ['onSelect',] }],
49767
49967
  onUnSelect: [{ type: i0.Output, args: ['onUnSelect',] }],
49768
49968
  onChanged: [{ type: i0.Output, args: ['onChanged',] }],
@@ -50268,6 +50468,7 @@
50268
50468
  var _this = _super.call(this, _injector) || this;
50269
50469
  _this._vanBanDenService = _vanBanDenService;
50270
50470
  _this._vanBanDiService = _vanBanDiService;
50471
+ _this.onInit = new i0.EventEmitter();
50271
50472
  _this.onChanged = new i0.EventEmitter();
50272
50473
  _this.onReady = new i0.EventEmitter();
50273
50474
  _this.environment = {};
@@ -50314,6 +50515,7 @@
50314
50515
  this.setting.fieldSearchText = ['code', 'name'];
50315
50516
  this.setting.objectName = ' văn bản';
50316
50517
  _super.prototype.ngOnInit.call(this);
50518
+ this.onInit.emit(this);
50317
50519
  };
50318
50520
  VanBanPickerComponent.prototype.getVanBanDen = function (originGridInfo) {
50319
50521
  var _this = this;
@@ -50551,6 +50753,7 @@
50551
50753
  loaiVanBan: [{ type: i0.Input }],
50552
50754
  readOnly: [{ type: i0.Input }],
50553
50755
  control: [{ type: i0.Input }],
50756
+ onInit: [{ type: i0.Output }],
50554
50757
  onChanged: [{ type: i0.Output }],
50555
50758
  onReady: [{ type: i0.Output }]
50556
50759
  };
@@ -57063,6 +57266,7 @@
57063
57266
  __extends(ReferenceTextBoxComponent, _super);
57064
57267
  function ReferenceTextBoxComponent(injector) {
57065
57268
  var _this = _super.call(this, injector) || this;
57269
+ _this.onInit = new i0.EventEmitter();
57066
57270
  _this.data = '';
57067
57271
  _this.ready = false;
57068
57272
  return _this;
@@ -57082,6 +57286,7 @@
57082
57286
  this.control._component = this;
57083
57287
  this.ready = true;
57084
57288
  this.checkAndGetData();
57289
+ this.onInit.emit(this);
57085
57290
  };
57086
57291
  ReferenceTextBoxComponent.prototype.checkAndGetData = function () {
57087
57292
  return __awaiter(this, void 0, void 0, function () {
@@ -57135,7 +57340,8 @@
57135
57340
  ]; };
57136
57341
  ReferenceTextBoxComponent.propDecorators = {
57137
57342
  control: [{ type: i0.Input }],
57138
- value: [{ type: i0.Input }]
57343
+ value: [{ type: i0.Input }],
57344
+ onInit: [{ type: i0.Output }]
57139
57345
  };
57140
57346
 
57141
57347
  var LoadingPageV1Component = /** @class */ (function () {
@@ -59816,6 +60022,7 @@
59816
60022
  exports.ɵ12 = ɵ12;
59817
60023
  exports.ɵ13 = ɵ13;
59818
60024
  exports.ɵ14 = ɵ14;
60025
+ exports.ɵ15 = ɵ15;
59819
60026
  exports.ɵ2 = ɵ2;
59820
60027
  exports.ɵ3 = ɵ3;
59821
60028
  exports.ɵ4 = ɵ4;