@nexterajs/ui 0.0.2 → 0.1.0
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/README.md +279 -34
- package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
- package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-core.mjs +652 -12
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-display.mjs +1142 -0
- package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-intl.mjs +103 -11
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
- package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-notify.mjs +46 -44
- package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
- package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-shell.mjs +542 -0
- package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-validation.mjs +42 -11
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
- package/fesm2022/nexterajs-ui.mjs +5 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -1
- package/package.json +33 -2
- package/styles/_dropdown.scss +5 -5
- package/styles/_editor.scss +52 -17
- package/styles/_mixins.scss +1 -1
- package/styles/_scrollbar.scss +5 -5
- package/styles/_status.scss +21 -0
- package/styles/_toast.scss +14 -14
- package/styles/_tokens.scss +420 -3
- package/styles/_widget.scss +14 -3
- package/styles/index.scss +6 -4
- package/types/nexterajs-ui-charts.d.ts +446 -0
- package/types/nexterajs-ui-core.d.ts +387 -22
- package/types/nexterajs-ui-display.d.ts +720 -0
- package/types/nexterajs-ui-dropdowns.d.ts +191 -48
- package/types/nexterajs-ui-file-uploader.d.ts +236 -7
- package/types/nexterajs-ui-forms.d.ts +675 -30
- package/types/nexterajs-ui-grid.d.ts +448 -93
- package/types/nexterajs-ui-intl.d.ts +39 -4
- package/types/nexterajs-ui-navigation.d.ts +531 -0
- package/types/nexterajs-ui-notify.d.ts +4 -2
- package/types/nexterajs-ui-overlay.d.ts +703 -0
- package/types/nexterajs-ui-pivot.d.ts +56 -48
- package/types/nexterajs-ui-shell.d.ts +294 -0
- package/types/nexterajs-ui-tree-view.d.ts +6 -3
- package/types/nexterajs-ui-validation.d.ts +20 -11
- package/types/nexterajs-ui.d.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexterajs-ui-core.mjs","sources":["../../../projects/nextera-ui/core/src/lib/core/tokens/nxe-default-options.token.ts","../../../projects/nextera-ui/core/src/lib/core/base/nxe-form-control.base.ts","../../../projects/nextera-ui/core/src/lib/core/base/nxe-config-option.base.ts","../../../projects/nextera-ui/core/src/lib/core/tokens/nxe-config-option.token.ts","../../../projects/nextera-ui/core/src/lib/core/directives/nxe-template.directive.ts","../../../projects/nextera-ui/core/src/lib/core/coercion/coerce-array.ts","../../../projects/nextera-ui/core/src/lib/core/coercion/optional-boolean.ts","../../../projects/nextera-ui/core/src/lib/core/coercion/nxe-expr.ts","../../../projects/nextera-ui/core/src/lib/core/validation/nxe-validation.types.ts","../../../projects/nextera-ui/core/src/lib/core/validation/nxe-validation-group-registry.service.ts","../../../projects/nextera-ui/core/src/lib/core/index.ts","../../../projects/nextera-ui/core/src/public-api.ts","../../../projects/nextera-ui/core/src/nexterajs-ui-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Per-widget defaults, mirroring DevExtreme's `Widget.defaultOptions({ options: {...} })`.\n *\n * Every field is optional and every consumer resolves it as `binding ?? token ?? literal`, so\n * an application that provides nothing keeps the behaviour it has today.\n *\n * Only options that an application genuinely sets once and globally belong here. This is not a\n * second way to configure a component — a binding on the element always wins.\n */\nexport interface NxeGridDefaultOptions {\n hoverStateEnabled?: boolean;\n columnAutoWidth?: boolean;\n rowAlternationEnabled?: boolean;\n showColumnLines?: boolean;\n showRowLines?: boolean;\n showBorders?: boolean;\n wordWrapEnabled?: boolean;\n noDataText?: string;\n}\n\nexport interface NxePickerDefaultOptions {\n displayExpr?: string;\n valueExpr?: string;\n searchExpr?: string;\n searchEnabled?: boolean;\n showClearButton?: boolean;\n showDropDownButton?: boolean;\n placeholder?: string;\n}\n\nexport interface NxeDefaultOptions {\n readonly dataGrid?: NxeGridDefaultOptions;\n /** `nxe-tree-list` resolves against this slice instead of `dataGrid`, as dx does. */\n readonly treeList?: NxeGridDefaultOptions;\n readonly selectBox?: NxePickerDefaultOptions;\n readonly tagBox?: NxePickerDefaultOptions & { showSelectionControls?: boolean };\n /** Narrower than the other pickers: this one has no built-in search or drop-down button. */\n readonly dropDownBox?: Pick<\n NxePickerDefaultOptions,\n 'displayExpr' | 'valueExpr' | 'placeholder' | 'showClearButton'\n >;\n readonly dateBox?: { displayFormat?: string; placeholder?: string; showClearButton?: boolean };\n readonly textBox?: { placeholder?: string; hoverStateEnabled?: boolean; showClearButton?: boolean };\n readonly textArea?: { placeholder?: string; height?: number | string };\n readonly numberBox?: { format?: string; showClearButton?: boolean };\n readonly button?: { focusStateEnabled?: boolean };\n}\n\n/**\n * Application-wide component defaults.\n *\n * DevExtreme applications configure a great deal through `defaultOptions` and then never write\n * those attributes again — so the templates carry no evidence that the option was ever set.\n * Without an equivalent here, a migrated application silently gets the library's literals: an\n * app that set `columnAutoWidth: true` once at bootstrap would find every grid laying its\n * columns out differently, with nothing in the markup to explain why.\n *\n * ```ts\n * providers: [\n * {\n * provide: NXE_DEFAULT_OPTIONS,\n * useValue: {\n * dataGrid: { columnAutoWidth: true, hoverStateEnabled: true },\n * treeList: { columnAutoWidth: true, hoverStateEnabled: true },\n * textArea: { height: 80 },\n * } satisfies NxeDefaultOptions,\n * },\n * ]\n * ```\n */\nexport const NXE_DEFAULT_OPTIONS = new InjectionToken<NxeDefaultOptions>('NXE_DEFAULT_OPTIONS', {\n providedIn: 'root',\n factory: () => ({}),\n});\n","import {\r\n booleanAttribute,\r\n computed,\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n model,\r\n NgZone,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor } from '@angular/forms';\r\nimport { NXE_DEFAULT_OPTIONS } from '../tokens/nxe-default-options.token';\r\nimport { NxeEditorEvent, NxeEditorEventKind } from '../types/nxe-events';\r\nimport { NxeValueChangedEvent } from '../types/nxe-events';\r\nimport { NxeValidationTarget } from '../validation/nxe-validation.types';\r\n\r\n/**\r\n * Signal-based `ControlValueAccessor` base for every nxe form editor\r\n * (`nxe-text-box`, `nxe-number-box`, `nxe-date-box`, `nxe-check-box`, `nxe-text-area`,\r\n * `nxe-select-box`, `nxe-tag-box`, `nxe-radio`, ...).\r\n *\r\n * It supports BOTH template-driven (`[(ngModel)]`) and reactive (`formControlName`) forms\r\n * transparently, as well as DevExtreme-style `[value]` / `[(value)]` two-way binding, and\r\n * emits the DevExtreme-shaped {@link NxeValueChangedEvent} from `onValueChanged`.\r\n *\r\n * Concrete components MUST register themselves as the value accessor, e.g.:\r\n * ```ts\r\n * @Component({\r\n * selector: 'nxe-text-box',\r\n * providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextBoxComponent), multi: true }],\r\n * ...\r\n * })\r\n * export class NxeTextBoxComponent extends NxeFormControlBase<string> { ... }\r\n * ```\r\n *\r\n * Subclasses call {@link commitValue} on user interaction and {@link markAsTouched} on blur.\r\n */\r\nlet editorIdCounter = 0;\r\nconst nextEditorId = (): number => ++editorIdCounter;\r\n\r\n/**\r\n * dx size coercion: a bare number (or numeric string) means px, anything else passes through.\r\n * 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@Directive({\r\n host: {\r\n '[attr.title]': 'hint() || null',\r\n '[attr.id]': 'elementAttrId()',\r\n '[class]': 'elementAttrClass()',\r\n '[style.width]': 'widthStyle()',\r\n '[style.display]': 'visible() ? null : \"none\"',\r\n // Listened for on the HOST, not on each inner control: these all bubble, so one place\r\n // covers every editor and cannot collide with the handlers an editor already binds on\r\n // its own input.\r\n '(keydown)': 'emitEditorEvent(\"keydown\", $event)',\r\n '(keyup)': 'emitEditorEvent(\"keyup\", $event)',\r\n '(input)': 'emitEditorEvent(\"input\", $event)',\r\n '(change)': 'emitEditorEvent(\"change\", $event)',\r\n '(focusin)': 'emitEditorEvent(\"focusin\", $event)',\r\n '(focusout)': 'emitEditorEvent(\"focusout\", $event)',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '[class.nxe-readonly]': 'readOnly()',\r\n // dx emits `nxe-state-readonly` on a read-only editor, and legacy stylesheets lean on it\r\n // for more than a cursor: the grid's editable-cell tint is keyed off its ABSENCE\r\n // (`td:has(nxe-select-box):not(:has(.dx-state-readonly))`), so a missing class silently\r\n // paints every read-only cell as editable. One binding here covers all eight editors.\r\n '[class.nxe-state-readonly]': 'readOnly()',\r\n },\r\n})\r\nexport abstract class NxeFormControlBase<T> implements ControlValueAccessor, NxeValidationTarget {\r\n protected readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n /**\r\n * The app is zone-based (`provideZoneChangeDetection()`); writing back to Angular forms\r\n * from a signal context must run inside the zone or reactive forms lag a tick.\r\n */\r\n protected readonly ngZone = inject(NgZone);\r\n /** Application-wide defaults; each editor resolves `binding ?? this ?? literal`. */\r\n protected readonly nxeDefaults = inject(NXE_DEFAULT_OPTIONS);\r\n\r\n /**\r\n * The current value — single source of truth. Two-way bindable as `[(value)]` (DevExtreme\r\n * parity) and also driven by `writeValue` for `ngModel`/`formControlName`.\r\n */\r\n readonly value = model<T | null>(null);\r\n\r\n /** Disabled via the `[disabled]` input (DevExtreme parity); OR-combined with forms disabled. */\r\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\r\n private readonly disabledByForm = signal(false);\r\n /** Effective disabled state (input OR reactive-forms `setDisabledState`). */\r\n readonly disabled = computed(() => this.disabledInput() || this.disabledByForm());\r\n\r\n /** Read-only state (DevExtreme `[readOnly]`). */\r\n readonly readOnly = input(false, { transform: booleanAttribute });\r\n\r\n /** Validation group this editor belongs to (its nested `nxe-validator` registers here). */\r\n readonly validationGroupInput = input<string | undefined>(undefined, { alias: 'validationGroup' });\r\n\r\n /**\r\n * `id` for the INNER control, not the host.\r\n *\r\n * A caption written as `<label for=\"x\">` has to reach the focusable element, and the host of\r\n * a custom element is not it. Without this an editor cannot be labelled at all, which is why\r\n * `aria-label` sits beside it: one of the two has to be available.\r\n */\r\n readonly inputId = input<string | undefined>(undefined);\r\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\r\n readonly ariaLabelledBy = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\r\n\r\n /** Stable per instance, so the inner control always has an id something can point at. */\r\n private readonly fallbackId = `nxe-editor-${nextEditorId()}`;\r\n\r\n readonly controlId = computed(() => this.inputId() ?? this.fallbackId);\r\n\r\n /**\r\n * Ids for a popup listbox and its options.\r\n *\r\n * `aria-activedescendant` is how a combobox says which option is current while focus stays in\r\n * the text field, and it can only point at an id — so the options need stable ones.\r\n */\r\n panelId(): string {\r\n return `${this.controlId()}-panel`;\r\n }\r\n\r\n optionId(index: number): string {\r\n return `${this.controlId()}-option-${index}`;\r\n }\r\n\r\n /**\r\n * Whether a nested validator carries a `required` rule.\r\n *\r\n * Set by the validator rather than declared on the editor: the rule is where the requirement\r\n * is actually stated, and duplicating it as an input would let the two disagree.\r\n */\r\n readonly required = signal(false);\r\n\r\n setRequired(value: boolean): void {\r\n this.required.set(value);\r\n }\r\n\r\n /** The current validation error message (set by a nested `nxe-validator`), or null. */\r\n readonly validationError = signal<string | null>(null);\r\n\r\n /** Whether the control has been blurred at least once. */\r\n readonly touched = signal(false);\r\n /** Whether the value has been changed by the user at least once. */\r\n readonly dirty = signal(false);\r\n\r\n /** DevExtreme-compatible value-change event. */\r\n readonly onValueChanged = output<NxeValueChangedEvent<T>>();\r\n\r\n /**\r\n * dx's keyboard, focus and input events.\r\n *\r\n * Native events already reach the host, so these are not about capability — they are about\r\n * the call site. A migrated `(onEnterKey)` handler should keep working without being\r\n * rewritten as a `(keydown)` with a key check, and `onEnterKey` in particular has no native\r\n * equivalent at all.\r\n */\r\n readonly onKeyDown = output<NxeEditorEvent>();\r\n readonly onKeyUp = output<NxeEditorEvent>();\r\n readonly onEnterKey = output<NxeEditorEvent>();\r\n readonly onInput = output<NxeEditorEvent>();\r\n readonly onChange = output<NxeEditorEvent>();\r\n readonly onFocusIn = output<NxeEditorEvent>();\r\n readonly onFocusOut = output<NxeEditorEvent>();\r\n\r\n /**\r\n * When a typed value is committed: dx's `'change'` (on blur), `'input'` (per keystroke) or\r\n * `'keyup'`.\r\n *\r\n * Honoured by the text editors. The number and date boxes stay on `'change'` whatever this\r\n * says, because their displayed text is derived from the parsed value: committing mid-entry\r\n * would rewrite the field while the user is still typing into it.\r\n */\r\n readonly valueChangeEvent = input<'change' | 'input' | 'keyup'>('change');\r\n\r\n /** dx universal widget options. */\r\n readonly hint = input<string | undefined>(undefined);\r\n readonly width = input<number | string | undefined>(undefined);\r\n readonly visible = input(true, { transform: booleanAttribute });\r\n readonly tabIndex = input<number | undefined>(undefined);\r\n readonly elementAttr = input<Record<string, string> | undefined>(undefined);\r\n\r\n protected readonly widthStyle = computed(() => cssSize(this.width()));\r\n protected readonly elementAttrClass = computed(() => this.elementAttr()?.['class'] ?? null);\r\n protected readonly elementAttrId = computed(() => this.elementAttr()?.['id'] ?? null);\r\n\r\n private _onChange: (value: T | null) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Host element (the DevExtreme event payload `element`). */\r\n get element(): HTMLElement {\r\n return this.elementRef.nativeElement;\r\n }\r\n\r\n // --- NxeValidationTarget (consumed by a nested nxe-validator) ---\r\n\r\n getValue(): unknown {\r\n return this.value();\r\n }\r\n\r\n validationGroup(): string | undefined {\r\n return this.validationGroupInput();\r\n }\r\n\r\n setValidationError(message: string | null): void {\r\n this.validationError.set(message);\r\n }\r\n\r\n // --- ControlValueAccessor: forms -> component (no event emission) ---\r\n\r\n writeValue(value: T | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabledByForm.set(isDisabled);\r\n }\r\n\r\n // --- component -> forms (user interaction) ---\r\n\r\n /**\r\n * Commit a user-initiated value change: update the value, notify Angular forms (inside\r\n * `NgZone.run` so reactive forms detect it in this zone-based app), and emit the\r\n * DevExtreme-shaped `onValueChanged`. No-op when the value is unchanged.\r\n */\r\n protected commitValue(next: T | null, event: Event | null = null): void {\r\n const previousValue = this.value();\r\n if (Object.is(previousValue, next)) {\r\n return;\r\n }\r\n this.value.set(next);\r\n this.dirty.set(true);\r\n this.ngZone.run(() => this._onChange(next));\r\n this.onValueChanged.emit({\r\n value: next,\r\n previousValue,\r\n event,\r\n component: this,\r\n element: this.element,\r\n });\r\n }\r\n\r\n /**\r\n * Re-emit a native event in dx's shape.\r\n *\r\n * `onEnterKey` is the one that earns its keep: it has no native equivalent, so every call\r\n * site would otherwise carry its own key check.\r\n */\r\n protected emitEditorEvent(kind: NxeEditorEventKind, event: Event): void {\r\n const payload: NxeEditorEvent = { event, component: this, element: this.element };\r\n switch (kind) {\r\n case 'keydown':\r\n this.onKeyDown.emit(payload);\r\n if ((event as KeyboardEvent).key === 'Enter') {\r\n this.onEnterKey.emit(payload);\r\n }\r\n break;\r\n case 'keyup':\r\n this.onKeyUp.emit(payload);\r\n break;\r\n case 'input':\r\n this.onInput.emit(payload);\r\n break;\r\n case 'change':\r\n this.onChange.emit(payload);\r\n break;\r\n case 'focusin':\r\n this.onFocusIn.emit(payload);\r\n break;\r\n case 'focusout':\r\n this.onFocusOut.emit(payload);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Commit `next` if `valueChangeEvent` says this is the moment.\r\n *\r\n * Blur always commits, whatever the mode: a value the user typed and then left must not be\r\n * discarded because the configured event never fired.\r\n */\r\n protected commitOn(kind: 'input' | 'keyup' | 'change', next: T | null, event: Event): void {\r\n if (kind === 'change' || this.valueChangeEvent() === kind) {\r\n this.commitValue(next, event);\r\n }\r\n }\r\n\r\n /** Mark the control as touched (e.g. on blur), notifying Angular forms exactly once. */\r\n protected markAsTouched(): void {\r\n if (this.touched()) {\r\n return;\r\n }\r\n this.touched.set(true);\r\n this.ngZone.run(() => this._onTouched());\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\nimport { NxeConfigOption } from '../tokens/nxe-config-option.token';\r\n\r\n/**\r\n * Base for no-template nested-option components (see {@link NxeConfigOption}).\r\n *\r\n * Concrete options extend this, declare their inputs as signals, implement {@link nxeConfig}\r\n * (typically returning a `computed()` of those inputs), and register the {@link NXE_OPTION}\r\n * token so the parent can collect them:\r\n * ```ts\r\n * @Component({\r\n * selector: 'nxe-selection',\r\n * template: '',\r\n * providers: [{ provide: NXE_OPTION, useExisting: forwardRef(() => NxeSelectionComponent), multi: true }],\r\n * })\r\n * export class NxeSelectionComponent extends NxeConfigOptionBase<SelectionConfig> {\r\n * readonly nxeRole = 'selection';\r\n * readonly mode = input<'single' | 'multiple'>('single');\r\n * nxeConfig() { return { mode: this.mode() }; }\r\n * }\r\n * ```\r\n */\r\n@Directive()\r\nexport abstract class NxeConfigOptionBase<TConfig> implements NxeConfigOption<TConfig> {\r\n abstract readonly nxeRole: string;\r\n abstract nxeConfig(): TConfig;\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Contract implemented by every flat `nxe-` nested-option component\r\n * (`nxe-column`, `nxe-selection`, `nxe-paging`, `nxe-summary`, `nxe-validation-rule`, ...).\r\n *\r\n * Nested options carry no template; they exist purely to declare configuration. Each one\r\n * exposes its current config as a signal-readable function and a `role` discriminator, so a\r\n * parent (`nxe-data-grid`, `nxe-select-box`, ...) can collect them via `contentChildren` and\r\n * derive a reactive config model — the mechanism that lets\r\n * `<nxe-data-grid><nxe-column/></nxe-data-grid>` mirror `<dx-data-grid><dxi-column/>`.\r\n */\r\nexport interface NxeConfigOption<TConfig = unknown> {\r\n /** Discriminator identifying the option kind, e.g. `'column'`, `'selection'`, `'paging'`. */\r\n readonly nxeRole: string;\r\n /** Returns the option's current configuration (reads signals; recomputes reactively). */\r\n nxeConfig(): TConfig;\r\n}\r\n\r\n/**\r\n * DI token every nested-option component provides (`multi: true`) so parents can query all\r\n * options with `contentChildren(NXE_OPTION)` without importing the concrete option classes.\r\n */\r\nexport const NXE_OPTION = new InjectionToken<NxeConfigOption>('NXE_OPTION');\r\n","import { computed, Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * `nxeTemplate` — drop-in replacement for DevExtreme's `*dxTemplate`.\r\n *\r\n * Captures a named `ng-template` so a parent container (select-box item template, grid\r\n * cell/header/edit templates, list item template, ...) can look it up by name and render it\r\n * with a context object. BOTH authoring forms resolve to the same {@link name}:\r\n *\r\n * - attribute form: `<ng-template nxeTemplate=\"cellContent\" let-data>` (psak-web style)\r\n * - dx microsyntax: `<div *nxeTemplate=\"let data of 'cellContent'\">` — desugars the name into\r\n * an `nxeTemplateOf` binding (orbit's mechanically-migrated `*dxTemplate` templates)\r\n *\r\n * Parents collect these via `contentChildren(NxeTemplateDirective)` and match on {@link name},\r\n * rendering with `ngTemplateOutlet` + an `ngTemplateOutletContext` of `{ $implicit: data, ... }`.\r\n */\r\n@Directive({\r\n selector: '[nxeTemplate]',\r\n})\r\nexport class NxeTemplateDirective {\r\n /** Attribute-form name (`nxeTemplate=\"name\"`); empty in microsyntax usage. */\r\n readonly attrName = input<string>('', { alias: 'nxeTemplate' });\r\n /** Microsyntax-form name (`*nxeTemplate=\"let x of 'name'\"` binds `nxeTemplateOf`). */\r\n readonly ofName = input<string | undefined>(undefined, { alias: 'nxeTemplateOf' });\r\n\r\n /** The template's lookup name, whichever form supplied it. */\r\n readonly name = computed(() => this.ofName() ?? this.attrName());\r\n\r\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","/**\r\n * Wrap a value in an array if it is not already one (null/undefined -> empty array).\r\n *\r\n * Mirrors `@angular/cdk/coercion`'s `coerceArray` so nxe components don't import CDK coercion\r\n * directly. (For boolean/number coercion use `booleanAttribute` / `numberAttribute` from\r\n * `@angular/core` directly on `input(...)`.)\r\n */\r\nexport function coerceArray<T>(value: T | readonly T[] | null | undefined): T[] {\r\n if (value == null) {\r\n return [];\r\n }\r\n return Array.isArray(value) ? [...value] : [value as T];\r\n}\r\n","import { booleanAttribute } from '@angular/core';\r\n\r\n/**\r\n * `booleanAttribute` that preserves \"unset\".\r\n *\r\n * An input resolved as `binding ?? token ?? literal` needs three states, but\r\n * `booleanAttribute` has two: it maps `undefined` to `false`, which makes \"nobody bound this\"\r\n * indistinguishable from \"someone bound false\" and silently removes the token rung.\r\n *\r\n * This keeps the attribute-form coercion (`showClearButton=\"false\"` is `false`, not the truthy\r\n * string) and passes `undefined` straight through.\r\n */\r\nexport function nxeOptionalBoolean(value: unknown): boolean | undefined {\r\n return value === undefined || value === null ? undefined : booleanAttribute(value);\r\n}\r\n","/**\r\n * DevExtreme's `displayExpr` / `valueExpr` / `searchExpr` accessor.\r\n *\r\n * dx accepts four spellings and the library accepted one — a flat property name — so a dotted\r\n * path silently read `item['user.name']` and returned undefined. Silent, because an accessor\r\n * that misses looks exactly like a field that is empty.\r\n *\r\n * undefined / '' the item itself (dx: no expression)\r\n * 'this' the item itself (dx's documented sentinel)\r\n * 'user.name' a dotted path\r\n * (item) => ... a function accessor\r\n */\r\nexport type NxeExpr<T = unknown> = string | ((item: T) => unknown) | undefined | null;\r\n\r\n/** Resolve `expr` against `item`. */\r\nexport function nxeResolveExpr<T = unknown>(expr: NxeExpr<T>, item: T): unknown {\r\n if (typeof expr === 'function') {\r\n return expr(item);\r\n }\r\n if (!expr || expr === 'this') {\r\n return item;\r\n }\r\n if (item == null || typeof item !== 'object') {\r\n return undefined;\r\n }\r\n if (!expr.includes('.')) {\r\n return (item as Record<string, unknown>)[expr];\r\n }\r\n return expr\r\n .split('.')\r\n .reduce<unknown>(\r\n (acc, key) => (acc == null || typeof acc !== 'object' ? undefined : (acc as Record<string, unknown>)[key]),\r\n item,\r\n );\r\n}\r\n\r\n/** Resolve `expr` and render it as display text: `null`/`undefined` become the empty string. */\r\nexport function nxeResolveText<T = unknown>(expr: NxeExpr<T>, item: T): string {\r\n const resolved = nxeResolveExpr(expr, item);\r\n return resolved == null ? '' : String(resolved);\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/** A single failed validation rule. */\r\nexport interface NxeBrokenRule {\r\n type: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Result of validating a control or a validation group — shaped to match\r\n * DevExtreme's `ValidationGroup.validate()` / `dxValidator.validate()` return value so existing\r\n * handlers (`const r = event.validationGroup.validate(); if (r.isValid) {...}`) work unchanged.\r\n */\r\nexport interface NxeValidationResult {\r\n isValid: boolean;\r\n brokenRules: NxeBrokenRule[];\r\n status: 'valid' | 'invalid' | 'pending';\r\n}\r\n\r\n/**\r\n * Contract an editor exposes (via {@link NXE_VALIDATION_TARGET}) to the `nxe-validator` nested\r\n * inside it: read the current value, the editor's validation group, and push the invalid\r\n * message back so the editor can render it.\r\n */\r\nexport interface NxeValidationTarget {\r\n getValue(): unknown;\r\n validationGroup(): string | undefined;\r\n setValidationError(message: string | null): void;\r\n /**\r\n * Tell the editor whether a `required` rule applies, so it can render `aria-required`.\r\n * Optional: a target predating this simply does not advertise the requirement.\r\n */\r\n setRequired?(required: boolean): void;\r\n}\r\n\r\n/** DI token the editor provides so its nested `nxe-validator` can adapt it. */\r\nexport const NXE_VALIDATION_TARGET = new InjectionToken<NxeValidationTarget>(\r\n 'NXE_VALIDATION_TARGET',\r\n);\r\n\r\n/** A member registered in a validation group (an `nxe-validator`). */\r\nexport interface NxeValidationGroupMember {\r\n validate(): NxeValidationResult;\r\n /** Clear the member's error state without validating. Optional for older members. */\r\n reset?(): void;\r\n}\r\n\r\n/**\r\n * An `nxe-validation-group` ancestor, exposed so a validator or a button inside it can join it\r\n * without naming a group.\r\n *\r\n * DevExtreme lets a group be addressed two ways: by a string name shared between a validator and\r\n * a button, or structurally by wrapping both in a `dxValidationGroup`. The string form is what\r\n * the consuming applications use; this token is the structural one, and an explicit string\r\n * always wins over it, as in dx.\r\n */\r\nexport interface NxeValidationGroupScope {\r\n /** Opaque, unique per instance — never collides with an application's own group names. */\r\n readonly groupKey: string;\r\n}\r\n\r\nexport const NXE_VALIDATION_GROUP = new InjectionToken<NxeValidationGroupScope>(\r\n 'NXE_VALIDATION_GROUP',\r\n);\r\n\r\n/** DevExtreme-shaped `onValidated` payload. */\r\nexport interface NxeValidatedEvent extends NxeValidationResult {\r\n value: unknown;\r\n validationGroup: string;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NxeBrokenRule, NxeValidationGroupMember, NxeValidationResult } from './nxe-validation.types';\r\n\r\n/**\r\n * Root registry mapping a `validationGroup` string to the `nxe-validator`s in it, mirroring\r\n * DevExtreme's global ValidationEngine.\r\n *\r\n * `nxe-button[validationGroup]` (and any caller) triggers {@link validate} for a group, which\r\n * runs every member validator and aggregates the result into the DevExtreme-shaped\r\n * {@link NxeValidationResult}.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NxeValidationGroupRegistry {\r\n private readonly groups = new Map<string, Set<NxeValidationGroupMember>>();\r\n\r\n register(group: string, member: NxeValidationGroupMember): void {\r\n let set = this.groups.get(group);\r\n if (!set) {\r\n set = new Set();\r\n this.groups.set(group, set);\r\n }\r\n set.add(member);\r\n }\r\n\r\n unregister(group: string, member: NxeValidationGroupMember): void {\r\n const set = this.groups.get(group);\r\n if (!set) {\r\n return;\r\n }\r\n set.delete(member);\r\n if (set.size === 0) {\r\n this.groups.delete(group);\r\n }\r\n }\r\n\r\n /**\r\n * Clear every member's error state without validating.\r\n *\r\n * dx's `ValidationGroup.reset()`. The distinction from `validate()` matters after a Cancel:\r\n * the fields should stop showing errors, not be re-checked and light up again.\r\n */\r\n reset(group: string): void {\r\n for (const member of this.groups.get(group) ?? []) {\r\n member.reset?.();\r\n }\r\n }\r\n\r\n /** Validate every member of the group; valid (and empty) groups return `isValid: true`. */\r\n validate(group: string): NxeValidationResult {\r\n const set = this.groups.get(group);\r\n const brokenRules: NxeBrokenRule[] = [];\r\n if (set) {\r\n for (const member of set) {\r\n const result = member.validate();\r\n if (!result.isValid) {\r\n brokenRules.push(...result.brokenRules);\r\n }\r\n }\r\n }\r\n return {\r\n isValid: brokenRules.length === 0,\r\n brokenRules,\r\n status: brokenRules.length === 0 ? 'valid' : 'invalid',\r\n };\r\n }\r\n}\r\n","// @nexterajs/ui — core abstractions shared by every component.\r\n\r\nexport * from './types/nxe-events';\r\nexport * from './base/nxe-form-control.base';\r\nexport * from './base/nxe-config-option.base';\r\nexport * from './tokens/nxe-config-option.token';\r\nexport * from './tokens/nxe-default-options.token';\r\nexport * from './directives/nxe-template.directive';\r\nexport * from './coercion/coerce-array';\r\nexport * from './coercion/optional-boolean';\r\nexport * from './coercion/nxe-expr';\r\nexport * from './validation/nxe-validation.types';\r\nexport * from './validation/nxe-validation-group-registry.service';\r\n","// @nexterajs/ui/core — public API.\r\nexport * from './lib/core/index';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nexterajs-ui-core.mjs","sources":["../../../projects/nextera-ui/core/src/lib/core/i18n/nxe-messages.en.ts","../../../projects/nextera-ui/core/src/lib/core/i18n/nxe-messages.id.ts","../../../projects/nextera-ui/core/src/lib/core/i18n/nxe-message.service.ts","../../../projects/nextera-ui/core/src/lib/core/tokens/nxe-default-options.token.ts","../../../projects/nextera-ui/core/src/lib/core/base/nxe-form-control.base.ts","../../../projects/nextera-ui/core/src/lib/core/base/nxe-config-option.base.ts","../../../projects/nextera-ui/core/src/lib/core/tokens/nxe-config-option.token.ts","../../../projects/nextera-ui/core/src/lib/core/directives/nxe-template.directive.ts","../../../projects/nextera-ui/core/src/lib/core/coercion/coerce-array.ts","../../../projects/nextera-ui/core/src/lib/core/coercion/optional-boolean.ts","../../../projects/nextera-ui/core/src/lib/core/coercion/nxe-expr.ts","../../../projects/nextera-ui/core/src/lib/core/validation/nxe-validation.types.ts","../../../projects/nextera-ui/core/src/lib/core/validation/nxe-validation-group-registry.service.ts","../../../projects/nextera-ui/core/src/lib/core/i18n/nxe-format-file-size.ts","../../../projects/nextera-ui/core/src/lib/core/index.ts","../../../projects/nextera-ui/core/src/public-api.ts","../../../projects/nextera-ui/core/src/nexterajs-ui-core.ts"],"sourcesContent":["/**\r\n * Every user-visible string the library renders, in English.\r\n *\r\n * Flat keys, namespaced by component (`grid.pager.info`). `{0}`, `{1}`... are positional\r\n * arguments filled by `NxeMessageService.t(key, ...args)`. English is the default bundle and\r\n * the fallback for any key a custom bundle leaves out, so the library renders exactly what it\r\n * always did until an application opts into another locale.\r\n *\r\n * The key set is the type: `NxeMessageKey` is derived from it and the Indonesian bundle is\r\n * checked against it, so a key added here without a translation fails to compile.\r\n */\r\nexport const NXE_MESSAGES_EN = {\r\n // Shared by several components.\r\n 'common.search': 'Search',\r\n 'common.clear': 'Clear',\r\n 'common.close': 'Close',\r\n 'common.ok': 'OK',\r\n 'common.cancel': 'Cancel',\r\n 'common.confirm': 'Confirm',\r\n 'common.yes': 'Yes',\r\n 'common.no': 'No',\r\n 'common.all': '(All)',\r\n 'common.selectAll': 'Select All',\r\n 'common.blanks': '(Blanks)',\r\n\r\n // nxe-data-grid.\r\n 'grid.noData': 'No data',\r\n 'grid.groupPanel': 'Drag a column header here to group by that column',\r\n 'grid.edit': 'Edit',\r\n 'grid.save': 'Save',\r\n 'grid.cancel': 'Cancel',\r\n 'grid.expand': 'Expand',\r\n 'grid.collapse': 'Collapse',\r\n 'grid.expandedRow': 'Expanded row',\r\n 'grid.collapsedRow': 'Collapsed row',\r\n 'grid.editableCell': 'Editable',\r\n 'grid.filterRow.operation': 'Filter operation',\r\n 'grid.filterRow.reset': 'Reset',\r\n 'grid.filterRow.true': 'true',\r\n 'grid.filterRow.false': 'false',\r\n 'grid.op.contains': 'Contains',\r\n 'grid.op.notContains': 'Does not contain',\r\n 'grid.op.startsWith': 'Starts with',\r\n 'grid.op.endsWith': 'Ends with',\r\n 'grid.op.equals': 'Equals',\r\n 'grid.op.notEquals': 'Does not equal',\r\n 'grid.op.lessThan': 'Less than',\r\n 'grid.op.greaterThan': 'Greater than',\r\n 'grid.op.lessThanOrEqual': 'Less than or equal to',\r\n 'grid.op.greaterThanOrEqual': 'Greater than or equal to',\r\n 'grid.op.between': 'Between',\r\n\r\n // Pager (inside nxe-data-grid).\r\n 'grid.pager.info': 'Page {0} of {1} ({2} items)',\r\n 'grid.pager.navigation': 'Page navigation',\r\n 'grid.pager.pageSize': 'Page size',\r\n 'grid.pager.itemsPerPage': 'Items per page: {0}',\r\n 'grid.pager.previous': 'Previous page',\r\n 'grid.pager.next': 'Next page',\r\n 'grid.pager.page': 'Page {0}',\r\n 'grid.pager.first': 'First page',\r\n 'grid.pager.last': 'Last page',\r\n 'grid.pager.total': '{0} items',\r\n\r\n // Server-side data (NxeRemoteDataSource) in nxe-data-grid.\r\n 'grid.remote.loading': 'Loading',\r\n 'grid.remote.error': 'The data could not be loaded.',\r\n 'grid.remote.retry': 'Retry',\r\n\r\n // nxe-file-uploader.\r\n 'uploader.selectFile': 'Select File',\r\n 'uploader.dropHere': 'or Drop here',\r\n 'uploader.cancel': 'Cancel',\r\n 'uploader.sizeB': '{0} b',\r\n 'uploader.sizeKb': '{0} Kb',\r\n 'uploader.sizeMb': '{0} Mb',\r\n\r\n // nxe-validator rules without a message of their own.\r\n 'validation.rule.required': 'Required',\r\n 'validation.rule.email': 'Email is invalid',\r\n 'validation.rule.pattern': 'Value does not match pattern',\r\n 'validation.rule.range': 'Value is out of range',\r\n 'validation.rule.compare': 'Values do not match',\r\n 'validation.rule.custom': 'Value is invalid',\r\n\r\n // nxe-form-field, for Angular's built-in validators.\r\n 'validation.field.required': 'This field is required.',\r\n 'validation.field.email': 'Enter a valid email address.',\r\n 'validation.field.minlength': 'Enter at least {0} characters.',\r\n 'validation.field.maxlength': 'Enter no more than {0} characters.',\r\n 'validation.field.min': 'Must be at least {0}.',\r\n 'validation.field.max': 'Must be at most {0}.',\r\n 'validation.field.pattern': 'Enter a value in the expected format.',\r\n 'validation.field.invalid': 'This value is not valid.',\r\n\r\n // nxe-date-box calendar. Month and weekday names come from Luxon for the active locale.\r\n 'date.now': 'Now',\r\n 'date.done': 'Done',\r\n 'date.hour': 'Hour',\r\n 'date.minute': 'Minute',\r\n // nxe-date-range-box.\r\n 'dateRange.start': 'Start date',\r\n 'dateRange.end': 'End date',\r\n 'dateRange.startPlaceholder': 'Start date',\r\n 'dateRange.endPlaceholder': 'End date',\r\n 'dateRange.dialog': 'Choose a date range',\r\n 'dateRange.previousMonth': 'Previous month',\r\n 'dateRange.nextMonth': 'Next month',\r\n 'dateRange.presets': 'Quick ranges',\r\n 'dateRange.pickStart': 'Select the start date',\r\n 'dateRange.pickEnd': 'Select the end date',\r\n 'dateRange.preset.today': 'Today',\r\n 'dateRange.preset.yesterday': 'Yesterday',\r\n 'dateRange.preset.last7Days': 'Last 7 days',\r\n 'dateRange.preset.last30Days': 'Last 30 days',\r\n 'dateRange.preset.thisMonth': 'This month',\r\n 'dateRange.preset.lastMonth': 'Last month',\r\n 'dateRange.preset.thisYear': 'This year',\r\n\r\n\r\n // Drop-downs (nxe-select-box, nxe-tag-box).\r\n 'dropdown.noData': 'No data to display',\r\n 'dropdown.selectAll': 'Select All',\r\n\r\n // nxe-file-input, and its errors in nxe-form-field.\r\n 'uploader.selectFiles': 'Select files',\r\n 'uploader.dropFiles': 'or drop files here',\r\n 'uploader.listLabel': 'Attached files',\r\n 'uploader.acceptHint': 'Accepted: {0}',\r\n 'uploader.maxSizeHint': 'Up to {0} each',\r\n 'uploader.maxFilesHint': 'Up to {0} files',\r\n 'uploader.statusPending': 'Waiting to upload',\r\n 'uploader.statusUploading': 'Uploading {0}%',\r\n 'uploader.statusUploaded': 'Uploaded',\r\n 'uploader.statusFailed': 'Upload failed',\r\n 'uploader.uploadingFile': 'Uploading {0}',\r\n 'uploader.uploadFailed': 'The upload failed.',\r\n 'uploader.cancelled': 'Upload cancelled.',\r\n 'uploader.cancelFile': 'Cancel upload of {0}',\r\n 'uploader.retryFile': 'Retry upload of {0}',\r\n 'uploader.removeFile': 'Remove {0}',\r\n 'uploader.retry': 'Retry',\r\n 'uploader.remove': 'Remove',\r\n 'uploader.rejectType': '{0} is not an accepted file type.',\r\n 'uploader.rejectSize': '{0} is larger than {1}.',\r\n 'uploader.rejectCount': '{0} is over the limit of {1} files.',\r\n 'uploader.announceAdded': '{0} added',\r\n 'uploader.announceRemoved': '{0} removed',\r\n 'validation.field.fileType': 'Only these file types are accepted: {0}.',\r\n 'validation.field.fileSize': 'Each file must be {0} or smaller.',\r\n 'validation.field.maxFiles': 'Attach at most {0} files.',\r\n 'validation.field.uploading': 'Wait for the uploads to finish.',\r\n 'validation.field.uploadFailed': 'Retry or remove the files that failed to upload.',\r\n\r\n // nxe-timeline.\r\n 'timeline.pending': 'Pending',\r\n\r\n // nxe-stepper.\r\n 'stepper.listLabel': 'Steps',\r\n 'stepper.stepOf': 'Step {0} of {1}: {2}',\r\n 'stepper.completed': 'Completed',\r\n 'stepper.error': 'Has errors',\r\n 'stepper.optional': 'Optional',\r\n 'stepper.blocked': 'Step {0} is not complete. Fix the highlighted fields to continue.',\r\n\r\n // nxe-notify toasts.\r\n 'notify.close': 'Close notification',\r\n\r\n // nxe-shell, nxe-sidenav, nxe-topbar.\r\n 'shell.skipToContent': 'Skip to content',\r\n 'shell.mainNavigation': 'Main navigation',\r\n 'shell.toggleNavigation': 'Toggle navigation',\r\n 'shell.closeNavigation': 'Close navigation',\r\n 'shell.collapseSidebar': 'Collapse sidebar',\r\n 'shell.expandSidebar': 'Expand sidebar',\r\n\r\n // nxe-pivot-grid.\r\n 'pivot.grandTotal': 'Grand Total',\r\n 'pivot.total': '{0} Total',\r\n 'pivot.noData': 'No data',\r\n 'pivot.showFieldChooser': 'Show Field Chooser',\r\n 'pivot.chooser.title': 'Field Chooser',\r\n 'pivot.chooser.allFields': 'All Fields',\r\n 'pivot.chooser.rowFields': 'Row Fields',\r\n 'pivot.chooser.columnFields': 'Column Fields',\r\n 'pivot.chooser.filterFields': 'Filter Fields',\r\n 'pivot.chooser.dataFields': 'Data Fields',\r\n 'pivot.chooser.checkState': 'Check state',\r\n 'pivot.panel.dropFilter': 'Drop Filter Fields Here',\r\n 'pivot.panel.dropData': 'Drop Data Fields Here',\r\n 'pivot.panel.dropColumn': 'Drop Column Fields Here',\r\n 'pivot.panel.dropRow': 'Drop Row Fields Here',\r\n\r\n // nxe-text-box password reveal and nxe-text-area counter.\r\n 'forms.password.show': 'Show password',\r\n 'forms.password.hide': 'Hide password',\r\n 'forms.textArea.charactersLeft': '{0} characters left',\r\n 'forms.textArea.charactersOver': '{0} characters over the limit',\r\n 'forms.numberBox.increase': 'Increase',\r\n 'forms.numberBox.decrease': 'Decrease',\r\n\r\n // nxe-description-list: read in place of the empty-value glyph.\r\n 'display.noValue': 'No value',\r\n\r\n // @nexterajs/ui/charts: nxe-line-chart, nxe-area-chart, nxe-donut-chart.\r\n 'charts.other': 'Other',\r\n 'charts.total': 'Total',\r\n 'charts.empty': 'No data to chart',\r\n 'charts.legend': 'Legend',\r\n 'charts.viewAsTable': 'View as table',\r\n 'charts.viewAsChart': 'View as chart',\r\n 'charts.navigate': 'Chart data. Use the arrow keys to move between points, Escape to leave.',\r\n 'charts.navigateSegments': 'Chart segments. Use the arrow keys to move between segments, Escape to leave.',\r\n 'charts.summary.line': 'Line chart, {0} series, {1} points from {2} to {3}.',\r\n 'charts.summary.area': 'Area chart, {0} series, {1} points from {2} to {3}.',\r\n 'charts.summary.stackedArea': 'Stacked area chart, {0} series, {1} points from {2} to {3}.',\r\n 'charts.summary.series': '{0}: from {1} to {2}, lowest {3}, highest {4}.',\r\n 'charts.summary.donut': 'Donut chart, {0} segments, total {1}.',\r\n 'charts.summary.segment': '{0}: {1}, {2}.',\r\n 'charts.table.category': 'Category',\r\n 'charts.table.segment': 'Segment',\r\n 'charts.table.value': 'Value',\r\n 'charts.table.share': 'Share',\r\n // nxe-avatar status dot, and the \"+N\" chip of nxe-avatar-group.\r\n 'avatar.status.online': 'Online',\r\n 'avatar.status.away': 'Away',\r\n 'avatar.status.busy': 'Busy',\r\n 'avatar.status.offline': 'Offline',\r\n 'avatar.more': '{0} more',\r\n\r\n // nxe-breadcrumb.\r\n 'breadcrumb.label': 'Breadcrumb',\r\n 'breadcrumb.more': 'Show hidden levels',\r\n} as const satisfies Record<string, string>;\r\n\r\n/** A key of the message bundle. */\r\nexport type NxeMessageKey = keyof typeof NXE_MESSAGES_EN;\r\n\r\n/** A complete message bundle: every key, one string each. */\r\nexport type NxeMessages = Readonly<Record<NxeMessageKey, string>>;\r\n","import type { NxeMessages } from './nxe-messages.en';\r\n\r\n/** Indonesian bundle (Bahasa Indonesia), checked against the English key set. */\r\nexport const NXE_MESSAGES_ID: NxeMessages = {\r\n 'common.search': 'Cari',\r\n 'common.clear': 'Hapus',\r\n 'common.close': 'Tutup',\r\n 'common.ok': 'OK',\r\n 'common.cancel': 'Batal',\r\n 'common.confirm': 'Konfirmasi',\r\n 'common.yes': 'Ya',\r\n 'common.no': 'Tidak',\r\n 'common.all': '(Semua)',\r\n 'common.selectAll': 'Pilih Semua',\r\n 'common.blanks': '(Kosong)',\r\n\r\n 'grid.noData': 'Tidak ada data',\r\n 'grid.groupPanel': 'Seret header kolom ke sini untuk mengelompokkan berdasarkan kolom tersebut',\r\n 'grid.edit': 'Ubah',\r\n 'grid.save': 'Simpan',\r\n 'grid.cancel': 'Batal',\r\n 'grid.expand': 'Perluas',\r\n 'grid.collapse': 'Ciutkan',\r\n 'grid.expandedRow': 'Baris diperluas',\r\n 'grid.collapsedRow': 'Baris diciutkan',\r\n 'grid.editableCell': 'Dapat diubah',\r\n 'grid.filterRow.operation': 'Operasi filter',\r\n 'grid.filterRow.reset': 'Atur ulang',\r\n 'grid.filterRow.true': 'Ya',\r\n 'grid.filterRow.false': 'Tidak',\r\n 'grid.op.contains': 'Mengandung',\r\n 'grid.op.notContains': 'Tidak mengandung',\r\n 'grid.op.startsWith': 'Diawali dengan',\r\n 'grid.op.endsWith': 'Diakhiri dengan',\r\n 'grid.op.equals': 'Sama dengan',\r\n 'grid.op.notEquals': 'Tidak sama dengan',\r\n 'grid.op.lessThan': 'Kurang dari',\r\n 'grid.op.greaterThan': 'Lebih dari',\r\n 'grid.op.lessThanOrEqual': 'Kurang dari atau sama dengan',\r\n 'grid.op.greaterThanOrEqual': 'Lebih dari atau sama dengan',\r\n 'grid.op.between': 'Di antara',\r\n\r\n 'grid.pager.info': 'Halaman {0} dari {1} ({2} item)',\r\n 'grid.pager.navigation': 'Navigasi halaman',\r\n 'grid.pager.pageSize': 'Ukuran halaman',\r\n 'grid.pager.itemsPerPage': 'Item per halaman: {0}',\r\n 'grid.pager.previous': 'Halaman sebelumnya',\r\n 'grid.pager.next': 'Halaman berikutnya',\r\n 'grid.pager.page': 'Halaman {0}',\r\n 'grid.pager.first': 'Halaman pertama',\r\n 'grid.pager.last': 'Halaman terakhir',\r\n 'grid.pager.total': '{0} item',\r\n 'grid.remote.loading': 'Memuat',\r\n 'grid.remote.error': 'Data tidak dapat dimuat.',\r\n 'grid.remote.retry': 'Coba lagi',\r\n\r\n 'uploader.selectFile': 'Pilih File',\r\n 'uploader.dropHere': 'atau seret ke sini',\r\n 'uploader.cancel': 'Batal',\r\n 'uploader.sizeB': '{0} B',\r\n 'uploader.sizeKb': '{0} KB',\r\n 'uploader.sizeMb': '{0} MB',\r\n\r\n 'validation.rule.required': 'Wajib diisi',\r\n 'validation.rule.email': 'Email tidak valid',\r\n 'validation.rule.pattern': 'Nilai tidak sesuai pola',\r\n 'validation.rule.range': 'Nilai di luar rentang',\r\n 'validation.rule.compare': 'Nilai tidak sama',\r\n 'validation.rule.custom': 'Nilai tidak valid',\r\n\r\n 'validation.field.required': 'Kolom ini wajib diisi.',\r\n 'validation.field.email': 'Masukkan alamat email yang valid.',\r\n 'validation.field.minlength': 'Masukkan minimal {0} karakter.',\r\n 'validation.field.maxlength': 'Masukkan maksimal {0} karakter.',\r\n 'validation.field.min': 'Minimal {0}.',\r\n 'validation.field.max': 'Maksimal {0}.',\r\n 'validation.field.pattern': 'Masukkan nilai dengan format yang sesuai.',\r\n 'validation.field.invalid': 'Nilai ini tidak valid.',\r\n\r\n 'date.now': 'Sekarang',\r\n 'date.done': 'Selesai',\r\n 'date.hour': 'Jam',\r\n 'date.minute': 'Menit',\r\n 'dateRange.start': 'Tanggal mulai',\r\n 'dateRange.end': 'Tanggal akhir',\r\n 'dateRange.startPlaceholder': 'Tanggal mulai',\r\n 'dateRange.endPlaceholder': 'Tanggal akhir',\r\n 'dateRange.dialog': 'Pilih rentang tanggal',\r\n 'dateRange.previousMonth': 'Bulan sebelumnya',\r\n 'dateRange.nextMonth': 'Bulan berikutnya',\r\n 'dateRange.presets': 'Rentang cepat',\r\n 'dateRange.pickStart': 'Pilih tanggal mulai',\r\n 'dateRange.pickEnd': 'Pilih tanggal akhir',\r\n 'dateRange.preset.today': 'Hari ini',\r\n 'dateRange.preset.yesterday': 'Kemarin',\r\n 'dateRange.preset.last7Days': '7 hari terakhir',\r\n 'dateRange.preset.last30Days': '30 hari terakhir',\r\n 'dateRange.preset.thisMonth': 'Bulan ini',\r\n 'dateRange.preset.lastMonth': 'Bulan lalu',\r\n 'dateRange.preset.thisYear': 'Tahun ini',\r\n\r\n\r\n 'dropdown.noData': 'Tidak ada data',\r\n 'dropdown.selectAll': 'Pilih Semua',\r\n\r\n // nxe-file-input, and its errors in nxe-form-field.\r\n 'uploader.selectFiles': 'Pilih file',\r\n 'uploader.dropFiles': 'atau seret file ke sini',\r\n 'uploader.listLabel': 'File terlampir',\r\n 'uploader.acceptHint': 'Diterima: {0}',\r\n 'uploader.maxSizeHint': 'Maksimal {0} per file',\r\n 'uploader.maxFilesHint': 'Maksimal {0} file',\r\n 'uploader.statusPending': 'Menunggu diunggah',\r\n 'uploader.statusUploading': 'Mengunggah {0}%',\r\n 'uploader.statusUploaded': 'Terunggah',\r\n 'uploader.statusFailed': 'Gagal diunggah',\r\n 'uploader.uploadingFile': 'Mengunggah {0}',\r\n 'uploader.uploadFailed': 'Pengunggahan gagal.',\r\n 'uploader.cancelled': 'Pengunggahan dibatalkan.',\r\n 'uploader.cancelFile': 'Batalkan pengunggahan {0}',\r\n 'uploader.retryFile': 'Coba lagi mengunggah {0}',\r\n 'uploader.removeFile': 'Hapus {0}',\r\n 'uploader.retry': 'Coba lagi',\r\n 'uploader.remove': 'Hapus',\r\n 'uploader.rejectType': '{0} bukan jenis file yang diterima.',\r\n 'uploader.rejectSize': '{0} lebih besar dari {1}.',\r\n 'uploader.rejectCount': '{0} melebihi batas {1} file.',\r\n 'uploader.announceAdded': '{0} ditambahkan',\r\n 'uploader.announceRemoved': '{0} dihapus',\r\n 'validation.field.fileType': 'Hanya jenis file berikut yang diterima: {0}.',\r\n 'validation.field.fileSize': 'Setiap file maksimal {0}.',\r\n 'validation.field.maxFiles': 'Lampirkan paling banyak {0} file.',\r\n 'validation.field.uploading': 'Tunggu hingga pengunggahan selesai.',\r\n 'validation.field.uploadFailed': 'Coba lagi atau hapus file yang gagal diunggah.',\r\n\r\n // nxe-timeline.\r\n 'timeline.pending': 'Menunggu',\r\n\r\n // nxe-stepper.\r\n 'stepper.listLabel': 'Langkah',\r\n 'stepper.stepOf': 'Langkah {0} dari {1}: {2}',\r\n 'stepper.completed': 'Selesai',\r\n 'stepper.error': 'Ada kesalahan',\r\n 'stepper.optional': 'Opsional',\r\n 'stepper.blocked': 'Langkah {0} belum lengkap. Perbaiki kolom yang ditandai untuk melanjutkan.',\r\n\r\n 'notify.close': 'Tutup notifikasi',\r\n\r\n 'shell.skipToContent': 'Lewati ke konten',\r\n 'shell.mainNavigation': 'Navigasi utama',\r\n 'shell.toggleNavigation': 'Buka atau tutup navigasi',\r\n 'shell.closeNavigation': 'Tutup navigasi',\r\n 'shell.collapseSidebar': 'Ciutkan bilah samping',\r\n 'shell.expandSidebar': 'Perluas bilah samping',\r\n\r\n 'pivot.grandTotal': 'Total Keseluruhan',\r\n 'pivot.total': 'Total {0}',\r\n 'pivot.noData': 'Tidak ada data',\r\n 'pivot.showFieldChooser': 'Tampilkan Pemilih Field',\r\n 'pivot.chooser.title': 'Pemilih Field',\r\n 'pivot.chooser.allFields': 'Semua Field',\r\n 'pivot.chooser.rowFields': 'Field Baris',\r\n 'pivot.chooser.columnFields': 'Field Kolom',\r\n 'pivot.chooser.filterFields': 'Field Filter',\r\n 'pivot.chooser.dataFields': 'Field Data',\r\n 'pivot.chooser.checkState': 'Status centang',\r\n 'pivot.panel.dropFilter': 'Letakkan Field Filter di Sini',\r\n 'pivot.panel.dropData': 'Letakkan Field Data di Sini',\r\n 'pivot.panel.dropColumn': 'Letakkan Field Kolom di Sini',\r\n 'pivot.panel.dropRow': 'Letakkan Field Baris di Sini',\r\n\r\n 'forms.password.show': 'Tampilkan kata sandi',\r\n 'forms.password.hide': 'Sembunyikan kata sandi',\r\n 'forms.textArea.charactersLeft': 'Sisa {0} karakter',\r\n 'forms.textArea.charactersOver': 'Kelebihan {0} karakter dari batas',\r\n 'forms.numberBox.increase': 'Tambah',\r\n 'forms.numberBox.decrease': 'Kurangi',\r\n\r\n 'display.noValue': 'Tidak ada nilai',\r\n\r\n 'charts.other': 'Lainnya',\r\n 'charts.total': 'Total',\r\n 'charts.empty': 'Tidak ada data untuk ditampilkan',\r\n 'charts.legend': 'Legenda',\r\n 'charts.viewAsTable': 'Lihat sebagai tabel',\r\n 'charts.viewAsChart': 'Lihat sebagai grafik',\r\n 'charts.navigate': 'Data grafik. Gunakan tombol panah untuk berpindah antar titik, Escape untuk keluar.',\r\n 'charts.navigateSegments': 'Segmen grafik. Gunakan tombol panah untuk berpindah antar segmen, Escape untuk keluar.',\r\n 'charts.summary.line': 'Grafik garis, {0} seri, {1} titik dari {2} sampai {3}.',\r\n 'charts.summary.area': 'Grafik area, {0} seri, {1} titik dari {2} sampai {3}.',\r\n 'charts.summary.stackedArea': 'Grafik area bertumpuk, {0} seri, {1} titik dari {2} sampai {3}.',\r\n 'charts.summary.series': '{0}: dari {1} ke {2}, terendah {3}, tertinggi {4}.',\r\n 'charts.summary.donut': 'Grafik donat, {0} segmen, total {1}.',\r\n 'charts.summary.segment': '{0}: {1}, {2}.',\r\n 'charts.table.category': 'Kategori',\r\n 'charts.table.segment': 'Segmen',\r\n 'charts.table.value': 'Nilai',\r\n 'charts.table.share': 'Porsi',\r\n 'avatar.status.online': 'Aktif',\r\n 'avatar.status.away': 'Tidak di tempat',\r\n 'avatar.status.busy': 'Sibuk',\r\n 'avatar.status.offline': 'Luring',\r\n 'avatar.more': '{0} lainnya',\r\n\r\n 'breadcrumb.label': 'Jalur navigasi',\r\n 'breadcrumb.more': 'Tampilkan level tersembunyi',\r\n};\r\n","import {\n computed,\n DestroyRef,\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n signal,\n} from '@angular/core';\nimport {\n NXE_EN_US_SEPARATORS,\n NXE_ID_SEPARATORS,\n NXE_NUMBER_SEPARATORS,\n type NxeNumberSeparators,\n} from '@nexterajs/ui/intl';\nimport { Settings } from 'luxon';\nimport { NXE_MESSAGES_EN, type NxeMessageKey, type NxeMessages } from './nxe-messages.en';\nimport { NXE_MESSAGES_ID } from './nxe-messages.id';\n\n/** What an application states once at bootstrap; see {@link provideNxeMessages}. */\nexport interface NxeMessagesConfig {\n /** Initial locale (`'en'`, `'id'`, `'id-ID'`...). Default `'en'`. */\n locale?: string;\n /** Partial bundle layered over the active language's bundle, whatever the language. */\n overrides?: Partial<NxeMessages>;\n /**\n * Extra or replacement bundles by language (`{ fr: { 'common.cancel': 'Annuler' } }`). A bundle\n * may be partial: keys it leaves out fall back to English.\n */\n bundles?: Readonly<Record<string, Partial<NxeMessages>>>;\n /**\n * Set Luxon's `Settings.defaultLocale` to the active locale, so month and weekday names (and\n * every `MMM` in a display format) follow the language. Default `true`; `false` leaves Luxon\n * alone. Luxon's previous default is restored when the service is destroyed.\n */\n luxon?: boolean;\n /**\n * Make number separators follow the locale: `true` uses `1.234,5` for `id` and `1,234.5`\n * otherwise, or pass your own `{ [language]: separators }` map. It takes effect through\n * {@link provideNxeMessages}, which then provides {@link NXE_NUMBER_SEPARATORS} as a live view\n * of the active locale. Default off: numbers keep whatever `NXE_NUMBER_SEPARATORS` says.\n */\n separators?: boolean | Readonly<Record<string, NxeNumberSeparators>>;\n}\n\n/**\n * The library's initial message configuration, provided by {@link provideNxeMessages}. Absent,\n * the service starts in English with nothing overridden.\n */\nexport const NXE_MESSAGES = new InjectionToken<NxeMessagesConfig>('NXE_MESSAGES', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\nconst BUILT_IN: Readonly<Record<string, Partial<NxeMessages>>> = { en: NXE_MESSAGES_EN, id: NXE_MESSAGES_ID };\n\nconst BUILT_IN_SEPARATORS: Readonly<Record<string, NxeNumberSeparators>> = {\n en: NXE_EN_US_SEPARATORS,\n id: NXE_ID_SEPARATORS,\n};\n\n/** `'id-ID'` and `'id_ID'` to `'id'`. */\nfunction languageOf(locale: string): string {\n return locale.split(/[-_]/)[0].toLowerCase();\n}\n\n/**\n * Runtime-switchable messages for every `nxe-*` component.\n *\n * State is signals, so a component that reads {@link t} (or {@link messages}) inside a template or\n * a `computed` re-renders when the language changes: no reload, no recreation. That is also what\n * makes it safe under zoneless OnPush, because the template's reactive consumer tracks the read.\n *\n * ```ts\n * const messages = inject(NxeMessageService);\n * messages.use('id');\n * messages.t('grid.pager.info', 1, 5, 42); // 'Halaman 1 dari 5 (42 item)'\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class NxeMessageService {\n private readonly config = inject(NXE_MESSAGES);\n\n private readonly localeState = signal(this.config.locale ?? 'en');\n private readonly customBundle = signal<Partial<NxeMessages> | null>(null);\n private readonly overrideState = signal<Partial<NxeMessages>>(this.config.overrides ?? {});\n\n /** The active locale as the application stated it (`'id'`, `'en-US'`...). */\n readonly locale = this.localeState.asReadonly();\n\n /** The active language (`'id'` for `'id-ID'`); what picks the bundle. */\n readonly language = computed(() => languageOf(this.localeState()));\n\n /** The bundle in force: English, under the language's bundle, under the overrides. */\n readonly messages = computed<NxeMessages>(() => ({\n ...NXE_MESSAGES_EN,\n ...(this.customBundle() ?? this.config.bundles?.[this.language()] ?? BUILT_IN[this.language()]),\n ...this.overrideState(),\n }));\n\n /** Separators for the active locale; en-US for a language with none. */\n readonly separators = computed<NxeNumberSeparators>(() => {\n const map = typeof this.config.separators === 'object' ? this.config.separators : BUILT_IN_SEPARATORS;\n return map[this.language()] ?? NXE_EN_US_SEPARATORS;\n });\n\n private readonly luxonSync = this.config.luxon !== false;\n private readonly luxonBefore = Settings.defaultLocale;\n\n constructor() {\n if (this.luxonSync && this.config.locale) {\n Settings.defaultLocale = this.config.locale;\n }\n inject(DestroyRef).onDestroy(() => {\n if (this.luxonSync) {\n Settings.defaultLocale = this.luxonBefore;\n }\n });\n }\n\n /**\n * Switch language. A string picks a built-in or configured bundle (`'id'`, `'en'`); a bundle\n * object replaces the language's bundle outright (keys it leaves out fall back to English),\n * under the locale named by the second argument, or the current one.\n */\n use(locale: string): void;\n use(bundle: Partial<NxeMessages>, locale?: string): void;\n use(localeOrBundle: string | Partial<NxeMessages>, locale?: string): void {\n if (typeof localeOrBundle === 'string') {\n this.customBundle.set(null);\n this.setLocale(localeOrBundle);\n } else {\n this.customBundle.set(localeOrBundle);\n if (locale) {\n this.setLocale(locale);\n }\n }\n }\n\n /** Layer messages over the active bundle. They merge with earlier overrides and survive {@link use}. */\n override(messages: Partial<NxeMessages>): void {\n this.overrideState.update((current) => ({ ...current, ...messages }));\n }\n\n /** Drop every override added since bootstrap; the ones in the configuration stay. */\n clearOverrides(): void {\n this.overrideState.set(this.config.overrides ?? {});\n }\n\n /**\n * One message, with `{0}`, `{1}`... replaced by `args`. Reactive: reading it in a template or a\n * `computed` subscribes that consumer to the language.\n */\n t(key: NxeMessageKey, ...args: readonly unknown[]): string {\n return NxeMessageService.format(this.messages()[key], args);\n }\n\n /** Fill `{n}` placeholders; one without an argument is left as written. */\n static format(template: string, args: readonly unknown[]): string {\n return args.length\n ? template.replace(/\\{(\\d+)\\}/g, (match, index: string) =>\n Number(index) < args.length ? String(args[Number(index)]) : match,\n )\n : template;\n }\n\n private setLocale(locale: string): void {\n this.localeState.set(locale);\n if (this.luxonSync) {\n Settings.defaultLocale = locale;\n }\n }\n}\n\n/**\n * Registers the library's messages for the application:\n *\n * ```ts\n * provideNxeMessages({ locale: 'id', overrides: { 'grid.noData': 'Belum ada data' } })\n * ```\n *\n * With `separators` set it also provides {@link NXE_NUMBER_SEPARATORS} as a live view of the active\n * locale's separators, so grids and number boxes go from `1,234.5` to `1.234,5` with the language.\n */\nexport function provideNxeMessages(config: NxeMessagesConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NXE_MESSAGES, useValue: config },\n ...(config.separators\n ? [\n {\n provide: NXE_NUMBER_SEPARATORS,\n useFactory: (): NxeNumberSeparators => {\n const service = inject(NxeMessageService);\n return {\n get group() {\n return service.separators().group;\n },\n get decimal() {\n return service.separators().decimal;\n },\n };\n },\n },\n ]\n : []),\n ]);\n}\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Per-widget defaults, mirroring DevExtreme's `Widget.defaultOptions({ options: {...} })`.\r\n *\r\n * Every field is optional and every consumer resolves it as `binding ?? token ?? literal`, so\r\n * an application that provides nothing keeps the behaviour it has today.\r\n *\r\n * Only options that an application genuinely sets once and globally belong here. This is not a\r\n * second way to configure a component — a binding on the element always wins.\r\n */\r\nexport interface NxeGridDefaultOptions {\r\n hoverStateEnabled?: boolean;\r\n columnAutoWidth?: boolean;\r\n rowAlternationEnabled?: boolean;\r\n showColumnLines?: boolean;\r\n showRowLines?: boolean;\r\n showBorders?: boolean;\r\n wordWrapEnabled?: boolean;\r\n noDataText?: string;\r\n /**\r\n * Widget-mode column resizing: when a manual resize leaves the columns narrower than the grid,\r\n * the trailing column takes the rest, while dragging and after, so no blank strip shows on the\r\n * right. dx (and the default) lets the table end short of the grid.\r\n */\r\n resizeFillsGrid?: boolean;\r\n}\r\n\r\nexport interface NxePickerDefaultOptions {\r\n displayExpr?: string;\r\n valueExpr?: string;\r\n searchExpr?: string;\r\n searchEnabled?: boolean;\r\n showClearButton?: boolean;\r\n showDropDownButton?: boolean;\r\n placeholder?: string;\r\n}\r\n\r\nexport interface NxeDefaultOptions {\r\n readonly dataGrid?: NxeGridDefaultOptions;\r\n /** `nxe-tree-list` resolves against this slice instead of `dataGrid`, as dx does. */\r\n readonly treeList?: NxeGridDefaultOptions;\r\n readonly selectBox?: NxePickerDefaultOptions;\r\n readonly tagBox?: NxePickerDefaultOptions & { showSelectionControls?: boolean };\r\n /** Narrower than the other pickers: this one has no built-in search or drop-down button. */\r\n readonly dropDownBox?: Pick<\r\n NxePickerDefaultOptions,\r\n 'displayExpr' | 'valueExpr' | 'placeholder' | 'showClearButton'\r\n >;\r\n readonly dateBox?: { displayFormat?: string; placeholder?: string; showClearButton?: boolean };\r\n readonly textBox?: { placeholder?: string; hoverStateEnabled?: boolean; showClearButton?: boolean };\r\n readonly textArea?: { placeholder?: string; height?: number | string };\r\n readonly numberBox?: { format?: string; showClearButton?: boolean };\r\n readonly button?: { focusStateEnabled?: boolean };\r\n}\r\n\r\n/**\r\n * Application-wide component defaults.\r\n *\r\n * DevExtreme applications configure a great deal through `defaultOptions` and then never write\r\n * those attributes again — so the templates carry no evidence that the option was ever set.\r\n * Without an equivalent here, a migrated application silently gets the library's literals: an\r\n * app that set `columnAutoWidth: true` once at bootstrap would find every grid laying its\r\n * columns out differently, with nothing in the markup to explain why.\r\n *\r\n * ```ts\r\n * providers: [\r\n * {\r\n * provide: NXE_DEFAULT_OPTIONS,\r\n * useValue: {\r\n * dataGrid: { columnAutoWidth: true, hoverStateEnabled: true },\r\n * treeList: { columnAutoWidth: true, hoverStateEnabled: true },\r\n * textArea: { height: 80 },\r\n * } satisfies NxeDefaultOptions,\r\n * },\r\n * ]\r\n * ```\r\n */\r\nexport const NXE_DEFAULT_OPTIONS = new InjectionToken<NxeDefaultOptions>('NXE_DEFAULT_OPTIONS', {\r\n providedIn: 'root',\r\n factory: () => ({}),\r\n});\r\n","import {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n NgZone,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor } from '@angular/forms';\nimport { NxeMessageService } from '../i18n/nxe-message.service';\nimport { NXE_DEFAULT_OPTIONS } from '../tokens/nxe-default-options.token';\nimport { NxeEditorEvent, NxeEditorEventKind } from '../types/nxe-events';\nimport { NxeValueChangedEvent } from '../types/nxe-events';\nimport { NxeValidationTarget } from '../validation/nxe-validation.types';\n\n/**\n * Signal-based `ControlValueAccessor` base for every nxe form editor\n * (`nxe-text-box`, `nxe-number-box`, `nxe-date-box`, `nxe-check-box`, `nxe-text-area`,\n * `nxe-select-box`, `nxe-tag-box`, `nxe-radio`, ...).\n *\n * It supports BOTH template-driven (`[(ngModel)]`) and reactive (`formControlName`) forms\n * transparently, as well as DevExtreme-style `[value]` / `[(value)]` two-way binding, and\n * emits the DevExtreme-shaped {@link NxeValueChangedEvent} from `onValueChanged`.\n *\n * Concrete components MUST register themselves as the value accessor, e.g.:\n * ```ts\n * @Component({\n * selector: 'nxe-text-box',\n * providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextBoxComponent), multi: true }],\n * ...\n * })\n * export class NxeTextBoxComponent extends NxeFormControlBase<string> { ... }\n * ```\n *\n * Subclasses call {@link commitValue} on user interaction and {@link markAsTouched} on blur.\n */\nlet editorIdCounter = 0;\nconst nextEditorId = (): number => ++editorIdCounter;\n\n/**\n * dx size coercion: a bare number (or numeric string) means px, anything else passes through.\n * Templates write the attribute form, so the string case is the common one.\n */\nfunction cssSize(value: number | string | undefined): string | null {\n if (value === undefined || value === null || value === '') {\n return null;\n }\n return /^-?\\d+(\\.\\d+)?$/.test(String(value)) ? `${value}px` : String(value);\n}\n\n@Directive({\n host: {\n '[attr.title]': 'hint() || null',\n '[attr.id]': 'elementAttrId()',\n '[class]': 'elementAttrClass()',\n '[style.width]': 'widthStyle()',\n '[style.display]': 'visible() && !hiddenInput() ? null : \"none\"',\n // Listened for on the HOST, not on each inner control: these all bubble, so one place\n // covers every editor and cannot collide with the handlers an editor already binds on\n // its own input.\n '(keydown)': 'emitEditorEvent(\"keydown\", $event)',\n '(keyup)': 'emitEditorEvent(\"keyup\", $event)',\n '(input)': 'emitEditorEvent(\"input\", $event)',\n '(change)': 'emitEditorEvent(\"change\", $event)',\n '(focusin)': 'emitEditorEvent(\"focusin\", $event)',\n '(focusout)': 'emitEditorEvent(\"focusout\", $event)',\n '[class.nxe-disabled]': 'disabled()',\n '[class.nxe-readonly]': 'readOnly()',\n // dx emits `nxe-state-readonly` on a read-only editor, and legacy stylesheets lean on it\n // for more than a cursor: the grid's editable-cell tint is keyed off its ABSENCE\n // (`td:has(nxe-select-box):not(:has(.dx-state-readonly))`), so a missing class silently\n // paints every read-only cell as editable. One binding here covers all eight editors.\n '[class.nxe-state-readonly]': 'readOnly()',\n },\n})\nexport abstract class NxeFormControlBase<T> implements ControlValueAccessor, NxeValidationTarget {\n protected readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n /**\n * The app is zone-based (`provideZoneChangeDetection()`); writing back to Angular forms\n * from a signal context must run inside the zone or reactive forms lag a tick.\n */\n protected readonly ngZone = inject(NgZone);\n /** Application-wide defaults; each editor resolves `binding ?? this ?? literal`. */\n protected readonly nxeDefaults = inject(NXE_DEFAULT_OPTIONS);\n /** The library's runtime-switchable messages; read them in a template or a computed. */\n protected readonly nxeMessages = inject(NxeMessageService);\n\n /**\n * The current value — single source of truth. Two-way bindable as `[(value)]` (DevExtreme\n * parity) and also driven by `writeValue` for `ngModel`/`formControlName`.\n */\n readonly value = model<T | null>(null);\n\n /** Disabled via the `[disabled]` input (DevExtreme parity); OR-combined with forms disabled. */\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\n private readonly disabledByForm = signal(false);\n /** Effective disabled state (input OR reactive-forms `setDisabledState`). */\n readonly disabled = computed(() => this.disabledInput() || this.disabledByForm());\n\n /** Read-only state (DevExtreme `[readOnly]`). */\n readonly readOnlyInput = input(false, { alias: 'readOnly', transform: booleanAttribute });\n /**\n * Lower-case spelling of {@link readOnlyInput}: it is the name Signal Forms (`[formField]`)\n * binds a `readonly()` rule to, and the HTML attribute name.\n */\n readonly readonlyInput = input(false, { alias: 'readonly', transform: booleanAttribute });\n /** Effective read-only state: `readOnly` OR `readonly`. */\n readonly readOnly = computed(() => this.readOnlyInput() || this.readonlyInput());\n\n /**\n * Signal Forms hides a field with `hidden()` and binds it by this name; also usable on its own.\n * Hides the host, like `visible=false`.\n */\n readonly hiddenInput = input(false, { alias: 'hidden', transform: booleanAttribute });\n\n /**\n * Signal Forms state, bound by name when the editor carries `[formField]` (and settable by hand).\n * `invalid` and `errors` put the editor in its invalid state (`nxe-invalid`, `aria-invalid`) once\n * it is {@link touched}; the message text is `nxe-form-field`'s job.\n */\n readonly invalidInput = input(false, { alias: 'invalid', transform: booleanAttribute });\n readonly errorsInput = input<readonly { readonly kind: string; readonly message?: string }[] | null | undefined>(\n undefined,\n { alias: 'errors' },\n );\n protected readonly touchedInput = input(false, { alias: 'touched', transform: booleanAttribute });\n\n /** Validation group this editor belongs to (its nested `nxe-validator` registers here). */\n readonly validationGroupInput = input<string | undefined>(undefined, { alias: 'validationGroup' });\n\n /**\n * `id` for the INNER control, not the host.\n *\n * A caption written as `<label for=\"x\">` has to reach the focusable element, and the host of\n * a custom element is not it. Without this an editor cannot be labelled at all, which is why\n * `aria-label` sits beside it: one of the two has to be available.\n */\n readonly inputId = input<string | undefined>(undefined);\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n readonly ariaLabelledBy = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n /** Stable per instance, so the inner control always has an id something can point at. */\n private readonly fallbackId = `nxe-editor-${nextEditorId()}`;\n\n readonly controlId = computed(() => this.inputId() ?? this.fallbackId);\n\n /**\n * Ids for a popup listbox and its options.\n *\n * `aria-activedescendant` is how a combobox says which option is current while focus stays in\n * the text field, and it can only point at an id — so the options need stable ones.\n */\n panelId(): string {\n return `${this.controlId()}-panel`;\n }\n\n optionId(index: number): string {\n return `${this.controlId()}-option-${index}`;\n }\n\n /**\n * Whether a nested validator carries a `required` rule.\n *\n * Set by the validator rather than declared on the editor: the rule is where the requirement\n * is actually stated, and duplicating it as an input would let the two disagree.\n */\n private readonly requiredByRule = signal(false);\n /**\n * A `required` input, which is what Signal Forms binds a `required()` rule to, so a form that\n * is not driven by `nxe-validator` can state it too.\n */\n readonly requiredInput = input(false, { alias: 'required', transform: booleanAttribute });\n /** Whether the editor is required: the `required` input OR a nested validator's `required` rule. */\n readonly required = computed(() => this.requiredInput() || this.requiredByRule());\n\n setRequired(value: boolean): void {\n this.requiredByRule.set(value);\n }\n\n /** The current validation error message (set by a nested `nxe-validator`), or null. */\n readonly validationError = signal<string | null>(null);\n\n private readonly touchedByUser = signal(false);\n /** Whether the control has been blurred at least once, or a form says the field was touched. */\n readonly touched = computed(() => this.touchedByUser() || this.touchedInput());\n\n /**\n * Whether the editor shows its invalid look: a nested validator's message, or a form's\n * `invalid`/`errors` once the field is touched (so an untouched, empty required field is not red).\n */\n readonly invalidState = computed(\n () => !!this.validationError() || ((this.invalidInput() || !!this.errorsInput()?.length) && this.touched()),\n );\n /** Whether the value has been changed by the user at least once. */\n readonly dirty = signal(false);\n\n /** DevExtreme-compatible value-change event. */\n readonly onValueChanged = output<NxeValueChangedEvent<T>>();\n\n /**\n * dx's keyboard, focus and input events.\n *\n * Native events already reach the host, so these are not about capability — they are about\n * the call site. A migrated `(onEnterKey)` handler should keep working without being\n * rewritten as a `(keydown)` with a key check, and `onEnterKey` in particular has no native\n * equivalent at all.\n */\n readonly onKeyDown = output<NxeEditorEvent>();\n readonly onKeyUp = output<NxeEditorEvent>();\n readonly onEnterKey = output<NxeEditorEvent>();\n readonly onInput = output<NxeEditorEvent>();\n readonly onChange = output<NxeEditorEvent>();\n readonly onFocusIn = output<NxeEditorEvent>();\n readonly onFocusOut = output<NxeEditorEvent>();\n\n /**\n * When a typed value is committed: dx's `'change'` (on blur), `'input'` (per keystroke) or\n * `'keyup'`.\n *\n * Honoured by the text editors. The number and date boxes stay on `'change'` whatever this\n * says, because their displayed text is derived from the parsed value: committing mid-entry\n * would rewrite the field while the user is still typing into it.\n */\n readonly valueChangeEvent = input<'change' | 'input' | 'keyup'>('change');\n\n /** dx universal widget options. */\n readonly hint = input<string | undefined>(undefined);\n readonly width = input<number | string | undefined>(undefined);\n readonly visible = input(true, { transform: booleanAttribute });\n readonly tabIndex = input<number | undefined>(undefined);\n readonly elementAttr = input<Record<string, string> | undefined>(undefined);\n\n protected readonly widthStyle = computed(() => cssSize(this.width()));\n protected readonly elementAttrClass = computed(() => this.elementAttr()?.['class'] ?? null);\n protected readonly elementAttrId = computed(() => this.elementAttr()?.['id'] ?? null);\n\n private _onChange: (value: T | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Host element (the DevExtreme event payload `element`). */\n get element(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n // --- NxeValidationTarget (consumed by a nested nxe-validator) ---\n\n getValue(): unknown {\n return this.value();\n }\n\n validationGroup(): string | undefined {\n return this.validationGroupInput();\n }\n\n setValidationError(message: string | null): void {\n this.validationError.set(message);\n }\n\n // --- ControlValueAccessor: forms -> component (no event emission) ---\n\n writeValue(value: T | null): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledByForm.set(isDisabled);\n }\n\n // --- component -> forms (user interaction) ---\n\n /**\n * Commit a user-initiated value change: update the value, notify Angular forms (inside\n * `NgZone.run` so reactive forms detect it in this zone-based app), and emit the\n * DevExtreme-shaped `onValueChanged`. No-op when the value is unchanged.\n */\n protected commitValue(next: T | null, event: Event | null = null): void {\n const previousValue = this.value();\n if (Object.is(previousValue, next)) {\n return;\n }\n this.value.set(next);\n this.dirty.set(true);\n this.ngZone.run(() => this._onChange(next));\n this.onValueChanged.emit({\n value: next,\n previousValue,\n event,\n component: this,\n element: this.element,\n });\n }\n\n /**\n * Commit whatever the user has typed but not yet committed, now and synchronously.\n *\n * With the default `valueChangeEvent` a typed value commits on blur, so a programmatic submit\n * (or anything else that reads the model while the field still has focus) would see the old\n * value. Call this first. It is a no-op when nothing is pending, so it never emits\n * `onValueChanged` twice for one change, and it does not blur the field or mark it touched.\n */\n commit(): void {\n this.commitPending(null);\n }\n\n /** Alias of {@link commit}. */\n flush(): void {\n this.commit();\n }\n\n /**\n * Editors with text that can be typed but not yet committed override this to commit it through\n * {@link commitValue}. The default is for editors that commit on every interaction.\n */\n protected commitPending(_event: Event | null): void {}\n\n /** Whether Enter in this editor commits the pending text. Multi-line editors narrow it. */\n protected commitsOnEnter(_event: KeyboardEvent): boolean {\n return true;\n }\n\n /**\n * Re-emit a native event in dx's shape.\n *\n * `onEnterKey` is the one that earns its keep: it has no native equivalent, so every call\n * site would otherwise carry its own key check.\n */\n protected emitEditorEvent(kind: NxeEditorEventKind, event: Event): void {\n const payload: NxeEditorEvent = { event, component: this, element: this.element };\n switch (kind) {\n case 'keydown':\n // Enter is the key that submits an enclosing <form>, and the browser does that as the\n // default action of this very event. Committing here, before the handlers below and\n // before the default action runs, is what lets `(ngSubmit)` read the typed value.\n if (\n (event as KeyboardEvent).key === 'Enter' &&\n !(event as KeyboardEvent).isComposing &&\n this.commitsOnEnter(event as KeyboardEvent)\n ) {\n this.commitPending(event);\n }\n this.onKeyDown.emit(payload);\n if ((event as KeyboardEvent).key === 'Enter') {\n this.onEnterKey.emit(payload);\n }\n break;\n case 'keyup':\n this.onKeyUp.emit(payload);\n break;\n case 'input':\n this.onInput.emit(payload);\n break;\n case 'change':\n this.onChange.emit(payload);\n break;\n case 'focusin':\n this.onFocusIn.emit(payload);\n break;\n case 'focusout':\n this.onFocusOut.emit(payload);\n break;\n }\n }\n\n /**\n * Commit `next` if `valueChangeEvent` says this is the moment.\n *\n * Blur always commits, whatever the mode: a value the user typed and then left must not be\n * discarded because the configured event never fired.\n */\n protected commitOn(kind: 'input' | 'keyup' | 'change', next: T | null, event: Event): void {\n if (kind === 'change' || this.valueChangeEvent() === kind) {\n this.commitValue(next, event);\n }\n }\n\n /** Mark the control as touched (e.g. on blur), notifying Angular forms exactly once. */\n protected markAsTouched(): void {\n if (this.touchedByUser()) {\n return;\n }\n this.touchedByUser.set(true);\n this.ngZone.run(() => this._onTouched());\n }\n}\n","import { Directive } from '@angular/core';\r\nimport { NxeConfigOption } from '../tokens/nxe-config-option.token';\r\n\r\n/**\r\n * Base for no-template nested-option components (see {@link NxeConfigOption}).\r\n *\r\n * Concrete options extend this, declare their inputs as signals, implement {@link nxeConfig}\r\n * (typically returning a `computed()` of those inputs), and register the {@link NXE_OPTION}\r\n * token so the parent can collect them:\r\n * ```ts\r\n * @Component({\r\n * selector: 'nxe-selection',\r\n * template: '',\r\n * providers: [{ provide: NXE_OPTION, useExisting: forwardRef(() => NxeSelectionComponent), multi: true }],\r\n * })\r\n * export class NxeSelectionComponent extends NxeConfigOptionBase<SelectionConfig> {\r\n * readonly nxeRole = 'selection';\r\n * readonly mode = input<'single' | 'multiple'>('single');\r\n * nxeConfig() { return { mode: this.mode() }; }\r\n * }\r\n * ```\r\n */\r\n@Directive()\r\nexport abstract class NxeConfigOptionBase<TConfig> implements NxeConfigOption<TConfig> {\r\n abstract readonly nxeRole: string;\r\n abstract nxeConfig(): TConfig;\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Contract implemented by every flat `nxe-` nested-option component\r\n * (`nxe-column`, `nxe-selection`, `nxe-paging`, `nxe-summary`, `nxe-validation-rule`, ...).\r\n *\r\n * Nested options carry no template; they exist purely to declare configuration. Each one\r\n * exposes its current config as a signal-readable function and a `role` discriminator, so a\r\n * parent (`nxe-data-grid`, `nxe-select-box`, ...) can collect them via `contentChildren` and\r\n * derive a reactive config model — the mechanism that lets\r\n * `<nxe-data-grid><nxe-column/></nxe-data-grid>` mirror `<dx-data-grid><dxi-column/>`.\r\n */\r\nexport interface NxeConfigOption<TConfig = unknown> {\r\n /** Discriminator identifying the option kind, e.g. `'column'`, `'selection'`, `'paging'`. */\r\n readonly nxeRole: string;\r\n /** Returns the option's current configuration (reads signals; recomputes reactively). */\r\n nxeConfig(): TConfig;\r\n}\r\n\r\n/**\r\n * DI token every nested-option component provides (`multi: true`) so parents can query all\r\n * options with `contentChildren(NXE_OPTION)` without importing the concrete option classes.\r\n */\r\nexport const NXE_OPTION = new InjectionToken<NxeConfigOption>('NXE_OPTION');\r\n","import { computed, Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * `nxeTemplate` — drop-in replacement for DevExtreme's `*dxTemplate`.\r\n *\r\n * Captures a named `ng-template` so a parent container (select-box item template, grid\r\n * cell/header/edit templates, list item template, ...) can look it up by name and render it\r\n * with a context object. BOTH authoring forms resolve to the same {@link name}:\r\n *\r\n * - attribute form: `<ng-template nxeTemplate=\"cellContent\" let-data>` (psak-web style)\r\n * - dx microsyntax: `<div *nxeTemplate=\"let data of 'cellContent'\">` — desugars the name into\r\n * an `nxeTemplateOf` binding (orbit's mechanically-migrated `*dxTemplate` templates)\r\n *\r\n * Parents collect these via `contentChildren(NxeTemplateDirective)` and match on {@link name},\r\n * rendering with `ngTemplateOutlet` + an `ngTemplateOutletContext` of `{ $implicit: data, ... }`.\r\n */\r\n@Directive({\r\n selector: '[nxeTemplate]',\r\n})\r\nexport class NxeTemplateDirective {\r\n /** Attribute-form name (`nxeTemplate=\"name\"`); empty in microsyntax usage. */\r\n readonly attrName = input<string>('', { alias: 'nxeTemplate' });\r\n /** Microsyntax-form name (`*nxeTemplate=\"let x of 'name'\"` binds `nxeTemplateOf`). */\r\n readonly ofName = input<string | undefined>(undefined, { alias: 'nxeTemplateOf' });\r\n\r\n /** The template's lookup name, whichever form supplied it. */\r\n readonly name = computed(() => this.ofName() ?? this.attrName());\r\n\r\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","/**\r\n * Wrap a value in an array if it is not already one (null/undefined -> empty array).\r\n *\r\n * Mirrors `@angular/cdk/coercion`'s `coerceArray` so nxe components don't import CDK coercion\r\n * directly. (For boolean/number coercion use `booleanAttribute` / `numberAttribute` from\r\n * `@angular/core` directly on `input(...)`.)\r\n */\r\nexport function coerceArray<T>(value: T | readonly T[] | null | undefined): T[] {\r\n if (value == null) {\r\n return [];\r\n }\r\n return Array.isArray(value) ? [...value] : [value as T];\r\n}\r\n","import { booleanAttribute } from '@angular/core';\r\n\r\n/**\r\n * `booleanAttribute` that preserves \"unset\".\r\n *\r\n * An input resolved as `binding ?? token ?? literal` needs three states, but\r\n * `booleanAttribute` has two: it maps `undefined` to `false`, which makes \"nobody bound this\"\r\n * indistinguishable from \"someone bound false\" and silently removes the token rung.\r\n *\r\n * This keeps the attribute-form coercion (`showClearButton=\"false\"` is `false`, not the truthy\r\n * string) and passes `undefined` straight through.\r\n */\r\nexport function nxeOptionalBoolean(value: unknown): boolean | undefined {\r\n return value === undefined || value === null ? undefined : booleanAttribute(value);\r\n}\r\n","/**\r\n * DevExtreme's `displayExpr` / `valueExpr` / `searchExpr` accessor.\r\n *\r\n * dx accepts four spellings and the library accepted one — a flat property name — so a dotted\r\n * path silently read `item['user.name']` and returned undefined. Silent, because an accessor\r\n * that misses looks exactly like a field that is empty.\r\n *\r\n * undefined / '' the item itself (dx: no expression)\r\n * 'this' the item itself (dx's documented sentinel)\r\n * 'user.name' a dotted path\r\n * (item) => ... a function accessor\r\n */\r\nexport type NxeExpr<T = unknown> = string | ((item: T) => unknown) | undefined | null;\r\n\r\n/** Resolve `expr` against `item`. */\r\nexport function nxeResolveExpr<T = unknown>(expr: NxeExpr<T>, item: T): unknown {\r\n if (typeof expr === 'function') {\r\n return expr(item);\r\n }\r\n if (!expr || expr === 'this') {\r\n return item;\r\n }\r\n if (item == null || typeof item !== 'object') {\r\n return undefined;\r\n }\r\n if (!expr.includes('.')) {\r\n return (item as Record<string, unknown>)[expr];\r\n }\r\n return expr\r\n .split('.')\r\n .reduce<unknown>(\r\n (acc, key) => (acc == null || typeof acc !== 'object' ? undefined : (acc as Record<string, unknown>)[key]),\r\n item,\r\n );\r\n}\r\n\r\n/** Resolve `expr` and render it as display text: `null`/`undefined` become the empty string. */\r\nexport function nxeResolveText<T = unknown>(expr: NxeExpr<T>, item: T): string {\r\n const resolved = nxeResolveExpr(expr, item);\r\n return resolved == null ? '' : String(resolved);\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/** A single failed validation rule. */\r\nexport interface NxeBrokenRule {\r\n type: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Result of validating a control or a validation group — shaped to match\r\n * DevExtreme's `ValidationGroup.validate()` / `dxValidator.validate()` return value so existing\r\n * handlers (`const r = event.validationGroup.validate(); if (r.isValid) {...}`) work unchanged.\r\n */\r\nexport interface NxeValidationResult {\r\n isValid: boolean;\r\n brokenRules: NxeBrokenRule[];\r\n status: 'valid' | 'invalid' | 'pending';\r\n}\r\n\r\n/**\r\n * Contract an editor exposes (via {@link NXE_VALIDATION_TARGET}) to the `nxe-validator` nested\r\n * inside it: read the current value, the editor's validation group, and push the invalid\r\n * message back so the editor can render it.\r\n */\r\nexport interface NxeValidationTarget {\r\n getValue(): unknown;\r\n validationGroup(): string | undefined;\r\n setValidationError(message: string | null): void;\r\n /**\r\n * Tell the editor whether a `required` rule applies, so it can render `aria-required`.\r\n * Optional: a target predating this simply does not advertise the requirement.\r\n */\r\n setRequired?(required: boolean): void;\r\n}\r\n\r\n/** DI token the editor provides so its nested `nxe-validator` can adapt it. */\r\nexport const NXE_VALIDATION_TARGET = new InjectionToken<NxeValidationTarget>(\r\n 'NXE_VALIDATION_TARGET',\r\n);\r\n\r\n/** A member registered in a validation group (an `nxe-validator`). */\r\nexport interface NxeValidationGroupMember {\r\n validate(): NxeValidationResult;\r\n /** Clear the member's error state without validating. Optional for older members. */\r\n reset?(): void;\r\n}\r\n\r\n/**\r\n * An `nxe-validation-group` ancestor, exposed so a validator or a button inside it can join it\r\n * without naming a group.\r\n *\r\n * DevExtreme lets a group be addressed two ways: by a string name shared between a validator and\r\n * a button, or structurally by wrapping both in a `dxValidationGroup`. The string form is what\r\n * the consuming applications use; this token is the structural one, and an explicit string\r\n * always wins over it, as in dx.\r\n */\r\nexport interface NxeValidationGroupScope {\r\n /** Opaque, unique per instance — never collides with an application's own group names. */\r\n readonly groupKey: string;\r\n}\r\n\r\nexport const NXE_VALIDATION_GROUP = new InjectionToken<NxeValidationGroupScope>(\r\n 'NXE_VALIDATION_GROUP',\r\n);\r\n\r\n/** DevExtreme-shaped `onValidated` payload. */\r\nexport interface NxeValidatedEvent extends NxeValidationResult {\r\n value: unknown;\r\n validationGroup: string;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NxeBrokenRule, NxeValidationGroupMember, NxeValidationResult } from './nxe-validation.types';\r\n\r\n/**\r\n * Root registry mapping a `validationGroup` string to the `nxe-validator`s in it, mirroring\r\n * DevExtreme's global ValidationEngine.\r\n *\r\n * `nxe-button[validationGroup]` (and any caller) triggers {@link validate} for a group, which\r\n * runs every member validator and aggregates the result into the DevExtreme-shaped\r\n * {@link NxeValidationResult}.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NxeValidationGroupRegistry {\r\n private readonly groups = new Map<string, Set<NxeValidationGroupMember>>();\r\n\r\n register(group: string, member: NxeValidationGroupMember): void {\r\n let set = this.groups.get(group);\r\n if (!set) {\r\n set = new Set();\r\n this.groups.set(group, set);\r\n }\r\n set.add(member);\r\n }\r\n\r\n unregister(group: string, member: NxeValidationGroupMember): void {\r\n const set = this.groups.get(group);\r\n if (!set) {\r\n return;\r\n }\r\n set.delete(member);\r\n if (set.size === 0) {\r\n this.groups.delete(group);\r\n }\r\n }\r\n\r\n /**\r\n * Clear every member's error state without validating.\r\n *\r\n * dx's `ValidationGroup.reset()`. The distinction from `validate()` matters after a Cancel:\r\n * the fields should stop showing errors, not be re-checked and light up again.\r\n */\r\n reset(group: string): void {\r\n for (const member of this.groups.get(group) ?? []) {\r\n member.reset?.();\r\n }\r\n }\r\n\r\n /** Validate every member of the group; valid (and empty) groups return `isValid: true`. */\r\n validate(group: string): NxeValidationResult {\r\n const set = this.groups.get(group);\r\n const brokenRules: NxeBrokenRule[] = [];\r\n if (set) {\r\n for (const member of set) {\r\n const result = member.validate();\r\n if (!result.isValid) {\r\n brokenRules.push(...result.brokenRules);\r\n }\r\n }\r\n }\r\n return {\r\n isValid: brokenRules.length === 0,\r\n brokenRules,\r\n status: brokenRules.length === 0 ? 'valid' : 'invalid',\r\n };\r\n }\r\n}\r\n","import type { NxeMessageService } from './nxe-message.service';\r\n\r\n/**\r\n * A byte count as the library writes it in the active language: \"512 b\", \"1.5 Kb\", \"2.0 Mb\" in English,\r\n * \"512 B\", \"1,5 KB\" in Indonesian (the `uploader.size*` messages). Used by the file input and by the\r\n * file-size message of `nxe-form-field`.\r\n */\r\nexport function nxeFormatFileSize(bytes: number, messages: NxeMessageService): string {\r\n if (bytes < 1024) {\r\n return messages.t('uploader.sizeB', bytes);\r\n }\r\n if (bytes < 1024 * 1024) {\r\n return messages.t('uploader.sizeKb', (bytes / 1024).toFixed(1));\r\n }\r\n return messages.t('uploader.sizeMb', (bytes / 1024 / 1024).toFixed(1));\r\n}\r\n","// @nexterajs/ui — core abstractions shared by every component.\r\n\r\nexport * from './types/nxe-events';\r\nexport * from './base/nxe-form-control.base';\r\nexport * from './base/nxe-config-option.base';\r\nexport * from './tokens/nxe-config-option.token';\r\nexport * from './tokens/nxe-default-options.token';\r\nexport * from './directives/nxe-template.directive';\r\nexport * from './coercion/coerce-array';\r\nexport * from './coercion/optional-boolean';\r\nexport * from './coercion/nxe-expr';\r\nexport * from './validation/nxe-validation.types';\r\nexport * from './validation/nxe-validation-group-registry.service';\r\nexport * from './i18n/nxe-messages.en';\r\nexport * from './i18n/nxe-messages.id';\r\nexport * from './i18n/nxe-message.service';\r\nexport * from './i18n/nxe-format-file-size';\r\n","// @nexterajs/ui/core — public API.\r\nexport * from './lib/core/index';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|