@sdcorejs/angular 19.0.7 → 19.0.9

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 (93) hide show
  1. package/README.md +8 -2
  2. package/assets/STYLE-GUIDE.md +13 -0
  3. package/components/autoid-inspector/index.d.ts +1 -7
  4. package/components/autoid-inspector/src/autoid-inspector.component.d.ts +22 -8
  5. package/components/autoid-inspector/src/models/autoid-element.model.d.ts +7 -7
  6. package/components/autoid-inspector/src/models/autoid-export-format.model.d.ts +17 -8
  7. package/components/autoid-inspector/src/models/autoid-inspector-config.model.d.ts +10 -5
  8. package/components/autoid-inspector/src/services/autoid-audit.service.d.ts +4 -4
  9. package/components/autoid-inspector/src/services/autoid-export.service.d.ts +7 -6
  10. package/components/autoid-inspector/src/services/autoid-scanner.service.d.ts +3 -3
  11. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +0 -1
  12. package/components/table/src/services/table-filter/table-filter.service.d.ts +1 -0
  13. package/components/table/src/services/table-local/table-local.util.d.ts +19 -0
  14. package/components/table/src/services/table-reorder/table-reorder.util.d.ts +29 -0
  15. package/components/table/src/services/table-selection/table-selection.util.d.ts +8 -0
  16. package/components/table/src/services/tree/tree.util.d.ts +10 -1
  17. package/components/table/src/table.component.d.ts +6 -10
  18. package/fesm2022/sdcorejs-angular-components-anchor.mjs +2 -3
  19. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +195 -25
  21. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-badge.mjs +2 -2
  23. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  25. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +5 -6
  27. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-editor.mjs +4 -4
  29. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +4 -4
  31. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  33. package/fesm2022/sdcorejs-angular-components-inform.mjs +2 -2
  34. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  35. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +2 -2
  36. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-components-modal.mjs +2 -2
  38. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
  40. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  41. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +2 -2
  42. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  43. package/fesm2022/sdcorejs-angular-components-preview.mjs +3 -3
  44. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  45. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +8 -8
  46. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  47. package/fesm2022/sdcorejs-angular-components-section.mjs +2 -2
  48. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  49. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +6 -4
  50. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  51. package/fesm2022/sdcorejs-angular-components-table.mjs +772 -810
  52. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  53. package/fesm2022/sdcorejs-angular-components-tree.mjs +2 -2
  54. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  55. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +6 -7
  56. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  57. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +4 -5
  58. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  59. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +3 -3
  60. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  61. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +4 -4
  62. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  63. package/fesm2022/sdcorejs-angular-forms-chip.mjs +4 -4
  64. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  65. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -9
  66. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  67. package/fesm2022/sdcorejs-angular-forms-date.mjs +5 -6
  68. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  69. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +5 -6
  70. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  71. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +2 -2
  72. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
  73. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +5 -6
  74. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  75. package/fesm2022/sdcorejs-angular-forms-input.mjs +3 -3
  76. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  77. package/fesm2022/sdcorejs-angular-forms-radio.mjs +3 -4
  78. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  79. package/fesm2022/sdcorejs-angular-forms-select.mjs +2 -2
  80. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  81. package/fesm2022/sdcorejs-angular-forms-switch.mjs +3 -4
  82. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  83. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +5 -7
  84. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  85. package/fesm2022/sdcorejs-angular-modules-layout.mjs +2 -3
  86. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  87. package/fesm2022/sdcorejs-angular-services-api.mjs +1 -2
  88. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  89. package/fesm2022/sdcorejs-angular-services-confirm.mjs +2 -2
  90. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  91. package/forms/date-range/src/date-range.component.d.ts +2 -0
  92. package/forms/input-number/src/input-number.component.d.ts +0 -1
  93. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { viewChild, contentChild, inject, ChangeDetectorRef, input, computed, booleanAttribute, model, output, EventEmitter, effect, untracked, Output, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { Utilities } from '@sdcorejs/utils/fns';
3
4
  import * as i2 from '@angular/forms';
4
5
  import { NgForm, FormGroup, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
- import * as uuid from 'uuid';
6
6
  import * as i1 from '@angular/common';
7
7
  import { CommonModule } from '@angular/common';
8
8
  import { MatButtonModule } from '@angular/material/button';
@@ -37,7 +37,7 @@ class SdInputNumberErrotStateMatcher {
37
37
  }
38
38
  }
39
39
  class SdInputNumber {
40
- id = `I${uuid.v4()}`;
40
+ id = `I${Utilities.generateUuid()}`;
41
41
  // ==========================================
42
42
  // 1. SIGNAL QUERIES
43
43
  // ==========================================
@@ -53,7 +53,6 @@ class SdInputNumber {
53
53
  // ==========================================
54
54
  ref = inject(ChangeDetectorRef);
55
55
  coreConfiguration = inject(SD_CORE_CONFIGURATION, { optional: true });
56
- formatNumberPipe = inject(SdFormatNumberPipe);
57
56
  formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });
58
57
  #i18n = inject(I18nService);
59
58
  // ==========================================
@@ -72,7 +71,7 @@ class SdInputNumber {
72
71
  const msg = this.errorMessage();
73
72
  return msg && msg.length > 0 ? msg : null;
74
73
  });
75
- name = input(uuid.v4());
74
+ name = input(Utilities.generateUuid());
76
75
  size = input('md');
77
76
  // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)
78
77
  form = input(undefined, {
@@ -441,7 +440,7 @@ class SdInputNumber {
441
440
  }, 100);
442
441
  };
443
442
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdInputNumber, deps: [], target: i0.ɵɵFactoryTarget.Component });
444
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdInputNumber, isStandalone: true, selector: "sd-input-number", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, blurOnEnter: { classPropertyName: "blurOnEnter", publicName: "blurOnEnter", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: true, isRequired: false, transformFunction: null }, appearanceInput: { classPropertyName: "appearanceInput", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, floatLabel: { classPropertyName: "floatLabel", publicName: "floatLabel", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdFocus: "sdFocus", sdBlur: "sdBlur", keyupEnter: "keyupEnter", cleared: "cleared", sdFocusForceBlur: "sdFocusForceBlur" }, host: { properties: { "class.sd-has-label": "!!label()", "class.sd-viewed": "isViewed() || isInline()" } }, queries: [{ propertyName: "sdLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "sdValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true, isSignal: true }, { propertyName: "sdSuffixDef", first: true, predicate: SdSuffixDefDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "control", first: true, predicate: ["control"], descendants: true, isSignal: true }, { propertyName: "inlineRef", first: true, predicate: SdInlineText, descendants: true, isSignal: true }], ngImport: i0, template: "@let lbl = label();\n@let app = appearance();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage();\n@let hText = helperText();\n@let fmt = format();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"lbl\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | sdFormatNumber : undefined : fmt\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"inputControl\"\n [placeholder]=\"placeholder() || lbl || ''\"\n [clearable]=\"!required()\"\n [autoId]=\"autoId()\"\n [state]=\"formControl.invalid && formControl.touched ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (sdKeydown)=\"onKeydown($event)\"\n (sdPaste)=\"onPaste($event)\"\n (sdCompositionStart)=\"onCompositionStart($event)\"\n (sdCompositionEnd)=\"onCompositionEnd($event)\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!app) {\n <ng-content select=\"[sdLabel]\">\n @if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"required()\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"hideErr\"\n [appearance]=\"app!\"\n [floatLabel]=\"floatLabel()\">\n @if (app && lbl) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ lbl }}</span>\n @if (hText) {\n <mat-icon [matTooltip]=\"hText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"inputControl\"\n #control\n matInput\n [placeholder]=\"placeholder() || lbl || ''\"\n [errorStateMatcher]=\"matcher\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\"\n [required]=\"required()\"\n [readonly]=\"readonly()\"\n [autocomplete]=\"id\"\n (paste)=\"onPaste($event)\"\n autocorrect=\"off\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\" />\n\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n\n <!-- why: n\u00FAt clear render TR\u01AF\u1EDAC error icon. Clear hover-gated (visibility:hidden) v\u1EABn\n chi\u1EBFm ch\u1ED7 trong layout \u2192 n\u1EBFu \u0111\u1EE9ng sau s\u1EBD \u0111\u1EA9y error icon \"t\u1EE5t v\u00E0o trong\". \u0110\u1EE9ng tr\u01B0\u1EDBc\n th\u00EC error icon n\u1EB1m s\u00E1t m\u00E9p ph\u1EA3i, clear gi\u1EEF slot v\u00F4 h\u00ECnh b\u00EAn tr\u00E1i. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container [ngTemplateOutlet]=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-black100)}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-black400)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}.sd-md:hover .btn-copy{visibility:visible}.btn-copy{visibility:hidden;background:#e9e9e9!important;line-height:26px!important;margin-bottom:3px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "pipe", type: SdFormatNumberPipe, name: "sdFormatNumber" }, { kind: "component", type: SdView, selector: "sd-view", inputs: ["label", "value", "display", "hyperlink", "labelTemplate", "valueTemplate", "selectedItems"] }, { kind: "component", type: SdInlineText, selector: "sd-inline-text", inputs: ["value", "control", "placeholder", "disabled", "clearable", "state", "chrome", "autoId", "autofocus", "minSize"], outputs: ["valueChange", "cleared", "keyupEnter", "keydownEscape", "sdFocus", "sdBlur", "sdKeydown", "sdPaste", "sdCompositionStart", "sdCompositionEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
443
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdInputNumber, isStandalone: true, selector: "sd-input-number", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, blurOnEnter: { classPropertyName: "blurOnEnter", publicName: "blurOnEnter", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: true, isRequired: false, transformFunction: null }, appearanceInput: { classPropertyName: "appearanceInput", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, floatLabel: { classPropertyName: "floatLabel", publicName: "floatLabel", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdFocus: "sdFocus", sdBlur: "sdBlur", keyupEnter: "keyupEnter", cleared: "cleared", sdFocusForceBlur: "sdFocusForceBlur" }, host: { properties: { "class.sd-has-label": "!!label()", "class.sd-viewed": "isViewed() || isInline()" } }, queries: [{ propertyName: "sdLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "sdValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true, isSignal: true }, { propertyName: "sdSuffixDef", first: true, predicate: SdSuffixDefDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "control", first: true, predicate: ["control"], descendants: true, isSignal: true }, { propertyName: "inlineRef", first: true, predicate: SdInlineText, descendants: true, isSignal: true }], ngImport: i0, template: "@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _format = format();\n@let _required = required();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | sdFormatNumber : undefined : _format\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"inputControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n [clearable]=\"!_required\"\n [autoId]=\"autoId()\"\n [state]=\"formControl.invalid && formControl.touched ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (sdKeydown)=\"onKeydown($event)\"\n (sdPaste)=\"onPaste($event)\"\n (sdCompositionStart)=\"onCompositionStart($event)\"\n (sdCompositionEnd)=\"onCompositionEnd($event)\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"inputControl\"\n #control\n matInput\n [placeholder]=\"placeholder() || _label || ''\"\n [errorStateMatcher]=\"matcher\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\"\n [required]=\"_required\"\n [readonly]=\"readonly()\"\n [autocomplete]=\"id\"\n (paste)=\"onPaste($event)\"\n autocorrect=\"off\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\" />\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n <!-- why: n\u00FAt clear render TR\u01AF\u1EDAC error icon. Clear hover-gated (visibility:hidden) v\u1EABn\n chi\u1EBFm ch\u1ED7 trong layout -> n\u1EBFu \u0111\u1EE9ng sau s\u1EBD \u0111\u1EA9y error icon \"t\u1EE5t v\u00E0o trong\". \u0110\u1EE9ng tr\u01B0\u1EDBc\n th\u00EC error icon n\u1EB1m s\u00E1t m\u00E9p ph\u1EA3i, clear gi\u1EEF slot v\u00F4 h\u00ECnh b\u00EAn tr\u00E1i. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container [ngTemplateOutlet]=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-black100)}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-black400)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}.sd-md:hover .btn-copy{visibility:visible}.btn-copy{visibility:hidden;background:#e9e9e9!important;line-height:26px!important;margin-bottom:3px;font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "pipe", type: SdFormatNumberPipe, name: "sdFormatNumber" }, { kind: "component", type: SdView, selector: "sd-view", inputs: ["label", "value", "display", "hyperlink", "labelTemplate", "valueTemplate", "selectedItems"] }, { kind: "component", type: SdInlineText, selector: "sd-inline-text", inputs: ["value", "control", "placeholder", "disabled", "clearable", "state", "chrome", "autoId", "autofocus", "minSize"], outputs: ["valueChange", "cleared", "keyupEnter", "keydownEscape", "sdFocus", "sdBlur", "sdKeydown", "sdPaste", "sdCompositionStart", "sdCompositionEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
445
444
  }
446
445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdInputNumber, decorators: [{
447
446
  type: Component,
@@ -458,7 +457,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
458
457
  SdFormatNumberPipe,
459
458
  SdView,
460
459
  SdInlineText,
461
- ], template: "@let lbl = label();\n@let app = appearance();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage();\n@let hText = helperText();\n@let fmt = format();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"lbl\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | sdFormatNumber : undefined : fmt\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"inputControl\"\n [placeholder]=\"placeholder() || lbl || ''\"\n [clearable]=\"!required()\"\n [autoId]=\"autoId()\"\n [state]=\"formControl.invalid && formControl.touched ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (sdKeydown)=\"onKeydown($event)\"\n (sdPaste)=\"onPaste($event)\"\n (sdCompositionStart)=\"onCompositionStart($event)\"\n (sdCompositionEnd)=\"onCompositionEnd($event)\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!app) {\n <ng-content select=\"[sdLabel]\">\n @if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"required()\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"hideErr\"\n [appearance]=\"app!\"\n [floatLabel]=\"floatLabel()\">\n @if (app && lbl) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ lbl }}</span>\n @if (hText) {\n <mat-icon [matTooltip]=\"hText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"inputControl\"\n #control\n matInput\n [placeholder]=\"placeholder() || lbl || ''\"\n [errorStateMatcher]=\"matcher\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\"\n [required]=\"required()\"\n [readonly]=\"readonly()\"\n [autocomplete]=\"id\"\n (paste)=\"onPaste($event)\"\n autocorrect=\"off\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\" />\n\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n\n <!-- why: n\u00FAt clear render TR\u01AF\u1EDAC error icon. Clear hover-gated (visibility:hidden) v\u1EABn\n chi\u1EBFm ch\u1ED7 trong layout \u2192 n\u1EBFu \u0111\u1EE9ng sau s\u1EBD \u0111\u1EA9y error icon \"t\u1EE5t v\u00E0o trong\". \u0110\u1EE9ng tr\u01B0\u1EDBc\n th\u00EC error icon n\u1EB1m s\u00E1t m\u00E9p ph\u1EA3i, clear gi\u1EEF slot v\u00F4 h\u00ECnh b\u00EAn tr\u00E1i. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container [ngTemplateOutlet]=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-black100)}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-black400)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}.sd-md:hover .btn-copy{visibility:visible}.btn-copy{visibility:hidden;background:#e9e9e9!important;line-height:26px!important;margin-bottom:3px;font-size:12px}\n"] }]
460
+ ], template: "@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _format = format();\n@let _required = required();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | sdFormatNumber : undefined : _format\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"inputControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n [clearable]=\"!_required\"\n [autoId]=\"autoId()\"\n [state]=\"formControl.invalid && formControl.touched ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (sdKeydown)=\"onKeydown($event)\"\n (sdPaste)=\"onPaste($event)\"\n (sdCompositionStart)=\"onCompositionStart($event)\"\n (sdCompositionEnd)=\"onCompositionEnd($event)\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"inputControl\"\n #control\n matInput\n [placeholder]=\"placeholder() || _label || ''\"\n [errorStateMatcher]=\"matcher\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\"\n [required]=\"_required\"\n [readonly]=\"readonly()\"\n [autocomplete]=\"id\"\n (paste)=\"onPaste($event)\"\n autocorrect=\"off\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\" />\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n <!-- why: n\u00FAt clear render TR\u01AF\u1EDAC error icon. Clear hover-gated (visibility:hidden) v\u1EABn\n chi\u1EBFm ch\u1ED7 trong layout -> n\u1EBFu \u0111\u1EE9ng sau s\u1EBD \u0111\u1EA9y error icon \"t\u1EE5t v\u00E0o trong\". \u0110\u1EE9ng tr\u01B0\u1EDBc\n th\u00EC error icon n\u1EB1m s\u00E1t m\u00E9p ph\u1EA3i, clear gi\u1EEF slot v\u00F4 h\u00ECnh b\u00EAn tr\u00E1i. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container [ngTemplateOutlet]=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-light{color:var(--sd-light)!important}.bg-light{background:var(--sd-light)!important}.border-light{border-color:var(--sd-light)!important}.text-dark{color:var(--sd-dark)!important}.bg-dark{background:var(--sd-dark)!important}.border-dark{border-color:var(--sd-dark)!important}.text-black500{color:var(--sd-black500)!important}.bg-black500{background:var(--sd-black500)!important}.border-black500{border-color:var(--sd-black500)!important}.text-black400{color:var(--sd-black400)!important}.bg-black400{background:var(--sd-black400)!important}.border-black400{border-color:var(--sd-black400)!important}.text-black300{color:var(--sd-black300)!important}.bg-black300{background:var(--sd-black300)!important}.border-black300{border-color:var(--sd-black300)!important}.text-black200{color:var(--sd-black200)!important}.bg-black200{background:var(--sd-black200)!important}.border-black200{border-color:var(--sd-black200)!important}.text-black100{color:var(--sd-black100)!important}.bg-black100{background:var(--sd-black100)!important}.border-black100{border-color:var(--sd-black100)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-black100)}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-black400)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}.sd-md:hover .btn-copy{visibility:visible}.btn-copy{visibility:hidden;background:#e9e9e9!important;line-height:26px!important;margin-bottom:3px;font-size:12px}\n"] }]
462
461
  }], ctorParameters: () => [], propDecorators: { sdFocusForceBlur: [{
463
462
  type: Output
464
463
  }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-forms-input-number.mjs","sources":["../../../projects/sdcorejs-angular/forms/input-number/src/input-number.component.ts","../../../projects/sdcorejs-angular/forms/input-number/src/input-number.component.html","../../../projects/sdcorejs-angular/forms/input-number/sdcorejs-angular-forms-input-number.ts"],"sourcesContent":["import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n Output,\n} from '@angular/core';\nimport {\n AsyncValidatorFn,\n FormControl,\n FormGroup,\n FormGroupDirective,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidatorFn,\n Validators,\n} from '@angular/forms';\nimport * as uuid from 'uuid';\n\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { ISdCoreConfiguration, SD_CORE_CONFIGURATION } from '@sdcorejs/angular/configurations';\nimport { SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport {\n HandleSdCustomValidator,\n ISdFormConfiguration,\n SD_FORM_CONFIGURATION,\n SdCustomValidator,\n SdFormControl,\n SdInlineErrorValidator,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { SdFormatNumberPipe } from '@sdcorejs/angular/pipes';\nimport { NumberUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { Size } from '@sdcorejs/utils/models';\nimport { Subscription } from 'rxjs';\n\nclass SdInputNumberErrotStateMatcher implements ErrorStateMatcher {\n constructor(private formControl: FormControl) {}\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n const isSubmitted = form && form.submitted;\n return !!(this.formControl?.invalid && (this.formControl?.dirty || this.formControl?.touched || isSubmitted));\n }\n}\n\n@Component({\n selector: 'sd-input-number',\n templateUrl: './input-number.component.html',\n styleUrls: ['./input-number.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: { '[class.sd-has-label]': '!!label()', '[class.sd-viewed]': 'isViewed() || isInline()' },\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatTooltipModule,\n MatButtonModule,\n SdLabel,\n SdFormatNumberPipe,\n SdView,\n SdInlineText,\n ],\n})\nexport class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {\n id = `I${uuid.v4()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n control = viewChild<ElementRef<HTMLInputElement>>('control');\n /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */\n inlineRef = viewChild(SdInlineText);\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n sdSuffixDef = contentChild(SdSuffixDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private coreConfiguration = inject(SD_CORE_CONFIGURATION, { optional: true });\n private formatNumberPipe = inject(SdFormatNumberPipe);\n private formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-input-number-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(uuid.v4());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n blurOnEnter = input(false, { transform: booleanAttribute });\n\n required = input(false, { transform: booleanAttribute });\n readonly = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` borderless inline-edit (input IS the face). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n\n // Tri-state `viewed` — shared primitive. No panel; in `'inline'` the input is borderless/transparent.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.#focusActiveInput(), this.disabled);\n /** Focus whichever input is live: the inline primitive in `'inline'` mode, else the mat input. */\n #focusActiveInput = (): void => {\n const inline = this.inlineRef();\n if (inline) inline.focus();\n else this.control()?.nativeElement?.focus();\n };\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no input). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Focus the inline input. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` for the static view (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n type = input<'negative' | 'positive' | undefined>();\n precision = input<number>(3);\n format = input<'1,234,567.89' | '1.234.567,89' | undefined>(undefined);\n\n min = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n max = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n\n validator = input<SdCustomValidator | undefined>();\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.input-number.required');\n if (errors['min']) return this.#i18n.t('core.form.input-number.min', { min: this.min() ?? '' });\n if (errors['max']) return this.#i18n.t('core.form.input-number.max', { max: this.max() ?? '' });\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n valueModel = model<any>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS (Giữ lại sdFocusForceBlur)\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n sdBlur = output<any>();\n keyupEnter = output<any>();\n // why: same lý do như sd-input — sdChange fire per-keystroke. `cleared` là\n // intent dedicated cho X (clear button), consumer dùng để trigger reload ngay.\n cleared = output<void>();\n\n @Output() sdFocusForceBlur = new EventEmitter<void>();\n\n // ==========================================\n // 5. INTERNAL STATE & COMPUTED\n // ==========================================\n formControl = new SdFormControl();\n inputControl = new SdFormControl();\n #subscription = new Subscription();\n matcher = new SdInputNumberErrotStateMatcher(this.formControl);\n #preCompositionValue?: string;\n isFocused = false;\n\n // Dùng computed thay cho getter cũ để tận dụng cache\n decimalSeparator = computed(() => {\n const fmt = this.format() ?? this.coreConfiguration?.format?.number;\n return fmt === '1.234.567,89' ? ',' : '.';\n });\n thousandsSeparator = computed(() => {\n const fmt = this.format() ?? this.coreConfiguration?.format?.number;\n return fmt === '1.234.567,89' ? '.' : ',';\n });\n\n regexPattern = computed(() => {\n const decimal = this.decimalSeparator();\n const thousand = this.thousandsSeparator();\n const escDecimal = decimal === '.' ? '\\\\.' : decimal;\n const escThousand = thousand === '.' ? '\\\\.' : thousand;\n\n const integerPart = `(([0-9]+(${escThousand}[0-9])?)+)`;\n const decimalPart = this.precision() > 0 ? `(${escDecimal}[0-9]{0,${this.precision()}})?` : '';\n\n const baseReg = `${integerPart}${decimalPart}$`;\n\n if (this.type() === 'negative') return `[-]${baseReg}`;\n if (!this.type()) return `[-]?${baseReg}`;\n return baseReg;\n });\n\n constructor() {\n // EFFECT 1: Sync model thay đổi từ bên ngoài (Parent -> Component)\n effect(() => {\n const val = this.valueModel();\n untracked(() => {\n if (this.formControl.value !== val) {\n this.formControl.setValue(val, { emitEvent: false });\n if (val != null && val !== '') {\n const strVal = val.toString().replace(/\\./g, this.decimalSeparator());\n this.inputControl.setValue(this.#getValueWithFormat(strVal), { emitEvent: false });\n } else {\n this.inputControl.setValue('', { emitEvent: false });\n }\n }\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) {\n this.inputControl.disable({ emitEvent: false });\n this.formControl.disable({ emitEvent: false });\n } else {\n this.inputControl.enable({ emitEvent: false });\n this.formControl.enable({ emitEvent: false });\n }\n });\n\n // EFFECT 3: Update Validator\n effect(() => {\n const req = this.required();\n const minVal = this.min();\n const maxVal = this.max();\n const val = this.validator();\n const inl = this.inlineError();\n\n untracked(() => {\n this.#updateValidator(req, minVal, maxVal, val, inl);\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.inputControl.touchChanges.subscribe(() => {\n this.formControl.markAsTouched();\n this.ref.markForCheck();\n })\n );\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n this.#subscription.add(\n this.inputControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n }\n\n ngAfterViewInit() {\n this.#subscription.add(\n this.inputControl.valueChanges.subscribe(() => {\n const val = this.inputControl.value;\n if (!val) {\n this.#onChange(undefined);\n return;\n }\n const value = this.#toNumber(val);\n if (!isNaN(value)) {\n this.inputControl.setValue(this.#getValueWithFormat(val), { emitEvent: false });\n this.#onChange(value);\n }\n })\n );\n\n const formGroup = this.form();\n formGroup?.addControl(this.name(), this.formControl);\n\n this.ref.detectChanges();\n }\n\n ngOnDestroy() {\n const formGroup = this.form();\n formGroup?.removeControl(this.name());\n this.#subscription.unsubscribe();\n }\n\n #getValueWithFormat = (value: string) => {\n const arrayNext = value.split(this.decimalSeparator());\n if (arrayNext.length >= 2) {\n return `${this.#formatNumber(arrayNext[0])}${this.decimalSeparator()}${arrayNext[1]}`;\n }\n return this.#formatNumber(value);\n };\n\n #formatNumber = (text: any) => {\n const fmt = this.format() ?? this.coreConfiguration?.format?.number;\n if (fmt === '1.234.567,89') {\n return NumberUtilities.toVN((text?.toString() || '').replace(/\\./g, ''));\n } else {\n return NumberUtilities.toISO((text?.toString() || '').replace(/\\,/g, ''));\n }\n };\n\n #toNumber = (text: any): number => {\n const raw = text?.toString() || '';\n const value = raw.split(this.thousandsSeparator()).join('').replace(this.decimalSeparator(), '.');\n return +value;\n };\n\n reValidate = () => {\n this.formControl.updateValueAndValidity();\n };\n\n #updateValidator = (\n req: boolean,\n minVal: number | undefined,\n maxVal: number | undefined,\n val: SdCustomValidator | undefined,\n inl: string | undefined\n ) => {\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n\n if (req) validators.push(Validators.required);\n if (minVal != null) validators.push(Validators.min(minVal));\n if (maxVal != null) validators.push(Validators.max(maxVal));\n if (val) asyncValidators.push(HandleSdCustomValidator(val));\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n };\n\n #onChange = (value: any) => {\n this.valueModel.set(value ?? null);\n this.sdChange.emit(value ?? null);\n // why: KHÔNG dùng { emitEvent: false } ở đây. formControl mang async validator\n // ([validator] → HandleSdCustomValidator). Nếu set value mà chặn event thì khi async\n // resolve, setErrors cũng chạy với emitEvent:false → AbstractControl.events không phát →\n // #state (sdFormControlState) không tick → errorMessage (computed theo #state) không\n // recompute → message lỗi không hiển thị (dù form invalid + viền đỏ). Để event lan ra để\n // #state tick. formControl.valueChanges không có subscriber nào nên không gây vòng lặp.\n this.formControl.setValue(value ?? null);\n };\n\n // why: method (không phải computed) để template re-eval mỗi change-detection.\n // Required không được clear; disabled/readonly ẩn nút.\n showClear = (): boolean => {\n if (this.required() || this.disabled() || this.readonly()) return false;\n return !sdIsEmpty(this.valueModel());\n };\n\n clear = ($event?: Event) => {\n $event?.stopPropagation();\n if (sdIsEmpty(this.formControl.value)) return;\n // Reset cả ô hiển thị (inputControl) lẫn giá trị thật (formControl), rồi\n // đồng bộ model + sdChange một lần.\n this.inputControl.setValue('', { emitEvent: false });\n this.formControl.setValue(null, { emitEvent: false });\n this.valueModel.set(null);\n this.sdChange.emit(null);\n this.cleared.emit();\n };\n\n onKeyupEnter = () => {\n const val: string = (this.inputControl.value ?? '').toString();\n if (val.length > val.trim().length) {\n this.inputControl.setValue(val.trim());\n }\n this.keyupEnter.emit(this.inputControl.value);\n if (this.blurOnEnter()) {\n this.blur();\n }\n };\n\n onKeydown = (event: KeyboardEvent) => {\n if (event.ctrlKey && event.key == 'v') {\n this.#checkValue(event, '');\n return;\n }\n const key = event.keyCode || event.charCode;\n if (key == 8 || key == 46 || key == 37 || key == 39 || key == 35 || key == 36 || key == 9) return;\n if (event.ctrlKey && (event.key == 'c' || event.key == 'x' || event.key == 'a')) return;\n if (event.shiftKey && key == 9) return;\n\n this.#checkValue(event, event.key);\n };\n\n onPaste(event: ClipboardEvent) {\n const nextKey = event?.clipboardData?.getData('text');\n this.#checkValue(event, nextKey);\n }\n\n onCompositionEnd(event: CompositionEvent) {\n const compositionValue = event.data;\n const regExp = new RegExp(`^${this.regexPattern()}`, 'g');\n if (compositionValue && !String(compositionValue).match(regExp)) {\n this.inputControl.setValue(this.#preCompositionValue || '');\n }\n this.#preCompositionValue = undefined;\n }\n\n onCompositionStart(event: CompositionEvent) {\n this.#preCompositionValue = this.inputControl.value;\n }\n\n #checkValue = (event: any, nextKey?: string) => {\n const current: string = event?.target?.value;\n const curval_arr = current.split('');\n curval_arr.splice(event.target.selectionStart, event.target.selectionEnd - event.target.selectionStart, nextKey || '');\n const newval = curval_arr.join('');\n\n if (this.type() !== 'positive' && newval === '-') return;\n\n const regExp = new RegExp(`^${this.regexPattern()}`, 'g');\n if (newval && !String(newval).match(regExp)) {\n event.preventDefault();\n return;\n }\n };\n\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n\n // RxJS 7 chuẩn bài\n if (this.sdFocusForceBlur.observed) {\n this.blur();\n this.sdFocusForceBlur.emit();\n }\n };\n\n onBlur = () => {\n this.isFocused = false;\n const val: string = (this.inputControl.value ?? '').toString();\n\n if (!val || val.trim() === '') {\n this.inputControl.setValue('', { emitEvent: false });\n this.#onChange(null);\n this.sdBlur.emit(null);\n return;\n }\n\n const arrayValue = val.split(this.decimalSeparator());\n if (arrayValue.length >= 2 && arrayValue[1] == '') {\n this.inputControl.setValue(this.#formatNumber(arrayValue[0]));\n return;\n }\n\n if (val.length > val.trim().length) {\n this.inputControl.setValue(val.trim());\n }\n this.sdBlur.emit(this.formControl.value);\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.isFocused = false;\n const inline = this.inlineRef();\n if (inline) inline.blur();\n else this.control()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.#focusActiveInput();\n }, 100);\n };\n}\n","@let lbl = label();\n@let app = appearance();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage();\n@let hText = helperText();\n@let fmt = format();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"lbl\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | sdFormatNumber : undefined : fmt\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"inputControl\"\n [placeholder]=\"placeholder() || lbl || ''\"\n [clearable]=\"!required()\"\n [autoId]=\"autoId()\"\n [state]=\"formControl.invalid && formControl.touched ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (sdKeydown)=\"onKeydown($event)\"\n (sdPaste)=\"onPaste($event)\"\n (sdCompositionStart)=\"onCompositionStart($event)\"\n (sdCompositionEnd)=\"onCompositionEnd($event)\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!app) {\n <ng-content select=\"[sdLabel]\">\n @if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"required()\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"hideErr\"\n [appearance]=\"app!\"\n [floatLabel]=\"floatLabel()\">\n @if (app && lbl) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ lbl }}</span>\n @if (hText) {\n <mat-icon [matTooltip]=\"hText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"inputControl\"\n #control\n matInput\n [placeholder]=\"placeholder() || lbl || ''\"\n [errorStateMatcher]=\"matcher\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\"\n [required]=\"required()\"\n [readonly]=\"readonly()\"\n [autocomplete]=\"id\"\n (paste)=\"onPaste($event)\"\n autocorrect=\"off\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\" />\n\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n\n <!-- why: nút clear render TRƯỚC error icon. Clear hover-gated (visibility:hidden) vẫn\n chiếm chỗ trong layout → nếu đứng sau sẽ đẩy error icon \"tụt vào trong\". Đứng trước\n thì error icon nằm sát mép phải, clear giữ slot vô hình bên trái. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container [ngTemplateOutlet]=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-forms-input-number.mjs","sources":["../../../projects/sdcorejs-angular/forms/input-number/src/input-number.component.ts","../../../projects/sdcorejs-angular/forms/input-number/src/input-number.component.html","../../../projects/sdcorejs-angular/forms/input-number/sdcorejs-angular-forms-input-number.ts"],"sourcesContent":["import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n inject,\n input,\n model,\n computed,\n effect,\n untracked,\n OnDestroy,\n OnInit,\n output,\n TemplateRef,\n viewChild,\n contentChild,\n Output,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport {\n AsyncValidatorFn,\n FormControl,\n FormGroup,\n FormGroupDirective,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidatorFn,\n Validators,\n} from '@angular/forms';\n\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { ISdCoreConfiguration, SD_CORE_CONFIGURATION } from '@sdcorejs/angular/configurations';\nimport { SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport {\n HandleSdCustomValidator,\n ISdFormConfiguration,\n SD_FORM_CONFIGURATION,\n SdCustomValidator,\n SdFormControl,\n SdInlineErrorValidator,\n sdFormControlState,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { SdFormatNumberPipe } from '@sdcorejs/angular/pipes';\nimport { NumberUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { Size } from '@sdcorejs/utils/models';\nimport { Subscription } from 'rxjs';\n\nclass SdInputNumberErrotStateMatcher implements ErrorStateMatcher {\n constructor(private formControl: FormControl) {}\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n const isSubmitted = form && form.submitted;\n return !!(this.formControl?.invalid && (this.formControl?.dirty || this.formControl?.touched || isSubmitted));\n }\n}\n\n@Component({\n selector: 'sd-input-number',\n templateUrl: './input-number.component.html',\n styleUrls: ['./input-number.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: { '[class.sd-has-label]': '!!label()', '[class.sd-viewed]': 'isViewed() || isInline()' },\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatTooltipModule,\n MatButtonModule,\n SdLabel,\n SdFormatNumberPipe,\n SdView,\n SdInlineText,\n ],\n})\nexport class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES\n // ==========================================\n control = viewChild<ElementRef<HTMLInputElement>>('control');\n /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */\n inlineRef = viewChild(SdInlineText);\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdViewDef = contentChild(SdViewDefDirective);\n sdSuffixDef = contentChild(SdSuffixDefDirective);\n\n // ==========================================\n // 2. INJECTS\n // ==========================================\n private ref = inject(ChangeDetectorRef);\n private coreConfiguration = inject(SD_CORE_CONFIGURATION, { optional: true });\n private formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-input-number-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n hideInlineError = input(false, { transform: booleanAttribute });\n blurOnEnter = input(false, { transform: booleanAttribute });\n\n required = input(false, { transform: booleanAttribute });\n readonly = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` borderless inline-edit (input IS the face). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n\n // Tri-state `viewed` — shared primitive. No panel; in `'inline'` the input is borderless/transparent.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.#focusActiveInput(), this.disabled);\n /** Focus whichever input is live: the inline primitive in `'inline'` mode, else the mat input. */\n #focusActiveInput = (): void => {\n const inline = this.inlineRef();\n if (inline) inline.focus();\n else this.control()?.nativeElement?.focus();\n };\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no input). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Focus the inline input. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n /** View display template: `sdViewDef` overrides the projected `#sdValue` for the static view (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n type = input<'negative' | 'positive' | undefined>();\n precision = input<number>(3);\n format = input<'1,234,567.89' | '1.234.567,89' | undefined>(undefined);\n\n min = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n max = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n\n validator = input<SdCustomValidator | undefined>();\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.input-number.required');\n if (errors['min']) return this.#i18n.t('core.form.input-number.min', { min: this.min() ?? '' });\n if (errors['max']) return this.#i18n.t('core.form.input-number.max', { max: this.max() ?? '' });\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n hyperlink = input<string | null | undefined>();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n valueModel = model<any>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS (Giữ lại sdFocusForceBlur)\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>();\n sdBlur = output<any>();\n keyupEnter = output<any>();\n // why: same lý do như sd-input — sdChange fire per-keystroke. `cleared` là\n // intent dedicated cho X (clear button), consumer dùng để trigger reload ngay.\n cleared = output<void>();\n\n @Output() sdFocusForceBlur = new EventEmitter<void>();\n\n // ==========================================\n // 5. INTERNAL STATE & COMPUTED\n // ==========================================\n formControl = new SdFormControl();\n inputControl = new SdFormControl();\n #subscription = new Subscription();\n matcher = new SdInputNumberErrotStateMatcher(this.formControl);\n #preCompositionValue?: string;\n isFocused = false;\n\n // Dùng computed thay cho getter cũ để tận dụng cache\n decimalSeparator = computed(() => {\n const fmt = this.format() ?? this.coreConfiguration?.format?.number;\n return fmt === '1.234.567,89' ? ',' : '.';\n });\n thousandsSeparator = computed(() => {\n const fmt = this.format() ?? this.coreConfiguration?.format?.number;\n return fmt === '1.234.567,89' ? '.' : ',';\n });\n\n regexPattern = computed(() => {\n const decimal = this.decimalSeparator();\n const thousand = this.thousandsSeparator();\n const escDecimal = decimal === '.' ? '\\\\.' : decimal;\n const escThousand = thousand === '.' ? '\\\\.' : thousand;\n\n const integerPart = `(([0-9]+(${escThousand}[0-9])?)+)`;\n const decimalPart = this.precision() > 0 ? `(${escDecimal}[0-9]{0,${this.precision()}})?` : '';\n\n const baseReg = `${integerPart}${decimalPart}$`;\n\n if (this.type() === 'negative') return `[-]${baseReg}`;\n if (!this.type()) return `[-]?${baseReg}`;\n return baseReg;\n });\n\n constructor() {\n // EFFECT 1: Sync model thay đổi từ bên ngoài (Parent -> Component)\n effect(() => {\n const val = this.valueModel();\n untracked(() => {\n if (this.formControl.value !== val) {\n this.formControl.setValue(val, { emitEvent: false });\n if (val != null && val !== '') {\n const strVal = val.toString().replace(/\\./g, this.decimalSeparator());\n this.inputControl.setValue(this.#getValueWithFormat(strVal), { emitEvent: false });\n } else {\n this.inputControl.setValue('', { emitEvent: false });\n }\n }\n });\n });\n\n // EFFECT 2: Sync Disable\n effect(() => {\n if (this.disabled()) {\n this.inputControl.disable({ emitEvent: false });\n this.formControl.disable({ emitEvent: false });\n } else {\n this.inputControl.enable({ emitEvent: false });\n this.formControl.enable({ emitEvent: false });\n }\n });\n\n // EFFECT 3: Update Validator\n effect(() => {\n const req = this.required();\n const minVal = this.min();\n const maxVal = this.max();\n const val = this.validator();\n const inl = this.inlineError();\n\n untracked(() => {\n this.#updateValidator(req, minVal, maxVal, val, inl);\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.inputControl.touchChanges.subscribe(() => {\n this.formControl.markAsTouched();\n this.ref.markForCheck();\n })\n );\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n this.#subscription.add(\n this.inputControl.sdChanges.subscribe(() => {\n this.ref.markForCheck();\n })\n );\n }\n\n ngAfterViewInit() {\n this.#subscription.add(\n this.inputControl.valueChanges.subscribe(() => {\n const val = this.inputControl.value;\n if (!val) {\n this.#onChange(undefined);\n return;\n }\n const value = this.#toNumber(val);\n if (!isNaN(value)) {\n this.inputControl.setValue(this.#getValueWithFormat(val), { emitEvent: false });\n this.#onChange(value);\n }\n })\n );\n\n const formGroup = this.form();\n formGroup?.addControl(this.name(), this.formControl);\n\n this.ref.detectChanges();\n }\n\n ngOnDestroy() {\n const formGroup = this.form();\n formGroup?.removeControl(this.name());\n this.#subscription.unsubscribe();\n }\n\n #getValueWithFormat = (value: string) => {\n const arrayNext = value.split(this.decimalSeparator());\n if (arrayNext.length >= 2) {\n return `${this.#formatNumber(arrayNext[0])}${this.decimalSeparator()}${arrayNext[1]}`;\n }\n return this.#formatNumber(value);\n };\n\n #formatNumber = (text: any) => {\n const fmt = this.format() ?? this.coreConfiguration?.format?.number;\n if (fmt === '1.234.567,89') {\n return NumberUtilities.toVN((text?.toString() || '').replace(/\\./g, ''));\n } else {\n return NumberUtilities.toISO((text?.toString() || '').replace(/\\,/g, ''));\n }\n };\n\n #toNumber = (text: any): number => {\n const raw = text?.toString() || '';\n const value = raw.split(this.thousandsSeparator()).join('').replace(this.decimalSeparator(), '.');\n return +value;\n };\n\n reValidate = () => {\n this.formControl.updateValueAndValidity();\n };\n\n #updateValidator = (\n req: boolean,\n minVal: number | undefined,\n maxVal: number | undefined,\n val: SdCustomValidator | undefined,\n inl: string | undefined\n ) => {\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n\n if (req) validators.push(Validators.required);\n if (minVal != null) validators.push(Validators.min(minVal));\n if (maxVal != null) validators.push(Validators.max(maxVal));\n if (val) asyncValidators.push(HandleSdCustomValidator(val));\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n };\n\n #onChange = (value: any) => {\n this.valueModel.set(value ?? null);\n this.sdChange.emit(value ?? null);\n // why: KHÔNG dùng { emitEvent: false } ở đây. formControl mang async validator\n // ([validator] → HandleSdCustomValidator). Nếu set value mà chặn event thì khi async\n // resolve, setErrors cũng chạy với emitEvent:false → AbstractControl.events không phát →\n // #state (sdFormControlState) không tick → errorMessage (computed theo #state) không\n // recompute → message lỗi không hiển thị (dù form invalid + viền đỏ). Để event lan ra để\n // #state tick. formControl.valueChanges không có subscriber nào nên không gây vòng lặp.\n this.formControl.setValue(value ?? null);\n };\n\n // why: method (không phải computed) để template re-eval mỗi change-detection.\n // Required không được clear; disabled/readonly ẩn nút.\n showClear = (): boolean => {\n if (this.required() || this.disabled() || this.readonly()) return false;\n return !sdIsEmpty(this.valueModel());\n };\n\n clear = ($event?: Event) => {\n $event?.stopPropagation();\n if (sdIsEmpty(this.formControl.value)) return;\n // Reset cả ô hiển thị (inputControl) lẫn giá trị thật (formControl), rồi\n // đồng bộ model + sdChange một lần.\n this.inputControl.setValue('', { emitEvent: false });\n this.formControl.setValue(null, { emitEvent: false });\n this.valueModel.set(null);\n this.sdChange.emit(null);\n this.cleared.emit();\n };\n\n onKeyupEnter = () => {\n const val: string = (this.inputControl.value ?? '').toString();\n if (val.length > val.trim().length) {\n this.inputControl.setValue(val.trim());\n }\n this.keyupEnter.emit(this.inputControl.value);\n if (this.blurOnEnter()) {\n this.blur();\n }\n };\n\n onKeydown = (event: KeyboardEvent) => {\n if (event.ctrlKey && event.key == 'v') {\n this.#checkValue(event, '');\n return;\n }\n const key = event.keyCode || event.charCode;\n if (key == 8 || key == 46 || key == 37 || key == 39 || key == 35 || key == 36 || key == 9) return;\n if (event.ctrlKey && (event.key == 'c' || event.key == 'x' || event.key == 'a')) return;\n if (event.shiftKey && key == 9) return;\n\n this.#checkValue(event, event.key);\n };\n\n onPaste(event: ClipboardEvent) {\n const nextKey = event?.clipboardData?.getData('text');\n this.#checkValue(event, nextKey);\n }\n\n onCompositionEnd(event: CompositionEvent) {\n const compositionValue = event.data;\n const regExp = new RegExp(`^${this.regexPattern()}`, 'g');\n if (compositionValue && !String(compositionValue).match(regExp)) {\n this.inputControl.setValue(this.#preCompositionValue || '');\n }\n this.#preCompositionValue = undefined;\n }\n\n onCompositionStart(event: CompositionEvent) {\n this.#preCompositionValue = this.inputControl.value;\n }\n\n #checkValue = (event: any, nextKey?: string) => {\n const current: string = event?.target?.value;\n const curval_arr = current.split('');\n curval_arr.splice(event.target.selectionStart, event.target.selectionEnd - event.target.selectionStart, nextKey || '');\n const newval = curval_arr.join('');\n\n if (this.type() !== 'positive' && newval === '-') return;\n\n const regExp = new RegExp(`^${this.regexPattern()}`, 'g');\n if (newval && !String(newval).match(regExp)) {\n event.preventDefault();\n return;\n }\n };\n\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit();\n\n // RxJS 7 chuẩn bài\n if (this.sdFocusForceBlur.observed) {\n this.blur();\n this.sdFocusForceBlur.emit();\n }\n };\n\n onBlur = () => {\n this.isFocused = false;\n const val: string = (this.inputControl.value ?? '').toString();\n\n if (!val || val.trim() === '') {\n this.inputControl.setValue('', { emitEvent: false });\n this.#onChange(null);\n this.sdBlur.emit(null);\n return;\n }\n\n const arrayValue = val.split(this.decimalSeparator());\n if (arrayValue.length >= 2 && arrayValue[1] == '') {\n this.inputControl.setValue(this.#formatNumber(arrayValue[0]));\n return;\n }\n\n if (val.length > val.trim().length) {\n this.inputControl.setValue(val.trim());\n }\n this.sdBlur.emit(this.formControl.value);\n };\n\n onClick = () => {\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.isFocused = false;\n const inline = this.inlineRef();\n if (inline) inline.blur();\n else this.control()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.#focusActiveInput();\n }, 100);\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _format = format();\n@let _required = required();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"formControl.value | sdFormatNumber : undefined : _format\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"inputControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n [clearable]=\"!_required\"\n [autoId]=\"autoId()\"\n [state]=\"formControl.invalid && formControl.touched ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (sdKeydown)=\"onKeydown($event)\"\n (sdPaste)=\"onPaste($event)\"\n (sdCompositionStart)=\"onCompositionStart($event)\"\n (sdCompositionEnd)=\"onCompositionEnd($event)\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"inputControl\"\n #control\n matInput\n [placeholder]=\"placeholder() || _label || ''\"\n [errorStateMatcher]=\"matcher\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (compositionstart)=\"onCompositionStart($event)\"\n (compositionend)=\"onCompositionEnd($event)\"\n [required]=\"_required\"\n [readonly]=\"readonly()\"\n [autocomplete]=\"id\"\n (paste)=\"onPaste($event)\"\n autocorrect=\"off\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\" />\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n <!-- why: nút clear render TRƯỚC error icon. Clear hover-gated (visibility:hidden) vẫn\n chiếm chỗ trong layout -> nếu đứng sau sẽ đẩy error icon \"tụt vào trong\". Đứng trước\n thì error icon nằm sát mép phải, clear giữ slot vô hình bên trái. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n }\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container [ngTemplateOutlet]=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import * as i1 from '@angular/common';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
4
  import { viewChild, contentChild, input, computed, inject, ChangeDetectorRef, booleanAttribute, model, output, EventEmitter, effect, untracked, Output, ChangeDetectionStrategy, Component } from '@angular/core';
5
+ import { Utilities } from '@sdcorejs/utils/fns';
5
6
  import * as i2 from '@angular/forms';
6
7
  import { NgForm, FormGroup, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
8
  import { MatButtonModule } from '@angular/material/button';
@@ -22,7 +23,6 @@ import { sdIsEmpty, sdSerializeDataValue } from '@sdcorejs/angular/utilities/dat
22
23
  import { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';
23
24
  import { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';
24
25
  import { Subscription } from 'rxjs';
25
- import * as uuid from 'uuid';
26
26
 
27
27
  // Back-compat: SdPatternType cũ → ValidationPatternType mới.
28
28
  // 3 key đã đổi tên trong @sdcorejs/utils v1.x.
@@ -32,7 +32,7 @@ const LEGACY_PATTERN_ALIAS = {
32
32
  IDVN_OR_PASSPORT: 'VN_ID_OR_PASSPORT',
33
33
  };
34
34
  class SdInput {
35
- id = `I${uuid.v4()}`;
35
+ id = `I${Utilities.generateUuid()}`;
36
36
  // ==========================================
37
37
  // 1. SIGNAL QUERIES (Thay thế @ViewChild / @ContentChild)
38
38
  // ==========================================
@@ -75,7 +75,7 @@ class SdInput {
75
75
  const msg = this.errorMessage();
76
76
  return msg && msg.length > 0 ? msg : null;
77
77
  });
78
- name = input(uuid.v4());
78
+ name = input(Utilities.generateUuid());
79
79
  // ==========================================
80
80
  // 3. INJECT (Thay thế Constructor DI)
81
81
  // ==========================================