@nexterajs/ui 0.0.1
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/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +64 -0
- package/fesm2022/nexterajs-ui-animations.mjs +184 -0
- package/fesm2022/nexterajs-ui-animations.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-core.mjs +326 -0
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs +953 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-excel.mjs +779 -0
- package/fesm2022/nexterajs-ui-excel.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-file-uploader.mjs +125 -0
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-forms.mjs +1113 -0
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-grid.mjs +4145 -0
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-intl.mjs +377 -0
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +4739 -0
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-styling.mjs +59 -0
- package/fesm2022/nexterajs-ui-styling.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs +202 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-validation.mjs +269 -0
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -0
- package/fesm2022/nexterajs-ui.mjs +23 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -0
- package/package.json +100 -0
- package/styles/_button-directives.scss +39 -0
- package/styles/_dropdown.scss +113 -0
- package/styles/_editor.scss +146 -0
- package/styles/_mixins.scss +2 -0
- package/styles/_tokens.scss +77 -0
- package/styles/_widget.scss +58 -0
- package/styles/index.scss +83 -0
- package/types/nexterajs-ui-animations.d.ts +22 -0
- package/types/nexterajs-ui-core.d.ts +328 -0
- package/types/nexterajs-ui-dropdowns.d.ts +334 -0
- package/types/nexterajs-ui-excel.d.ts +159 -0
- package/types/nexterajs-ui-file-uploader.d.ts +47 -0
- package/types/nexterajs-ui-forms.d.ts +296 -0
- package/types/nexterajs-ui-grid.d.ts +1485 -0
- package/types/nexterajs-ui-intl.d.ts +125 -0
- package/types/nexterajs-ui-pivot.d.ts +1470 -0
- package/types/nexterajs-ui-styling.d.ts +40 -0
- package/types/nexterajs-ui-tree-view.d.ts +69 -0
- package/types/nexterajs-ui-validation.d.ts +102 -0
- package/types/nexterajs-ui.d.ts +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexterajs-ui-forms.mjs","sources":["../../../projects/nextera-ui/forms/src/lib/button/nxe-button.component.ts","../../../projects/nextera-ui/forms/src/lib/text-box/nxe-text-box.component.ts","../../../projects/nextera-ui/forms/src/lib/text-area/nxe-text-area.component.ts","../../../projects/nextera-ui/forms/src/lib/check-box/nxe-check-box.component.ts","../../../projects/nextera-ui/forms/src/lib/number-box/nxe-number-box.component.ts","../../../projects/nextera-ui/forms/src/lib/date-box/nxe-date-box.component.ts","../../../projects/nextera-ui/forms/src/lib/scroll-view/nxe-scroll-view.component.ts","../../../projects/nextera-ui/forms/src/public-api.ts","../../../projects/nextera-ui/forms/src/nexterajs-ui-forms.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeValidationGroupRegistry } from '@nexterajs/ui/core';\r\nimport { NxeValidationResult } from '@nexterajs/ui/core';\r\n\r\n/** DevExtreme button `type` (style intent), as used in this codebase. */\r\nexport type NxeButtonType = 'normal' | 'default' | 'success' | 'danger';\r\n\r\n/**\r\n * dx size coercion: `height=\"35\"` and `[height]=\"35\"` both mean 35px, while `'100%'` or `'3rem'`\r\n * pass through untouched. Templates write the attribute form, so the string case is the common one.\r\n */\r\nfunction cssSize(value: number | string | undefined): string | null {\r\n if (value === undefined || value === null || value === '') {\r\n return null;\r\n }\r\n return /^-?\\d+(\\.\\d+)?$/.test(String(value)) ? `${value}px` : String(value);\r\n}\r\n\r\n/**\r\n * The `validationGroup` object carried on a {@link NxeButtonClickEvent}, mirroring the\r\n * DevExtreme button-click `event.validationGroup`. Its `validate()` runs every member of the\r\n * button's named group through the {@link NxeValidationGroupRegistry} and returns the\r\n * DevExtreme-shaped result — so `const r = event.validationGroup.validate(); if (r.isValid) {...}`\r\n * keeps working after the tag rename.\r\n */\r\nexport interface NxeButtonValidationGroup {\r\n validate(): NxeValidationResult;\r\n}\r\n\r\n/**\r\n * Payload emitted from `nxe-button`'s `onClick`, mirroring DevExtreme's button click event.\r\n * Only `validationGroup` is read by existing handlers; `event`/`component`/`element` are\r\n * provided for parity.\r\n */\r\nexport interface NxeButtonClickEvent {\r\n event: Event;\r\n validationGroup: NxeButtonValidationGroup;\r\n component: NxeButtonComponent;\r\n element: HTMLElement;\r\n}\r\n\r\n/**\r\n * `nxe-button` — drop-in replacement for DevExtreme `dx-button`.\r\n *\r\n * The host element IS the button (mirrors DevExtreme's `dx-button` DOM: the host carries the\r\n * styling classes and contains a single `.dx-button-content` child). This keeps every existing\r\n * `.nxe-btn*` / `.dx-button-content` global rule matching verbatim, and — critically — keeps the\r\n * shared `buttonLoading` directive working, which swaps `.dx-button-content` innerHTML for a\r\n * spinner (`getElementsByClassName('dx-button-content')[0]`).\r\n *\r\n * Content is projected (`<nxe-icon> + <span>`, the dominant pattern). The legacy `text`/`type`\r\n * inputs render a `.dx-button-text` label for the ~25 attribute-styled buttons.\r\n *\r\n * `onClick` emits {@link NxeButtonClickEvent}; native `(click)` also fires (27 sites bind it).\r\n */\r\n@Component({\r\n selector: 'nxe-button',\r\n standalone: true,\r\n template: `\r\n <span class=\"dx-button-content\">\r\n @if (icon()) {\r\n <i class=\"dx-icon dx-icon-{{ icon() }}\"></i>\r\n }\r\n <ng-content />\r\n @if (text()) {\r\n <span class=\"dx-button-text\">{{ text() }}</span>\r\n }\r\n </span>\r\n `,\r\n styleUrl: './nxe-button.component.scss',\r\n host: {\r\n class: 'nxe-widget',\r\n role: 'button',\r\n '[attr.tabindex]': 'disabled() || !focusStateEnabled() ? null : 0',\r\n '[attr.aria-disabled]': 'disabled() ? true : null',\r\n '[class.nxe-button-default]': \"type() === 'default'\",\r\n '[class.nxe-button-success]': \"type() === 'success'\",\r\n '[class.nxe-button-danger]': \"type() === 'danger'\",\r\n '[class.nxe-button-has-text]': '!!text()',\r\n '[class.dx-button-has-text]': '!!text()',\r\n '[class.dx-button-has-icon]': '!!icon()',\r\n '[style.height]': 'heightStyle()',\r\n '[style.width]': 'widthStyle()',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '(click)': 'handleClick($event)',\r\n '(keydown.enter)': 'handleKeydown($event)',\r\n '(keydown.space)': 'handleKeydown($event)',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeButtonComponent {\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n /** Legacy `text` label (rendered as `.dx-button-text` when set, no projected content). */\r\n readonly text = input<string>();\r\n /** Style intent (`default`=blue, `success`=green, `danger`=red, `normal`=white). */\r\n readonly type = input<NxeButtonType>('normal');\r\n /** Disabled state (`[disabled]`); blocks `onClick` and dims the button. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Named validation group resolved via {@link NxeValidationGroupRegistry} on click. */\r\n readonly validationGroup = input<string>('');\r\n /** DevExtreme parity input; only ever `false` in this codebase (suppresses tab focus). */\r\n readonly focusStateEnabled = input(true, { transform: booleanAttribute });\r\n /**\r\n * dx `icon` — renders `<i class=\"dx-icon dx-icon-NAME\">` as the first child of\r\n * `.dx-button-content`, before any projected content. Projection is the dominant pattern\r\n * here (a `mat-icon` plus a `span`), so the two must coexist rather than compete.\r\n */\r\n readonly icon = input<string | undefined>(undefined);\r\n /** dx `height` — a bare number (or numeric string) means px; anything else passes through. */\r\n readonly height = input<number | string | undefined>(undefined);\r\n /** dx `width` — same coercion as {@link height}. */\r\n readonly width = input<number | string | undefined>(undefined);\r\n\r\n protected readonly heightStyle = computed(() => cssSize(this.height()));\r\n protected readonly widthStyle = computed(() => cssSize(this.width()));\r\n\r\n /** DevExtreme-compatible click event. */\r\n readonly onClick = output<NxeButtonClickEvent>();\r\n\r\n protected handleKeydown(event: KeyboardEvent): void {\r\n // Non-button host: Enter/Space don't synthesize a click, so activate explicitly.\r\n event.preventDefault();\r\n this.handleClick(event);\r\n }\r\n\r\n protected handleClick(event: Event): void {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n return;\r\n }\r\n const group = this.validationGroup() ?? '';\r\n this.onClick.emit({\r\n event,\r\n validationGroup: { validate: () => this.registry.validate(group) },\r\n component: this,\r\n element: this.elementRef.nativeElement,\r\n });\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase, nxeOptionalBoolean } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/** Text-box input mode (only `text`/`password` are used in this codebase). */\r\nexport type NxeTextBoxMode = 'text' | 'password' | 'email' | 'tel' | 'search';\r\n\r\n/**\r\n * `nxe-text-box` — drop-in replacement for DevExtreme `dx-text-box`.\r\n *\r\n * A signal-CVA editor (extends {@link NxeFormControlBase}) supporting `formControlName`,\r\n * `[(ngModel)]`, one-way `[value]`, and `[readOnly]`. Like DevExtreme's default\r\n * (`valueChangeEvent='change'`), the value commits on **blur** — not on every keystroke.\r\n *\r\n * It provides {@link NXE_VALIDATION_TARGET} so a projected `nxe-validator` can read its value\r\n * and push back the invalid message, which renders as the red `.nxe-invalid-message` bubble.\r\n */\r\n@Component({\r\n selector: 'nxe-text-box',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <input\r\n class=\"nxe-editor-input nxe-textbox-input\"\r\n [type]=\"mode()\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"placeholder() || null\"\r\n autocomplete=\"off\"\r\n (blur)=\"onBlur($event)\"\r\n (focus)=\"focused.set(true)\" />\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-textbox',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeTextBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTextBoxComponent extends NxeFormControlBase<string> {\r\n readonly mode = input<NxeTextBoxMode>('text');\r\n readonly placeholderInput = input<string | undefined>(undefined, { alias: 'placeholder' });\r\n readonly placeholder = computed(\r\n () => this.placeholderInput() ?? this.nxeDefaults.textBox?.placeholder ?? '',\r\n );\r\n /** DevExtreme parity input; cosmetic, unused in behaviour. */\r\n readonly hoverStateEnabledInput = input<boolean | undefined>(undefined, { alias: 'hoverStateEnabled', transform: nxeOptionalBoolean });\r\n readonly hoverStateEnabled = computed(\r\n () => this.hoverStateEnabledInput() ?? this.nxeDefaults.textBox?.hoverStateEnabled ?? false,\r\n );\r\n\r\n readonly focused = signal(false);\r\n readonly displayValue = computed(() => this.value() ?? '');\r\n\r\n protected onBlur(event: Event): void {\r\n this.commitValue((event.target as HTMLInputElement).value, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-text-area` — drop-in replacement for DevExtreme `dx-text-area`.\r\n *\r\n * Identical to {@link NxeTextBoxComponent} but renders a `<textarea>`. Supports an optional fixed\r\n * `[height]` (px) and `placeholder`; commits on blur. Hosts a projected `nxe-validator` via\r\n * {@link NXE_VALIDATION_TARGET}.\r\n */\r\n@Component({\r\n selector: 'nxe-text-area',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <textarea\r\n class=\"nxe-editor-input nxe-textarea-input\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"placeholder() || null\"\r\n [style.height.px]=\"height() || null\"\r\n (blur)=\"onBlur($event)\"\r\n (focus)=\"focused.set(true)\"></textarea>\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n styleUrl: './nxe-text-area.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-textarea',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextAreaComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeTextAreaComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTextAreaComponent extends NxeFormControlBase<string> {\r\n readonly placeholderInput = input<string | undefined>(undefined, { alias: 'placeholder' });\r\n readonly placeholder = computed(\r\n () => this.placeholderInput() ?? this.nxeDefaults.textArea?.placeholder ?? '',\r\n );\r\n /** Fixed height in px (DevExtreme `[height]`); unset = auto. */\r\n readonly heightInput = input<number | undefined>(undefined, { alias: 'height' });\r\n readonly height = computed(() => this.heightInput() ?? this.nxeDefaults.textArea?.height ?? 80);\r\n\r\n readonly focused = signal(false);\r\n readonly displayValue = computed(() => this.value() ?? '');\r\n\r\n protected onBlur(event: Event): void {\r\n this.commitValue((event.target as HTMLTextAreaElement).value, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n forwardRef,\r\n input,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-check-box` — drop-in replacement for DevExtreme `dx-check-box`.\r\n *\r\n * A boolean signal-CVA editor (extends {@link NxeFormControlBase}) — no tri-state, matching all\r\n * usage. Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`,\r\n * `[disabled]`, an inline `text` label, `(onValueChanged)` (`{value}`) and `(valueChange)` (raw\r\n * boolean). Provides {@link NXE_VALIDATION_TARGET} for a projected `nxe-validator` (a `required`\r\n * rule is invalid while unchecked, matching DevExtreme's RequiredRule treating `false` as empty).\r\n */\r\n@Component({\r\n selector: 'nxe-check-box',\r\n standalone: true,\r\n template: `\r\n <span class=\"nxe-checkbox-container\">\r\n <span class=\"nxe-checkbox-icon\" aria-hidden=\"true\"></span>\r\n @if (text()) {\r\n <span class=\"nxe-checkbox-text\">{{ text() }}</span>\r\n }\r\n </span>\r\n <ng-content />\r\n `,\r\n styleUrl: './nxe-check-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-checkbox',\r\n role: 'checkbox',\r\n '[attr.aria-checked]': '!!value()',\r\n '[attr.aria-disabled]': 'disabled() ? true : null',\r\n '[attr.aria-readonly]': 'readOnly() ? true : null',\r\n '[attr.tabindex]': 'disabled() || readOnly() ? null : 0',\r\n '[class.nxe-checkbox-checked]': '!!value()',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '[class.nxe-readonly]': 'readOnly()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n '(click)': 'toggle($event)',\r\n '(keydown.space)': 'onSpace($event)',\r\n '(blur)': 'markAsTouched()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeCheckBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeCheckBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeCheckBoxComponent extends NxeFormControlBase<boolean> {\r\n /** Inline label rendered next to the box. */\r\n readonly text = input<string>();\r\n\r\n protected toggle(event: Event): void {\r\n if (this.disabled() || this.readOnly()) {\r\n return;\r\n }\r\n this.commitValue(!this.value(), event);\r\n this.markAsTouched();\r\n }\r\n\r\n protected onSpace(event: Event): void {\r\n event.preventDefault();\r\n this.toggle(event);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\nimport {\r\n formatNumber,\r\n NXE_NUMBER_SEPARATORS,\r\n parseNumber,\r\n parseNumberFormat,\r\n roundHalfAwayFromZero,\r\n} from '@nexterajs/ui/intl';\r\n\r\n/** Coerce a static (`min=\"1\"`) or bound (`[min]=\"0\"`) attribute to a number, or undefined. */\r\nfunction toNumber(value: unknown): number | undefined {\r\n if (value == null || value === '') {\r\n return undefined;\r\n }\r\n const num = Number(value);\r\n return isNaN(num) ? undefined : num;\r\n}\r\n\r\n/**\r\n * `nxe-number-box` — drop-in replacement for DevExtreme `dx-number-box`.\r\n *\r\n * A numeric signal-CVA editor (extends {@link NxeFormControlBase}) storing/emitting `number | null`.\r\n * Implements the DevExtreme number-format engine ({@link parseNumberFormat}/{@link formatNumber}):\r\n * displays the masked, grouped string when blurred and a raw editable number while focused;\r\n * commits (clamped to `[min,max]`, rounded to the format precision) on blur — never per keystroke.\r\n *\r\n * Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`, `[min]`/`[max]`,\r\n * `format` (string LDML pattern), `(valueChange)` (numeric), and a projected `nxe-validator`.\r\n */\r\n@Component({\r\n selector: 'nxe-number-box',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <input\r\n class=\"nxe-editor-input nxe-numberbox-input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n autocomplete=\"off\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"onBlur($event)\" />\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n styleUrl: './nxe-number-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-numberbox',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeNumberBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeNumberBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeNumberBoxComponent extends NxeFormControlBase<number> {\r\n /** LDML format pattern (e.g. `#,##0.00`); empty = raw number. */\r\n readonly formatInput = input<string | undefined>(undefined, { alias: 'format' });\r\n readonly format = computed(\r\n () => this.formatInput() ?? this.nxeDefaults.numberBox?.format ?? '',\r\n );\r\n readonly min = input<number | undefined, unknown>(undefined, { transform: toNumber });\r\n readonly max = input<number | undefined, unknown>(undefined, { transform: toNumber });\r\n\r\n readonly focused = signal(false);\r\n private readonly parsedFormat = computed(() => parseNumberFormat(this.format()));\r\n\r\n /** Locale characters, configured once by the application. Defaults to en-US. */\r\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\r\n\r\n readonly displayValue = computed(() => {\r\n const value = this.value();\r\n if (this.focused()) {\r\n // Raw editable text, but with this locale's decimal character: `String(0.125)` gives\r\n // a JS-style dot, and parseNumber would read that as a group separator and commit 125.\r\n return value == null ? '' : String(value).replace('.', this.separators.decimal);\r\n }\r\n return formatNumber(value, this.parsedFormat(), this.separators);\r\n });\r\n\r\n protected onBlur(event: Event): void {\r\n let num = parseNumber((event.target as HTMLInputElement).value, this.separators);\r\n if (num != null) {\r\n const min = this.min();\r\n const max = this.max();\r\n if (min != null && num < min) {\r\n num = min;\r\n }\r\n if (max != null && num > max) {\r\n num = max;\r\n }\r\n const fmt = this.parsedFormat();\r\n if (fmt) {\r\n num = roundHalfAwayFromZero(num, fmt.maxFrac);\r\n }\r\n }\r\n this.commitValue(num, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTime } from 'luxon';\r\nimport { filter, merge, Subscription } from 'rxjs';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\nimport { nxePane, trackPaneFlip } from '@nexterajs/ui/styling';\r\nimport {\r\n buildCalendarWeeks,\r\n buildPeriodCells,\r\n formatDisplay,\r\n NXE_DEFAULT_DATETIME_DISPLAY_FORMAT,\r\n NXE_DEFAULT_DISPLAY_FORMAT,\r\n NXE_DEFAULT_TIME_DISPLAY_FORMAT,\r\n NxeCalendarZoom,\r\n NxePeriodCell,\r\n parseDateValue,\r\n parseDisplay,\r\n serializeDate,\r\n} from '@nexterajs/ui/intl';\r\n\r\n/** DevExtreme date-box `type`. */\r\nexport type NxeDateBoxType = 'date' | 'datetime' | 'time';\r\n\r\n/** Normalize a `[min]`/`[max]` binding (Date object or serialized string) to a DateTime. */\r\nfunction toBoundDate(bound: Date | string | null): DateTime | null {\r\n if (!bound) {\r\n return null;\r\n }\r\n if (bound instanceof Date) {\r\n const dt = DateTime.fromJSDate(bound);\r\n return dt.isValid ? dt : null;\r\n }\r\n return parseDateValue(bound);\r\n}\r\n\r\n/**\r\n * `nxe-date-box` — drop-in replacement for DevExtreme `dx-date-box`.\r\n *\r\n * A signal-CVA editor (extends {@link NxeFormControlBase}) whose value is the app-wide\r\n * `\"yyyy-MM-ddTHH:mm:ss\"` string (preserving the global `dateSerializationFormat`). The field is\r\n * typeable (parsed on blur per `displayFormat`) and opens a CDK-overlay calendar from the icon\r\n * button. Built on Luxon. Default `displayFormat` is `dd-MMM-yyyy`. Hosts a projected\r\n * `nxe-validator` via {@link NXE_VALIDATION_TARGET}.\r\n */\r\n@Component({\r\n selector: 'nxe-date-box',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <input\r\n #field\r\n class=\"nxe-editor-input nxe-datebox-input\"\r\n type=\"text\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"effectivePlaceholder() || null\"\r\n autocomplete=\"off\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\" />\r\n @if (!readOnly()) {\r\n <span\r\n class=\"nxe-datebox-button\"\r\n [class.nxe-datebox-open]=\"opened()\"\r\n (mousedown)=\"onButtonMousedown($event)\"\r\n aria-hidden=\"true\">\r\n @if (type() === 'datetime' || type() === 'time') {\r\n <svg class=\"nxe-datebox-icon\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 2a10 10 0 100 20 10 10 0 000-20zm0 18a8 8 0 110-16 8 8 0 010 16zm.5-13H11v6l5.2 3.1.8-1.3-4.5-2.7V7z\" />\r\n </svg>\r\n } @else {\r\n <svg class=\"nxe-datebox-icon\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M19 3h-1V1h-2v2H8V1H6v2H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2V5a2 2 0 00-2-2zm0 16H5V8h14v11z\" />\r\n </svg>\r\n }\r\n </span>\r\n }\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n\r\n <ng-template #calendarTemplate>\r\n <div class=\"nxe-calendar\" (mousedown)=\"$event.preventDefault()\">\r\n @if (type() !== 'time') {\r\n <div class=\"nxe-calendar-navigator\">\r\n <button type=\"button\" class=\"nxe-calendar-nav\" (click)=\"navigate(-1)\">\r\n <svg class=\"nxe-calendar-chevron\" viewBox=\"0 0 24 24\">\r\n <path d=\"M15.4 7.4 14 6l-6 6 6 6 1.4-1.4L10.8 12z\" />\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"nxe-calendar-caption\" (click)=\"zoomOut()\">\r\n {{ caption() }}\r\n </button>\r\n <button type=\"button\" class=\"nxe-calendar-nav\" (click)=\"navigate(1)\">\r\n <svg class=\"nxe-calendar-chevron\" viewBox=\"0 0 24 24\">\r\n <path d=\"M8.6 16.6 10 18l6-6-6-6-1.4 1.4 4.6 4.6z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n @if (zoomLevel() === 'month') {\r\n <div class=\"nxe-calendar-weekdays\">\r\n @for (wd of weekdays; track wd) {\r\n <span>{{ wd }}</span>\r\n }\r\n </div>\r\n <div class=\"nxe-calendar-grid\">\r\n @for (week of weeks(); track $index) {\r\n @for (day of week; track day.toMillis()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-calendar-day\"\r\n [class.nxe-calendar-other]=\"day.month !== viewMonth().month\"\r\n [class.nxe-calendar-selected]=\"isSelected(day)\"\r\n [class.nxe-calendar-today]=\"isToday(day)\"\r\n [disabled]=\"isDisabledDay(day)\"\r\n (click)=\"selectDay(day)\">\r\n <span>{{ day.day }}</span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"nxe-calendar-periods\"\r\n [class.nxe-calendar-periods-century]=\"zoomLevel() === 'century'\">\r\n @for (cell of periodCells(); track cell.anchor.toMillis()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-calendar-period\"\r\n [class.nxe-calendar-other]=\"cell.other\"\r\n [class.nxe-calendar-today]=\"cell.isNow\"\r\n [disabled]=\"cell.disabled\"\r\n (click)=\"selectPeriod(cell)\">\r\n <span>{{ cell.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n }\r\n @if (type() !== 'date') {\r\n <div class=\"nxe-calendar-time\">\r\n <input\r\n class=\"nxe-calendar-time-part\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n aria-label=\"Hour\"\r\n [value]=\"hourText()\"\r\n (change)=\"setTimePart('hour', $event)\" />\r\n <span class=\"nxe-calendar-time-sep\" aria-hidden=\"true\">:</span>\r\n <input\r\n class=\"nxe-calendar-time-part\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n aria-label=\"Minute\"\r\n [value]=\"minuteText()\"\r\n (change)=\"setTimePart('minute', $event)\" />\r\n <button type=\"button\" class=\"nxe-calendar-time-btn\" (click)=\"setNow()\">Now</button>\r\n <button type=\"button\" class=\"nxe-calendar-time-btn nxe-calendar-time-done\" (click)=\"close()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n `,\r\n styleUrl: './nxe-date-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-datebox',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeDateBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeDateBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeDateBoxComponent extends NxeFormControlBase<string> implements OnDestroy {\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly calendarTemplate = viewChild.required<TemplateRef<unknown>>('calendarTemplate');\r\n private readonly fieldRef = viewChild.required<ElementRef<HTMLInputElement>>('field');\r\n\r\n readonly type = input<NxeDateBoxType>('date');\r\n /* Undefined rather than a literal default, so the default can follow `type`. Additive: no call\r\n site passes either input, and one that does still wins. */\r\n readonly displayFormat = input<string | undefined>(undefined);\r\n readonly placeholder = input<string | undefined>(undefined);\r\n /** DevExtreme `[min]`/`[max]` bounds: calendar days outside are disabled, typed values clamp. */\r\n readonly min = input<Date | string | null>(null);\r\n readonly max = input<Date | string | null>(null);\r\n\r\n readonly focused = signal(false);\r\n readonly opened = signal(false);\r\n readonly viewMonth = signal<DateTime>(DateTime.now().startOf('month'));\r\n /** Calendar zoom level; caption clicks zoom out, cell picks zoom back in (dx-calendar parity). */\r\n readonly zoomLevel = signal<NxeCalendarZoom>('month');\r\n readonly weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;\r\n\r\n /** The format actually used, from `displayFormat` or the default for this `type`. */\r\n readonly effectiveDisplayFormat = computed(() => {\r\n const stated = this.displayFormat() ?? this.nxeDefaults.dateBox?.displayFormat;\r\n if (stated) {\r\n return stated;\r\n }\r\n switch (this.type()) {\r\n case 'time':\r\n return NXE_DEFAULT_TIME_DISPLAY_FORMAT;\r\n case 'datetime':\r\n return NXE_DEFAULT_DATETIME_DISPLAY_FORMAT;\r\n default:\r\n return NXE_DEFAULT_DISPLAY_FORMAT;\r\n }\r\n });\r\n /** dx's default placeholder is '', but orbit's global default is the format itself. */\r\n readonly effectivePlaceholder = computed(\r\n () =>\r\n this.placeholder() ?? this.nxeDefaults.dateBox?.placeholder ?? this.effectiveDisplayFormat(),\r\n );\r\n\r\n private readonly selected = computed(() => parseDateValue(this.value()));\r\n readonly displayValue = computed(() => formatDisplay(this.selected(), this.effectiveDisplayFormat()));\r\n readonly weeks = computed(() => buildCalendarWeeks(this.viewMonth()));\r\n\r\n /** Two-digit hour/minute for the popup's time strip; blank when nothing is selected. */\r\n readonly hourText = computed(() => this.selected()?.toFormat('HH') ?? '');\r\n readonly minuteText = computed(() => this.selected()?.toFormat('mm') ?? '');\r\n\r\n /**\r\n * The field's text as it stood when focus arrived. `onBlur` compares against it and commits\r\n * nothing when the user only tabbed through — see the comment there.\r\n */\r\n private textAtFocus = '';\r\n\r\n readonly caption = computed(() => {\r\n const view = this.viewMonth();\r\n switch (this.zoomLevel()) {\r\n case 'month':\r\n return view.toFormat('MMMM yyyy');\r\n case 'year':\r\n return view.toFormat('yyyy');\r\n case 'decade': {\r\n const start = view.year - (view.year % 10);\r\n return `${start}-${start + 9}`;\r\n }\r\n case 'century': {\r\n const start = view.year - (view.year % 100);\r\n return `${start}-${start + 99}`;\r\n }\r\n }\r\n });\r\n\r\n readonly periodCells = computed(() => {\r\n const zoom = this.zoomLevel();\r\n if (zoom === 'month') {\r\n return [];\r\n }\r\n const now = DateTime.now();\r\n const min = this.minDate();\r\n const max = this.maxDate();\r\n const span = zoom === 'year' ? { months: 1 } : zoom === 'decade' ? { years: 1 } : { years: 10 };\r\n return buildPeriodCells(zoom, this.viewMonth()).map((cell) => {\r\n const end = cell.anchor.plus(span).minus({ days: 1 }).endOf('day');\r\n return {\r\n ...cell,\r\n isNow: now >= cell.anchor && now <= end,\r\n disabled: (!!min && end < min.startOf('day')) || (!!max && cell.anchor > max.endOf('day')),\r\n };\r\n });\r\n });\r\n\r\n private readonly minDate = computed(() => toBoundDate(this.min()));\r\n private readonly maxDate = computed(() => toBoundDate(this.max()));\r\n\r\n protected isDisabledDay(day: DateTime): boolean {\r\n const min = this.minDate();\r\n const max = this.maxDate();\r\n return (!!min && day.startOf('day') < min.startOf('day')) || (!!max && day.startOf('day') > max.startOf('day'));\r\n }\r\n\r\n private clampToBounds(dt: DateTime): DateTime {\r\n const min = this.minDate();\r\n const max = this.maxDate();\r\n if (min && dt < min.startOf('day')) return min.startOf('day');\r\n /* Land on the bound's DAY but keep the value's own time. Returning max.startOf('day') would\r\n silently zero an 18:00 whenever the entry ran past the bound — invisible for a date-only\r\n field, and a wiped time for a datetime one. */\r\n if (max && dt > max.endOf('day')) {\r\n return max.startOf('day').set({ hour: dt.hour, minute: dt.minute, second: dt.second });\r\n }\r\n return dt;\r\n }\r\n\r\n private overlayRef?: OverlayRef;\r\n private closeSub?: Subscription;\r\n private flipSub?: Subscription;\r\n\r\n protected isSelected(day: DateTime): boolean {\r\n const sel = this.selected();\r\n return !!sel && day.hasSame(sel, 'day');\r\n }\r\n\r\n protected isToday(day: DateTime): boolean {\r\n return day.hasSame(DateTime.now(), 'day');\r\n }\r\n\r\n protected navigate(delta: number): void {\r\n const months = { month: 1, year: 12, decade: 120, century: 1200 }[this.zoomLevel()];\r\n this.viewMonth.update((m) => m.plus({ months: months * delta }));\r\n }\r\n\r\n protected zoomOut(): void {\r\n const next = { month: 'year', year: 'decade', decade: 'century' } as const;\r\n const zoom = this.zoomLevel();\r\n if (zoom !== 'century') {\r\n this.zoomLevel.set(next[zoom]);\r\n }\r\n }\r\n\r\n protected selectPeriod(cell: NxePeriodCell & { disabled: boolean }): void {\r\n if (cell.disabled) {\r\n return;\r\n }\r\n const previous = { year: 'month', decade: 'year', century: 'decade' } as const;\r\n this.viewMonth.set(cell.anchor.startOf('month'));\r\n this.zoomLevel.set(previous[this.zoomLevel() as Exclude<NxeCalendarZoom, 'month'>]);\r\n }\r\n\r\n protected onButtonMousedown(event: Event): void {\r\n // Keep field focus (avoid a blur-driven re-commit) and toggle the calendar.\r\n event.preventDefault();\r\n if (this.disabled() || this.readOnly()) {\r\n return;\r\n }\r\n this.opened() ? this.close() : this.open();\r\n }\r\n\r\n protected onFocus(event: Event): void {\r\n this.textAtFocus = (event.target as HTMLInputElement).value;\r\n this.focused.set(true);\r\n }\r\n\r\n /**\r\n * Commit what the user TYPED — and nothing when they typed nothing.\r\n *\r\n * The unchanged-text guard is load-bearing, not an optimization. `displayFormat` renders a\r\n * strict subset of the stored value: `dd-MMM-yyyy` shows `2026-08-12T09:00:00` as `12-Aug-2026`,\r\n * and re-parsing that yields midnight. This method used to commit unconditionally, so simply\r\n * focusing and tabbing past a field rewrote 09:00 to 00:00 and 09:30:45 to 09:30:00 — silently,\r\n * because `commitValue` only no-ops on an identical string and these differ. Latent while\r\n * nothing rendered a time; straight data loss the moment `type=\"datetime\"` exists.\r\n *\r\n * A rejected entry keeps the previous value and repaints the field. The repaint is required:\r\n * `[value]` is still bound to the same `displayValue()` Angular last wrote, so it will not\r\n * re-render on its own and the unparseable text would sit there looking accepted.\r\n */\r\n protected onBlur(event: Event): void {\r\n const element = event.target as HTMLInputElement;\r\n /* Read before clearing: it doubles as \"we captured a baseline this focus cycle\". A blur with\r\n no preceding focus cannot happen to a real user — browsers always fire focus first — so\r\n the only sequence that reaches the fall-through is a synthetic one, where the old\r\n parse-everything behaviour is both harmless and what the existing specs assert. */\r\n const hadBaseline = this.focused();\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n\r\n if (hadBaseline && element.value === this.textAtFocus) {\r\n return;\r\n }\r\n if (!element.value.trim()) {\r\n this.commitValue(null, event);\r\n this.syncField();\r\n return;\r\n }\r\n\r\n const dt = parseDisplay(element.value, this.effectiveDisplayFormat(), this.selected());\r\n if (dt) {\r\n this.commitValue(serializeDate(this.clampToBounds(dt)), event);\r\n }\r\n this.syncField();\r\n }\r\n\r\n /**\r\n * Repaint the field from the committed value and re-baseline {@link textAtFocus}.\r\n *\r\n * Called after every non-typed commit as well, so a later blur cannot replay stale typed text\r\n * over a value the popup has since changed.\r\n */\r\n private syncField(): void {\r\n const element = this.fieldRef().nativeElement;\r\n element.value = this.displayValue();\r\n this.textAtFocus = element.value;\r\n }\r\n\r\n protected selectDay(day: DateTime): void {\r\n if (this.isDisabledDay(day)) {\r\n return;\r\n }\r\n let dt = day.startOf('day');\r\n if (this.type() === 'datetime') {\r\n const base = this.selected();\r\n if (base) {\r\n dt = dt.set({ hour: base.hour, minute: base.minute, second: base.second });\r\n }\r\n }\r\n this.commitValue(serializeDate(dt), null);\r\n this.syncField();\r\n /* Only a plain date picker is finished at this point. In datetime mode the time strip is\r\n the other half of the job, and closing here would put it out of reach. */\r\n if (this.type() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Commit one part of the time from the popup strip.\r\n *\r\n * Writes straight through to the value rather than holding a draft: `selectDay` already commits\r\n * immediately, the component keeps no other pending state, and a stray backdrop click must not\r\n * discard a time the user has just set. dx buffers behind OK/Cancel; this is the divergence.\r\n */\r\n protected setTimePart(part: 'hour' | 'minute', event: Event): void {\r\n const element = event.target as HTMLInputElement;\r\n const typed = Number.parseInt(element.value, 10);\r\n const base = this.selected() ?? DateTime.now().startOf('day');\r\n const ceiling = part === 'hour' ? 23 : 59;\r\n const next = Number.isNaN(typed) ? base[part] : Math.min(Math.max(typed, 0), ceiling);\r\n\r\n this.commitValue(serializeDate(base.set({ [part]: next })), event);\r\n this.syncField();\r\n /* Same non-repaint hazard as onBlur: when the clamp lands back on the value already held,\r\n the [value] binding is unchanged and `7` would stay on screen instead of `07`. */\r\n element.value = part === 'hour' ? this.hourText() : this.minuteText();\r\n }\r\n\r\n protected setNow(): void {\r\n const now = DateTime.now();\r\n const base = this.selected() ?? now;\r\n this.commitValue(serializeDate(base.set({ hour: now.hour, minute: now.minute, second: 0 })), null);\r\n this.syncField();\r\n }\r\n\r\n private open(): void {\r\n this.viewMonth.set((this.selected() ?? DateTime.now()).startOf('month'));\r\n this.zoomLevel.set('month');\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.elementRef)\r\n .withPositions([\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\r\n ]),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n panelClass: nxePane('nxe-datebox-pane'),\r\n });\r\n this.flipSub = trackPaneFlip(this.overlayRef);\r\n }\r\n if (this.overlayRef.hasAttached()) {\r\n return;\r\n }\r\n this.overlayRef.attach(new TemplatePortal(this.calendarTemplate(), this.viewContainerRef));\r\n this.closeSub = merge(\r\n this.overlayRef.backdropClick(),\r\n this.overlayRef.keydownEvents().pipe(filter((e) => e.key === 'Escape')),\r\n ).subscribe(() => this.close());\r\n this.opened.set(true);\r\n }\r\n\r\n /** Protected, not private: the time strip's Done button closes the popup from the template. */\r\n protected close(): void {\r\n if (!this.overlayRef?.hasAttached()) {\r\n return;\r\n }\r\n this.overlayRef.detach();\r\n this.closeSub?.unsubscribe();\r\n this.flipSub?.unsubscribe();\r\n this.opened.set(false);\r\n this.markAsTouched();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeSub?.unsubscribe();\r\n this.flipSub?.unsubscribe();\r\n this.overlayRef?.dispose();\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-scroll-view` — drop-in replacement for DevExtreme `dx-scroll-view`.\r\n *\r\n * In this app `dx-scroll-view` is used purely as a dumb scroll container: no `@ViewChild`, no\r\n * `.instance` methods, no events (see survey). Every live tag is the same literal triple\r\n * `[scrollByContent]=\"true\" [scrollByThumb]=\"true\" [showScrollbar]=\"'onScroll'\"`. So this is a\r\n * styled `overflow:auto` wrapper that projects its content inside a `.nxe-scrollview-content`\r\n * flex-column box (matching dx's content layout, which some consumers' inner grids rely on for\r\n * height) and renders a thin grey dx-style scrollbar. The three inputs are accepted for binding\r\n * parity only — behaviour is native scrolling.\r\n */\r\n@Component({\r\n selector: 'nxe-scroll-view',\r\n standalone: true,\r\n template: '<div class=\"nxe-scrollview-content\"><ng-content /></div>',\r\n styleUrl: './nxe-scroll-view.component.scss',\r\n host: { class: 'nxe-widget nxe-scroll-view' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeScrollViewComponent {\r\n /** Accepted for parity with dx-scroll-view; behaviour is native overflow scrolling. */\r\n readonly scrollByContent = input(true);\r\n readonly scrollByThumb = input(true);\r\n readonly showScrollbar = input<'onScroll' | 'onHover' | 'always' | 'never'>('onScroll');\r\n}\r\n","// @nexterajs/ui/forms — public API.\r\nexport * from './lib/button/nxe-button.component';\r\nexport * from './lib/text-box/nxe-text-box.component';\r\nexport * from './lib/text-area/nxe-text-area.component';\r\nexport * from './lib/check-box/nxe-check-box.component';\r\nexport * from './lib/number-box/nxe-number-box.component';\r\nexport * from './lib/date-box/nxe-date-box.component';\r\nexport * from './lib/scroll-view/nxe-scroll-view.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|