@sd-angular/core 19.0.0-beta.91 → 19.0.0-beta.93

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 (150) hide show
  1. package/components/badge/src/badge.component.d.ts +0 -3
  2. package/components/form-generic/index.d.ts +4 -0
  3. package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +3 -3
  4. package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +3 -3
  5. package/components/{workflow → form-generic}/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +3 -3
  6. package/components/{workflow → form-generic}/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +1 -1
  7. package/components/{workflow → form-generic}/src/components/form-render/form-render.component.d.ts +3 -3
  8. package/components/{workflow → form-generic}/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  9. package/components/form-generic/src/configurations/form-generic.configuration.d.ts +6 -0
  10. package/components/form-generic/src/configurations/index.d.ts +2 -0
  11. package/components/{workflow → form-generic}/src/services/form-generic.service.d.ts +3 -3
  12. package/components/index.d.ts +1 -0
  13. package/components/splitter/index.d.ts +3 -0
  14. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +24 -0
  15. package/components/splitter/src/splitter-panel/splitter-panel.component.d.ts +16 -0
  16. package/components/splitter/src/splitter-state.service.d.ts +26 -0
  17. package/components/splitter/src/splitter.component.d.ts +15 -0
  18. package/components/splitter/src/splitter.models.d.ts +23 -0
  19. package/components/table/src/directives/index.d.ts +1 -0
  20. package/components/table/src/directives/sd-column-resize.directive.d.ts +13 -0
  21. package/components/table/src/models/table-option-config.model.d.ts +2 -0
  22. package/components/table/src/services/column-width.util.d.ts +7 -0
  23. package/components/table/src/services/config.service.d.ts +5 -0
  24. package/components/table/src/table.component.d.ts +1 -0
  25. package/components/workflow/index.d.ts +2 -4
  26. package/components/workflow/src/configurations/workflow.configuration.d.ts +9 -5
  27. package/fesm2022/sd-angular-core-components-anchor.mjs +4 -4
  28. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-components-badge.mjs +0 -1
  30. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-components-form-generic.mjs +6397 -0
  32. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -0
  33. package/fesm2022/sd-angular-core-components-splitter.mjs +476 -0
  34. package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -0
  35. package/fesm2022/sd-angular-core-components-tab-router.mjs +4 -4
  36. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  37. package/fesm2022/sd-angular-core-components-table.mjs +187 -5
  38. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-components-upload-file.mjs +2 -2
  40. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  41. package/fesm2022/sd-angular-core-components-workflow.mjs +7 -6387
  42. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  43. package/fesm2022/sd-angular-core-components.mjs +1 -0
  44. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-forms-switch.mjs +2 -6
  46. package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
  47. package/fesm2022/sd-angular-core-services-storage.mjs +5 -0
  48. package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
  49. package/fesm2022/sd-angular-core-utilities-extensions.mjs +9 -5
  50. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  51. package/fesm2022/sd-angular-core-utilities-models.mjs +12 -0
  52. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  53. package/forms/switch/src/switch.component.d.ts +3 -4
  54. package/package.json +62 -54
  55. package/sd-angular-core-19.0.0-beta.93.tgz +0 -0
  56. package/services/storage/src/storage.model.d.ts +1 -0
  57. package/utilities/extensions/src/string.extension.d.ts +2 -0
  58. package/utilities/models/src/pattern.model.d.ts +1 -1
  59. package/utilities/models/src/size.model.d.ts +1 -1
  60. package/sd-angular-core-19.0.0-beta.91.tgz +0 -0
  61. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +0 -0
  62. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +0 -0
  63. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +0 -0
  64. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +0 -0
  65. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +0 -0
  66. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +0 -0
  67. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +0 -0
  68. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +0 -0
  69. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +0 -0
  70. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +0 -0
  71. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +0 -0
  72. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/control/checkbox-control.component.d.ts +0 -0
  73. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/index.d.ts +0 -0
  74. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +0 -0
  75. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +0 -0
  76. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/index.d.ts +0 -0
  77. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +0 -0
  78. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +0 -0
  79. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/index.d.ts +0 -0
  80. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +0 -0
  81. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +0 -0
  82. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/index.d.ts +0 -0
  83. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +0 -0
  84. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +0 -0
  85. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/control/html-control.component.d.ts +0 -0
  86. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/index.d.ts +0 -0
  87. /package/components/{workflow → form-generic}/src/components/form-builder/components/index.d.ts +0 -0
  88. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +0 -0
  89. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/control/number-control.component.d.ts +0 -0
  90. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/index.d.ts +0 -0
  91. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +0 -0
  92. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/control/radio-control.component.d.ts +0 -0
  93. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/index.d.ts +0 -0
  94. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +0 -0
  95. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/control/select-control.component.d.ts +0 -0
  96. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/index.d.ts +0 -0
  97. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +0 -0
  98. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/control/table-control.component.d.ts +0 -0
  99. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/index.d.ts +0 -0
  100. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +0 -0
  101. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +0 -0
  102. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/index.d.ts +0 -0
  103. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +0 -0
  104. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +0 -0
  105. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/index.d.ts +0 -0
  106. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +0 -0
  107. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/control/upload-control.component.d.ts +0 -0
  108. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/index.d.ts +0 -0
  109. /package/components/{workflow → form-generic}/src/components/form-builder/form-builder.component.d.ts +0 -0
  110. /package/components/{workflow → form-generic}/src/components/form-builder/services/builder.service.d.ts +0 -0
  111. /package/components/{workflow → form-generic}/src/components/form-builder/services/index.d.ts +0 -0
  112. /package/components/{workflow → form-generic}/src/components/form-render/components/index.d.ts +0 -0
  113. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +0 -0
  114. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +0 -0
  115. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +0 -0
  116. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/html/html.component.d.ts +0 -0
  117. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/index.d.ts +0 -0
  118. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/number/number.component.d.ts +0 -0
  119. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/radio/radio.component.d.ts +0 -0
  120. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/select/select.component.d.ts +0 -0
  121. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/table/table.component.d.ts +0 -0
  122. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +0 -0
  123. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +0 -0
  124. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/upload/upload.component.d.ts +0 -0
  125. /package/components/{workflow → form-generic}/src/components/form-render/components/item/item.component.d.ts +0 -0
  126. /package/components/{workflow → form-generic}/src/components/form-render/components/variable/variable.component.d.ts +0 -0
  127. /package/components/{workflow → form-generic}/src/components/index.d.ts +0 -0
  128. /package/components/{workflow → form-generic}/src/configurations/form.configuration.d.ts +0 -0
  129. /package/components/{workflow → form-generic}/src/models/form-generic-component.model.d.ts +0 -0
  130. /package/components/{workflow → form-generic}/src/models/form-generic-definition-html.model.d.ts +0 -0
  131. /package/components/{workflow → form-generic}/src/models/form-generic-definition-selection.model.d.ts +0 -0
  132. /package/components/{workflow → form-generic}/src/models/form-generic-definition-table.model.d.ts +0 -0
  133. /package/components/{workflow → form-generic}/src/models/form-generic-expression.model.d.ts +0 -0
  134. /package/components/{workflow → form-generic}/src/models/form-generic-template.model.d.ts +0 -0
  135. /package/components/{workflow → form-generic}/src/models/form-generic-validation.model.d.ts +0 -0
  136. /package/components/{workflow → form-generic}/src/models/form-generic.model.d.ts +0 -0
  137. /package/components/{workflow → form-generic}/src/models/form-render/form-render-args.model.d.ts +0 -0
  138. /package/components/{workflow → form-generic}/src/models/form-render/form-render-entity.model.d.ts +0 -0
  139. /package/components/{workflow → form-generic}/src/models/form-render/index.d.ts +0 -0
  140. /package/components/{workflow → form-generic}/src/models/index.d.ts +0 -0
  141. /package/components/{workflow → form-generic}/src/pipes/component-viewed.pipe.d.ts +0 -0
  142. /package/components/{workflow → form-generic}/src/pipes/expression-feel.pipe.d.ts +0 -0
  143. /package/components/{workflow → form-generic}/src/pipes/expression-query.pipe.d.ts +0 -0
  144. /package/components/{workflow → form-generic}/src/pipes/expression-view.pipe.d.ts +0 -0
  145. /package/components/{workflow → form-generic}/src/pipes/html.pipe.d.ts +0 -0
  146. /package/components/{workflow → form-generic}/src/pipes/hyperlink.pipe.d.ts +0 -0
  147. /package/components/{workflow → form-generic}/src/pipes/index.d.ts +0 -0
  148. /package/components/{workflow → form-generic}/src/pipes/when-expression.pipe.d.ts +0 -0
  149. /package/components/{workflow → form-generic}/src/services/form-render.service.d.ts +0 -0
  150. /package/components/{workflow → form-generic}/src/services/index.d.ts +0 -0
@@ -19,6 +19,7 @@ export * from '@sd-angular/core/components/view';
19
19
  export * from '@sd-angular/core/components/code-editor';
20
20
  export * from '@sd-angular/core/components/chart';
21
21
  export * from '@sd-angular/core/components/editor';
22
+ export * from '@sd-angular/core/components/splitter';
22
23
 
23
24
  /**
24
25
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"sd-angular-core-components.mjs","sources":["../../../projects/sd-angular/components/sd-angular-core-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
@@ -2,7 +2,6 @@ import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { NgForm, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
- import * as i3 from '@angular/material/form-field';
6
5
  import { MatFormFieldModule } from '@angular/material/form-field';
7
6
  import * as i2 from '@angular/material/slide-toggle';
8
7
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@@ -29,7 +28,6 @@ class SdSwitch {
29
28
  this.#name = val;
30
29
  }
31
30
  }
32
- size = 'md';
33
31
  #form;
34
32
  set form(val) {
35
33
  if (val) {
@@ -114,19 +112,17 @@ class SdSwitch {
114
112
  this.formControl.updateValueAndValidity();
115
113
  };
116
114
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdSwitch, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
117
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdSwitch, isStandalone: true, selector: "sd-switch", inputs: { _autoId: ["autoId", "_autoId"], _name: ["name", "_name"], size: "size", form: "form", _label: ["label", "_label"], _color: ["color", "_color"], disabled: "disabled", model: "model", _hideInlineError: ["hideInlineError", "_hideInlineError"], _required: ["required", "_required"] }, outputs: { modelChange: "modelChange", sdChange: "sdChange" }, ngImport: i0, template: "<mat-slide-toggle [formControl]=\"formControl\" [attr.data-autoId]=\"autoId\" [color]=\"color\">\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n</mat-slide-toggle>\r\n@if (!hideInlineError && formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>Vui l\u00F2ng nh\u1EADp th\u00F4ng tin</mat-error>\r\n}\r\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 ::ng-deep label{margin-bottom:0!important}:host ::ng-deep .mdc-switch{--mdc-switch-selected-focus-state-layer-color: var(--sd-primary-light);--mat-sys-primary: var(--sd-primary);--mdc-switch-selected-handle-color: var(--sd-primary);--mdc-switch-selected-hover-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-pressed-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-focus-handle-color: var(--sd-primary);--mdc-switch-selected-hover-handle-color: var(--sd-primary);--mdc-switch-selected-pressed-handle-color: var(--sd-primary);--mdc-switch-selected-focus-track-color: var(--sd-primary-light);--mdc-switch-selected-hover-track-color: var(--sd-primary-light);--mdc-switch-selected-pressed-track-color: var(--sd-primary-light);--mdc-switch-selected-track-color: var(--sd-primary-light)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
115
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: SdSwitch, isStandalone: true, selector: "sd-switch", inputs: { _autoId: ["autoId", "_autoId"], _name: ["name", "_name"], form: "form", _label: ["label", "_label"], _color: ["color", "_color"], disabled: "disabled", model: "model", _hideInlineError: ["hideInlineError", "_hideInlineError"], _required: ["required", "_required"] }, outputs: { modelChange: "modelChange", sdChange: "sdChange" }, ngImport: i0, template: "<mat-slide-toggle [formControl]=\"formControl\" [attr.data-autoId]=\"autoId\" [color]=\"color\">\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n</mat-slide-toggle>", 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 ::ng-deep label{margin-bottom:0!important}:host ::ng-deep .mdc-switch{--mdc-switch-selected-focus-state-layer-color: var(--sd-primary-light);--mat-sys-primary: var(--sd-primary);--mdc-switch-selected-handle-color: var(--sd-primary);--mdc-switch-selected-hover-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-pressed-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-focus-handle-color: var(--sd-primary);--mdc-switch-selected-hover-handle-color: var(--sd-primary);--mdc-switch-selected-pressed-handle-color: var(--sd-primary);--mdc-switch-selected-focus-track-color: var(--sd-primary-light);--mdc-switch-selected-hover-track-color: var(--sd-primary-light);--mdc-switch-selected-pressed-track-color: var(--sd-primary-light);--mdc-switch-selected-track-color: var(--sd-primary-light)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
118
116
  }
119
117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdSwitch, decorators: [{
120
118
  type: Component,
121
- args: [{ selector: 'sd-switch', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, ReactiveFormsModule, MatSlideToggleModule, MatFormFieldModule, SdLabel], template: "<mat-slide-toggle [formControl]=\"formControl\" [attr.data-autoId]=\"autoId\" [color]=\"color\">\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n</mat-slide-toggle>\r\n@if (!hideInlineError && formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>Vui l\u00F2ng nh\u1EADp th\u00F4ng tin</mat-error>\r\n}\r\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 ::ng-deep label{margin-bottom:0!important}:host ::ng-deep .mdc-switch{--mdc-switch-selected-focus-state-layer-color: var(--sd-primary-light);--mat-sys-primary: var(--sd-primary);--mdc-switch-selected-handle-color: var(--sd-primary);--mdc-switch-selected-hover-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-pressed-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-focus-handle-color: var(--sd-primary);--mdc-switch-selected-hover-handle-color: var(--sd-primary);--mdc-switch-selected-pressed-handle-color: var(--sd-primary);--mdc-switch-selected-focus-track-color: var(--sd-primary-light);--mdc-switch-selected-hover-track-color: var(--sd-primary-light);--mdc-switch-selected-pressed-track-color: var(--sd-primary-light);--mdc-switch-selected-track-color: var(--sd-primary-light)}\n"] }]
119
+ args: [{ selector: 'sd-switch', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, ReactiveFormsModule, MatSlideToggleModule, MatFormFieldModule, SdLabel], template: "<mat-slide-toggle [formControl]=\"formControl\" [attr.data-autoId]=\"autoId\" [color]=\"color\">\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n</mat-slide-toggle>", 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 ::ng-deep label{margin-bottom:0!important}:host ::ng-deep .mdc-switch{--mdc-switch-selected-focus-state-layer-color: var(--sd-primary-light);--mat-sys-primary: var(--sd-primary);--mdc-switch-selected-handle-color: var(--sd-primary);--mdc-switch-selected-hover-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-pressed-state-layer-color: var(--sd-primary-light);--mdc-switch-selected-focus-handle-color: var(--sd-primary);--mdc-switch-selected-hover-handle-color: var(--sd-primary);--mdc-switch-selected-pressed-handle-color: var(--sd-primary);--mdc-switch-selected-focus-track-color: var(--sd-primary-light);--mdc-switch-selected-hover-track-color: var(--sd-primary-light);--mdc-switch-selected-pressed-track-color: var(--sd-primary-light);--mdc-switch-selected-track-color: var(--sd-primary-light)}\n"] }]
122
120
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { _autoId: [{
123
121
  type: Input,
124
122
  args: ['autoId']
125
123
  }], _name: [{
126
124
  type: Input,
127
125
  args: ['name']
128
- }], size: [{
129
- type: Input
130
126
  }], form: [{
131
127
  type: Input
132
128
  }], _label: [{
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-forms-switch.mjs","sources":["../../../projects/sd-angular/forms/switch/src/switch.component.ts","../../../projects/sd-angular/forms/switch/src/switch.component.html","../../../projects/sd-angular/forms/switch/sd-angular-core-forms-switch.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @angular-eslint/no-input-rename */\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n OnInit,\r\n AfterViewInit,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { AsyncValidatorFn, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdColor, SdSize } from '@sd-angular/core/utilities/models';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\n\r\n@Component({\r\n selector: 'sd-switch',\r\n templateUrl: './switch.component.html',\r\n styleUrl: './switch.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [FormsModule, ReactiveFormsModule, MatSlideToggleModule, MatFormFieldModule, SdLabel],\r\n})\r\nexport class SdSwitch implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n autoId?: string;\r\n @Input('autoId') set _autoId(val: string | undefined | null) {\r\n if (!val) {\r\n return;\r\n }\r\n this.autoId = `forms-switch-${val}`;\r\n }\r\n #name = uuid.v4();\r\n @Input('name') set _name(val: string | undefined) {\r\n if (val) {\r\n this.#name = val;\r\n }\r\n }\r\n @Input() size: SdSize = 'md';\r\n #form?: FormGroup;\r\n @Input() set form(val: NgForm | FormGroup | undefined | null) {\r\n if (val) {\r\n if (val instanceof NgForm) {\r\n this.#form = val.form;\r\n } else {\r\n this.#form = val;\r\n }\r\n }\r\n }\r\n label?: string;\r\n @Input('label') set _label(val: string | undefined) {\r\n this.label = val;\r\n }\r\n color?: SdColor;\r\n @Input('color') set _color(val: SdColor | undefined | null) {\r\n this.color = val || 'primary';\r\n }\r\n @Input() set disabled(val: boolean | '' | undefined | null) {\r\n val = val === '' || !!val;\r\n if (val) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n }\r\n #model?: boolean | null = false;\r\n @Input() set model(value: boolean | undefined | null) {\r\n if (this.#model !== value) {\r\n this.#model = value;\r\n this.formControl.setValue(value, {\r\n emitEvent: false,\r\n });\r\n }\r\n }\r\n @Output() modelChange = new EventEmitter();\r\n\r\n hideInlineError = false;\r\n @Input('hideInlineError') set _hideInlineError(val: boolean | '') {\r\n this.hideInlineError = val === '' || val;\r\n }\r\n required = false;\r\n @Input('required') set _required(val: boolean | '' | undefined | null) {\r\n this.required = val === '' || !!val;\r\n this.#updateValidator();\r\n }\r\n\r\n @Output() sdChange = new EventEmitter();\r\n formControl = new SdFormControl();\r\n #subscription = new Subscription();\r\n constructor(private ref: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n this.ref.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\r\n this.#form?.addControl(this.#name, this.formControl);\r\n this.ref.detectChanges();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#form?.removeControl(this.#name);\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n #onChange = (value: any) => {\r\n this.modelChange.emit(value);\r\n this.sdChange.emit(value);\r\n };\r\n #updateValidator = () => {\r\n this.formControl.clearValidators();\r\n this.formControl.clearAsyncValidators();\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n if (this.required) {\r\n validators.push(Validators.required);\r\n }\r\n this.formControl.setValidators(validators);\r\n this.formControl.setAsyncValidators(asyncValidators);\r\n this.formControl.updateValueAndValidity();\r\n };\r\n}\r\n","<mat-slide-toggle [formControl]=\"formControl\" [attr.data-autoId]=\"autoId\" [color]=\"color\">\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n</mat-slide-toggle>\r\n@if (!hideInlineError && formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>Vui lòng nhập thông tin</mat-error>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-forms-switch.mjs","sources":["../../../projects/sd-angular/forms/switch/src/switch.component.ts","../../../projects/sd-angular/forms/switch/src/switch.component.html","../../../projects/sd-angular/forms/switch/sd-angular-core-forms-switch.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @angular-eslint/no-input-rename */\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { AsyncValidatorFn, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\n\r\n@Component({\r\n selector: 'sd-switch',\r\n templateUrl: './switch.component.html',\r\n styleUrl: './switch.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [FormsModule, ReactiveFormsModule, MatSlideToggleModule, MatFormFieldModule, SdLabel],\r\n})\r\nexport class SdSwitch implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n autoId?: string;\r\n @Input('autoId') set _autoId(val: string | undefined | null) {\r\n if (!val) {\r\n return;\r\n }\r\n this.autoId = `forms-switch-${val}`;\r\n }\r\n #name = uuid.v4();\r\n @Input('name') set _name(val: string | undefined) {\r\n if (val) {\r\n this.#name = val;\r\n }\r\n }\r\n\r\n #form?: FormGroup;\r\n @Input() set form(val: NgForm | FormGroup | undefined | null) {\r\n if (val) {\r\n if (val instanceof NgForm) {\r\n this.#form = val.form;\r\n } else {\r\n this.#form = val;\r\n }\r\n }\r\n }\r\n label?: string;\r\n @Input('label') set _label(val: string | undefined) {\r\n this.label = val;\r\n }\r\n color?: SdColor;\r\n @Input('color') set _color(val: SdColor | undefined | null) {\r\n this.color = val || 'primary';\r\n }\r\n @Input() set disabled(val: boolean | '' | undefined | null) {\r\n val = val === '' || !!val;\r\n if (val) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n }\r\n #model?: boolean | null = false;\r\n @Input() set model(value: boolean | undefined | null) {\r\n if (this.#model !== value) {\r\n this.#model = value;\r\n this.formControl.setValue(value, {\r\n emitEvent: false,\r\n });\r\n }\r\n }\r\n @Output() modelChange = new EventEmitter();\r\n\r\n hideInlineError = false;\r\n @Input('hideInlineError') set _hideInlineError(val: boolean | '') {\r\n this.hideInlineError = val === '' || val;\r\n }\r\n required = false;\r\n @Input('required') set _required(val: boolean | '' | undefined | null) {\r\n this.required = val === '' || !!val;\r\n this.#updateValidator();\r\n }\r\n\r\n @Output() sdChange = new EventEmitter();\r\n formControl = new SdFormControl();\r\n #subscription = new Subscription();\r\n constructor(private ref: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n this.ref.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\r\n this.#form?.addControl(this.#name, this.formControl);\r\n this.ref.detectChanges();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#form?.removeControl(this.#name);\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n #onChange = (value: any) => {\r\n this.modelChange.emit(value);\r\n this.sdChange.emit(value);\r\n };\r\n #updateValidator = () => {\r\n this.formControl.clearValidators();\r\n this.formControl.clearAsyncValidators();\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n if (this.required) {\r\n validators.push(Validators.required);\r\n }\r\n this.formControl.setValidators(validators);\r\n this.formControl.setAsyncValidators(asyncValidators);\r\n this.formControl.updateValueAndValidity();\r\n };\r\n}\r\n","<mat-slide-toggle [formControl]=\"formControl\" [attr.data-autoId]=\"autoId\" [color]=\"color\">\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n</mat-slide-toggle>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -48,6 +48,10 @@ class SdStorageService {
48
48
  this.#internalSet(hashKey, data, option);
49
49
  subject.next(data);
50
50
  };
51
+ const setSilent = (data) => {
52
+ this.#internalSet(hashKey, data, option);
53
+ // Cố tình KHÔNG gọi subject.next — consumer dùng kênh riêng để thông báo
54
+ };
51
55
  const has = () => {
52
56
  return this.#internalGet(hashKey, option) !== undefined;
53
57
  };
@@ -64,6 +68,7 @@ class SdStorageService {
64
68
  return {
65
69
  get,
66
70
  set,
71
+ setSilent,
67
72
  has,
68
73
  remove,
69
74
  // @ts-ignore: Bổ sung vào interface nếu cần
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-services-storage.mjs","sources":["../../../projects/sd-angular/services/storage/src/storage.model.ts","../../../projects/sd-angular/services/storage/src/storage.service.ts","../../../projects/sd-angular/services/storage/sd-angular-core-services-storage.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nexport interface SdStorageOption<T = any> {\r\n type?: 'session';\r\n default?: T;\r\n args?: Record<string, any>;\r\n}\r\n\r\nexport interface SdStorage<T = any> {\r\n get: () => T;\r\n set: (data: T) => void;\r\n has: () => boolean;\r\n remove: () => void;\r\n subject: BehaviorSubject<T>;\r\n observer: Observable<T>;\r\n}\r\n\r\nexport interface ISdStorageConfiguration {\r\n key?: (key: string) => string;\r\n}\r\n\r\nexport const SD_STORAGE_CONFIG = new InjectionToken<ISdStorageConfiguration>('storage.configuration');\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { SdUtilities } from '@sd-angular/core/utilities';\nimport { BehaviorSubject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ISdStorageConfiguration, SD_STORAGE_CONFIG, SdStorage, SdStorageOption } from './storage.model';\n\ninterface StorageCacheEntry<T> {\n data: T;\n createdOn: Date;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdStorageService {\n // Dùng Map để quản lý bộ nhớ tốt hơn Record\n #memoryCache = new Map<string, StorageCacheEntry<any>>();\n #subjects = new Map<string, BehaviorSubject<any>>();\n\n constructor(\n @Inject(SD_STORAGE_CONFIG)\n @Optional()\n private configuration: ISdStorageConfiguration\n ) {}\n\n create<T = any>(key: string | object, option?: SdStorageOption<T>): SdStorage<T> {\n if (!key) throw new Error('Key is required');\n\n // 1. Xử lý Key\n let hashKey: string;\n if (typeof key === 'string') {\n hashKey = key;\n } else if (typeof key === 'object') {\n hashKey = SdUtilities.hash(key);\n } else {\n throw new Error('Invalid key type');\n }\n\n if (this.configuration?.key) {\n hashKey = this.configuration.key(hashKey);\n }\n\n // 2. Init Subject: Đọc dữ liệu từ Storage ngay lập tức để Subject có giá trị đúng\n if (!this.#subjects.has(hashKey)) {\n const existingData = this.#internalGet<T>(hashKey, option);\n // Fix Type: as T | undefined\n this.#subjects.set(hashKey, new BehaviorSubject<T | undefined>(existingData ?? option?.default));\n }\n\n const subject = this.#subjects.get(hashKey)!;\n\n // 3. Define Helpers\n const get = () => {\n const val = this.#internalGet<T>(hashKey, option);\n return (val ?? option?.default) as T;\n };\n\n const set = (data: T) => {\n this.#internalSet(hashKey, data, option);\n subject.next(data);\n };\n\n const has = () => {\n return this.#internalGet<T>(hashKey, option) !== undefined;\n };\n\n const remove = () => {\n this.#internalRemove(hashKey, option);\n subject.next(undefined);\n };\n\n // Hàm dọn dẹp bộ nhớ (quan trọng)\n const destroy = () => {\n subject.complete();\n this.#subjects.delete(hashKey);\n this.#memoryCache.delete(hashKey);\n };\n\n return {\n get,\n set,\n has,\n remove,\n // @ts-ignore: Bổ sung vào interface nếu cần\n destroy,\n subject: subject,\n observer: subject.asObservable().pipe(map(() => get())),\n };\n }\n\n // --- PRIVATE CORE LOGIC ---\n\n /**\n * Helper xác định loại Storage đang dùng\n */\n #getStorage(option?: SdStorageOption<any>): Storage {\n return option?.type === 'session' ? sessionStorage : localStorage;\n }\n\n /**\n * Đọc dữ liệu: Memory -> Storage -> Parse\n */\n #internalGet<T>(key: string, option?: SdStorageOption<T>): T | undefined {\n // 1. Check Memory (Nhanh nhất)\n let entry = this.#memoryCache.get(key);\n\n // 2. Check Storage (Nếu memory chưa có hoặc mới F5)\n if (!entry) {\n const storage = this.#getStorage(option);\n const raw = storage.getItem(key);\n if (raw) {\n try {\n const parsed = JSON.parse(raw);\n // Convert string date back to Date object nếu cần\n entry = {\n data: parsed.data,\n createdOn: new Date(parsed.createdOn)\n };\n // Sync ngược vào RAM\n this.#memoryCache.set(key, entry);\n } catch (e) {\n console.warn('Storage parse error', e);\n this.#internalRemove(key, option); // Dữ liệu lỗi -> Xóa\n }\n }\n }\n\n if (!entry) return undefined;\n\n return this.#deepClone(entry.data);\n }\n\n /**\n * Ghi dữ liệu: Memory -> Storage\n */\n #internalSet<T>(key: string, data: T, option?: SdStorageOption<T>): void {\n const clonedData = this.#deepClone(data);\n\n const entry: StorageCacheEntry<T> = {\n data: clonedData,\n createdOn: new Date(),\n };\n\n // 1. Lưu Memory\n this.#memoryCache.set(key, entry);\n\n // 2. Lưu Storage\n const storage = this.#getStorage(option);\n try {\n storage.setItem(key, JSON.stringify(entry));\n } catch (e) {\n console.error('Storage quota exceeded', e);\n }\n }\n\n /**\n * Xóa dữ liệu\n */\n #internalRemove(key: string, option?: SdStorageOption<any>): void {\n this.#memoryCache.delete(key);\n const storage = this.#getStorage(option);\n storage.removeItem(key);\n }\n\n /**\n * Deep Clone an toàn\n */\n #deepClone<T>(val: T): T {\n if (val === undefined || val === null) return val;\n return JSON.parse(JSON.stringify(val));\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":"sd-angular-core-services-storage.mjs","sources":["../../../projects/sd-angular/services/storage/src/storage.model.ts","../../../projects/sd-angular/services/storage/src/storage.service.ts","../../../projects/sd-angular/services/storage/sd-angular-core-services-storage.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nexport interface SdStorageOption<T = any> {\r\n type?: 'session';\r\n default?: T;\r\n args?: Record<string, any>;\r\n}\r\n\r\nexport interface SdStorage<T = any> {\r\n get: () => T;\r\n set: (data: T) => void;\r\n // Ghi vào storage nhưng KHÔNG emit subject. Dùng cho thay đổi UI-only\r\n // (vd: column width) để tránh re-trigger các subscriber gây reload data.\r\n setSilent: (data: T) => void;\r\n has: () => boolean;\r\n remove: () => void;\r\n subject: BehaviorSubject<T>;\r\n observer: Observable<T>;\r\n}\r\n\r\nexport interface ISdStorageConfiguration {\r\n key?: (key: string) => string;\r\n}\r\n\r\nexport const SD_STORAGE_CONFIG = new InjectionToken<ISdStorageConfiguration>('storage.configuration');\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { ISdStorageConfiguration, SD_STORAGE_CONFIG, SdStorage, SdStorageOption } from './storage.model';\r\n\r\ninterface StorageCacheEntry<T> {\r\n data: T;\r\n createdOn: Date;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdStorageService {\r\n // Dùng Map để quản lý bộ nhớ tốt hơn Record\r\n #memoryCache = new Map<string, StorageCacheEntry<any>>();\r\n #subjects = new Map<string, BehaviorSubject<any>>();\r\n\r\n constructor(\r\n @Inject(SD_STORAGE_CONFIG)\r\n @Optional()\r\n private configuration: ISdStorageConfiguration\r\n ) {}\r\n\r\n create<T = any>(key: string | object, option?: SdStorageOption<T>): SdStorage<T> {\r\n if (!key) throw new Error('Key is required');\r\n\r\n // 1. Xử lý Key\r\n let hashKey: string;\r\n if (typeof key === 'string') {\r\n hashKey = key;\r\n } else if (typeof key === 'object') {\r\n hashKey = SdUtilities.hash(key);\r\n } else {\r\n throw new Error('Invalid key type');\r\n }\r\n\r\n if (this.configuration?.key) {\r\n hashKey = this.configuration.key(hashKey);\r\n }\r\n\r\n // 2. Init Subject: Đọc dữ liệu từ Storage ngay lập tức để Subject có giá trị đúng\r\n if (!this.#subjects.has(hashKey)) {\r\n const existingData = this.#internalGet<T>(hashKey, option);\r\n // Fix Type: as T | undefined\r\n this.#subjects.set(hashKey, new BehaviorSubject<T | undefined>(existingData ?? option?.default));\r\n }\r\n\r\n const subject = this.#subjects.get(hashKey)!;\r\n\r\n // 3. Define Helpers\r\n const get = () => {\r\n const val = this.#internalGet<T>(hashKey, option);\r\n return (val ?? option?.default) as T;\r\n };\r\n\r\n const set = (data: T) => {\r\n this.#internalSet(hashKey, data, option);\r\n subject.next(data);\r\n };\r\n\r\n const setSilent = (data: T) => {\r\n this.#internalSet(hashKey, data, option);\r\n // Cố tình KHÔNG gọi subject.next — consumer dùng kênh riêng để thông báo\r\n };\r\n\r\n const has = () => {\r\n return this.#internalGet<T>(hashKey, option) !== undefined;\r\n };\r\n\r\n const remove = () => {\r\n this.#internalRemove(hashKey, option);\r\n subject.next(undefined);\r\n };\r\n\r\n // Hàm dọn dẹp bộ nhớ (quan trọng)\r\n const destroy = () => {\r\n subject.complete();\r\n this.#subjects.delete(hashKey);\r\n this.#memoryCache.delete(hashKey);\r\n };\r\n\r\n return {\r\n get,\r\n set,\r\n setSilent,\r\n has,\r\n remove,\r\n // @ts-ignore: Bổ sung vào interface nếu cần\r\n destroy,\r\n subject: subject,\r\n observer: subject.asObservable().pipe(map(() => get())),\r\n };\r\n }\r\n\r\n // --- PRIVATE CORE LOGIC ---\r\n\r\n /**\r\n * Helper xác định loại Storage đang dùng\r\n */\r\n #getStorage(option?: SdStorageOption<any>): Storage {\r\n return option?.type === 'session' ? sessionStorage : localStorage;\r\n }\r\n\r\n /**\r\n * Đọc dữ liệu: Memory -> Storage -> Parse\r\n */\r\n #internalGet<T>(key: string, option?: SdStorageOption<T>): T | undefined {\r\n // 1. Check Memory (Nhanh nhất)\r\n let entry = this.#memoryCache.get(key);\r\n\r\n // 2. Check Storage (Nếu memory chưa có hoặc mới F5)\r\n if (!entry) {\r\n const storage = this.#getStorage(option);\r\n const raw = storage.getItem(key);\r\n if (raw) {\r\n try {\r\n const parsed = JSON.parse(raw);\r\n // Convert string date back to Date object nếu cần\r\n entry = {\r\n data: parsed.data,\r\n createdOn: new Date(parsed.createdOn)\r\n };\r\n // Sync ngược vào RAM\r\n this.#memoryCache.set(key, entry);\r\n } catch (e) {\r\n console.warn('Storage parse error', e);\r\n this.#internalRemove(key, option); // Dữ liệu lỗi -> Xóa\r\n }\r\n }\r\n }\r\n\r\n if (!entry) return undefined;\r\n\r\n return this.#deepClone(entry.data);\r\n }\r\n\r\n /**\r\n * Ghi dữ liệu: Memory -> Storage\r\n */\r\n #internalSet<T>(key: string, data: T, option?: SdStorageOption<T>): void {\r\n const clonedData = this.#deepClone(data);\r\n\r\n const entry: StorageCacheEntry<T> = {\r\n data: clonedData,\r\n createdOn: new Date(),\r\n };\r\n\r\n // 1. Lưu Memory\r\n this.#memoryCache.set(key, entry);\r\n\r\n // 2. Lưu Storage\r\n const storage = this.#getStorage(option);\r\n try {\r\n storage.setItem(key, JSON.stringify(entry));\r\n } catch (e) {\r\n console.error('Storage quota exceeded', e);\r\n }\r\n }\r\n\r\n /**\r\n * Xóa dữ liệu\r\n */\r\n #internalRemove(key: string, option?: SdStorageOption<any>): void {\r\n this.#memoryCache.delete(key);\r\n const storage = this.#getStorage(option);\r\n storage.removeItem(key);\r\n }\r\n\r\n /**\r\n * Deep Clone an toàn\r\n */\r\n #deepClone<T>(val: T): T {\r\n if (val === undefined || val === null) return val;\r\n return JSON.parse(JSON.stringify(val));\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -16,8 +16,10 @@
16
16
  // }
17
17
  // }
18
18
  const REGEX_EMAIL = '^(([^<>()[\\].,;:\\s@"]+(\\.[^<>()[\\].,;:\\s@"]+)*)|(".+"))@(([^<>()[\\].,;:\\s@"]+\\.)+[^<>()[\\].,;:\\s@"]{2,})$';
19
- const REGEX_PHONE = '^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s./0-9]*$';
19
+ const REGEX_PHONE = '^[+]*[(]{0,1}[+]?[0-9]{1,4}[)]{0,1}[-\\s./0-9]*$';
20
20
  const REGEX_PHONE_VN = '^(?:\\+84|0|84)(3[2-9]|5[2689]|7[06-9]|8[1-689]|9[0-9])\\d{7}$';
21
+ const REGEX_IDVN = '^(\\d{9}|\\d{12})$';
22
+ const REGEX_PASSPORT = '^[A-Z]\\d{7}$';
21
23
  const REGEX_IDVN_OR_PASSPORT = '^(\\d{9}|\\d{12}|[A-Z]\\d{7})$';
22
24
  const REGEX_TIME = '^(?:[01]\\d|2[0-3]):[0-5]\\d$';
23
25
  const isValidEmail = (value) => {
@@ -45,7 +47,7 @@ const isNullOrEmpty = (value) => {
45
47
  return value === undefined || value === null || value === '';
46
48
  };
47
49
  const isNullOrWhiteSpace = (value) => {
48
- return value === undefined || value === null || typeof value !== 'string' || value.match(/^ *$/) !== null;
50
+ return value === undefined || value === null || typeof value !== 'string' || value.match(/^\s*$/) !== null;
49
51
  };
50
52
  const changeAliasLowerCase$1 = (alias) => {
51
53
  let str = alias?.toString() ?? '';
@@ -141,7 +143,7 @@ const decrypt = (encripted) => {
141
143
  for (let i = 0, l = strs.length; i < l; i++)
142
144
  if (strs[i] == '{')
143
145
  strs[i] = '}';
144
- else if (encripted[i] == '}')
146
+ else if (strs[i] == '}')
145
147
  strs[i] = '{';
146
148
  return JSON.parse(strs.join(''));
147
149
  };
@@ -193,6 +195,8 @@ const StringUtilities = {
193
195
  REGEX_EMAIL,
194
196
  REGEX_PHONE,
195
197
  REGEX_PHONE_VN,
198
+ REGEX_IDVN,
199
+ REGEX_PASSPORT,
196
200
  REGEX_IDVN_OR_PASSPORT,
197
201
  REGEX_TIME,
198
202
  isValidEmail,
@@ -462,7 +466,7 @@ const NumberUtilities = {
462
466
  // }
463
467
  // }
464
468
  const isDate = (value) => {
465
- if (!value) {
469
+ if (value === undefined || value === null || value === '') {
466
470
  return false;
467
471
  }
468
472
  if (typeof value === 'string') {
@@ -961,7 +965,7 @@ const isMobile = () => {
961
965
  return /Mobi|Android/i.test(navigator.userAgent);
962
966
  };
963
967
  const randomId = (prefix) => {
964
- const id = new Date().getTime().toString(36);
968
+ const id = `${new Date().getTime().toString(36)}${Math.random().toString(36).substring(2, 7)}`;
965
969
  if (prefix) {
966
970
  return `${prefix}_${id}`;
967
971
  }