tnx-shared 5.1.344 → 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 (83) hide show
  1. package/bundles/tnx-shared.umd.js +184 -19
  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/form-schema.d.ts +4 -0
  6. package/classes/form-schema.d.ts.map +1 -1
  7. package/components/address/address.component.d.ts +1 -0
  8. package/components/address/address.component.d.ts.map +1 -1
  9. package/components/autocomplete-datasource/autocomplete-datasource.component.d.ts +1 -0
  10. package/components/autocomplete-datasource/autocomplete-datasource.component.d.ts.map +1 -1
  11. package/components/autocomplete-picker/autocomplete-picker.component.d.ts +2 -0
  12. package/components/autocomplete-picker/autocomplete-picker.component.d.ts.map +1 -1
  13. package/components/check-box-list/check-box-list.component.d.ts +1 -0
  14. package/components/check-box-list/check-box-list.component.d.ts.map +1 -1
  15. package/components/cocautochuc/cocautochuc-picker/cocautochuc-picker.component.d.ts +1 -0
  16. package/components/cocautochuc/cocautochuc-picker/cocautochuc-picker.component.d.ts.map +1 -1
  17. package/components/cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component.d.ts +1 -0
  18. package/components/cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component.d.ts.map +1 -1
  19. package/components/congviec-picker/congviec-picker.component.d.ts +1 -0
  20. package/components/congviec-picker/congviec-picker.component.d.ts.map +1 -1
  21. package/components/crud/crud-form/crud-form.component.d.ts +7 -0
  22. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  23. package/components/datetime-picker/datetime-picker.component.d.ts +1 -0
  24. package/components/datetime-picker/datetime-picker.component.d.ts.map +1 -1
  25. package/components/datetime-picker-range/datetime-picker-range.component.d.ts +1 -0
  26. package/components/datetime-picker-range/datetime-picker-range.component.d.ts.map +1 -1
  27. package/components/dropdown/dropdown.component.d.ts +1 -0
  28. package/components/dropdown/dropdown.component.d.ts.map +1 -1
  29. package/components/entity-picker/entity-picker.component.d.ts +1 -0
  30. package/components/entity-picker/entity-picker.component.d.ts.map +1 -1
  31. package/components/file-explorer/file-manager/file-manager.component.d.ts +1 -0
  32. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  33. package/components/file-upload/file-upload.component.d.ts +1 -0
  34. package/components/file-upload/file-upload.component.d.ts.map +1 -1
  35. package/components/mask/mask.component.d.ts +1 -0
  36. package/components/mask/mask.component.d.ts.map +1 -1
  37. package/components/number-picker-range/number-picker-range.component.d.ts +1 -0
  38. package/components/number-picker-range/number-picker-range.component.d.ts.map +1 -1
  39. package/components/radio-button-list/radio-button-list.component.d.ts +1 -0
  40. package/components/radio-button-list/radio-button-list.component.d.ts.map +1 -1
  41. package/components/reference-textbox/reference-textbox.component.d.ts +2 -1
  42. package/components/reference-textbox/reference-textbox.component.d.ts.map +1 -1
  43. package/components/service-file-upload/service-file-upload.component.d.ts +1 -0
  44. package/components/service-file-upload/service-file-upload.component.d.ts.map +1 -1
  45. package/components/tn-color-picker/tn-color-picker.component.d.ts +1 -0
  46. package/components/tn-color-picker/tn-color-picker.component.d.ts.map +1 -1
  47. package/components/tn-tabview/tn-tabview.component.d.ts +7 -1
  48. package/components/tn-tabview/tn-tabview.component.d.ts.map +1 -1
  49. package/components/tn-tinymce/tn-tinymce.component.d.ts +1 -0
  50. package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
  51. package/components/user-picker/user-picker.component.d.ts +1 -0
  52. package/components/user-picker/user-picker.component.d.ts.map +1 -1
  53. package/components/vanban-picker/vanban-picker.component.d.ts +1 -0
  54. package/components/vanban-picker/vanban-picker.component.d.ts.map +1 -1
  55. package/esm2015/classes/form-schema.js +4 -1
  56. package/esm2015/components/address/address.component.js +4 -1
  57. package/esm2015/components/autocomplete-datasource/autocomplete-datasource.component.js +4 -1
  58. package/esm2015/components/autocomplete-picker/autocomplete-picker.component.js +13 -7
  59. package/esm2015/components/check-box-list/check-box-list.component.js +4 -1
  60. package/esm2015/components/cocautochuc/cocautochuc-picker/cocautochuc-picker.component.js +4 -1
  61. package/esm2015/components/cocautochuc/cocautochuc-picker-list/cocautochuc-picker-list.component.js +4 -1
  62. package/esm2015/components/congviec-picker/congviec-picker.component.js +4 -1
  63. package/esm2015/components/crud/crud-form/crud-form.component.js +64 -8
  64. package/esm2015/components/datetime-picker/datetime-picker.component.js +4 -1
  65. package/esm2015/components/datetime-picker-range/datetime-picker-range.component.js +5 -2
  66. package/esm2015/components/dropdown/dropdown.component.js +4 -1
  67. package/esm2015/components/entity-picker/entity-picker.component.js +4 -1
  68. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +4 -1
  69. package/esm2015/components/file-upload/file-upload.component.js +4 -1
  70. package/esm2015/components/mask/mask.component.js +4 -1
  71. package/esm2015/components/number-picker-range/number-picker-range.component.js +5 -2
  72. package/esm2015/components/radio-button-list/radio-button-list.component.js +4 -1
  73. package/esm2015/components/reference-textbox/reference-textbox.component.js +6 -3
  74. package/esm2015/components/service-file-upload/service-file-upload.component.js +4 -1
  75. package/esm2015/components/tn-color-picker/tn-color-picker.component.js +4 -2
  76. package/esm2015/components/tn-tabview/tn-tabview.component.js +32 -5
  77. package/esm2015/components/tn-tinymce/tn-tinymce.component.js +4 -1
  78. package/esm2015/components/user-picker/user-picker.component.js +4 -1
  79. package/esm2015/components/vanban-picker/vanban-picker.component.js +4 -1
  80. package/fesm2015/tnx-shared.js +175 -21
  81. package/fesm2015/tnx-shared.js.map +1 -1
  82. package/package.json +2 -2
  83. 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
  }
@@ -15858,8 +15861,10 @@
15858
15861
  return [3 /*break*/, 4];
15859
15862
  }
15860
15863
  }
15861
- else if (childNode.control['_hidden'])
15862
- return [3 /*break*/, 4];
15864
+ else {
15865
+ if (childNode['_hidden'] || childNode.control['_hidden'])
15866
+ return [3 /*break*/, 4];
15867
+ }
15863
15868
  return [4 /*yield*/, this.validate(childNode, true)];
15864
15869
  case 2:
15865
15870
  if (!(_g.sent())) {
@@ -16046,6 +16051,13 @@
16046
16051
  });
16047
16052
  });
16048
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
+ };
16049
16061
  CrudFormComponent.prototype.handleControlReadyEvent = function (control, parentPath) {
16050
16062
  return __awaiter(this, void 0, void 0, function () {
16051
16063
  var parentNode;
@@ -16533,7 +16545,11 @@
16533
16545
  index = tableNode.childNodes.length;
16534
16546
  parentPath = tablePath + '[' + index + ']';
16535
16547
  data = {};
16548
+ if (control.autoGenerateId) {
16549
+ data.id = this._commonService.guid();
16550
+ }
16536
16551
  try {
16552
+ // Thêm id để ngăn render liên tục
16537
16553
  for (_d = __values(control.rowTemplate), _e = _d.next(); !_e.done; _e = _d.next()) {
16538
16554
  subControl = _e.value;
16539
16555
  this.initControlDefaultValue(data, subControl, parentPath);
@@ -16858,7 +16874,7 @@
16858
16874
  || (parentModel._status[control.field].hidden === undefined
16859
16875
  && (control.hidden
16860
16876
  || (control.hiddenCheck && control.hiddenCheck(this._minimizedData, currentNode))));
16861
- control['_hidden'] = !!result;
16877
+ currentNode['_hidden'] = !!result;
16862
16878
  return result;
16863
16879
  };
16864
16880
  CrudFormComponent.prototype.getContextTd = function (control, data, index, tablePath) {
@@ -16937,7 +16953,7 @@
16937
16953
  CrudFormComponent.decorators = [
16938
16954
  { type: i0.Component, args: [{
16939
16955
  selector: 'crud-form',
16940
- 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>",
16941
16957
  providers: [ComponentContextService],
16942
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}"]
16943
16959
  },] }
@@ -17030,7 +17046,12 @@
17030
17046
  }
17031
17047
  else {
17032
17048
  if (!this.schemaPath) {
17033
- 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
+ });
17034
17055
  }
17035
17056
  }
17036
17057
  this.keysPlus = keysPlus;
@@ -17062,6 +17083,22 @@
17062
17083
  }
17063
17084
  finally { if (e_32) throw e_32.error; }
17064
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
+ }
17065
17102
  }
17066
17103
  else if (isArray(model)) {
17067
17104
  var i = 0;
@@ -17151,6 +17188,16 @@
17151
17188
  enumerable: false,
17152
17189
  configurable: true
17153
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
+ });
17154
17201
  ControlTreeNode.prototype.setHidden = function (field, hidden) {
17155
17202
  var _this = this;
17156
17203
  if (hidden === void 0) { hidden = true; }
@@ -17164,13 +17211,31 @@
17164
17211
  }
17165
17212
  };
17166
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) {
17167
17232
  if (field.indexOf('.') > -1) {
17168
17233
  var childNode = this.getNodeByPath(this.modelPath + "." + field);
17169
17234
  var lastField = field.split('.').pop();
17170
- childNode.parentNode.data._status[lastField].hidden = hidden;
17235
+ childNode.parentNode.data._status[lastField][prop] = value;
17171
17236
  }
17172
17237
  else {
17173
- this.data._status[field].hidden = hidden;
17238
+ this.data._status[field][prop] = value;
17174
17239
  }
17175
17240
  };
17176
17241
  ControlTreeNode.prototype.getNodeByPath = function (modelPath) {
@@ -26043,6 +26108,7 @@
26043
26108
  _this._showSubLabel = true;
26044
26109
  _this.readyToReload = false;
26045
26110
  _this._readyStatus = {};
26111
+ _this.onInit = new i0.EventEmitter();
26046
26112
  _this.onSelect = new i0.EventEmitter();
26047
26113
  _this.dataChange = new i0.EventEmitter();
26048
26114
  _this.onReady = new i0.EventEmitter();
@@ -26159,6 +26225,7 @@
26159
26225
  if (this.viewMode) {
26160
26226
  this.getModelText();
26161
26227
  }
26228
+ this.onInit.emit(this);
26162
26229
  };
26163
26230
  AddressComponent.prototype.setDisabledControl = function () {
26164
26231
  var disabled = this._disabled ? true : null;
@@ -26264,6 +26331,7 @@
26264
26331
  viewMode: [{ type: i0.Input }],
26265
26332
  data: [{ type: i0.Input }],
26266
26333
  showSubLabel: [{ type: i0.Input }],
26334
+ onInit: [{ type: i0.Output }],
26267
26335
  onSelect: [{ type: i0.Output }],
26268
26336
  dataChange: [{ type: i0.Output }],
26269
26337
  onReady: [{ type: i0.Output }]
@@ -26331,6 +26399,7 @@
26331
26399
  this._deviceDetectorService = _deviceDetectorService;
26332
26400
  this.dataSource = [];
26333
26401
  this.control = new AutoCompleteControlSchema();
26402
+ this.onInit = new i0.EventEmitter();
26334
26403
  this.onValueChanged = new i0.EventEmitter();
26335
26404
  this.lstDataSuggest = [];
26336
26405
  this.hideTransitionOptions = '195ms ease-in';
@@ -26348,6 +26417,7 @@
26348
26417
  if (!this._deviceDetectorService.isDesktop()) {
26349
26418
  this.hideTransitionOptions = this.showTransitionOptions = '';
26350
26419
  }
26420
+ this.onInit.emit(this);
26351
26421
  };
26352
26422
  AutocompleteDatasourceComponent.prototype.handleBlur = function (event) {
26353
26423
  if (this.selectedValueBefore != this.selectedValue) {
@@ -26438,6 +26508,7 @@
26438
26508
  AutocompleteDatasourceComponent.propDecorators = {
26439
26509
  suggestions: [{ type: i0.Input }],
26440
26510
  control: [{ type: i0.Input }],
26511
+ onInit: [{ type: i0.Output }],
26441
26512
  onValueChanged: [{ type: i0.Output }]
26442
26513
  };
26443
26514
 
@@ -26488,6 +26559,7 @@
26488
26559
  height: 900,
26489
26560
  maximize: true
26490
26561
  });
26562
+ _this.onInit = new i0.EventEmitter();
26491
26563
  _this.onSelect = new i0.EventEmitter();
26492
26564
  _this.onUnSelect = new i0.EventEmitter();
26493
26565
  _this.onChanged = new i0.EventEmitter();
@@ -26526,6 +26598,7 @@
26526
26598
  this.buildFilterKeyword();
26527
26599
  this.buildSettingEntityPicker();
26528
26600
  this.updateFuncCheckReadOnlyItem();
26601
+ this.onInit.emit(this);
26529
26602
  };
26530
26603
  AutoCompletePickerComponent.prototype.updateFuncCheckReadOnlyItem = function () {
26531
26604
  if (this.readOnlyValues && this.readOnlyValues.length) {
@@ -27028,14 +27101,17 @@
27028
27101
  this.getDataSelectedValue(obj)
27029
27102
  .then(function (res) {
27030
27103
  _this.updateSelectedValue();
27031
- if (_this.hasValue && !_this.isFiredReady) {
27032
- _this.isFiredReady = true;
27033
- // 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
27034
- // Nếu có trường hợp nào khác thì cần phải xử lý khác
27035
- _this.onReady.emit();
27036
- }
27104
+ _this.checkFireReady();
27037
27105
  });
27038
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
+ };
27039
27115
  AutoCompletePickerComponent.prototype.registerOnChange = function (fn) {
27040
27116
  this.onChangeBase = fn;
27041
27117
  };
@@ -27070,6 +27146,7 @@
27070
27146
  disabled: [{ type: i0.Input }],
27071
27147
  popupSize: [{ type: i0.Input }],
27072
27148
  readOnlyValues: [{ type: i0.Input }],
27149
+ onInit: [{ type: i0.Output }],
27073
27150
  onSelect: [{ type: i0.Output }],
27074
27151
  onUnSelect: [{ type: i0.Output }],
27075
27152
  onChanged: [{ type: i0.Output }],
@@ -29507,6 +29584,7 @@
29507
29584
  this._dropDownService = _dropDownService;
29508
29585
  this._deviceDetectorService = _deviceDetectorService;
29509
29586
  this._styleClass = 'p-grid tn-check-box-list';
29587
+ this.onInit = new i0.EventEmitter();
29510
29588
  this.onSelect = new i0.EventEmitter();
29511
29589
  this.onReady = new i0.EventEmitter();
29512
29590
  this.dataSourceInternal = [];
@@ -29565,6 +29643,7 @@
29565
29643
  if (this.control.pColClass) {
29566
29644
  this.classCheckBox += " p-col-" + this.control.pColClass;
29567
29645
  }
29646
+ this.onInit.emit(this);
29568
29647
  };
29569
29648
  CheckBoxListComponent.prototype.bindDataSource = function (serviceUri, baseService) {
29570
29649
  var _this = this;
@@ -29698,6 +29777,7 @@
29698
29777
  control: [{ type: i0.Input }],
29699
29778
  dataSource: [{ type: i0.Input }],
29700
29779
  disabled: [{ type: i0.Input }],
29780
+ onInit: [{ type: i0.Output }],
29701
29781
  onSelect: [{ type: i0.Output }],
29702
29782
  onReady: [{ type: i0.Output }]
29703
29783
  };
@@ -29788,6 +29868,7 @@
29788
29868
  _this._coCauToChucService = _coCauToChucService;
29789
29869
  _this._translateService = _translateService;
29790
29870
  _this.disabled = false;
29871
+ _this.onInit = new i0.EventEmitter();
29791
29872
  _this.onChanged = new i0.EventEmitter();
29792
29873
  _this.onSelect = new i0.EventEmitter();
29793
29874
  _this.onUnSelect = new i0.EventEmitter();
@@ -29819,6 +29900,7 @@
29819
29900
  sort: false
29820
29901
  })
29821
29902
  ], mdWidth: 12 }));
29903
+ this.onInit.emit(this);
29822
29904
  };
29823
29905
  CoCauToChucPickerListComponent.prototype.handleFocus = function (evt) {
29824
29906
  this.onFocus.emit(evt);
@@ -29875,6 +29957,7 @@
29875
29957
  control: [{ type: i0.Input }],
29876
29958
  disabled: [{ type: i0.Input }],
29877
29959
  readOnlyValues: [{ type: i0.Input }],
29960
+ onInit: [{ type: i0.Output }],
29878
29961
  onChanged: [{ type: i0.Output }],
29879
29962
  onSelect: [{ type: i0.Output }],
29880
29963
  onUnSelect: [{ type: i0.Output }],
@@ -29899,6 +29982,7 @@
29899
29982
  this.showClear = false;
29900
29983
  this.disabledParentItem = true;
29901
29984
  this.rootParentId = null;
29985
+ this.onInit = new i0.EventEmitter();
29902
29986
  this.onChanged = new i0.EventEmitter();
29903
29987
  this.guidEmpty = '00000000-0000-0000-0000-000000000000';
29904
29988
  this.flashCacheParent = [];
@@ -29936,6 +30020,7 @@
29936
30020
  if (this.control)
29937
30021
  this.control._component = this;
29938
30022
  this.bindingUser();
30023
+ this.onInit.emit(this);
29939
30024
  };
29940
30025
  CoCauToChucPickerComponent.prototype.bindingUser = function () {
29941
30026
  var _this = this;
@@ -30084,6 +30169,7 @@
30084
30169
  showClear: [{ type: i0.Input }],
30085
30170
  disabledParentItem: [{ type: i0.Input }],
30086
30171
  rootParentId: [{ type: i0.Input }],
30172
+ onInit: [{ type: i0.Output }],
30087
30173
  onChanged: [{ type: i0.Output, args: ['onChanged',] }]
30088
30174
  };
30089
30175
 
@@ -34110,12 +34196,14 @@
34110
34196
  function CongViecPickerComponent(_injector, _notifierService) {
34111
34197
  var _this = _super.call(this, _injector) || this;
34112
34198
  _this._notifierService = _notifierService;
34199
+ _this.onInit = new i0.EventEmitter();
34113
34200
  _this.onChanged = new i0.EventEmitter();
34114
34201
  _this.idCongViecs = [];
34115
34202
  _this.formState = exports.FormState;
34116
34203
  return _this;
34117
34204
  }
34118
34205
  CongViecPickerComponent.prototype.ngOnInit = function () {
34206
+ this.onInit.emit(this);
34119
34207
  };
34120
34208
  CongViecPickerComponent.prototype.handleIdsChange = function (ids) {
34121
34209
  this.idCongViecs = ids;
@@ -34165,6 +34253,7 @@
34165
34253
  ]; };
34166
34254
  CongViecPickerComponent.propDecorators = {
34167
34255
  control: [{ type: i0.Input }],
34256
+ onInit: [{ type: i0.Output }],
34168
34257
  onChanged: [{ type: i0.Output }]
34169
34258
  };
34170
34259
 
@@ -34767,11 +34856,13 @@
34767
34856
  var DatetimePickerRangeComponent = /** @class */ (function () {
34768
34857
  function DatetimePickerRangeComponent() {
34769
34858
  this.control = new DateTimeRangeControlSchema();
34859
+ this.onInit = new i0.EventEmitter();
34770
34860
  this.onClose = new i0.EventEmitter();
34771
34861
  this.onChanged = new i0.EventEmitter();
34772
34862
  this._controlModelData = [undefined, undefined];
34773
34863
  }
34774
34864
  DatetimePickerRangeComponent.prototype.ngOnInit = function () {
34865
+ this.onInit.emit(this);
34775
34866
  };
34776
34867
  DatetimePickerRangeComponent.prototype.clear = function () {
34777
34868
  var re = (this._controlModelData[0] != null) || (this._controlModelData[1] != null);
@@ -34824,6 +34915,7 @@
34824
34915
  DatetimePickerRangeComponent.propDecorators = {
34825
34916
  control: [{ type: i0.Input }],
34826
34917
  disabled: [{ type: i0.Input }],
34918
+ onInit: [{ type: i0.Output }],
34827
34919
  onClose: [{ type: i0.Output }],
34828
34920
  onChanged: [{ type: i0.Output }]
34829
34921
  };
@@ -34836,6 +34928,7 @@
34836
34928
  this.hideTransitionOptions = '195ms ease-in';
34837
34929
  this.showTransitionOptions = '225ms ease-out';
34838
34930
  this.control = new DateTimeControlSchema();
34931
+ this.onInit = new i0.EventEmitter();
34839
34932
  this.onSelect = new i0.EventEmitter();
34840
34933
  this.onChanged = new i0.EventEmitter();
34841
34934
  this.onFocus = new i0.EventEmitter();
@@ -34843,6 +34936,7 @@
34843
34936
  this.onClose = new i0.EventEmitter();
34844
34937
  }
34845
34938
  DatetimePickerComponent.prototype.ngOnInit = function () {
34939
+ this.onInit.emit(this);
34846
34940
  };
34847
34941
  DatetimePickerComponent.prototype.writeValue = function (obj) {
34848
34942
  if (obj) {
@@ -35015,6 +35109,7 @@
35015
35109
  calendar: [{ type: i0.ViewChild, args: ['calendar', { static: true },] }],
35016
35110
  control: [{ type: i0.Input }],
35017
35111
  disabled: [{ type: i0.Input }],
35112
+ onInit: [{ type: i0.Output }],
35018
35113
  onSelect: [{ type: i0.Output }],
35019
35114
  onChanged: [{ type: i0.Output }],
35020
35115
  onFocus: [{ type: i0.Output }],
@@ -35033,6 +35128,7 @@
35033
35128
  _this.appendTo = 'body';
35034
35129
  _this.defaultSelectedStyleClass = 'custom-select-item';
35035
35130
  _this._itemSelectedStyleClass = _this.defaultSelectedStyleClass;
35131
+ _this.onInit = new i0.EventEmitter();
35036
35132
  _this.onChanged = new i0.EventEmitter();
35037
35133
  _this.onCollapse = new i0.EventEmitter();
35038
35134
  _this.onExpand = new i0.EventEmitter();
@@ -35196,6 +35292,7 @@
35196
35292
  if (this.control.onInit) {
35197
35293
  this.control.onInit(this);
35198
35294
  }
35295
+ this.onInit.emit(this);
35199
35296
  };
35200
35297
  DropdownComponent.prototype.setDefaultSetting = function () {
35201
35298
  var _this = this;
@@ -36003,6 +36100,7 @@
36003
36100
  dataSource: [{ type: i0.Input }],
36004
36101
  value: [{ type: i0.Input }],
36005
36102
  itemSelectedStyleClass: [{ type: i0.Input }],
36103
+ onInit: [{ type: i0.Output }],
36006
36104
  onChanged: [{ type: i0.Output }],
36007
36105
  onCollapse: [{ type: i0.Output }],
36008
36106
  onExpand: [{ type: i0.Output }],
@@ -37435,6 +37533,7 @@
37435
37533
  _this._translateService = _translateService;
37436
37534
  _this.disabled = false;
37437
37535
  _this.readOnly = false;
37536
+ _this.onInit = new i0.EventEmitter();
37438
37537
  _this.onSelect = new i0.EventEmitter();
37439
37538
  _this.onUnSelect = new i0.EventEmitter();
37440
37539
  _this.onChanged = new i0.EventEmitter();
@@ -37492,6 +37591,7 @@
37492
37591
  });
37493
37592
  this.advanceData.fields = this.getFields();
37494
37593
  _super.prototype.ngOnInit.call(this);
37594
+ this.onInit.emit(this);
37495
37595
  };
37496
37596
  EntityPickerComponent.prototype.selectEntity = function () {
37497
37597
  this.showDetailForm = true;
@@ -37681,6 +37781,7 @@
37681
37781
  disabled: [{ type: i0.Input }],
37682
37782
  readOnly: [{ type: i0.Input }],
37683
37783
  children: [{ type: i0.Input }],
37784
+ onInit: [{ type: i0.Output }],
37684
37785
  onSelect: [{ type: i0.Output, args: ['onSelect',] }],
37685
37786
  onUnSelect: [{ type: i0.Output, args: ['onUnSelect',] }],
37686
37787
  onChanged: [{ type: i0.Output, args: ['onChanged',] }]
@@ -38383,6 +38484,7 @@
38383
38484
  _this.inTaiLieuChung = false;
38384
38485
  _this.copyToFolderId = _this._commonService.guidEmpty();
38385
38486
  _this.multipleCheckWhenClickRow = true;
38487
+ _this.onInit = new i0.EventEmitter();
38386
38488
  _this.onReady = new i0.EventEmitter();
38387
38489
  _this.entityKeyChange = new i0.EventEmitter();
38388
38490
  _this.closePopup = new i0.EventEmitter();
@@ -38487,6 +38589,7 @@
38487
38589
  }
38488
38590
  this.reloadData();
38489
38591
  this.checkAndLoadRootFolderContent();
38592
+ this.onInit.emit(this);
38490
38593
  };
38491
38594
  FileManagerComponent.prototype.checkAndLoadRootFolderContent = function () {
38492
38595
  if (!this.inited || this.fileDataService)
@@ -39728,6 +39831,7 @@
39728
39831
  copyToFolderId: [{ type: i0.Input }],
39729
39832
  value: [{ type: i0.Input }],
39730
39833
  multipleCheckWhenClickRow: [{ type: i0.Input }],
39834
+ onInit: [{ type: i0.Output }],
39731
39835
  onReady: [{ type: i0.Output }],
39732
39836
  entityKeyChange: [{ type: i0.Output }],
39733
39837
  closePopup: [{ type: i0.Output }],
@@ -41206,6 +41310,7 @@
41206
41310
  _this.invalidFileLimitMessageSummary = 'Quá số lượng file cho phép, ';
41207
41311
  _this.invalidFileLimitMessageDetail = 'tối đa {0} file.';
41208
41312
  _this.sharedFolderType = exports.SharedFolderType.Tempt;
41313
+ _this.onInit = new i0.EventEmitter();
41209
41314
  _this.onSelect = new i0.EventEmitter();
41210
41315
  _this.onRemove = new i0.EventEmitter();
41211
41316
  _this.onChanged = new i0.EventEmitter();
@@ -41232,6 +41337,7 @@
41232
41337
  this.isDisabled = isDisabled;
41233
41338
  };
41234
41339
  FileUploadComponent.prototype.ngOnInit = function () {
41340
+ this.onInit.emit(this);
41235
41341
  };
41236
41342
  FileUploadComponent.prototype.getFile = function () {
41237
41343
  return __awaiter(this, void 0, void 0, function () {
@@ -41386,6 +41492,7 @@
41386
41492
  invalidFileLimitMessageSummary: [{ type: i0.Input }],
41387
41493
  invalidFileLimitMessageDetail: [{ type: i0.Input }],
41388
41494
  sharedFolderType: [{ type: i0.Input }],
41495
+ onInit: [{ type: i0.Output }],
41389
41496
  onSelect: [{ type: i0.Output }],
41390
41497
  onRemove: [{ type: i0.Output }],
41391
41498
  onChanged: [{ type: i0.Output }]
@@ -41508,6 +41615,7 @@
41508
41615
  this.viewMode = false;
41509
41616
  this.inputStyleClass = '';
41510
41617
  this.autoFormat = true;
41618
+ this.onInit = new i0.EventEmitter();
41511
41619
  this.onFocus = new i0.EventEmitter();
41512
41620
  this.onBlur = new i0.EventEmitter();
41513
41621
  this.onChanged = new i0.EventEmitter();
@@ -41526,6 +41634,7 @@
41526
41634
  if (!this.autoFormat) {
41527
41635
  this.thousandSeperator = '';
41528
41636
  }
41637
+ this.onInit.emit(this);
41529
41638
  };
41530
41639
  MaskComponent.prototype.writeValue = function (obj) {
41531
41640
  if (obj) {
@@ -41625,6 +41734,7 @@
41625
41734
  viewMode: [{ type: i0.Input }],
41626
41735
  inputStyleClass: [{ type: i0.Input }],
41627
41736
  autoFormat: [{ type: i0.Input }],
41737
+ onInit: [{ type: i0.Output }],
41628
41738
  onFocus: [{ type: i0.Output }],
41629
41739
  onBlur: [{ type: i0.Output }],
41630
41740
  onChanged: [{ type: i0.Output }]
@@ -41690,6 +41800,7 @@
41690
41800
  this.suffix = '';
41691
41801
  this.prefix = '';
41692
41802
  this.decimalPlaces = 2;
41803
+ this.onInit = new i0.EventEmitter();
41693
41804
  this.focus = new i0.EventEmitter();
41694
41805
  this.enterSmart = new i0.EventEmitter();
41695
41806
  this.enter = new i0.EventEmitter();
@@ -41697,6 +41808,7 @@
41697
41808
  this.change = new i0.EventEmitter();
41698
41809
  }
41699
41810
  NumberPickerRangeComponent.prototype.ngOnInit = function () {
41811
+ this.onInit.emit(this);
41700
41812
  };
41701
41813
  NumberPickerRangeComponent.prototype.clear = function () {
41702
41814
  var re = (this.model[0] != null && this.model[0] !== '') || (this.model[1] != null && this.model[1] !== '');
@@ -41809,6 +41921,7 @@
41809
41921
  min: [{ type: i0.Input }],
41810
41922
  max: [{ type: i0.Input }],
41811
41923
  decimalPlaces: [{ type: i0.Input }],
41924
+ onInit: [{ type: i0.Output }],
41812
41925
  focus: [{ type: i0.Output }],
41813
41926
  enterSmart: [{ type: i0.Output }],
41814
41927
  enter: [{ type: i0.Output }],
@@ -42241,6 +42354,7 @@
42241
42354
  function RadioButtonListComponent(_crudService, _deviceDetectorService) {
42242
42355
  this._crudService = _crudService;
42243
42356
  this._deviceDetectorService = _deviceDetectorService;
42357
+ this.onInit = new i0.EventEmitter();
42244
42358
  this.valueChange = new i0.EventEmitter();
42245
42359
  this.onChanged = new i0.EventEmitter();
42246
42360
  this.onDataSourceLoaded = new i0.EventEmitter();
@@ -42282,6 +42396,7 @@
42282
42396
  if (!this._deviceDetectorService.isDesktop()) {
42283
42397
  this.hideTransitionOptions = this.showTransitionOptions = '';
42284
42398
  }
42399
+ this.onInit.emit(this);
42285
42400
  };
42286
42401
  RadioButtonListComponent.prototype.setDefaultSetting = function () {
42287
42402
  var _this = this;
@@ -42533,6 +42648,7 @@
42533
42648
  dataSource: [{ type: i0.Input }],
42534
42649
  value: [{ type: i0.Input }],
42535
42650
  disabled: [{ type: i0.Input }],
42651
+ onInit: [{ type: i0.Output }],
42536
42652
  valueChange: [{ type: i0.Output }],
42537
42653
  onChanged: [{ type: i0.Output }],
42538
42654
  onDataSourceLoaded: [{ type: i0.Output }],
@@ -42557,6 +42673,7 @@
42557
42673
  _this.serviceCode = '';
42558
42674
  _this.entity = '';
42559
42675
  _this.chooseLabel = 'Chọn';
42676
+ _this.onInit = new i0.EventEmitter();
42560
42677
  _this.onSelect = new i0.EventEmitter();
42561
42678
  _this.onRemove = new i0.EventEmitter();
42562
42679
  _this.onChanged = new i0.EventEmitter();
@@ -42600,6 +42717,7 @@
42600
42717
  ServiceFileUploadComponent.prototype.ngOnInit = function () {
42601
42718
  this.setUp();
42602
42719
  this.subscribe();
42720
+ this.onInit.emit(this);
42603
42721
  };
42604
42722
  ServiceFileUploadComponent.prototype.setUp = function () {
42605
42723
  this.accept = this.control.accept;
@@ -42976,6 +43094,7 @@
42976
43094
  entity: [{ type: i0.Input }],
42977
43095
  entityKey: [{ type: i0.Input }],
42978
43096
  chooseLabel: [{ type: i0.Input }],
43097
+ onInit: [{ type: i0.Output }],
42979
43098
  onSelect: [{ type: i0.Output }],
42980
43099
  onRemove: [{ type: i0.Output }],
42981
43100
  onChanged: [{ type: i0.Output }]
@@ -47762,6 +47881,7 @@
47762
47881
  var _this = _super.call(this, injector) || this;
47763
47882
  _this.disabled = false;
47764
47883
  _this.appendTo = 'body';
47884
+ _this.onInit = new i0.EventEmitter();
47765
47885
  _this.change = new i0.EventEmitter();
47766
47886
  return _this;
47767
47887
  }
@@ -47784,7 +47904,7 @@
47784
47904
  this.disabled = isDisabled;
47785
47905
  };
47786
47906
  TnColorPickerComponent.prototype.ngOnInit = function () {
47787
- // this.model.value = '#ffffff';
47907
+ this.onInit.emit(this);
47788
47908
  };
47789
47909
  TnColorPickerComponent.prototype.changePicker = function (evt) {
47790
47910
  this.model.inputValue = this.model.value;
@@ -47819,6 +47939,7 @@
47819
47939
  TnColorPickerComponent.propDecorators = {
47820
47940
  disabled: [{ type: i0.Input }],
47821
47941
  appendTo: [{ type: i0.Input }],
47942
+ onInit: [{ type: i0.Output }],
47822
47943
  change: [{ type: i0.Output }]
47823
47944
  };
47824
47945
 
@@ -48295,15 +48416,17 @@
48295
48416
  function TnTabViewComponent(_commonService) {
48296
48417
  this._commonService = _commonService;
48297
48418
  this.data = [];
48419
+ this._hiddenTab = [];
48420
+ this.hiddenInfo = {};
48298
48421
  this.allowViewAll = false;
48299
48422
  this.isDynamicHeight = false;
48300
- this.useScrollbar = false;
48301
48423
  this.onTabChange = new i0.EventEmitter();
48302
48424
  this.activeIndexChange = new i0.EventEmitter();
48303
48425
  this.template = {};
48304
48426
  this.onlyIcon = false;
48305
48427
  this.styleClass = 'tn-tabview-beauty';
48306
48428
  this.height = '100%';
48429
+ this.ready = false;
48307
48430
  }
48308
48431
  Object.defineProperty(TnTabViewComponent.prototype, "vertical", {
48309
48432
  set: function (value) {
@@ -48314,6 +48437,21 @@
48314
48437
  configurable: true
48315
48438
  });
48316
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
+ });
48317
48455
  Object.defineProperty(TnTabViewComponent.prototype, "activeIndex", {
48318
48456
  set: function (value) {
48319
48457
  this.currentTabIndex = value;
@@ -48333,6 +48471,8 @@
48333
48471
  }
48334
48472
  this.currentTabIndex = currentTabIndex;
48335
48473
  }
48474
+ this.ready = true;
48475
+ this.setHiddenInfo();
48336
48476
  };
48337
48477
  TnTabViewComponent.prototype.ngAfterContentInit = function () {
48338
48478
  var _this = this;
@@ -48345,6 +48485,13 @@
48345
48485
  });
48346
48486
  this.setStyleClass();
48347
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
+ };
48348
48495
  TnTabViewComponent.prototype.setStyleClass = function () {
48349
48496
  var result = 'tn-tabview-beauty';
48350
48497
  if (this._vertical) {
@@ -48358,14 +48505,20 @@
48358
48505
  TnTabViewComponent.prototype.handleTabChange = function (evt) {
48359
48506
  this.currentTabIndex = evt.index;
48360
48507
  this.activeIndexChange.emit(this.currentTabIndex);
48361
- 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
+ });
48362
48515
  };
48363
48516
  return TnTabViewComponent;
48364
48517
  }());
48365
48518
  TnTabViewComponent.decorators = [
48366
48519
  { type: i0.Component, args: [{
48367
48520
  selector: 'tn-tabview',
48368
- 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>",
48369
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}}"]
48370
48523
  },] }
48371
48524
  ];
@@ -48376,10 +48529,10 @@
48376
48529
  children: [{ type: i0.ContentChildren, args: [i0.TemplateRef,] }],
48377
48530
  vertical: [{ type: i0.Input }],
48378
48531
  data: [{ type: i0.Input }],
48532
+ hiddenTab: [{ type: i0.Input }],
48379
48533
  allowViewAll: [{ type: i0.Input }],
48380
48534
  activeIndex: [{ type: i0.Input }],
48381
48535
  isDynamicHeight: [{ type: i0.Input }],
48382
- useScrollbar: [{ type: i0.Input }],
48383
48536
  onTabChange: [{ type: i0.Output }],
48384
48537
  activeIndexChange: [{ type: i0.Output }]
48385
48538
  };
@@ -48423,6 +48576,7 @@
48423
48576
  _this.required = false;
48424
48577
  _this.height = 200;
48425
48578
  _this.field = '';
48579
+ _this.onInit = new i0.EventEmitter();
48426
48580
  _this.keydown = new i0.EventEmitter();
48427
48581
  _this.onBlur = new i0.EventEmitter();
48428
48582
  _this.onChanged = new i0.EventEmitter();
@@ -48451,6 +48605,7 @@
48451
48605
  }
48452
48606
  TnTinymceComponent.prototype.ngOnInit = function () {
48453
48607
  this.subscribeContentInsert();
48608
+ this.onInit.emit(this);
48454
48609
  };
48455
48610
  TnTinymceComponent.prototype.ngAfterViewInit = function () {
48456
48611
  var mode = this.mode;
@@ -48808,6 +48963,7 @@
48808
48963
  height: [{ type: i0.Input }],
48809
48964
  field: [{ type: i0.Input }],
48810
48965
  languageCode: [{ type: i0.Input }],
48966
+ onInit: [{ type: i0.Output }],
48811
48967
  keydown: [{ type: i0.Output }],
48812
48968
  onBlur: [{ type: i0.Output }],
48813
48969
  onChanged: [{ type: i0.Output }]
@@ -49173,6 +49329,7 @@
49173
49329
  });
49174
49330
  _this.multiple = false;
49175
49331
  _this.disabled = false;
49332
+ _this.onInit = new i0.EventEmitter();
49176
49333
  _this.onSelect = new i0.EventEmitter();
49177
49334
  _this.onUnSelect = new i0.EventEmitter();
49178
49335
  _this.onChanged = new i0.EventEmitter();
@@ -49284,6 +49441,7 @@
49284
49441
  this.createSchemaSearch();
49285
49442
  this.updateFuncCheckReadOnlyItem();
49286
49443
  this.onReady.emit();
49444
+ this.onInit.emit(this);
49287
49445
  };
49288
49446
  UserPickerComponent.prototype.updateFuncCheckReadOnlyItem = function () {
49289
49447
  if (this.readOnlyValues && this.readOnlyValues.length) {
@@ -49804,6 +49962,7 @@
49804
49962
  multiple: [{ type: i0.Input }],
49805
49963
  disabled: [{ type: i0.Input }],
49806
49964
  readOnlyValues: [{ type: i0.Input }],
49965
+ onInit: [{ type: i0.Output }],
49807
49966
  onSelect: [{ type: i0.Output, args: ['onSelect',] }],
49808
49967
  onUnSelect: [{ type: i0.Output, args: ['onUnSelect',] }],
49809
49968
  onChanged: [{ type: i0.Output, args: ['onChanged',] }],
@@ -50309,6 +50468,7 @@
50309
50468
  var _this = _super.call(this, _injector) || this;
50310
50469
  _this._vanBanDenService = _vanBanDenService;
50311
50470
  _this._vanBanDiService = _vanBanDiService;
50471
+ _this.onInit = new i0.EventEmitter();
50312
50472
  _this.onChanged = new i0.EventEmitter();
50313
50473
  _this.onReady = new i0.EventEmitter();
50314
50474
  _this.environment = {};
@@ -50355,6 +50515,7 @@
50355
50515
  this.setting.fieldSearchText = ['code', 'name'];
50356
50516
  this.setting.objectName = ' văn bản';
50357
50517
  _super.prototype.ngOnInit.call(this);
50518
+ this.onInit.emit(this);
50358
50519
  };
50359
50520
  VanBanPickerComponent.prototype.getVanBanDen = function (originGridInfo) {
50360
50521
  var _this = this;
@@ -50592,6 +50753,7 @@
50592
50753
  loaiVanBan: [{ type: i0.Input }],
50593
50754
  readOnly: [{ type: i0.Input }],
50594
50755
  control: [{ type: i0.Input }],
50756
+ onInit: [{ type: i0.Output }],
50595
50757
  onChanged: [{ type: i0.Output }],
50596
50758
  onReady: [{ type: i0.Output }]
50597
50759
  };
@@ -57104,6 +57266,7 @@
57104
57266
  __extends(ReferenceTextBoxComponent, _super);
57105
57267
  function ReferenceTextBoxComponent(injector) {
57106
57268
  var _this = _super.call(this, injector) || this;
57269
+ _this.onInit = new i0.EventEmitter();
57107
57270
  _this.data = '';
57108
57271
  _this.ready = false;
57109
57272
  return _this;
@@ -57123,6 +57286,7 @@
57123
57286
  this.control._component = this;
57124
57287
  this.ready = true;
57125
57288
  this.checkAndGetData();
57289
+ this.onInit.emit(this);
57126
57290
  };
57127
57291
  ReferenceTextBoxComponent.prototype.checkAndGetData = function () {
57128
57292
  return __awaiter(this, void 0, void 0, function () {
@@ -57176,7 +57340,8 @@
57176
57340
  ]; };
57177
57341
  ReferenceTextBoxComponent.propDecorators = {
57178
57342
  control: [{ type: i0.Input }],
57179
- value: [{ type: i0.Input }]
57343
+ value: [{ type: i0.Input }],
57344
+ onInit: [{ type: i0.Output }]
57180
57345
  };
57181
57346
 
57182
57347
  var LoadingPageV1Component = /** @class */ (function () {