apex-grid 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -23
- package/components/grid.d.ts +26 -22
- package/components/grid.js +34 -52
- package/components/grid.js.map +1 -1
- package/components/header.js +7 -13
- package/components/header.js.map +1 -1
- package/components/toolbar.js +13 -29
- package/components/toolbar.js.map +1 -1
- package/controllers/state.d.ts +15 -1
- package/controllers/state.js +11 -1
- package/controllers/state.js.map +1 -1
- package/custom-elements.json +228 -242
- package/define.js.map +1 -1
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/highlight.css +9 -2
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/assets/main.js +4 -4
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/assets/style.css +3 -3
- package/docs/classes/ApexGrid.html +86 -87
- package/docs/functions/setup.html +11 -17
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +87 -47
- package/docs/interfaces/ApexCellValueChangedEvent.html +5 -5
- package/docs/interfaces/ApexCellValueChangingEvent.html +6 -6
- package/docs/interfaces/ApexColumnMovedEvent.html +4 -4
- package/docs/interfaces/ApexColumnMovingEvent.html +5 -5
- package/docs/interfaces/ApexColumnPinnedEvent.html +3 -3
- package/docs/interfaces/ApexColumnPinningEvent.html +4 -4
- package/docs/interfaces/ApexDetailContext.html +4 -4
- package/docs/interfaces/ApexFilteredEvent.html +3 -3
- package/docs/interfaces/ApexFilteringEvent.html +3 -3
- package/docs/interfaces/ApexGridEventMap.html +13 -13
- package/docs/interfaces/ApexHeaderContext.html +3 -3
- package/docs/interfaces/ApexPageChangedEvent.html +5 -5
- package/docs/interfaces/ApexPageChangingEvent.html +5 -5
- package/docs/interfaces/ApexQuickFilterChangedEvent.html +2 -2
- package/docs/interfaces/ApexQuickFilterChangingEvent.html +3 -3
- package/docs/interfaces/ApexRowEditEndedEvent.html +3 -3
- package/docs/interfaces/ApexRowEditStartedEvent.html +2 -2
- package/docs/interfaces/ApexRowExpandedEvent.html +4 -4
- package/docs/interfaces/ApexRowExpandingEvent.html +5 -5
- package/docs/interfaces/ApexRowSelectedEvent.html +4 -4
- package/docs/interfaces/ApexRowSelectingEvent.html +5 -5
- package/docs/interfaces/ApexTreeRowExpandedEvent.html +4 -4
- package/docs/interfaces/ApexTreeRowExpandingEvent.html +5 -5
- package/docs/interfaces/BaseApexCellContext.html +6 -6
- package/docs/interfaces/BaseApexEditorContext.html +8 -8
- package/docs/interfaces/BaseColumnConfiguration.html +34 -15
- package/docs/interfaces/BaseColumnSortConfiguration.html +3 -3
- package/docs/interfaces/BaseFilterExpression.html +4 -4
- package/docs/interfaces/BaseSortExpression.html +3 -3
- package/docs/interfaces/CSVExportOptions.html +9 -9
- package/docs/interfaces/ColumnFilterConfiguration.html +2 -2
- package/docs/interfaces/DataPipelineConfiguration.html +3 -3
- package/docs/interfaces/ExportFormat.html +10 -0
- package/docs/interfaces/ExportOptions.html +6 -6
- package/docs/interfaces/GridEditingConfiguration.html +4 -4
- package/docs/interfaces/GridExpansionConfiguration.html +5 -5
- package/docs/interfaces/GridSelectionConfiguration.html +4 -4
- package/docs/interfaces/GridSortConfiguration.html +3 -3
- package/docs/interfaces/GridTreeConfiguration.html +5 -5
- package/docs/interfaces/PaginationConfiguration.html +6 -6
- package/docs/interfaces/PaginationState.html +5 -5
- package/docs/media/LICENSE +80 -0
- package/docs/media/_tokens.scss +106 -0
- package/docs/media/package.json +14 -12
- package/docs/modules.html +1 -1
- package/docs/types/ApexCellContext.html +1 -1
- package/docs/types/ApexEditorContext.html +1 -1
- package/docs/types/BasePropertyType.html +1 -1
- package/docs/types/BaseSortComparer.html +1 -1
- package/docs/types/ColumnConfiguration.html +1 -1
- package/docs/types/ColumnDropPosition.html +1 -1
- package/docs/types/ColumnSortConfiguration.html +1 -1
- package/docs/types/DataPipelineHook.html +1 -1
- package/docs/types/DataPipelineParams.html +4 -4
- package/docs/types/DataType.html +18 -1
- package/docs/types/ExportSource.html +1 -1
- package/docs/types/FilterCriteria.html +1 -1
- package/docs/types/FilterExpression.html +1 -1
- package/docs/types/Keys.html +1 -1
- package/docs/types/PropertyType.html +1 -1
- package/docs/types/SortComparer.html +1 -1
- package/docs/types/SortExpression.html +1 -1
- package/docs/types/SortState.html +1 -1
- package/index.d.ts +1 -1
- package/index.js.map +1 -1
- package/internal/column-types.js +161 -1
- package/internal/column-types.js.map +1 -1
- package/internal/export.d.ts +12 -4
- package/internal/export.js.map +1 -1
- package/internal/feature-module.d.ts +27 -0
- package/internal/feature-module.js +2 -0
- package/internal/feature-module.js.map +1 -0
- package/internal/icons.d.ts +7 -0
- package/internal/icons.js +11 -0
- package/internal/icons.js.map +1 -1
- package/internal/index.d.ts +20 -0
- package/internal/index.js +6 -0
- package/internal/index.js.map +1 -0
- package/internal/types.d.ts +54 -5
- package/internal/types.js.map +1 -1
- package/operations/filter/tree.d.ts +1 -1
- package/operations/filter/types.js.map +1 -1
- package/operations/sort/types.js.map +1 -1
- package/package.json +5 -1
- package/setup.d.ts +19 -26
- package/setup.js +4 -2
- package/setup.js.map +1 -1
- package/styles/_checkbox.css.js +3 -0
- package/styles/_checkbox.css.js.map +1 -0
- package/styles/_tokens.css.js +3 -0
- package/styles/_tokens.css.js.map +1 -0
- package/styles/body-cell/body-cell.css.js +1 -1
- package/styles/body-cell/body-cell.css.js.map +1 -1
- package/styles/body-cell/cell-renderers.css.js +3 -0
- package/styles/body-cell/cell-renderers.css.js.map +1 -0
- 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 +3 -0
- package/styles/grid/grid.css.js.map +1 -0
- 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/docs/interfaces/XLSXExportOptions.html +0 -17
- package/docs/media/publish.yml +0 -111
- package/internal/theming.d.ts +0 -34
- package/internal/theming.js +0 -123
- package/internal/theming.js.map +0 -1
- package/internal/xlsx.d.ts +0 -22
- package/internal/xlsx.js +0 -228
- package/internal/xlsx.js.map +0 -1
- package/styles/grid/themes/light/grid.bootstrap.css.js +0 -3
- package/styles/grid/themes/light/grid.bootstrap.css.js.map +0 -1
- package/styles/grid/themes/light/grid.fluent.css.js +0 -3
- package/styles/grid/themes/light/grid.fluent.css.js.map +0 -1
- package/styles/grid/themes/light/grid.indigo.css.js +0 -3
- package/styles/grid/themes/light/grid.indigo.css.js.map +0 -1
- package/styles/grid/themes/light/grid.material.css.js +0 -3
- package/styles/grid/themes/light/grid.material.css.js.map +0 -1
- /package/styles/{grid/themes/light/grid.bootstrap.css.d.ts → _checkbox.css.d.ts} +0 -0
- /package/styles/{grid/themes/light/grid.fluent.css.d.ts → _tokens.css.d.ts} +0 -0
- /package/styles/{grid/themes/light/grid.indigo.css.d.ts → body-cell/cell-renderers.css.d.ts} +0 -0
- /package/styles/grid/{themes/light/grid.material.css.d.ts → grid.css.d.ts} +0 -0
package/internal/column-types.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { html, nothing } from 'lit';
|
|
1
|
+
import { html, nothing, svg } from 'lit';
|
|
2
2
|
import { ref } from 'lit/directives/ref.js';
|
|
3
3
|
import { renderIcon } from './icons.js';
|
|
4
4
|
const RATING_DEFAULT_MAX = 5;
|
|
@@ -255,12 +255,172 @@ const imageType = {
|
|
|
255
255
|
/>`;
|
|
256
256
|
},
|
|
257
257
|
};
|
|
258
|
+
function toFiniteNumber(value) {
|
|
259
|
+
const n = typeof value === 'number' ? value : Number(value);
|
|
260
|
+
return Number.isFinite(n) ? n : null;
|
|
261
|
+
}
|
|
262
|
+
function getPositiveMax(column, fallback) {
|
|
263
|
+
const m = typeof column.max === 'number' ? column.max : fallback;
|
|
264
|
+
return m > 0 ? m : fallback;
|
|
265
|
+
}
|
|
266
|
+
function hashHue(value) {
|
|
267
|
+
let hash = 0;
|
|
268
|
+
for (let i = 0; i < value.length; i++) {
|
|
269
|
+
hash = (hash * 31 + value.charCodeAt(i)) % 360;
|
|
270
|
+
}
|
|
271
|
+
return hash;
|
|
272
|
+
}
|
|
273
|
+
function inferStatus(value) {
|
|
274
|
+
const s = String(value ?? '').toLowerCase();
|
|
275
|
+
if (/churn|cancel|expired|inactive|lost|risk|fail|off|overdue/.test(s))
|
|
276
|
+
return 'churn';
|
|
277
|
+
if (/trial|trialing|pending|new|invited|watch|paused/.test(s))
|
|
278
|
+
return 'trial';
|
|
279
|
+
return 'active';
|
|
280
|
+
}
|
|
281
|
+
const currencyType = {
|
|
282
|
+
display(ctx) {
|
|
283
|
+
const col = ctx.column;
|
|
284
|
+
const n = toFiniteNumber(ctx.value);
|
|
285
|
+
if (n === null)
|
|
286
|
+
return html ``;
|
|
287
|
+
return html `${new Intl.NumberFormat(col.locale, {
|
|
288
|
+
style: 'currency',
|
|
289
|
+
currency: col.currency ?? 'USD',
|
|
290
|
+
}).format(n)}`;
|
|
291
|
+
},
|
|
292
|
+
editor(ctx) {
|
|
293
|
+
const commit = (event) => {
|
|
294
|
+
const raw = event.target.value;
|
|
295
|
+
ctx.commit(raw === '' ? null : Number(raw));
|
|
296
|
+
};
|
|
297
|
+
const handleKeydown = (event) => {
|
|
298
|
+
if (event.key === 'Enter') {
|
|
299
|
+
event.preventDefault();
|
|
300
|
+
event.stopPropagation();
|
|
301
|
+
commit(event);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
return html `<input
|
|
305
|
+
type="number"
|
|
306
|
+
part="editor"
|
|
307
|
+
data-apex-editor
|
|
308
|
+
.value=${ctx.value == null ? '' : String(ctx.value)}
|
|
309
|
+
@change=${commit}
|
|
310
|
+
@keydown=${handleKeydown}
|
|
311
|
+
/>`;
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
const avatarType = {
|
|
315
|
+
display(ctx) {
|
|
316
|
+
const label = ctx.value == null ? '' : String(ctx.value);
|
|
317
|
+
const initial = label.trim().charAt(0).toUpperCase();
|
|
318
|
+
if (!initial)
|
|
319
|
+
return html ``;
|
|
320
|
+
return html `<span part="avatar" role="img" aria-label=${label} style="--ag-avatar-hue: ${hashHue(label)}"
|
|
321
|
+
>${initial}</span
|
|
322
|
+
>`;
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
const badgeType = {
|
|
326
|
+
display(ctx) {
|
|
327
|
+
const value = ctx.value;
|
|
328
|
+
if (value == null || value === '')
|
|
329
|
+
return html ``;
|
|
330
|
+
const col = ctx.column;
|
|
331
|
+
const variant = typeof col.badgeVariant === 'function'
|
|
332
|
+
? col.badgeVariant(value)
|
|
333
|
+
: (col.badgeVariant ?? 'neutral');
|
|
334
|
+
return html `<span part="pill pill--${variant}">${String(value)}</span>`;
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
const progressType = {
|
|
338
|
+
display(ctx) {
|
|
339
|
+
const n = toFiniteNumber(ctx.value);
|
|
340
|
+
if (n === null)
|
|
341
|
+
return html ``;
|
|
342
|
+
const max = getPositiveMax(ctx.column, 100);
|
|
343
|
+
const pct = Math.max(0, Math.min(100, (n / max) * 100));
|
|
344
|
+
const tier = pct >= 80 ? 'good' : pct >= 65 ? 'watch' : 'risk';
|
|
345
|
+
return html `<span part="progress">
|
|
346
|
+
<span part="progress-track">
|
|
347
|
+
<span part="progress-fill progress-fill--${tier}" style="width: ${pct}%"></span>
|
|
348
|
+
</span>
|
|
349
|
+
<span part="progress-label">${Math.round(pct)}</span>
|
|
350
|
+
</span>`;
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
const sparklineType = {
|
|
354
|
+
display(ctx) {
|
|
355
|
+
const series = Array.isArray(ctx.value)
|
|
356
|
+
? ctx.value.filter((v) => typeof v === 'number' && Number.isFinite(v))
|
|
357
|
+
: [];
|
|
358
|
+
if (series.length < 2)
|
|
359
|
+
return html ``;
|
|
360
|
+
const width = 64;
|
|
361
|
+
const height = 22;
|
|
362
|
+
const pad = 2;
|
|
363
|
+
const min = Math.min(...series);
|
|
364
|
+
const max = Math.max(...series);
|
|
365
|
+
const range = max - min || 1;
|
|
366
|
+
const stepX = width / (series.length - 1);
|
|
367
|
+
const points = series.map((value, i) => {
|
|
368
|
+
const x = i * stepX;
|
|
369
|
+
const y = pad + (height - 2 * pad) * (1 - (value - min) / range);
|
|
370
|
+
return `${x.toFixed(1)} ${y.toFixed(1)}`;
|
|
371
|
+
});
|
|
372
|
+
const line = `M${points.join(' L')}`;
|
|
373
|
+
const area = `${line} L${width} ${height} L0 ${height} Z`;
|
|
374
|
+
const first = series[0];
|
|
375
|
+
const last = series[series.length - 1];
|
|
376
|
+
const trend = last > first ? 'up' : last < first ? 'down' : 'flat';
|
|
377
|
+
const delta = first === 0 ? 0 : ((last - first) / Math.abs(first)) * 100;
|
|
378
|
+
const showDelta = ctx.column.showDelta !== false;
|
|
379
|
+
return html `<span part="spark-cell">
|
|
380
|
+
<svg
|
|
381
|
+
part="sparkline sparkline--${trend}"
|
|
382
|
+
viewBox="0 0 ${width} ${height}"
|
|
383
|
+
width=${width}
|
|
384
|
+
height=${height}
|
|
385
|
+
preserveAspectRatio="none"
|
|
386
|
+
aria-hidden="true"
|
|
387
|
+
>
|
|
388
|
+
${svg `<path part="spark-area" d=${area} /><path part="spark-line" d=${line} />`}
|
|
389
|
+
</svg>
|
|
390
|
+
${showDelta
|
|
391
|
+
? html `<span part="spark-delta spark-delta--${trend}"
|
|
392
|
+
>${delta > 0 ? '+' : ''}${delta.toFixed(0)}%</span
|
|
393
|
+
>`
|
|
394
|
+
: nothing}
|
|
395
|
+
</span>`;
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
const statusType = {
|
|
399
|
+
display(ctx) {
|
|
400
|
+
const value = ctx.value;
|
|
401
|
+
if (value == null || value === '')
|
|
402
|
+
return html ``;
|
|
403
|
+
const col = ctx.column;
|
|
404
|
+
const variant = typeof col.statusVariant === 'function'
|
|
405
|
+
? col.statusVariant(value)
|
|
406
|
+
: (col.statusVariant ?? inferStatus(value));
|
|
407
|
+
return html `<span part="status status--${variant}">
|
|
408
|
+
<span part="status-dot"></span>${String(value)}
|
|
409
|
+
</span>`;
|
|
410
|
+
},
|
|
411
|
+
};
|
|
258
412
|
const BUILTIN_TYPES = {
|
|
259
413
|
select: selectType,
|
|
260
414
|
rating: ratingType,
|
|
261
415
|
date: dateType,
|
|
262
416
|
boolean: booleanType,
|
|
263
417
|
image: imageType,
|
|
418
|
+
currency: currencyType,
|
|
419
|
+
avatar: avatarType,
|
|
420
|
+
badge: badgeType,
|
|
421
|
+
progress: progressType,
|
|
422
|
+
sparkline: sparklineType,
|
|
423
|
+
status: statusType,
|
|
264
424
|
};
|
|
265
425
|
export function getColumnTypeRenderer(type) {
|
|
266
426
|
return type ? BUILTIN_TYPES[type] : undefined;
|
|
@@ -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, 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 { ColumnConfiguration } 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\nconst BUILTIN_TYPES: Record<string, ColumnTypeRenderer<object>> = {\n select: selectType,\n rating: ratingType,\n date: dateType,\n boolean: booleanType,\n image: imageType,\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=\"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"]}
|
package/internal/export.d.ts
CHANGED
|
@@ -55,11 +55,19 @@ export interface CSVExportOptions<T extends object> extends ExportOptions<T> {
|
|
|
55
55
|
newline?: string;
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
58
|
+
* Describes an export format offered by the grid's toolbar menu.
|
|
59
|
+
*
|
|
60
|
+
* @remarks
|
|
61
|
+
* The toolbar renders one menu item per entry returned by
|
|
62
|
+
* {@link ApexGrid.exportFormats} and dispatches the chosen `id` to
|
|
63
|
+
* {@link ApexGrid.exportAs}. The community grid offers `'csv'`; derived grids
|
|
64
|
+
* (e.g. `@apexcharts/grid-enterprise`) extend the list (e.g. with `'xlsx'`).
|
|
59
65
|
*/
|
|
60
|
-
export interface
|
|
61
|
-
/**
|
|
62
|
-
|
|
66
|
+
export interface ExportFormat {
|
|
67
|
+
/** Stable format identifier, e.g. `'csv'`. */
|
|
68
|
+
id: string;
|
|
69
|
+
/** Menu item label, e.g. `'Export CSV'`. */
|
|
70
|
+
label: string;
|
|
63
71
|
}
|
|
64
72
|
/**
|
|
65
73
|
* Resolves the columns that should appear in the export, in display order.
|
package/internal/export.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/internal/export.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApexGrid } from '../components/grid.js';\nimport type { ColumnConfiguration, ColumnDateFormat, Keys } from './types.js';\nimport { getDisplayColumns } from './utils.js';\n\n/**\n * Primitive cell values supported by the export pipeline.\n *\n * @remarks\n * Returned by the default formatter and accepted from user-supplied formatters.\n * `Date` is preserved (not stringified) so that XLSX export can write it as a\n * native date cell instead of inline text.\n */\nexport type ExportCellValue = string | number | boolean | Date | null | undefined;\n\n/**\n * Which row set should drive the export.\n *\n * - `'view'` (default) — post-filter, post-sort rows across all pages.\n * - `'all'` — the raw `data` array as supplied by the consumer.\n * - `'page'` — only the rows in the current page slice.\n * - `'selected'` — the current row selection (insertion order).\n */\nexport type ExportSource = 'view' | 'all' | 'page' | 'selected';\n\n/**\n * Options shared by all export targets.\n */\nexport interface ExportOptions<T extends object> {\n /** Output filename, without extension. Defaults to `'data'`. */\n filename?: string;\n /** Row set to export. Defaults to `'view'`. */\n source?: ExportSource;\n /**\n * Column keys to include. When omitted, every visible non-hidden column with\n * `exportable !== false` is exported, in display order.\n */\n columns?: ReadonlyArray<Keys<T>>;\n /** Whether to emit a header row. Defaults to `true`. */\n includeHeader?: boolean;\n /**\n * Per-cell value formatter. Receives the column configuration, the raw value\n * from the record, and the record itself. Return one of {@link ExportCellValue}\n * (return a `Date` to keep date typing in XLSX).\n */\n formatter?: (column: ColumnConfiguration<T>, value: unknown, row: T) => ExportCellValue;\n}\n\n/**\n * Options for {@link ApexGrid.exportToCSV}.\n */\nexport interface CSVExportOptions<T extends object> extends ExportOptions<T> {\n /** Field delimiter. Defaults to `','`. */\n delimiter?: string;\n /**\n * Prepend a UTF-8 byte-order mark so Excel auto-detects the encoding when\n * opening the file. Defaults to `true`.\n */\n bom?: boolean;\n /** Line separator. Defaults to `'\\r\\n'` (RFC 4180). */\n newline?: string;\n}\n\n/**\n * Options for {@link ApexGrid.exportToXLSX}.\n */\nexport interface XLSXExportOptions<T extends object> extends ExportOptions<T> {\n /** Worksheet tab name. Defaults to `'Sheet1'`. Trimmed to 31 chars. */\n sheetName?: string;\n}\n\n/**\n * Resolves the columns that should appear in the export, in display order.\n */\nexport function resolveExportColumns<T extends object>(\n grid: ApexGrid<T>,\n opts: ExportOptions<T>\n): Array<ColumnConfiguration<T>> {\n const all = getDisplayColumns(grid.columns).filter(\n (column) => !column.hidden && column.exportable !== false\n );\n if (!opts.columns?.length) return all;\n const keys = new Set(opts.columns as Keys<T>[]);\n return all.filter((column) => keys.has(column.key));\n}\n\n/**\n * Resolves the rows that should appear in the export.\n */\nexport function resolveExportRows<T extends object>(\n grid: ApexGrid<T>,\n source: ExportSource = 'view'\n): ReadonlyArray<T> {\n switch (source) {\n case 'all':\n return grid.data;\n case 'page':\n return grid.pageItems;\n case 'selected':\n return grid.selectedRows;\n default:\n return grid.dataView;\n }\n}\n\n/**\n * Returns the column's display label, used as the header cell value.\n */\nexport function getColumnLabel<T extends object>(column: ColumnConfiguration<T>): string {\n return column.headerText ?? String(column.key);\n}\n\nconst DATE_STYLE_MAP: Record<ColumnDateFormat, Intl.DateTimeFormatOptions['dateStyle']> = {\n short: 'short',\n medium: 'medium',\n long: 'long',\n full: 'full',\n};\n\n/**\n * Default cell-value formatter. Mirrors the on-screen rendering for each\n * column type while keeping primitive types primitive (so number/boolean/date\n * survive into XLSX as native cells instead of strings).\n */\nexport function defaultExportFormat<T extends object>(\n column: ColumnConfiguration<T>,\n value: unknown\n): ExportCellValue {\n if (value === null || value === undefined) return '';\n switch (column.type) {\n case 'select': {\n const found = column.options?.find((option) => {\n if (option && typeof option === 'object' && 'value' in option) {\n return (option as { value: unknown }).value === value;\n }\n return option === value;\n });\n if (found && typeof found === 'object' && 'label' in found) {\n const label = (found as { label?: unknown }).label;\n if (typeof label === 'string' && label.length > 0) return label;\n }\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n case 'date': {\n if (value instanceof Date) return value;\n const parsed = new Date(value as string | number);\n return Number.isNaN(parsed.getTime()) ? String(value) : parsed;\n }\n case 'boolean':\n return Boolean(value);\n case 'number':\n case 'rating': {\n const n = Number(value);\n return Number.isFinite(n) ? n : '';\n }\n default:\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n}\n\n/**\n * Resolves the export value for a single cell, applying the user-supplied\n * formatter when present and falling back to {@link defaultExportFormat}.\n */\nexport function resolveExportValue<T extends object>(\n column: ColumnConfiguration<T>,\n row: T,\n opts: ExportOptions<T>\n): ExportCellValue {\n const raw = (row as Record<string, unknown>)[column.key as string];\n return opts.formatter ? opts.formatter(column, raw, row) : defaultExportFormat(column, raw);\n}\n\n/** Formats a `Date` into the configured date style for CSV output. */\nexport function formatDateForCSV<T extends object>(\n column: ColumnConfiguration<T>,\n value: Date\n): string {\n const style = DATE_STYLE_MAP[column.format ?? 'medium'];\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: style }).format(value);\n } catch {\n return value.toISOString();\n }\n}\n\nfunction escapeCSVCell(value: ExportCellValue, delimiter: string): string {\n if (value === null || value === undefined || value === '') return '';\n const text = value instanceof Date ? value.toISOString() : String(value);\n const needsQuoting =\n text.includes(delimiter) || text.includes('\"') || text.includes('\\n') || text.includes('\\r');\n return needsQuoting ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/**\n * Builds the CSV string for the grid without triggering a download.\n *\n * @remarks\n * Useful when consumers want to ship the bytes through their own transport\n * (clipboard, HTTP upload). The {@link ApexGrid.exportToCSV} method calls\n * this and then triggers a browser download.\n */\nexport function buildCSV<T extends object>(\n grid: ApexGrid<T>,\n opts: CSVExportOptions<T> = {}\n): string {\n const delimiter = opts.delimiter ?? ',';\n const newline = opts.newline ?? '\\r\\n';\n const includeHeader = opts.includeHeader ?? true;\n const columns = resolveExportColumns(grid, opts);\n const rows = resolveExportRows(grid, opts.source);\n\n const lines: string[] = [];\n if (includeHeader) {\n lines.push(\n columns.map((column) => escapeCSVCell(getColumnLabel(column), delimiter)).join(delimiter)\n );\n }\n for (const row of rows) {\n const cells = columns.map((column) => {\n let value = resolveExportValue(column, row, opts);\n if (value instanceof Date) {\n value = formatDateForCSV(column, value);\n }\n return escapeCSVCell(value, delimiter);\n });\n lines.push(cells.join(delimiter));\n }\n\n const body = lines.join(newline);\n return opts.bom === false ? body : `\\uFEFF${body}`;\n}\n\n/**\n * Triggers a browser download for the given payload.\n *\n * @remarks\n * Falls back to a no-op when called outside the browser (during SSR or unit\n * tests on JSDOM without a body), so consumers can still call the public\n * export API safely.\n */\nexport function downloadBlob(\n filename: string,\n content: string | Uint8Array,\n mimeType: string\n): void {\n if (typeof document === 'undefined' || typeof URL?.createObjectURL !== 'function') return;\n // BlobPart accepts both string and Uint8Array; the cast quiets TS' strict\n // overload resolution which prefers ArrayBufferView only.\n const blob = new Blob([content as BlobPart], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/internal/export.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+E/C,MAAM,UAAU,oBAAoB,CAClC,IAAiB,EACjB,IAAsB;IAEtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAChD,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,CAC1D,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,GAAG,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAoB,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC;AAKD,MAAM,UAAU,iBAAiB,CAC/B,IAAiB,EACjB,SAAuB,MAAM;IAE7B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,cAAc,CAAmB,MAA8B;IAC7E,OAAO,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,cAAc,GAAsE;IACxF,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAOF,MAAM,UAAU,mBAAmB,CACjC,MAA8B,EAC9B,KAAc;IAEd,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC9D,OAAQ,MAA6B,CAAC,KAAK,KAAK,KAAK,CAAC;gBACxD,CAAC;gBACD,OAAO,MAAM,KAAK,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBAC3D,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;gBACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;YAClE,CAAC;YACD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzF,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,YAAY,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAwB,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,CAAC;QACD;YACE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,kBAAkB,CAChC,MAA8B,EAC9B,GAAM,EACN,IAAsB;IAEtB,MAAM,GAAG,GAAI,GAA+B,CAAC,MAAM,CAAC,GAAa,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC9F,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAC9B,MAA8B,EAC9B,KAAW;IAEX,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAsB,EAAE,SAAiB;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/F,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAUD,MAAM,UAAU,QAAQ,CACtB,IAAiB,EACjB,OAA4B,EAAE;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAC1F,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,IAAI,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBAC1B,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;AACrD,CAAC;AAUD,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,OAA4B,EAC5B,QAAgB;IAEhB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,GAAG,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO;IAG1F,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import type { ApexGrid } from '../components/grid.js';\nimport type { ColumnConfiguration, ColumnDateFormat, Keys } from './types.js';\nimport { getDisplayColumns } from './utils.js';\n\n/**\n * Primitive cell values supported by the export pipeline.\n *\n * @remarks\n * Returned by the default formatter and accepted from user-supplied formatters.\n * `Date` is preserved (not stringified) so that XLSX export can write it as a\n * native date cell instead of inline text.\n */\nexport type ExportCellValue = string | number | boolean | Date | null | undefined;\n\n/**\n * Which row set should drive the export.\n *\n * - `'view'` (default) — post-filter, post-sort rows across all pages.\n * - `'all'` — the raw `data` array as supplied by the consumer.\n * - `'page'` — only the rows in the current page slice.\n * - `'selected'` — the current row selection (insertion order).\n */\nexport type ExportSource = 'view' | 'all' | 'page' | 'selected';\n\n/**\n * Options shared by all export targets.\n */\nexport interface ExportOptions<T extends object> {\n /** Output filename, without extension. Defaults to `'data'`. */\n filename?: string;\n /** Row set to export. Defaults to `'view'`. */\n source?: ExportSource;\n /**\n * Column keys to include. When omitted, every visible non-hidden column with\n * `exportable !== false` is exported, in display order.\n */\n columns?: ReadonlyArray<Keys<T>>;\n /** Whether to emit a header row. Defaults to `true`. */\n includeHeader?: boolean;\n /**\n * Per-cell value formatter. Receives the column configuration, the raw value\n * from the record, and the record itself. Return one of {@link ExportCellValue}\n * (return a `Date` to keep date typing in XLSX).\n */\n formatter?: (column: ColumnConfiguration<T>, value: unknown, row: T) => ExportCellValue;\n}\n\n/**\n * Options for {@link ApexGrid.exportToCSV}.\n */\nexport interface CSVExportOptions<T extends object> extends ExportOptions<T> {\n /** Field delimiter. Defaults to `','`. */\n delimiter?: string;\n /**\n * Prepend a UTF-8 byte-order mark so Excel auto-detects the encoding when\n * opening the file. Defaults to `true`.\n */\n bom?: boolean;\n /** Line separator. Defaults to `'\\r\\n'` (RFC 4180). */\n newline?: string;\n}\n\n/**\n * Describes an export format offered by the grid's toolbar menu.\n *\n * @remarks\n * The toolbar renders one menu item per entry returned by\n * {@link ApexGrid.exportFormats} and dispatches the chosen `id` to\n * {@link ApexGrid.exportAs}. The community grid offers `'csv'`; derived grids\n * (e.g. `@apexcharts/grid-enterprise`) extend the list (e.g. with `'xlsx'`).\n */\nexport interface ExportFormat {\n /** Stable format identifier, e.g. `'csv'`. */\n id: string;\n /** Menu item label, e.g. `'Export CSV'`. */\n label: string;\n}\n\n/**\n * Resolves the columns that should appear in the export, in display order.\n */\nexport function resolveExportColumns<T extends object>(\n grid: ApexGrid<T>,\n opts: ExportOptions<T>\n): Array<ColumnConfiguration<T>> {\n const all = getDisplayColumns(grid.columns).filter(\n (column) => !column.hidden && column.exportable !== false\n );\n if (!opts.columns?.length) return all;\n const keys = new Set(opts.columns as Keys<T>[]);\n return all.filter((column) => keys.has(column.key));\n}\n\n/**\n * Resolves the rows that should appear in the export.\n */\nexport function resolveExportRows<T extends object>(\n grid: ApexGrid<T>,\n source: ExportSource = 'view'\n): ReadonlyArray<T> {\n switch (source) {\n case 'all':\n return grid.data;\n case 'page':\n return grid.pageItems;\n case 'selected':\n return grid.selectedRows;\n default:\n return grid.dataView;\n }\n}\n\n/**\n * Returns the column's display label, used as the header cell value.\n */\nexport function getColumnLabel<T extends object>(column: ColumnConfiguration<T>): string {\n return column.headerText ?? String(column.key);\n}\n\nconst DATE_STYLE_MAP: Record<ColumnDateFormat, Intl.DateTimeFormatOptions['dateStyle']> = {\n short: 'short',\n medium: 'medium',\n long: 'long',\n full: 'full',\n};\n\n/**\n * Default cell-value formatter. Mirrors the on-screen rendering for each\n * column type while keeping primitive types primitive (so number/boolean/date\n * survive into XLSX as native cells instead of strings).\n */\nexport function defaultExportFormat<T extends object>(\n column: ColumnConfiguration<T>,\n value: unknown\n): ExportCellValue {\n if (value === null || value === undefined) return '';\n switch (column.type) {\n case 'select': {\n const found = column.options?.find((option) => {\n if (option && typeof option === 'object' && 'value' in option) {\n return (option as { value: unknown }).value === value;\n }\n return option === value;\n });\n if (found && typeof found === 'object' && 'label' in found) {\n const label = (found as { label?: unknown }).label;\n if (typeof label === 'string' && label.length > 0) return label;\n }\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n case 'date': {\n if (value instanceof Date) return value;\n const parsed = new Date(value as string | number);\n return Number.isNaN(parsed.getTime()) ? String(value) : parsed;\n }\n case 'boolean':\n return Boolean(value);\n case 'number':\n case 'rating': {\n const n = Number(value);\n return Number.isFinite(n) ? n : '';\n }\n default:\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n}\n\n/**\n * Resolves the export value for a single cell, applying the user-supplied\n * formatter when present and falling back to {@link defaultExportFormat}.\n */\nexport function resolveExportValue<T extends object>(\n column: ColumnConfiguration<T>,\n row: T,\n opts: ExportOptions<T>\n): ExportCellValue {\n const raw = (row as Record<string, unknown>)[column.key as string];\n return opts.formatter ? opts.formatter(column, raw, row) : defaultExportFormat(column, raw);\n}\n\n/** Formats a `Date` into the configured date style for CSV output. */\nexport function formatDateForCSV<T extends object>(\n column: ColumnConfiguration<T>,\n value: Date\n): string {\n const style = DATE_STYLE_MAP[column.format ?? 'medium'];\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: style }).format(value);\n } catch {\n return value.toISOString();\n }\n}\n\nfunction escapeCSVCell(value: ExportCellValue, delimiter: string): string {\n if (value === null || value === undefined || value === '') return '';\n const text = value instanceof Date ? value.toISOString() : String(value);\n const needsQuoting =\n text.includes(delimiter) || text.includes('\"') || text.includes('\\n') || text.includes('\\r');\n return needsQuoting ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/**\n * Builds the CSV string for the grid without triggering a download.\n *\n * @remarks\n * Useful when consumers want to ship the bytes through their own transport\n * (clipboard, HTTP upload). The {@link ApexGrid.exportToCSV} method calls\n * this and then triggers a browser download.\n */\nexport function buildCSV<T extends object>(\n grid: ApexGrid<T>,\n opts: CSVExportOptions<T> = {}\n): string {\n const delimiter = opts.delimiter ?? ',';\n const newline = opts.newline ?? '\\r\\n';\n const includeHeader = opts.includeHeader ?? true;\n const columns = resolveExportColumns(grid, opts);\n const rows = resolveExportRows(grid, opts.source);\n\n const lines: string[] = [];\n if (includeHeader) {\n lines.push(\n columns.map((column) => escapeCSVCell(getColumnLabel(column), delimiter)).join(delimiter)\n );\n }\n for (const row of rows) {\n const cells = columns.map((column) => {\n let value = resolveExportValue(column, row, opts);\n if (value instanceof Date) {\n value = formatDateForCSV(column, value);\n }\n return escapeCSVCell(value, delimiter);\n });\n lines.push(cells.join(delimiter));\n }\n\n const body = lines.join(newline);\n return opts.bom === false ? body : `\\uFEFF${body}`;\n}\n\n/**\n * Triggers a browser download for the given payload.\n *\n * @remarks\n * Falls back to a no-op when called outside the browser (during SSR or unit\n * tests on JSDOM without a body), so consumers can still call the public\n * export API safely.\n */\nexport function downloadBlob(\n filename: string,\n content: string | Uint8Array,\n mimeType: string\n): void {\n if (typeof document === 'undefined' || typeof URL?.createObjectURL !== 'function') return;\n // BlobPart accepts both string and Uint8Array; the cast quiets TS' strict\n // overload resolution which prefers ArrayBufferView only.\n const blob = new Blob([content as BlobPart], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ReactiveController } from 'lit';
|
|
2
|
+
import type { GridHost } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Extension point for layering optional features onto the grid without baking
|
|
5
|
+
* them into the community build.
|
|
6
|
+
*
|
|
7
|
+
* A feature module contributes a {@link ReactiveController} that is constructed
|
|
8
|
+
* alongside the grid's built-in controllers (see {@link StateController}). It is
|
|
9
|
+
* the seam used by the first-party `@apexcharts/grid-enterprise` package; it is
|
|
10
|
+
* intentionally minimal and additive so the community `<apex-grid>` element is
|
|
11
|
+
* unaffected (it registers zero modules).
|
|
12
|
+
*
|
|
13
|
+
* @remarks This API lives under the unstable `apex-grid/internal` entry point.
|
|
14
|
+
*/
|
|
15
|
+
export interface GridFeatureModule<T extends object = any> {
|
|
16
|
+
/**
|
|
17
|
+
* Stable identifier, e.g. `'grouping'`. Used to de-duplicate modules and to
|
|
18
|
+
* look the controller up later via {@link StateController.module}.
|
|
19
|
+
*/
|
|
20
|
+
readonly id: string;
|
|
21
|
+
/**
|
|
22
|
+
* Construct the feature's controller. The controller is expected to register
|
|
23
|
+
* itself with the host (typically `host.addController(this)` in its
|
|
24
|
+
* constructor), exactly like the built-in controllers.
|
|
25
|
+
*/
|
|
26
|
+
create(host: GridHost<T>): ReactiveController;
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-module.js","sourceRoot":"","sources":["../../src/internal/feature-module.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReactiveController } from 'lit';\nimport type { 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 create(host: GridHost<T>): ReactiveController;\n}\n"]}
|
package/internal/icons.d.ts
CHANGED
|
@@ -21,4 +21,11 @@ export interface IconRenderOptions {
|
|
|
21
21
|
* the accessible label via `aria-label`.
|
|
22
22
|
*/
|
|
23
23
|
export declare function renderIcon(name: string, opts?: IconRenderOptions): TemplateResult;
|
|
24
|
+
/**
|
|
25
|
+
* Renders the stacked up/down sort affordance used by sortable column headers.
|
|
26
|
+
* Both chevrons are dimmed by default; the header CSS lifts the inactive one on
|
|
27
|
+
* hover and paints the active direction in the brand color, driven by the
|
|
28
|
+
* button's `data-sort-active` (`'ascending' | 'descending' | 'none'`) attribute.
|
|
29
|
+
*/
|
|
30
|
+
export declare function renderSortArrows(): TemplateResult;
|
|
24
31
|
export {};
|
package/internal/icons.js
CHANGED
|
@@ -131,4 +131,15 @@ export function renderIcon(name, opts = {}) {
|
|
|
131
131
|
data-sort-index=${ifDefined(opts.sortIndex)}
|
|
132
132
|
>${icon.paths}</svg>`;
|
|
133
133
|
}
|
|
134
|
+
export function renderSortArrows() {
|
|
135
|
+
return html `<svg
|
|
136
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
137
|
+
viewBox="0 0 6 9"
|
|
138
|
+
width="6"
|
|
139
|
+
height="9"
|
|
140
|
+
aria-hidden="true"
|
|
141
|
+
focusable="false"
|
|
142
|
+
part="sort-arrows"
|
|
143
|
+
>${svg `<path part="sort-up" d="M3 0.5 5.5 3.5 0.5 3.5Z" /><path part="sort-down" d="M3 8.5 0.5 5.5 5.5 5.5Z" />`}</svg>`;
|
|
144
|
+
}
|
|
134
145
|
//# sourceMappingURL=icons.js.map
|
package/internal/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/internal/icons.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, type SVGTemplateResult, svg, type TemplateResult } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\ninterface IconDef {\n viewBox: string;\n paths: SVGTemplateResult;\n}\n\nconst ICONS: Record<string, IconDef> = {\n 'arrow-upward': {\n viewBox: '0 0 45 45',\n paths: svg`<path d=\"M22.5 40V13.7L10.1 26.1 8 24 24 8l16 16-2.1 2.1-12.4-12.4V40Z\"/>`,\n },\n 'arrow-downward': {\n viewBox: '0 0 45 45',\n paths: svg`<path fill=\"currentColor\" d=\"M24 40 8 24l2.1-2.1 12.4 12.4V8h3v26.3l12.4-12.4L40 24Z\"/>`,\n },\n all: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M2 14h8v2H2zm0-8h12v2H2zm14 11l-3-3-1.5 1.5L16 20l7-7-1.5-1.5L16 17zM2 10h12v2H2z\"/>`,\n },\n contains: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M3 3v18h18V3zm16 16H5V5h14z\"/><path d=\"M12 11.3a4.39 4.39 0 00-2.54.63 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1.79a4.51 4.51 0 01-.21-.88 5.57 5.57 0 01-.07-.93v-3.5a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.54 3.54 0 00-2.3.72A1.93 1.93 0 009 10.29h1.71a.93.93 0 01.29-.71 1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1v.69zm1.4 1.08v1.17a1.61 1.61 0 01-.71.77 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9 1.76 1.76 0 011.22-.39z\"/>`,\n },\n doesNotContain: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M21 19.74V3H4.26L2.89 1.63 1.63 2.92 3 4.29V21h16.73l1.37 1.37 1.27-1.26zM5 19V6.28l5.28 5.27a3.19 3.19 0 00-.81.38 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1L17.73 19zm5.79-6.23a1.31 1.31 0 01.45-.25l1.37 1.36.28.29a1.57 1.57 0 01-.19.15 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9zm2.6-1.47h-.83l-1.62-1.62.08-.1a1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1zM19 17.74l-3.85-3.85v-3.27a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.64 3.64 0 00-2.24.67L6.26 5H19z\"/>`,\n },\n greaterThan: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 7.11L15.09 12 6 16.89V19l12-6.46v-1.08L6 5v2.11z\"/>`,\n },\n greaterThanOrEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.99 19h12.02v2H5.99zM18 9.47L6 3v2.11L15.09 10 6 14.9v2.11l12-6.47V9.47z\"/>`,\n },\n empty: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 17h2v2H5zm8 0h2v2h-2zm-8-4h2v2H5zm12 4h2v2h-2zM13 5h2v2h-2zM9 17h2v2H9zm8-8h2v2h-2zm0 4h2v2h-2zm0-8h2v2h-2zM5 9h2v2H5zm0-4h2v2H5zm4 0h2v2H9z\"/>`,\n },\n endsWith: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M3 14.5h2v2H3zm8 0h2v2h-2zm-4 0h2v2H7zm13.8.3v-3A2.1 2.1 0 0020 10a3 3 0 00-2-.6 3 3 0 00-2 .6 1.7 1.7 0 00-.7 1.5h1.5a.8.8 0 01.3-.7 1.3 1.3 0 01.9-.3 1.3 1.3 0 01.9.4 1.1 1.1 0 01.3.8v.6H18a3.8 3.8 0 00-2.2.6 1.8 1.8 0 00-.8 1.5 2 2 0 00.6 1.6 2.3 2.3 0 001.6.6 2.1 2.1 0 001.2-.4 2.8 2.8 0 00.8-.8 4.3 4.3 0 00.1.5l.1.5H21a4.1 4.1 0 01-.2-.7 5.4 5.4 0 010-1zm-1.6-.5a1.5 1.5 0 01-.6.7 2 2 0 01-1 .2 1.1 1.1 0 01-.8-.2.8.8 0 01-.2-.6 1 1 0 01.3-.8 1.5 1.5 0 011.1-.3h1.2z\"/>`,\n },\n equals: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 13.5h14v2H5zm0-5h14v2H5z\"/>`,\n },\n false: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M8 5a7 7 0 107 7 7 7 0 00-7-7zm4.31 9.79l-1.52 1.52L8 13.52l-2.79 2.79-1.52-1.52L6.48 12 3.69 9.21l1.52-1.52L8 10.48l2.79-2.79 1.52 1.52L9.52 12zM18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7z\"/><path d=\"M17.52 13.85l2.91-2.92-.78-.78-2.13 2.12-1.17-1.15-.38.37-.41.41.42.42L17 13.34l.52.51z\"/>`,\n },\n lessThan: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 12.54L18 19v-2.11L8.91 12 18 7.11V5L6 11.46v1.08z\"/>`,\n },\n lessThanOrEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.99 19h12.02v2H5.99zM18 14.9L8.91 10 18 5.11V3L6 9.47v1.07l12 6.47V14.9z\"/>`,\n },\n notEmpty: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 9h2v2H5zm4 8h2v2H9zm4 0h2v2h-2zm4-8h2v2h-2zm0-4h2v2h-2zM5 17h2v2H5zm8-12h2v2h-2zm-8 8h2v2H5zm14 2v-2h-2v.47L18.53 15H19zm-8-8V5H9v.46L10.54 7H11zM2.76 1.76L1.5 3.06 20.97 22.5l1.26-1.26-8.89-8.89L2.76 1.76z\"/>`,\n },\n doesNotEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M17.37 4.71l-1.74-1-2.76 4.79H5v2h6.71l-1.73 3H5v2h3.82l-2.19 3.79 1.74 1 2.76-4.79H19v-2h-6.71l1.73-3H19v-2h-3.82l2.19-3.79z\"/>`,\n },\n startsWith: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.9 7.5l-3.9 9h1.7l.7-1.8h4.1l.7 1.8H11l-3.9-9H5.9zM5 13.2l1.5-4.1L8 13.2H5zm7 1.3h2v2h-2v-2zm8 0h2v2h-2v-2zm-4 0h2v2h-2v-2z\"/>`,\n },\n true: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M19.44 14.22zm-2.88 0zm0 0L18 12.79l1.44 1.43.78-.78L18.79 12l1.43-1.44-.78-.78L18 11.21l-1.44-1.43-.78.78L17.21 12l-1.43 1.44.78.78z\"/><path d=\"M18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7zM8 5a7 7 0 107 7 7 7 0 00-7-7zm-.93 10.18l-3.38-3.37 1.13-1.12 2.25 2.25 4.11-4.12 1.13 1.12z\"/>`,\n },\n filter: {\n viewBox: '0 0 45 45',\n paths: svg`<path d=\"M20 36v-3h8v3Zm-8-10.5v-3h24v3ZM6 15v-3h36v3Z\"/>`,\n },\n close: {\n viewBox: '0 0 48 48',\n paths: svg`<path d=\"m12.45 37.65-2.1-2.1L21.9 24 10.35 12.45l2.1-2.1L24 21.9l11.55-11.55 2.1 2.1L26.1 24l11.55 11.55-2.1 2.1L24 26.1Z\"/>`,\n },\n refresh: {\n viewBox: '0 0 48 48',\n paths: svg`<path d=\"M24 40q-6.65 0-11.325-4.675Q8 30.65 8 24q0-6.65 4.675-11.325Q17.35 8 24 8q4.25 0 7.45 1.725T37 14.45V8h3v12.7H27.3v-3h8.4q-1.9-3-4.85-4.85Q27.9 11 24 11q-5.45 0-9.225 3.775Q11 18.55 11 24q0 5.45 3.775 9.225Q18.55 37 24 37q4.15 0 7.6-2.375 3.45-2.375 4.8-6.275h3.1q-1.45 5.25-5.75 8.45Q29.45 40 24 40Z\"/>`,\n },\n 'page-first': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/>`,\n },\n 'page-previous': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>`,\n },\n 'page-next': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M8.59 16.59 10 18l6-6-6-6-1.41 1.41L13.17 12z\"/>`,\n },\n 'page-last': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 18l8.5-6L6 6v12zM16 6h2v12h-2z\"/>`,\n },\n search: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M15.5 14h-.79l-.28-.27a6.471 6.471 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.471 6.471 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>`,\n },\n star: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/>`,\n },\n 'chevron-down': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M7.41 8.58 12 13.17l4.59-4.59L18 10l-6 6-6-6z\"/>`,\n },\n download: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z\"/>`,\n },\n};\n\nexport type GridIconName = keyof typeof ICONS;\n\nexport interface IconRenderOptions {\n /** Lit `slot` attribute. Useful when icons sit inside slotted positions of other components. */\n slot?: string;\n /** Lit `part` attribute. */\n part?: string;\n /** Inline `class` attribute. */\n class?: string;\n /** When provided, sets `data-sort-index` (used by the header sort indicator). */\n sortIndex?: number | string;\n}\n\n/**\n * Renders one of the grid's built-in icons as an inline `<svg>`. All icons are\n * decorative (`aria-hidden=\"true\"`) by default — surrounding controls supply\n * the accessible label via `aria-label`.\n */\nexport function renderIcon(name: string, opts: IconRenderOptions = {}): TemplateResult {\n const icon = ICONS[name];\n if (!icon) return html``;\n return html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=${icon.viewBox}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-icon=${name}\n slot=${ifDefined(opts.slot)}\n part=${ifDefined(opts.part)}\n class=${ifDefined(opts.class)}\n data-sort-index=${ifDefined(opts.sortIndex)}\n >${icon.paths}</svg>`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/internal/icons.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, type SVGTemplateResult, svg, type TemplateResult } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\ninterface IconDef {\n viewBox: string;\n paths: SVGTemplateResult;\n}\n\nconst ICONS: Record<string, IconDef> = {\n 'arrow-upward': {\n viewBox: '0 0 45 45',\n paths: svg`<path d=\"M22.5 40V13.7L10.1 26.1 8 24 24 8l16 16-2.1 2.1-12.4-12.4V40Z\"/>`,\n },\n 'arrow-downward': {\n viewBox: '0 0 45 45',\n paths: svg`<path fill=\"currentColor\" d=\"M24 40 8 24l2.1-2.1 12.4 12.4V8h3v26.3l12.4-12.4L40 24Z\"/>`,\n },\n all: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M2 14h8v2H2zm0-8h12v2H2zm14 11l-3-3-1.5 1.5L16 20l7-7-1.5-1.5L16 17zM2 10h12v2H2z\"/>`,\n },\n contains: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M3 3v18h18V3zm16 16H5V5h14z\"/><path d=\"M12 11.3a4.39 4.39 0 00-2.54.63 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1.79a4.51 4.51 0 01-.21-.88 5.57 5.57 0 01-.07-.93v-3.5a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.54 3.54 0 00-2.3.72A1.93 1.93 0 009 10.29h1.71a.93.93 0 01.29-.71 1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1v.69zm1.4 1.08v1.17a1.61 1.61 0 01-.71.77 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9 1.76 1.76 0 011.22-.39z\"/>`,\n },\n doesNotContain: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M21 19.74V3H4.26L2.89 1.63 1.63 2.92 3 4.29V21h16.73l1.37 1.37 1.27-1.26zM5 19V6.28l5.28 5.27a3.19 3.19 0 00-.81.38 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1L17.73 19zm5.79-6.23a1.31 1.31 0 01.45-.25l1.37 1.36.28.29a1.57 1.57 0 01-.19.15 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9zm2.6-1.47h-.83l-1.62-1.62.08-.1a1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1zM19 17.74l-3.85-3.85v-3.27a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.64 3.64 0 00-2.24.67L6.26 5H19z\"/>`,\n },\n greaterThan: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 7.11L15.09 12 6 16.89V19l12-6.46v-1.08L6 5v2.11z\"/>`,\n },\n greaterThanOrEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.99 19h12.02v2H5.99zM18 9.47L6 3v2.11L15.09 10 6 14.9v2.11l12-6.47V9.47z\"/>`,\n },\n empty: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 17h2v2H5zm8 0h2v2h-2zm-8-4h2v2H5zm12 4h2v2h-2zM13 5h2v2h-2zM9 17h2v2H9zm8-8h2v2h-2zm0 4h2v2h-2zm0-8h2v2h-2zM5 9h2v2H5zm0-4h2v2H5zm4 0h2v2H9z\"/>`,\n },\n endsWith: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M3 14.5h2v2H3zm8 0h2v2h-2zm-4 0h2v2H7zm13.8.3v-3A2.1 2.1 0 0020 10a3 3 0 00-2-.6 3 3 0 00-2 .6 1.7 1.7 0 00-.7 1.5h1.5a.8.8 0 01.3-.7 1.3 1.3 0 01.9-.3 1.3 1.3 0 01.9.4 1.1 1.1 0 01.3.8v.6H18a3.8 3.8 0 00-2.2.6 1.8 1.8 0 00-.8 1.5 2 2 0 00.6 1.6 2.3 2.3 0 001.6.6 2.1 2.1 0 001.2-.4 2.8 2.8 0 00.8-.8 4.3 4.3 0 00.1.5l.1.5H21a4.1 4.1 0 01-.2-.7 5.4 5.4 0 010-1zm-1.6-.5a1.5 1.5 0 01-.6.7 2 2 0 01-1 .2 1.1 1.1 0 01-.8-.2.8.8 0 01-.2-.6 1 1 0 01.3-.8 1.5 1.5 0 011.1-.3h1.2z\"/>`,\n },\n equals: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 13.5h14v2H5zm0-5h14v2H5z\"/>`,\n },\n false: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M8 5a7 7 0 107 7 7 7 0 00-7-7zm4.31 9.79l-1.52 1.52L8 13.52l-2.79 2.79-1.52-1.52L6.48 12 3.69 9.21l1.52-1.52L8 10.48l2.79-2.79 1.52 1.52L9.52 12zM18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7z\"/><path d=\"M17.52 13.85l2.91-2.92-.78-.78-2.13 2.12-1.17-1.15-.38.37-.41.41.42.42L17 13.34l.52.51z\"/>`,\n },\n lessThan: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 12.54L18 19v-2.11L8.91 12 18 7.11V5L6 11.46v1.08z\"/>`,\n },\n lessThanOrEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.99 19h12.02v2H5.99zM18 14.9L8.91 10 18 5.11V3L6 9.47v1.07l12 6.47V14.9z\"/>`,\n },\n notEmpty: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 9h2v2H5zm4 8h2v2H9zm4 0h2v2h-2zm4-8h2v2h-2zm0-4h2v2h-2zM5 17h2v2H5zm8-12h2v2h-2zm-8 8h2v2H5zm14 2v-2h-2v.47L18.53 15H19zm-8-8V5H9v.46L10.54 7H11zM2.76 1.76L1.5 3.06 20.97 22.5l1.26-1.26-8.89-8.89L2.76 1.76z\"/>`,\n },\n doesNotEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M17.37 4.71l-1.74-1-2.76 4.79H5v2h6.71l-1.73 3H5v2h3.82l-2.19 3.79 1.74 1 2.76-4.79H19v-2h-6.71l1.73-3H19v-2h-3.82l2.19-3.79z\"/>`,\n },\n startsWith: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.9 7.5l-3.9 9h1.7l.7-1.8h4.1l.7 1.8H11l-3.9-9H5.9zM5 13.2l1.5-4.1L8 13.2H5zm7 1.3h2v2h-2v-2zm8 0h2v2h-2v-2zm-4 0h2v2h-2v-2z\"/>`,\n },\n true: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M19.44 14.22zm-2.88 0zm0 0L18 12.79l1.44 1.43.78-.78L18.79 12l1.43-1.44-.78-.78L18 11.21l-1.44-1.43-.78.78L17.21 12l-1.43 1.44.78.78z\"/><path d=\"M18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7zM8 5a7 7 0 107 7 7 7 0 00-7-7zm-.93 10.18l-3.38-3.37 1.13-1.12 2.25 2.25 4.11-4.12 1.13 1.12z\"/>`,\n },\n filter: {\n viewBox: '0 0 45 45',\n paths: svg`<path d=\"M20 36v-3h8v3Zm-8-10.5v-3h24v3ZM6 15v-3h36v3Z\"/>`,\n },\n close: {\n viewBox: '0 0 48 48',\n paths: svg`<path d=\"m12.45 37.65-2.1-2.1L21.9 24 10.35 12.45l2.1-2.1L24 21.9l11.55-11.55 2.1 2.1L26.1 24l11.55 11.55-2.1 2.1L24 26.1Z\"/>`,\n },\n refresh: {\n viewBox: '0 0 48 48',\n paths: svg`<path d=\"M24 40q-6.65 0-11.325-4.675Q8 30.65 8 24q0-6.65 4.675-11.325Q17.35 8 24 8q4.25 0 7.45 1.725T37 14.45V8h3v12.7H27.3v-3h8.4q-1.9-3-4.85-4.85Q27.9 11 24 11q-5.45 0-9.225 3.775Q11 18.55 11 24q0 5.45 3.775 9.225Q18.55 37 24 37q4.15 0 7.6-2.375 3.45-2.375 4.8-6.275h3.1q-1.45 5.25-5.75 8.45Q29.45 40 24 40Z\"/>`,\n },\n 'page-first': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/>`,\n },\n 'page-previous': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>`,\n },\n 'page-next': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M8.59 16.59 10 18l6-6-6-6-1.41 1.41L13.17 12z\"/>`,\n },\n 'page-last': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 18l8.5-6L6 6v12zM16 6h2v12h-2z\"/>`,\n },\n search: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M15.5 14h-.79l-.28-.27a6.471 6.471 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.471 6.471 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>`,\n },\n star: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/>`,\n },\n 'chevron-down': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M7.41 8.58 12 13.17l4.59-4.59L18 10l-6 6-6-6z\"/>`,\n },\n download: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z\"/>`,\n },\n};\n\nexport type GridIconName = keyof typeof ICONS;\n\nexport interface IconRenderOptions {\n /** Lit `slot` attribute. Useful when icons sit inside slotted positions of other components. */\n slot?: string;\n /** Lit `part` attribute. */\n part?: string;\n /** Inline `class` attribute. */\n class?: string;\n /** When provided, sets `data-sort-index` (used by the header sort indicator). */\n sortIndex?: number | string;\n}\n\n/**\n * Renders one of the grid's built-in icons as an inline `<svg>`. All icons are\n * decorative (`aria-hidden=\"true\"`) by default — surrounding controls supply\n * the accessible label via `aria-label`.\n */\nexport function renderIcon(name: string, opts: IconRenderOptions = {}): TemplateResult {\n const icon = ICONS[name];\n if (!icon) return html``;\n return html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=${icon.viewBox}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-icon=${name}\n slot=${ifDefined(opts.slot)}\n part=${ifDefined(opts.part)}\n class=${ifDefined(opts.class)}\n data-sort-index=${ifDefined(opts.sortIndex)}\n >${icon.paths}</svg>`;\n}\n\n/**\n * Renders the stacked up/down sort affordance used by sortable column headers.\n * Both chevrons are dimmed by default; the header CSS lifts the inactive one on\n * hover and paints the active direction in the brand color, driven by the\n * button's `data-sort-active` (`'ascending' | 'descending' | 'none'`) attribute.\n */\nexport function renderSortArrows(): TemplateResult {\n return html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 6 9\"\n width=\"6\"\n height=\"9\"\n aria-hidden=\"true\"\n focusable=\"false\"\n part=\"sort-arrows\"\n >${svg`<path part=\"sort-up\" d=\"M3 0.5 5.5 3.5 0.5 3.5Z\" /><path part=\"sort-down\" d=\"M3 8.5 0.5 5.5 5.5 5.5Z\" />`}</svg>`;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unstable, first-party extension surface for `apex-grid`.
|
|
3
|
+
*
|
|
4
|
+
* This entry point (`apex-grid/internal`) exposes the internals that the
|
|
5
|
+
* first-party `@apexcharts/grid-enterprise` package builds on: the grid class,
|
|
6
|
+
* its state controller, the component registration helper, and the feature
|
|
7
|
+
* module contract. It is intentionally separate from the public `.` barrel.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* No semver guarantees are made for these exports. They may change between
|
|
11
|
+
* minor releases. Do not depend on them from third-party code.
|
|
12
|
+
*/
|
|
13
|
+
export { ApexGrid } from '../components/grid.js';
|
|
14
|
+
export { gridStateContext, StateController } from '../controllers/state.js';
|
|
15
|
+
export { PIPELINE } from './constants.js';
|
|
16
|
+
export type { ExportCellValue, ExportFormat, ExportOptions } from './export.js';
|
|
17
|
+
export { downloadBlob, getColumnLabel, resolveExportColumns, resolveExportRows, resolveExportValue, } from './export.js';
|
|
18
|
+
export type { GridFeatureModule } from './feature-module.js';
|
|
19
|
+
export { registerComponent } from './register.js';
|
|
20
|
+
export type { ActiveNode, GridHost } from './types.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ApexGrid } from '../components/grid.js';
|
|
2
|
+
export { gridStateContext, StateController } from '../controllers/state.js';
|
|
3
|
+
export { PIPELINE } from './constants.js';
|
|
4
|
+
export { downloadBlob, getColumnLabel, resolveExportColumns, resolveExportRows, resolveExportValue, } from './export.js';
|
|
5
|
+
export { registerComponent } from './register.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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;AAErB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,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 { GridFeatureModule } from './feature-module.js';\nexport { registerComponent } from './register.js';\nexport type { ActiveNode, GridHost } from './types.js';\n"]}
|