@rastr/vue 0.0.0-stage → 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/RsGrid.ts","../src/cell-renderer.ts","../src/edit-renderer.ts","../src/RsColumn.ts","../src/options.ts","../src/RsSavedViews.ts","../src/RsFilterBuilder.ts","../src/define-columns.ts"],"sourcesContent":["export { RsGrid } from './RsGrid';\nexport type { DetailSlotProps, RsGridExpose } from './RsGrid';\nexport { RsColumn } from './RsColumn';\nexport { defineColumns } from './define-columns';\nexport { RsFilterBuilder } from './RsFilterBuilder';\nexport { RsSavedViews } from './RsSavedViews';\nexport type { SavedViewsMessages } from './RsSavedViews';\nexport { createVueCellRenderer, createVueHeaderRenderer } from './cell-renderer';\nexport type { CellSlotProps, HeaderSlotProps } from './cell-renderer';\nexport type { EditSlotProps } from './edit-renderer';\nexport type { StateStorageProp, RsGridStoreProps } from './options';\n\n// Convenience re-exports so typical screens need only @rastr/vue.\nexport { and, cond, createArrayDataSource, not, or } from '@rastr/core';\nexport { createRemoteExport, createSavedViews } from '@rastr/core';\nexport type { DataSource, FilterNode, GridExportRequest, GridState, Key, SavedView, SavedViews, SavedViewsAdapter, SelectionState, StoredView } from '@rastr/core';\nexport { actionsColumn, custom, editActionsColumn, pattern, range, required, rowNumberColumn } from '@rastr/grid';\nexport type {\n CopyResult,\n EditMode,\n ExportFormat,\n ExportModule,\n GridExportOptions,\n GridColumn,\n GridEditingOptions,\n GridRowReorderOptions,\n GridDetailOptions,\n HeaderBand,\n GridDetailContext,\n GridDetailHandle,\n RowAction,\n RowChange,\n RowEditing,\n RowReorderEvent,\n SaveErrors,\n Validator,\n} from '@rastr/grid';\n","import { createGridStore, createSavedViews, deserializeState, isSelected, serializeState, RastrError } from '@rastr/core';\nimport type { ColumnState, DataSource, FilterNode, GridExportRequest, GridSnapshot, GridState, GridStore, Key, SavedViews, SavedViewsAdapter, SelectionState } from '@rastr/core';\nimport { createGrid } from '@rastr/grid';\nimport type { CopyResult, ExportFormat, ExportModule, GridPdfOptions, GridColumn, GridEditingOptions, GridEvents, GridExportOptions, GridView, GridViewOptions, Messages, RowChange, GridRowReorderOptions, RowReorderEvent, HeaderBand, GridDetailContext, GridDetailHandle, GridDetailOptions } from '@rastr/grid';\nimport { camelize, defineComponent, Fragment, getCurrentInstance, h, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, Teleport, toRaw, watch } from 'vue';\nimport type { AppContext, ComponentInternalInstance, PropType, Ref, ShallowRef, Slot, SlotsType, VNode } from 'vue';\nimport { createVueCellRenderer, createVueHeaderRenderer, mountSlot, slotAppContext } from './cell-renderer';\nimport type { CellSlotProps } from './cell-renderer';\nimport { createVueEditRenderer } from './edit-renderer';\nimport type { EditSlotProps } from './edit-renderer';\nimport { RS_COLUMN_BOOLEAN_PROPS, RS_COLUMN_NUMBER_PROPS, RsColumn } from './RsColumn';\nimport { toStoreOptions } from './options';\nimport { RsSavedViews } from './RsSavedViews';\nimport type { StateStorageProp } from './options';\n\n/** Props of the #detail slot. */\nexport interface DetailSlotProps<TRow> {\n readonly row: TRow;\n readonly key: Key;\n}\n\nexport interface RsGridExpose<TRow> {\n readonly store: GridStore<TRow>;\n refresh(): Promise<void>;\n setFilter(filter: FilterNode | null): void;\n setColumnFilter(field: string, filter: FilterNode | null): void;\n clearFilters(): void;\n getState(): GridState;\n /** Selected keys; throws when \"select all\" is active, use getSelection() then. */\n getSelectedKeys(): readonly Key[];\n getSelection(): SelectionState;\n /** Selected rows on the current page. */\n getSelectedRows(): readonly TRow[];\n selectAll(): void;\n clearSelection(): void;\n focusRow(key: Key): void;\n /** Opens the detail (#detail slot) of a row on the current page. */\n expandDetail(key: Key): void;\n collapseDetail(key: Key): void;\n isDetailExpanded(key: Key): boolean;\n /** Scrolls a row of the whole result into view (virtual) or opens its page (paged). */\n scrollToIndex(index: number): void;\n /** Exports the current result in a format from the export prop. */\n export(format: ExportFormat): Promise<void>;\n /** Saved views controller; null without the savedViews prop or before mount. */\n readonly savedViews: SavedViews | null;\n /** Columns the grid shows (from the columns prop or RsColumn children); empty before mount. */\n readonly columns: readonly GridColumn<TRow>[];\n}\n\n/**\n * Row type for runtime props. Vue props cannot be generic, and GridColumn<Row> is not assignable to\n * GridColumn<unknown> (callbacks are contravariant), so props accept any row type.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyRow = any;\n\n// Boolean props default to undefined, so \"not set\" keeps the grid's own default.\nconst optionalBoolean = { type: Boolean, default: undefined } as const;\n\nconst EXPORT_FORMATS: readonly ExportFormat[] = ['xlsx', 'csv', 'pdf'];\n\nexport const rsGridProps = {\n dataSource: Object as PropType<DataSource<AnyRow>>,\n keyField: String,\n store: Object as PropType<GridStore<AnyRow>>,\n columns: Array as PropType<GridColumn<AnyRow>[]>,\n selectionMode: String as PropType<'none' | 'single' | 'multiple'>,\n pageSize: Number,\n paging: optionalBoolean,\n scrolling: String as PropType<'paged' | 'virtual'>,\n blockSize: Number,\n stateStorage: [String, Object] as PropType<StateStorageProp>,\n initialState: Object as PropType<Partial<GridState>>,\n /** v-model:state */\n state: Object as PropType<GridState>,\n showCheckboxes: optionalBoolean,\n filterRow: optionalBoolean,\n headerFilter: optionalBoolean,\n columnChooser: optionalBoolean,\n pager: { type: [Boolean, Object] as PropType<false | { readonly pageSizes?: readonly number[] }>, default: undefined },\n toolbar: optionalBoolean,\n rowClass: Function as PropType<(row: AnyRow) => string | undefined>,\n height: String,\n locale: String,\n messages: Object as PropType<Partial<Messages>>,\n theme: String as PropType<'light' | 'dark'>,\n density: String as PropType<'compact' | 'normal' | 'comfortable'>,\n /** Editing; only the mode is structural, callbacks are read when called (inline objects are fine). */\n editing: Object as PropType<GridEditingOptions<AnyRow>>,\n /** Drag handle column; onReorder, canDrag and sortField are read from the latest props on every move. */\n rowReorder: Object as PropType<GridRowReorderOptions<AnyRow>>,\n /** Caption rows above the column headers (bands follow their columns when they move). */\n headerBands: Array as PropType<readonly HeaderBand[]>,\n /** Renders only the body cells in view; 'auto' (default) from 50 data columns. */\n columnVirtualization: { type: [Boolean, String] as PropType<boolean | 'auto'>, default: undefined },\n /** Rows that get a detail toggle (with the #detail slot); defaults to all rows. Read on every render of a row. */\n detailCanExpand: Function as PropType<(row: AnyRow) => boolean>,\n /** Storage of the user's saved views; shows the view picker in the toolbar (unless #toolbar-start is used). */\n savedViews: Object as PropType<SavedViewsAdapter>,\n /** { fileName, sheetName, title, maxRows, formats: { xlsx: () => import('@rastr/export-xlsx'), … } } */\n export: Object as PropType<GridExportOptions>,\n};\n\ninterface ColumnSlots {\n cell?: Slot;\n header?: Slot;\n edit?: Slot;\n}\n\ninterface ChildColumns {\n readonly columns: GridColumn<unknown>[];\n readonly slots: Map<string, ColumnSlots>;\n readonly signature: string;\n}\n\n/** Reads RsColumn vnodes (in template order, through fragments and v-for) into column definitions. */\nfunction readChildColumns(nodes: readonly unknown[] | undefined): ChildColumns | null {\n const columns: GridColumn<unknown>[] = [];\n const slotMap: Map<string, ColumnSlots> = new Map();\n const visit = (node: unknown): void => {\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n const vnode: VNode | null = node && typeof node === 'object' ? (node as VNode) : null;\n if (!vnode) return;\n if (vnode.type === Fragment) {\n visit(vnode.children);\n return;\n }\n if (vnode.type !== RsColumn) return;\n const column: Record<string, unknown> = {};\n for (const [rawKey, rawValue] of Object.entries(vnode.props ?? {})) {\n const key: string = camelize(rawKey);\n // RsColumn is never mounted, so props are not cast by Vue; do the casting here.\n if (RS_COLUMN_BOOLEAN_PROPS.has(key)) column[key] = rawValue === '' || rawValue === true || rawValue === 'true';\n else if (key === 'editable') column[key] = typeof rawValue === 'function' ? rawValue : rawValue === '' || rawValue === true || rawValue === 'true';\n else if (RS_COLUMN_NUMBER_PROPS.has(key)) column[key] = Number(rawValue);\n else column[key] = rawValue;\n }\n const children: Record<string, Slot | undefined> = (vnode.children ?? {}) as Record<string, Slot | undefined>;\n columns.push(column as unknown as GridColumn<unknown>);\n const slots: ColumnSlots = {};\n for (const name of ['cell', 'header', 'edit'] as const) {\n const slot: Slot | undefined = children[name];\n if (slot) slots[name] = slot;\n }\n slotMap.set(String(column['field']), slots);\n };\n visit(nodes);\n if (columns.length === 0) return null;\n const signature: string = JSON.stringify(columns.map((c, i) => [c, slotMap.has(c.field) ? Object.keys(slotMap.get(c.field)!) : [], i]));\n return { columns, slots: slotMap, signature };\n}\n\n/**\n * Columns that did not exist before a rebuild go after their preceding column in definition order\n * (e.g. a RsColumn shown by v-if), instead of being appended at the end.\n */\nfunction placeNewColumns(\n states: readonly ColumnState[],\n definitions: readonly GridColumn<unknown>[],\n previous: readonly ColumnState[],\n): ColumnState[] {\n const known: Set<string> = new Set(previous.map(c => c.field));\n const result: ColumnState[] = states.filter(c => known.has(c.field));\n definitions.forEach((definition, index) => {\n if (known.has(definition.field)) return;\n const state: ColumnState | undefined = states.find(c => c.field === definition.field);\n if (!state) return;\n const before: string | undefined = definitions.slice(0, index).reverse().find(d => result.some(r => r.field === d.field))?.field;\n const at: number = before === undefined ? 0 : result.findIndex(r => r.field === before) + 1;\n result.splice(at, 0, state);\n });\n return result;\n}\n\nconst identities: WeakMap<object, number> = new WeakMap();\nlet nextIdentity: number = 0;\nfunction identity(value: object): number {\n let id: number | undefined = identities.get(value);\n if (id === undefined) {\n id = ++nextIdentity;\n identities.set(value, id);\n }\n return id;\n}\n\n/**\n * Structural signature of props whose change needs a rebuild. Inline literals that are equal by\n * value (e.g. :pager=\"{ pageSizes: [10] }\" or :columns=\"cols.filter(…)\") give the same signature;\n * functions, data sources and stores compare by identity.\n */\nfunction structuralSignature(values: readonly unknown[]): string {\n return JSON.stringify(values, (_key: string, value: unknown) =>\n typeof value === 'function' ? `fn#${identity(value)}` : value,\n );\n}\n\nexport const RsGrid = defineComponent({\n name: 'RsGrid',\n props: rsGridProps,\n emits: {\n rowClick: (payload: GridEvents<AnyRow>['rowClick']) => payload !== undefined,\n rowDblClick: (payload: GridEvents<AnyRow>['rowDblClick']) => payload !== undefined,\n rowActivate: (payload: GridEvents<AnyRow>['rowActivate']) => payload !== undefined,\n focusedRowChange: (payload: GridEvents<AnyRow>['focusedRowChange']) => payload !== undefined,\n selectionChange: (keys: readonly Key[], selection: SelectionState) => keys !== undefined && selection !== undefined,\n stateChange: (state: GridState) => state !== undefined,\n loadError: (error: unknown) => error !== undefined || error === undefined,\n 'update:state': (state: GridState) => state !== undefined,\n copy: (result: CopyResult) => result !== undefined,\n saveError: (payload: GridEvents<AnyRow>['saveError']) => payload !== undefined,\n exportError: (error: unknown) => error !== undefined || error === undefined,\n reorderError: (payload: GridEvents<AnyRow>['reorderError']) => payload !== undefined,\n detailToggle: (payload: GridEvents<AnyRow>['detailToggle']) => payload !== undefined,\n },\n slots: Object as SlotsType<{\n [name: `cell-${string}`]: CellSlotProps<AnyRow>;\n [name: `edit-${string}`]: EditSlotProps<AnyRow>;\n 'toolbar-start': Record<string, never>;\n 'toolbar-end': Record<string, never>;\n detail: DetailSlotProps<AnyRow>;\n default: Record<string, never>;\n }>,\n setup(props, { slots, emit, expose }) {\n const instance: ComponentInternalInstance = getCurrentInstance()!;\n const host: Ref<HTMLElement | null> = ref(null);\n let store: GridStore<unknown> | null = null;\n let ownsStore: boolean = false;\n let grid: GridView<unknown> | null = null;\n let currentColumns: GridColumn<unknown>[] = [];\n let unsubscribe: (() => void) | null = null;\n let children: ChildColumns | null = null;\n let rebuildQueued: boolean = false;\n let mounted: boolean = false;\n let warnedMissingSource: boolean = false;\n // Toolbar slot targets: the grid places them in its toolbar, Vue teleports slot content into them.\n const toolbarTarget = (): HTMLElement => {\n const el: HTMLElement = document.createElement('div');\n el.style.display = 'contents';\n return el;\n };\n const toolbarStart: HTMLElement = toolbarTarget();\n const toolbarEnd: HTMLElement = toolbarTarget();\n const views: ShallowRef<SavedViews | null> = shallowRef(null);\n const showViews = (): boolean => !!props.savedViews && !slots['toolbar-start'];\n\n const requireStore = (): GridStore<unknown> => {\n if (!store) throw new RastrError('vue/not-mounted', 'RsGrid is not mounted yet');\n return store;\n };\n\n const baseColumns = (): GridColumn<unknown>[] => props.columns ?? children?.columns ?? [];\n\n /** Columns with Vue slots (RsGrid #cell-<field> or RsColumn #cell / #header) turned into renderers. */\n const resolveColumns = (): GridColumn<unknown>[] =>\n baseColumns().map(column => {\n const field: string = column.field;\n // Getters read the latest slot functions, which change on every parent render.\n const cellSlot = (): Slot | undefined => (slots[`cell-${field}`] as Slot | undefined) ?? children?.slots.get(field)?.cell;\n const headerSlot = (): Slot | undefined => children?.slots.get(field)?.header;\n const editSlot = (): Slot | undefined => (slots[`edit-${field}`] as Slot | undefined) ?? children?.slots.get(field)?.edit;\n return {\n ...column,\n // An editor slot makes the column editable unless editable says otherwise.\n ...(editSlot() ? { editor: createVueEditRenderer(editSlot, instance), editable: column.editable ?? true } : {}),\n ...(cellSlot() ? { cellRenderer: createVueCellRenderer(cellSlot, instance) } : {}),\n ...(headerSlot() ? { headerRenderer: createVueHeaderRenderer(headerSlot, instance) } : {}),\n };\n });\n\n const viewOptions = (columns: GridColumn<unknown>[], gridStore: GridStore<unknown>): GridViewOptions<unknown> => {\n const options: Record<string, unknown> = { store: gridStore, columns };\n const keys = [\n 'showCheckboxes', 'filterRow', 'headerFilter', 'columnChooser', 'pager',\n 'rowClass', 'height', 'locale', 'messages', 'theme', 'density', 'headerBands', 'columnVirtualization',\n ] as const;\n for (const key of keys) {\n if (props[key] !== undefined) options[key] = props[key];\n }\n options['onCopy'] = (result: CopyResult) => emit('copy', result);\n if (props.editing) options['editing'] = latestEditing(props.editing.mode);\n if (props.rowReorder) options['rowReorder'] = latestReorder();\n if (detailSlot()) options['detail'] = detailOptions();\n if (availableFormats().length > 0) options['export'] = latestExport(availableFormats());\n // Only with a listener: otherwise the grid logs the error instead of it being lost.\n if (instance.vnode.props?.['onExportError']) options['onExportError'] = (error: unknown) => emit('exportError', error);\n if (props.toolbar === false) options['toolbar'] = false;\n else {\n options['toolbar'] = {\n ...(slots['toolbar-start'] || showViews() ? { start: toolbarStart } : {}),\n ...(slots['toolbar-end'] ? { end: toolbarEnd } : {}),\n };\n }\n return options as unknown as GridViewOptions<unknown>;\n };\n\n /** Formats with a loader; a key set to undefined (e.g. not permitted) is not offered. */\n const availableFormats = (): ExportFormat[] => {\n const settings: GridExportOptions | undefined = props.export;\n const server: readonly ExportFormat[] = settings?.server ? (settings.serverFormats ?? EXPORT_FORMATS) : [];\n return EXPORT_FORMATS.filter(format => !!settings?.formats?.[format] || server.includes(format));\n };\n\n /** Export options that read the latest props.export when an export runs. */\n const latestExport = (formats: readonly ExportFormat[]): GridExportOptions => ({\n get fileName(): string | undefined {\n return props.export?.fileName;\n },\n get sheetName(): string | undefined {\n return props.export?.sheetName;\n },\n get title(): string | undefined {\n return props.export?.title;\n },\n get maxRows(): number | undefined {\n return props.export?.maxRows;\n },\n get pdf(): GridPdfOptions | undefined {\n return props.export?.pdf;\n },\n formats: Object.fromEntries(\n formats.filter(format => !!props.export?.formats?.[format]).map(format => [format, (): Promise<ExportModule> => props.export!.formats![format]!()]),\n ) as GridExportOptions['formats'],\n ...(props.export?.server\n ? {\n server: (request: GridExportRequest): Promise<Blob> => props.export!.server!(request),\n serverFormats: formats.filter(format => (props.export?.serverFormats ?? EXPORT_FORMATS).includes(format)),\n }\n : {}),\n });\n\n /** Editing options whose callbacks always call the latest props.editing. */\n const latestEditing = (mode: GridEditingOptions<unknown>['mode']): GridEditingOptions<unknown> => ({\n mode,\n onSave: async (changes: readonly RowChange<unknown>[]) => props.editing?.onSave(changes),\n allowDelete: (row: unknown) => {\n const allow: GridEditingOptions<unknown>['allowDelete'] = props.editing?.allowDelete;\n return typeof allow === 'function' ? allow(row) : allow === true;\n },\n confirmDelete: async (row: unknown) => (props.editing?.confirmDelete ? props.editing.confirmDelete(row) : true),\n });\n\n // Slots are typed as always present; at runtime a slot the parent did not pass is undefined.\n const detailSlot = (): Slot | undefined => slots.detail as Slot | undefined;\n\n /** The #detail slot mounted like cell slots: the parent's app context, its own render effect. */\n const detailOptions = (): GridDetailOptions<unknown> => {\n const appContext: AppContext = slotAppContext(instance);\n return {\n render(container: HTMLElement, ctx: GridDetailContext<unknown>): GridDetailHandle<unknown> {\n const mounted: { update(next: DetailSlotProps<unknown>): void; dispose(): void } = mountSlot(container, detailSlot, { row: ctx.row, key: ctx.key }, appContext);\n // A reloaded row only updates the slot props, so the detail component keeps its state.\n return { update: next => mounted.update({ row: next.row, key: next.key }), dispose: () => mounted.dispose() };\n },\n canExpand: (row: unknown) => props.detailCanExpand?.(row) ?? true,\n };\n };\n\n const latestReorder = (): GridRowReorderOptions<unknown> => ({\n onReorder: (event: RowReorderEvent<unknown>) => props.rowReorder?.onReorder(event),\n canDrag: (row: unknown) => props.rowReorder?.canDrag?.(row) ?? true,\n get sortField(): string | undefined {\n return props.rowReorder?.sortField;\n },\n });\n\n const emitState = (state: GridState): void => {\n emit('stateChange', state);\n emit('update:state', state);\n };\n\n const watchStore = (gridStore: GridStore<unknown>): (() => void) => {\n let last: GridSnapshot<unknown> = gridStore.getSnapshot();\n return gridStore.subscribe(snapshot => {\n const previous: GridSnapshot<unknown> = last;\n last = snapshot;\n if (snapshot.state !== previous.state) emitState(snapshot.state);\n if (snapshot.state.selection !== previous.state.selection) {\n const selection: SelectionState = snapshot.state.selection;\n emit('selectionChange', selection.mode === 'include' ? selection.keys : [], selection);\n }\n if (snapshot.status === 'error' && snapshot.error !== previous.error) emit('loadError', snapshot.error);\n });\n };\n\n const build = (carriedState?: Partial<GridState>): void => {\n if (!host.value) return;\n const columns: GridColumn<unknown>[] = resolveColumns();\n if (props.store) {\n store = props.store;\n ownsStore = false;\n } else {\n if (!props.dataSource || !props.keyField) {\n // A data source often arrives after an async fetch; the grid is built once it does.\n if (!warnedMissingSource) {\n warnedMissingSource = true;\n console.warn('[rastr] RsGrid is waiting for a store or a dataSource with keyField');\n }\n return;\n }\n store = createGridStore(\n toStoreOptions(\n {\n dataSource: props.dataSource,\n keyField: props.keyField,\n selectionMode: props.selectionMode,\n pageSize: props.pageSize,\n paging: props.paging,\n scrolling: props.scrolling,\n blockSize: props.blockSize,\n stateStorage: props.stateStorage,\n initialState: props.state ?? props.initialState,\n },\n columns,\n carriedState,\n ),\n );\n ownsStore = true;\n }\n unsubscribe = watchStore(store);\n currentColumns = columns;\n grid = createGrid(host.value, viewOptions(columns, store));\n grid.on('rowClick', payload => emit('rowClick', payload));\n grid.on('rowDblClick', payload => emit('rowDblClick', payload));\n grid.on('rowActivate', payload => emit('rowActivate', payload));\n grid.on('focusedRowChange', payload => emit('focusedRowChange', payload));\n grid.on('saveError', payload => emit('saveError', payload));\n grid.on('detailToggle', payload => emit('detailToggle', payload));\n // Only with a listener: otherwise the grid logs the failure instead of it being lost.\n if (instance.vnode.props?.['onReorderError']) grid.on('reorderError', payload => emit('reorderError', payload));\n if (props.savedViews) {\n const controller: SavedViews = createSavedViews(store, baseColumns(), props.savedViews);\n views.value = controller;\n // The default view applies on first creation only, and not over a state restored from storage.\n if (!carriedState && !store.restored) void controller.applyDefault();\n else void controller.reload();\n }\n };\n\n const teardown = (): void => {\n views.value?.destroy();\n views.value = null;\n grid?.destroy();\n grid = null;\n unsubscribe?.();\n unsubscribe = null;\n if (ownsStore) store?.destroy();\n store = null;\n };\n\n /** Recreates store and grid; sorting, filters, widths, search and page survive, selection does not. */\n const rebuild = (): void => {\n if (!mounted) return;\n if (!store) {\n build();\n if (store) emit('update:state', (store as GridStore<unknown>).getSnapshot().state);\n return;\n }\n const previous: GridState = store.getSnapshot().state;\n const columns: GridColumn<unknown>[] = baseColumns();\n const restored: Partial<GridState> | null = deserializeState(serializeState(previous), columns);\n const carried: Partial<GridState> | undefined = restored\n ? {\n ...restored,\n ...(restored.columns ? { columns: placeNewColumns(restored.columns, columns, previous.columns) } : {}),\n paging: { pageSize: previous.paging.pageSize, pageIndex: previous.paging.pageIndex },\n }\n : undefined;\n teardown();\n build(carried);\n if (store) emitState((store as GridStore<unknown>).getSnapshot().state);\n };\n\n /** All structural changes in one tick (props and RsColumn children) end in a single rebuild. */\n const queueRebuild = (): void => {\n if (rebuildQueued || !mounted) return;\n rebuildQueued = true;\n void nextTick(() => {\n rebuildQueued = false;\n rebuild();\n });\n };\n\n onMounted(() => {\n mounted = true;\n build();\n // Give v-model:state its initial value.\n if (store) emit('update:state', store.getSnapshot().state);\n });\n onBeforeUnmount(() => {\n mounted = false;\n teardown();\n });\n\n // Structural props need a new store and grid; only a real (structural) difference rebuilds.\n watch(\n () =>\n structuralSignature([\n props.columns,\n props.dataSource,\n props.keyField,\n props.store,\n props.scrolling ?? null,\n props.blockSize ?? null,\n props.selectionMode,\n props.locale,\n props.messages,\n props.filterRow,\n props.headerFilter,\n props.columnChooser,\n props.pager,\n props.showCheckboxes,\n props.toolbar,\n props.editing?.mode ?? null,\n props.rowReorder ? 'reorder' : null,\n props.headerBands ?? null,\n props.columnVirtualization ?? null,\n // The detail column comes and goes with the slot.\n detailSlot() ? 'detail' : null,\n props.savedViews ? `views#${identity(props.savedViews)}` : null,\n // Only the set of formats changes the toolbar; names and loaders are read when exporting.\n availableFormats().join(','),\n ]),\n (next, previous) => {\n if (next !== previous) queueRebuild();\n },\n );\n // v-model:state: the grid's own state coming back is the same reference and is ignored.\n watch(\n () => props.state,\n next => {\n // A parent ref wraps the emitted state in a reactive proxy; compare and store the raw object.\n const raw: GridState | undefined = next ? toRaw(next) : undefined;\n if (raw && store && raw !== store.getSnapshot().state) store.dispatch({ type: 'replaceState', state: raw });\n },\n );\n watch(\n () => [props.theme, props.density, props.rowClass, props.height] as const,\n ([theme, density, rowClass, height]) => grid?.setOptions({ theme, density, rowClass, height }),\n );\n\n const api: RsGridExpose<unknown> = {\n get store(): GridStore<unknown> {\n return requireStore();\n },\n refresh: () => requireStore().reload(),\n setFilter: filter => requireStore().dispatch({ type: 'setFilter', filter }),\n setColumnFilter: (field, filter) => requireStore().dispatch({ type: 'setColumnFilter', field, filter }),\n clearFilters(): void {\n requireStore().dispatch({ type: 'setFilter', filter: null });\n requireStore().dispatch({ type: 'setSearch', search: '' });\n },\n getState: () => requireStore().getSnapshot().state,\n getSelectedKeys(): readonly Key[] {\n const selection: SelectionState = requireStore().getSnapshot().state.selection;\n if (selection.mode === 'exclude') {\n throw new RastrError('vue/selection-all', 'All rows are selected; use getSelection() to read the exclusion list');\n }\n return selection.keys;\n },\n getSelection: () => requireStore().getSnapshot().state.selection,\n getSelectedRows(): readonly unknown[] {\n const gridStore: GridStore<unknown> = requireStore();\n const { rows, state } = gridStore.getSnapshot();\n return rows.filter(row => isSelected(state.selection, gridStore.getRowKey(row)));\n },\n selectAll: () => requireStore().dispatch({ type: 'selectAll' }),\n clearSelection: () => requireStore().dispatch({ type: 'clearSelection' }),\n focusRow: key => grid?.focusRow(key),\n expandDetail: key => grid?.expandDetail(key),\n collapseDetail: key => grid?.collapseDetail(key),\n isDetailExpanded: key => grid?.isDetailExpanded(key) ?? false,\n scrollToIndex: index => grid?.scrollToIndex(index),\n export: (format: ExportFormat) => grid?.export(format) ?? Promise.resolve(),\n get savedViews(): SavedViews | null {\n return views.value;\n },\n get columns(): readonly GridColumn<unknown>[] {\n return currentColumns;\n },\n };\n expose(api);\n\n return () => {\n const declared: ChildColumns | null = readChildColumns(slots.default?.({}));\n if (declared && props.columns) {\n throw new RastrError('vue/columns-twice', 'RsGrid got both the columns prop and RsColumn children; use one of them');\n }\n const changed: boolean = (declared?.signature ?? '') !== (children?.signature ?? '');\n children = declared;\n if (changed) queueRebuild();\n const nodes: VNode[] = [h('div', { ref: host })];\n const start: Slot | undefined = slots['toolbar-start'];\n const end: Slot | undefined = slots['toolbar-end'];\n if (start) nodes.push(h(Teleport, { to: toolbarStart }, start()));\n else if (showViews() && views.value && store) {\n nodes.push(\n h(Teleport, { to: toolbarStart }, [\n h(RsSavedViews, { views: views.value, store, columns: baseColumns(), ...(props.locale ? { locale: props.locale } : {}) }),\n ]),\n );\n }\n if (end) nodes.push(h(Teleport, { to: toolbarEnd }, end()));\n return h('div', { class: 'rs-vue' }, nodes);\n };\n },\n});\n","import type { Key } from '@rastr/core';\nimport type { CellContext, CellRenderer, CellRendererHandle, GridColumn, HeaderRenderer } from '@rastr/grid';\nimport { createVNode, defineComponent, render, shallowRef } from 'vue';\nimport type { AppContext, ComponentInternalInstance, PropType, ShallowRef, Slot, VNode } from 'vue';\n\nexport interface CellSlotProps<TRow> {\n readonly row: TRow;\n readonly value: unknown;\n readonly text: string;\n readonly key: Key;\n readonly rowIndex: number;\n readonly column: GridColumn<TRow>;\n}\n\nfunction toSlotProps<TRow>(ctx: CellContext<TRow>): CellSlotProps<TRow> {\n return {\n row: ctx.row,\n value: ctx.value,\n text: ctx.text,\n key: ctx.key,\n column: ctx.column,\n get rowIndex(): number {\n return ctx.rowIndex;\n },\n };\n}\n\n/** Renders the slot inside its own render effect, so reactive parent state used by the slot is tracked. */\nconst CellHost = defineComponent({\n name: 'RsCell',\n props: {\n state: { type: Object as PropType<ShallowRef<CellSlotProps<unknown>>>, required: true },\n getSlot: { type: Function as PropType<() => Slot | undefined>, required: true },\n },\n setup(props) {\n return () => props.getSlot()?.(props.state.value) ?? null;\n },\n});\n\n/** App context that carries the parent's provides, so inject() inside slots resolves like in the parent. */\nexport function slotAppContext(parent: ComponentInternalInstance): AppContext {\n // provides is internal API; it chains the parent's provide() values to the app's.\n const provides: Record<string | symbol, unknown> = (parent as unknown as { provides: Record<string | symbol, unknown> })\n .provides;\n return { ...parent.appContext, provides };\n}\n\n/** Mounts a slot into a container; the returned setter updates the slot props in place. */\nexport function mountSlot<TProps>(\n container: HTMLElement,\n getSlot: () => Slot | undefined,\n initial: TProps,\n appContext: AppContext,\n): { update(next: TProps): void; dispose(): void } {\n const state: ShallowRef<TProps> = shallowRef(initial);\n const vnode: VNode = createVNode(CellHost, { state, getSlot });\n vnode.appContext = appContext;\n render(vnode, container);\n return {\n update(next: TProps): void {\n state.value = next;\n },\n dispose(): void {\n render(null, container);\n },\n };\n}\n\n/**\n * Creates a cell renderer that mounts a Vue slot into each cell. The slot sees the parent's app\n * context and provides (global components, plugins, inject), and a new row object for the same\n * key only updates the slot props, so components in cells keep their state.\n */\nexport function createVueCellRenderer<TRow>(\n getSlot: () => Slot | undefined,\n parent: ComponentInternalInstance,\n): CellRenderer<TRow> {\n const appContext: AppContext = slotAppContext(parent);\n return (container: HTMLElement, ctx: CellContext<TRow>): CellRendererHandle<TRow> => {\n const mounted = mountSlot(container, getSlot, toSlotProps(ctx), appContext);\n return {\n update: (next: CellContext<TRow>) => mounted.update(toSlotProps(next)),\n dispose: () => mounted.dispose(),\n };\n };\n}\n\nexport interface HeaderSlotProps<TRow> {\n readonly column: GridColumn<TRow>;\n readonly caption: string;\n}\n\n/** Header renderer that mounts a Vue slot with { column, caption }. */\nexport function createVueHeaderRenderer<TRow>(\n getSlot: () => Slot | undefined,\n parent: ComponentInternalInstance,\n): HeaderRenderer<TRow> {\n const appContext: AppContext = slotAppContext(parent);\n return (container: HTMLElement, ctx: HeaderSlotProps<TRow>): (() => void) =>\n mountSlot(container, getSlot, { column: ctx.column, caption: ctx.caption }, appContext).dispose;\n}\n","import type { EditorContext, EditorRenderer, GridColumn } from '@rastr/grid';\nimport type { AppContext, ComponentInternalInstance, Slot } from 'vue';\nimport { mountSlot, slotAppContext } from './cell-renderer';\n\nexport interface EditSlotProps<TRow> {\n readonly row: TRow;\n readonly value: unknown;\n readonly column: GridColumn<TRow>;\n setValue(value: unknown): void;\n commit(): void;\n cancel(): void;\n}\n\nconst FOCUSABLE: string = 'input, select, textarea, button, [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Editor renderer that mounts a Vue slot into the editing cell. setValue updates the slot props in\n * place (v-model components re-render, they are not remounted) and passes the value to the grid.\n */\nexport function createVueEditRenderer<TRow>(getSlot: () => Slot | undefined, parent: ComponentInternalInstance): EditorRenderer<TRow> {\n const appContext: AppContext = slotAppContext(parent);\n return (container: HTMLElement, ctx: EditorContext<TRow>) => {\n const props = (value: unknown): EditSlotProps<TRow> => ({\n row: ctx.row,\n value,\n column: ctx.column,\n setValue,\n commit: ctx.commit,\n cancel: ctx.cancel,\n });\n const setValue = (value: unknown): void => {\n ctx.setValue(value);\n mounted.update(props(value));\n };\n const mounted = mountSlot(container, getSlot, props(ctx.value), appContext);\n return {\n focus: () => container.querySelector<HTMLElement>(FOCUSABLE)?.focus(),\n dispose: () => mounted.dispose(),\n };\n };\n}\n","import type { ColumnSummary, ConditionOp, DataType, FilterNode, LookupItem, SummaryValue } from '@rastr/core';\nimport type { Align, Validator, ValueFormat } from '@rastr/grid';\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\n\nconst optionalBoolean = { type: Boolean, default: undefined } as const;\n\n/**\n * Declarative column for RsGrid. It renders nothing: RsGrid reads RsColumn children (props and\n * the #cell / #header / #edit slots) to build its column list, in template order.\n */\nexport const RsColumn = defineComponent({\n name: 'RsColumn',\n props: {\n field: { type: String, required: true },\n caption: String,\n dataType: String as PropType<DataType>,\n visible: optionalBoolean,\n width: [Number, String],\n minWidth: [Number, String],\n pinned: String as PropType<'start' | 'end'>,\n align: String as PropType<Align>,\n sortable: optionalBoolean,\n filterable: optionalBoolean,\n searchable: optionalBoolean,\n headerFilter: optionalBoolean,\n resizable: optionalBoolean,\n reorderable: optionalBoolean,\n lookup: Array as PropType<readonly LookupItem[]>,\n format: [Object, Function] as PropType<ValueFormat<unknown>>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: Function as PropType<(row: any) => unknown>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sortValue: Function as PropType<(row: any) => unknown>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellClass: Function as PropType<(row: any) => string | undefined>,\n toFilter: Function as PropType<(value: unknown, op: ConditionOp) => FilterNode | null>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editable: { type: [Boolean, Function] as PropType<boolean | ((row: any) => boolean)>, default: undefined },\n validate: Array as PropType<readonly Validator<unknown>[]>,\n /** Total summaries of the column: 'sum', 'avg', 'min', 'max', 'count' or a custom one. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n summary: Array as PropType<readonly ColumnSummary<any>[]>,\n summaryFormat: Function as PropType<(value: unknown, summary: SummaryValue) => string>,\n /** On a narrow grid the lowest priority hides first. */\n hidingPriority: [Number, String],\n },\n setup() {\n return () => null;\n },\n});\n\nexport const RS_COLUMN_BOOLEAN_PROPS: ReadonlySet<string> = new Set([\n 'visible', 'sortable', 'filterable', 'searchable', 'headerFilter', 'resizable', 'reorderable',\n]);\nexport const RS_COLUMN_NUMBER_PROPS: ReadonlySet<string> = new Set(['width', 'minWidth', 'hidingPriority']);\n","import { createWebStorage, RastrError } from '@rastr/core';\nimport type { DataSource, GridState, GridStoreOptions, PersistenceOptions, StateStorage } from '@rastr/core';\nimport type { GridColumn } from '@rastr/grid';\n\nexport type StateStorageProp =\n | `local:${string}`\n | `session:${string}`\n | { readonly key: string; readonly storage: StateStorage };\n\nexport interface RsGridStoreProps<TRow> {\n readonly dataSource: DataSource<TRow>;\n readonly keyField: string;\n readonly selectionMode?: 'none' | 'single' | 'multiple' | undefined;\n readonly pageSize?: number | undefined;\n /** Defaults to true. */\n readonly paging?: boolean | undefined;\n /** 'virtual' renders the visible rows only and loads blocks while scrolling; needs height. */\n readonly scrolling?: 'paged' | 'virtual' | undefined;\n readonly blockSize?: number | undefined;\n readonly stateStorage?: StateStorageProp | undefined;\n readonly initialState?: Partial<GridState> | undefined;\n}\n\nexport function toPersistence(prop: StateStorageProp | undefined): PersistenceOptions | undefined {\n if (prop === undefined) return undefined;\n if (typeof prop !== 'string') return { key: prop.key, storage: prop.storage };\n const separator: number = prop.indexOf(':');\n const kind: string = prop.slice(0, separator);\n const key: string = prop.slice(separator + 1);\n if ((kind !== 'local' && kind !== 'session') || key === '') {\n throw new RastrError('vue/state-storage', `Invalid stateStorage \"${prop}\"; use \"local:<key>\", \"session:<key>\" or { key, storage }`);\n }\n return { key, storage: createWebStorage(kind) };\n}\n\n/**\n * Maps RsGrid props to store options. Carried state (from a rebuild) wins over initialState; the\n * rebuilt store keeps saving but does not restore, because the carried state is newer.\n */\nexport function toStoreOptions<TRow>(\n props: RsGridStoreProps<TRow>,\n columns: readonly GridColumn<TRow>[],\n carriedState?: Partial<GridState>,\n): GridStoreOptions<TRow> {\n const configured: PersistenceOptions | undefined = toPersistence(props.stateStorage);\n const persistence: PersistenceOptions | undefined =\n configured && carriedState ? { ...configured, restore: false } : configured;\n const initialState: Partial<GridState> | undefined =\n carriedState || props.initialState ? { ...props.initialState, ...carriedState } : undefined;\n return {\n columns,\n dataSource: props.dataSource,\n keyField: props.keyField,\n ...(props.selectionMode ? { selectionMode: props.selectionMode } : {}),\n ...(props.pageSize ? { pageSize: props.pageSize } : {}),\n ...(props.paging === false ? { pagingEnabled: false } : {}),\n ...(props.scrolling ? { scrolling: props.scrolling } : {}),\n ...(props.blockSize ? { blockSize: props.blockSize } : {}),\n ...(initialState ? { initialState } : {}),\n ...(persistence ? { persistence } : {}),\n };\n}\n","import { isSavedView } from '@rastr/core';\nimport type { ColumnDef, FilterNode, GridStore, SavedView, SavedViews, SavedViewsSnapshot } from '@rastr/core';\nimport { createSelect } from '@rastr/controls';\nimport type { SelectControl, SelectOption } from '@rastr/controls';\nimport { defineComponent, h, onBeforeUnmount, onMounted, ref, shallowRef, toRaw, watch } from 'vue';\nimport type { PropType, Ref, ShallowRef, VNode } from 'vue';\nimport { RsFilterBuilder } from './RsFilterBuilder';\n\nexport interface SavedViewsMessages {\n readonly view: string;\n readonly noView: string;\n readonly newView: string;\n readonly edit: string;\n readonly remove: string;\n readonly name: string;\n readonly isDefault: string;\n readonly save: string;\n readonly cancel: string;\n readonly confirmRemove: string;\n}\n\nconst MESSAGES: Readonly<Record<'cs' | 'en', SavedViewsMessages>> = {\n cs: {\n view: 'Pohled',\n noView: '(bez pohledu)',\n newView: 'Nový pohled',\n edit: 'Upravit',\n remove: 'Smazat',\n name: 'Název',\n isDefault: 'Výchozí',\n save: 'Uložit',\n cancel: 'Zrušit',\n confirmRemove: 'Smazat pohled „{name}“?',\n },\n en: {\n view: 'View',\n noView: '(no view)',\n newView: 'New view',\n edit: 'Edit',\n remove: 'Delete',\n name: 'Name',\n isDefault: 'Default',\n save: 'Save',\n cancel: 'Cancel',\n confirmRemove: 'Delete view \"{name}\"?',\n },\n};\n\n/** View picker with \"new / edit / delete\" and a dialog with the filter builder. */\nexport const RsSavedViews = defineComponent({\n name: 'RsSavedViews',\n props: {\n views: { type: Object as PropType<SavedViews>, required: true },\n store: { type: Object as PropType<GridStore<unknown>>, required: true },\n columns: { type: Array as PropType<readonly ColumnDef<unknown>[]>, required: true },\n /** Asked before a view is deleted; defaults to window.confirm. */\n confirm: Function as PropType<(message: string) => Promise<boolean>>,\n locale: String,\n messages: Object as PropType<Partial<SavedViewsMessages>>,\n },\n setup(props) {\n const text = (): SavedViewsMessages => ({ ...MESSAGES[props.locale?.toLowerCase().startsWith('en') ? 'en' : 'cs'], ...props.messages });\n const snapshot: ShallowRef<SavedViewsSnapshot> = shallowRef(props.views.getSnapshot());\n let unsubscribe: () => void = props.views.subscribe(next => (snapshot.value = next));\n watch(\n () => props.views,\n views => {\n unsubscribe();\n snapshot.value = views.getSnapshot();\n unsubscribe = views.subscribe(next => (snapshot.value = next));\n },\n );\n onBeforeUnmount(() => unsubscribe());\n\n // The view picker is the controls select (same look as the grid's filters), created on mount (it needs\n // the DOM) and kept in sync with the list, the current view and the language.\n let picker: SelectControl | null = null;\n let shownOptions: string = '';\n const pickerHost: Ref<HTMLElement | null> = ref(null);\n const syncPicker = (): void => {\n if (!picker) return;\n const t: SavedViewsMessages = text();\n const options: SelectOption[] = [\n { value: '', label: t.noView },\n ...snapshot.value.views.map(view => ({\n value: view.id,\n label: view.name,\n ...(isSavedView(view) ? {} : { disabled: true, title: view.invalid }),\n })),\n ];\n // New options close an open list; the same ones (a reload) leave it open.\n const key: string = JSON.stringify(options);\n if (key !== shownOptions) {\n shownOptions = key;\n picker.setOptions(options);\n }\n picker.setValue(snapshot.value.currentId ?? '');\n picker.setLabel(t.view);\n };\n onMounted(() => {\n picker = createSelect({\n options: [],\n value: '',\n label: text().view,\n className: 'rs-fb__select',\n onChange: id => {\n if (id) props.views.apply(id);\n },\n });\n pickerHost.value?.append(picker.element);\n syncPicker();\n });\n onBeforeUnmount(() => picker?.destroy());\n watch(() => [snapshot.value, props.locale, props.messages], syncPicker);\n\n const dialog: Ref<HTMLDialogElement | null> = ref(null);\n const builder: Ref<{ flush(): void } | null> = ref(null);\n const editingId: Ref<string | null> = ref(null);\n const name: Ref<string> = ref('');\n const isDefault: Ref<boolean> = ref(false);\n const filter: ShallowRef<FilterNode | null> = shallowRef(null);\n const error: Ref<string> = ref('');\n const open: Ref<boolean> = ref(false);\n\n const current = (): SavedView | undefined => {\n const view = snapshot.value.views.find(v => v.id === snapshot.value.currentId);\n return view && isSavedView(view) ? view : undefined;\n };\n\n const show = (view: SavedView | undefined): void => {\n editingId.value = view?.id ?? null;\n name.value = view?.name ?? '';\n isDefault.value = view?.isDefault ?? false;\n filter.value = props.store.getSnapshot().state.filter;\n error.value = '';\n open.value = true;\n const el: HTMLDialogElement | null = dialog.value;\n // jsdom and old browsers lack showModal; the open attribute still shows the dialog.\n if (el && typeof el.showModal === 'function') el.showModal();\n else el?.setAttribute('open', '');\n };\n const close = (): void => {\n open.value = false;\n const el: HTMLDialogElement | null = dialog.value;\n if (el && typeof el.close === 'function') el.close();\n else el?.removeAttribute('open');\n };\n\n const save = async (): Promise<void> => {\n if (name.value.trim() === '') return;\n builder.value?.flush();\n props.store.dispatch({ type: 'setFilter', filter: filter.value });\n try {\n await props.views.saveCurrent({ ...(editingId.value ? { id: editingId.value } : {}), name: name.value.trim(), isDefault: isDefault.value });\n close();\n } catch (reason) {\n error.value = reason instanceof Error ? reason.message : String(reason);\n }\n };\n\n const remove = async (): Promise<void> => {\n const view: SavedView | undefined = current();\n if (!view) return;\n const message: string = text().confirmRemove.replace('{name}', view.name);\n const confirmed: boolean = props.confirm ? await props.confirm(message) : window.confirm(message);\n if (!confirmed) return;\n try {\n await props.views.remove(view.id);\n } catch {\n // The controller keeps the error in its snapshot and has reloaded the list.\n }\n };\n\n const describe = (reason: unknown): string => (reason instanceof Error ? reason.message : String(reason));\n\n const loadValues = (field: string, search: string): Promise<readonly unknown[]> => props.store.loadDistinct(field, { search });\n\n return (): VNode => {\n const t: SavedViewsMessages = text();\n return h('div', { class: 'rs-fb rs-fb__views' }, [\n // Host of the picker (a controls select appended on mount).\n h('span', { ref: pickerHost, style: 'display: contents' }),\n h('button', { type: 'button', class: 'rs-fb__btn rs-fb__add', onClick: () => show(undefined) }, t.newView),\n h('button', { type: 'button', class: 'rs-fb__btn', disabled: !current(), onClick: () => show(current()) }, t.edit),\n h('button', { type: 'button', class: 'rs-fb__btn rs-fb__danger', disabled: !current(), onClick: () => void remove() }, t.remove),\n // Failed list loads and deletes; save errors are shown in the dialog.\n snapshot.value.status === 'error' && !open.value\n ? h('p', { class: 'rs-fb__error', role: 'alert' }, describe(snapshot.value.error))\n : null,\n h('dialog', { ref: dialog, class: 'rs-fb rs-fb__dialog', onClose: () => (open.value = false) }, [\n h('label', { class: 'rs-fb__field-label' }, [\n t.name,\n h('input', {\n class: 'rs-fb__input',\n name: 'name',\n value: name.value,\n onInput: (event: Event) => (name.value = (event.target as HTMLInputElement).value),\n }),\n ]),\n h('label', { class: 'rs-fb__negate' }, [\n h('input', {\n class: 'rs-fb__check',\n type: 'checkbox',\n name: 'isDefault',\n checked: isDefault.value,\n onChange: (event: Event) => (isDefault.value = (event.target as HTMLInputElement).checked),\n }),\n t.isDefault,\n ]),\n // The builder is mounted only while the dialog is open, over the grid's current filter.\n open.value\n ? h(RsFilterBuilder, {\n ref: builder,\n modelValue: filter.value,\n 'onUpdate:modelValue': (value: FilterNode | null) => (filter.value = value),\n columns: toRaw(props.columns),\n loadValues,\n ...(props.locale ? { locale: props.locale } : {}),\n })\n : null,\n error.value ? h('p', { class: 'rs-fb__error', role: 'alert' }, error.value) : null,\n h('div', { class: 'rs-fb__dialog-actions' }, [\n h('button', { type: 'button', class: 'rs-fb__btn', onClick: close }, t.cancel),\n h('button', { type: 'button', class: 'rs-fb__btn rs-fb__primary', onClick: () => void save() }, t.save),\n ]),\n ]),\n ]);\n };\n },\n});\n","import type { ColumnDef, FilterNode } from '@rastr/core';\nimport { createFilterBuilder } from '@rastr/filter-builder';\nimport type { FilterBuilder, FilterBuilderMessages } from '@rastr/filter-builder';\nimport { defineComponent, h, onBeforeUnmount, onMounted, ref, toRaw, watch } from 'vue';\nimport type { PropType, Ref } from 'vue';\n\n/** v-model wrapper of the vanilla filter builder. */\nexport const RsFilterBuilder = defineComponent({\n name: 'RsFilterBuilder',\n props: {\n modelValue: { type: Object as PropType<FilterNode | null>, default: null },\n columns: { type: Array as PropType<readonly ColumnDef<unknown>[]>, required: true },\n loadValues: Function as PropType<(field: string, search: string) => Promise<readonly unknown[]>>,\n locale: String,\n messages: Object as PropType<Partial<FilterBuilderMessages>>,\n },\n emits: {\n 'update:modelValue': (value: FilterNode | null) => value !== undefined,\n },\n setup(props, { emit, expose }) {\n const host: Ref<HTMLElement | null> = ref(null);\n let builder: FilterBuilder | null = null;\n\n const create = (): void => {\n if (!host.value) return;\n builder?.destroy();\n builder = createFilterBuilder(host.value, {\n columns: toRaw(props.columns),\n value: props.modelValue ? toRaw(props.modelValue) : null,\n onChange: value => emit('update:modelValue', value),\n ...(props.locale ? { locale: props.locale } : {}),\n ...(props.messages ? { messages: props.messages } : {}),\n ...(props.loadValues ? { loadValues: props.loadValues } : {}),\n });\n };\n\n // Reports a value still waiting for the text debounce (e.g. before saving).\n expose({ flush: (): void => builder?.flush() });\n\n onMounted(create);\n onBeforeUnmount(() => {\n builder?.destroy();\n builder = null;\n });\n // The builder keeps a draft with incomplete rows; setValue ignores the value it just reported.\n watch(\n () => props.modelValue,\n value => builder?.setValue(value ? toRaw(value) : null),\n );\n watch(() => [props.columns, props.locale, props.messages], create);\n\n return () => h('div', { ref: host, class: 'rs-vue-filter-builder' });\n },\n});\n","import type { GridColumn } from '@rastr/grid';\n\n/** Identity helper that types column definitions for a row type in <script setup>. */\nexport function defineColumns<TRow>(columns: GridColumn<TRow>[]): GridColumn<TRow>[] {\n return columns;\n}\n"],"mappings":"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","names":["import_core","import_vue","import_vue","import_core","import_vue","import_vue","optionalBoolean","mounted","import_core","import_grid"]}
@@ -0,0 +1,222 @@
1
+ export { C as CellSlotProps, D as DetailSlotProps, E as EditSlotProps, H as HeaderSlotProps, R as RsGrid, a as RsGridExpose, b as RsGridStoreProps, S as StateStorageProp, c as createVueCellRenderer, d as createVueHeaderRenderer } from './RsGrid-CuQ785Nt.cjs';
2
+ import * as vue from 'vue';
3
+ import { PropType, VNode } from 'vue';
4
+ import { DataType, LookupItem, ConditionOp, FilterNode, ColumnSummary, SummaryValue, ColumnDef, SavedViews, GridStore } from '@rastr/core';
5
+ export { DataSource, FilterNode, GridExportRequest, GridState, Key, SavedView, SavedViews, SavedViewsAdapter, SelectionState, StoredView, and, cond, createArrayDataSource, createRemoteExport, createSavedViews, not, or } from '@rastr/core';
6
+ import { Align, ValueFormat, Validator, GridColumn } from '@rastr/grid';
7
+ export { CopyResult, EditMode, ExportFormat, ExportModule, GridColumn, GridDetailContext, GridDetailHandle, GridDetailOptions, GridEditingOptions, GridExportOptions, GridRowReorderOptions, HeaderBand, RowAction, RowChange, RowEditing, RowReorderEvent, SaveErrors, Validator, actionsColumn, custom, editActionsColumn, pattern, range, required, rowNumberColumn } from '@rastr/grid';
8
+ import { FilterBuilderMessages } from '@rastr/filter-builder';
9
+
10
+ /**
11
+ * Declarative column for RsGrid. It renders nothing: RsGrid reads RsColumn children (props and
12
+ * the #cell / #header / #edit slots) to build its column list, in template order.
13
+ */
14
+ declare const RsColumn: vue.DefineComponent<vue.ExtractPropTypes<{
15
+ field: {
16
+ type: StringConstructor;
17
+ required: true;
18
+ };
19
+ caption: StringConstructor;
20
+ dataType: PropType<DataType>;
21
+ visible: {
22
+ readonly type: BooleanConstructor;
23
+ readonly default: undefined;
24
+ };
25
+ width: (NumberConstructor | StringConstructor)[];
26
+ minWidth: (NumberConstructor | StringConstructor)[];
27
+ pinned: PropType<"start" | "end">;
28
+ align: PropType<Align>;
29
+ sortable: {
30
+ readonly type: BooleanConstructor;
31
+ readonly default: undefined;
32
+ };
33
+ filterable: {
34
+ readonly type: BooleanConstructor;
35
+ readonly default: undefined;
36
+ };
37
+ searchable: {
38
+ readonly type: BooleanConstructor;
39
+ readonly default: undefined;
40
+ };
41
+ headerFilter: {
42
+ readonly type: BooleanConstructor;
43
+ readonly default: undefined;
44
+ };
45
+ resizable: {
46
+ readonly type: BooleanConstructor;
47
+ readonly default: undefined;
48
+ };
49
+ reorderable: {
50
+ readonly type: BooleanConstructor;
51
+ readonly default: undefined;
52
+ };
53
+ lookup: PropType<readonly LookupItem[]>;
54
+ format: PropType<ValueFormat<unknown>>;
55
+ value: PropType<(row: any) => unknown>;
56
+ sortValue: PropType<(row: any) => unknown>;
57
+ cellClass: PropType<(row: any) => string | undefined>;
58
+ toFilter: PropType<(value: unknown, op: ConditionOp) => FilterNode | null>;
59
+ editable: {
60
+ type: PropType<boolean | ((row: any) => boolean)>;
61
+ default: undefined;
62
+ };
63
+ validate: PropType<readonly Validator<unknown>[]>;
64
+ /** Total summaries of the column: 'sum', 'avg', 'min', 'max', 'count' or a custom one. */
65
+ summary: PropType<readonly ColumnSummary<any>[]>;
66
+ summaryFormat: PropType<(value: unknown, summary: SummaryValue) => string>;
67
+ /** On a narrow grid the lowest priority hides first. */
68
+ hidingPriority: (NumberConstructor | StringConstructor)[];
69
+ }>, () => null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
70
+ field: {
71
+ type: StringConstructor;
72
+ required: true;
73
+ };
74
+ caption: StringConstructor;
75
+ dataType: PropType<DataType>;
76
+ visible: {
77
+ readonly type: BooleanConstructor;
78
+ readonly default: undefined;
79
+ };
80
+ width: (NumberConstructor | StringConstructor)[];
81
+ minWidth: (NumberConstructor | StringConstructor)[];
82
+ pinned: PropType<"start" | "end">;
83
+ align: PropType<Align>;
84
+ sortable: {
85
+ readonly type: BooleanConstructor;
86
+ readonly default: undefined;
87
+ };
88
+ filterable: {
89
+ readonly type: BooleanConstructor;
90
+ readonly default: undefined;
91
+ };
92
+ searchable: {
93
+ readonly type: BooleanConstructor;
94
+ readonly default: undefined;
95
+ };
96
+ headerFilter: {
97
+ readonly type: BooleanConstructor;
98
+ readonly default: undefined;
99
+ };
100
+ resizable: {
101
+ readonly type: BooleanConstructor;
102
+ readonly default: undefined;
103
+ };
104
+ reorderable: {
105
+ readonly type: BooleanConstructor;
106
+ readonly default: undefined;
107
+ };
108
+ lookup: PropType<readonly LookupItem[]>;
109
+ format: PropType<ValueFormat<unknown>>;
110
+ value: PropType<(row: any) => unknown>;
111
+ sortValue: PropType<(row: any) => unknown>;
112
+ cellClass: PropType<(row: any) => string | undefined>;
113
+ toFilter: PropType<(value: unknown, op: ConditionOp) => FilterNode | null>;
114
+ editable: {
115
+ type: PropType<boolean | ((row: any) => boolean)>;
116
+ default: undefined;
117
+ };
118
+ validate: PropType<readonly Validator<unknown>[]>;
119
+ /** Total summaries of the column: 'sum', 'avg', 'min', 'max', 'count' or a custom one. */
120
+ summary: PropType<readonly ColumnSummary<any>[]>;
121
+ summaryFormat: PropType<(value: unknown, summary: SummaryValue) => string>;
122
+ /** On a narrow grid the lowest priority hides first. */
123
+ hidingPriority: (NumberConstructor | StringConstructor)[];
124
+ }>> & Readonly<{}>, {
125
+ visible: boolean;
126
+ sortable: boolean;
127
+ headerFilter: boolean;
128
+ editable: boolean | ((row: any) => boolean);
129
+ resizable: boolean;
130
+ reorderable: boolean;
131
+ filterable: boolean;
132
+ searchable: boolean;
133
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
134
+
135
+ /** Identity helper that types column definitions for a row type in <script setup>. */
136
+ declare function defineColumns<TRow>(columns: GridColumn<TRow>[]): GridColumn<TRow>[];
137
+
138
+ /** v-model wrapper of the vanilla filter builder. */
139
+ declare const RsFilterBuilder: vue.DefineComponent<vue.ExtractPropTypes<{
140
+ modelValue: {
141
+ type: PropType<FilterNode | null>;
142
+ default: null;
143
+ };
144
+ columns: {
145
+ type: PropType<readonly ColumnDef<unknown>[]>;
146
+ required: true;
147
+ };
148
+ loadValues: PropType<(field: string, search: string) => Promise<readonly unknown[]>>;
149
+ locale: StringConstructor;
150
+ messages: PropType<Partial<FilterBuilderMessages>>;
151
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
152
+ [key: string]: any;
153
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
154
+ 'update:modelValue': (value: FilterNode | null) => boolean;
155
+ }, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
156
+ modelValue: {
157
+ type: PropType<FilterNode | null>;
158
+ default: null;
159
+ };
160
+ columns: {
161
+ type: PropType<readonly ColumnDef<unknown>[]>;
162
+ required: true;
163
+ };
164
+ loadValues: PropType<(field: string, search: string) => Promise<readonly unknown[]>>;
165
+ locale: StringConstructor;
166
+ messages: PropType<Partial<FilterBuilderMessages>>;
167
+ }>> & Readonly<{
168
+ "onUpdate:modelValue"?: (value: FilterNode | null) => any;
169
+ }>, {
170
+ modelValue: FilterNode | null;
171
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
172
+
173
+ interface SavedViewsMessages {
174
+ readonly view: string;
175
+ readonly noView: string;
176
+ readonly newView: string;
177
+ readonly edit: string;
178
+ readonly remove: string;
179
+ readonly name: string;
180
+ readonly isDefault: string;
181
+ readonly save: string;
182
+ readonly cancel: string;
183
+ readonly confirmRemove: string;
184
+ }
185
+ /** View picker with "new / edit / delete" and a dialog with the filter builder. */
186
+ declare const RsSavedViews: vue.DefineComponent<vue.ExtractPropTypes<{
187
+ views: {
188
+ type: PropType<SavedViews>;
189
+ required: true;
190
+ };
191
+ store: {
192
+ type: PropType<GridStore<unknown>>;
193
+ required: true;
194
+ };
195
+ columns: {
196
+ type: PropType<readonly ColumnDef<unknown>[]>;
197
+ required: true;
198
+ };
199
+ /** Asked before a view is deleted; defaults to window.confirm. */
200
+ confirm: PropType<(message: string) => Promise<boolean>>;
201
+ locale: StringConstructor;
202
+ messages: PropType<Partial<SavedViewsMessages>>;
203
+ }>, () => VNode, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
204
+ views: {
205
+ type: PropType<SavedViews>;
206
+ required: true;
207
+ };
208
+ store: {
209
+ type: PropType<GridStore<unknown>>;
210
+ required: true;
211
+ };
212
+ columns: {
213
+ type: PropType<readonly ColumnDef<unknown>[]>;
214
+ required: true;
215
+ };
216
+ /** Asked before a view is deleted; defaults to window.confirm. */
217
+ confirm: PropType<(message: string) => Promise<boolean>>;
218
+ locale: StringConstructor;
219
+ messages: PropType<Partial<SavedViewsMessages>>;
220
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
221
+
222
+ export { RsColumn, RsFilterBuilder, RsSavedViews, type SavedViewsMessages, defineColumns };
@@ -0,0 +1,222 @@
1
+ export { C as CellSlotProps, D as DetailSlotProps, E as EditSlotProps, H as HeaderSlotProps, R as RsGrid, a as RsGridExpose, b as RsGridStoreProps, S as StateStorageProp, c as createVueCellRenderer, d as createVueHeaderRenderer } from './RsGrid-CuQ785Nt.js';
2
+ import * as vue from 'vue';
3
+ import { PropType, VNode } from 'vue';
4
+ import { DataType, LookupItem, ConditionOp, FilterNode, ColumnSummary, SummaryValue, ColumnDef, SavedViews, GridStore } from '@rastr/core';
5
+ export { DataSource, FilterNode, GridExportRequest, GridState, Key, SavedView, SavedViews, SavedViewsAdapter, SelectionState, StoredView, and, cond, createArrayDataSource, createRemoteExport, createSavedViews, not, or } from '@rastr/core';
6
+ import { Align, ValueFormat, Validator, GridColumn } from '@rastr/grid';
7
+ export { CopyResult, EditMode, ExportFormat, ExportModule, GridColumn, GridDetailContext, GridDetailHandle, GridDetailOptions, GridEditingOptions, GridExportOptions, GridRowReorderOptions, HeaderBand, RowAction, RowChange, RowEditing, RowReorderEvent, SaveErrors, Validator, actionsColumn, custom, editActionsColumn, pattern, range, required, rowNumberColumn } from '@rastr/grid';
8
+ import { FilterBuilderMessages } from '@rastr/filter-builder';
9
+
10
+ /**
11
+ * Declarative column for RsGrid. It renders nothing: RsGrid reads RsColumn children (props and
12
+ * the #cell / #header / #edit slots) to build its column list, in template order.
13
+ */
14
+ declare const RsColumn: vue.DefineComponent<vue.ExtractPropTypes<{
15
+ field: {
16
+ type: StringConstructor;
17
+ required: true;
18
+ };
19
+ caption: StringConstructor;
20
+ dataType: PropType<DataType>;
21
+ visible: {
22
+ readonly type: BooleanConstructor;
23
+ readonly default: undefined;
24
+ };
25
+ width: (NumberConstructor | StringConstructor)[];
26
+ minWidth: (NumberConstructor | StringConstructor)[];
27
+ pinned: PropType<"start" | "end">;
28
+ align: PropType<Align>;
29
+ sortable: {
30
+ readonly type: BooleanConstructor;
31
+ readonly default: undefined;
32
+ };
33
+ filterable: {
34
+ readonly type: BooleanConstructor;
35
+ readonly default: undefined;
36
+ };
37
+ searchable: {
38
+ readonly type: BooleanConstructor;
39
+ readonly default: undefined;
40
+ };
41
+ headerFilter: {
42
+ readonly type: BooleanConstructor;
43
+ readonly default: undefined;
44
+ };
45
+ resizable: {
46
+ readonly type: BooleanConstructor;
47
+ readonly default: undefined;
48
+ };
49
+ reorderable: {
50
+ readonly type: BooleanConstructor;
51
+ readonly default: undefined;
52
+ };
53
+ lookup: PropType<readonly LookupItem[]>;
54
+ format: PropType<ValueFormat<unknown>>;
55
+ value: PropType<(row: any) => unknown>;
56
+ sortValue: PropType<(row: any) => unknown>;
57
+ cellClass: PropType<(row: any) => string | undefined>;
58
+ toFilter: PropType<(value: unknown, op: ConditionOp) => FilterNode | null>;
59
+ editable: {
60
+ type: PropType<boolean | ((row: any) => boolean)>;
61
+ default: undefined;
62
+ };
63
+ validate: PropType<readonly Validator<unknown>[]>;
64
+ /** Total summaries of the column: 'sum', 'avg', 'min', 'max', 'count' or a custom one. */
65
+ summary: PropType<readonly ColumnSummary<any>[]>;
66
+ summaryFormat: PropType<(value: unknown, summary: SummaryValue) => string>;
67
+ /** On a narrow grid the lowest priority hides first. */
68
+ hidingPriority: (NumberConstructor | StringConstructor)[];
69
+ }>, () => null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
70
+ field: {
71
+ type: StringConstructor;
72
+ required: true;
73
+ };
74
+ caption: StringConstructor;
75
+ dataType: PropType<DataType>;
76
+ visible: {
77
+ readonly type: BooleanConstructor;
78
+ readonly default: undefined;
79
+ };
80
+ width: (NumberConstructor | StringConstructor)[];
81
+ minWidth: (NumberConstructor | StringConstructor)[];
82
+ pinned: PropType<"start" | "end">;
83
+ align: PropType<Align>;
84
+ sortable: {
85
+ readonly type: BooleanConstructor;
86
+ readonly default: undefined;
87
+ };
88
+ filterable: {
89
+ readonly type: BooleanConstructor;
90
+ readonly default: undefined;
91
+ };
92
+ searchable: {
93
+ readonly type: BooleanConstructor;
94
+ readonly default: undefined;
95
+ };
96
+ headerFilter: {
97
+ readonly type: BooleanConstructor;
98
+ readonly default: undefined;
99
+ };
100
+ resizable: {
101
+ readonly type: BooleanConstructor;
102
+ readonly default: undefined;
103
+ };
104
+ reorderable: {
105
+ readonly type: BooleanConstructor;
106
+ readonly default: undefined;
107
+ };
108
+ lookup: PropType<readonly LookupItem[]>;
109
+ format: PropType<ValueFormat<unknown>>;
110
+ value: PropType<(row: any) => unknown>;
111
+ sortValue: PropType<(row: any) => unknown>;
112
+ cellClass: PropType<(row: any) => string | undefined>;
113
+ toFilter: PropType<(value: unknown, op: ConditionOp) => FilterNode | null>;
114
+ editable: {
115
+ type: PropType<boolean | ((row: any) => boolean)>;
116
+ default: undefined;
117
+ };
118
+ validate: PropType<readonly Validator<unknown>[]>;
119
+ /** Total summaries of the column: 'sum', 'avg', 'min', 'max', 'count' or a custom one. */
120
+ summary: PropType<readonly ColumnSummary<any>[]>;
121
+ summaryFormat: PropType<(value: unknown, summary: SummaryValue) => string>;
122
+ /** On a narrow grid the lowest priority hides first. */
123
+ hidingPriority: (NumberConstructor | StringConstructor)[];
124
+ }>> & Readonly<{}>, {
125
+ visible: boolean;
126
+ sortable: boolean;
127
+ headerFilter: boolean;
128
+ editable: boolean | ((row: any) => boolean);
129
+ resizable: boolean;
130
+ reorderable: boolean;
131
+ filterable: boolean;
132
+ searchable: boolean;
133
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
134
+
135
+ /** Identity helper that types column definitions for a row type in <script setup>. */
136
+ declare function defineColumns<TRow>(columns: GridColumn<TRow>[]): GridColumn<TRow>[];
137
+
138
+ /** v-model wrapper of the vanilla filter builder. */
139
+ declare const RsFilterBuilder: vue.DefineComponent<vue.ExtractPropTypes<{
140
+ modelValue: {
141
+ type: PropType<FilterNode | null>;
142
+ default: null;
143
+ };
144
+ columns: {
145
+ type: PropType<readonly ColumnDef<unknown>[]>;
146
+ required: true;
147
+ };
148
+ loadValues: PropType<(field: string, search: string) => Promise<readonly unknown[]>>;
149
+ locale: StringConstructor;
150
+ messages: PropType<Partial<FilterBuilderMessages>>;
151
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
152
+ [key: string]: any;
153
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
154
+ 'update:modelValue': (value: FilterNode | null) => boolean;
155
+ }, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
156
+ modelValue: {
157
+ type: PropType<FilterNode | null>;
158
+ default: null;
159
+ };
160
+ columns: {
161
+ type: PropType<readonly ColumnDef<unknown>[]>;
162
+ required: true;
163
+ };
164
+ loadValues: PropType<(field: string, search: string) => Promise<readonly unknown[]>>;
165
+ locale: StringConstructor;
166
+ messages: PropType<Partial<FilterBuilderMessages>>;
167
+ }>> & Readonly<{
168
+ "onUpdate:modelValue"?: (value: FilterNode | null) => any;
169
+ }>, {
170
+ modelValue: FilterNode | null;
171
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
172
+
173
+ interface SavedViewsMessages {
174
+ readonly view: string;
175
+ readonly noView: string;
176
+ readonly newView: string;
177
+ readonly edit: string;
178
+ readonly remove: string;
179
+ readonly name: string;
180
+ readonly isDefault: string;
181
+ readonly save: string;
182
+ readonly cancel: string;
183
+ readonly confirmRemove: string;
184
+ }
185
+ /** View picker with "new / edit / delete" and a dialog with the filter builder. */
186
+ declare const RsSavedViews: vue.DefineComponent<vue.ExtractPropTypes<{
187
+ views: {
188
+ type: PropType<SavedViews>;
189
+ required: true;
190
+ };
191
+ store: {
192
+ type: PropType<GridStore<unknown>>;
193
+ required: true;
194
+ };
195
+ columns: {
196
+ type: PropType<readonly ColumnDef<unknown>[]>;
197
+ required: true;
198
+ };
199
+ /** Asked before a view is deleted; defaults to window.confirm. */
200
+ confirm: PropType<(message: string) => Promise<boolean>>;
201
+ locale: StringConstructor;
202
+ messages: PropType<Partial<SavedViewsMessages>>;
203
+ }>, () => VNode, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
204
+ views: {
205
+ type: PropType<SavedViews>;
206
+ required: true;
207
+ };
208
+ store: {
209
+ type: PropType<GridStore<unknown>>;
210
+ required: true;
211
+ };
212
+ columns: {
213
+ type: PropType<readonly ColumnDef<unknown>[]>;
214
+ required: true;
215
+ };
216
+ /** Asked before a view is deleted; defaults to window.confirm. */
217
+ confirm: PropType<(message: string) => Promise<boolean>>;
218
+ locale: StringConstructor;
219
+ messages: PropType<Partial<SavedViewsMessages>>;
220
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
221
+
222
+ export { RsColumn, RsFilterBuilder, RsSavedViews, type SavedViewsMessages, defineColumns };