@mosaicoo/form-angular 0.5.0 → 0.7.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 +28 -0
- package/fesm2022/mosaicoo-form-angular-designer.mjs +836 -102
- package/fesm2022/mosaicoo-form-angular-designer.mjs.map +1 -1
- package/fesm2022/mosaicoo-form-angular-material.mjs +2 -0
- package/fesm2022/mosaicoo-form-angular-material.mjs.map +1 -1
- package/fesm2022/mosaicoo-form-angular.mjs +384 -91
- package/fesm2022/mosaicoo-form-angular.mjs.map +1 -1
- package/package.json +2 -2
- package/types/mosaicoo-form-angular-designer.d.ts +104 -3
- package/types/mosaicoo-form-angular.d.ts +37 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mosaicoo-form-angular.mjs","sources":["../../../packages/angular/src/lib/providers.ts","../../../packages/angular/src/lib/form-node.component.ts","../../../packages/angular/src/lib/form-renderer.component.ts","../../../packages/angular/src/public-api.ts","../../../packages/angular/src/mosaicoo-form-angular.ts"],"sourcesContent":["import {\n InjectionToken,\n makeEnvironmentProviders,\n type EnvironmentProviders,\n type Provider,\n type Type,\n} from '@angular/core';\nimport type { FormEngine, InputField, RemoteOptionsFetcher } from '@mosaicoo/form-core';\n\n/**\n * Extension surface of the renderer.\n *\n * Hosts extend or replace field rendering by registering components per field\n * `type` — new types (signature, rating, references…) plug in, and built-in\n * types can be overridden (e.g. a design-system adapter swapping the native\n * select for its own). The registry is DI-scoped: different areas of an app\n * can provide different catalogs.\n */\n\n/**\n * Contract of a registered field component. Implementations receive these\n * values as signal inputs with the SAME names (`field`, `engine`, `path`,\n * `tick`) and interact with the form exclusively through the engine —\n * `engine.getValue(path)` / `engine.setValue(path, value)` /\n * `engine.markTouched(path)` — so validation, conditionals and events keep\n * working with no extra wiring.\n */\nexport interface MformFieldComponent {\n field: () => InputField;\n engine: () => FormEngine;\n path: () => string;\n /** Bumped on every engine event; read it to stay in sync. */\n tick: () => number;\n /** Rendering mode of the surrounding form (optional input). */\n mode?: () => 'edit' | 'readonly' | 'disabled';\n}\n\n/** Map of field `type` → component implementing {@link MformFieldComponent}. */\nexport type FieldComponentMap = Record<string, Type<unknown>>;\n\n/** Multi-provider token: maps merge, later providers win on conflicts. */\nexport const MFORM_FIELD_COMPONENTS = new InjectionToken<FieldComponentMap[]>(\n 'MFORM_FIELD_COMPONENTS',\n);\n\n/**\n * Transport used for `optionsSource: { type: 'remote' }` fields. Register it\n * to route those requests through the host's HTTP stack (authentication,\n * base URLs, caching). Without it, a plain `fetch` is used.\n */\nexport const MFORM_REMOTE_FETCHER = new InjectionToken<RemoteOptionsFetcher>(\n 'MFORM_REMOTE_FETCHER',\n);\n\n/** Reference the host returns after uploading one file. */\nexport interface UploadedFileRef {\n name: string;\n id?: string;\n url?: string;\n size?: number;\n [extra: string]: unknown;\n}\n\n/**\n * Host-owned file upload: receives each selected file, delivers it wherever\n * the host decides (API, bucket, queue) and returns the reference stored in\n * the form data. Without it, `file` fields keep only file names.\n */\nexport type FileUploadFn = (\n file: File,\n context: { field: InputField; path: string },\n) => Promise<UploadedFileRef>;\n\nexport const MFORM_UPLOAD = new InjectionToken<FileUploadFn>('MFORM_UPLOAD');\n\nexport interface MosaicooFormConfig {\n /** Custom/override field components, keyed by field `type`. */\n components?: FieldComponentMap;\n /** Host transport for remote options sources. */\n remoteFetcher?: RemoteOptionsFetcher;\n /** Host-owned file upload for `file` fields. */\n uploadFiles?: FileUploadFn;\n}\n\n/**\n * Registers renderer extensions at any injector level:\n *\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * provideMosaicooForm({\n * components: { signature: SignatureFieldComponent },\n * remoteFetcher: (url) => authenticatedGet(url),\n * }),\n * ],\n * });\n * ```\n */\nexport function provideMosaicooForm(config: MosaicooFormConfig): EnvironmentProviders {\n const providers: Provider[] = [];\n if (config.components) {\n providers.push({ provide: MFORM_FIELD_COMPONENTS, useValue: config.components, multi: true });\n }\n if (config.remoteFetcher) {\n providers.push({ provide: MFORM_REMOTE_FETCHER, useValue: config.remoteFetcher });\n }\n if (config.uploadFiles) {\n providers.push({ provide: MFORM_UPLOAD, useValue: config.uploadFiles });\n }\n return makeEnvironmentProviders(providers);\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n reflectComponentType,\n signal,\n untracked,\n type Type,\n} from '@angular/core';\nimport { maskValue } from '@mosaicoo/form-core';\nimport type {\n ContainerField,\n FieldNode,\n FieldOption,\n FormEngine,\n InputField,\n OptionsProviderRegistry,\n StaticField,\n} from '@mosaicoo/form-core';\nimport { MFORM_FIELD_COMPONENTS, MFORM_REMOTE_FETCHER, MFORM_UPLOAD } from './providers.js';\n\n/** Rendering mode: `readonly` hides actions, `disabled` grays everything. */\nexport type FormMode = 'edit' | 'readonly' | 'disabled';\n\n/**\n * Renders one schema node (input, container or static) and recurses into\n * children. State lives in the headless engine — this component only projects\n * it and forwards user interaction. `tick` changes whenever the engine emits,\n * invalidating the OnPush view.\n */\n@Component({\n selector: 'mform-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mform-node' },\n imports: [NgComponentOutlet],\n template: `\n @let n = node();\n @if (visible()) {\n @switch (n.kind) {\n @case ('static') {\n @if (n.type === 'button') {\n @if (interactive()) {\n <button\n class=\"mform-btn\"\n [type]=\"buttonAction() === 'submit' ? 'submit' : 'button'\"\n >\n {{ n.label || 'Submit' }}\n </button>\n }\n } @else if (n.type === 'content') {\n <div class=\"mform-content\" [innerHTML]=\"content()\"></div>\n } @else {\n <div class=\"mform-unsupported\" role=\"note\">\n {{ n.label || n.key }} — unsupported content\n </div>\n }\n }\n @case ('container') {\n @switch (containerLayout()) {\n @case ('columns') {\n <div class=\"mform-columns\" [style.grid-template-columns]=\"columnsTemplate()\">\n @for (column of columns(); track $index) {\n <div class=\"mform-column\">\n @for (child of column; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" />\n }\n </div>\n }\n </div>\n }\n @case ('tabs') {\n <div class=\"mform-tabs\">\n <div class=\"mform-tabbar\" role=\"tablist\">\n @for (tab of container().children; track tab.key; let i = $index) {\n <button\n type=\"button\"\n class=\"mform-tab\"\n role=\"tab\"\n [class.is-active]=\"activeTab() === i\"\n [attr.aria-selected]=\"activeTab() === i\"\n (click)=\"activeTab.set(i)\"\n >\n {{ tab.label || 'Tab ' + (i + 1) }}\n </button>\n }\n </div>\n @for (tab of container().children; track tab.key; let i = $index) {\n @if (activeTab() === i) {\n <div class=\"mform-tabpanel\" role=\"tabpanel\">\n <mform-node [node]=\"tab\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" [bare]=\"true\" />\n </div>\n }\n }\n </div>\n }\n @case ('array') {\n <section class=\"mform-panel mform-grid\">\n @if (container().label) {\n <header class=\"mform-panel-head\">{{ container().label }}</header>\n }\n <div class=\"mform-panel-body\">\n @for (row of rows(); track $index; let i = $index) {\n <div class=\"mform-grid-row\" role=\"group\" [attr.aria-label]=\"(container().label || container().key) + ' ' + (i + 1)\">\n <div class=\"mform-grid-fields\">\n @for (child of container().children; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"rowScope(i)\" />\n }\n </div>\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"mform-row-remove\"\n (click)=\"removeRow(i)\"\n [attr.aria-label]=\"'Remove row ' + (i + 1)\"\n >\n ✕\n </button>\n }\n </div>\n }\n @if (interactive()) {\n <button type=\"button\" class=\"mform-row-add\" (click)=\"addRow()\">+ Add</button>\n }\n </div>\n </section>\n }\n @default {\n @if (container().label && !bare()) {\n <section class=\"mform-panel\">\n <header class=\"mform-panel-head\">{{ container().label }}</header>\n <div class=\"mform-panel-body\">\n @for (child of container().children; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" />\n }\n </div>\n </section>\n } @else {\n <div class=\"mform-group\">\n @for (child of container().children; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" />\n }\n </div>\n }\n }\n }\n }\n @case ('input') {\n @if (customComponent(); as custom) {\n <ng-container\n [ngComponentOutlet]=\"custom\"\n [ngComponentOutletInputs]=\"customInputs()\"\n />\n } @else if (field().type !== 'hidden') {\n <div class=\"mform-field\" [class.has-error]=\"errors().length > 0\" [class.is-pending]=\"pending()\">\n @if (field().type !== 'checkbox') {\n <label class=\"mform-label\" [attr.for]=\"controlId()\">\n {{ field().label || field().key }}\n @if (required()) {\n <span class=\"mform-req\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n @switch (field().type) {\n @case ('textarea') {\n <textarea\n class=\"mform-control\"\n [id]=\"controlId()\"\n [value]=\"stringValue()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.rows]=\"rowsProp()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"setString($event)\"\n (blur)=\"touch()\"\n ></textarea>\n }\n @case ('select') {\n <select\n class=\"mform-control\"\n [id]=\"controlId()\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"setSelect($event)\"\n (blur)=\"touch()\"\n >\n <option value=\"\" [selected]=\"stringValue() === ''\"></option>\n @for (option of options(); track option.value) {\n <option\n [value]=\"option.value\"\n [selected]=\"stringValue() === '' + option.value\"\n >\n {{ option.label }}\n </option>\n }\n </select>\n }\n @case ('radio') {\n <div class=\"mform-choices\" role=\"radiogroup\" [attr.aria-label]=\"field().label || field().key\">\n @for (option of options(); track option.value) {\n <label class=\"mform-check\">\n <input\n type=\"radio\"\n [name]=\"controlId()\"\n [checked]=\"stringValue() === '' + option.value\"\n [disabled]=\"controlDisabled()\"\n (change)=\"setValue(option.value)\"\n (blur)=\"touch()\"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n </div>\n }\n @case ('checkbox') {\n <label class=\"mform-check\">\n <input\n type=\"checkbox\"\n [id]=\"controlId()\"\n [checked]=\"value() === true\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"setChecked($event)\"\n (blur)=\"touch()\"\n />\n <span>\n {{ field().label || field().key }}\n @if (required()) {\n <span class=\"mform-req\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @case ('checkbox-group') {\n <div class=\"mform-choices\" role=\"group\" [attr.aria-label]=\"field().label || field().key\">\n @for (option of options(); track option.value) {\n <label class=\"mform-check\">\n <input\n type=\"checkbox\"\n [checked]=\"mapValue()['' + option.value] === true\"\n [disabled]=\"controlDisabled()\"\n (change)=\"toggleMap('' + option.value, $event)\"\n (blur)=\"touch()\"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n </div>\n }\n @case ('tags') {\n <div class=\"mform-tags\">\n @for (tag of tagValues(); track $index; let i = $index) {\n <span class=\"mform-tag\">\n {{ tag }}\n <button\n type=\"button\"\n (click)=\"removeTag(i)\"\n [attr.aria-label]=\"'Remove ' + tag\"\n >✕</button>\n </span>\n }\n <input\n class=\"mform-control mform-tag-input\"\n type=\"text\"\n [id]=\"controlId()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (keydown.enter)=\"addTag($event)\"\n (blur)=\"touch()\"\n />\n </div>\n }\n @case ('file') {\n <input\n class=\"mform-control\"\n type=\"file\"\n multiple\n [id]=\"controlId()\"\n [disabled]=\"controlDisabled() || uploading()\"\n [attr.aria-busy]=\"uploading() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"setFiles($event)\"\n (blur)=\"touch()\"\n />\n @if (uploading()) {\n <div class=\"mform-desc\" role=\"status\">Uploading…</div>\n }\n @for (name of fileNames(); track $index) {\n <div class=\"mform-file-name\">📎 {{ name }}</div>\n }\n }\n @case ('reference') {\n <div class=\"mform-reference\">\n <input\n class=\"mform-control\"\n type=\"text\"\n role=\"combobox\"\n [id]=\"controlId()\"\n [value]=\"refDisplay()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-expanded]=\"refOpen()\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"refSearch($event)\"\n (blur)=\"refBlur()\"\n />\n @if (refOpen() && refOptions().length > 0) {\n <ul class=\"mform-ref-list\" role=\"listbox\">\n @for (option of refOptions(); track option.value) {\n <li role=\"option\">\n <button type=\"button\" (click)=\"refPick(option)\">{{ option.label }}</button>\n </li>\n }\n </ul>\n }\n </div>\n }\n @case ('unsupported') {\n <input\n class=\"mform-control\"\n type=\"text\"\n disabled\n [id]=\"controlId()\"\n [value]=\"'Unsupported field (' + (sourceType() || 'unknown') + ')'\"\n />\n }\n @default {\n <div class=\"mform-affix\" [class.has-affix]=\"prefix() || suffix()\">\n @if (prefix(); as p) {\n <span class=\"mform-prefix\" aria-hidden=\"true\">{{ p }}</span>\n }\n <input\n class=\"mform-control\"\n [type]=\"inputType()\"\n [id]=\"controlId()\"\n [value]=\"stringValue()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.step]=\"field().type === 'currency' ? '0.01' : null\"\n [attr.inputmode]=\"field().type === 'currency' ? 'decimal' : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"setString($event)\"\n (blur)=\"touch()\"\n />\n @if (suffix(); as s) {\n <span class=\"mform-suffix\" aria-hidden=\"true\">{{ s }}</span>\n }\n </div>\n }\n }\n @if (field().description) {\n <div class=\"mform-desc\" [id]=\"controlId() + '-desc'\">{{ field().description }}</div>\n }\n @for (error of errors(); track error.rule) {\n <div class=\"mform-error\" [id]=\"controlId() + '-err'\" role=\"alert\">{{ error.message }}</div>\n }\n </div>\n }\n }\n }\n }\n `,\n})\nexport class FormNodeComponent {\n readonly node = input.required<FieldNode>();\n readonly engine = input.required<FormEngine>();\n /** Monotonic counter bumped on every engine event — invalidates the view. */\n readonly tick = input.required<number>();\n /** Data-path prefix (set by array rows and nested groups above this node). */\n readonly scope = input<string>('');\n /** Suppresses the panel chrome (used when a tab already framed the child). */\n readonly bare = input<boolean>(false);\n /** Host-registered providers for `optionsSource: provider` fields. */\n readonly providers = input<OptionsProviderRegistry>({});\n /** Rendering mode inherited from the renderer. */\n readonly mode = input<FormMode>('edit');\n /** Renderer-supplied refresh hook for async completions (zoneless-safe). */\n readonly notify = input<() => void>(() => {});\n\n readonly activeTab = signal(0);\n\n /** DI-registered custom field components (maps merge; later wins). */\n private readonly componentMaps = inject(MFORM_FIELD_COMPONENTS, { optional: true });\n /** Host transport for remote options; plain fetch when absent. */\n private readonly remoteFetcher = inject(MFORM_REMOTE_FETCHER, { optional: true });\n /** Host-owned upload for `file` fields. */\n private readonly uploader = inject(MFORM_UPLOAD, { optional: true });\n /**\n * Async resolutions (debounce timers, provider promises) finish outside\n * any template event — explicitly schedule the refresh for zoneless apps.\n */\n private readonly changeDetector = inject(ChangeDetectorRef);\n\n readonly uploading = signal(false);\n\n /** Effective disabled state: mode, schema flag or calculated field. */\n controlDisabled(): boolean {\n return (\n this.mode() !== 'edit' ||\n this.field().disabled === true ||\n this.field().calculate !== undefined\n );\n }\n\n interactive(): boolean {\n return this.mode() === 'edit';\n }\n\n pending(): boolean {\n this.tick();\n return this.engine().isPending(this.path());\n }\n\n /** Custom component registered for this field type, if any. */\n customComponent(): Type<unknown> | null {\n const node = this.node();\n if (node.kind !== 'input' || !this.componentMaps) return null;\n for (let i = this.componentMaps.length - 1; i >= 0; i--) {\n const match = this.componentMaps[i]?.[node.type];\n if (match) return match;\n }\n return null;\n }\n\n /**\n * Inputs handed to a custom component (MformFieldComponent contract).\n * Only inputs the component actually declares are passed, so optional\n * contract members (`mode`) never break third-party components.\n */\n customInputs(): Record<string, unknown> {\n const component = this.customComponent();\n const declared = new Set(\n component ? (reflectComponentType(component)?.inputs ?? []).map((i) => i.propName) : [],\n );\n const all: Record<string, unknown> = {\n field: this.field(),\n engine: this.engine(),\n path: this.path(),\n tick: this.tick(),\n mode: this.mode(),\n };\n return Object.fromEntries(Object.entries(all).filter(([key]) => declared.has(key)));\n }\n\n /** Options resolved from a dynamic source (provider or remote URL). */\n private readonly resolvedOptions = signal<FieldOption[] | null>(null);\n /** Snapshot of the observed refresh source at the last resolution. */\n private lastRefreshKey: string | null = null;\n /** Discards resolutions that arrive after a newer request started. */\n private optionsRequestSeq = 0;\n\n constructor() {\n effect(() => {\n const node = this.node();\n const registry = this.providers();\n if (node.kind !== 'input' || !node.optionsSource) {\n this.resolvedOptions.set(null);\n return;\n }\n const source = node.optionsSource;\n // With refreshOn, engine events re-run this effect; the refresh key\n // then decides whether the observed data actually changed.\n if (source.refreshOn) this.tick();\n const engine = untracked(() => this.engine());\n const path = untracked(() => this.path());\n const refreshKey = !source.refreshOn\n ? 'static'\n : source.refreshOn === 'data'\n ? JSON.stringify(engine.getData())\n : JSON.stringify(engine.getValue(source.refreshOn) ?? null);\n if (refreshKey === this.lastRefreshKey) return;\n this.lastRefreshKey = refreshKey;\n // Stale-response guard: only the latest request may write options.\n const requestId = ++this.optionsRequestSeq;\n const apply = (options: FieldOption[]) => {\n if (requestId === this.optionsRequestSeq) this.resolvedOptions.set(options);\n };\n if (source.type === 'provider') {\n const provider = registry[source.name];\n if (!provider) return; // no provider: static options/fallback stand\n Promise.resolve(\n provider({ field: node, path, data: engine.getData(), args: source.args }),\n )\n .then((options) => { apply(options); this.changeDetector.markForCheck();\n this.notify()(); })\n .catch(() => {}); // provider failure keeps the static fallback\n } else {\n // The host's transport (auth, base URL, caching) when registered via\n // provideMosaicooForm; plain fetch as the zero-config default.\n const request = this.remoteFetcher\n ? this.remoteFetcher(source.url)\n : fetch(source.url).then((response) => (response.ok ? response.json() : []));\n request\n .then((list) =>\n apply(\n (Array.isArray(list) ? (list as Array<Record<string, unknown>>) : []).map((item) => ({\n label: String(item[source.labelKey ?? 'label'] ?? item[source.valueKey ?? 'value'] ?? ''),\n value: (item[source.valueKey ?? 'value'] ?? '') as FieldOption['value'],\n })),\n ),\n )\n .then(() => this.changeDetector.markForCheck())\n .catch(() => {});\n }\n });\n }\n\n /** Effective options: dynamically resolved first, static as fallback. */\n options(): FieldOption[] {\n return this.resolvedOptions() ?? this.field().options ?? [];\n }\n\n // -- typed views of the node ---------------------------------------------\n\n field(): InputField {\n return this.node() as InputField;\n }\n\n container(): ContainerField {\n return this.node() as ContainerField;\n }\n\n content(): string {\n return (this.node() as StaticField).content ?? '';\n }\n\n buttonAction(): string {\n return String(this.node().props?.['action'] ?? 'submit');\n }\n\n sourceType(): string {\n return String(this.node().props?.['sourceType'] ?? '');\n }\n\n rowsProp(): number | null {\n const rows = this.node().props?.['rows'];\n return typeof rows === 'number' ? rows : null;\n }\n\n // -- paths and visibility -------------------------------------------------\n\n /** Data path of this node (inputs) or of its scope (containers). */\n readonly path = computed(() => {\n const scope = this.scope();\n const node = this.node();\n if (node.kind === 'input') return scope ? `${scope}.${node.key}` : node.key;\n if (node.kind === 'container' && node.dataScope !== 'inherit') {\n return scope ? `${scope}.${node.key}` : node.key;\n }\n return scope;\n });\n\n /** Scope handed to children (nested/array containers extend it). */\n readonly childScope = computed(() => {\n const node = this.node();\n if (node.kind === 'container' && node.dataScope === 'nested') return this.path();\n return this.scope();\n });\n\n rowScope(index: number): string {\n return `${this.path()}.${index}`;\n }\n\n visible(): boolean {\n this.tick();\n const node = this.node();\n const key = node.kind === 'input' ? this.path() : node.key;\n return this.engine().isVisible(key);\n }\n\n containerLayout(): 'columns' | 'tabs' | 'array' | 'block' {\n const node = this.container();\n if (node.dataScope === 'array') return 'array';\n if (node.type === 'tabs') return 'tabs';\n if (node.type === 'columns' && node.columns?.length) return 'columns';\n return 'block';\n }\n\n columns(): FieldNode[][] {\n const node = this.container();\n return (node.columns ?? []).map((column) =>\n column.children\n .map((index) => node.children[index])\n .filter((child): child is FieldNode => child !== undefined),\n );\n }\n\n columnsTemplate(): string {\n const cols = this.container().columns ?? [];\n const total = cols.reduce((sum, c) => sum + c.width, 0) || 12;\n return cols.map((c) => `${((c.width / total) * 100).toFixed(3)}fr`).join(' ');\n }\n\n // -- values ---------------------------------------------------------------\n\n value(): unknown {\n this.tick();\n return this.engine().getValue(this.path());\n }\n\n stringValue(): string {\n const value = this.value();\n if (value === undefined || value === null) return '';\n const mask = this.field().format?.mask;\n if (mask && typeof value === 'string') return maskValue(value, mask).masked;\n return String(value);\n }\n\n mapValue(): Record<string, unknown> {\n const value = this.value();\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n }\n\n rows(): unknown[] {\n const value = this.value();\n return Array.isArray(value) ? value : [];\n }\n\n required(): boolean {\n return this.field().validators?.some((v) => v.type === 'required') ?? false;\n }\n\n errors() {\n this.tick();\n return this.engine().getFieldErrors(this.path());\n }\n\n controlId(): string {\n return `mform-${this.path().replace(/\\./g, '-')}`;\n }\n\n describedBy(): string | null {\n const parts: string[] = [];\n if (this.field().description) parts.push(`${this.controlId()}-desc`);\n if (this.errors().length > 0) parts.push(`${this.controlId()}-err`);\n return parts.length ? parts.join(' ') : null;\n }\n\n inputType(): string {\n switch (this.field().type) {\n case 'number':\n case 'currency':\n return 'number';\n case 'email':\n return 'email';\n case 'password':\n return 'password';\n case 'phone':\n return 'tel';\n case 'url':\n return 'url';\n case 'time':\n return 'time';\n case 'datetime':\n return 'datetime-local';\n case 'day':\n return 'date';\n default:\n return 'text';\n }\n }\n\n // -- interaction ----------------------------------------------------------\n\n setValue(value: unknown): void {\n this.engine().setValue(this.path(), value);\n }\n\n setString(event: Event): void {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n const raw = target.value;\n const mask = this.field().format?.mask;\n if (mask) {\n const { masked, raw: stripped } = maskValue(raw, mask);\n target.value = masked; // the control always shows the masked shape\n this.setValue(this.field().format?.keepMask ? masked : stripped);\n return;\n }\n if (this.field().dataType === 'number') {\n const parsed = raw === '' ? undefined : Number(raw);\n this.setValue(parsed !== undefined && Number.isFinite(parsed) ? parsed : undefined);\n } else {\n this.setValue(raw);\n }\n }\n\n setSelect(event: Event): void {\n this.setValue((event.target as HTMLSelectElement).value);\n }\n\n setChecked(event: Event): void {\n this.setValue((event.target as HTMLInputElement).checked);\n }\n\n toggleMap(option: string, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.setValue({ ...this.mapValue(), [option]: checked });\n }\n\n setFiles(event: Event): void {\n const files = (event.target as HTMLInputElement).files;\n const list = files ? Array.from(files) : [];\n if (!this.uploader || list.length === 0) {\n // no host uploader: only file names are stored\n this.setValue(list.map((f) => f.name));\n return;\n }\n const field = this.field();\n const path = this.path();\n this.uploading.set(true);\n Promise.all(list.map((file) => this.uploader!(file, { field, path })))\n .then((refs) => this.setValue(refs))\n .catch(() => {}) // host upload failure keeps the previous value\n .finally(() => { this.uploading.set(false); this.changeDetector.markForCheck();\n this.notify()(); });\n }\n\n /** Names shown under a `file` control (refs or plain names). */\n fileNames(): string[] {\n const value = this.value();\n if (!Array.isArray(value)) return [];\n return value.map((item) =>\n typeof item === 'object' && item !== null\n ? String((item as { name?: unknown }).name ?? '')\n : String(item),\n );\n }\n\n prefix(): string | null {\n const value = this.node().props?.['prefix'];\n return typeof value === 'string' && value ? value : null;\n }\n\n suffix(): string | null {\n const value = this.node().props?.['suffix'];\n return typeof value === 'string' && value ? value : null;\n }\n\n tagValues(): string[] {\n const value = this.value();\n return Array.isArray(value) ? value.map(String) : [];\n }\n\n addTag(event: Event): void {\n event.preventDefault();\n const input = event.target as HTMLInputElement;\n const tag = input.value.trim();\n if (!tag) return;\n this.setValue([...this.tagValues(), tag]);\n input.value = '';\n }\n\n removeTag(index: number): void {\n const next = [...this.tagValues()];\n next.splice(index, 1);\n this.setValue(next);\n }\n\n touch(): void {\n this.engine().markTouched(this.path());\n // Async-aware: resolves immediately for sync-only fields; pending events\n // drive the busy indicator otherwise.\n void this.engine().validateFieldAsync(this.path());\n }\n\n // -- reference (autocomplete) ---------------------------------------------\n\n readonly refOptions = signal<FieldOption[]>([]);\n readonly refOpen = signal(false);\n private refTimer: ReturnType<typeof setTimeout> | null = null;\n /** Label of the chosen option (falls back to the raw value). */\n readonly refLabel = signal<string | null>(null);\n\n refDisplay(): string {\n return this.refLabel() ?? this.stringValue();\n }\n\n refSearch(event: Event): void {\n const query = (event.target as HTMLInputElement).value;\n this.refLabel.set(null);\n if (this.refTimer) clearTimeout(this.refTimer);\n this.refTimer = setTimeout(() => this.refResolve(query), 250);\n }\n\n private refResolve(query: string): void {\n const source = this.field().optionsSource;\n if (!source || source.type !== 'provider') {\n // static options filter locally\n const filter = query.toLowerCase();\n this.refOptions.set(\n (this.field().options ?? []).filter((o) => o.label.toLowerCase().includes(filter)),\n );\n this.refOpen.set(true);\n this.changeDetector.markForCheck();\n this.notify()();\n return;\n }\n const provider = this.providers()[source.name];\n if (!provider) return;\n Promise.resolve(\n provider({\n field: this.field(),\n path: this.path(),\n data: this.engine().getData(),\n args: source.args,\n query,\n }),\n )\n .then((options) => {\n this.refOptions.set(options);\n this.refOpen.set(true);\n this.changeDetector.markForCheck();\n this.notify()();\n })\n .catch(() => {});\n }\n\n refPick(option: FieldOption): void {\n this.setValue(option.value);\n this.refLabel.set(option.label);\n this.refOpen.set(false);\n this.touch();\n }\n\n refBlur(): void {\n // let a click on an option land before closing\n setTimeout(() => { this.refOpen.set(false); this.changeDetector.markForCheck();\n this.notify()(); }, 150);\n this.touch();\n }\n\n addRow(): void {\n this.engine().addRow(this.path());\n }\n\n removeRow(index: number): void {\n this.engine().removeRow(this.path(), index);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n collectInputs,\n createFormEngine,\n createLegacyImporter,\n importForm,\n type ContainerField,\n type FieldError,\n type FormEngine,\n type FormSchema,\n type ImportWarning,\n type MessageResolver,\n type OptionsProviderRegistry,\n type SubmitResult,\n type ValidatorRegistry,\n} from '@mosaicoo/form-core';\nimport { FormNodeComponent, type FormMode } from './form-node.component.js';\n\n/**\n * `<mform-renderer>` — renders a form at runtime from a `FormSchema` (or any\n * definition a registered importer understands) and manages its lifecycle:\n * values, validation, conditional visibility and submission. Wizard schemas\n * (`settings.display: 'wizard'`) render as steps with per-step validation.\n *\n * Theming: every visual primitive reads a `--mform-*` CSS custom property\n * with a self-contained fallback, so the component looks finished on its own\n * and adopts the host design system when the host overrides the tokens.\n */\n@Component({\n selector: 'mform-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [FormNodeComponent],\n styleUrls: ['./form-theme.css'],\n template: `\n @if (engine(); as engine) {\n <form class=\"mform-root\" novalidate (submit)=\"onSubmit($event)\">\n @if (errorSummary().length > 0) {\n <div class=\"mform-summary\" role=\"alert\" tabindex=\"-1\">\n <strong>{{ summaryTitle() }}</strong>\n <ul>\n @for (error of errorSummary(); track error.path + error.rule) {\n <li>{{ error.message }}</li>\n }\n </ul>\n </div>\n }\n @if (isWizard()) {\n <ol class=\"mform-steps\">\n @for (step of steps(); track step.key; let i = $index) {\n <li\n class=\"mform-step\"\n [class.is-active]=\"currentStep() === i\"\n [class.is-done]=\"i < currentStep()\"\n [attr.aria-current]=\"currentStep() === i ? 'step' : null\"\n >\n <span class=\"mform-step-index\">{{ i + 1 }}</span>\n <span class=\"mform-step-label\">{{ step.label || 'Step ' + (i + 1) }}</span>\n </li>\n }\n </ol>\n @if (steps()[currentStep()]; as step) {\n <mform-node\n [node]=\"step\"\n [engine]=\"engine\"\n [tick]=\"tick()\"\n [providers]=\"optionsProviders()\"\n [mode]=\"mode()\" [notify]=\"bumpTick\"\n [bare]=\"true\"\n />\n }\n <div class=\"mform-wizard-nav\">\n @if (currentStep() > 0) {\n <button type=\"button\" class=\"mform-btn mform-btn-secondary\" (click)=\"previousStep()\">\n {{ labels().previous }}\n </button>\n }\n @if (currentStep() < steps().length - 1) {\n <button type=\"button\" class=\"mform-btn\" (click)=\"nextStep()\">\n {{ labels().next }}\n </button>\n } @else if (mode() === 'edit') {\n <button type=\"submit\" class=\"mform-btn\" [disabled]=\"submitting()\">\n {{ submitting() ? '…' : labels().submit }}\n </button>\n }\n </div>\n } @else {\n @for (node of engine.schema.fields; track node.key) {\n <mform-node [node]=\"node\" [engine]=\"engine\" [tick]=\"tick()\" [providers]=\"optionsProviders()\" [mode]=\"mode()\" [notify]=\"bumpTick\" />\n }\n }\n @if (submitError(); as error) {\n <div class=\"mform-summary\" role=\"alert\">{{ error }}</div>\n }\n </form>\n }\n `,\n})\nexport class FormRendererComponent {\n /** Native schema input. Takes precedence over `source`. */\n readonly schema = input<FormSchema | null>(null);\n /** Foreign definition (object or JSON string) resolved via importers. */\n readonly source = input<unknown>(null);\n /** Initial data merged over schema defaults. */\n readonly initialData = input<Record<string, unknown> | null>(null);\n /** Named providers resolving `optionsSource: provider` fields. */\n readonly optionsProviders = input<OptionsProviderRegistry>({});\n /** Host-supplied message resolver (localization of validation messages). */\n readonly messages = input<MessageResolver | null>(null);\n /** Named custom validators (sync or async — Promises get pending states). */\n readonly validators = input<ValidatorRegistry | null>(null);\n /** `edit` (default), `readonly` (no actions) or `disabled`. */\n readonly mode = input<FormMode>('edit');\n /**\n * Optional host submission: called after a VALID submit with the result;\n * rejections surface as the submission error state. Persistence transport\n * stays entirely on the host side.\n */\n readonly submitHandler = input<((result: SubmitResult) => Promise<void>) | null>(null);\n\n /** True while async validation or the submit handler is running. */\n readonly submitting = signal(false);\n /** Message when the host submission rejected. */\n readonly submitError = signal<string | null>(null);\n /** Fixed renderer texts (override to localize). `{{count}}` in `summary`. */\n readonly labels = input(\n {\n previous: 'Previous',\n next: 'Next',\n submit: 'Submit',\n summary: '{{count}} field(s) need attention:',\n },\n {\n transform: (value: Partial<{ previous: string; next: string; submit: string; summary: string }>) => ({\n previous: 'Previous',\n next: 'Next',\n submit: 'Submit',\n summary: '{{count}} field(s) need attention:',\n ...value,\n }),\n },\n );\n\n summaryTitle(): string {\n return this.labels().summary.replace(/\\{\\{\\s*count\\s*\\}\\}/g, String(this.errorSummary().length));\n }\n\n /** Fired on submit; `ok` is false when validation failed. */\n readonly submitted = output<SubmitResult>();\n /** Fired on every value change with the full data snapshot. */\n readonly valueChanged = output<Record<string, unknown>>();\n\n /** Bumped on every engine event; nodes read it to refresh. */\n readonly tick = signal(0);\n\n /** Handed to nodes so async completions re-render (zoneless-safe). */\n readonly bumpTick = (): void => this.tick.update((v) => v + 1);\n /** Active wizard step index. */\n readonly currentStep = signal(0);\n\n private readonly resolved = computed<{\n schema: FormSchema | null;\n warnings: ImportWarning[];\n }>(() => {\n const native = this.schema();\n if (native) return { schema: native, warnings: [] };\n const source = this.source();\n if (source === null || source === undefined) return { schema: null, warnings: [] };\n try {\n const result = importForm(source, [createLegacyImporter()]);\n return { schema: result.schema, warnings: result.warnings };\n } catch {\n return {\n schema: null,\n warnings: [\n { code: 'unreadable-source', message: 'The form definition could not be read.' },\n ],\n };\n }\n });\n\n /** Import degradations for the current `source`, if any. */\n readonly importWarnings = computed(() => this.resolved().warnings);\n\n readonly engine = computed<FormEngine | null>(() => {\n const schema = this.resolved().schema;\n return schema\n ? createFormEngine(schema, {\n initialData: this.initialData() ?? undefined,\n messages: this.messages() ?? undefined,\n validators: this.validators() ?? undefined,\n })\n : null;\n });\n\n readonly isWizard = computed(\n () => this.resolved().schema?.settings?.display === 'wizard' && this.steps().length > 0,\n );\n\n /** Wizard pages: the top-level containers of the schema. */\n readonly steps = computed<ContainerField[]>(() =>\n (this.resolved().schema?.fields ?? []).filter(\n (node): node is ContainerField => node.kind === 'container',\n ),\n );\n\n readonly errorSummary = signal<FieldError[]>([]);\n\n constructor() {\n effect((onCleanup) => {\n const engine = this.engine();\n this.errorSummary.set([]);\n this.tick.set(0);\n this.currentStep.set(0);\n if (!engine) return;\n const unsubscribe = engine.subscribe((event) => {\n this.tick.update((v) => v + 1);\n if (event.type === 'value-change') {\n this.valueChanged.emit(engine.getData());\n }\n if (event.type === 'validation') {\n // Keep the banner in sync as the user fixes fields after a submit.\n if (this.errorSummary().length > 0) {\n this.errorSummary.set(event.errors);\n }\n }\n });\n onCleanup(unsubscribe);\n });\n }\n\n // -- wizard navigation ----------------------------------------------------\n\n previousStep(): void {\n this.errorSummary.set([]);\n this.currentStep.update((step) => Math.max(0, step - 1));\n }\n\n nextStep(): void {\n const engine = this.engine();\n const step = this.steps()[this.currentStep()];\n if (!engine || !step) return;\n const errors = engine.validateContainer(step.key);\n if (errors.length > 0) {\n this.errorSummary.set(errors);\n this.focusFirstError(errors);\n return;\n }\n this.errorSummary.set([]);\n this.currentStep.update((index) => Math.min(this.steps().length - 1, index + 1));\n }\n\n // -- submission -----------------------------------------------------------\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n const engine = this.engine();\n if (!engine || this.submitting() || this.mode() !== 'edit') return;\n this.submitting.set(true);\n this.submitError.set(null);\n try {\n const result = await engine.submitAsync();\n this.errorSummary.set(result.errors);\n if (!result.ok) {\n if (this.isWizard()) {\n const stepIndex = this.stepIndexForPath(result.errors[0]?.path ?? '');\n if (stepIndex >= 0) this.currentStep.set(stepIndex);\n }\n this.focusFirstError(result.errors);\n } else if (this.submitHandler()) {\n try {\n await this.submitHandler()!(result);\n } catch (error) {\n this.submitError.set(String(error instanceof Error ? error.message : error));\n }\n }\n this.submitted.emit(result);\n } finally {\n this.submitting.set(false);\n }\n }\n\n /** Finds the wizard step that owns a (possibly row-indexed) data path. */\n private stepIndexForPath(path: string): number {\n const pattern = path\n .split('.')\n .map((part) => (/^\\d+$/.test(part) ? '*' : part))\n .join('.');\n return this.steps().findIndex((step) =>\n collectInputs({ version: 1, fields: step.children }).some(\n (entry) => entry.path === pattern,\n ),\n );\n }\n\n private readonly documentRef = inject(DOCUMENT);\n\n private focusFirstError(errors: FieldError[]): void {\n const first = errors[0];\n if (!first) return;\n const id = `mform-${first.path.replace(/\\./g, '-')}`;\n // Focus after the view updated with the error states.\n queueMicrotask(() => this.documentRef.getElementById(id)?.focus());\n }\n}\n","/*\n * Runtime entry point of @mosaicoo/form-angular.\n *\n * Architectural note: this primary entry stays runtime-only. Authoring\n * tooling (the visual designer) will ship as a SECONDARY entry point\n * (`@mosaicoo/form-angular/designer`) so applications that only render\n * forms never load authoring code — a requirement for federated hosts.\n */\nexport { FormRendererComponent } from './lib/form-renderer.component.js';\nexport { FormNodeComponent, type FormMode } from './lib/form-node.component.js';\nexport {\n MFORM_FIELD_COMPONENTS,\n MFORM_REMOTE_FETCHER,\n MFORM_UPLOAD,\n provideMosaicooForm,\n type FieldComponentMap,\n type FileUploadFn,\n type MformFieldComponent,\n type MosaicooFormConfig,\n type UploadedFileRef,\n} from './lib/providers.js';\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":"mosaicoo-form-angular.mjs","sources":["../../../packages/angular/src/lib/providers.ts","../../../packages/angular/src/lib/form-node.component.ts","../../../packages/angular/src/lib/form-renderer.component.ts","../../../packages/angular/src/public-api.ts","../../../packages/angular/src/mosaicoo-form-angular.ts"],"sourcesContent":["import {\n InjectionToken,\n makeEnvironmentProviders,\n type EnvironmentProviders,\n type Provider,\n type Type,\n} from '@angular/core';\nimport type { FormEngine, InputField, RemoteOptionsFetcher } from '@mosaicoo/form-core';\n\n/**\n * Extension surface of the renderer.\n *\n * Hosts extend or replace field rendering by registering components per field\n * `type` — new types (signature, rating, references…) plug in, and built-in\n * types can be overridden (e.g. a design-system adapter swapping the native\n * select for its own). The registry is DI-scoped: different areas of an app\n * can provide different catalogs.\n */\n\n/**\n * Contract of a registered field component. Implementations receive these\n * values as signal inputs with the SAME names (`field`, `engine`, `path`,\n * `tick`) and interact with the form exclusively through the engine —\n * `engine.getValue(path)` / `engine.setValue(path, value)` /\n * `engine.markTouched(path)` — so validation, conditionals and events keep\n * working with no extra wiring.\n */\nexport interface MformFieldComponent {\n field: () => InputField;\n engine: () => FormEngine;\n path: () => string;\n /** Bumped on every engine event; read it to stay in sync. */\n tick: () => number;\n /** Rendering mode of the surrounding form (optional input). */\n mode?: () => 'edit' | 'readonly' | 'disabled';\n}\n\n/** Map of field `type` → component implementing {@link MformFieldComponent}. */\nexport type FieldComponentMap = Record<string, Type<unknown>>;\n\n/** Multi-provider token: maps merge, later providers win on conflicts. */\nexport const MFORM_FIELD_COMPONENTS = new InjectionToken<FieldComponentMap[]>(\n 'MFORM_FIELD_COMPONENTS',\n);\n\n/**\n * Transport used for `optionsSource: { type: 'remote' }` fields. Register it\n * to route those requests through the host's HTTP stack (authentication,\n * base URLs, caching). Without it, a plain `fetch` is used.\n */\nexport const MFORM_REMOTE_FETCHER = new InjectionToken<RemoteOptionsFetcher>(\n 'MFORM_REMOTE_FETCHER',\n);\n\n/** Reference the host returns after uploading one file. */\nexport interface UploadedFileRef {\n name: string;\n id?: string;\n url?: string;\n size?: number;\n [extra: string]: unknown;\n}\n\n/**\n * Host-owned file upload: receives each selected file, delivers it wherever\n * the host decides (API, bucket, queue) and returns the reference stored in\n * the form data. Without it, `file` fields keep only file names.\n */\nexport type FileUploadFn = (\n file: File,\n context: { field: InputField; path: string },\n) => Promise<UploadedFileRef>;\n\nexport const MFORM_UPLOAD = new InjectionToken<FileUploadFn>('MFORM_UPLOAD');\n\nexport interface MosaicooFormConfig {\n /** Custom/override field components, keyed by field `type`. */\n components?: FieldComponentMap;\n /** Host transport for remote options sources. */\n remoteFetcher?: RemoteOptionsFetcher;\n /** Host-owned file upload for `file` fields. */\n uploadFiles?: FileUploadFn;\n}\n\n/**\n * Registers renderer extensions at any injector level:\n *\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * provideMosaicooForm({\n * components: { signature: SignatureFieldComponent },\n * remoteFetcher: (url) => authenticatedGet(url),\n * }),\n * ],\n * });\n * ```\n */\nexport function provideMosaicooForm(config: MosaicooFormConfig): EnvironmentProviders {\n const providers: Provider[] = [];\n if (config.components) {\n providers.push({ provide: MFORM_FIELD_COMPONENTS, useValue: config.components, multi: true });\n }\n if (config.remoteFetcher) {\n providers.push({ provide: MFORM_REMOTE_FETCHER, useValue: config.remoteFetcher });\n }\n if (config.uploadFiles) {\n providers.push({ provide: MFORM_UPLOAD, useValue: config.uploadFiles });\n }\n return makeEnvironmentProviders(providers);\n}\n","import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n reflectComponentType,\n signal,\n untracked,\n type Type,\n} from '@angular/core';\nimport { formatNumber, maskValue, parseNumber } from '@mosaicoo/form-core';\nimport type {\n ContainerField,\n FieldNode,\n FieldOption,\n FormEngine,\n InputField,\n OptionsProviderRegistry,\n StaticField,\n} from '@mosaicoo/form-core';\nimport { MFORM_FIELD_COMPONENTS, MFORM_REMOTE_FETCHER, MFORM_UPLOAD } from './providers.js';\n\n/** Rendering mode: `readonly` hides actions, `disabled` grays everything. */\nexport type FormMode = 'edit' | 'readonly' | 'disabled';\n\nfunction formatBytes(bytes: number): string {\n if (bytes >= 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n if (bytes >= 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${bytes} B`;\n}\n\n/**\n * Renders one schema node (input, container or static) and recurses into\n * children. State lives in the headless engine — this component only projects\n * it and forwards user interaction. `tick` changes whenever the engine emits,\n * invalidating the OnPush view.\n */\n@Component({\n selector: 'mform-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mform-node' },\n imports: [NgComponentOutlet, NgTemplateOutlet],\n // The field/container theme travels with the NODE so anything that renders\n // nodes — including the Designer canvas — looks exactly like the runtime.\n styleUrls: ['./form-theme.css'],\n template: `\n @let n = node();\n @if (visible()) {\n @switch (n.kind) {\n @case ('static') {\n @if (n.type === 'button') {\n @if (interactive()) {\n <button\n class=\"mform-btn\"\n [type]=\"buttonAction() === 'submit' ? 'submit' : 'button'\"\n >\n {{ n.label || 'Submit' }}\n </button>\n }\n } @else if (n.type === 'content') {\n <div class=\"mform-content\" [innerHTML]=\"content()\"></div>\n } @else {\n <div class=\"mform-unsupported\" role=\"note\">\n {{ n.label || n.key }} — unsupported content\n </div>\n }\n }\n @case ('container') {\n @switch (containerLayout()) {\n @case ('columns') {\n <div class=\"mform-columns\" [style.grid-template-columns]=\"columnsTemplate()\">\n @for (column of columns(); track $index) {\n <div class=\"mform-column\">\n @for (child of column; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" />\n }\n </div>\n }\n </div>\n }\n @case ('accordion') {\n <div class=\"mform-accordion\">\n @for (section of container().children; track section.key; let i = $index) {\n <section class=\"mform-acc-item\" [class.is-open]=\"isSectionOpen(i)\">\n <h3 class=\"mform-acc-head\">\n <button\n type=\"button\"\n class=\"mform-acc-toggle\"\n [attr.aria-expanded]=\"isSectionOpen(i)\"\n [attr.aria-controls]=\"controlId() + '-sec-' + i\"\n (click)=\"toggleSection(i)\"\n >\n <span class=\"mform-acc-caret\" aria-hidden=\"true\">\n {{ isSectionOpen(i) ? '▾' : '▸' }}\n </span>\n {{ section.label || 'Section ' + (i + 1) }}\n </button>\n </h3>\n @if (isSectionOpen(i)) {\n <div class=\"mform-acc-body\" [id]=\"controlId() + '-sec-' + i\" role=\"region\">\n <mform-node\n [node]=\"section\"\n [engine]=\"engine()\"\n [tick]=\"tick()\"\n [providers]=\"providers()\"\n [mode]=\"mode()\"\n [notify]=\"notify()\"\n [scope]=\"childScope()\"\n [bare]=\"true\"\n />\n </div>\n }\n </section>\n }\n </div>\n }\n @case ('tabs') {\n <div class=\"mform-tabs\">\n <div class=\"mform-tabbar\" role=\"tablist\">\n @for (tab of container().children; track tab.key; let i = $index) {\n <button\n type=\"button\"\n class=\"mform-tab\"\n role=\"tab\"\n [class.is-active]=\"activeTab() === i\"\n [attr.aria-selected]=\"activeTab() === i\"\n (click)=\"activeTab.set(i)\"\n >\n {{ tab.label || 'Tab ' + (i + 1) }}\n </button>\n }\n </div>\n @for (tab of container().children; track tab.key; let i = $index) {\n @if (activeTab() === i) {\n <div class=\"mform-tabpanel\" role=\"tabpanel\">\n <mform-node [node]=\"tab\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" [bare]=\"true\" />\n </div>\n }\n }\n </div>\n }\n @case ('array') {\n <section class=\"mform-panel mform-grid\">\n @if (container().label) {\n <header class=\"mform-panel-head\">{{ container().label }}</header>\n }\n <div class=\"mform-panel-body\">\n @for (row of rows(); track $index; let i = $index) {\n <div class=\"mform-grid-row\" role=\"group\" [attr.aria-label]=\"(container().label || container().key) + ' ' + (i + 1)\">\n <div class=\"mform-grid-fields\">\n @for (child of container().children; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"rowScope(i)\" />\n }\n </div>\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"mform-row-remove\"\n (click)=\"removeRow(i)\"\n [attr.aria-label]=\"'Remove row ' + (i + 1)\"\n >\n ✕\n </button>\n }\n </div>\n }\n @if (interactive()) {\n <button type=\"button\" class=\"mform-row-add\" (click)=\"addRow()\">+ Add</button>\n }\n </div>\n </section>\n }\n @default {\n @if (container().label && !bare()) {\n <section class=\"mform-panel\">\n <header class=\"mform-panel-head\">{{ container().label }}</header>\n <div class=\"mform-panel-body\">\n @for (child of container().children; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" />\n }\n </div>\n </section>\n } @else {\n <div class=\"mform-group\">\n @for (child of container().children; track child.key) {\n <mform-node [node]=\"child\" [engine]=\"engine()\" [tick]=\"tick()\" [providers]=\"providers()\" [mode]=\"mode()\" [notify]=\"notify()\" [scope]=\"childScope()\" />\n }\n </div>\n }\n }\n }\n }\n @case ('input') {\n @if (customComponent(); as custom) {\n <ng-container\n [ngComponentOutlet]=\"custom\"\n [ngComponentOutletInputs]=\"customInputs()\"\n />\n } @else if (field().type !== 'hidden') {\n <div class=\"mform-field\" [class.has-error]=\"errors().length > 0\" [class.is-pending]=\"pending()\">\n @if (field().type !== 'checkbox') {\n <label class=\"mform-label\" [attr.for]=\"controlId()\">\n {{ field().label || field().key }}\n @if (required()) {\n <span class=\"mform-req\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n @switch (field().type) {\n @case ('textarea') {\n <textarea\n class=\"mform-control\"\n [id]=\"controlId()\"\n [value]=\"stringValue()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.rows]=\"rowsProp()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"setString($event)\"\n (blur)=\"touch()\"\n ></textarea>\n }\n @case ('select') {\n <select\n class=\"mform-control\"\n [id]=\"controlId()\"\n [disabled]=\"controlDisabled()\"\n [multiple]=\"field().multiple === true\"\n [attr.size]=\"field().multiple ? 5 : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"setSelect($event)\"\n (blur)=\"touch()\"\n >\n @if (!field().multiple) {\n <option value=\"\" [selected]=\"stringValue() === ''\"></option>\n }\n @for (option of options(); track option.value) {\n <option\n [value]=\"option.value\"\n [selected]=\"isSelected(option.value)\"\n >\n {{ option.label }}\n </option>\n }\n </select>\n }\n @case ('radio') {\n <div class=\"mform-choices\" role=\"radiogroup\" [attr.aria-label]=\"field().label || field().key\">\n @for (option of options(); track option.value) {\n <label class=\"mform-check\">\n <input\n type=\"radio\"\n [name]=\"controlId()\"\n [checked]=\"stringValue() === '' + option.value\"\n [disabled]=\"controlDisabled()\"\n (change)=\"setValue(option.value)\"\n (blur)=\"touch()\"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n </div>\n }\n @case ('checkbox') {\n <label class=\"mform-check\">\n <input\n type=\"checkbox\"\n [id]=\"controlId()\"\n [checked]=\"value() === true\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"setChecked($event)\"\n (blur)=\"touch()\"\n />\n <span>\n {{ field().label || field().key }}\n @if (required()) {\n <span class=\"mform-req\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @case ('checkbox-group') {\n <div class=\"mform-choices\" role=\"group\" [attr.aria-label]=\"field().label || field().key\">\n @for (option of options(); track option.value) {\n <label class=\"mform-check\">\n <input\n type=\"checkbox\"\n [checked]=\"mapValue()['' + option.value] === true\"\n [disabled]=\"controlDisabled()\"\n (change)=\"toggleMap('' + option.value, $event)\"\n (blur)=\"touch()\"\n />\n <span>{{ option.label }}</span>\n </label>\n }\n </div>\n }\n @case ('tags') {\n <div class=\"mform-tags\">\n @for (tag of tagValues(); track $index; let i = $index) {\n <span class=\"mform-tag\">\n {{ tag }}\n <button\n type=\"button\"\n (click)=\"removeTag(i)\"\n [attr.aria-label]=\"'Remove ' + tag\"\n >✕</button>\n </span>\n }\n <input\n class=\"mform-control mform-tag-input\"\n type=\"text\"\n [id]=\"controlId()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (keydown.enter)=\"addTag($event)\"\n (blur)=\"touch()\"\n />\n </div>\n }\n @case ('file') {\n <ng-container *ngTemplateOutlet=\"fileControl\" />\n }\n @case ('image') {\n <ng-container *ngTemplateOutlet=\"fileControl\" />\n }\n @case ('reference') {\n <div class=\"mform-reference\">\n <input\n class=\"mform-control\"\n type=\"text\"\n role=\"combobox\"\n [id]=\"controlId()\"\n [value]=\"refDisplay()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.aria-expanded]=\"refOpen()\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"refSearch($event)\"\n (blur)=\"refBlur()\"\n />\n @if (refOpen() && refOptions().length > 0) {\n <ul class=\"mform-ref-list\" role=\"listbox\">\n @for (option of refOptions(); track option.value) {\n <li role=\"option\">\n <button type=\"button\" (click)=\"refPick(option)\">{{ option.label }}</button>\n </li>\n }\n </ul>\n }\n </div>\n }\n @case ('unsupported') {\n <input\n class=\"mform-control\"\n type=\"text\"\n disabled\n [id]=\"controlId()\"\n [value]=\"'Unsupported field (' + (sourceType() || 'unknown') + ')'\"\n />\n }\n @default {\n <div class=\"mform-affix\" [class.has-affix]=\"prefix() || suffix()\">\n @if (prefix(); as p) {\n <span class=\"mform-prefix\" aria-hidden=\"true\">{{ p }}</span>\n }\n <input\n class=\"mform-control\"\n [type]=\"numericFormatted() ? 'text' : inputType()\"\n [id]=\"controlId()\"\n [value]=\"stringValue()\"\n [placeholder]=\"field().placeholder || ''\"\n [disabled]=\"controlDisabled()\"\n [attr.step]=\"field().type === 'currency' && !numericFormatted() ? '0.01' : null\"\n [attr.inputmode]=\"field().type === 'currency' || numericFormatted() ? 'decimal' : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"errors().length > 0 || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"setString($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n @if (suffix(); as s) {\n <span class=\"mform-suffix\" aria-hidden=\"true\">{{ s }}</span>\n }\n </div>\n }\n }\n @if (field().description) {\n <div class=\"mform-desc\" [id]=\"controlId() + '-desc'\">{{ field().description }}</div>\n }\n @for (error of errors(); track error.rule) {\n <div class=\"mform-error\" [id]=\"controlId() + '-err'\" role=\"alert\">{{ error.message }}</div>\n }\n </div>\n }\n }\n }\n }\n\n <!-- File/image control: same markup for both types, thumbnails when the\n stored reference points at an image. -->\n <ng-template #fileControl>\n <input\n class=\"mform-control\"\n type=\"file\"\n [id]=\"controlId()\"\n [multiple]=\"field().multiple !== false\"\n [attr.accept]=\"acceptAttr()\"\n [disabled]=\"controlDisabled() || uploading()\"\n [attr.aria-busy]=\"uploading() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"setFiles($event)\"\n (blur)=\"touch()\"\n />\n @if (uploading()) {\n <div class=\"mform-desc\" role=\"status\">Uploading…</div>\n }\n @if (fileRejection(); as rejection) {\n <div class=\"mform-error\" role=\"alert\">{{ rejection }}</div>\n }\n @if (fileEntries().length > 0) {\n <ul class=\"mform-files\" [class.is-gallery]=\"showThumbnails()\">\n @for (entry of fileEntries(); track $index; let i = $index) {\n <li class=\"mform-file\">\n @if (showThumbnails() && entry.url) {\n <img class=\"mform-thumb\" [src]=\"entry.url\" [alt]=\"entry.name\" loading=\"lazy\" />\n } @else {\n <span class=\"mform-file-icon\" aria-hidden=\"true\">📎</span>\n }\n <span class=\"mform-file-name\" [title]=\"entry.name\">{{ entry.name }}</span>\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"mform-file-remove\"\n (click)=\"removeFile(i)\"\n [attr.aria-label]=\"'Remove ' + entry.name\"\n >✕</button>\n }\n </li>\n }\n </ul>\n }\n </ng-template>\n `,\n})\nexport class FormNodeComponent {\n readonly node = input.required<FieldNode>();\n readonly engine = input.required<FormEngine>();\n /** Monotonic counter bumped on every engine event — invalidates the view. */\n readonly tick = input.required<number>();\n /** Data-path prefix (set by array rows and nested groups above this node). */\n readonly scope = input<string>('');\n /** Suppresses the panel chrome (used when a tab already framed the child). */\n readonly bare = input<boolean>(false);\n /** Host-registered providers for `optionsSource: provider` fields. */\n readonly providers = input<OptionsProviderRegistry>({});\n /** Rendering mode inherited from the renderer. */\n readonly mode = input<FormMode>('edit');\n /** Renderer-supplied refresh hook for async completions (zoneless-safe). */\n readonly notify = input<() => void>(() => {});\n\n readonly activeTab = signal(0);\n\n /** DI-registered custom field components (maps merge; later wins). */\n private readonly componentMaps = inject(MFORM_FIELD_COMPONENTS, { optional: true });\n /** Host transport for remote options; plain fetch when absent. */\n private readonly remoteFetcher = inject(MFORM_REMOTE_FETCHER, { optional: true });\n /** Host-owned upload for `file` fields. */\n private readonly uploader = inject(MFORM_UPLOAD, { optional: true });\n /**\n * Async resolutions (debounce timers, provider promises) finish outside\n * any template event — explicitly schedule the refresh for zoneless apps.\n */\n private readonly changeDetector = inject(ChangeDetectorRef);\n\n readonly uploading = signal(false);\n\n /** Effective disabled state: mode, schema flag or calculated field. */\n controlDisabled(): boolean {\n return (\n this.mode() !== 'edit' ||\n this.field().disabled === true ||\n this.field().calculate !== undefined\n );\n }\n\n interactive(): boolean {\n return this.mode() === 'edit';\n }\n\n pending(): boolean {\n this.tick();\n return this.engine().isPending(this.path());\n }\n\n /** Custom component registered for this field type, if any. */\n customComponent(): Type<unknown> | null {\n const node = this.node();\n if (node.kind !== 'input' || !this.componentMaps) return null;\n for (let i = this.componentMaps.length - 1; i >= 0; i--) {\n const match = this.componentMaps[i]?.[node.type];\n if (match) return match;\n }\n return null;\n }\n\n /**\n * Inputs handed to a custom component (MformFieldComponent contract).\n * Only inputs the component actually declares are passed, so optional\n * contract members (`mode`) never break third-party components.\n */\n customInputs(): Record<string, unknown> {\n const component = this.customComponent();\n const declared = new Set(\n component ? (reflectComponentType(component)?.inputs ?? []).map((i) => i.propName) : [],\n );\n const all: Record<string, unknown> = {\n field: this.field(),\n engine: this.engine(),\n path: this.path(),\n tick: this.tick(),\n mode: this.mode(),\n };\n return Object.fromEntries(Object.entries(all).filter(([key]) => declared.has(key)));\n }\n\n /** Options resolved from a dynamic source (provider or remote URL). */\n private readonly resolvedOptions = signal<FieldOption[] | null>(null);\n /** Snapshot of the observed refresh source at the last resolution. */\n private lastRefreshKey: string | null = null;\n /** Discards resolutions that arrive after a newer request started. */\n private optionsRequestSeq = 0;\n\n constructor() {\n // Autocomplete fields refresh their cached results on observed changes.\n effect(() => this.watchReferenceRefresh());\n\n effect(() => {\n const node = this.node();\n const registry = this.providers();\n if (node.kind !== 'input' || !node.optionsSource) {\n this.resolvedOptions.set(null);\n return;\n }\n const source = node.optionsSource;\n // With refreshOn, engine events re-run this effect; the refresh key\n // then decides whether the observed data actually changed.\n if (source.refreshOn) this.tick();\n const engine = untracked(() => this.engine());\n const path = untracked(() => this.path());\n const refreshKey = !source.refreshOn\n ? 'static'\n : source.refreshOn === 'data'\n ? JSON.stringify(engine.getData())\n : JSON.stringify(engine.getValue(source.refreshOn) ?? null);\n if (refreshKey === this.lastRefreshKey) return;\n this.lastRefreshKey = refreshKey;\n // Stale-response guard: only the latest request may write options.\n const requestId = ++this.optionsRequestSeq;\n const apply = (options: FieldOption[]) => {\n if (requestId === this.optionsRequestSeq) this.resolvedOptions.set(options);\n };\n if (source.type === 'provider') {\n const provider = registry[source.name];\n if (!provider) return; // no provider: static options/fallback stand\n Promise.resolve(\n provider({ field: node, path, data: engine.getData(), args: source.args }),\n )\n .then((options) => { apply(options); this.changeDetector.markForCheck();\n this.notify()(); })\n .catch(() => {}); // provider failure keeps the static fallback\n } else {\n // The host's transport (auth, base URL, caching) when registered via\n // provideMosaicooForm; plain fetch as the zero-config default.\n const request = this.remoteFetcher\n ? this.remoteFetcher(source.url)\n : fetch(source.url).then((response) => (response.ok ? response.json() : []));\n request\n .then((list) =>\n apply(\n (Array.isArray(list) ? (list as Array<Record<string, unknown>>) : []).map((item) => ({\n label: String(item[source.labelKey ?? 'label'] ?? item[source.valueKey ?? 'value'] ?? ''),\n value: (item[source.valueKey ?? 'value'] ?? '') as FieldOption['value'],\n })),\n ),\n )\n .then(() => this.changeDetector.markForCheck())\n .catch(() => {});\n }\n });\n }\n\n /** Effective options: dynamically resolved first, static as fallback. */\n options(): FieldOption[] {\n return this.resolvedOptions() ?? this.field().options ?? [];\n }\n\n // -- typed views of the node ---------------------------------------------\n\n field(): InputField {\n return this.node() as InputField;\n }\n\n container(): ContainerField {\n return this.node() as ContainerField;\n }\n\n content(): string {\n return (this.node() as StaticField).content ?? '';\n }\n\n buttonAction(): string {\n return String(this.node().props?.['action'] ?? 'submit');\n }\n\n sourceType(): string {\n return String(this.node().props?.['sourceType'] ?? '');\n }\n\n rowsProp(): number | null {\n const rows = this.node().props?.['rows'];\n return typeof rows === 'number' ? rows : null;\n }\n\n // -- paths and visibility -------------------------------------------------\n\n /** Data path of this node (inputs) or of its scope (containers). */\n readonly path = computed(() => {\n const scope = this.scope();\n const node = this.node();\n if (node.kind === 'input') return scope ? `${scope}.${node.key}` : node.key;\n if (node.kind === 'container' && node.dataScope !== 'inherit') {\n return scope ? `${scope}.${node.key}` : node.key;\n }\n return scope;\n });\n\n /** Scope handed to children (nested/array containers extend it). */\n readonly childScope = computed(() => {\n const node = this.node();\n if (node.kind === 'container' && node.dataScope === 'nested') return this.path();\n return this.scope();\n });\n\n rowScope(index: number): string {\n return `${this.path()}.${index}`;\n }\n\n visible(): boolean {\n this.tick();\n const node = this.node();\n const key = node.kind === 'input' ? this.path() : node.key;\n return this.engine().isVisible(key);\n }\n\n containerLayout(): 'columns' | 'tabs' | 'accordion' | 'array' | 'block' {\n const node = this.container();\n if (node.dataScope === 'array') return 'array';\n if (node.type === 'tabs') return 'tabs';\n if (node.type === 'accordion') return 'accordion';\n if (node.type === 'columns' && node.columns?.length) return 'columns';\n return 'block';\n }\n\n /** Open accordion sections; the first one starts expanded. */\n private readonly openSections = signal<Set<number> | null>(null);\n\n isSectionOpen(index: number): boolean {\n const open = this.openSections();\n return open === null ? index === 0 : open.has(index);\n }\n\n toggleSection(index: number): void {\n this.openSections.update((current) => {\n const next = new Set(current ?? [0]);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }\n\n columns(): FieldNode[][] {\n const node = this.container();\n return (node.columns ?? []).map((column) =>\n column.children\n .map((index) => node.children[index])\n .filter((child): child is FieldNode => child !== undefined),\n );\n }\n\n columnsTemplate(): string {\n const cols = this.container().columns ?? [];\n const total = cols.reduce((sum, c) => sum + c.width, 0) || 12;\n return cols.map((c) => `${((c.width / total) * 100).toFixed(3)}fr`).join(' ');\n }\n\n // -- values ---------------------------------------------------------------\n\n value(): unknown {\n this.tick();\n return this.engine().getValue(this.path());\n }\n\n stringValue(): string {\n const value = this.value();\n if (value === undefined || value === null) return '';\n const format = this.field().format;\n if (format?.mask && typeof value === 'string') return maskValue(value, format.mask).masked;\n // Numbers show formatted while idle and raw while being edited, so the\n // caret never fights the thousands separators.\n if (format?.number && !this.focused()) return formatNumber(value, format.number);\n return String(value);\n }\n\n /** Tracks focus so numeric formatting steps aside during typing. */\n readonly focused = signal(false);\n\n onFocus(): void {\n if (this.field().format?.number) this.focused.set(true);\n }\n\n onBlur(): void {\n this.focused.set(false);\n this.touch();\n }\n\n /** Numeric inputs stay `text` when formatted (a number input rejects `R$`). */\n numericFormatted(): boolean {\n return this.field().format?.number !== undefined;\n }\n\n mapValue(): Record<string, unknown> {\n const value = this.value();\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n }\n\n rows(): unknown[] {\n const value = this.value();\n return Array.isArray(value) ? value : [];\n }\n\n required(): boolean {\n return this.field().validators?.some((v) => v.type === 'required') ?? false;\n }\n\n errors() {\n this.tick();\n return this.engine().getFieldErrors(this.path());\n }\n\n controlId(): string {\n return `mform-${this.path().replace(/\\./g, '-')}`;\n }\n\n describedBy(): string | null {\n const parts: string[] = [];\n if (this.field().description) parts.push(`${this.controlId()}-desc`);\n if (this.errors().length > 0) parts.push(`${this.controlId()}-err`);\n return parts.length ? parts.join(' ') : null;\n }\n\n inputType(): string {\n switch (this.field().type) {\n case 'number':\n case 'currency':\n return 'number';\n case 'email':\n return 'email';\n case 'password':\n return 'password';\n case 'phone':\n return 'tel';\n case 'url':\n return 'url';\n case 'time':\n return 'time';\n case 'datetime':\n return 'datetime-local';\n case 'day':\n return 'date';\n default:\n return 'text';\n }\n }\n\n // -- interaction ----------------------------------------------------------\n\n setValue(value: unknown): void {\n this.engine().setValue(this.path(), value);\n }\n\n setString(event: Event): void {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n const raw = target.value;\n const format = this.field().format;\n if (format?.mask) {\n const { masked, raw: stripped } = maskValue(raw, format.mask);\n target.value = masked; // the control always shows the masked shape\n this.setValue(format.keepMask ? masked : stripped);\n return;\n }\n if (format?.number) {\n // Locale-aware parse: `1.234,56` and `R$ 1.234,56` both land as a number.\n this.setValue(parseNumber(raw, format.number));\n return;\n }\n if (this.field().dataType === 'number') {\n const parsed = raw === '' ? undefined : Number(raw);\n this.setValue(parsed !== undefined && Number.isFinite(parsed) ? parsed : undefined);\n } else {\n this.setValue(raw);\n }\n }\n\n setSelect(event: Event): void {\n const select = event.target as HTMLSelectElement;\n if (this.field().multiple) {\n this.setValue(Array.from(select.selectedOptions, (option) => option.value));\n return;\n }\n this.setValue(select.value);\n }\n\n /** Selection state for single and multi-value choice fields. */\n isSelected(optionValue: string | number | boolean): boolean {\n const value = this.value();\n if (Array.isArray(value)) return value.some((item) => `${item}` === `${optionValue}`);\n return this.stringValue() === `${optionValue}`;\n }\n\n setChecked(event: Event): void {\n this.setValue((event.target as HTMLInputElement).checked);\n }\n\n toggleMap(option: string, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.setValue({ ...this.mapValue(), [option]: checked });\n }\n\n /** Client-side rejection message (size/type), cleared on the next pick. */\n readonly fileRejection = signal<string | null>(null);\n\n acceptAttr(): string | null {\n const accept = this.field().files?.accept;\n if (accept) return accept;\n return this.field().type === 'image' ? 'image/*' : null;\n }\n\n setFiles(event: Event): void {\n const input = event.target as HTMLInputElement;\n const picked = input.files ? Array.from(input.files) : [];\n this.fileRejection.set(null);\n if (picked.length === 0) return;\n\n // Client-side guards give immediate feedback; the back end stays the\n // authoritative check (file COUNT is a real rule via maxLength).\n const maxSize = this.field().files?.maxSize;\n const tooBig = maxSize ? picked.filter((file) => file.size > maxSize) : [];\n const list = maxSize ? picked.filter((file) => file.size <= maxSize) : picked;\n if (tooBig.length > 0) {\n this.fileRejection.set(\n `${tooBig.map((f) => f.name).join(', ')} — above ${formatBytes(maxSize!)}`,\n );\n }\n if (list.length === 0) {\n input.value = '';\n return;\n }\n\n const previous = this.fileEntries();\n const append = this.field().multiple !== false;\n if (!this.uploader) {\n // no host uploader: only file names are stored\n const names = list.map((f) => f.name);\n this.setValue(append ? [...previous.map((e) => e.name), ...names] : names);\n return;\n }\n const field = this.field();\n const path = this.path();\n this.uploading.set(true);\n Promise.all(list.map((file) => this.uploader!(file, { field, path })))\n .then((refs) => {\n const current = append ? (this.value() as unknown[] | undefined) ?? [] : [];\n this.setValue([...current, ...refs]);\n })\n .catch(() => {}) // host upload failure keeps the previous value\n .finally(() => { this.uploading.set(false); this.changeDetector.markForCheck();\n this.notify()(); });\n }\n\n /** Normalized view of the stored value: name + optional preview url. */\n fileEntries(): Array<{ name: string; url: string | null }> {\n const value = this.value();\n if (!Array.isArray(value)) return [];\n return value.map((item) => {\n if (typeof item === 'object' && item !== null) {\n const ref = item as { name?: unknown; url?: unknown };\n return {\n name: String(ref.name ?? ''),\n url: typeof ref.url === 'string' ? ref.url : null,\n };\n }\n const name = String(item);\n // A bare string that already looks like a URL doubles as the preview.\n return { name, url: /^(https?:|data:image\\/|blob:)/.test(name) ? name : null };\n });\n }\n\n showThumbnails(): boolean {\n const field = this.field();\n if (field.files?.preview === false) return false;\n return field.type === 'image' || field.files?.preview === true;\n }\n\n removeFile(index: number): void {\n const value = this.value();\n if (!Array.isArray(value)) return;\n const next = [...value];\n next.splice(index, 1);\n this.setValue(next);\n }\n\n prefix(): string | null {\n const value = this.node().props?.['prefix'];\n return typeof value === 'string' && value ? value : null;\n }\n\n suffix(): string | null {\n const value = this.node().props?.['suffix'];\n return typeof value === 'string' && value ? value : null;\n }\n\n tagValues(): string[] {\n const value = this.value();\n return Array.isArray(value) ? value.map(String) : [];\n }\n\n addTag(event: Event): void {\n event.preventDefault();\n const input = event.target as HTMLInputElement;\n const tag = input.value.trim();\n if (!tag) return;\n this.setValue([...this.tagValues(), tag]);\n input.value = '';\n }\n\n removeTag(index: number): void {\n const next = [...this.tagValues()];\n next.splice(index, 1);\n this.setValue(next);\n }\n\n touch(): void {\n this.engine().markTouched(this.path());\n // Async-aware: resolves immediately for sync-only fields; pending events\n // drive the busy indicator otherwise.\n void this.engine().validateFieldAsync(this.path());\n }\n\n // -- reference (autocomplete) ---------------------------------------------\n\n readonly refOptions = signal<FieldOption[]>([]);\n readonly refOpen = signal(false);\n private refTimer: ReturnType<typeof setTimeout> | null = null;\n /** Label of the chosen option (falls back to the raw value). */\n readonly refLabel = signal<string | null>(null);\n /** Last query typed, replayed when `refreshOn` invalidates the results. */\n private refQuery = '';\n private refRefreshKey: string | null = null;\n\n /**\n * `refreshOn` for autocomplete: when the observed data changes, cached\n * results are dropped so the next search runs against the new context\n * (e.g. properties filtered by the selected client).\n */\n private watchReferenceRefresh(): void {\n const field = this.field();\n const source = field.optionsSource;\n if (field.type !== 'reference' || source?.type !== 'provider' || !source.refreshOn) return;\n this.tick();\n const engine = untracked(() => this.engine());\n const key =\n source.refreshOn === 'data'\n ? JSON.stringify(engine.getData())\n : JSON.stringify(engine.getValue(source.refreshOn) ?? null);\n if (this.refRefreshKey === null) {\n this.refRefreshKey = key;\n return;\n }\n if (key === this.refRefreshKey) return;\n this.refRefreshKey = key;\n this.refOptions.set([]);\n if (this.refOpen()) this.refResolve(this.refQuery);\n }\n\n refDisplay(): string {\n return this.refLabel() ?? this.stringValue();\n }\n\n refSearch(event: Event): void {\n const query = (event.target as HTMLInputElement).value;\n this.refQuery = query;\n this.refLabel.set(null);\n if (this.refTimer) clearTimeout(this.refTimer);\n this.refTimer = setTimeout(() => this.refResolve(query), 250);\n }\n\n private refResolve(query: string): void {\n const source = this.field().optionsSource;\n if (!source || source.type !== 'provider') {\n // static options filter locally\n const filter = query.toLowerCase();\n this.refOptions.set(\n (this.field().options ?? []).filter((o) => o.label.toLowerCase().includes(filter)),\n );\n this.refOpen.set(true);\n this.changeDetector.markForCheck();\n this.notify()();\n return;\n }\n const provider = this.providers()[source.name];\n if (!provider) return;\n Promise.resolve(\n provider({\n field: this.field(),\n path: this.path(),\n data: this.engine().getData(),\n args: source.args,\n query,\n }),\n )\n .then((options) => {\n this.refOptions.set(options);\n this.refOpen.set(true);\n this.changeDetector.markForCheck();\n this.notify()();\n })\n .catch(() => {});\n }\n\n refPick(option: FieldOption): void {\n this.setValue(option.value);\n this.refLabel.set(option.label);\n this.refOpen.set(false);\n this.touch();\n }\n\n refBlur(): void {\n // let a click on an option land before closing\n setTimeout(() => { this.refOpen.set(false); this.changeDetector.markForCheck();\n this.notify()(); }, 150);\n this.touch();\n }\n\n addRow(): void {\n this.engine().addRow(this.path());\n }\n\n removeRow(index: number): void {\n this.engine().removeRow(this.path(), index);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport {\n collectInputs,\n createFormEngine,\n createLegacyImporter,\n importForm,\n type ContainerField,\n type FieldError,\n type FormEngine,\n type FormSchema,\n type ImportWarning,\n type MessageResolver,\n type OptionsProviderRegistry,\n type SubmitResult,\n type ValidatorRegistry,\n} from '@mosaicoo/form-core';\nimport { FormNodeComponent, type FormMode } from './form-node.component.js';\n\n/**\n * `<mform-renderer>` — renders a form at runtime from a `FormSchema` (or any\n * definition a registered importer understands) and manages its lifecycle:\n * values, validation, conditional visibility and submission. Wizard schemas\n * (`settings.display: 'wizard'`) render as steps with per-step validation.\n *\n * Theming: every visual primitive reads a `--mform-*` CSS custom property\n * with a self-contained fallback, so the component looks finished on its own\n * and adopts the host design system when the host overrides the tokens.\n */\n@Component({\n selector: 'mform-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [FormNodeComponent],\n styleUrls: ['./form-shell.css'],\n template: `\n @if (engine(); as engine) {\n <form class=\"mform-root\" novalidate (submit)=\"onSubmit($event)\">\n @if (errorSummary().length > 0) {\n <div class=\"mform-summary\" role=\"alert\" tabindex=\"-1\">\n <strong>{{ summaryTitle() }}</strong>\n <ul>\n @for (error of errorSummary(); track error.path + error.rule) {\n <li>{{ error.message }}</li>\n }\n </ul>\n </div>\n }\n @if (isWizard()) {\n <ol class=\"mform-steps\">\n @for (step of steps(); track step.key; let i = $index) {\n <li\n class=\"mform-step\"\n [class.is-active]=\"currentStep() === i\"\n [class.is-done]=\"i < currentStep()\"\n [attr.aria-current]=\"currentStep() === i ? 'step' : null\"\n >\n <span class=\"mform-step-index\">{{ i + 1 }}</span>\n <span class=\"mform-step-label\">{{ step.label || 'Step ' + (i + 1) }}</span>\n </li>\n }\n </ol>\n @if (steps()[currentStep()]; as step) {\n <mform-node\n [node]=\"step\"\n [engine]=\"engine\"\n [tick]=\"tick()\"\n [providers]=\"optionsProviders()\"\n [mode]=\"mode()\" [notify]=\"bumpTick\"\n [bare]=\"true\"\n />\n }\n <div class=\"mform-wizard-nav\">\n @if (currentStep() > 0) {\n <button type=\"button\" class=\"mform-btn mform-btn-secondary\" (click)=\"previousStep()\">\n {{ labels().previous }}\n </button>\n }\n @if (currentStep() < steps().length - 1) {\n <button type=\"button\" class=\"mform-btn\" [disabled]=\"submitting()\" (click)=\"nextStep()\">\n {{ submitting() ? '…' : labels().next }}\n </button>\n } @else if (mode() === 'edit') {\n <button type=\"submit\" class=\"mform-btn\" [disabled]=\"submitting()\">\n {{ submitting() ? '…' : labels().submit }}\n </button>\n }\n </div>\n } @else {\n @for (node of engine.schema.fields; track node.key) {\n <mform-node [node]=\"node\" [engine]=\"engine\" [tick]=\"tick()\" [providers]=\"optionsProviders()\" [mode]=\"mode()\" [notify]=\"bumpTick\" />\n }\n }\n @if (submitError(); as error) {\n <div class=\"mform-summary\" role=\"alert\">{{ error }}</div>\n }\n </form>\n }\n `,\n})\nexport class FormRendererComponent {\n /** Native schema input. Takes precedence over `source`. */\n readonly schema = input<FormSchema | null>(null);\n /** Foreign definition (object or JSON string) resolved via importers. */\n readonly source = input<unknown>(null);\n /** Initial data merged over schema defaults. */\n readonly initialData = input<Record<string, unknown> | null>(null);\n /** Named providers resolving `optionsSource: provider` fields. */\n readonly optionsProviders = input<OptionsProviderRegistry>({});\n /** Host-supplied message resolver (localization of validation messages). */\n readonly messages = input<MessageResolver | null>(null);\n /** Named custom validators (sync or async — Promises get pending states). */\n readonly validators = input<ValidatorRegistry | null>(null);\n /** `edit` (default), `readonly` (no actions) or `disabled`. */\n readonly mode = input<FormMode>('edit');\n /**\n * Optional host submission: called after a VALID submit with the result;\n * rejections surface as the submission error state. Persistence transport\n * stays entirely on the host side.\n */\n readonly submitHandler = input<((result: SubmitResult) => Promise<void>) | null>(null);\n\n /** True while async validation or the submit handler is running. */\n readonly submitting = signal(false);\n /** Message when the host submission rejected. */\n readonly submitError = signal<string | null>(null);\n /** Fixed renderer texts (override to localize). `{{count}}` in `summary`. */\n readonly labels = input(\n {\n previous: 'Previous',\n next: 'Next',\n submit: 'Submit',\n summary: '{{count}} field(s) need attention:',\n },\n {\n transform: (value: Partial<{ previous: string; next: string; submit: string; summary: string }>) => ({\n previous: 'Previous',\n next: 'Next',\n submit: 'Submit',\n summary: '{{count}} field(s) need attention:',\n ...value,\n }),\n },\n );\n\n summaryTitle(): string {\n return this.labels().summary.replace(/\\{\\{\\s*count\\s*\\}\\}/g, String(this.errorSummary().length));\n }\n\n /** Fired on submit; `ok` is false when validation failed. */\n readonly submitted = output<SubmitResult>();\n /** Fired on every value change with the full data snapshot. */\n readonly valueChanged = output<Record<string, unknown>>();\n\n /** Bumped on every engine event; nodes read it to refresh. */\n readonly tick = signal(0);\n\n /** Handed to nodes so async completions re-render (zoneless-safe). */\n readonly bumpTick = (): void => this.tick.update((v) => v + 1);\n /** Active wizard step index. */\n readonly currentStep = signal(0);\n\n private readonly resolved = computed<{\n schema: FormSchema | null;\n warnings: ImportWarning[];\n }>(() => {\n const native = this.schema();\n if (native) return { schema: native, warnings: [] };\n const source = this.source();\n if (source === null || source === undefined) return { schema: null, warnings: [] };\n try {\n const result = importForm(source, [createLegacyImporter()]);\n return { schema: result.schema, warnings: result.warnings };\n } catch {\n return {\n schema: null,\n warnings: [\n { code: 'unreadable-source', message: 'The form definition could not be read.' },\n ],\n };\n }\n });\n\n /** Import degradations for the current `source`, if any. */\n readonly importWarnings = computed(() => this.resolved().warnings);\n\n readonly engine = computed<FormEngine | null>(() => {\n const schema = this.resolved().schema;\n return schema\n ? createFormEngine(schema, {\n initialData: this.initialData() ?? undefined,\n messages: this.messages() ?? undefined,\n validators: this.validators() ?? undefined,\n })\n : null;\n });\n\n readonly isWizard = computed(\n () => this.resolved().schema?.settings?.display === 'wizard' && this.steps().length > 0,\n );\n\n /** Wizard pages: the top-level containers of the schema. */\n readonly steps = computed<ContainerField[]>(() =>\n (this.resolved().schema?.fields ?? []).filter(\n (node): node is ContainerField => node.kind === 'container',\n ),\n );\n\n readonly errorSummary = signal<FieldError[]>([]);\n\n constructor() {\n effect((onCleanup) => {\n const engine = this.engine();\n this.errorSummary.set([]);\n this.tick.set(0);\n this.currentStep.set(0);\n if (!engine) return;\n const unsubscribe = engine.subscribe((event) => {\n this.tick.update((v) => v + 1);\n if (event.type === 'value-change') {\n this.valueChanged.emit(engine.getData());\n }\n if (event.type === 'validation') {\n // Keep the banner in sync as the user fixes fields after a submit.\n if (this.errorSummary().length > 0) {\n this.errorSummary.set(event.errors);\n }\n }\n });\n onCleanup(unsubscribe);\n });\n }\n\n // -- wizard navigation ----------------------------------------------------\n\n previousStep(): void {\n this.errorSummary.set([]);\n this.currentStep.update((step) => Math.max(0, step - 1));\n }\n\n /**\n * Advances only when the step is valid INCLUDING async rules, so a\n * server-side check can still block the transition.\n */\n async nextStep(): Promise<void> {\n const engine = this.engine();\n const step = this.steps()[this.currentStep()];\n if (!engine || !step || this.submitting()) return;\n this.submitting.set(true);\n try {\n const errors = await engine.validateContainerAsync(step.key);\n if (errors.length > 0) {\n this.errorSummary.set(errors);\n this.focusFirstError(errors);\n return;\n }\n this.errorSummary.set([]);\n this.currentStep.update((index) => Math.min(this.steps().length - 1, index + 1));\n } finally {\n this.submitting.set(false);\n }\n }\n\n // -- submission -----------------------------------------------------------\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n const engine = this.engine();\n if (!engine || this.submitting() || this.mode() !== 'edit') return;\n this.submitting.set(true);\n this.submitError.set(null);\n try {\n const result = await engine.submitAsync();\n this.errorSummary.set(result.errors);\n if (!result.ok) {\n if (this.isWizard()) {\n const stepIndex = this.stepIndexForPath(result.errors[0]?.path ?? '');\n if (stepIndex >= 0) this.currentStep.set(stepIndex);\n }\n this.focusFirstError(result.errors);\n } else if (this.submitHandler()) {\n try {\n await this.submitHandler()!(result);\n } catch (error) {\n this.submitError.set(String(error instanceof Error ? error.message : error));\n }\n }\n this.submitted.emit(result);\n } finally {\n this.submitting.set(false);\n }\n }\n\n /** Finds the wizard step that owns a (possibly row-indexed) data path. */\n private stepIndexForPath(path: string): number {\n const pattern = path\n .split('.')\n .map((part) => (/^\\d+$/.test(part) ? '*' : part))\n .join('.');\n return this.steps().findIndex((step) =>\n collectInputs({ version: 1, fields: step.children }).some(\n (entry) => entry.path === pattern,\n ),\n );\n }\n\n private readonly documentRef = inject(DOCUMENT);\n\n private focusFirstError(errors: FieldError[]): void {\n const first = errors[0];\n if (!first) return;\n const id = `mform-${first.path.replace(/\\./g, '-')}`;\n // Focus after the view updated with the error states.\n queueMicrotask(() => this.documentRef.getElementById(id)?.focus());\n }\n}\n","/*\n * Runtime entry point of @mosaicoo/form-angular.\n *\n * Architectural note: this primary entry stays runtime-only. Authoring\n * tooling (the visual designer) will ship as a SECONDARY entry point\n * (`@mosaicoo/form-angular/designer`) so applications that only render\n * forms never load authoring code — a requirement for federated hosts.\n */\nexport { FormRendererComponent } from './lib/form-renderer.component.js';\nexport { FormNodeComponent, type FormMode } from './lib/form-node.component.js';\nexport {\n MFORM_FIELD_COMPONENTS,\n MFORM_REMOTE_FETCHER,\n MFORM_UPLOAD,\n provideMosaicooForm,\n type FieldComponentMap,\n type FileUploadFn,\n type MformFieldComponent,\n type MosaicooFormConfig,\n type UploadedFileRef,\n} from './lib/providers.js';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mosaicoo/form-angular",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Angular renderer for Mosaicoo Form: accessible, token-themable dynamic forms with wizard mode and host-provided dynamic options",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Mosaicoo",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
}
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@mosaicoo/form-core": "^0.
|
|
42
|
+
"@mosaicoo/form-core": "^0.7.0",
|
|
43
43
|
"tslib": "^2.3.0"
|
|
44
44
|
},
|
|
45
45
|
"sideEffects": false,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as _mosaicoo_form_angular_designer from '@mosaicoo/form-angular/designer';
|
|
1
2
|
import * as _angular_core from '@angular/core';
|
|
2
3
|
import { FieldNode, FormSchema, InputField, StaticField, Condition, NodePath, SchemaDiagnostic, FormEngine, ContainerField } from '@mosaicoo/form-core';
|
|
3
4
|
|
|
@@ -46,6 +47,19 @@ declare class InspectorComponent {
|
|
|
46
47
|
patchConditionExpression(event: Event): void;
|
|
47
48
|
patchCalculate(event: Event): void;
|
|
48
49
|
patchMask(event: Event): void;
|
|
50
|
+
patchMultiple(event: Event): void;
|
|
51
|
+
sourceKind(): '' | 'provider' | 'remote';
|
|
52
|
+
providerName(): string;
|
|
53
|
+
remoteUrl(): string;
|
|
54
|
+
refreshOn(): string;
|
|
55
|
+
patchSourceKind(event: Event): void;
|
|
56
|
+
patchProviderName(event: Event): void;
|
|
57
|
+
patchRemoteUrl(event: Event): void;
|
|
58
|
+
patchRefreshOn(event: Event): void;
|
|
59
|
+
readonly propsError: _angular_core.WritableSignal<string>;
|
|
60
|
+
hasProps(): boolean;
|
|
61
|
+
propsText(): string;
|
|
62
|
+
patchProps(event: Event): void;
|
|
49
63
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<InspectorComponent, never>;
|
|
50
64
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<InspectorComponent, "mform-inspector", never, { "node": { "alias": "node"; "required": true; "isSignal": true; }; "schema": { "alias": "schema"; "required": true; "isSignal": true; }; }, { "nodePatch": "nodePatch"; }, never, never, true, never>;
|
|
51
65
|
}
|
|
@@ -69,6 +83,50 @@ interface CatalogGroup {
|
|
|
69
83
|
}
|
|
70
84
|
declare const DEFAULT_CATALOG: CatalogGroup[];
|
|
71
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Reusable blocks: a named node subtree (an address group, a payment panel,
|
|
88
|
+
* a compliance section) that can be dropped into any form. Blocks are plain
|
|
89
|
+
* schema fragments — serializable, portable and free of runtime state.
|
|
90
|
+
*
|
|
91
|
+
* The designer keeps them locally by default; hosts that want blocks shared
|
|
92
|
+
* across users bind `[blocks]` and persist `(blocksChanged)` themselves.
|
|
93
|
+
*/
|
|
94
|
+
interface FormBlock {
|
|
95
|
+
id: string;
|
|
96
|
+
label: string;
|
|
97
|
+
/** Schema subtree; keys are regenerated on insert to stay unique. */
|
|
98
|
+
node: FieldNode;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Designer workspace layout.
|
|
103
|
+
*
|
|
104
|
+
* Panels are dockable like in professional tools: each one can sit on the
|
|
105
|
+
* left, on the right, or be hidden — the canvas always keeps the center. The
|
|
106
|
+
* arrangement is a plain serializable object so hosts can persist it per user
|
|
107
|
+
* (the designer also remembers it locally by default).
|
|
108
|
+
*/
|
|
109
|
+
type DockSide = 'left' | 'right' | 'hidden';
|
|
110
|
+
/** Panels that can be docked around the canvas. */
|
|
111
|
+
type PanelId = 'palette' | 'structure' | 'properties';
|
|
112
|
+
interface WorkspaceLayout {
|
|
113
|
+
palette: DockSide;
|
|
114
|
+
structure: DockSide;
|
|
115
|
+
properties: DockSide;
|
|
116
|
+
/** Width of each dock rail, in pixels. */
|
|
117
|
+
leftWidth: number;
|
|
118
|
+
rightWidth: number;
|
|
119
|
+
}
|
|
120
|
+
declare const DEFAULT_LAYOUT: WorkspaceLayout;
|
|
121
|
+
interface WorkspacePreset {
|
|
122
|
+
id: string;
|
|
123
|
+
label: string;
|
|
124
|
+
layout: WorkspaceLayout;
|
|
125
|
+
}
|
|
126
|
+
/** Ready-made arrangements offered in the workspace menu. */
|
|
127
|
+
declare const WORKSPACE_PRESETS: WorkspacePreset[];
|
|
128
|
+
declare const PANEL_LABELS: Record<PanelId, string>;
|
|
129
|
+
|
|
72
130
|
/**
|
|
73
131
|
* `<mform-designer>` — visual authoring of form schemas.
|
|
74
132
|
*
|
|
@@ -94,6 +152,32 @@ declare class FormDesignerComponent {
|
|
|
94
152
|
readonly dialog: _angular_core.WritableSignal<"import" | "export" | null>;
|
|
95
153
|
readonly importError: _angular_core.WritableSignal<string>;
|
|
96
154
|
readonly showDiagnostics: _angular_core.WritableSignal<boolean>;
|
|
155
|
+
/** Panel arrangement; persisted locally unless the host controls it. */
|
|
156
|
+
readonly layout: _angular_core.WritableSignal<WorkspaceLayout>;
|
|
157
|
+
readonly workspaceMenu: _angular_core.WritableSignal<boolean>;
|
|
158
|
+
readonly panelIds: PanelId[];
|
|
159
|
+
readonly dockSides: DockSide[];
|
|
160
|
+
readonly panelLabels: Record<PanelId, string>;
|
|
161
|
+
readonly sideLabels: Record<DockSide, string>;
|
|
162
|
+
readonly presets: _mosaicoo_form_angular_designer.WorkspacePreset[];
|
|
163
|
+
/** Collapsed palette groups (only the first stays open by default). */
|
|
164
|
+
readonly openGroups: _angular_core.WritableSignal<Set<string>>;
|
|
165
|
+
private readonly storage;
|
|
166
|
+
panelLabel(panel: PanelId): string;
|
|
167
|
+
panelSide(panel: PanelId): DockSide;
|
|
168
|
+
dockedPanels(side: 'left' | 'right'): PanelId[];
|
|
169
|
+
bodyColumns(): string;
|
|
170
|
+
dock(panel: PanelId, side: DockSide): void;
|
|
171
|
+
applyPreset(id: string): void;
|
|
172
|
+
resetLayout(): void;
|
|
173
|
+
isGroupOpen(label: string): boolean;
|
|
174
|
+
toggleGroup(label: string): void;
|
|
175
|
+
/** Saved blocks (host-controlled when `[blocks]` is bound). */
|
|
176
|
+
readonly blocks: _angular_core.InputSignal<FormBlock[] | null>;
|
|
177
|
+
readonly blocksChanged: _angular_core.OutputEmitterRef<FormBlock[]>;
|
|
178
|
+
private readonly localBlocks;
|
|
179
|
+
readonly effectiveBlocks: _angular_core.Signal<FormBlock[]>;
|
|
180
|
+
/** Palette = built-ins + host extras + saved blocks as a group. */
|
|
97
181
|
readonly catalog: _angular_core.Signal<CatalogGroup[]>;
|
|
98
182
|
readonly diagnostics: _angular_core.Signal<SchemaDiagnostic[]>;
|
|
99
183
|
readonly exportedJson: _angular_core.Signal<string>;
|
|
@@ -118,13 +202,30 @@ declare class FormDesignerComponent {
|
|
|
118
202
|
duplicateSelected(): void;
|
|
119
203
|
moveSelected(delta: -1 | 1): void;
|
|
120
204
|
applyPatch(event: InspectorPatch): void;
|
|
205
|
+
/** Saves the selected node (with its subtree) as a reusable block. */
|
|
206
|
+
saveAsBlock(): void;
|
|
207
|
+
removeBlock(id: string): void;
|
|
208
|
+
isBlockEntry(entry: CatalogEntry): boolean;
|
|
209
|
+
blockIdOf(entry: CatalogEntry): string;
|
|
210
|
+
/** What is being dragged: a palette entry or an existing node. */
|
|
211
|
+
private readonly dragging;
|
|
212
|
+
/** Drop target highlighted while hovering. */
|
|
213
|
+
readonly dropTarget: _angular_core.WritableSignal<string | null>;
|
|
214
|
+
startEntryDrag(entry: CatalogEntry, event: DragEvent): void;
|
|
215
|
+
startNodeDrag(path: NodePath, event: DragEvent): void;
|
|
216
|
+
endDrag(): void;
|
|
217
|
+
allowDrop(target: NodePath, event: DragEvent): void;
|
|
218
|
+
/** Drops onto `target`, the position the node should occupy. */
|
|
219
|
+
drop(target: NodePath, event: DragEvent): void;
|
|
220
|
+
isDropTarget(path: NodePath): boolean;
|
|
221
|
+
isDragging(): boolean;
|
|
121
222
|
select(path: NodePath | null): void;
|
|
122
223
|
isSelectedPath(path: NodePath): boolean;
|
|
123
224
|
openExport(): void;
|
|
124
225
|
doImport(raw: string): void;
|
|
125
226
|
onKeydown(event: KeyboardEvent): void;
|
|
126
227
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormDesignerComponent, never>;
|
|
127
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormDesignerComponent, "mform-designer", never, { "schema": { "alias": "schema"; "required": false; "isSignal": true; }; "source": { "alias": "source"; "required": false; "isSignal": true; }; "extraCatalog": { "alias": "extraCatalog"; "required": false; "isSignal": true; }; }, { "schemaChanged": "schemaChanged"; }, never, never, true, never>;
|
|
228
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormDesignerComponent, "mform-designer", never, { "schema": { "alias": "schema"; "required": false; "isSignal": true; }; "source": { "alias": "source"; "required": false; "isSignal": true; }; "extraCatalog": { "alias": "extraCatalog"; "required": false; "isSignal": true; }; "blocks": { "alias": "blocks"; "required": false; "isSignal": true; }; }, { "schemaChanged": "schemaChanged"; "blocksChanged": "blocksChanged"; }, never, never, true, never>;
|
|
128
229
|
}
|
|
129
230
|
|
|
130
231
|
/**
|
|
@@ -151,5 +252,5 @@ declare class DesignerNodeComponent {
|
|
|
151
252
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DesignerNodeComponent, "mform-designer-node", never, { "node": { "alias": "node"; "required": true; "isSignal": true; }; "path": { "alias": "path"; "required": true; "isSignal": true; }; "engine": { "alias": "engine"; "required": true; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; }, { "selectNode": "selectNode"; }, never, never, true, never>;
|
|
152
253
|
}
|
|
153
254
|
|
|
154
|
-
export { DEFAULT_CATALOG, DesignerNodeComponent, FormDesignerComponent, InspectorComponent };
|
|
155
|
-
export type { CatalogEntry, CatalogGroup, InspectorPatch };
|
|
255
|
+
export { DEFAULT_CATALOG, DEFAULT_LAYOUT, DesignerNodeComponent, FormDesignerComponent, InspectorComponent, PANEL_LABELS, WORKSPACE_PRESETS };
|
|
256
|
+
export type { CatalogEntry, CatalogGroup, DockSide, FormBlock, InspectorPatch, PanelId, WorkspaceLayout, WorkspacePreset };
|