@sd-angular/core 19.0.0-beta.88 → 19.0.0-beta.89
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.
- package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +6 -0
- package/components/table/src/models/table-option-selector.model.d.ts +48 -0
- package/components/table/src/models/table-option.model.d.ts +102 -0
- package/fesm2022/sd-angular-core-components-document-builder.mjs +84 -18
- package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs +9 -2
- package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs +9 -2
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-api.mjs +18 -34
- package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
- package/forms/input/src/input.component.d.ts +2 -0
- package/forms/select/src/select.component.d.ts +1 -1
- package/forms/textarea/src/textarea.component.d.ts +2 -0
- package/package.json +51 -51
- package/sd-angular-core-19.0.0-beta.89.tgz +0 -0
- package/services/api/src/api.service.d.ts +3 -7
- package/services/api/src/interceptors/api.interceptor.d.ts +2 -4
- package/sd-angular-core-19.0.0-beta.88.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-forms-textarea.mjs","sources":["../../../projects/sd-angular/forms/textarea/src/textarea.component.ts","../../../projects/sd-angular/forms/textarea/src/textarea.component.html","../../../projects/sd-angular/forms/textarea/sd-angular-core-forms-textarea.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n computed,\r\n effect,\r\n untracked,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n viewChild,\r\n contentChild\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormGroup,\r\n FormsModule,\r\n NgForm,\r\n ReactiveFormsModule,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdLabelDefDirective, SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { ISdFormConfiguration, SD_FORM_CONFIGURATION, SdCustomValidator, SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdSize } from '@sd-angular/core/utilities';\r\nimport { NumberUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdEmptyPipe } from '@sd-angular/core/pipes';\r\n\r\n@Component({\r\n selector: 'sd-textarea',\r\n templateUrl: './textarea.component.html',\r\n styleUrls: ['./textarea.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n SdLabel,\r\n SdEmptyPipe,\r\n ],\r\n})\r\nexport class SdTextarea implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n\r\n // ==========================================\r\n // 1. SIGNAL QUERIES\r\n // ==========================================\r\n textareaRef = viewChild<ElementRef<HTMLTextAreaElement>>('textarea');\r\n sdViewDef = contentChild(SdViewDefDirective);\r\n sdLabelDef = contentChild(SdLabelDefDirective);\r\n sdSuffixDef = contentChild(SdSuffixDefDirective);\r\n\r\n // ==========================================\r\n // 2. INJECTS\r\n // ==========================================\r\n #ref = inject(ChangeDetectorRef);\r\n #formConfiguration = inject(SD_FORM_CONFIGURATION, { optional: true });\r\n\r\n // ==========================================\r\n // 3. SIGNAL INPUTS & MODEL\r\n // ==========================================\r\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n autoId = computed(() => this.autoIdInput() ? `forms-textarea-${this.autoIdInput()}` : undefined);\r\n name = input<string>(uuid.v4());\r\n\r\n size = input<SdSize>('md');\r\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\r\n form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\r\n if (val instanceof NgForm) return val.form;\r\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\r\n if (val instanceof FormGroup) return val;\r\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n label = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n helperText = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n placeholder = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n rows = input<number>(5);\r\n \r\n hideInlineError = input(false, { transform: booleanAttribute });\r\n required = input(false, { transform: booleanAttribute });\r\n disabled = input(false, { transform: booleanAttribute });\r\n viewed = input(false, { transform: booleanAttribute });\r\n autoHeight = input(false, { transform: booleanAttribute });\r\n\r\n maxlength = input<number | null, unknown>(null, { \r\n transform: (v) => (v != null && NumberUtilities.isPositiveInteger(Number(v))) ? Number(v) : null \r\n });\r\n \r\n pattern = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n validator = input<SdCustomValidator | undefined>();\r\n inlineError = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n\r\n /**\r\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\r\n * Dùng getter (không phải computed) vì formControl.errors không phải Angular signal.\r\n */\r\n get errorTooltipMessage(): string | undefined {\r\n const errors = this.formControl.errors;\r\n if (!errors) return undefined;\r\n\r\n if (errors['required']) return 'Vui lòng nhập thông tin';\r\n if (errors['maxlength']) return `Số ký tự tối đa: ${this.maxlength()}`;\r\n if (errors['pattern']) return 'Định dạng không hợp lệ';\r\n if (errors['customValidator']) return errors['customValidator'] as string;\r\n if (errors['inlineError']) return this.inlineError();\r\n return undefined;\r\n }\r\n\r\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\r\n appearance = computed(() => this.appearanceInput() ?? this.#formConfiguration?.appearance ?? 'outline');\r\n\r\n floatLabel = input<FloatLabelType>('auto');\r\n\r\n valueModel = model<any>(undefined, { alias: 'model' });\r\n\r\n // ==========================================\r\n // 4. SIGNAL OUTPUTS\r\n // ==========================================\r\n sdChange = output<any>();\r\n\r\n // ==========================================\r\n // 5. INTERNAL STATE & STREAMS\r\n // ==========================================\r\n formControl = new SdFormControl();\r\n #subscription = new Subscription();\r\n isFocused = false;\r\n\r\n constructor() {\r\n // EFFECT 1: Sync model thay đổi từ bên ngoài\r\n effect(() => {\r\n const val = this.valueModel();\r\n untracked(() => {\r\n if (this.formControl.value !== val) {\r\n this.formControl.setValue(val, { emitEvent: false });\r\n // [IMPROVE] Cập nhật chiều cao khi value đổi từ bên ngoài\r\n if (this.autoHeight()) this.#adjustHeight();\r\n }\r\n });\r\n });\r\n\r\n // EFFECT 2: Sync Disable\r\n effect(() => {\r\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\r\n else this.formControl.enable({ emitEvent: false });\r\n });\r\n\r\n // EFFECT 3: Update Validators\r\n effect(() => {\r\n const req = this.required();\r\n const maxLen = this.maxlength();\r\n const pat = this.pattern();\r\n const val = this.validator();\r\n const inl = this.inlineError();\r\n\r\n untracked(() => this.#updateValidator(req, maxLen, pat, val, inl));\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.#subscription.add(this.formControl.sdChanges.subscribe(() => this.#ref.markForCheck()));\r\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\r\n\r\n const formGroup = this.form();\r\n formGroup?.addControl(this.name(), this.formControl);\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.autoHeight()) {\r\n setTimeout(() => this.#adjustHeight(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n const formGroup = this.form();\r\n formGroup?.removeControl(this.name());\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n // Hàm private tính toán chiều cao mượt mà\r\n #adjustHeight() {\r\n const el = this.textareaRef()?.nativeElement;\r\n if (el) {\r\n el.style.height = 'auto';\r\n el.style.overflowY = 'hidden';\r\n el.style.height = `${el.scrollHeight}px`;\r\n }\r\n }\r\n\r\n onFocus = () => {\r\n this.isFocused = true;\r\n };\r\n\r\n onBlur = () => {\r\n this.isFocused = false;\r\n const val: string = (this.formControl.value ?? '').toString();\r\n if (val.length > val.trim().length) {\r\n this.formControl.setValue(val.trim());\r\n }\r\n };\r\n\r\n onClick = () => {\r\n if (this.sdViewDef()?.templateRef) {\r\n if (!this.formControl.disabled && !this.isFocused) {\r\n this.focus();\r\n }\r\n }\r\n };\r\n\r\n blur = () => {\r\n this.textareaRef()?.nativeElement?.blur();\r\n };\r\n\r\n focus = () => {\r\n this.isFocused = true;\r\n setTimeout(() => {\r\n this.textareaRef()?.nativeElement?.focus();\r\n }, 100);\r\n };\r\n\r\n #onChange = (value: any) => {\r\n if (this.autoHeight()) {\r\n this.#adjustHeight();\r\n }\r\n this.valueModel.set(value);\r\n this.sdChange.emit(value);\r\n };\r\n\r\n #updateValidator = (\r\n req: boolean, maxLen: number | null, pat: string | undefined, \r\n val: SdCustomValidator | undefined, inl: string | undefined\r\n ) => {\r\n this.formControl.clearValidators();\r\n this.formControl.clearAsyncValidators();\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n if (req) validators.push(Validators.required);\r\n if (maxLen != null) validators.push(Validators.maxLength(maxLen));\r\n if (pat) validators.push(Validators.pattern(pat));\r\n if (val) asyncValidators.push(this.#customValidator(val));\r\n if (inl) validators.push(this.customInlineErrorValidator());\r\n\r\n this.formControl.setValidators(validators.length ? validators : null);\r\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n };\r\n\r\n customInlineErrorValidator(): ValidatorFn {\r\n return (): Record<string, any> | null => ({ inlineError: true });\r\n }\r\n\r\n #customValidator = (func: (value: any) => string | Promise<string>): AsyncValidatorFn => {\r\n return async (c: AbstractControl): Promise<Record<string, any> | null> => {\r\n const value = c.value || null;\r\n if (func && typeof func === 'function') {\r\n const result = func(value);\r\n if (result instanceof Promise) {\r\n const message = await result;\r\n if (message) return { customValidator: message };\r\n return null;\r\n }\r\n if (result) return { customValidator: result };\r\n return null;\r\n }\r\n return null;\r\n };\r\n };\r\n}","@let lbl = label();\r\n@let app = appearance();\r\n@let hideErr = hideInlineError();\r\n@let errMsg = errorTooltipMessage;\r\n@let viewDef = sdViewDef();\r\n@let lblDef = sdLabelDef();\r\n@let hText = helperText();\r\n@let req = required();\r\n@let maxLen = maxlength();\r\n\r\n@if (viewed()) {\r\n @if (lblDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"lblDef!.templateRef\"> </ng-container>\r\n } @else if (lbl) {\r\n <div class=\"T14R text-black400\">{{ lbl }}</div>\r\n }\r\n <div class=\"T14M\">{{ formControl.value | sdEmpty }}</div>\r\n} @else {\r\n @if (!app && lblDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"lblDef!.templateRef\"> </ng-container>\r\n }\r\n @if (!app && lbl && !lblDef?.templateRef) {\r\n <sd-label [label]=\"lbl\" [required]=\"req\"></sd-label>\r\n }\r\n\r\n <div\r\n class=\"d-flex align-items-center\"\r\n [class.sd-view]=\"viewDef?.templateRef\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\"\r\n aria-hidden=\"true\">\r\n @if (viewDef?.templateRef && !isFocused) {\r\n <ng-container *ngTemplateOutlet=\"viewDef!.templateRef; context: { value: formControl.value }\"> </ng-container>\r\n } @else {\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"hideErr\"\r\n [appearance]=\"app!\"\r\n [floatLabel]=\"floatLabel()\">\r\n @if (app && lbl) {\r\n <mat-label style=\"display: inline-block\">\r\n <div style=\"display: flex; align-items: center; gap: 4px\">\r\n <span>{{ lbl }}</span>\r\n @if (hText) {\r\n <mat-icon [matTooltip]=\"hText\" matTooltipPosition=\"above\">info_outline</mat-icon>\r\n }\r\n </div>\r\n </mat-label>\r\n }\r\n\r\n <textarea\r\n matInput\r\n [placeholder]=\"placeholder() || lbl || ''\"\r\n [formControl]=\"formControl\"\r\n [required]=\"req\"\r\n autocomplete=\"off\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [rows]=\"rows()\"\r\n [attr.data-autoId]=\"autoId()\"\r\n spellcheck=\"false\"\r\n #textarea>\r\n </textarea>\r\n\r\n @if (hideErr && errMsg && formControl.touched) {\r\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\"> error </mat-icon>\r\n }\r\n\r\n @if (!hideErr && errMsg && formControl.touched) {\r\n <mat-error>{{ errMsg }}</mat-error>\r\n }\r\n\r\n @if (maxLen !== null && !formControl.disabled) {\r\n <span matSuffix>{{ formControl.value?.length || 0 }}/{{ maxLen }}</span>\r\n }\r\n\r\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\r\n <ng-container matSuffix>\r\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\r\n </ng-container>\r\n }\r\n <!-- <ng-container matSuffix>\r\n <ng-content select=\"[sdSuffix]\"></ng-content>\r\n </ng-container> -->\r\n </mat-form-field>\r\n }\r\n </div>\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-textarea.mjs","sources":["../../../projects/sd-angular/forms/textarea/src/textarea.component.ts","../../../projects/sd-angular/forms/textarea/src/textarea.component.html","../../../projects/sd-angular/forms/textarea/sd-angular-core-forms-textarea.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n computed,\r\n effect,\r\n untracked,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n viewChild,\r\n contentChild\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormGroup,\r\n FormsModule,\r\n NgForm,\r\n ReactiveFormsModule,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { SdLabelDefDirective, SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\r\nimport { ISdFormConfiguration, SD_FORM_CONFIGURATION, SdCustomValidator, SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdSize } from '@sd-angular/core/utilities';\r\nimport { NumberUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdEmptyPipe } from '@sd-angular/core/pipes';\r\n\r\n@Component({\r\n selector: 'sd-textarea',\r\n templateUrl: './textarea.component.html',\r\n styleUrls: ['./textarea.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n SdLabel,\r\n SdEmptyPipe,\r\n ],\r\n})\r\nexport class SdTextarea implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n\r\n // ==========================================\r\n // 1. SIGNAL QUERIES\r\n // ==========================================\r\n textareaRef = viewChild<ElementRef<HTMLTextAreaElement>>('textarea');\r\n sdViewDef = contentChild(SdViewDefDirective);\r\n sdLabelDef = contentChild(SdLabelDefDirective);\r\n sdSuffixDef = contentChild(SdSuffixDefDirective);\r\n\r\n // ==========================================\r\n // 2. INJECTS\r\n // ==========================================\r\n #ref = inject(ChangeDetectorRef);\r\n #formConfiguration = inject(SD_FORM_CONFIGURATION, { optional: true });\r\n\r\n // ==========================================\r\n // 3. SIGNAL INPUTS & MODEL\r\n // ==========================================\r\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n autoId = computed(() => this.autoIdInput() ? `forms-textarea-${this.autoIdInput()}` : undefined);\r\n name = input<string>(uuid.v4());\r\n\r\n size = input<SdSize>('md');\r\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\r\n form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\r\n if (val instanceof NgForm) return val.form;\r\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\r\n if (val instanceof FormGroup) return val;\r\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n label = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n helperText = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n placeholder = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n rows = input<number>(5);\r\n \r\n hideInlineError = input(false, { transform: booleanAttribute });\r\n required = input(false, { transform: booleanAttribute });\r\n disabled = input(false, { transform: booleanAttribute });\r\n viewed = input(false, { transform: booleanAttribute });\r\n autoHeight = input(false, { transform: booleanAttribute });\r\n\r\n maxlength = input<number | null, unknown>(null, { \r\n transform: (v) => (v != null && NumberUtilities.isPositiveInteger(Number(v))) ? Number(v) : null \r\n });\r\n \r\n pattern = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n validator = input<SdCustomValidator | undefined>();\r\n inlineError = input<string | undefined, string | undefined | null>(undefined, {\r\n transform: (v: string | undefined | null): string | undefined => v ?? undefined,\r\n });\r\n\r\n /**\r\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\r\n * Dùng getter (không phải computed) vì formControl.errors không phải Angular signal.\r\n */\r\n get errorTooltipMessage(): string | undefined {\r\n const errors = this.formControl.errors;\r\n if (!errors) return undefined;\r\n\r\n if (errors['required']) return 'Vui lòng nhập thông tin';\r\n if (errors['maxlength']) return `Số ký tự tối đa: ${this.maxlength()}`;\r\n if (errors['pattern']) return 'Định dạng không hợp lệ';\r\n if (errors['customValidator']) return errors['customValidator'] as string;\r\n if (errors['inlineError']) return this.inlineError();\r\n return undefined;\r\n }\r\n\r\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\r\n appearance = computed(() => this.appearanceInput() ?? this.#formConfiguration?.appearance ?? 'outline');\r\n\r\n floatLabel = input<FloatLabelType>('auto');\r\n\r\n valueModel = model<any>(undefined, { alias: 'model' });\r\n\r\n // ==========================================\r\n // 4. SIGNAL OUTPUTS\r\n // ==========================================\r\n sdChange = output<any>();\r\n\r\n // ==========================================\r\n // 5. INTERNAL STATE & STREAMS\r\n // ==========================================\r\n formControl = new SdFormControl();\r\n #subscription = new Subscription();\r\n isFocused = false;\r\n\r\n constructor() {\r\n // EFFECT 1: Sync model thay đổi từ bên ngoài\r\n effect(() => {\r\n const val = this.valueModel();\r\n untracked(() => {\r\n if (this.formControl.value !== val) {\r\n this.formControl.setValue(val, { emitEvent: false });\r\n // [IMPROVE] Cập nhật chiều cao khi value đổi từ bên ngoài\r\n if (this.autoHeight()) this.#adjustHeight();\r\n }\r\n });\r\n });\r\n\r\n // EFFECT 2: Sync Disable\r\n effect(() => {\r\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\r\n else this.formControl.enable({ emitEvent: false });\r\n });\r\n\r\n // EFFECT 3: Update Validators\r\n effect(() => {\r\n const req = this.required();\r\n const maxLen = this.maxlength();\r\n const pat = this.pattern();\r\n const val = this.validator();\r\n const inl = this.inlineError();\r\n\r\n untracked(() => this.#updateValidator(req, maxLen, pat, val, inl));\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.#subscription.add(this.formControl.sdChanges.subscribe(() => this.#ref.markForCheck()));\r\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\r\n\r\n const formGroup = this.form();\r\n formGroup?.addControl(this.name(), this.formControl);\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.autoHeight()) {\r\n setTimeout(() => this.#adjustHeight(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n const formGroup = this.form();\r\n formGroup?.removeControl(this.name());\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n // Hàm private tính toán chiều cao mượt mà\r\n #adjustHeight() {\r\n const el = this.textareaRef()?.nativeElement;\r\n if (el) {\r\n el.style.height = 'auto';\r\n el.style.overflowY = 'hidden';\r\n el.style.height = `${el.scrollHeight}px`;\r\n }\r\n }\r\n\r\n onFocus = () => {\r\n this.isFocused = true;\r\n };\r\n\r\n onBlur = () => {\r\n this.isFocused = false;\r\n const val: string = (this.formControl.value ?? '').toString();\r\n if (val.length > val.trim().length) {\r\n this.formControl.setValue(val.trim());\r\n }\r\n };\r\n\r\n onClick = () => {\r\n if (this.sdViewDef()?.templateRef) {\r\n if (!this.formControl.disabled && !this.isFocused) {\r\n this.focus();\r\n }\r\n }\r\n };\r\n\r\n blur = () => {\r\n this.textareaRef()?.nativeElement?.blur();\r\n };\r\n\r\n focus = () => {\r\n this.isFocused = true;\r\n setTimeout(() => {\r\n this.textareaRef()?.nativeElement?.focus();\r\n }, 100);\r\n };\r\n\r\n #onChange = (value: any) => {\r\n if (this.autoHeight()) {\r\n this.#adjustHeight();\r\n }\r\n this.valueModel.set(value);\r\n this.sdChange.emit(value);\r\n };\r\n\r\n #updateValidator = (\r\n req: boolean, maxLen: number | null, pat: string | undefined, \r\n val: SdCustomValidator | undefined, inl: string | undefined\r\n ) => {\r\n this.formControl.clearValidators();\r\n this.formControl.clearAsyncValidators();\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n if (req) validators.push(Validators.required);\r\n if (maxLen != null) validators.push(Validators.maxLength(maxLen));\r\n if (pat) validators.push(Validators.pattern(pat));\r\n if (val) asyncValidators.push(this.#customValidator(val));\r\n if (inl) validators.push(this.customInlineErrorValidator());\r\n\r\n this.formControl.setValidators(validators.length ? validators : null);\r\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n };\r\n\r\n customInlineErrorValidator(): ValidatorFn {\r\n return (): Record<string, any> | null => ({ inlineError: true });\r\n }\r\n\r\n getCurrentLength = (): number => {\r\n return (this.formControl.value ?? '').toString().length;\r\n };\r\n\r\n isMaxlengthExceeded = (): boolean => {\r\n const max = this.maxlength();\r\n return !!(max && max > 0 && this.getCurrentLength() > max);\r\n };\r\n\r\n #customValidator = (func: (value: any) => string | Promise<string>): AsyncValidatorFn => {\r\n return async (c: AbstractControl): Promise<Record<string, any> | null> => {\r\n const value = c.value || null;\r\n if (func && typeof func === 'function') {\r\n const result = func(value);\r\n if (result instanceof Promise) {\r\n const message = await result;\r\n if (message) return { customValidator: message };\r\n return null;\r\n }\r\n if (result) return { customValidator: result };\r\n return null;\r\n }\r\n return null;\r\n };\r\n };\r\n}","@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _errorMessage = errorTooltipMessage;\r\n@let _viewDef = sdViewDef();\r\n@let _labelDef = sdLabelDef();\r\n@let _helperText = helperText();\r\n@let _required = required();\r\n@let _maxLength = maxlength();\r\n\r\n@if (viewed()) {\r\n @if (_labelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"_labelDef!.templateRef\"> </ng-container>\r\n } @else if (_label) {\r\n <div class=\"T14R text-black400\">{{ _label }}</div>\r\n }\r\n <div class=\"T14M\">{{ formControl.value | sdEmpty }}</div>\r\n} @else {\r\n @if (!_appearance && _labelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"_labelDef!.templateRef\"> </ng-container>\r\n }\r\n @if (!_appearance && _label && !_labelDef?.templateRef) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n\r\n <div\r\n class=\"d-flex align-items-center sd-textarea-container\"\r\n [class.sd-view]=\"_viewDef?.templateRef\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\"\r\n aria-hidden=\"true\">\r\n @if (_viewDef?.templateRef && !isFocused) {\r\n <ng-container *ngTemplateOutlet=\"_viewDef!.templateRef; context: { value: formControl.value }\"> </ng-container>\r\n } @else {\r\n <div class=\"sd-textarea-field-wrap\">\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [appearance]=\"_appearance!\"\r\n [floatLabel]=\"floatLabel()\">\r\n @if (_appearance && _label) {\r\n <mat-label style=\"display: inline-block\">\r\n <div style=\"display: flex; align-items: center; gap: 4px\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"above\">info_outline</mat-icon>\r\n }\r\n </div>\r\n </mat-label>\r\n }\r\n\r\n <textarea\r\n matInput\r\n [placeholder]=\"placeholder() || _label || ''\"\r\n [formControl]=\"formControl\"\r\n [required]=\"_required\"\r\n autocomplete=\"off\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [rows]=\"rows()\"\r\n [attr.data-autoId]=\"autoId()\"\r\n spellcheck=\"false\"\r\n #textarea>\r\n </textarea>\r\n\r\n @if (_hideInlineError && _errorMessage && formControl.touched) {\r\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\r\n }\r\n\r\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\r\n <mat-error>{{ _errorMessage }}</mat-error>\r\n }\r\n\r\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\r\n <ng-container matSuffix>\r\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\r\n </ng-container>\r\n }\r\n <!-- <ng-container matSuffix>\r\n <ng-content select=\"[sdSuffix]\"></ng-content>\r\n </ng-container> -->\r\n </mat-form-field>\r\n\r\n @if (_maxLength !== null && !_hideInlineError && !formControl.disabled) {\r\n <div\r\n class=\"sd-maxlength-counter\"\r\n [class.sd-maxlength-counter--visible]=\"isFocused\"\r\n [class.sd-maxlength-counter--exceeded]=\"isMaxlengthExceeded()\"\r\n [attr.title]=\"isMaxlengthExceeded() ? 'Vượt quá số ký tự tối đa' : null\">\r\n {{ getCurrentLength() }}/{{ _maxLength }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken,
|
|
2
|
+
import { InjectionToken, inject, Injectable, NgModule } from '@angular/core';
|
|
3
|
+
import { HttpClient, HttpResponse, HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
|
4
|
+
import { SdCacheService } from '@sd-angular/core/services/cache';
|
|
3
5
|
import { SdUtilities } from '@sd-angular/core/utilities/extensions';
|
|
4
6
|
import { lastValueFrom, from, throwError } from 'rxjs';
|
|
5
7
|
import { timeout, map, catchError, shareReplay, switchMap } from 'rxjs/operators';
|
|
6
8
|
import { v4 } from 'uuid';
|
|
7
|
-
import * as i1 from '@angular/common/http';
|
|
8
|
-
import { HttpResponse, HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
|
|
9
|
-
import * as i2 from '@sd-angular/core/services/cache';
|
|
10
9
|
|
|
11
10
|
const SD_API_CONFIG = new InjectionToken('sd-api.configuration');
|
|
12
11
|
|
|
12
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
13
13
|
class SdApiService {
|
|
14
|
-
httpClient;
|
|
15
|
-
configurations;
|
|
16
|
-
cacheService;
|
|
17
14
|
#defaultTimeout = 60000; // 60s
|
|
18
15
|
#dedupCacheDuration = 1000; // 1s (Deduplication cache duration)
|
|
16
|
+
#httpClient = inject(HttpClient);
|
|
17
|
+
#configurations = inject(SD_API_CONFIG, { optional: true }) || [];
|
|
18
|
+
#cacheService = inject(SdCacheService);
|
|
19
19
|
// Thay đổi cấu trúc Cache: Lưu Observable thay vì Subject phức tạp
|
|
20
20
|
// Key: hash string -> Value: { stream$: Observable, expiry: number }
|
|
21
21
|
#inFlightRequests = new Map();
|
|
22
|
-
constructor(
|
|
23
|
-
this.httpClient = httpClient;
|
|
24
|
-
this.configurations = configurations;
|
|
25
|
-
this.cacheService = cacheService;
|
|
22
|
+
constructor() {
|
|
26
23
|
// Optional: Cơ chế dọn dẹp cache định kỳ (mỗi 1 phút dọn dẹp các key hết hạn)
|
|
27
24
|
setInterval(() => this.#cleanupCache(), 60000);
|
|
28
25
|
}
|
|
29
26
|
get http() {
|
|
30
|
-
return this
|
|
27
|
+
return this.#httpClient;
|
|
31
28
|
}
|
|
32
29
|
// --- PUBLIC METHODS ---
|
|
33
30
|
get = (url, option) => {
|
|
@@ -67,7 +64,7 @@ class SdApiService {
|
|
|
67
64
|
// Layer 1: Persistent Cache (SdCacheService)
|
|
68
65
|
if (option?.cacheOption) {
|
|
69
66
|
const key = this.#generateKey(url, method, body, option);
|
|
70
|
-
const { get, set, has } = this
|
|
67
|
+
const { get, set, has } = this.#cacheService.create(key, option.cacheOption);
|
|
71
68
|
if (has()) {
|
|
72
69
|
return get();
|
|
73
70
|
}
|
|
@@ -94,7 +91,7 @@ class SdApiService {
|
|
|
94
91
|
const handler = this.#getHandler(url);
|
|
95
92
|
const apiTimeout = option?.timeout ?? handler?.timeout ?? this.#defaultTimeout;
|
|
96
93
|
// Tạo Observable call API
|
|
97
|
-
const request$ = this
|
|
94
|
+
const request$ = this.#httpClient
|
|
98
95
|
.request(method, url, {
|
|
99
96
|
body,
|
|
100
97
|
headers: option?.headers,
|
|
@@ -130,7 +127,7 @@ class SdApiService {
|
|
|
130
127
|
};
|
|
131
128
|
// --- HELPERS ---
|
|
132
129
|
#getHandler = (url) => {
|
|
133
|
-
const handlers = this.
|
|
130
|
+
const handlers = this.#configurations.flatMap(b => b?.handlers || []);
|
|
134
131
|
return handlers.find(e => e.hosts.some(host => url.startsWith(host)));
|
|
135
132
|
};
|
|
136
133
|
#generateKey = (url, method, body, option) => {
|
|
@@ -155,7 +152,7 @@ class SdApiService {
|
|
|
155
152
|
}
|
|
156
153
|
});
|
|
157
154
|
}
|
|
158
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiService, deps: [
|
|
155
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
159
156
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiService, providedIn: 'root' });
|
|
160
157
|
}
|
|
161
158
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiService, decorators: [{
|
|
@@ -163,25 +160,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
|
|
|
163
160
|
args: [{
|
|
164
161
|
providedIn: 'root',
|
|
165
162
|
}]
|
|
166
|
-
}], ctorParameters: () => [
|
|
167
|
-
type: Inject,
|
|
168
|
-
args: [SD_API_CONFIG]
|
|
169
|
-
}, {
|
|
170
|
-
type: Optional
|
|
171
|
-
}] }, { type: i2.SdCacheService }] });
|
|
163
|
+
}], ctorParameters: () => [] });
|
|
172
164
|
|
|
173
165
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
174
166
|
class SdHttpInterceptor {
|
|
175
|
-
configurations;
|
|
176
|
-
constructor(configurations) {
|
|
177
|
-
this.configurations = configurations;
|
|
178
|
-
}
|
|
167
|
+
#configurations = inject(SD_API_CONFIG, { optional: true }) || [];
|
|
179
168
|
intercept(request, next) {
|
|
180
169
|
const url = request.url;
|
|
181
170
|
if (!url) {
|
|
182
171
|
throw new Error(`Invalid URL`);
|
|
183
172
|
}
|
|
184
|
-
const handlers = this.
|
|
173
|
+
const handlers = this.#configurations.flatMap(configuration => configuration?.handlers || []);
|
|
185
174
|
const handler = handlers?.find(e => e.hosts.some(host => url.startsWith(host)));
|
|
186
175
|
const intercept = handler?.intercept;
|
|
187
176
|
if (intercept) {
|
|
@@ -216,17 +205,12 @@ class SdHttpInterceptor {
|
|
|
216
205
|
return throwError(() => error);
|
|
217
206
|
}));
|
|
218
207
|
}
|
|
219
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdHttpInterceptor, deps: [
|
|
208
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdHttpInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
220
209
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdHttpInterceptor });
|
|
221
210
|
}
|
|
222
211
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdHttpInterceptor, decorators: [{
|
|
223
212
|
type: Injectable
|
|
224
|
-
}]
|
|
225
|
-
type: Inject,
|
|
226
|
-
args: [SD_API_CONFIG]
|
|
227
|
-
}, {
|
|
228
|
-
type: Optional
|
|
229
|
-
}] }] });
|
|
213
|
+
}] });
|
|
230
214
|
|
|
231
215
|
class SdApiModule {
|
|
232
216
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-services-api.mjs","sources":["../../../projects/sd-angular/services/api/src/api.model.ts","../../../projects/sd-angular/services/api/src/api.service.ts","../../../projects/sd-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sd-angular/services/api/src/api.module.ts","../../../projects/sd-angular/services/api/sd-angular-core-services-api.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpClient, HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { InjectionToken } from '@angular/core';\r\nimport { SdCacheOption } from '@sd-angular/core/services/cache';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n// import hash from 'object-hash';\r\n\r\nexport interface SdApiOption {\r\n cacheOption?: SdCacheOption;\r\n timeout?: number; // Default: 30000 (30s)\r\n autoCache?: boolean; // Default: true\r\n}\r\ntype HttpGetOption = Parameters<HttpClient['get']>[1];\r\nexport type SdGetOption = HttpGetOption & SdApiOption;\r\n\r\ntype HttpPostOption = Parameters<HttpClient['post']>[2];\r\nexport type SdPostOption = HttpPostOption & SdApiOption;\r\n\r\ntype HttpPutOption = Parameters<HttpClient['put']>[2];\r\nexport type SdPutOption = HttpPutOption & SdApiOption;\r\n\r\ntype HttpDeleteOption = Parameters<HttpClient['delete']>[1];\r\nexport type SdDeleteOption = HttpDeleteOption & SdApiOption;\r\n\r\nexport interface SdApiHandler {\r\n /** Danh sách host URL mà handler này sẽ xử lý */\r\n hosts: string[];\r\n /** Can thiệp request: gắn header, token, transform body... */\r\n intercept?: (request: HttpRequest<any>) => HttpRequest<any>;\r\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\r\n beforeRemote?: (request: HttpRequest<any>) => void | Promise<void>;\r\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\r\n afterRemote?: (\r\n response: HttpResponse<any> | HttpErrorResponse | Error\r\n ) => void | Promise<void>;\r\n /** Transform response body thành kiểu dữ liệu mong muốn */\r\n mapResponse?: <Tres = any, Tdata = any>(response: Tres) => Tdata;\r\n /** Timeout tính bằng milliseconds. Mặc định: 30000 (30 giây) */\r\n timeout?: number;\r\n}\r\n\r\nexport interface ISdApiConfiguration {\r\n handlers: SdApiHandler[];\r\n}\r\n\r\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { SdCacheService } from '@sd-angular/core/services/cache';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { lastValueFrom, Observable } from 'rxjs';\r\nimport { catchError, map, shareReplay, timeout } from 'rxjs/operators';\r\nimport { v4 } from 'uuid';\r\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler, SdDeleteOption, SdGetOption, SdPostOption, SdPutOption } from './api.model';\r\n\r\n// Gom nhóm các Option lại cho gọn\r\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdDeleteOption;\r\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdApiService {\r\n readonly #defaultTimeout = 60000; // 60s\r\n readonly #dedupCacheDuration = 1000; // 1s (Deduplication cache duration)\r\n\r\n // Thay đổi cấu trúc Cache: Lưu Observable thay vì Subject phức tạp\r\n // Key: hash string -> Value: { stream$: Observable, expiry: number }\r\n #inFlightRequests: Map<string, { stream$: Observable<any>; expiry: number }> = new Map();\r\n\r\n constructor(\r\n private httpClient: HttpClient,\r\n @Inject(SD_API_CONFIG) @Optional() private configurations: ISdApiConfiguration[],\r\n private cacheService: SdCacheService\r\n ) {\r\n // Optional: Cơ chế dọn dẹp cache định kỳ (mỗi 1 phút dọn dẹp các key hết hạn)\r\n setInterval(() => this.#cleanupCache(), 60000);\r\n }\r\n\r\n get http() {\r\n return this.httpClient;\r\n }\r\n\r\n // --- PUBLIC METHODS ---\r\n\r\n get = <T = any>(url: string, option?: SdGetOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\r\n };\r\n\r\n post = <T = any>(url: string, body?: any, option?: SdPostOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\r\n };\r\n\r\n put = <T = any>(url: string, body?: any, option?: SdPutOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\r\n };\r\n\r\n delete = <T = any>(url: string, option?: SdDeleteOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\r\n };\r\n\r\n // Upload file logic giữ nguyên nhưng refactor nhẹ\r\n upload = async (url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<any> => {\r\n const file = await SdUtilities.upload(option);\r\n if (!Array.isArray(file) && file) {\r\n return this.uploadFile(url, file);\r\n }\r\n };\r\n\r\n uploadFile = async (url: string, file: File): Promise<any> => {\r\n if (!file) return null;\r\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\r\n\r\n const formData = new FormData();\r\n formData.append('file', file, file.name);\r\n // Upload thường không cần deduplication cache, set autoCache: false\r\n return await this.post(url, formData, { autoCache: false });\r\n };\r\n\r\n // --- PRIVATE CORE LOGIC ---\r\n\r\n /**\r\n * Hàm trung gian xử lý Layer Cache (SdCacheService) trước khi gọi API thực tế\r\n */\r\n #executeWithLayeredCache = async <T>(url: string, method: HttpMethod, body?: any, option?: SdHttpOptions): Promise<T> => {\r\n // Layer 1: Persistent Cache (SdCacheService)\r\n if (option?.cacheOption) {\r\n const key = this.#generateKey(url, method, body, option);\r\n const { get, set, has } = this.cacheService.create(key, option.cacheOption);\r\n\r\n if (has()) {\r\n return get();\r\n }\r\n\r\n const result = await this.#request<T>(url, method, body, option);\r\n set(result);\r\n return result;\r\n }\r\n\r\n // Không có cache dài hạn thì gọi trực tiếp logic deduplication\r\n return this.#request<T>(url, method, body, option);\r\n };\r\n\r\n /**\r\n * Core Request: Xử lý Deduplication, Timeout, Mapping Response\r\n */\r\n #request = <T>(url: string, method: HttpMethod, body: any, option?: SdHttpOptions): Promise<T> => {\r\n const key = this.#generateKey(url, method, body, option);\r\n\r\n // Layer 2: Deduplication Cache (In-Flight Request / Short-term cache)\r\n const now = Date.now();\r\n const cachedItem = this.#inFlightRequests.get(key);\r\n\r\n // Nếu đã có request đang chạy hoặc mới chạy xong trong vòng 1s -> Trả về stream đó luôn\r\n if (cachedItem && cachedItem.expiry > now) {\r\n return lastValueFrom(cachedItem.stream$);\r\n }\r\n\r\n // Setup request mới\r\n const handler = this.#getHandler(url);\r\n const apiTimeout = option?.timeout ?? handler?.timeout ?? this.#defaultTimeout;\r\n\r\n // Tạo Observable call API\r\n const request$ = this.httpClient\r\n .request(method, url, {\r\n body,\r\n headers: option?.headers,\r\n params: option?.params,\r\n observe: 'response', // Lấy full response để check status\r\n responseType: option?.responseType,\r\n })\r\n .pipe(\r\n timeout(apiTimeout),\r\n map(res => {\r\n // Normalize Response Logic\r\n const bodyRes = res.body as any;\r\n // Logic check response cũ của bạn\r\n if (bodyRes && typeof bodyRes === 'object' && 'ok' in bodyRes && !bodyRes.ok) {\r\n throw bodyRes; // Giả sử structure trả về { ok: false, ... } là lỗi\r\n }\r\n\r\n if (handler?.mapResponse) {\r\n return handler.mapResponse(bodyRes);\r\n }\r\n\r\n return bodyRes;\r\n }),\r\n catchError(err => {\r\n // Xóa cache ngay lập tức nếu lỗi để user có thể retry\r\n this.#inFlightRequests.delete(key);\r\n throw err;\r\n }),\r\n // QUAN TRỌNG: shareReplay(1) giúp share kết quả cho các subscriber đến sau (trong 1s)\r\n shareReplay(1)\r\n );\r\n\r\n // Lưu vào Map\r\n this.#inFlightRequests.set(key, {\r\n stream$: request$,\r\n expiry: now + this.#dedupCacheDuration,\r\n });\r\n\r\n // Chuyển đổi sang Promise cho đúng return type của bạn\r\n return lastValueFrom(request$);\r\n };\r\n\r\n // --- HELPERS ---\r\n\r\n #getHandler = (url: string): SdApiHandler | undefined => {\r\n const handlers = this.configurations?.flatMap(b => b?.handlers || []) || [];\r\n return handlers.find(e => e.hosts.some(host => url.startsWith(host)));\r\n };\r\n\r\n #generateKey = (url: string, method: HttpMethod, body: any, option?: SdHttpOptions): string => {\r\n // FormData không hash được nội dung file, luôn generate key mới\r\n if (body instanceof FormData || option?.autoCache === false) {\r\n return v4();\r\n }\r\n return SdUtilities.hash({\r\n url,\r\n method,\r\n params: option?.params,\r\n headers: option?.headers,\r\n body,\r\n });\r\n };\r\n\r\n // Dọn dẹp memory leak\r\n #cleanupCache() {\r\n const now = Date.now();\r\n this.#inFlightRequests.forEach((value, key) => {\r\n if (value.expiry < now) {\r\n this.#inFlightRequests.delete(key);\r\n }\r\n });\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { from, Observable, throwError } from 'rxjs';\r\nimport { catchError, map, switchMap } from 'rxjs/operators';\r\nimport { SD_API_CONFIG, ISdApiConfiguration, SdApiHandler } from '../api.model';\r\n\r\n@Injectable()\r\nexport class SdHttpInterceptor implements HttpInterceptor {\r\n constructor(\r\n @Inject(SD_API_CONFIG)\r\n @Optional()\r\n private configurations: ISdApiConfiguration[]\r\n ) {}\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const url = request.url;\r\n if (!url) {\r\n throw new Error(`Invalid URL`);\r\n }\r\n const handlers = this.configurations?.reduce<SdApiHandler[]>((a, b) => [...a, ...(b?.handlers || [])], []) || [];\r\n const handler = handlers?.find(e => e.hosts.some(host => url.startsWith(host)));\r\n const intercept = handler?.intercept;\r\n if (intercept) {\r\n request = request.clone(intercept(request));\r\n }\r\n if (request.body instanceof FormData) {\r\n request = request.clone({\r\n headers: request.headers.delete('Content-Type'),\r\n });\r\n }\r\n const beforeRemoteHandler = handler?.beforeRemote;\r\n const afterRemoteHandler = handler?.afterRemote;\r\n const beforeRemote = beforeRemoteHandler?.(request);\r\n if (beforeRemote instanceof Promise) {\r\n return from(beforeRemote).pipe(\r\n switchMap(() => next.handle(request)),\r\n map((event: HttpEvent<any>) => {\r\n if (event instanceof HttpResponse) {\r\n afterRemoteHandler?.(event);\r\n }\r\n return event;\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n afterRemoteHandler?.(error);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n return next.handle(request).pipe(\r\n map((event: HttpEvent<any>) => {\r\n if (event instanceof HttpResponse) {\r\n afterRemoteHandler?.(event);\r\n }\r\n return event;\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n afterRemoteHandler?.(error);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n}\r\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\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-api.mjs","sources":["../../../projects/sd-angular/services/api/src/api.model.ts","../../../projects/sd-angular/services/api/src/api.service.ts","../../../projects/sd-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sd-angular/services/api/src/api.module.ts","../../../projects/sd-angular/services/api/sd-angular-core-services-api.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpClient, HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { InjectionToken } from '@angular/core';\r\nimport { SdCacheOption } from '@sd-angular/core/services/cache';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n// import hash from 'object-hash';\r\n\r\nexport interface SdApiOption {\r\n cacheOption?: SdCacheOption;\r\n timeout?: number; // Default: 30000 (30s)\r\n autoCache?: boolean; // Default: true\r\n}\r\ntype HttpGetOption = Parameters<HttpClient['get']>[1];\r\nexport type SdGetOption = HttpGetOption & SdApiOption;\r\n\r\ntype HttpPostOption = Parameters<HttpClient['post']>[2];\r\nexport type SdPostOption = HttpPostOption & SdApiOption;\r\n\r\ntype HttpPutOption = Parameters<HttpClient['put']>[2];\r\nexport type SdPutOption = HttpPutOption & SdApiOption;\r\n\r\ntype HttpDeleteOption = Parameters<HttpClient['delete']>[1];\r\nexport type SdDeleteOption = HttpDeleteOption & SdApiOption;\r\n\r\nexport interface SdApiHandler {\r\n /** Danh sách host URL mà handler này sẽ xử lý */\r\n hosts: string[];\r\n /** Can thiệp request: gắn header, token, transform body... */\r\n intercept?: (request: HttpRequest<any>) => HttpRequest<any>;\r\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\r\n beforeRemote?: (request: HttpRequest<any>) => void | Promise<void>;\r\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\r\n afterRemote?: (\r\n response: HttpResponse<any> | HttpErrorResponse | Error\r\n ) => void | Promise<void>;\r\n /** Transform response body thành kiểu dữ liệu mong muốn */\r\n mapResponse?: <Tres = any, Tdata = any>(response: Tres) => Tdata;\r\n /** Timeout tính bằng milliseconds. Mặc định: 30000 (30 giây) */\r\n timeout?: number;\r\n}\r\n\r\nexport interface ISdApiConfiguration {\r\n handlers: SdApiHandler[];\r\n}\r\n\r\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { SdCacheService } from '@sd-angular/core/services/cache';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\nimport { lastValueFrom, Observable } from 'rxjs';\r\nimport { catchError, map, shareReplay, timeout } from 'rxjs/operators';\r\nimport { v4 } from 'uuid';\r\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler, SdDeleteOption, SdGetOption, SdPostOption, SdPutOption } from './api.model';\r\n\r\n// Gom nhóm các Option lại cho gọn\r\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdDeleteOption;\r\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdApiService {\r\n readonly #defaultTimeout = 60000; // 60s\r\n readonly #dedupCacheDuration = 1000; // 1s (Deduplication cache duration)\r\n #httpClient = inject(HttpClient);\r\n #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) || [];\r\n #cacheService = inject(SdCacheService);\r\n\r\n // Thay đổi cấu trúc Cache: Lưu Observable thay vì Subject phức tạp\r\n // Key: hash string -> Value: { stream$: Observable, expiry: number }\r\n #inFlightRequests: Map<string, { stream$: Observable<any>; expiry: number }> = new Map();\r\n\r\n constructor() {\r\n // Optional: Cơ chế dọn dẹp cache định kỳ (mỗi 1 phút dọn dẹp các key hết hạn)\r\n setInterval(() => this.#cleanupCache(), 60000);\r\n }\r\n\r\n get http() {\r\n return this.#httpClient;\r\n }\r\n\r\n // --- PUBLIC METHODS ---\r\n\r\n get = <T = any>(url: string, option?: SdGetOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\r\n };\r\n\r\n post = <T = any>(url: string, body?: any, option?: SdPostOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\r\n };\r\n\r\n put = <T = any>(url: string, body?: any, option?: SdPutOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\r\n };\r\n\r\n delete = <T = any>(url: string, option?: SdDeleteOption): Promise<T> => {\r\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\r\n };\r\n\r\n // Upload file logic giữ nguyên nhưng refactor nhẹ\r\n upload = async (url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<any> => {\r\n const file = await SdUtilities.upload(option);\r\n if (!Array.isArray(file) && file) {\r\n return this.uploadFile(url, file);\r\n }\r\n };\r\n\r\n uploadFile = async (url: string, file: File): Promise<any> => {\r\n if (!file) return null;\r\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\r\n\r\n const formData = new FormData();\r\n formData.append('file', file, file.name);\r\n // Upload thường không cần deduplication cache, set autoCache: false\r\n return await this.post(url, formData, { autoCache: false });\r\n };\r\n\r\n // --- PRIVATE CORE LOGIC ---\r\n\r\n /**\r\n * Hàm trung gian xử lý Layer Cache (SdCacheService) trước khi gọi API thực tế\r\n */\r\n #executeWithLayeredCache = async <T>(url: string, method: HttpMethod, body?: any, option?: SdHttpOptions): Promise<T> => {\r\n // Layer 1: Persistent Cache (SdCacheService)\r\n if (option?.cacheOption) {\r\n const key = this.#generateKey(url, method, body, option);\r\n const { get, set, has } = this.#cacheService.create(key, option.cacheOption);\r\n\r\n if (has()) {\r\n return get();\r\n }\r\n\r\n const result = await this.#request<T>(url, method, body, option);\r\n set(result);\r\n return result;\r\n }\r\n\r\n // Không có cache dài hạn thì gọi trực tiếp logic deduplication\r\n return this.#request<T>(url, method, body, option);\r\n };\r\n\r\n /**\r\n * Core Request: Xử lý Deduplication, Timeout, Mapping Response\r\n */\r\n #request = <T>(url: string, method: HttpMethod, body: any, option?: SdHttpOptions): Promise<T> => {\r\n const key = this.#generateKey(url, method, body, option);\r\n\r\n // Layer 2: Deduplication Cache (In-Flight Request / Short-term cache)\r\n const now = Date.now();\r\n const cachedItem = this.#inFlightRequests.get(key);\r\n\r\n // Nếu đã có request đang chạy hoặc mới chạy xong trong vòng 1s -> Trả về stream đó luôn\r\n if (cachedItem && cachedItem.expiry > now) {\r\n return lastValueFrom(cachedItem.stream$);\r\n }\r\n\r\n // Setup request mới\r\n const handler = this.#getHandler(url);\r\n const apiTimeout = option?.timeout ?? handler?.timeout ?? this.#defaultTimeout;\r\n\r\n // Tạo Observable call API\r\n const request$ = this.#httpClient\r\n .request(method, url, {\r\n body,\r\n headers: option?.headers,\r\n params: option?.params,\r\n observe: 'response', // Lấy full response để check status\r\n responseType: option?.responseType,\r\n })\r\n .pipe(\r\n timeout(apiTimeout),\r\n map(res => {\r\n // Normalize Response Logic\r\n const bodyRes = res.body as any;\r\n // Logic check response cũ của bạn\r\n if (bodyRes && typeof bodyRes === 'object' && 'ok' in bodyRes && !bodyRes.ok) {\r\n throw bodyRes; // Giả sử structure trả về { ok: false, ... } là lỗi\r\n }\r\n\r\n if (handler?.mapResponse) {\r\n return handler.mapResponse(bodyRes);\r\n }\r\n\r\n return bodyRes;\r\n }),\r\n catchError(err => {\r\n // Xóa cache ngay lập tức nếu lỗi để user có thể retry\r\n this.#inFlightRequests.delete(key);\r\n throw err;\r\n }),\r\n // QUAN TRỌNG: shareReplay(1) giúp share kết quả cho các subscriber đến sau (trong 1s)\r\n shareReplay(1)\r\n );\r\n\r\n // Lưu vào Map\r\n this.#inFlightRequests.set(key, {\r\n stream$: request$,\r\n expiry: now + this.#dedupCacheDuration,\r\n });\r\n\r\n // Chuyển đổi sang Promise cho đúng return type của bạn\r\n return lastValueFrom(request$);\r\n };\r\n\r\n // --- HELPERS ---\r\n\r\n #getHandler = (url: string): SdApiHandler | undefined => {\r\n const handlers = this.#configurations.flatMap(b => b?.handlers || []);\r\n return handlers.find(e => e.hosts.some(host => url.startsWith(host)));\r\n };\r\n\r\n #generateKey = (url: string, method: HttpMethod, body: any, option?: SdHttpOptions): string => {\r\n // FormData không hash được nội dung file, luôn generate key mới\r\n if (body instanceof FormData || option?.autoCache === false) {\r\n return v4();\r\n }\r\n return SdUtilities.hash({\r\n url,\r\n method,\r\n params: option?.params,\r\n headers: option?.headers,\r\n body,\r\n });\r\n };\r\n\r\n // Dọn dẹp memory leak\r\n #cleanupCache() {\r\n const now = Date.now();\r\n this.#inFlightRequests.forEach((value, key) => {\r\n if (value.expiry < now) {\r\n this.#inFlightRequests.delete(key);\r\n }\r\n });\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { from, Observable, throwError } from 'rxjs';\r\nimport { catchError, map, switchMap } from 'rxjs/operators';\r\nimport { ISdApiConfiguration, SD_API_CONFIG } from '../api.model';\r\n\r\n@Injectable()\r\nexport class SdHttpInterceptor implements HttpInterceptor {\r\n #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) || [];\r\n\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const url = request.url;\r\n if (!url) {\r\n throw new Error(`Invalid URL`);\r\n }\r\n const handlers = this.#configurations.flatMap(configuration => configuration?.handlers || []);\r\n const handler = handlers?.find(e => e.hosts.some(host => url.startsWith(host)));\r\n const intercept = handler?.intercept;\r\n if (intercept) {\r\n request = request.clone(intercept(request));\r\n }\r\n if (request.body instanceof FormData) {\r\n request = request.clone({\r\n headers: request.headers.delete('Content-Type'),\r\n });\r\n }\r\n const beforeRemoteHandler = handler?.beforeRemote;\r\n const afterRemoteHandler = handler?.afterRemote;\r\n const beforeRemote = beforeRemoteHandler?.(request);\r\n if (beforeRemote instanceof Promise) {\r\n return from(beforeRemote).pipe(\r\n switchMap(() => next.handle(request)),\r\n map((event: HttpEvent<any>) => {\r\n if (event instanceof HttpResponse) {\r\n afterRemoteHandler?.(event);\r\n }\r\n return event;\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n afterRemoteHandler?.(error);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n return next.handle(request).pipe(\r\n map((event: HttpEvent<any>) => {\r\n if (event instanceof HttpResponse) {\r\n afterRemoteHandler?.(event);\r\n }\r\n return event;\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n afterRemoteHandler?.(error);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n}\r\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,8 @@ export declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
|
|
|
61
61
|
ngOnDestroy(): void;
|
|
62
62
|
reValidate: () => void;
|
|
63
63
|
customInlineErrorValidator(): ValidatorFn;
|
|
64
|
+
getCurrentLength: () => number;
|
|
65
|
+
isMaxlengthExceeded: () => boolean;
|
|
64
66
|
onKeyupEnter: () => void;
|
|
65
67
|
onFocus: () => void;
|
|
66
68
|
onBlur: () => void;
|
|
@@ -63,7 +63,7 @@ export declare class SdSelect<T extends object | string | number = Record<string
|
|
|
63
63
|
calculatedPanelWidth: import("@angular/core").WritableSignal<string | number>;
|
|
64
64
|
normalizedValue: Signal<string | number | boolean | (string | number | boolean)[] | null | undefined>;
|
|
65
65
|
filtered: Signal<boolean>;
|
|
66
|
-
delayTime: Signal<
|
|
66
|
+
delayTime: Signal<0 | 500>;
|
|
67
67
|
itemValue: (item: T) => unknown;
|
|
68
68
|
itemDisplay: (item: T) => string;
|
|
69
69
|
itemDisabled: (item: T) => boolean;
|
|
@@ -52,6 +52,8 @@ export declare class SdTextarea implements OnInit, AfterViewInit, OnDestroy {
|
|
|
52
52
|
blur: () => void;
|
|
53
53
|
focus: () => void;
|
|
54
54
|
customInlineErrorValidator(): ValidatorFn;
|
|
55
|
+
getCurrentLength: () => number;
|
|
56
|
+
isMaxlengthExceeded: () => boolean;
|
|
55
57
|
static ɵfac: i0.ɵɵFactoryDeclaration<SdTextarea, never>;
|
|
56
58
|
static ɵcmp: i0.ɵɵComponentDeclaration<SdTextarea, "sd-textarea", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "autoHeight": { "alias": "autoHeight"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "validator": { "alias": "validator"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; }, ["sdViewDef", "sdLabelDef", "sdSuffixDef"], never, true, never>;
|
|
57
59
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sd-angular/core",
|
|
3
|
-
"version": "19.0.0-beta.
|
|
3
|
+
"version": "19.0.0-beta.89",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
6
6
|
"@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
@@ -31,17 +31,17 @@
|
|
|
31
31
|
"types": "./index.d.ts",
|
|
32
32
|
"default": "./fesm2022/sd-angular-core.mjs"
|
|
33
33
|
},
|
|
34
|
-
"./
|
|
35
|
-
"types": "./
|
|
36
|
-
"default": "./fesm2022/sd-angular-core-
|
|
34
|
+
"./components": {
|
|
35
|
+
"types": "./components/index.d.ts",
|
|
36
|
+
"default": "./fesm2022/sd-angular-core-components.mjs"
|
|
37
37
|
},
|
|
38
38
|
"./directives": {
|
|
39
39
|
"types": "./directives/index.d.ts",
|
|
40
40
|
"default": "./fesm2022/sd-angular-core-directives.mjs"
|
|
41
41
|
},
|
|
42
|
-
"./
|
|
43
|
-
"types": "./
|
|
44
|
-
"default": "./fesm2022/sd-angular-core-
|
|
42
|
+
"./configurations": {
|
|
43
|
+
"types": "./configurations/index.d.ts",
|
|
44
|
+
"default": "./fesm2022/sd-angular-core-configurations.mjs"
|
|
45
45
|
},
|
|
46
46
|
"./forms": {
|
|
47
47
|
"types": "./forms/index.d.ts",
|
|
@@ -79,14 +79,14 @@
|
|
|
79
79
|
"types": "./components/anchor-v2/index.d.ts",
|
|
80
80
|
"default": "./fesm2022/sd-angular-core-components-anchor-v2.mjs"
|
|
81
81
|
},
|
|
82
|
-
"./components/avatar": {
|
|
83
|
-
"types": "./components/avatar/index.d.ts",
|
|
84
|
-
"default": "./fesm2022/sd-angular-core-components-avatar.mjs"
|
|
85
|
-
},
|
|
86
82
|
"./components/badge": {
|
|
87
83
|
"types": "./components/badge/index.d.ts",
|
|
88
84
|
"default": "./fesm2022/sd-angular-core-components-badge.mjs"
|
|
89
85
|
},
|
|
86
|
+
"./components/avatar": {
|
|
87
|
+
"types": "./components/avatar/index.d.ts",
|
|
88
|
+
"default": "./fesm2022/sd-angular-core-components-avatar.mjs"
|
|
89
|
+
},
|
|
90
90
|
"./components/base": {
|
|
91
91
|
"types": "./components/base/index.d.ts",
|
|
92
92
|
"default": "./fesm2022/sd-angular-core-components-base.mjs"
|
|
@@ -107,6 +107,10 @@
|
|
|
107
107
|
"types": "./components/document-builder/index.d.ts",
|
|
108
108
|
"default": "./fesm2022/sd-angular-core-components-document-builder.mjs"
|
|
109
109
|
},
|
|
110
|
+
"./components/history": {
|
|
111
|
+
"types": "./components/history/index.d.ts",
|
|
112
|
+
"default": "./fesm2022/sd-angular-core-components-history.mjs"
|
|
113
|
+
},
|
|
110
114
|
"./components/editor": {
|
|
111
115
|
"types": "./components/editor/index.d.ts",
|
|
112
116
|
"default": "./fesm2022/sd-angular-core-components-editor.mjs"
|
|
@@ -119,10 +123,6 @@
|
|
|
119
123
|
"types": "./components/mini-editor/index.d.ts",
|
|
120
124
|
"default": "./fesm2022/sd-angular-core-components-mini-editor.mjs"
|
|
121
125
|
},
|
|
122
|
-
"./components/history": {
|
|
123
|
-
"types": "./components/history/index.d.ts",
|
|
124
|
-
"default": "./fesm2022/sd-angular-core-components-history.mjs"
|
|
125
|
-
},
|
|
126
126
|
"./components/modal": {
|
|
127
127
|
"types": "./components/modal/index.d.ts",
|
|
128
128
|
"default": "./fesm2022/sd-angular-core-components-modal.mjs"
|
|
@@ -147,50 +147,50 @@
|
|
|
147
147
|
"types": "./components/tab-router/index.d.ts",
|
|
148
148
|
"default": "./fesm2022/sd-angular-core-components-tab-router.mjs"
|
|
149
149
|
},
|
|
150
|
-
"./components/
|
|
151
|
-
"types": "./components/
|
|
152
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
150
|
+
"./components/side-drawer": {
|
|
151
|
+
"types": "./components/side-drawer/index.d.ts",
|
|
152
|
+
"default": "./fesm2022/sd-angular-core-components-side-drawer.mjs"
|
|
153
153
|
},
|
|
154
154
|
"./components/view": {
|
|
155
155
|
"types": "./components/view/index.d.ts",
|
|
156
156
|
"default": "./fesm2022/sd-angular-core-components-view.mjs"
|
|
157
157
|
},
|
|
158
|
+
"./components/table": {
|
|
159
|
+
"types": "./components/table/index.d.ts",
|
|
160
|
+
"default": "./fesm2022/sd-angular-core-components-table.mjs"
|
|
161
|
+
},
|
|
158
162
|
"./components/workflow": {
|
|
159
163
|
"types": "./components/workflow/index.d.ts",
|
|
160
164
|
"default": "./fesm2022/sd-angular-core-components-workflow.mjs"
|
|
161
165
|
},
|
|
162
|
-
"./components/side-drawer": {
|
|
163
|
-
"types": "./components/side-drawer/index.d.ts",
|
|
164
|
-
"default": "./fesm2022/sd-angular-core-components-side-drawer.mjs"
|
|
165
|
-
},
|
|
166
166
|
"./forms/autocomplete": {
|
|
167
167
|
"types": "./forms/autocomplete/index.d.ts",
|
|
168
168
|
"default": "./fesm2022/sd-angular-core-forms-autocomplete.mjs"
|
|
169
169
|
},
|
|
170
|
-
"./forms/checkbox": {
|
|
171
|
-
"types": "./forms/checkbox/index.d.ts",
|
|
172
|
-
"default": "./fesm2022/sd-angular-core-forms-checkbox.mjs"
|
|
173
|
-
},
|
|
174
170
|
"./forms/chip": {
|
|
175
171
|
"types": "./forms/chip/index.d.ts",
|
|
176
172
|
"default": "./fesm2022/sd-angular-core-forms-chip.mjs"
|
|
177
173
|
},
|
|
178
|
-
"./forms/
|
|
179
|
-
"types": "./forms/
|
|
180
|
-
"default": "./fesm2022/sd-angular-core-forms-
|
|
181
|
-
},
|
|
182
|
-
"./forms/date-range": {
|
|
183
|
-
"types": "./forms/date-range/index.d.ts",
|
|
184
|
-
"default": "./fesm2022/sd-angular-core-forms-date-range.mjs"
|
|
174
|
+
"./forms/checkbox": {
|
|
175
|
+
"types": "./forms/checkbox/index.d.ts",
|
|
176
|
+
"default": "./fesm2022/sd-angular-core-forms-checkbox.mjs"
|
|
185
177
|
},
|
|
186
178
|
"./forms/chip-calendar": {
|
|
187
179
|
"types": "./forms/chip-calendar/index.d.ts",
|
|
188
180
|
"default": "./fesm2022/sd-angular-core-forms-chip-calendar.mjs"
|
|
189
181
|
},
|
|
182
|
+
"./forms/date": {
|
|
183
|
+
"types": "./forms/date/index.d.ts",
|
|
184
|
+
"default": "./fesm2022/sd-angular-core-forms-date.mjs"
|
|
185
|
+
},
|
|
190
186
|
"./forms/datetime": {
|
|
191
187
|
"types": "./forms/datetime/index.d.ts",
|
|
192
188
|
"default": "./fesm2022/sd-angular-core-forms-datetime.mjs"
|
|
193
189
|
},
|
|
190
|
+
"./forms/date-range": {
|
|
191
|
+
"types": "./forms/date-range/index.d.ts",
|
|
192
|
+
"default": "./fesm2022/sd-angular-core-forms-date-range.mjs"
|
|
193
|
+
},
|
|
194
194
|
"./forms/directives": {
|
|
195
195
|
"types": "./forms/directives/index.d.ts",
|
|
196
196
|
"default": "./fesm2022/sd-angular-core-forms-directives.mjs"
|
|
@@ -199,30 +199,30 @@
|
|
|
199
199
|
"types": "./forms/input/index.d.ts",
|
|
200
200
|
"default": "./fesm2022/sd-angular-core-forms-input.mjs"
|
|
201
201
|
},
|
|
202
|
-
"./forms/input-number": {
|
|
203
|
-
"types": "./forms/input-number/index.d.ts",
|
|
204
|
-
"default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
|
|
205
|
-
},
|
|
206
202
|
"./forms/label": {
|
|
207
203
|
"types": "./forms/label/index.d.ts",
|
|
208
204
|
"default": "./fesm2022/sd-angular-core-forms-label.mjs"
|
|
209
205
|
},
|
|
210
|
-
"./forms/
|
|
211
|
-
"types": "./forms/
|
|
212
|
-
"default": "./fesm2022/sd-angular-core-forms-
|
|
206
|
+
"./forms/input-number": {
|
|
207
|
+
"types": "./forms/input-number/index.d.ts",
|
|
208
|
+
"default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
|
|
213
209
|
},
|
|
214
210
|
"./forms/models": {
|
|
215
211
|
"types": "./forms/models/index.d.ts",
|
|
216
212
|
"default": "./fesm2022/sd-angular-core-forms-models.mjs"
|
|
217
213
|
},
|
|
218
|
-
"./forms/switch": {
|
|
219
|
-
"types": "./forms/switch/index.d.ts",
|
|
220
|
-
"default": "./fesm2022/sd-angular-core-forms-switch.mjs"
|
|
221
|
-
},
|
|
222
214
|
"./forms/select": {
|
|
223
215
|
"types": "./forms/select/index.d.ts",
|
|
224
216
|
"default": "./fesm2022/sd-angular-core-forms-select.mjs"
|
|
225
217
|
},
|
|
218
|
+
"./forms/radio": {
|
|
219
|
+
"types": "./forms/radio/index.d.ts",
|
|
220
|
+
"default": "./fesm2022/sd-angular-core-forms-radio.mjs"
|
|
221
|
+
},
|
|
222
|
+
"./forms/switch": {
|
|
223
|
+
"types": "./forms/switch/index.d.ts",
|
|
224
|
+
"default": "./fesm2022/sd-angular-core-forms-switch.mjs"
|
|
225
|
+
},
|
|
226
226
|
"./forms/textarea": {
|
|
227
227
|
"types": "./forms/textarea/index.d.ts",
|
|
228
228
|
"default": "./fesm2022/sd-angular-core-forms-textarea.mjs"
|
|
@@ -279,6 +279,10 @@
|
|
|
279
279
|
"types": "./services/loading/index.d.ts",
|
|
280
280
|
"default": "./fesm2022/sd-angular-core-services-loading.mjs"
|
|
281
281
|
},
|
|
282
|
+
"./services/storage": {
|
|
283
|
+
"types": "./services/storage/index.d.ts",
|
|
284
|
+
"default": "./fesm2022/sd-angular-core-services-storage.mjs"
|
|
285
|
+
},
|
|
282
286
|
"./services/notify": {
|
|
283
287
|
"types": "./services/notify/index.d.ts",
|
|
284
288
|
"default": "./fesm2022/sd-angular-core-services-notify.mjs"
|
|
@@ -287,17 +291,13 @@
|
|
|
287
291
|
"types": "./utilities/extensions/index.d.ts",
|
|
288
292
|
"default": "./fesm2022/sd-angular-core-utilities-extensions.mjs"
|
|
289
293
|
},
|
|
290
|
-
"./services/storage": {
|
|
291
|
-
"types": "./services/storage/index.d.ts",
|
|
292
|
-
"default": "./fesm2022/sd-angular-core-services-storage.mjs"
|
|
293
|
-
},
|
|
294
294
|
"./utilities/models": {
|
|
295
295
|
"types": "./utilities/models/index.d.ts",
|
|
296
296
|
"default": "./fesm2022/sd-angular-core-utilities-models.mjs"
|
|
297
297
|
},
|
|
298
|
-
"./components/
|
|
299
|
-
"types": "./components/
|
|
300
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
298
|
+
"./components/upload-file": {
|
|
299
|
+
"types": "./components/upload-file/index.d.ts",
|
|
300
|
+
"default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
|
|
301
301
|
}
|
|
302
302
|
}
|
|
303
303
|
}
|
|
Binary file
|