apex-grid 3.3.0 → 3.5.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/CHANGELOG.md +143 -0
- package/README.md +74 -6
- package/components/cell.d.ts +2 -2
- package/components/cell.js +30 -2
- package/components/cell.js.map +1 -1
- package/components/filter-row.js +65 -6
- package/components/filter-row.js.map +1 -1
- package/components/grid.d.ts +132 -0
- package/components/grid.js +59 -2
- package/components/grid.js.map +1 -1
- package/components/header-row.js +8 -0
- package/components/header-row.js.map +1 -1
- package/components/header.js +85 -12
- package/components/header.js.map +1 -1
- package/components/row.js +32 -4
- package/components/row.js.map +1 -1
- package/components/virtualizer.d.ts +5 -1
- package/components/virtualizer.js +72 -2
- package/components/virtualizer.js.map +1 -1
- package/controllers/expansion.js +4 -4
- package/controllers/expansion.js.map +1 -1
- package/controllers/filter.js +11 -0
- package/controllers/filter.js.map +1 -1
- package/controllers/history.js +11 -4
- package/controllers/history.js.map +1 -1
- package/controllers/navigation.d.ts +35 -2
- package/controllers/navigation.js +102 -8
- package/controllers/navigation.js.map +1 -1
- package/controllers/pagination.js +1 -1
- package/controllers/pagination.js.map +1 -1
- package/controllers/reorder.js +4 -2
- package/controllers/reorder.js.map +1 -1
- package/controllers/row-pin.js +2 -2
- package/controllers/row-pin.js.map +1 -1
- package/controllers/row-reorder.js +6 -6
- package/controllers/row-reorder.js.map +1 -1
- package/controllers/selection.js +3 -3
- package/controllers/selection.js.map +1 -1
- package/controllers/sort.js +4 -2
- package/controllers/sort.js.map +1 -1
- package/controllers/state.d.ts +9 -3
- package/controllers/state.js +11 -1
- package/controllers/state.js.map +1 -1
- package/custom-elements.json +664 -190
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/ApexGrid.html +586 -0
- package/docs/classes/ApexGridPaginator.html +36 -0
- package/docs/classes/ApexGridToolbar.html +67 -0
- package/docs/functions/localize.html +2 -2
- package/docs/functions/setup.html +1 -2
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +94 -6
- package/docs/interfaces/ApexCellValidationFailedEvent.html +1 -1
- package/docs/interfaces/ApexCellValueChangedEvent.html +1 -1
- package/docs/interfaces/ApexCellValueChangingEvent.html +2 -2
- package/docs/interfaces/ApexColumnMovedEvent.html +2 -2
- package/docs/interfaces/ApexColumnMovingEvent.html +1 -1
- package/docs/interfaces/ApexDetailContext.html +2 -2
- package/docs/interfaces/ApexGridEventMap.html +5 -5
- package/docs/interfaces/ApexRowMovingEvent.html +1 -1
- package/docs/interfaces/ApexRowPinningEvent.html +1 -1
- package/docs/interfaces/BaseApexCellContext.html +1 -1
- package/docs/interfaces/BaseApexEditorContext.html +1 -1
- package/docs/interfaces/BaseColumnConfiguration.html +3 -3
- package/docs/interfaces/CSVExportOptions.html +2 -2
- package/docs/interfaces/DataPipelineConfiguration.html +2 -2
- package/docs/interfaces/EditingHistoryConfiguration.html +1 -1
- package/docs/interfaces/ExportFormat.html +2 -2
- package/docs/interfaces/ExportOptions.html +1 -1
- package/docs/interfaces/GridRowPinningConfiguration.html +1 -1
- package/docs/interfaces/GridRowReorderingConfiguration.html +2 -2
- package/docs/interfaces/PaginationConfiguration.html +1 -1
- package/docs/interfaces/PaginationState.html +1 -1
- package/docs/media/_tokens.scss +29 -8
- package/docs/media/package.json +4 -5
- package/docs/media/state-persistence.html +0 -10
- package/docs/modules.html +1 -1
- package/docs/types/DataPipelineParams.html +2 -2
- package/docs/types/EditMode.html +2 -2
- package/docs/types/GridLocaleText.html +1 -1
- package/docs/types/PaginationMode.html +1 -1
- package/docs/variables/EN_LOCALE.html +3 -3
- package/docs/variables/esLocale.html +1 -1
- package/i18n/en.d.ts +109 -1
- package/i18n/en.js +109 -1
- package/i18n/en.js.map +1 -1
- package/i18n/es.js +109 -1
- package/i18n/es.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/internal/column-types.js +1 -1
- package/internal/column-types.js.map +1 -1
- package/internal/feature-module.d.ts +22 -0
- package/internal/feature-module.js +5 -0
- package/internal/feature-module.js.map +1 -1
- package/internal/index.d.ts +2 -2
- package/internal/index.js +1 -1
- package/internal/index.js.map +1 -1
- package/internal/utils.d.ts +14 -0
- package/internal/utils.js +5 -0
- package/internal/utils.js.map +1 -1
- package/package.json +1 -2
- package/setup.d.ts +12 -11
- package/setup.js +12 -4
- package/setup.js.map +1 -1
- package/styles/_common.css.js +1 -1
- package/styles/_common.css.js.map +1 -1
- package/styles/_tokens.css.js +1 -1
- package/styles/_tokens.css.js.map +1 -1
- package/styles/body-cell/body-cell.css.js +1 -1
- package/styles/body-cell/body-cell.css.js.map +1 -1
- package/styles/body-row/body-row.css.js +1 -1
- package/styles/body-row/body-row.css.js.map +1 -1
- package/styles/filter-row/filter-row.css.js +1 -1
- package/styles/filter-row/filter-row.css.js.map +1 -1
- package/styles/grid/_grid.base.css.js +1 -1
- package/styles/grid/_grid.base.css.js.map +1 -1
- package/styles/grid/grid.css.js +1 -1
- package/styles/grid/grid.css.js.map +1 -1
- package/styles/group-header-row/group-header-row.css.js +1 -1
- package/styles/group-header-row/group-header-row.css.js.map +1 -1
- package/styles/header-cell/header-cell.css.js +1 -1
- package/styles/header-cell/header-cell.css.js.map +1 -1
- package/styles/header-row/header-row.base.css.js +1 -1
- package/styles/header-row/header-row.base.css.js.map +1 -1
- package/styles/paginator/paginator.css.js +1 -1
- package/styles/paginator/paginator.css.js.map +1 -1
- package/styles/toolbar/toolbar.css.js +1 -1
- package/styles/toolbar/toolbar.css.js.map +1 -1
package/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { ApexGrid } from './components/grid.js';
|
|
2
|
+
export { default as ApexGridPaginator } from './components/paginator.js';
|
|
3
|
+
export { default as ApexGridToolbar } from './components/toolbar.js';
|
|
2
4
|
export { EN_LOCALE, esLocale, interpolate, localize, } from './i18n/index.js';
|
|
3
5
|
export { custom, max, min, pattern, required } from './internal/validators.js';
|
|
4
6
|
export { BooleanOperands } from './operations/filter/operands/boolean.js';
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EACL,SAAS,EACT,QAAQ,EAGR,WAAW,EAEX,QAAQ,GACT,MAAM,iBAAiB,CAAC;AA8DzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAkBxE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export type {\n ApexCellValidationFailedEvent,\n ApexCellValueChangedEvent,\n ApexCellValueChangingEvent,\n ApexColumnMovedEvent,\n ApexColumnMovingEvent,\n ApexColumnPinnedEvent,\n ApexColumnPinningEvent,\n ApexFilteredEvent,\n ApexFilteringEvent,\n ApexGridEventMap,\n ApexHistoryChangedEvent,\n ApexPageChangedEvent,\n ApexPageChangingEvent,\n ApexQuickFilterChangedEvent,\n ApexQuickFilterChangingEvent,\n ApexRowEditEndedEvent,\n ApexRowEditStartedEvent,\n ApexRowExpandedEvent,\n ApexRowExpandingEvent,\n ApexRowMovingEvent,\n ApexRowPinningEvent,\n ApexRowSelectedEvent,\n ApexRowSelectingEvent,\n ApexStateChangedEvent,\n ApexTreeRowExpandedEvent,\n ApexTreeRowExpandingEvent,\n ColumnDropPosition,\n} from './components/grid.js';\nexport { ApexGrid } from './components/grid.js';\nexport { default as ApexGridPaginator } from './components/paginator.js';\n// Public sub-elements. Exported so framework wrappers (e.g. react-apex-grid) can\n// reference the element constructors; both render inside the grid at runtime.\nexport { default as ApexGridToolbar } from './components/toolbar.js';\nexport type { RowPinPosition } from './controllers/row-pin.js';\nexport type { RowDropPosition } from './controllers/row-reorder.js';\nexport {\n EN_LOCALE,\n esLocale,\n type GridLocaleKey,\n type GridLocaleText,\n interpolate,\n type LocaleParams,\n localize,\n} from './i18n/index.js';\nexport type {\n CSVExportOptions,\n ExportCellValue,\n ExportFormat,\n ExportOptions,\n ExportSource,\n} from './internal/export.js';\nexport type {\n ColumnSchema,\n GridCapabilities,\n GridSchema,\n} from './internal/state-schema.js';\nexport type {\n ColumnLayoutState,\n FilterStateSnapshot,\n GetStateOptions,\n GridState,\n RowRef,\n SetStateOptions,\n SetStateResult,\n SortStateSnapshot,\n} from './internal/state-snapshot.js';\nexport type {\n ApexCellContext,\n ApexColumnGroupContext,\n ApexDetailContext,\n ApexEditorContext,\n ApexHeaderContext,\n BaseApexCellContext,\n BaseApexEditorContext,\n BaseColumnConfiguration,\n BaseColumnSortConfiguration,\n BasePropertyType,\n ColumnConfiguration,\n ColumnFilterConfiguration,\n ColumnGroupConfiguration,\n ColumnSortConfiguration,\n DataPipelineConfiguration,\n DataPipelineHook,\n DataPipelineParams,\n DataType,\n EditingHistoryConfiguration,\n EditMode,\n EditTrigger,\n GridEditingConfiguration,\n GridExpansionConfiguration,\n GridRowPinningConfiguration,\n GridRowReorderingConfiguration,\n GridSelectionConfiguration,\n GridSortConfiguration,\n GridTreeConfiguration,\n Keys,\n PaginationConfiguration,\n PaginationMode,\n PaginationState,\n PinPosition,\n PropertyType,\n SelectionMode,\n Validator,\n ValidatorContext,\n} from './internal/types.js';\nexport { custom, max, min, pattern, required } from './internal/validators.js';\nexport { BooleanOperands } from './operations/filter/operands/boolean.js';\nexport { NumberOperands } from './operations/filter/operands/number.js';\nexport { StringOperands } from './operations/filter/operands/string.js';\nexport type {\n BaseFilterExpression,\n FilterCriteria,\n FilterExpression,\n FilterOperation,\n FilterOperationLogic,\n OperandKeys,\n} from './operations/filter/types.js';\nexport type {\n BaseSortComparer,\n BaseSortExpression,\n SortComparer,\n SortExpression,\n SortingDirection,\n SortState,\n} from './operations/sort/types.js';\nexport type { ApexGridSetupOptions } from './setup.js';\nexport { setup } from './setup.js';\n"]}
|
package/internal/column-types.js
CHANGED
|
@@ -199,7 +199,7 @@ const ratingType = {
|
|
|
199
199
|
return html `<span
|
|
200
200
|
part="rating-editor"
|
|
201
201
|
role="radiogroup"
|
|
202
|
-
aria-label
|
|
202
|
+
aria-label=${ctx.parent.state?.localize('editor.rating', undefined, 'Rating') ?? 'Rating'}
|
|
203
203
|
>
|
|
204
204
|
${stars.map((rank) => html `<button
|
|
205
205
|
type="button"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-types.js","sourceRoot":"","sources":["../../src/internal/column-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing, svg, type TemplateResult } from 'lit';\nimport { ref } from 'lit/directives/ref.js';\nimport type ApexGridCell from '../components/cell.js';\nimport type ApexGridRow from '../components/row.js';\nimport { renderIcon } from './icons.js';\nimport type { BadgeVariant, ColumnConfiguration, StatusVariant } from './types.js';\n\nconst RATING_DEFAULT_MAX = 5;\n\nfunction getRatingMax(column: { max?: number }): number {\n const max = typeof column.max === 'number' ? Math.floor(column.max) : RATING_DEFAULT_MAX;\n return max > 0 ? max : RATING_DEFAULT_MAX;\n}\n\nfunction clampRating(value: unknown, max: number): number {\n const n = typeof value === 'number' ? value : Number(value ?? 0);\n if (!Number.isFinite(n)) return 0;\n if (n < 0) return 0;\n if (n > max) return max;\n return Math.round(n);\n}\n\n/**\n * An option entry for a `'select'` column. May be either a bare value (the\n * displayed label is `String(value)`) or an explicit `{ value, label }` pair.\n */\nexport type SelectOption<V = unknown> = V | { value: V; label?: string };\n\n/**\n * The flat, non-distributive cell context handed to a column-type renderer's\n * `display` function. Mirrors {@link ApexCellContext} but uses `unknown` for\n * `value` so renderers can author against a single shape without\n * conditional-type narrowing in generic positions.\n */\nexport interface ColumnTypeCellContext<T extends object> {\n parent: ApexGridCell<T>;\n row: ApexGridRow<T>;\n column: ColumnConfiguration<T>;\n value: unknown;\n /**\n * Commits a new value for this cell without entering edit mode. Only\n * present when the column is editable. Used by interactive display\n * widgets like the boolean checkbox.\n */\n commit?(value: unknown): Promise<boolean>;\n}\n\n/**\n * Cell context handed to a column-type renderer's `editor` function. Adds the\n * `commit` / `cancel` helpers wired through {@link EditingController}.\n */\nexport interface ColumnTypeEditorContext<T extends object> extends ColumnTypeCellContext<T> {\n commit(value: unknown): Promise<boolean>;\n cancel(): void;\n}\n\n/**\n * Built-in column-type renderer contract. A renderer can supply either a\n * display template, an editor template, or both. Cells fall back to the\n * column's `cellTemplate` / `editorTemplate` / built-in primitive editor if\n * the renderer is absent.\n */\nexport interface ColumnTypeRenderer<T extends object> {\n /**\n * Renders the display (read-only) representation of the cell.\n *\n * @remarks\n * Called when the cell is not in edit mode and the column has no\n * `cellTemplate`. Return any lit-renderable value.\n */\n display?(ctx: ColumnTypeCellContext<T>): TemplateResult | unknown;\n\n /**\n * Renders the inline editor while the cell is in edit mode.\n *\n * @remarks\n * Called when the cell is in edit mode and the column has no\n * `editorTemplate`. The returned template SHOULD include `data-apex-editor`\n * on its focusable element so the cell auto-focuses it. The editor is\n * responsible for calling `ctx.commit(value)` / `ctx.cancel()`.\n */\n editor?(ctx: ColumnTypeEditorContext<T>): TemplateResult | unknown;\n}\n\ninterface NormalizedSelectOption {\n value: unknown;\n label: string;\n}\n\n/**\n * Normalizes a column's `options` configuration into a uniform\n * `{ value, label }[]` list. Accepts both bare-value entries and explicit\n * `{ value, label }` pairs.\n */\nexport function getSelectOptions(column: { options?: SelectOption[] }): NormalizedSelectOption[] {\n const raw = column.options ?? [];\n return raw.map((entry) => {\n if (entry !== null && typeof entry === 'object' && 'value' in entry) {\n const opt = entry as { value: unknown; label?: string };\n return { value: opt.value, label: opt.label ?? String(opt.value) };\n }\n return { value: entry, label: String(entry) };\n });\n}\n\nconst selectType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const opts = getSelectOptions(ctx.column as { options?: SelectOption[] });\n const match = opts.find((o) => o.value === ctx.value);\n const label = match?.label ?? (ctx.value == null ? '' : String(ctx.value));\n // Closed-state display is intentionally plain text — the cell reads as\n // a normal value cell until the user double-clicks to edit. The\n // dropdown affordance appears only in edit mode (the listbox popover).\n return html`<span part=\"select-label\">${label}</span>`;\n },\n\n editor(ctx) {\n const opts = getSelectOptions(ctx.column as { options?: SelectOption[] });\n const current = ctx.value;\n const match = opts.find((o) => o.value === current);\n const label = match?.label ?? (current == null ? '' : String(current));\n const selectedIdx = Math.max(\n 0,\n opts.findIndex((o) => o.value === current)\n );\n\n // The popover is rendered as a `position: absolute` child of the cell\n // (the cell host is `position: relative`). That positions it relative\n // to the cell regardless of how the row is laid out — important\n // because the virtualizer applies `transform: translate` to each row,\n // which would re-anchor a `position: fixed` descendant onto the row.\n // The cell-level SCSS lifts `overflow: hidden` for select-type editing\n // cells so the popover can extend below the cell's box.\n const mountPopover = (el: Element | undefined) => {\n if (!el) return;\n const popover = el as HTMLElement;\n if (popover.dataset.apexFocused) return;\n popover.dataset.apexFocused = '1';\n const items = Array.from(popover.querySelectorAll<HTMLElement>('[part~=\"select-option\"]'));\n items[selectedIdx]?.focus();\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const list = target.closest('[part~=\"select-popover\"]') as HTMLElement | null;\n if (!list) return;\n const items = Array.from(list.querySelectorAll<HTMLElement>('[part~=\"select-option\"]'));\n const idx = items.indexOf(target);\n if (idx < 0) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n event.stopPropagation();\n items[Math.min(idx + 1, items.length - 1)]?.focus();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n items[Math.max(idx - 1, 0)]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n event.stopPropagation();\n items[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n items[items.length - 1]?.focus();\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.stopPropagation();\n ctx.commit(opts[idx].value);\n }\n // Escape / Tab fall through to the cell-level handler which cancels /\n // exits — we don't consume them here so the standard exit flow applies.\n };\n\n return html`<span part=\"select-label\">${label}</span>\n <div\n part=\"select-popover\"\n role=\"listbox\"\n @keydown=${handleKeydown}\n ${ref(mountPopover)}\n >\n ${opts.map(\n (o, i) => html`<div\n part=${o.value === current ? 'select-option selected' : 'select-option'}\n role=\"option\"\n aria-selected=${o.value === current ? 'true' : 'false'}\n tabindex=${i === selectedIdx ? '0' : '-1'}\n data-apex-editor=${i === selectedIdx ? '' : nothing}\n @click=${() => ctx.commit(o.value)}\n >\n ${o.label}\n </div>`\n )}\n </div>`;\n },\n};\n\n/**\n * Parses a stored cell value into a `Date`, or `null` when the value can't be\n * resolved to a real date.\n *\n * @remarks\n * Accepts `Date` instances, ISO/parseable strings, and millisecond\n * timestamps. `YYYY-MM-DD` strings are interpreted as **floating dates**\n * (local midnight) rather than UTC midnight, so they render on the same\n * calendar day in every timezone.\n */\nexport function parseDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === 'number') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n if (typeof value === 'string') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (match) {\n const [, y, m, d] = match;\n const date = new Date(Number(y), Number(m) - 1, Number(d));\n return Number.isNaN(date.getTime()) ? null : date;\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction toDateInputValue(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\nfunction formatDateValue(value: unknown, style: string): string {\n const date = parseDate(value);\n if (!date) return '';\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: style as Intl.DateTimeFormatOptions['dateStyle'],\n }).format(date);\n}\n\n/**\n * Returns a `next` value cast to the same shape as `original` (Date / number\n * timestamp / ISO string). Empty inputs commit `null` regardless of the\n * source shape, which is the simplest \"clear\" semantics.\n */\nfunction commitDateInSameShape(original: unknown, next: Date | null): unknown {\n if (next === null) return null;\n if (original instanceof Date) return next;\n if (typeof original === 'number') return next.getTime();\n return toDateInputValue(next);\n}\n\nconst dateType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const style = (ctx.column as { format?: string }).format ?? 'medium';\n return html`${formatDateValue(ctx.value, style)}`;\n },\n\n editor(ctx) {\n const initial = parseDate(ctx.value);\n const initialInput = initial ? toDateInputValue(initial) : '';\n\n const handleChange = (event: Event) => {\n const raw = (event.target as HTMLInputElement).value;\n const next = raw ? parseDate(raw) : null;\n ctx.commit(commitDateInSameShape(ctx.value, next));\n };\n // Escape / Tab / focus-out are handled at the cell level; we only need\n // Enter here to commit the typed value without waiting for `change`.\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n const raw = (event.target as HTMLInputElement).value;\n const next = raw ? parseDate(raw) : null;\n ctx.commit(commitDateInSameShape(ctx.value, next));\n }\n };\n return html`<input\n type=\"date\"\n part=\"editor\"\n data-apex-editor\n .value=${initialInput}\n @change=${handleChange}\n @keydown=${handleKeydown}\n />`;\n },\n};\n\nconst ratingType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const max = getRatingMax(ctx.column as { max?: number });\n const value = clampRating(ctx.value, max);\n const stars = Array.from({ length: max }, (_, i) => i < value);\n return html`<span part=\"rating\" role=\"img\" aria-label=\"${value} of ${max}\">\n ${stars.map(\n (filled) =>\n html`<span part=${filled ? 'rating-star filled' : 'rating-star'} aria-hidden=\"true\">\n ${renderIcon('star')}\n </span>`\n )}\n </span>`;\n },\n\n editor(ctx) {\n const max = getRatingMax(ctx.column as { max?: number });\n const current = clampRating(ctx.value, max);\n const focusRank = Math.max(current, 1);\n\n const commitTo = (next: number) => ctx.commit(clampRating(next, max));\n\n // Escape / Tab / focus-out are handled at the cell level — no per-editor\n // handlers needed here. Clicking a star is the primary commit action;\n // clicking the currently-rated star clears the rating back to 0, which\n // is the only way to get below 1 once any star is set.\n const stars = Array.from({ length: max }, (_, i) => i + 1);\n return html`<span\n part=\"rating-editor\"\n role=\"radiogroup\"\n aria-label=\"Rating\"\n >\n ${stars.map(\n (rank) => html`<button\n type=\"button\"\n part=${rank <= current ? 'rating-star filled selected' : 'rating-star'}\n role=\"radio\"\n aria-checked=${rank === current}\n aria-label=${`${rank} of ${max}`}\n data-rating-value=${rank}\n data-apex-editor=${rank === focusRank ? '' : nothing}\n @click=${() => commitTo(rank === current ? 0 : rank)}\n >\n ${renderIcon('star')}\n </button>`\n )}\n </span>`;\n },\n};\n\nconst booleanType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const truthy = ctx.value === true;\n const editable = typeof ctx.commit === 'function';\n // For editable boolean cells the display IS the interactive control —\n // a single click toggles and commits via `ctx.commit`, no edit mode\n // dance and no visual reflow. For non-editable cells the checkbox\n // reads as a state indicator (tabindex=-1, aria-readonly, pointer-\n // events disabled via SCSS).\n return html`<input\n type=\"checkbox\"\n part=${truthy ? 'boolean-mark checked' : 'boolean-mark'}\n .checked=${truthy}\n tabindex=${editable ? '0' : '-1'}\n aria-readonly=${editable ? 'false' : 'true'}\n aria-label=${truthy ? 'true' : 'false'}\n @click=${(event: Event) => {\n // Keep the click inside the cell — we don't want it to bubble into\n // the grid body-click handler twice or trigger edit-mode logic.\n event.stopPropagation();\n }}\n @change=${\n editable\n ? (event: Event) => {\n const next = (event.target as HTMLInputElement).checked;\n ctx.commit?.(next);\n }\n : undefined\n }\n />`;\n },\n // No `editor` — boolean cells never enter edit mode (the display widget\n // commits directly). Programmatic `editCell` on a boolean column is a\n // no-op as far as the user can see.\n};\n\nconst imageType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const value = ctx.value;\n if (value == null || value === '') return html``;\n const shape = (ctx.column as { shape?: 'square' | 'circle' }).shape ?? 'square';\n const colAny = ctx.column as { alt?: string; key?: unknown };\n const alt = colAny.alt ?? String(colAny.key ?? '');\n return html`<img\n part=${shape === 'circle' ? 'image circle' : 'image'}\n src=${String(value)}\n alt=${alt}\n loading=\"lazy\"\n />`;\n },\n // Editing an image URL is just text editing — fall through to the default\n // text editor for `editable: true` image columns.\n};\n\n// ── Premium presentation renderers ─────────────────────────────────────────\n// currency / avatar / badge / progress / sparkline / status. These are display\n// presentations over primitive values; for sorting / filtering they behave as\n// their underlying value type. Styling lives in `styles/body-cell/cell-renderers.scss`.\n\nfunction toFiniteNumber(value: unknown): number | null {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction getPositiveMax(column: { max?: number }, fallback: number): number {\n const m = typeof column.max === 'number' ? column.max : fallback;\n return m > 0 ? m : fallback;\n}\n\n/** Stable 0–359 hue derived from a string, for per-row avatar tinting. */\nfunction hashHue(value: string): number {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n hash = (hash * 31 + value.charCodeAt(i)) % 360;\n }\n return hash;\n}\n\n/** Heuristic fallback mapping a free-text status to a known state. */\nfunction inferStatus(value: unknown): StatusVariant {\n const s = String(value ?? '').toLowerCase();\n if (/churn|cancel|expired|inactive|lost|risk|fail|off|overdue/.test(s)) return 'churn';\n if (/trial|trialing|pending|new|invited|watch|paused/.test(s)) return 'trial';\n return 'active';\n}\n\nconst currencyType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const col = ctx.column as { currency?: string; locale?: string };\n const n = toFiniteNumber(ctx.value);\n if (n === null) return html``;\n return html`${new Intl.NumberFormat(col.locale, {\n style: 'currency',\n currency: col.currency ?? 'USD',\n }).format(n)}`;\n },\n\n editor(ctx) {\n const commit = (event: Event) => {\n const raw = (event.target as HTMLInputElement).value;\n ctx.commit(raw === '' ? null : Number(raw));\n };\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n commit(event);\n }\n };\n return html`<input\n type=\"number\"\n part=\"editor\"\n data-apex-editor\n .value=${ctx.value == null ? '' : String(ctx.value)}\n @change=${commit}\n @keydown=${handleKeydown}\n />`;\n },\n};\n\nconst avatarType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const label = ctx.value == null ? '' : String(ctx.value);\n const initial = label.trim().charAt(0).toUpperCase();\n if (!initial) return html``;\n return html`<span part=\"avatar\" role=\"img\" aria-label=${label} style=\"--ag-avatar-hue: ${hashHue(label)}\"\n >${initial}</span\n >`;\n },\n};\n\nconst badgeType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const value = ctx.value;\n if (value == null || value === '') return html``;\n const col = ctx.column as {\n badgeVariant?: BadgeVariant | ((value: unknown) => BadgeVariant);\n };\n const variant =\n typeof col.badgeVariant === 'function'\n ? col.badgeVariant(value)\n : (col.badgeVariant ?? 'neutral');\n return html`<span part=\"pill pill--${variant}\">${String(value)}</span>`;\n },\n};\n\nconst progressType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const n = toFiniteNumber(ctx.value);\n if (n === null) return html``;\n const max = getPositiveMax(ctx.column as { max?: number }, 100);\n const pct = Math.max(0, Math.min(100, (n / max) * 100));\n const tier = pct >= 80 ? 'good' : pct >= 65 ? 'watch' : 'risk';\n return html`<span part=\"progress\">\n <span part=\"progress-track\">\n <span part=\"progress-fill progress-fill--${tier}\" style=\"width: ${pct}%\"></span>\n </span>\n <span part=\"progress-label\">${Math.round(pct)}</span>\n </span>`;\n },\n};\n\nconst sparklineType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const series = Array.isArray(ctx.value)\n ? (ctx.value.filter((v) => typeof v === 'number' && Number.isFinite(v)) as number[])\n : [];\n if (series.length < 2) return html``;\n\n const width = 64;\n const height = 22;\n const pad = 2;\n const min = Math.min(...series);\n const max = Math.max(...series);\n const range = max - min || 1;\n const stepX = width / (series.length - 1);\n const points = series.map((value, i) => {\n const x = i * stepX;\n const y = pad + (height - 2 * pad) * (1 - (value - min) / range);\n return `${x.toFixed(1)} ${y.toFixed(1)}`;\n });\n const line = `M${points.join(' L')}`;\n const area = `${line} L${width} ${height} L0 ${height} Z`;\n\n const first = series[0];\n const last = series[series.length - 1];\n const trend = last > first ? 'up' : last < first ? 'down' : 'flat';\n const delta = first === 0 ? 0 : ((last - first) / Math.abs(first)) * 100;\n const showDelta = (ctx.column as { showDelta?: boolean }).showDelta !== false;\n\n return html`<span part=\"spark-cell\">\n <svg\n part=\"sparkline sparkline--${trend}\"\n viewBox=\"0 0 ${width} ${height}\"\n width=${width}\n height=${height}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n ${svg`<path part=\"spark-area\" d=${area} /><path part=\"spark-line\" d=${line} />`}\n </svg>\n ${\n showDelta\n ? html`<span part=\"spark-delta spark-delta--${trend}\"\n >${delta > 0 ? '+' : ''}${delta.toFixed(0)}%</span\n >`\n : nothing\n }\n </span>`;\n },\n};\n\nconst statusType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const value = ctx.value;\n if (value == null || value === '') return html``;\n const col = ctx.column as {\n statusVariant?: StatusVariant | ((value: unknown) => StatusVariant);\n };\n const variant =\n typeof col.statusVariant === 'function'\n ? col.statusVariant(value)\n : (col.statusVariant ?? inferStatus(value));\n return html`<span part=\"status status--${variant}\">\n <span part=\"status-dot\"></span>${String(value)}\n </span>`;\n },\n};\n\nconst BUILTIN_TYPES: Record<string, ColumnTypeRenderer<object>> = {\n select: selectType,\n rating: ratingType,\n date: dateType,\n boolean: booleanType,\n image: imageType,\n currency: currencyType,\n avatar: avatarType,\n badge: badgeType,\n progress: progressType,\n sparkline: sparklineType,\n status: statusType,\n};\n\n/**\n * Returns the built-in renderer for a column `type`, or `undefined` when the\n * type has no built-in display/editor (the cell falls back to plain text /\n * the primitive editor in that case).\n */\nexport function getColumnTypeRenderer<T extends object>(\n type?: string\n): ColumnTypeRenderer<T> | undefined {\n return type ? (BUILTIN_TYPES[type] as unknown as ColumnTypeRenderer<T> | undefined) : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"column-types.js","sourceRoot":"","sources":["../../src/internal/column-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing, svg, type TemplateResult } from 'lit';\nimport { ref } from 'lit/directives/ref.js';\nimport type ApexGridCell from '../components/cell.js';\nimport type ApexGridRow from '../components/row.js';\nimport { renderIcon } from './icons.js';\nimport type { BadgeVariant, ColumnConfiguration, StatusVariant } from './types.js';\n\nconst RATING_DEFAULT_MAX = 5;\n\nfunction getRatingMax(column: { max?: number }): number {\n const max = typeof column.max === 'number' ? Math.floor(column.max) : RATING_DEFAULT_MAX;\n return max > 0 ? max : RATING_DEFAULT_MAX;\n}\n\nfunction clampRating(value: unknown, max: number): number {\n const n = typeof value === 'number' ? value : Number(value ?? 0);\n if (!Number.isFinite(n)) return 0;\n if (n < 0) return 0;\n if (n > max) return max;\n return Math.round(n);\n}\n\n/**\n * An option entry for a `'select'` column. May be either a bare value (the\n * displayed label is `String(value)`) or an explicit `{ value, label }` pair.\n */\nexport type SelectOption<V = unknown> = V | { value: V; label?: string };\n\n/**\n * The flat, non-distributive cell context handed to a column-type renderer's\n * `display` function. Mirrors {@link ApexCellContext} but uses `unknown` for\n * `value` so renderers can author against a single shape without\n * conditional-type narrowing in generic positions.\n */\nexport interface ColumnTypeCellContext<T extends object> {\n parent: ApexGridCell<T>;\n row: ApexGridRow<T>;\n column: ColumnConfiguration<T>;\n value: unknown;\n /**\n * Commits a new value for this cell without entering edit mode. Only\n * present when the column is editable. Used by interactive display\n * widgets like the boolean checkbox.\n */\n commit?(value: unknown): Promise<boolean>;\n}\n\n/**\n * Cell context handed to a column-type renderer's `editor` function. Adds the\n * `commit` / `cancel` helpers wired through {@link EditingController}.\n */\nexport interface ColumnTypeEditorContext<T extends object> extends ColumnTypeCellContext<T> {\n commit(value: unknown): Promise<boolean>;\n cancel(): void;\n}\n\n/**\n * Built-in column-type renderer contract. A renderer can supply either a\n * display template, an editor template, or both. Cells fall back to the\n * column's `cellTemplate` / `editorTemplate` / built-in primitive editor if\n * the renderer is absent.\n */\nexport interface ColumnTypeRenderer<T extends object> {\n /**\n * Renders the display (read-only) representation of the cell.\n *\n * @remarks\n * Called when the cell is not in edit mode and the column has no\n * `cellTemplate`. Return any lit-renderable value.\n */\n display?(ctx: ColumnTypeCellContext<T>): TemplateResult | unknown;\n\n /**\n * Renders the inline editor while the cell is in edit mode.\n *\n * @remarks\n * Called when the cell is in edit mode and the column has no\n * `editorTemplate`. The returned template SHOULD include `data-apex-editor`\n * on its focusable element so the cell auto-focuses it. The editor is\n * responsible for calling `ctx.commit(value)` / `ctx.cancel()`.\n */\n editor?(ctx: ColumnTypeEditorContext<T>): TemplateResult | unknown;\n}\n\ninterface NormalizedSelectOption {\n value: unknown;\n label: string;\n}\n\n/**\n * Normalizes a column's `options` configuration into a uniform\n * `{ value, label }[]` list. Accepts both bare-value entries and explicit\n * `{ value, label }` pairs.\n */\nexport function getSelectOptions(column: { options?: SelectOption[] }): NormalizedSelectOption[] {\n const raw = column.options ?? [];\n return raw.map((entry) => {\n if (entry !== null && typeof entry === 'object' && 'value' in entry) {\n const opt = entry as { value: unknown; label?: string };\n return { value: opt.value, label: opt.label ?? String(opt.value) };\n }\n return { value: entry, label: String(entry) };\n });\n}\n\nconst selectType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const opts = getSelectOptions(ctx.column as { options?: SelectOption[] });\n const match = opts.find((o) => o.value === ctx.value);\n const label = match?.label ?? (ctx.value == null ? '' : String(ctx.value));\n // Closed-state display is intentionally plain text — the cell reads as\n // a normal value cell until the user double-clicks to edit. The\n // dropdown affordance appears only in edit mode (the listbox popover).\n return html`<span part=\"select-label\">${label}</span>`;\n },\n\n editor(ctx) {\n const opts = getSelectOptions(ctx.column as { options?: SelectOption[] });\n const current = ctx.value;\n const match = opts.find((o) => o.value === current);\n const label = match?.label ?? (current == null ? '' : String(current));\n const selectedIdx = Math.max(\n 0,\n opts.findIndex((o) => o.value === current)\n );\n\n // The popover is rendered as a `position: absolute` child of the cell\n // (the cell host is `position: relative`). That positions it relative\n // to the cell regardless of how the row is laid out — important\n // because the virtualizer applies `transform: translate` to each row,\n // which would re-anchor a `position: fixed` descendant onto the row.\n // The cell-level SCSS lifts `overflow: hidden` for select-type editing\n // cells so the popover can extend below the cell's box.\n const mountPopover = (el: Element | undefined) => {\n if (!el) return;\n const popover = el as HTMLElement;\n if (popover.dataset.apexFocused) return;\n popover.dataset.apexFocused = '1';\n const items = Array.from(popover.querySelectorAll<HTMLElement>('[part~=\"select-option\"]'));\n items[selectedIdx]?.focus();\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const list = target.closest('[part~=\"select-popover\"]') as HTMLElement | null;\n if (!list) return;\n const items = Array.from(list.querySelectorAll<HTMLElement>('[part~=\"select-option\"]'));\n const idx = items.indexOf(target);\n if (idx < 0) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n event.stopPropagation();\n items[Math.min(idx + 1, items.length - 1)]?.focus();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n event.stopPropagation();\n items[Math.max(idx - 1, 0)]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n event.stopPropagation();\n items[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n items[items.length - 1]?.focus();\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.stopPropagation();\n ctx.commit(opts[idx].value);\n }\n // Escape / Tab fall through to the cell-level handler which cancels /\n // exits — we don't consume them here so the standard exit flow applies.\n };\n\n return html`<span part=\"select-label\">${label}</span>\n <div\n part=\"select-popover\"\n role=\"listbox\"\n @keydown=${handleKeydown}\n ${ref(mountPopover)}\n >\n ${opts.map(\n (o, i) => html`<div\n part=${o.value === current ? 'select-option selected' : 'select-option'}\n role=\"option\"\n aria-selected=${o.value === current ? 'true' : 'false'}\n tabindex=${i === selectedIdx ? '0' : '-1'}\n data-apex-editor=${i === selectedIdx ? '' : nothing}\n @click=${() => ctx.commit(o.value)}\n >\n ${o.label}\n </div>`\n )}\n </div>`;\n },\n};\n\n/**\n * Parses a stored cell value into a `Date`, or `null` when the value can't be\n * resolved to a real date.\n *\n * @remarks\n * Accepts `Date` instances, ISO/parseable strings, and millisecond\n * timestamps. `YYYY-MM-DD` strings are interpreted as **floating dates**\n * (local midnight) rather than UTC midnight, so they render on the same\n * calendar day in every timezone.\n */\nexport function parseDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === 'number') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n if (typeof value === 'string') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (match) {\n const [, y, m, d] = match;\n const date = new Date(Number(y), Number(m) - 1, Number(d));\n return Number.isNaN(date.getTime()) ? null : date;\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction toDateInputValue(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\nfunction formatDateValue(value: unknown, style: string): string {\n const date = parseDate(value);\n if (!date) return '';\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: style as Intl.DateTimeFormatOptions['dateStyle'],\n }).format(date);\n}\n\n/**\n * Returns a `next` value cast to the same shape as `original` (Date / number\n * timestamp / ISO string). Empty inputs commit `null` regardless of the\n * source shape, which is the simplest \"clear\" semantics.\n */\nfunction commitDateInSameShape(original: unknown, next: Date | null): unknown {\n if (next === null) return null;\n if (original instanceof Date) return next;\n if (typeof original === 'number') return next.getTime();\n return toDateInputValue(next);\n}\n\nconst dateType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const style = (ctx.column as { format?: string }).format ?? 'medium';\n return html`${formatDateValue(ctx.value, style)}`;\n },\n\n editor(ctx) {\n const initial = parseDate(ctx.value);\n const initialInput = initial ? toDateInputValue(initial) : '';\n\n const handleChange = (event: Event) => {\n const raw = (event.target as HTMLInputElement).value;\n const next = raw ? parseDate(raw) : null;\n ctx.commit(commitDateInSameShape(ctx.value, next));\n };\n // Escape / Tab / focus-out are handled at the cell level; we only need\n // Enter here to commit the typed value without waiting for `change`.\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n const raw = (event.target as HTMLInputElement).value;\n const next = raw ? parseDate(raw) : null;\n ctx.commit(commitDateInSameShape(ctx.value, next));\n }\n };\n return html`<input\n type=\"date\"\n part=\"editor\"\n data-apex-editor\n .value=${initialInput}\n @change=${handleChange}\n @keydown=${handleKeydown}\n />`;\n },\n};\n\nconst ratingType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const max = getRatingMax(ctx.column as { max?: number });\n const value = clampRating(ctx.value, max);\n const stars = Array.from({ length: max }, (_, i) => i < value);\n return html`<span part=\"rating\" role=\"img\" aria-label=\"${value} of ${max}\">\n ${stars.map(\n (filled) =>\n html`<span part=${filled ? 'rating-star filled' : 'rating-star'} aria-hidden=\"true\">\n ${renderIcon('star')}\n </span>`\n )}\n </span>`;\n },\n\n editor(ctx) {\n const max = getRatingMax(ctx.column as { max?: number });\n const current = clampRating(ctx.value, max);\n const focusRank = Math.max(current, 1);\n\n const commitTo = (next: number) => ctx.commit(clampRating(next, max));\n\n // Escape / Tab / focus-out are handled at the cell level — no per-editor\n // handlers needed here. Clicking a star is the primary commit action;\n // clicking the currently-rated star clears the rating back to 0, which\n // is the only way to get below 1 once any star is set.\n const stars = Array.from({ length: max }, (_, i) => i + 1);\n return html`<span\n part=\"rating-editor\"\n role=\"radiogroup\"\n aria-label=${ctx.parent.state?.localize('editor.rating', undefined, 'Rating') ?? 'Rating'}\n >\n ${stars.map(\n (rank) => html`<button\n type=\"button\"\n part=${rank <= current ? 'rating-star filled selected' : 'rating-star'}\n role=\"radio\"\n aria-checked=${rank === current}\n aria-label=${`${rank} of ${max}`}\n data-rating-value=${rank}\n data-apex-editor=${rank === focusRank ? '' : nothing}\n @click=${() => commitTo(rank === current ? 0 : rank)}\n >\n ${renderIcon('star')}\n </button>`\n )}\n </span>`;\n },\n};\n\nconst booleanType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const truthy = ctx.value === true;\n const editable = typeof ctx.commit === 'function';\n // For editable boolean cells the display IS the interactive control —\n // a single click toggles and commits via `ctx.commit`, no edit mode\n // dance and no visual reflow. For non-editable cells the checkbox\n // reads as a state indicator (tabindex=-1, aria-readonly, pointer-\n // events disabled via SCSS).\n return html`<input\n type=\"checkbox\"\n part=${truthy ? 'boolean-mark checked' : 'boolean-mark'}\n .checked=${truthy}\n tabindex=${editable ? '0' : '-1'}\n aria-readonly=${editable ? 'false' : 'true'}\n aria-label=${truthy ? 'true' : 'false'}\n @click=${(event: Event) => {\n // Keep the click inside the cell — we don't want it to bubble into\n // the grid body-click handler twice or trigger edit-mode logic.\n event.stopPropagation();\n }}\n @change=${\n editable\n ? (event: Event) => {\n const next = (event.target as HTMLInputElement).checked;\n ctx.commit?.(next);\n }\n : undefined\n }\n />`;\n },\n // No `editor` — boolean cells never enter edit mode (the display widget\n // commits directly). Programmatic `editCell` on a boolean column is a\n // no-op as far as the user can see.\n};\n\nconst imageType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const value = ctx.value;\n if (value == null || value === '') return html``;\n const shape = (ctx.column as { shape?: 'square' | 'circle' }).shape ?? 'square';\n const colAny = ctx.column as { alt?: string; key?: unknown };\n const alt = colAny.alt ?? String(colAny.key ?? '');\n return html`<img\n part=${shape === 'circle' ? 'image circle' : 'image'}\n src=${String(value)}\n alt=${alt}\n loading=\"lazy\"\n />`;\n },\n // Editing an image URL is just text editing — fall through to the default\n // text editor for `editable: true` image columns.\n};\n\n// ── Premium presentation renderers ─────────────────────────────────────────\n// currency / avatar / badge / progress / sparkline / status. These are display\n// presentations over primitive values; for sorting / filtering they behave as\n// their underlying value type. Styling lives in `styles/body-cell/cell-renderers.scss`.\n\nfunction toFiniteNumber(value: unknown): number | null {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction getPositiveMax(column: { max?: number }, fallback: number): number {\n const m = typeof column.max === 'number' ? column.max : fallback;\n return m > 0 ? m : fallback;\n}\n\n/** Stable 0–359 hue derived from a string, for per-row avatar tinting. */\nfunction hashHue(value: string): number {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n hash = (hash * 31 + value.charCodeAt(i)) % 360;\n }\n return hash;\n}\n\n/** Heuristic fallback mapping a free-text status to a known state. */\nfunction inferStatus(value: unknown): StatusVariant {\n const s = String(value ?? '').toLowerCase();\n if (/churn|cancel|expired|inactive|lost|risk|fail|off|overdue/.test(s)) return 'churn';\n if (/trial|trialing|pending|new|invited|watch|paused/.test(s)) return 'trial';\n return 'active';\n}\n\nconst currencyType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const col = ctx.column as { currency?: string; locale?: string };\n const n = toFiniteNumber(ctx.value);\n if (n === null) return html``;\n return html`${new Intl.NumberFormat(col.locale, {\n style: 'currency',\n currency: col.currency ?? 'USD',\n }).format(n)}`;\n },\n\n editor(ctx) {\n const commit = (event: Event) => {\n const raw = (event.target as HTMLInputElement).value;\n ctx.commit(raw === '' ? null : Number(raw));\n };\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n commit(event);\n }\n };\n return html`<input\n type=\"number\"\n part=\"editor\"\n data-apex-editor\n .value=${ctx.value == null ? '' : String(ctx.value)}\n @change=${commit}\n @keydown=${handleKeydown}\n />`;\n },\n};\n\nconst avatarType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const label = ctx.value == null ? '' : String(ctx.value);\n const initial = label.trim().charAt(0).toUpperCase();\n if (!initial) return html``;\n return html`<span part=\"avatar\" role=\"img\" aria-label=${label} style=\"--ag-avatar-hue: ${hashHue(label)}\"\n >${initial}</span\n >`;\n },\n};\n\nconst badgeType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const value = ctx.value;\n if (value == null || value === '') return html``;\n const col = ctx.column as {\n badgeVariant?: BadgeVariant | ((value: unknown) => BadgeVariant);\n };\n const variant =\n typeof col.badgeVariant === 'function'\n ? col.badgeVariant(value)\n : (col.badgeVariant ?? 'neutral');\n return html`<span part=\"pill pill--${variant}\">${String(value)}</span>`;\n },\n};\n\nconst progressType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const n = toFiniteNumber(ctx.value);\n if (n === null) return html``;\n const max = getPositiveMax(ctx.column as { max?: number }, 100);\n const pct = Math.max(0, Math.min(100, (n / max) * 100));\n const tier = pct >= 80 ? 'good' : pct >= 65 ? 'watch' : 'risk';\n return html`<span part=\"progress\">\n <span part=\"progress-track\">\n <span part=\"progress-fill progress-fill--${tier}\" style=\"width: ${pct}%\"></span>\n </span>\n <span part=\"progress-label\">${Math.round(pct)}</span>\n </span>`;\n },\n};\n\nconst sparklineType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const series = Array.isArray(ctx.value)\n ? (ctx.value.filter((v) => typeof v === 'number' && Number.isFinite(v)) as number[])\n : [];\n if (series.length < 2) return html``;\n\n const width = 64;\n const height = 22;\n const pad = 2;\n const min = Math.min(...series);\n const max = Math.max(...series);\n const range = max - min || 1;\n const stepX = width / (series.length - 1);\n const points = series.map((value, i) => {\n const x = i * stepX;\n const y = pad + (height - 2 * pad) * (1 - (value - min) / range);\n return `${x.toFixed(1)} ${y.toFixed(1)}`;\n });\n const line = `M${points.join(' L')}`;\n const area = `${line} L${width} ${height} L0 ${height} Z`;\n\n const first = series[0];\n const last = series[series.length - 1];\n const trend = last > first ? 'up' : last < first ? 'down' : 'flat';\n const delta = first === 0 ? 0 : ((last - first) / Math.abs(first)) * 100;\n const showDelta = (ctx.column as { showDelta?: boolean }).showDelta !== false;\n\n return html`<span part=\"spark-cell\">\n <svg\n part=\"sparkline sparkline--${trend}\"\n viewBox=\"0 0 ${width} ${height}\"\n width=${width}\n height=${height}\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n ${svg`<path part=\"spark-area\" d=${area} /><path part=\"spark-line\" d=${line} />`}\n </svg>\n ${\n showDelta\n ? html`<span part=\"spark-delta spark-delta--${trend}\"\n >${delta > 0 ? '+' : ''}${delta.toFixed(0)}%</span\n >`\n : nothing\n }\n </span>`;\n },\n};\n\nconst statusType: ColumnTypeRenderer<object> = {\n display(ctx) {\n const value = ctx.value;\n if (value == null || value === '') return html``;\n const col = ctx.column as {\n statusVariant?: StatusVariant | ((value: unknown) => StatusVariant);\n };\n const variant =\n typeof col.statusVariant === 'function'\n ? col.statusVariant(value)\n : (col.statusVariant ?? inferStatus(value));\n return html`<span part=\"status status--${variant}\">\n <span part=\"status-dot\"></span>${String(value)}\n </span>`;\n },\n};\n\nconst BUILTIN_TYPES: Record<string, ColumnTypeRenderer<object>> = {\n select: selectType,\n rating: ratingType,\n date: dateType,\n boolean: booleanType,\n image: imageType,\n currency: currencyType,\n avatar: avatarType,\n badge: badgeType,\n progress: progressType,\n sparkline: sparklineType,\n status: statusType,\n};\n\n/**\n * Returns the built-in renderer for a column `type`, or `undefined` when the\n * type has no built-in display/editor (the cell falls back to plain text /\n * the primitive editor in that case).\n */\nexport function getColumnTypeRenderer<T extends object>(\n type?: string\n): ColumnTypeRenderer<T> | undefined {\n return type ? (BUILTIN_TYPES[type] as unknown as ColumnTypeRenderer<T> | undefined) : undefined;\n}\n"]}
|
|
@@ -82,6 +82,28 @@ export interface RowPresenter<T extends object = any> {
|
|
|
82
82
|
}
|
|
83
83
|
/** Runtime type-guard for {@link RowPresenter}. */
|
|
84
84
|
export declare function isRowPresenter<T extends object>(controller: unknown): controller is RowPresenter<T>;
|
|
85
|
+
/** ARIA tree/expansion semantics a module can attach to a normal (cell-rendered) row. */
|
|
86
|
+
export interface RowAria {
|
|
87
|
+
/** 1-based `aria-level` for the row element. */
|
|
88
|
+
readonly level?: number;
|
|
89
|
+
/** `aria-expanded` for the row element; omit for non-expandable rows. */
|
|
90
|
+
readonly expanded?: boolean;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Optional capability a module's controller may implement to attach ARIA
|
|
94
|
+
* tree/expansion semantics (`aria-level` / `aria-expanded`) to rows that still
|
|
95
|
+
* render as a normal cell grid — unlike {@link RowPresenter}, which replaces the
|
|
96
|
+
* cells with full-width content. Used by pivoting's expandable row groups, whose
|
|
97
|
+
* parent rows must keep showing per-column aggregate values. Returns `null` for
|
|
98
|
+
* rows the module does not own.
|
|
99
|
+
*
|
|
100
|
+
* @remarks Unstable; part of `apex-grid/internal`.
|
|
101
|
+
*/
|
|
102
|
+
export interface RowAriaProvider<T extends object = any> {
|
|
103
|
+
describeRow(row: T, ctx: RowPresenterContext<T>): RowAria | null;
|
|
104
|
+
}
|
|
105
|
+
/** Runtime type-guard for {@link RowAriaProvider}. */
|
|
106
|
+
export declare function isRowAriaProvider<T extends object>(controller: unknown): controller is RowAriaProvider<T>;
|
|
85
107
|
/** Per-cell context handed to a {@link CellDecorator}. */
|
|
86
108
|
export interface CellDecoratorContext<T extends object = any> {
|
|
87
109
|
/** The row's backing data (or a synthesized row object). */
|
|
@@ -8,6 +8,11 @@ export function isRowPresenter(controller) {
|
|
|
8
8
|
controller !== null &&
|
|
9
9
|
typeof controller.presentRow === 'function');
|
|
10
10
|
}
|
|
11
|
+
export function isRowAriaProvider(controller) {
|
|
12
|
+
return (typeof controller === 'object' &&
|
|
13
|
+
controller !== null &&
|
|
14
|
+
typeof controller.describeRow === 'function');
|
|
15
|
+
}
|
|
11
16
|
export function isCellDecorator(controller) {
|
|
12
17
|
return (typeof controller === 'object' &&
|
|
13
18
|
controller !== null &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-module.js","sourceRoot":"","sources":["../../src/internal/feature-module.ts"],"names":[],"mappings":"AAwDA,MAAM,UAAU,gBAAgB,CAC9B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAgC,CAAC,WAAW,KAAK,UAAU,CACpE,CAAC;AACJ,CAAC;AAqCD,MAAM,UAAU,cAAc,CAC5B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAA8B,CAAC,UAAU,KAAK,UAAU,CACjE,CAAC;AACJ,CAAC;AA+CD,MAAM,UAAU,eAAe,CAC7B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAA+B,CAAC,YAAY,KAAK,UAAU,CACpE,CAAC;AACJ,CAAC;AAmBD,MAAM,UAAU,oBAAoB,CAAC,UAAmB;IACtD,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAiC,CAAC,kBAAkB,KAAK,UAAU,CAC5E,CAAC;AACJ,CAAC;AAoCD,MAAM,UAAU,wBAAwB,CACtC,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAwC,CAAC,qBAAqB,KAAK,UAAU,CACtF,CAAC;AACJ,CAAC;AA+BD,MAAM,UAAU,oBAAoB,CAAC,UAAmB;IACtD,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAiC,CAAC,cAAc,KAAK,UAAU;QACvE,OAAQ,UAAiC,CAAC,YAAY,KAAK,UAAU,CACtE,CAAC;AACJ,CAAC","sourcesContent":["import type { ReactiveController, TemplateResult } from 'lit';\n// Type-only import — erased at runtime, so this does not create a runtime\n// import cycle with `controllers/state.ts` (which imports the guards below).\nimport type { StateController } from '../controllers/state.js';\nimport type { ColumnConfiguration, GridHost } from './types.js';\n\n/**\n * Extension point for layering optional features onto the grid without baking\n * them into the community build.\n *\n * A feature module contributes a {@link ReactiveController} that is constructed\n * alongside the grid's built-in controllers (see {@link StateController}). It is\n * the seam used by the first-party `@apexcharts/grid-enterprise` package; it is\n * intentionally minimal and additive so the community `<apex-grid>` element is\n * unaffected (it registers zero modules).\n *\n * @remarks This API lives under the unstable `apex-grid/internal` entry point.\n */\nexport interface GridFeatureModule<T extends object = any> {\n /**\n * Stable identifier, e.g. `'grouping'`. Used to de-duplicate modules and to\n * look the controller up later via {@link StateController.module}.\n */\n readonly id: string;\n\n /**\n * Construct the feature's controller. The controller is expected to register\n * itself with the host (typically `host.addController(this)` in its\n * constructor), exactly like the built-in controllers.\n *\n * @param host The grid host the controller drives.\n * @param state The owning {@link StateController}, passed so a module can\n * coordinate with cross-cutting grid state (e.g. request a cell-decoration\n * refresh via {@link StateController.bumpDecoration} or look up a peer\n * module). Modules that don't need it may ignore the argument.\n */\n create(host: GridHost<T>, state: StateController<T>): ReactiveController;\n}\n\n/**\n * Optional capability a feature module's controller may implement to transform\n * the row set *after* the built-in pipeline (filter → sort → tree) and *before*\n * pagination is sliced at render time. Lets a module inject or reorder rows —\n * e.g. synthesized group-header rows — in the rendered `dataView`.\n *\n * Controllers that don't implement this are skipped, so the community grid\n * (which registers no modules) is unaffected.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface RowTransformer<T extends object = any> {\n /** Return the transformed rows. Must not mutate the input array in place. */\n processRows(rows: ReadonlyArray<T>): T[];\n}\n\n/** Runtime type-guard for {@link RowTransformer}. */\nexport function isRowTransformer<T extends object>(\n controller: unknown\n): controller is RowTransformer<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as RowTransformer<T>).processRows === 'function'\n );\n}\n\n/** Per-row context handed to a {@link RowPresenter}. */\nexport interface RowPresenterContext<T extends object = any> {\n /** The grid's visible columns (post-reorder/visibility). */\n readonly columns: ReadonlyArray<ColumnConfiguration<T>>;\n /** Index of the row within the current page/view. */\n readonly rowIndex: number;\n}\n\n/**\n * A module-rendered, full-width row. Rendered inside a container that spans all\n * columns (`grid-column: 1 / -1`), mirroring the master-detail panel pattern.\n */\nexport interface PresentedRow {\n /** Template rendered inside the full-width container. */\n readonly content: TemplateResult;\n /** Optional 1-based `aria-level` applied to the row element. */\n readonly level?: number;\n /** Optional `aria-expanded` for the row element; omit for non-expandable rows. */\n readonly expanded?: boolean;\n /** Shadow part for the container element; defaults to `group-row`. */\n readonly part?: string;\n}\n\n/**\n * Optional capability a feature module's controller may implement to render\n * specific rows as full-width custom content (e.g. group headers) instead of\n * the normal cell grid. Returns `null` for rows the module does not own.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface RowPresenter<T extends object = any> {\n presentRow(row: T, ctx: RowPresenterContext<T>): PresentedRow | null;\n}\n\n/** Runtime type-guard for {@link RowPresenter}. */\nexport function isRowPresenter<T extends object>(\n controller: unknown\n): controller is RowPresenter<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as RowPresenter<T>).presentRow === 'function'\n );\n}\n\n/** Per-cell context handed to a {@link CellDecorator}. */\nexport interface CellDecoratorContext<T extends object = any> {\n /** The row's backing data (or a synthesized row object). */\n readonly row: T;\n /** Index of the row within the current page/view (matches `host.pageItems`). */\n readonly rowIndex: number;\n /** The cell's column configuration. */\n readonly column: ColumnConfiguration<T>;\n /** The cell's resolved value (`row[column.key]`). */\n readonly value: unknown;\n}\n\n/**\n * A set of host attributes a module asks the cell to reflect on itself. This is\n * the only thing a {@link CellDecorator} returns — styling is expressed by\n * keying CSS off these attributes (the cell ships an inert, variable-driven\n * `:host([data-range])` style; enterprise themes it via inheriting custom\n * properties).\n */\nexport interface CellDecoration {\n /**\n * Attributes to set on the decorated cell host. Use a `data-*` namespace\n * (e.g. `data-range`) so decoration never collides with the cell's built-in\n * reflected attributes (`active`, `editing`, `data-pinned`, …). A `null`/\n * `undefined` value removes the attribute. Attributes set on a previous\n * update that are absent here are removed automatically.\n */\n readonly attributes: Readonly<Record<string, string | null | undefined>>;\n}\n\n/**\n * Optional capability a feature module's controller may implement to decorate\n * individual cells with extra host attributes during the cell's own render\n * lifecycle — e.g. flagging the cells inside a selected range. Consulted per\n * cell via {@link StateController.decorateCell}; controllers that don't\n * implement it are skipped, so the community grid is unaffected.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface CellDecorator<T extends object = any> {\n /** Return decoration for this cell, or `null` to leave it undecorated. */\n decorateCell(ctx: CellDecoratorContext<T>): CellDecoration | null;\n}\n\n/** Runtime type-guard for {@link CellDecorator}. */\nexport function isCellDecorator<T extends object>(\n controller: unknown\n): controller is CellDecorator<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as CellDecorator<T>).decorateCell === 'function'\n );\n}\n\n/**\n * Optional capability a feature module's controller may implement to signal that\n * it provides a **column header menu** (opened from the header's kebab button).\n * The core header shows the kebab whenever a column is sortable or resizable, or\n * when a module reports `true` here, so a feature (e.g. the enterprise context\n * menu) can surface pin / hide / group / chart actions on any column. The module\n * owns the menu content itself (it opens on the `apex-grid-column-menu` event the\n * header dispatches). Inert for the community grid, which registers no modules.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface ColumnMenuProvider {\n /** Whether the column-menu (kebab) button should be offered for columns. */\n providesColumnMenu(): boolean;\n}\n\n/** Runtime type-guard for {@link ColumnMenuProvider}. */\nexport function isColumnMenuProvider(controller: unknown): controller is ColumnMenuProvider {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as ColumnMenuProvider).providesColumnMenu === 'function'\n );\n}\n\n/** The kind of pointer interaction forwarded from a body cell. */\nexport type CellInteractionKind = 'down' | 'over' | 'up';\n\n/** A pointer interaction on a body cell, forwarded to feature modules. */\nexport interface CellInteraction<T extends object = any> {\n /** `down` on press, `over` while the pointer moves across cells, `up` on release. */\n readonly kind: CellInteractionKind;\n /** The cell's row data. */\n readonly row: T;\n /** Index of the row within the current page/view (matches `host.pageItems`). */\n readonly rowIndex: number;\n /** The cell's column configuration. */\n readonly column: ColumnConfiguration<T>;\n readonly shiftKey: boolean;\n readonly ctrlKey: boolean;\n readonly metaKey: boolean;\n /** The originating pointer event (e.g. to call `preventDefault`). */\n readonly originalEvent: PointerEvent;\n}\n\n/**\n * Optional capability a feature module's controller may implement to receive\n * pointer interactions on body cells (press / drag-over / release) — the seam a\n * range-selection feature uses to track a drag. The grid forwards interactions\n * only when at least one feature module is registered, so the community grid\n * pays nothing.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface CellInteractionHandler<T extends object = any> {\n handleCellInteraction(interaction: CellInteraction<T>): void;\n}\n\n/** Runtime type-guard for {@link CellInteractionHandler}. */\nexport function isCellInteractionHandler<T extends object>(\n controller: unknown\n): controller is CellInteractionHandler<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as CellInteractionHandler<T>).handleCellInteraction === 'function'\n );\n}\n\n/**\n * Optional capability a feature module's controller may implement so its state\n * participates in grid-state snapshots ({@link StateController.serializeModuleState}\n * / {@link StateController.restoreModuleState}, driven by `ApexGrid.getState` /\n * `ApexGrid.setState`). The grid collects each implementer's\n * {@link serializeState} output under the module's id and dispatches the\n * matching value back via {@link restoreState} on restore.\n *\n * Controllers that don't implement this are skipped, so the community grid\n * (which registers no modules) contributes nothing to a snapshot.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface SerializableModule {\n /**\n * Return a JSON-serializable snapshot of this module's restorable state\n * (e.g. grouping's `groupBy` + aggregations). Exclude transient/derived\n * state and anything not JSON-safe (functions, DOM nodes).\n */\n serializeState(): unknown;\n /**\n * Restore module state from a value previously produced by\n * {@link serializeState}. Implementations should tolerate partial or\n * unexpected shapes (validate before applying) since the blob is opaque.\n */\n restoreState(data: unknown): void;\n}\n\n/** Runtime type-guard for {@link SerializableModule}. */\nexport function isSerializableModule(controller: unknown): controller is SerializableModule {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as SerializableModule).serializeState === 'function' &&\n typeof (controller as SerializableModule).restoreState === 'function'\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"feature-module.js","sourceRoot":"","sources":["../../src/internal/feature-module.ts"],"names":[],"mappings":"AAwDA,MAAM,UAAU,gBAAgB,CAC9B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAgC,CAAC,WAAW,KAAK,UAAU,CACpE,CAAC;AACJ,CAAC;AAqCD,MAAM,UAAU,cAAc,CAC5B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAA8B,CAAC,UAAU,KAAK,UAAU,CACjE,CAAC;AACJ,CAAC;AAyBD,MAAM,UAAU,iBAAiB,CAC/B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAiC,CAAC,WAAW,KAAK,UAAU,CACrE,CAAC;AACJ,CAAC;AA+CD,MAAM,UAAU,eAAe,CAC7B,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAA+B,CAAC,YAAY,KAAK,UAAU,CACpE,CAAC;AACJ,CAAC;AAmBD,MAAM,UAAU,oBAAoB,CAAC,UAAmB;IACtD,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAiC,CAAC,kBAAkB,KAAK,UAAU,CAC5E,CAAC;AACJ,CAAC;AAoCD,MAAM,UAAU,wBAAwB,CACtC,UAAmB;IAEnB,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAwC,CAAC,qBAAqB,KAAK,UAAU,CACtF,CAAC;AACJ,CAAC;AA+BD,MAAM,UAAU,oBAAoB,CAAC,UAAmB;IACtD,OAAO,CACL,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,OAAQ,UAAiC,CAAC,cAAc,KAAK,UAAU;QACvE,OAAQ,UAAiC,CAAC,YAAY,KAAK,UAAU,CACtE,CAAC;AACJ,CAAC","sourcesContent":["import type { ReactiveController, TemplateResult } from 'lit';\n// Type-only import — erased at runtime, so this does not create a runtime\n// import cycle with `controllers/state.ts` (which imports the guards below).\nimport type { StateController } from '../controllers/state.js';\nimport type { ColumnConfiguration, GridHost } from './types.js';\n\n/**\n * Extension point for layering optional features onto the grid without baking\n * them into the community build.\n *\n * A feature module contributes a {@link ReactiveController} that is constructed\n * alongside the grid's built-in controllers (see {@link StateController}). It is\n * the seam used by the first-party `@apexcharts/grid-enterprise` package; it is\n * intentionally minimal and additive so the community `<apex-grid>` element is\n * unaffected (it registers zero modules).\n *\n * @remarks This API lives under the unstable `apex-grid/internal` entry point.\n */\nexport interface GridFeatureModule<T extends object = any> {\n /**\n * Stable identifier, e.g. `'grouping'`. Used to de-duplicate modules and to\n * look the controller up later via {@link StateController.module}.\n */\n readonly id: string;\n\n /**\n * Construct the feature's controller. The controller is expected to register\n * itself with the host (typically `host.addController(this)` in its\n * constructor), exactly like the built-in controllers.\n *\n * @param host The grid host the controller drives.\n * @param state The owning {@link StateController}, passed so a module can\n * coordinate with cross-cutting grid state (e.g. request a cell-decoration\n * refresh via {@link StateController.bumpDecoration} or look up a peer\n * module). Modules that don't need it may ignore the argument.\n */\n create(host: GridHost<T>, state: StateController<T>): ReactiveController;\n}\n\n/**\n * Optional capability a feature module's controller may implement to transform\n * the row set *after* the built-in pipeline (filter → sort → tree) and *before*\n * pagination is sliced at render time. Lets a module inject or reorder rows —\n * e.g. synthesized group-header rows — in the rendered `dataView`.\n *\n * Controllers that don't implement this are skipped, so the community grid\n * (which registers no modules) is unaffected.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface RowTransformer<T extends object = any> {\n /** Return the transformed rows. Must not mutate the input array in place. */\n processRows(rows: ReadonlyArray<T>): T[];\n}\n\n/** Runtime type-guard for {@link RowTransformer}. */\nexport function isRowTransformer<T extends object>(\n controller: unknown\n): controller is RowTransformer<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as RowTransformer<T>).processRows === 'function'\n );\n}\n\n/** Per-row context handed to a {@link RowPresenter}. */\nexport interface RowPresenterContext<T extends object = any> {\n /** The grid's visible columns (post-reorder/visibility). */\n readonly columns: ReadonlyArray<ColumnConfiguration<T>>;\n /** Index of the row within the current page/view. */\n readonly rowIndex: number;\n}\n\n/**\n * A module-rendered, full-width row. Rendered inside a container that spans all\n * columns (`grid-column: 1 / -1`), mirroring the master-detail panel pattern.\n */\nexport interface PresentedRow {\n /** Template rendered inside the full-width container. */\n readonly content: TemplateResult;\n /** Optional 1-based `aria-level` applied to the row element. */\n readonly level?: number;\n /** Optional `aria-expanded` for the row element; omit for non-expandable rows. */\n readonly expanded?: boolean;\n /** Shadow part for the container element; defaults to `group-row`. */\n readonly part?: string;\n}\n\n/**\n * Optional capability a feature module's controller may implement to render\n * specific rows as full-width custom content (e.g. group headers) instead of\n * the normal cell grid. Returns `null` for rows the module does not own.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface RowPresenter<T extends object = any> {\n presentRow(row: T, ctx: RowPresenterContext<T>): PresentedRow | null;\n}\n\n/** Runtime type-guard for {@link RowPresenter}. */\nexport function isRowPresenter<T extends object>(\n controller: unknown\n): controller is RowPresenter<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as RowPresenter<T>).presentRow === 'function'\n );\n}\n\n/** ARIA tree/expansion semantics a module can attach to a normal (cell-rendered) row. */\nexport interface RowAria {\n /** 1-based `aria-level` for the row element. */\n readonly level?: number;\n /** `aria-expanded` for the row element; omit for non-expandable rows. */\n readonly expanded?: boolean;\n}\n\n/**\n * Optional capability a module's controller may implement to attach ARIA\n * tree/expansion semantics (`aria-level` / `aria-expanded`) to rows that still\n * render as a normal cell grid — unlike {@link RowPresenter}, which replaces the\n * cells with full-width content. Used by pivoting's expandable row groups, whose\n * parent rows must keep showing per-column aggregate values. Returns `null` for\n * rows the module does not own.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface RowAriaProvider<T extends object = any> {\n describeRow(row: T, ctx: RowPresenterContext<T>): RowAria | null;\n}\n\n/** Runtime type-guard for {@link RowAriaProvider}. */\nexport function isRowAriaProvider<T extends object>(\n controller: unknown\n): controller is RowAriaProvider<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as RowAriaProvider<T>).describeRow === 'function'\n );\n}\n\n/** Per-cell context handed to a {@link CellDecorator}. */\nexport interface CellDecoratorContext<T extends object = any> {\n /** The row's backing data (or a synthesized row object). */\n readonly row: T;\n /** Index of the row within the current page/view (matches `host.pageItems`). */\n readonly rowIndex: number;\n /** The cell's column configuration. */\n readonly column: ColumnConfiguration<T>;\n /** The cell's resolved value (`row[column.key]`). */\n readonly value: unknown;\n}\n\n/**\n * A set of host attributes a module asks the cell to reflect on itself. This is\n * the only thing a {@link CellDecorator} returns — styling is expressed by\n * keying CSS off these attributes (the cell ships an inert, variable-driven\n * `:host([data-range])` style; enterprise themes it via inheriting custom\n * properties).\n */\nexport interface CellDecoration {\n /**\n * Attributes to set on the decorated cell host. Use a `data-*` namespace\n * (e.g. `data-range`) so decoration never collides with the cell's built-in\n * reflected attributes (`active`, `editing`, `data-pinned`, …). A `null`/\n * `undefined` value removes the attribute. Attributes set on a previous\n * update that are absent here are removed automatically.\n */\n readonly attributes: Readonly<Record<string, string | null | undefined>>;\n}\n\n/**\n * Optional capability a feature module's controller may implement to decorate\n * individual cells with extra host attributes during the cell's own render\n * lifecycle — e.g. flagging the cells inside a selected range. Consulted per\n * cell via {@link StateController.decorateCell}; controllers that don't\n * implement it are skipped, so the community grid is unaffected.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface CellDecorator<T extends object = any> {\n /** Return decoration for this cell, or `null` to leave it undecorated. */\n decorateCell(ctx: CellDecoratorContext<T>): CellDecoration | null;\n}\n\n/** Runtime type-guard for {@link CellDecorator}. */\nexport function isCellDecorator<T extends object>(\n controller: unknown\n): controller is CellDecorator<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as CellDecorator<T>).decorateCell === 'function'\n );\n}\n\n/**\n * Optional capability a feature module's controller may implement to signal that\n * it provides a **column header menu** (opened from the header's kebab button).\n * The core header shows the kebab whenever a column is sortable or resizable, or\n * when a module reports `true` here, so a feature (e.g. the enterprise context\n * menu) can surface pin / hide / group / chart actions on any column. The module\n * owns the menu content itself (it opens on the `apex-grid-column-menu` event the\n * header dispatches). Inert for the community grid, which registers no modules.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface ColumnMenuProvider {\n /** Whether the column-menu (kebab) button should be offered for columns. */\n providesColumnMenu(): boolean;\n}\n\n/** Runtime type-guard for {@link ColumnMenuProvider}. */\nexport function isColumnMenuProvider(controller: unknown): controller is ColumnMenuProvider {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as ColumnMenuProvider).providesColumnMenu === 'function'\n );\n}\n\n/** The kind of pointer interaction forwarded from a body cell. */\nexport type CellInteractionKind = 'down' | 'over' | 'up';\n\n/** A pointer interaction on a body cell, forwarded to feature modules. */\nexport interface CellInteraction<T extends object = any> {\n /** `down` on press, `over` while the pointer moves across cells, `up` on release. */\n readonly kind: CellInteractionKind;\n /** The cell's row data. */\n readonly row: T;\n /** Index of the row within the current page/view (matches `host.pageItems`). */\n readonly rowIndex: number;\n /** The cell's column configuration. */\n readonly column: ColumnConfiguration<T>;\n readonly shiftKey: boolean;\n readonly ctrlKey: boolean;\n readonly metaKey: boolean;\n /** The originating pointer event (e.g. to call `preventDefault`). */\n readonly originalEvent: PointerEvent;\n}\n\n/**\n * Optional capability a feature module's controller may implement to receive\n * pointer interactions on body cells (press / drag-over / release) — the seam a\n * range-selection feature uses to track a drag. The grid forwards interactions\n * only when at least one feature module is registered, so the community grid\n * pays nothing.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface CellInteractionHandler<T extends object = any> {\n handleCellInteraction(interaction: CellInteraction<T>): void;\n}\n\n/** Runtime type-guard for {@link CellInteractionHandler}. */\nexport function isCellInteractionHandler<T extends object>(\n controller: unknown\n): controller is CellInteractionHandler<T> {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as CellInteractionHandler<T>).handleCellInteraction === 'function'\n );\n}\n\n/**\n * Optional capability a feature module's controller may implement so its state\n * participates in grid-state snapshots ({@link StateController.serializeModuleState}\n * / {@link StateController.restoreModuleState}, driven by `ApexGrid.getState` /\n * `ApexGrid.setState`). The grid collects each implementer's\n * {@link serializeState} output under the module's id and dispatches the\n * matching value back via {@link restoreState} on restore.\n *\n * Controllers that don't implement this are skipped, so the community grid\n * (which registers no modules) contributes nothing to a snapshot.\n *\n * @remarks Unstable; part of `apex-grid/internal`.\n */\nexport interface SerializableModule {\n /**\n * Return a JSON-serializable snapshot of this module's restorable state\n * (e.g. grouping's `groupBy` + aggregations). Exclude transient/derived\n * state and anything not JSON-safe (functions, DOM nodes).\n */\n serializeState(): unknown;\n /**\n * Restore module state from a value previously produced by\n * {@link serializeState}. Implementations should tolerate partial or\n * unexpected shapes (validate before applying) since the blob is opaque.\n */\n restoreState(data: unknown): void;\n}\n\n/** Runtime type-guard for {@link SerializableModule}. */\nexport function isSerializableModule(controller: unknown): controller is SerializableModule {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n typeof (controller as SerializableModule).serializeState === 'function' &&\n typeof (controller as SerializableModule).restoreState === 'function'\n );\n}\n"]}
|
package/internal/index.d.ts
CHANGED
|
@@ -15,8 +15,8 @@ export { gridStateContext, StateController } from '../controllers/state.js';
|
|
|
15
15
|
export { PIPELINE } from './constants.js';
|
|
16
16
|
export type { ExportCellValue, ExportFormat, ExportOptions } from './export.js';
|
|
17
17
|
export { downloadBlob, getColumnLabel, resolveExportColumns, resolveExportRows, resolveExportValue, } from './export.js';
|
|
18
|
-
export type { CellDecoration, CellDecorator, CellDecoratorContext, CellInteraction, CellInteractionHandler, CellInteractionKind, ColumnMenuProvider, GridFeatureModule, PresentedRow, RowPresenter, RowPresenterContext, RowTransformer, SerializableModule, } from './feature-module.js';
|
|
19
|
-
export { isCellDecorator, isCellInteractionHandler, isColumnMenuProvider, isRowPresenter, isRowTransformer, isSerializableModule, } from './feature-module.js';
|
|
18
|
+
export type { CellDecoration, CellDecorator, CellDecoratorContext, CellInteraction, CellInteractionHandler, CellInteractionKind, ColumnMenuProvider, GridFeatureModule, PresentedRow, RowAria, RowAriaProvider, RowPresenter, RowPresenterContext, RowTransformer, SerializableModule, } from './feature-module.js';
|
|
19
|
+
export { isCellDecorator, isCellInteractionHandler, isColumnMenuProvider, isRowAriaProvider, isRowPresenter, isRowTransformer, isSerializableModule, } from './feature-module.js';
|
|
20
20
|
export { registerComponent } from './register.js';
|
|
21
21
|
export type { ColumnLayoutState, FilterStateSnapshot, GetStateOptions, GridState, RowRef, SetStateOptions, SortStateSnapshot, } from './state-snapshot.js';
|
|
22
22
|
export { applyColumnLayout, deserializeFilter, resolveRowRefs, serializeColumnLayout, serializeFilter, serializeRowRefs, serializeSort, } from './state-snapshot.js';
|
package/internal/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { ApexGrid } from '../components/grid.js';
|
|
|
2
2
|
export { gridStateContext, StateController } from '../controllers/state.js';
|
|
3
3
|
export { PIPELINE } from './constants.js';
|
|
4
4
|
export { downloadBlob, getColumnLabel, resolveExportColumns, resolveExportRows, resolveExportValue, } from './export.js';
|
|
5
|
-
export { isCellDecorator, isCellInteractionHandler, isColumnMenuProvider, isRowPresenter, isRowTransformer, isSerializableModule, } from './feature-module.js';
|
|
5
|
+
export { isCellDecorator, isCellInteractionHandler, isColumnMenuProvider, isRowAriaProvider, isRowPresenter, isRowTransformer, isSerializableModule, } from './feature-module.js';
|
|
6
6
|
export { registerComponent } from './register.js';
|
|
7
7
|
export { applyColumnLayout, deserializeFilter, resolveRowRefs, serializeColumnLayout, serializeFilter, serializeRowRefs, serializeSort, } from './state-snapshot.js';
|
|
8
8
|
export { getDisplayColumns } from './utils.js';
|
package/internal/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/internal/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/internal/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAkBrB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAUlD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["/**\n * Unstable, first-party extension surface for `apex-grid`.\n *\n * This entry point (`apex-grid/internal`) exposes the internals that the\n * first-party `@apexcharts/grid-enterprise` package builds on: the grid class,\n * its state controller, the component registration helper, and the feature\n * module contract. It is intentionally separate from the public `.` barrel.\n *\n * @remarks\n * No semver guarantees are made for these exports. They may change between\n * minor releases. Do not depend on them from third-party code.\n */\nexport { ApexGrid } from '../components/grid.js';\nexport { gridStateContext, StateController } from '../controllers/state.js';\nexport { PIPELINE } from './constants.js';\nexport type { ExportCellValue, ExportFormat, ExportOptions } from './export.js';\nexport {\n downloadBlob,\n getColumnLabel,\n resolveExportColumns,\n resolveExportRows,\n resolveExportValue,\n} from './export.js';\nexport type {\n CellDecoration,\n CellDecorator,\n CellDecoratorContext,\n CellInteraction,\n CellInteractionHandler,\n CellInteractionKind,\n ColumnMenuProvider,\n GridFeatureModule,\n PresentedRow,\n RowAria,\n RowAriaProvider,\n RowPresenter,\n RowPresenterContext,\n RowTransformer,\n SerializableModule,\n} from './feature-module.js';\nexport {\n isCellDecorator,\n isCellInteractionHandler,\n isColumnMenuProvider,\n isRowAriaProvider,\n isRowPresenter,\n isRowTransformer,\n isSerializableModule,\n} from './feature-module.js';\nexport { registerComponent } from './register.js';\nexport type {\n ColumnLayoutState,\n FilterStateSnapshot,\n GetStateOptions,\n GridState,\n RowRef,\n SetStateOptions,\n SortStateSnapshot,\n} from './state-snapshot.js';\nexport {\n applyColumnLayout,\n deserializeFilter,\n resolveRowRefs,\n serializeColumnLayout,\n serializeFilter,\n serializeRowRefs,\n serializeSort,\n} from './state-snapshot.js';\nexport type { ActiveNode, ColumnConfiguration, GridHost, Keys, ToolbarAction } from './types.js';\nexport { getDisplayColumns } from './utils.js';\n"]}
|
package/internal/utils.d.ts
CHANGED
|
@@ -39,3 +39,17 @@ export declare function getPinEdge<T extends object>(displayColumns: Array<Colum
|
|
|
39
39
|
export declare function autoGenerateColumns<T extends object>(grid: GridHost<T>): void;
|
|
40
40
|
export declare function asArray<T>(value: T | T[]): T[];
|
|
41
41
|
export declare function getFilterOperandsFor<T extends object>(column: ColumnConfiguration<T>): Readonly<import("../operations/filter/types.js").FilterOperands<number, import("../operations/filter/operands/number.js").NumberKeys>> | Readonly<import("../operations/filter/types.js").FilterOperands<string, import("../operations/filter/operands/string.js").StringKeys>> | Readonly<import("../operations/filter/types.js").FilterOperands<boolean, import("../operations/filter/operands/boolean.js").BooleanKeys>>;
|
|
42
|
+
/**
|
|
43
|
+
* Whether an element renders right-to-left.
|
|
44
|
+
*
|
|
45
|
+
* The grid's stylesheets are written entirely in logical properties
|
|
46
|
+
* (`inline-size`, `inset-inline-start`, `border-inline-end`, …), so layout
|
|
47
|
+
* mirrors under `dir="rtl"` with no extra CSS. What does *not* mirror by itself
|
|
48
|
+
* is code that reasons in physical pixels or physical key names: resizing from
|
|
49
|
+
* a `clientX` delta, deciding a drop side from a midpoint, and mapping
|
|
50
|
+
* ArrowLeft/ArrowRight onto previous/next column. Those read this.
|
|
51
|
+
*
|
|
52
|
+
* Resolved from the computed style rather than the `dir` attribute so an
|
|
53
|
+
* inherited direction (the common case: `dir` on `<html>`) is honoured.
|
|
54
|
+
*/
|
|
55
|
+
export declare function isRTL(element: Element): boolean;
|
package/internal/utils.js
CHANGED
|
@@ -89,4 +89,9 @@ export function getFilterOperandsFor(column) {
|
|
|
89
89
|
return StringOperands;
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
+
export function isRTL(element) {
|
|
93
|
+
if (typeof getComputedStyle !== 'function')
|
|
94
|
+
return false;
|
|
95
|
+
return getComputedStyle(element).direction === 'rtl';
|
|
96
|
+
}
|
|
92
97
|
//# sourceMappingURL=utils.js.map
|
package/internal/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAIzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAC/B,OAAsC,EACtC,UAKI,EAAE;IAEN,MAAM,MAAM,GAAG,OAAO;SACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;SAC9B,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,oBAAoB,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,GAAG,sBAAsB,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,GAAG,sBAAsB,IAAI,CAAC,CAAC;IAChD,CAAC;IAGD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,2BAA2B,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,uBAAuB,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACvD,CAAC;AAOD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC;QACF,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;QACvD,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAC/B,OAAsC;IAEtC,MAAM,KAAK,GAAkC,EAAE,CAAC;IAChD,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,MAAM,GAAG,GAAkC,EAAE,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;YAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;AACvC,CAAC;AAOD,MAAM,UAAU,UAAU,CACxB,cAA6C,EAC7C,KAAa;IAEb,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAEjC,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM;gBAAE,SAAS;YAC1B,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM;YAAE,SAAS;QAC1B,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAmB,IAAiB;IACrE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACzD,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC3F,OAAO,EAAE,GAAG,EAAE,IAAI,EAA4B,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,KAAc;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAmB,MAA8B;IAEnF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC;QACxB;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC","sourcesContent":["import type { StyleInfo } from 'lit/directives/style-map.js';\nimport { BooleanOperands } from '../operations/filter/operands/boolean.js';\nimport { NumberOperands } from '../operations/filter/operands/number.js';\nimport { StringOperands } from '../operations/filter/operands/string.js';\nimport type { ColumnConfiguration, DataType, GridHost } from './types.js';\n\n/** Width of the auto-rendered selection (checkbox) column in CSS pixels. */\nexport const SELECTION_COLUMN_WIDTH = 44;\n/** Width of the auto-rendered expansion (chevron) column in CSS pixels. */\nexport const EXPANSION_COLUMN_WIDTH = 40;\n/** Width of the auto-rendered row-reorder (grip handle) column in CSS pixels. */\nexport const REORDER_HANDLE_COLUMN_WIDTH = 36;\n/** Width of the transient spreadsheet row-number gutter in CSS pixels. */\nexport const ROW_NUMBER_COLUMN_WIDTH = 48;\n\nexport function applyColumnWidths<T extends object>(\n columns: Array<ColumnConfiguration<T>>,\n options: {\n showSelectionColumn?: boolean;\n showExpansionColumn?: boolean;\n showReorderHandle?: boolean;\n showRowNumbers?: boolean;\n } = {}\n): StyleInfo {\n const tracks = columns\n .filter((each) => !each.hidden)\n .map(({ width }) => width ?? 'minmax(136px, 1fr)');\n if (options.showExpansionColumn) {\n tracks.unshift(`${EXPANSION_COLUMN_WIDTH}px`);\n }\n if (options.showSelectionColumn) {\n tracks.unshift(`${SELECTION_COLUMN_WIDTH}px`);\n }\n // Unshifted last so the grip handle is the leftmost leading column, ahead of\n // any selection / expansion chrome.\n if (options.showReorderHandle) {\n tracks.unshift(`${REORDER_HANDLE_COLUMN_WIDTH}px`);\n }\n // The spreadsheet row-number gutter is the very first column (matches A1).\n if (options.showRowNumbers) {\n tracks.unshift(`${ROW_NUMBER_COLUMN_WIDTH}px`);\n }\n return { 'grid-template-columns': tracks.join(' ') };\n}\n\n/**\n * The spreadsheet column letter for a zero-based column index (`0 → A`,\n * `25 → Z`, `26 → AA`). Used for the transient A1 coordinate hints shown while a\n * formula cell is being edited.\n */\nexport function columnLetter(index: number): string {\n let n = index;\n let letters = '';\n do {\n letters = String.fromCharCode(65 + (n % 26)) + letters;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return letters;\n}\n\n/**\n * Returns the visual render order of the columns: start-pinned columns first,\n * then unpinned columns, then end-pinned columns. Within each group the\n * original `columns` array order is preserved.\n *\n * @remarks\n * The grid uses this order for rendering, navigation, and CSS grid track widths.\n * The user-supplied `columns` array is never mutated; this returns a new array.\n */\nexport function getDisplayColumns<T extends object>(\n columns: Array<ColumnConfiguration<T>>\n): Array<ColumnConfiguration<T>> {\n const start: Array<ColumnConfiguration<T>> = [];\n const middle: Array<ColumnConfiguration<T>> = [];\n const end: Array<ColumnConfiguration<T>> = [];\n for (const column of columns) {\n if (column.pinned === 'start') start.push(column);\n else if (column.pinned === 'end') end.push(column);\n else middle.push(column);\n }\n return [...start, ...middle, ...end];\n}\n\n/**\n * Returns `'start'` for the last visible start-pinned column, `'end'` for the\n * first visible end-pinned column, or `null` otherwise. The edge column gets a\n * subtle shadow / border to separate the pinned region from the scrolling one.\n */\nexport function getPinEdge<T extends object>(\n displayColumns: Array<ColumnConfiguration<T>>,\n index: number\n): 'start' | 'end' | null {\n const column = displayColumns[index];\n if (!column?.pinned) return null;\n\n if (column.pinned === 'start') {\n for (let i = index + 1; i < displayColumns.length; i++) {\n const next = displayColumns[i];\n if (next.hidden) continue;\n return next.pinned === 'start' ? null : 'start';\n }\n return 'start';\n }\n\n for (let i = index - 1; i >= 0; i--) {\n const prev = displayColumns[i];\n if (prev.hidden) continue;\n return prev.pinned === 'end' ? null : 'end';\n }\n return 'end';\n}\n\nexport function autoGenerateColumns<T extends object>(grid: GridHost<T>) {\n if (grid.autoGenerate && grid.columns.length < 1) {\n const record = grid.data[0] ?? {};\n\n grid.columns = Object.entries(record).map(([key, value]) => {\n const type: DataType =\n typeof value === 'boolean' ? 'boolean' : typeof value === 'number' ? 'number' : 'string';\n return { key, type } as ColumnConfiguration<T>;\n });\n }\n}\n\nexport function asArray<T>(value: T | T[]) {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function getFilterOperandsFor<T extends object>(column: ColumnConfiguration<T>) {\n // Check for custom class in the filter config\n switch (column.type) {\n case 'boolean':\n return BooleanOperands;\n case 'number':\n return NumberOperands;\n default:\n return StringOperands;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StyleInfo } from 'lit/directives/style-map.js';\nimport { BooleanOperands } from '../operations/filter/operands/boolean.js';\nimport { NumberOperands } from '../operations/filter/operands/number.js';\nimport { StringOperands } from '../operations/filter/operands/string.js';\nimport type { ColumnConfiguration, DataType, GridHost } from './types.js';\n\n/** Width of the auto-rendered selection (checkbox) column in CSS pixels. */\nexport const SELECTION_COLUMN_WIDTH = 44;\n/** Width of the auto-rendered expansion (chevron) column in CSS pixels. */\nexport const EXPANSION_COLUMN_WIDTH = 40;\n/** Width of the auto-rendered row-reorder (grip handle) column in CSS pixels. */\nexport const REORDER_HANDLE_COLUMN_WIDTH = 36;\n/** Width of the transient spreadsheet row-number gutter in CSS pixels. */\nexport const ROW_NUMBER_COLUMN_WIDTH = 48;\n\nexport function applyColumnWidths<T extends object>(\n columns: Array<ColumnConfiguration<T>>,\n options: {\n showSelectionColumn?: boolean;\n showExpansionColumn?: boolean;\n showReorderHandle?: boolean;\n showRowNumbers?: boolean;\n } = {}\n): StyleInfo {\n const tracks = columns\n .filter((each) => !each.hidden)\n .map(({ width }) => width ?? 'minmax(136px, 1fr)');\n if (options.showExpansionColumn) {\n tracks.unshift(`${EXPANSION_COLUMN_WIDTH}px`);\n }\n if (options.showSelectionColumn) {\n tracks.unshift(`${SELECTION_COLUMN_WIDTH}px`);\n }\n // Unshifted last so the grip handle is the leftmost leading column, ahead of\n // any selection / expansion chrome.\n if (options.showReorderHandle) {\n tracks.unshift(`${REORDER_HANDLE_COLUMN_WIDTH}px`);\n }\n // The spreadsheet row-number gutter is the very first column (matches A1).\n if (options.showRowNumbers) {\n tracks.unshift(`${ROW_NUMBER_COLUMN_WIDTH}px`);\n }\n return { 'grid-template-columns': tracks.join(' ') };\n}\n\n/**\n * The spreadsheet column letter for a zero-based column index (`0 → A`,\n * `25 → Z`, `26 → AA`). Used for the transient A1 coordinate hints shown while a\n * formula cell is being edited.\n */\nexport function columnLetter(index: number): string {\n let n = index;\n let letters = '';\n do {\n letters = String.fromCharCode(65 + (n % 26)) + letters;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return letters;\n}\n\n/**\n * Returns the visual render order of the columns: start-pinned columns first,\n * then unpinned columns, then end-pinned columns. Within each group the\n * original `columns` array order is preserved.\n *\n * @remarks\n * The grid uses this order for rendering, navigation, and CSS grid track widths.\n * The user-supplied `columns` array is never mutated; this returns a new array.\n */\nexport function getDisplayColumns<T extends object>(\n columns: Array<ColumnConfiguration<T>>\n): Array<ColumnConfiguration<T>> {\n const start: Array<ColumnConfiguration<T>> = [];\n const middle: Array<ColumnConfiguration<T>> = [];\n const end: Array<ColumnConfiguration<T>> = [];\n for (const column of columns) {\n if (column.pinned === 'start') start.push(column);\n else if (column.pinned === 'end') end.push(column);\n else middle.push(column);\n }\n return [...start, ...middle, ...end];\n}\n\n/**\n * Returns `'start'` for the last visible start-pinned column, `'end'` for the\n * first visible end-pinned column, or `null` otherwise. The edge column gets a\n * subtle shadow / border to separate the pinned region from the scrolling one.\n */\nexport function getPinEdge<T extends object>(\n displayColumns: Array<ColumnConfiguration<T>>,\n index: number\n): 'start' | 'end' | null {\n const column = displayColumns[index];\n if (!column?.pinned) return null;\n\n if (column.pinned === 'start') {\n for (let i = index + 1; i < displayColumns.length; i++) {\n const next = displayColumns[i];\n if (next.hidden) continue;\n return next.pinned === 'start' ? null : 'start';\n }\n return 'start';\n }\n\n for (let i = index - 1; i >= 0; i--) {\n const prev = displayColumns[i];\n if (prev.hidden) continue;\n return prev.pinned === 'end' ? null : 'end';\n }\n return 'end';\n}\n\nexport function autoGenerateColumns<T extends object>(grid: GridHost<T>) {\n if (grid.autoGenerate && grid.columns.length < 1) {\n const record = grid.data[0] ?? {};\n\n grid.columns = Object.entries(record).map(([key, value]) => {\n const type: DataType =\n typeof value === 'boolean' ? 'boolean' : typeof value === 'number' ? 'number' : 'string';\n return { key, type } as ColumnConfiguration<T>;\n });\n }\n}\n\nexport function asArray<T>(value: T | T[]) {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function getFilterOperandsFor<T extends object>(column: ColumnConfiguration<T>) {\n // Check for custom class in the filter config\n switch (column.type) {\n case 'boolean':\n return BooleanOperands;\n case 'number':\n return NumberOperands;\n default:\n return StringOperands;\n }\n}\n\n/**\n * Whether an element renders right-to-left.\n *\n * The grid's stylesheets are written entirely in logical properties\n * (`inline-size`, `inset-inline-start`, `border-inline-end`, …), so layout\n * mirrors under `dir=\"rtl\"` with no extra CSS. What does *not* mirror by itself\n * is code that reasons in physical pixels or physical key names: resizing from\n * a `clientX` delta, deciding a drop side from a midpoint, and mapping\n * ArrowLeft/ArrowRight onto previous/next column. Those read this.\n *\n * Resolved from the computed style rather than the `dir` attribute so an\n * inherited direction (the common case: `dir` on `<html>`) is honoured.\n */\nexport function isRTL(element: Element): boolean {\n if (typeof getComputedStyle !== 'function') return false;\n return getComputedStyle(element).direction === 'rtl';\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apex-grid",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "Web component data grid following open-wc recommendations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lit",
|
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@lit-labs/virtualizer": "~2.1.0",
|
|
42
42
|
"@lit/context": "~1.1.5",
|
|
43
|
-
"igniteui-webcomponents": "~6.1.0",
|
|
44
43
|
"lit": "^3.3.0"
|
|
45
44
|
}
|
|
46
45
|
}
|
package/setup.d.ts
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
type ApexGridTheme = 'bootstrap' | 'material' | 'fluent' | 'indigo';
|
|
2
2
|
export interface ApexGridSetupOptions {
|
|
3
3
|
/**
|
|
4
|
-
* @deprecated
|
|
5
|
-
* itself entirely through `--ag-*` CSS custom properties (see the README's
|
|
6
|
-
* theming section). This option does **not** affect the grid's appearance;
|
|
7
|
-
* it only forwards to igniteui-webcomponents' `configureTheme()` for apps
|
|
8
|
-
* that embed the grid alongside igniteui components. When set, the grid
|
|
9
|
-
* still auto-tints from the igniteui palette via its `--ig-*` fallbacks.
|
|
10
|
-
* Omit it and customize via CSS variables instead. Will be removed in a
|
|
11
|
-
* future major version.
|
|
4
|
+
* @deprecated Inert, and accepted only so existing calls keep compiling.
|
|
12
5
|
*
|
|
13
|
-
*
|
|
6
|
+
* The grid never shipped its own per-framework themes — it styles itself
|
|
7
|
+
* entirely through `--ag-*` CSS custom properties (see the README's theming
|
|
8
|
+
* section), so this option never affected its appearance. It used to forward
|
|
9
|
+
* to `configureTheme()` from `igniteui-webcomponents`, which made a whole
|
|
10
|
+
* component library a runtime dependency of every consumer for one
|
|
11
|
+
* pass-through call. The dependency is gone and so is the forwarding.
|
|
12
|
+
*
|
|
13
|
+
* If you were relying on that side effect to theme your own Ignite UI
|
|
14
|
+
* components, call `configureTheme()` yourself. Passing this option now warns
|
|
15
|
+
* once and does nothing else; it will be removed in the next major version.
|
|
14
16
|
*/
|
|
15
17
|
theme?: ApexGridTheme;
|
|
16
18
|
/**
|
|
@@ -33,8 +35,7 @@ export interface ApexGridSetupOptions {
|
|
|
33
35
|
* than once; host styles are adopted only on the first call.
|
|
34
36
|
*
|
|
35
37
|
* Customize the look by overriding `--ag-*` CSS variables (see the README).
|
|
36
|
-
* The deprecated {@link ApexGridSetupOptions.theme} option
|
|
37
|
-
* igniteui-webcomponents and does not change the grid's appearance.
|
|
38
|
+
* The deprecated {@link ApexGridSetupOptions.theme} option is inert.
|
|
38
39
|
*
|
|
39
40
|
* @example
|
|
40
41
|
* ```ts
|
package/setup.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { configureTheme } from 'igniteui-webcomponents';
|
|
2
1
|
import { ApexGrid } from './components/grid.js';
|
|
3
2
|
const HOST_CSS = 'apex-grid { height: 100%; min-height: 240px; }';
|
|
4
3
|
let hostStylesInjected = false;
|
|
@@ -18,12 +17,21 @@ function adoptHostStyles() {
|
|
|
18
17
|
}
|
|
19
18
|
hostStylesInjected = true;
|
|
20
19
|
}
|
|
20
|
+
let themeWarned = false;
|
|
21
|
+
function warnThemeIsInert() {
|
|
22
|
+
if (themeWarned)
|
|
23
|
+
return;
|
|
24
|
+
themeWarned = true;
|
|
25
|
+
console.warn('[apex-grid] `setup({ theme })` is inert and will be removed. The grid styles ' +
|
|
26
|
+
'itself through `--ag-*` CSS custom properties; this option only ever forwarded ' +
|
|
27
|
+
"to igniteui-webcomponents' `configureTheme()`, which is no longer a dependency. " +
|
|
28
|
+
'Call `configureTheme()` directly if you need it, and drop the option.');
|
|
29
|
+
}
|
|
21
30
|
export function setup(options = {}) {
|
|
22
31
|
const { theme, hostStyles = true } = options;
|
|
23
32
|
ApexGrid.register();
|
|
24
|
-
if (theme !== undefined)
|
|
25
|
-
|
|
26
|
-
}
|
|
33
|
+
if (theme !== undefined)
|
|
34
|
+
warnThemeIsInert();
|
|
27
35
|
if (hostStyles) {
|
|
28
36
|
adoptHostStyles();
|
|
29
37
|
}
|
package/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AA+BhD,MAAM,QAAQ,GAAG,gDAAgD,CAAC;AAClE,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,SAAS,eAAe;IACtB,IAAI,kBAAkB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAElE,IAAI,oBAAoB,IAAI,QAAQ,CAAC,SAAS,IAAI,aAAa,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC3F,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5B,QAAQ,CAAC,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QACpD,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB,GAAG,IAAI,CAAC;AAC5B,CAAC;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,SAAS,gBAAgB;IACvB,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,OAAO,CAAC,IAAI,CACV,+EAA+E;QAC7E,iFAAiF;QACjF,kFAAkF;QAClF,uEAAuE,CAC1E,CAAC;AACJ,CAAC;AA0BD,MAAM,UAAU,KAAK,CAAC,UAAgC,EAAE;IACtD,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7C,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAEpB,IAAI,KAAK,KAAK,SAAS;QAAE,gBAAgB,EAAE,CAAC;IAE5C,IAAI,UAAU,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import { ApexGrid } from './components/grid.js';\n\ntype ApexGridTheme = 'bootstrap' | 'material' | 'fluent' | 'indigo';\n\nexport interface ApexGridSetupOptions {\n /**\n * @deprecated Inert, and accepted only so existing calls keep compiling.\n *\n * The grid never shipped its own per-framework themes — it styles itself\n * entirely through `--ag-*` CSS custom properties (see the README's theming\n * section), so this option never affected its appearance. It used to forward\n * to `configureTheme()` from `igniteui-webcomponents`, which made a whole\n * component library a runtime dependency of every consumer for one\n * pass-through call. The dependency is gone and so is the forwarding.\n *\n * If you were relying on that side effect to theme your own Ignite UI\n * components, call `configureTheme()` yourself. Passing this option now warns\n * once and does nothing else; it will be removed in the next major version.\n */\n theme?: ApexGridTheme;\n\n /**\n * Whether to adopt a default host stylesheet that sets `height: 100%`\n * with a `min-height: 240px` fallback. Set to `false` if you want to\n * provide your own host sizing.\n *\n * @defaultValue true\n */\n hostStyles?: boolean;\n}\n\nconst HOST_CSS = 'apex-grid { height: 100%; min-height: 240px; }';\nlet hostStylesInjected = false;\n\nfunction adoptHostStyles(): void {\n if (hostStylesInjected || typeof document === 'undefined') return;\n\n if ('adoptedStyleSheets' in Document.prototype && 'replaceSync' in CSSStyleSheet.prototype) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(HOST_CSS);\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n } else {\n const style = document.createElement('style');\n style.setAttribute('data-apex-grid', 'host-styles');\n style.textContent = HOST_CSS;\n document.head.appendChild(style);\n }\n\n hostStylesInjected = true;\n}\n\nlet themeWarned = false;\n\nfunction warnThemeIsInert(): void {\n if (themeWarned) return;\n themeWarned = true;\n // biome-ignore lint/suspicious/noConsole: intentional one-shot deprecation diagnostic\n console.warn(\n '[apex-grid] `setup({ theme })` is inert and will be removed. The grid styles ' +\n 'itself through `--ag-*` CSS custom properties; this option only ever forwarded ' +\n \"to igniteui-webcomponents' `configureTheme()`, which is no longer a dependency. \" +\n 'Call `configureTheme()` directly if you need it, and drop the option.'\n );\n}\n\n/**\n * One-call convenience: registers `<apex-grid>` and adopts a default host\n * stylesheet so the virtualizer has a bounded height. The grid is styled\n * out-of-the-box via `--ag-*` CSS custom properties — no theme import needed.\n *\n * @remarks\n * This is an **additive** alternative to the manual setup\n * (`import 'apex-grid/define'` + host CSS). Idempotent — safe to call more\n * than once; host styles are adopted only on the first call.\n *\n * Customize the look by overriding `--ag-*` CSS variables (see the README).\n * The deprecated {@link ApexGridSetupOptions.theme} option is inert.\n *\n * @example\n * ```ts\n * import { setup } from 'apex-grid';\n * setup();\n * ```\n *\n * @example Opt out of injected host styles:\n * ```ts\n * setup({ hostStyles: false });\n * ```\n */\nexport function setup(options: ApexGridSetupOptions = {}): void {\n const { theme, hostStyles = true } = options;\n\n ApexGrid.register();\n\n if (theme !== undefined) warnThemeIsInert();\n\n if (hostStyles) {\n adoptHostStyles();\n }\n}\n"]}
|
package/styles/_common.css.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { css } from 'lit';
|
|
2
|
-
export const styles = css
|
|
2
|
+
export const styles = css ``;
|
|
3
3
|
//# sourceMappingURL=_common.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_common.css.js","sourceRoot":"","sources":["../../src/styles/_common.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA,
|
|
1
|
+
{"version":3,"file":"_common.css.js","sourceRoot":"","sources":["../../src/styles/_common.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA,EAAE,CAAC","sourcesContent":["import { css } from 'lit';\nexport const styles = css``;"]}
|