@nu-grid/nuxt 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/cell-types/date/index.d.ts +1 -1
  3. package/dist/runtime/cell-types/date/index.js +15 -1
  4. package/dist/runtime/cell-types/index.d.ts +2 -1
  5. package/dist/runtime/cell-types/index.js +3 -0
  6. package/dist/runtime/cell-types/number/NumberFilter.vue +1 -1
  7. package/dist/runtime/cell-types/percentage/PercentageEditor.d.vue.ts +15 -0
  8. package/dist/runtime/cell-types/percentage/PercentageEditor.vue +56 -0
  9. package/dist/runtime/cell-types/percentage/PercentageEditor.vue.d.ts +15 -0
  10. package/dist/runtime/cell-types/percentage/PercentageFilter.d.vue.ts +7 -0
  11. package/dist/runtime/cell-types/percentage/PercentageFilter.vue +79 -0
  12. package/dist/runtime/cell-types/percentage/PercentageFilter.vue.d.ts +7 -0
  13. package/dist/runtime/cell-types/percentage/index.d.ts +10 -0
  14. package/dist/runtime/cell-types/percentage/index.js +38 -0
  15. package/dist/runtime/components/NuGrid.d.vue.ts +8 -5
  16. package/dist/runtime/components/NuGrid.vue +46 -10
  17. package/dist/runtime/components/NuGrid.vue.d.ts +8 -5
  18. package/dist/runtime/components/_internal/NuGridBase.vue +129 -83
  19. package/dist/runtime/components/_internal/NuGridCellContent.vue +21 -1
  20. package/dist/runtime/components/_internal/NuGridColumnMenu.vue +2 -2
  21. package/dist/runtime/components/_internal/NuGridGroup.vue +23 -16
  22. package/dist/runtime/components/_internal/NuGridGroupCheckbox.vue +1 -1
  23. package/dist/runtime/components/_internal/NuGridRow.vue +12 -4
  24. package/dist/runtime/components/_internal/NuGridSplitGroup.vue +23 -17
  25. package/dist/runtime/composables/_internal/column-flex-style.d.ts +22 -0
  26. package/dist/runtime/composables/_internal/column-flex-style.js +84 -0
  27. package/dist/runtime/composables/_internal/index.d.ts +1 -0
  28. package/dist/runtime/composables/_internal/index.js +1 -0
  29. package/dist/runtime/composables/_internal/useNuGridAddRow.js +5 -1
  30. package/dist/runtime/composables/_internal/useNuGridAutosize.d.ts +6 -3
  31. package/dist/runtime/composables/_internal/useNuGridAutosize.js +91 -9
  32. package/dist/runtime/composables/_internal/useNuGridCellEditing.js +3 -2
  33. package/dist/runtime/composables/_internal/useNuGridColumnResize.d.ts +17 -7
  34. package/dist/runtime/composables/_internal/useNuGridColumnResize.js +219 -8
  35. package/dist/runtime/composables/_internal/useNuGridCore.d.ts +1 -1
  36. package/dist/runtime/composables/_internal/useNuGridCore.js +16 -5
  37. package/dist/runtime/composables/_internal/useNuGridFocus.js +1 -1
  38. package/dist/runtime/composables/_internal/useNuGridRowSelection.js +1 -1
  39. package/dist/runtime/composables/_internal/useNuGridStatePersistence.d.ts +14 -1
  40. package/dist/runtime/composables/_internal/useNuGridStatePersistence.js +66 -3
  41. package/dist/runtime/composables/_internal/useNuGridUI.d.ts +147 -31
  42. package/dist/runtime/config/_internal/options-defaults.d.ts +2 -4
  43. package/dist/runtime/config/_internal/options-defaults.js +3 -4
  44. package/dist/runtime/config/_internal/prop-utils.d.ts +7 -1
  45. package/dist/runtime/config/_internal/prop-utils.js +20 -6
  46. package/dist/runtime/config/presets.js +2 -2
  47. package/dist/runtime/themes/nuGridTheme.d.ts +3 -1
  48. package/dist/runtime/themes/nuGridTheme.js +9 -5
  49. package/dist/runtime/themes/nuGridThemeCompact.d.ts +3 -1
  50. package/dist/runtime/themes/nuGridThemeCompact.js +8 -4
  51. package/dist/runtime/types/_internal/contexts/resize.d.ts +1 -0
  52. package/dist/runtime/types/_internal/contexts/ui-config.d.ts +4 -2
  53. package/dist/runtime/types/autosize.d.ts +4 -1
  54. package/dist/runtime/types/column.d.ts +41 -3
  55. package/dist/runtime/types/index.d.ts +2 -1
  56. package/dist/runtime/types/option-groups.d.ts +26 -8
  57. package/dist/runtime/types/props.d.ts +34 -9
  58. package/dist/runtime/types/resize.d.ts +2 -0
  59. package/dist/runtime/types/slots.d.ts +32 -0
  60. package/dist/runtime/types/slots.js +0 -0
  61. package/dist/runtime/types/tanstack-table.d.ts +3 -2
  62. package/dist/runtime/utils/index.d.ts +1 -0
  63. package/dist/runtime/utils/index.js +1 -0
  64. package/dist/runtime/utils/inferCellDataType.d.ts +27 -0
  65. package/dist/runtime/utils/inferCellDataType.js +91 -0
  66. package/package.json +5 -5
  67. package/dist/runtime/components/NuGridGroup.d.vue.ts +0 -20
  68. package/dist/runtime/components/NuGridGroup.vue +0 -650
  69. package/dist/runtime/components/NuGridGroup.vue.d.ts +0 -20
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nu-grid/nuxt",
3
3
  "configKey": "nuGrid",
4
- "version": "0.2.0",
4
+ "version": "0.3.1",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "3.6.1"
@@ -1,6 +1,6 @@
1
1
  import type { NuGridCellType } from '../../types/cells.js';
2
2
  /**
3
3
  * Date cell type
4
- * Date picker input, no special keyboard handling
4
+ * Date picker input with short date formatting
5
5
  */
6
6
  export declare const dateCellType: NuGridCellType;
@@ -9,5 +9,19 @@ export const dateCellType = {
9
9
  component: DateFilter,
10
10
  defaultOperator: "equals"
11
11
  },
12
- enableFiltering: true
12
+ enableFiltering: true,
13
+ formatter: (value, context) => {
14
+ if (value === null || value === void 0) return "";
15
+ const date = value instanceof Date ? value : new Date(value);
16
+ if (Number.isNaN(date.getTime())) return String(value);
17
+ const locale = context.columnDef.locale || "en-US";
18
+ return date.toLocaleDateString(locale, {
19
+ year: "numeric",
20
+ month: "numeric",
21
+ day: "numeric"
22
+ });
23
+ },
24
+ defaultColumnDef: {
25
+ size: 100
26
+ }
13
27
  };
@@ -5,6 +5,7 @@ import { currencyCellType } from './currency/index.js';
5
5
  import { dateCellType } from './date/index.js';
6
6
  import { lookupCellType } from './lookup/index.js';
7
7
  import { numberCellType } from './number/index.js';
8
+ import { percentageCellType } from './percentage/index.js';
8
9
  import { ratingCellType } from './rating/index.js';
9
10
  import { selectionCellType } from './selection/index.js';
10
11
  import { textareaCellType, textCellType } from './text/index.js';
@@ -13,5 +14,5 @@ import { textareaCellType, textCellType } from './text/index.js';
13
14
  * These are automatically registered in the cell type registry
14
15
  */
15
16
  export declare const builtInCellTypes: NuGridCellType[];
16
- export { actionMenuCellType, booleanCellType, currencyCellType, dateCellType, lookupCellType, numberCellType, ratingCellType, selectionCellType, textareaCellType, textCellType, };
17
+ export { actionMenuCellType, booleanCellType, currencyCellType, dateCellType, lookupCellType, numberCellType, percentageCellType, ratingCellType, selectionCellType, textareaCellType, textCellType, };
17
18
  export { TextareaEditor } from './text/index.js';
@@ -4,6 +4,7 @@ import { currencyCellType } from "./currency/index.js";
4
4
  import { dateCellType } from "./date/index.js";
5
5
  import { lookupCellType } from "./lookup/index.js";
6
6
  import { numberCellType } from "./number/index.js";
7
+ import { percentageCellType } from "./percentage/index.js";
7
8
  import { ratingCellType } from "./rating/index.js";
8
9
  import { selectionCellType } from "./selection/index.js";
9
10
  import { textareaCellType, textCellType } from "./text/index.js";
@@ -17,6 +18,7 @@ export const builtInCellTypes = [
17
18
  actionMenuCellType,
18
19
  ratingCellType,
19
20
  currencyCellType,
21
+ percentageCellType,
20
22
  lookupCellType
21
23
  ];
22
24
  export {
@@ -26,6 +28,7 @@ export {
26
28
  dateCellType,
27
29
  lookupCellType,
28
30
  numberCellType,
31
+ percentageCellType,
29
32
  ratingCellType,
30
33
  selectionCellType,
31
34
  textareaCellType,
@@ -25,7 +25,7 @@ function clearFilter() {
25
25
  </script>
26
26
 
27
27
  <template>
28
- <div class="min-w-[200px] space-y-2 p-2">
28
+ <div class="min-w-50 space-y-2 p-2">
29
29
  <div class="flex items-center gap-2">
30
30
  <USelect
31
31
  v-model="operator"
@@ -0,0 +1,15 @@
1
+ import type { NuGridCellEditorProps } from '../../types/index.js';
2
+ type __VLS_Props = NuGridCellEditorProps;
3
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
4
+ "update:modelValue": (value: any) => any;
5
+ "update:isNavigating": (value: boolean) => any;
6
+ "stop-editing": (moveDirection?: "up" | "down" | "next" | "previous" | undefined) => any;
7
+ "cancel-editing": () => any;
8
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
9
+ "onUpdate:modelValue"?: ((value: any) => any) | undefined;
10
+ "onUpdate:isNavigating"?: ((value: boolean) => any) | undefined;
11
+ "onStop-editing"?: ((moveDirection?: "up" | "down" | "next" | "previous" | undefined) => any) | undefined;
12
+ "onCancel-editing"?: (() => any) | undefined;
13
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
@@ -0,0 +1,56 @@
1
+ <script setup>
2
+ import { computed, ref } from "vue";
3
+ import { useNuGridCellEditor } from "../../composables";
4
+ defineOptions({ inheritAttrs: false });
5
+ const props = defineProps({
6
+ modelValue: { type: null, required: true },
7
+ cell: { type: null, required: true },
8
+ row: { type: Object, required: true },
9
+ isNavigating: { type: Boolean, required: true },
10
+ shouldFocus: { type: Boolean, required: true },
11
+ validationError: { type: [String, null], required: false },
12
+ showValidationErrors: { type: String, required: false },
13
+ interactionRouter: { type: Object, required: false }
14
+ });
15
+ const emit = defineEmits(["update:modelValue", "stop-editing", "cancel-editing", "update:isNavigating"]);
16
+ const inputRef = ref(null);
17
+ const { handleKeydown, handleBlur } = useNuGridCellEditor(props, emit, inputRef);
18
+ const storageMode = computed(
19
+ () => props.cell?.column?.columnDef?.percentageStorage ?? "decimal"
20
+ );
21
+ const displayValue = computed(() => {
22
+ if (props.modelValue === null || props.modelValue === void 0) return "";
23
+ const numValue = Number(props.modelValue);
24
+ if (Number.isNaN(numValue)) return "";
25
+ return storageMode.value === "decimal" ? numValue * 100 : numValue;
26
+ });
27
+ const handleInput = (value) => {
28
+ if (value === "" || value === null || value === void 0) {
29
+ emit("update:modelValue", null);
30
+ return;
31
+ }
32
+ const numValue = Number(value);
33
+ if (Number.isNaN(numValue)) {
34
+ emit("update:modelValue", null);
35
+ return;
36
+ }
37
+ const storageValue = storageMode.value === "decimal" ? numValue / 100 : numValue;
38
+ emit("update:modelValue", storageValue);
39
+ };
40
+ </script>
41
+
42
+ <template>
43
+ <div class="flex items-center w-full">
44
+ <UInput
45
+ ref="inputRef"
46
+ :model-value="displayValue"
47
+ type="number"
48
+ step="0.1"
49
+ class="w-full pl-0.5!"
50
+ @update:model-value="handleInput"
51
+ @blur="handleBlur"
52
+ @keydown="handleKeydown"
53
+ />
54
+ <span class="ml-1 text-gray-500 dark:text-gray-400 shrink-0">%</span>
55
+ </div>
56
+ </template>
@@ -0,0 +1,15 @@
1
+ import type { NuGridCellEditorProps } from '../../types/index.js';
2
+ type __VLS_Props = NuGridCellEditorProps;
3
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
4
+ "update:modelValue": (value: any) => any;
5
+ "update:isNavigating": (value: boolean) => any;
6
+ "stop-editing": (moveDirection?: "up" | "down" | "next" | "previous" | undefined) => any;
7
+ "cancel-editing": () => any;
8
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
9
+ "onUpdate:modelValue"?: ((value: any) => any) | undefined;
10
+ "onUpdate:isNavigating"?: ((value: boolean) => any) | undefined;
11
+ "onStop-editing"?: ((moveDirection?: "up" | "down" | "next" | "previous" | undefined) => any) | undefined;
12
+ "onCancel-editing"?: (() => any) | undefined;
13
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import type { NuGridFilterContext } from '../../types/cells.js';
2
+ interface Props {
3
+ context: NuGridFilterContext;
4
+ }
5
+ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const _default: typeof __VLS_export;
7
+ export default _default;
@@ -0,0 +1,79 @@
1
+ <script setup>
2
+ import { computed, ref } from "vue";
3
+ const props = defineProps({
4
+ context: { type: Object, required: true }
5
+ });
6
+ const filterValue = computed({
7
+ get: () => props.context.filterValue.value,
8
+ set: (value) => props.context.setFilterValue(value)
9
+ });
10
+ const operator = ref("equals");
11
+ const operators = [
12
+ { value: "equals", label: "Equals" },
13
+ { value: "greaterThan", label: "Greater than" },
14
+ { value: "lessThan", label: "Less than" },
15
+ { value: "greaterThanOrEqual", label: "Greater than or equal" },
16
+ { value: "lessThanOrEqual", label: "Less than or equal" },
17
+ { value: "between", label: "Between" }
18
+ ];
19
+ const filterValue2 = ref(null);
20
+ function clearFilter() {
21
+ filterValue.value = null;
22
+ filterValue2.value = null;
23
+ props.context.clearFilter();
24
+ }
25
+ function toStorageValue(displayValue) {
26
+ if (displayValue === null || displayValue === "") return null;
27
+ const num = Number(displayValue);
28
+ if (Number.isNaN(num)) return null;
29
+ return num / 100;
30
+ }
31
+ </script>
32
+
33
+ <template>
34
+ <div class="min-w-[200px] space-y-2 p-2">
35
+ <div class="flex items-center gap-2">
36
+ <USelect
37
+ v-model="operator"
38
+ :options="operators"
39
+ option-attribute="label"
40
+ value-attribute="value"
41
+ class="flex-1"
42
+ />
43
+ <UButton
44
+ v-if="context.isFiltered"
45
+ icon="i-heroicons-x-mark"
46
+ size="xs"
47
+ color="neutral"
48
+ variant="ghost"
49
+ @click="clearFilter"
50
+ />
51
+ </div>
52
+ <div class="flex items-center gap-1">
53
+ <UInput
54
+ v-model="filterValue"
55
+ type="number"
56
+ placeholder="Value..."
57
+ autofocus
58
+ class="flex-1"
59
+ @update:model-value="context.setFilterValue(toStorageValue($event))"
60
+ />
61
+ <span class="text-gray-500 dark:text-gray-400 shrink-0">%</span>
62
+ </div>
63
+ <div v-if="operator === 'between'" class="flex items-center gap-1">
64
+ <UInput
65
+ v-model="filterValue2"
66
+ type="number"
67
+ placeholder="To..."
68
+ class="flex-1"
69
+ @update:model-value="
70
+ context.setFilterValue({
71
+ from: toStorageValue(filterValue),
72
+ to: toStorageValue(filterValue2)
73
+ })
74
+ "
75
+ />
76
+ <span class="text-gray-500 dark:text-gray-400 shrink-0">%</span>
77
+ </div>
78
+ </div>
79
+ </template>
@@ -0,0 +1,7 @@
1
+ import type { NuGridFilterContext } from '../../types/cells.js';
2
+ interface Props {
3
+ context: NuGridFilterContext;
4
+ }
5
+ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const _default: typeof __VLS_export;
7
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import type { NuGridCellType } from '../../types/cells.js';
2
+ /**
3
+ * Percentage cell type
4
+ * Displays values as percentages with % suffix
5
+ *
6
+ * Storage modes (configurable via percentageStorage column option):
7
+ * - 'decimal' (default): Values stored as 0-1, displayed as 0-100%
8
+ * - 'percent': Values stored as 0-100, displayed as 0-100%
9
+ */
10
+ export declare const percentageCellType: NuGridCellType;
@@ -0,0 +1,38 @@
1
+ import PercentageEditor from "./PercentageEditor.vue";
2
+ import PercentageFilter from "./PercentageFilter.vue";
3
+ export const percentageCellType = {
4
+ name: "percentage",
5
+ displayName: "Percentage",
6
+ description: "Percentage column with % formatting",
7
+ editor: PercentageEditor,
8
+ filter: {
9
+ component: PercentageFilter,
10
+ defaultOperator: "equals"
11
+ },
12
+ enableFiltering: true,
13
+ validation: (value) => {
14
+ if (value === null || value === void 0) {
15
+ return { valid: true };
16
+ }
17
+ const numValue = Number(value);
18
+ if (Number.isNaN(numValue)) {
19
+ return {
20
+ valid: false,
21
+ message: "Value must be a valid number"
22
+ };
23
+ }
24
+ return { valid: true };
25
+ },
26
+ formatter: (value, context) => {
27
+ if (value === null || value === void 0) return "";
28
+ const numValue = Number(value);
29
+ if (Number.isNaN(numValue)) return String(value);
30
+ const storageMode = context.columnDef.percentageStorage ?? "decimal";
31
+ const displayValue = storageMode === "decimal" ? numValue * 100 : numValue;
32
+ const decimals = context.columnDef.percentageDecimals ?? 1;
33
+ return `${displayValue.toFixed(decimals)}%`;
34
+ },
35
+ defaultColumnDef: {
36
+ size: 100
37
+ }
38
+ };
@@ -1,5 +1,6 @@
1
1
  import type { TableData, TableSlots } from '@nuxt/ui';
2
2
  import type { ColumnFiltersState, ColumnOrderState, ColumnPinningState, ColumnSizingInfoState, ColumnSizingState, ExpandedState, GroupingState, PaginationState, RowPinningState, RowSelectionState, SortingState, VisibilityState } from '@tanstack/vue-table';
3
+ import type { Ref } from 'vue';
3
4
  import type { NuGridStateSnapshot } from '../composables/_internal/useNuGridStatePersistence.js';
4
5
  import type { NuGridAddRowState, NuGridCellClickEvent, NuGridCellEditingCancelledEvent, NuGridCellEditingStartedEvent, NuGridCellValueChangedEvent, NuGridExcelExportOptions, NuGridFilterChangedEvent, NuGridFocusedCellChangedEvent, NuGridFocusedRowChangedEvent, NuGridProps, NuGridRowClickEvent, NuGridSortChangedEvent } from '../types/index.js';
5
6
  import type { RowDragEvent } from '../types/drag-drop.js';
@@ -12,7 +13,7 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
12
13
  columnPinning?: ColumnPinningState;
13
14
  columnSizing?: ColumnSizingState;
14
15
  columnSizingInfo?: ColumnSizingInfoState;
15
- rowSelection?: RowSelectionState;
16
+ selectedRows?: RowSelectionState;
16
17
  rowPinning?: RowPinningState;
17
18
  sorting?: SortingState;
18
19
  grouping?: GroupingState;
@@ -44,7 +45,7 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
44
45
  "onUpdate:columnPinning"?: ((value: ColumnPinningState) => any) | undefined;
45
46
  "onUpdate:columnSizing"?: ((value: ColumnSizingState) => any) | undefined;
46
47
  "onUpdate:columnSizingInfo"?: ((value: ColumnSizingInfoState) => any) | undefined;
47
- "onUpdate:rowSelection"?: ((value: RowSelectionState) => any) | undefined;
48
+ "onUpdate:selectedRows"?: ((value: RowSelectionState) => any) | undefined;
48
49
  "onUpdate:rowPinning"?: ((value: RowPinningState) => any) | undefined;
49
50
  "onUpdate:sorting"?: ((value: SortingState) => any) | undefined;
50
51
  "onUpdate:grouping"?: ((value: GroupingState) => any) | undefined;
@@ -56,12 +57,14 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
56
57
  } ? P : {});
57
58
  expose: (exposed: import("vue").ShallowUnwrapRef<{
58
59
  readonly $el: any;
59
- tableRef: import("vue").Ref<HTMLDivElement | null, HTMLDivElement | null>;
60
+ tableRef: Ref<HTMLDivElement | null, HTMLDivElement | null>;
60
61
  tableApi: import("@tanstack/table-core").Table<T>;
61
- autoSizeColumns: (mode?: "fitCell" | "fitGrid") => void;
62
+ autoSizeColumns: (mode?: "content" | "fill") => void;
62
63
  autoSizeColumn: (columnId: string) => void;
64
+ autosizeReady: Ref<boolean, boolean>;
63
65
  getState: () => {};
64
66
  setState: (_snapshot: NuGridStateSnapshot) => void;
67
+ clearState: () => void;
65
68
  addRowState: import("vue").ComputedRef<NuGridAddRowState>;
66
69
  excelExport: (filenameOrOptions?: string | NuGridExcelExportOptions, sheetName?: string) => Promise<void>;
67
70
  getSelectedRows: <TRow = T>() => TRow[];
@@ -83,7 +86,7 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
83
86
  }>) => void;
84
87
  attrs: any;
85
88
  slots: TableSlots<T>;
86
- emit: (((evt: "rowDragged", event: RowDragEvent<T>) => void) & ((evt: "cellEditingCancelled", event: NuGridCellEditingCancelledEvent<T>) => void) & ((evt: "cellEditingStarted", event: NuGridCellEditingStartedEvent<T>) => void) & ((evt: "stateChanged", state: NuGridStateSnapshot) => void) & ((evt: "filterChanged", event: NuGridFilterChangedEvent) => void) & ((evt: "sortChanged", event: NuGridSortChangedEvent) => void) & ((evt: "focusedRowChanged", event: NuGridFocusedRowChangedEvent<T>) => void) & ((evt: "focusedCellChanged", event: NuGridFocusedCellChangedEvent<T>) => void) & ((evt: "cellClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellDoubleClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowDoubleClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellValueChanged", event: NuGridCellValueChangedEvent<T>) => void) & ((evt: "rowSelectionChanged", event: RowSelectionState) => void) & ((evt: "ready") => void) & ((evt: "rowAddRequested", row: T) => void) & ((evt: "addRowStateChanged", state: NuGridAddRowState) => void)) & (((evt: "update:globalFilter", value: string) => void) & ((evt: "update:columnFilters", value: ColumnFiltersState) => void) & ((evt: "update:columnOrder", value: ColumnOrderState) => void) & ((evt: "update:columnVisibility", value: VisibilityState) => void) & ((evt: "update:columnPinning", value: ColumnPinningState) => void) & ((evt: "update:columnSizing", value: ColumnSizingState) => void) & ((evt: "update:columnSizingInfo", value: ColumnSizingInfoState) => void) & ((evt: "update:rowSelection", value: RowSelectionState) => void) & ((evt: "update:rowPinning", value: RowPinningState) => void) & ((evt: "update:sorting", value: SortingState) => void) & ((evt: "update:grouping", value: GroupingState) => void) & ((evt: "update:expanded", value: ExpandedState) => void) & ((evt: "update:pagination", value: PaginationState) => void) & ((evt: "update:focusedRowId", value: string | null) => void));
89
+ emit: (((evt: "rowDragged", event: RowDragEvent<T>) => void) & ((evt: "cellEditingCancelled", event: NuGridCellEditingCancelledEvent<T>) => void) & ((evt: "cellEditingStarted", event: NuGridCellEditingStartedEvent<T>) => void) & ((evt: "stateChanged", state: NuGridStateSnapshot) => void) & ((evt: "filterChanged", event: NuGridFilterChangedEvent) => void) & ((evt: "sortChanged", event: NuGridSortChangedEvent) => void) & ((evt: "focusedRowChanged", event: NuGridFocusedRowChangedEvent<T>) => void) & ((evt: "focusedCellChanged", event: NuGridFocusedCellChangedEvent<T>) => void) & ((evt: "cellClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellDoubleClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowDoubleClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellValueChanged", event: NuGridCellValueChangedEvent<T>) => void) & ((evt: "rowSelectionChanged", event: RowSelectionState) => void) & ((evt: "ready") => void) & ((evt: "rowAddRequested", row: T) => void) & ((evt: "addRowStateChanged", state: NuGridAddRowState) => void)) & (((evt: "update:globalFilter", value: string) => void) & ((evt: "update:columnFilters", value: ColumnFiltersState) => void) & ((evt: "update:columnOrder", value: ColumnOrderState) => void) & ((evt: "update:columnVisibility", value: VisibilityState) => void) & ((evt: "update:columnPinning", value: ColumnPinningState) => void) & ((evt: "update:columnSizing", value: ColumnSizingState) => void) & ((evt: "update:columnSizingInfo", value: ColumnSizingInfoState) => void) & ((evt: "update:selectedRows", value: RowSelectionState) => void) & ((evt: "update:rowPinning", value: RowPinningState) => void) & ((evt: "update:sorting", value: SortingState) => void) & ((evt: "update:grouping", value: GroupingState) => void) & ((evt: "update:expanded", value: ExpandedState) => void) & ((evt: "update:pagination", value: PaginationState) => void) & ((evt: "update:focusedRowId", value: string | null) => void));
87
90
  }>) => import("vue").VNode & {
88
91
  __ctx?: Awaited<typeof __VLS_setup>;
89
92
  };
@@ -40,12 +40,12 @@ import NuGridSplitGroup from "./_internal/NuGridSplitGroup.vue";
40
40
  import NuGridTooltip from "./_internal/NuGridTooltip.vue";
41
41
  defineOptions({ inheritAttrs: false });
42
42
  const props = defineProps({
43
- ui: { type: null, required: false },
43
+ ui: { type: Object, required: false },
44
44
  preset: { type: String, required: false },
45
45
  focus: { type: Object, required: false },
46
- editing: { type: Object, required: false },
46
+ editing: { type: [Boolean, Object], required: false },
47
47
  validation: { type: [Boolean, Object], required: false },
48
- selection: { type: [Boolean, String, Object], required: false },
48
+ rowSelection: { type: [Boolean, String, Object], required: false },
49
49
  actions: { type: [Boolean, Object], required: false },
50
50
  columnDefaults: { type: Object, required: false },
51
51
  layout: { type: Object, required: false },
@@ -57,7 +57,7 @@ const props = defineProps({
57
57
  theme: { type: [String, Object], required: false },
58
58
  virtualization: { type: [Boolean, Object], required: false },
59
59
  cellTypes: { type: Array, required: false },
60
- skipAutoSizeColumns: { type: Array, required: false },
60
+ dataTypeInference: { type: Boolean, required: false },
61
61
  rowDragOptions: { type: Object, required: false },
62
62
  rowId: { type: [String, Function], required: false },
63
63
  addNewRow: { type: [Boolean, Object], required: false },
@@ -143,7 +143,7 @@ const columnSizingState = defineModel("columnSizing", { type: Object, ...{ defau
143
143
  const columnSizingInfoState = defineModel("columnSizingInfo", { type: Object, ...{
144
144
  default: {}
145
145
  } });
146
- const rowSelectionState = defineModel("rowSelection", { type: Object, ...{ default: {} } });
146
+ const rowSelectionState = defineModel("selectedRows", { type: Object, ...{ default: {} } });
147
147
  const rowPinningState = defineModel("rowPinning", { type: Object, ...{ default: {} } });
148
148
  const sortingState = defineModel("sorting", { type: Array, ...{ default: [] } });
149
149
  const groupingState = defineModel("grouping", { type: Array, ...{ default: [] } });
@@ -160,14 +160,18 @@ const initPaginationState = () => {
160
160
  }
161
161
  };
162
162
  initPaginationState();
163
- const rowSelectionModeRef = computed(() => hasRowSlot.value ? false : props.selection ?? false);
163
+ const rowSelectionModeRef = computed(
164
+ () => hasRowSlot.value ? false : props.rowSelection ?? false
165
+ );
164
166
  const actionMenuRef = computed(() => props.actions ?? false);
167
+ const dataTypeInferenceRef = computed(() => props.dataTypeInference ?? true);
165
168
  const { columns } = useNuGridColumns(
166
169
  propsColumns,
167
170
  data,
168
171
  rowSelectionModeRef,
169
172
  actionMenuRef,
170
- columnVisibilityState
173
+ columnVisibilityState,
174
+ dataTypeInferenceRef
171
175
  );
172
176
  const { ui, checkboxTheme } = useNuGridUI(props);
173
177
  const { hasFooter } = useNuGridFooter(columns);
@@ -250,6 +254,11 @@ watch(
250
254
  );
251
255
  const rows = orderedRows;
252
256
  const stickyEnabled = computed(() => props.layout?.stickyHeaders ?? false);
257
+ const resizeMode = computed(() => {
258
+ if (props.layout?.resizeMode) return props.layout.resizeMode;
259
+ if (props.layout?.autoSize === "fill") return "shift";
260
+ return "expand";
261
+ });
253
262
  const {
254
263
  virtualizer,
255
264
  virtualizationEnabled,
@@ -266,7 +275,21 @@ const {
266
275
  stickyEnabled,
267
276
  hasFooter
268
277
  });
269
- const { handleResizeStart, handleGroupResizeStart, resizingGroupId, resizingColumnId } = useNuGridColumnResize(props, tableApi);
278
+ const {
279
+ handleResizeStart,
280
+ handleGroupResizeStart,
281
+ resizingGroupId,
282
+ resizingColumnId,
283
+ manuallyResizedColumns,
284
+ getContainerWidth,
285
+ getSizingAsRatios,
286
+ applySizingFromRatios
287
+ } = useNuGridColumnResize(props, tableApi, tableRef);
288
+ statePersistence.setResizeHelpers({
289
+ getContainerWidth,
290
+ getSizingAsRatios,
291
+ applySizingFromRatios
292
+ });
270
293
  const dragFns = useNuGridColumnDragDrop(tableApi, states.columnOrderState, tableRef);
271
294
  const rowDragOptions = computed(() => props.rowDragOptions || { enabled: false });
272
295
  const rowDragFns = useNuGridRowDragDrop(
@@ -439,7 +462,8 @@ provide("nugrid-resize", {
439
462
  handleResizeStart,
440
463
  handleGroupResizeStart,
441
464
  resizingGroupId,
442
- resizingColumnId
465
+ resizingColumnId,
466
+ manuallyResizedColumns
443
467
  });
444
468
  provide("nugrid-virtualization", {
445
469
  virtualizer,
@@ -470,7 +494,9 @@ provide("nugrid-ui-config", {
470
494
  showColumnVisibility: computed(() => props.columnDefaults?.menu?.visibilityToggle ?? true),
471
495
  columnMenuButton: computed(() => props.columnDefaults?.menu?.button),
472
496
  wrapText: computed(() => props.columnDefaults?.wrapText ?? false),
473
- checkboxTheme
497
+ checkboxTheme,
498
+ autoSizeMode: autosizeFns.autoSizeMode,
499
+ resizeMode
474
500
  });
475
501
  provide("nugrid-validation", {
476
502
  // Expose validation error display settings so editors can inject without prop wiring
@@ -484,6 +510,10 @@ provide("nugrid-row-interactions", {
484
510
  provide("nugrid-interaction-router", {
485
511
  interactionRouter
486
512
  });
513
+ const cellSlots = Object.fromEntries(
514
+ Object.entries(slots).filter(([name]) => name.endsWith("-cell"))
515
+ );
516
+ provide("nugrid-cell-slots", cellSlots);
487
517
  provide(NUGRID_EVENTS_KEY, eventEmitter);
488
518
  provide("nugrid-multi-row", {
489
519
  enabled: computed(() => {
@@ -543,6 +573,7 @@ provide("nugrid-scroll-state", {
543
573
  useNuGridFocusInit(props, focusFns, groupingFns?.navigableRows ?? rows);
544
574
  onMounted(() => {
545
575
  nextTick(() => {
576
+ statePersistence.applyPendingRatios();
546
577
  emit("ready");
547
578
  });
548
579
  });
@@ -605,8 +636,13 @@ defineExpose({
605
636
  tableApi,
606
637
  autoSizeColumns: autosizeFns.autoSizeColumns,
607
638
  autoSizeColumn: autosizeFns.autoSizeColumn,
639
+ autosizeReady: autosizeFns.autosizeReady,
608
640
  getState: statePersistence.getState,
609
641
  setState: statePersistence.setState,
642
+ clearState: () => {
643
+ statePersistence.clearState();
644
+ manuallyResizedColumns.value = /* @__PURE__ */ new Set();
645
+ },
610
646
  addRowState,
611
647
  excelExport,
612
648
  getSelectedRows,
@@ -1,5 +1,6 @@
1
1
  import type { TableData, TableSlots } from '@nuxt/ui';
2
2
  import type { ColumnFiltersState, ColumnOrderState, ColumnPinningState, ColumnSizingInfoState, ColumnSizingState, ExpandedState, GroupingState, PaginationState, RowPinningState, RowSelectionState, SortingState, VisibilityState } from '@tanstack/vue-table';
3
+ import type { Ref } from 'vue';
3
4
  import type { NuGridStateSnapshot } from '../composables/_internal/useNuGridStatePersistence.js';
4
5
  import type { NuGridAddRowState, NuGridCellClickEvent, NuGridCellEditingCancelledEvent, NuGridCellEditingStartedEvent, NuGridCellValueChangedEvent, NuGridExcelExportOptions, NuGridFilterChangedEvent, NuGridFocusedCellChangedEvent, NuGridFocusedRowChangedEvent, NuGridProps, NuGridRowClickEvent, NuGridSortChangedEvent } from '../types/index.js';
5
6
  import type { RowDragEvent } from '../types/drag-drop.js';
@@ -12,7 +13,7 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
12
13
  columnPinning?: ColumnPinningState;
13
14
  columnSizing?: ColumnSizingState;
14
15
  columnSizingInfo?: ColumnSizingInfoState;
15
- rowSelection?: RowSelectionState;
16
+ selectedRows?: RowSelectionState;
16
17
  rowPinning?: RowPinningState;
17
18
  sorting?: SortingState;
18
19
  grouping?: GroupingState;
@@ -44,7 +45,7 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
44
45
  "onUpdate:columnPinning"?: ((value: ColumnPinningState) => any) | undefined;
45
46
  "onUpdate:columnSizing"?: ((value: ColumnSizingState) => any) | undefined;
46
47
  "onUpdate:columnSizingInfo"?: ((value: ColumnSizingInfoState) => any) | undefined;
47
- "onUpdate:rowSelection"?: ((value: RowSelectionState) => any) | undefined;
48
+ "onUpdate:selectedRows"?: ((value: RowSelectionState) => any) | undefined;
48
49
  "onUpdate:rowPinning"?: ((value: RowPinningState) => any) | undefined;
49
50
  "onUpdate:sorting"?: ((value: SortingState) => any) | undefined;
50
51
  "onUpdate:grouping"?: ((value: GroupingState) => any) | undefined;
@@ -56,12 +57,14 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
56
57
  } ? P : {});
57
58
  expose: (exposed: import("vue").ShallowUnwrapRef<{
58
59
  readonly $el: any;
59
- tableRef: import("vue").Ref<HTMLDivElement | null, HTMLDivElement | null>;
60
+ tableRef: Ref<HTMLDivElement | null, HTMLDivElement | null>;
60
61
  tableApi: import("@tanstack/table-core").Table<T>;
61
- autoSizeColumns: (mode?: "fitCell" | "fitGrid") => void;
62
+ autoSizeColumns: (mode?: "content" | "fill") => void;
62
63
  autoSizeColumn: (columnId: string) => void;
64
+ autosizeReady: Ref<boolean, boolean>;
63
65
  getState: () => {};
64
66
  setState: (_snapshot: NuGridStateSnapshot) => void;
67
+ clearState: () => void;
65
68
  addRowState: import("vue").ComputedRef<NuGridAddRowState>;
66
69
  excelExport: (filenameOrOptions?: string | NuGridExcelExportOptions, sheetName?: string) => Promise<void>;
67
70
  getSelectedRows: <TRow = T>() => TRow[];
@@ -83,7 +86,7 @@ declare const __VLS_export: <T extends TableData>(__VLS_props: NonNullable<Await
83
86
  }>) => void;
84
87
  attrs: any;
85
88
  slots: TableSlots<T>;
86
- emit: (((evt: "rowDragged", event: RowDragEvent<T>) => void) & ((evt: "cellEditingCancelled", event: NuGridCellEditingCancelledEvent<T>) => void) & ((evt: "cellEditingStarted", event: NuGridCellEditingStartedEvent<T>) => void) & ((evt: "stateChanged", state: NuGridStateSnapshot) => void) & ((evt: "filterChanged", event: NuGridFilterChangedEvent) => void) & ((evt: "sortChanged", event: NuGridSortChangedEvent) => void) & ((evt: "focusedRowChanged", event: NuGridFocusedRowChangedEvent<T>) => void) & ((evt: "focusedCellChanged", event: NuGridFocusedCellChangedEvent<T>) => void) & ((evt: "cellClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellDoubleClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowDoubleClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellValueChanged", event: NuGridCellValueChangedEvent<T>) => void) & ((evt: "rowSelectionChanged", event: RowSelectionState) => void) & ((evt: "ready") => void) & ((evt: "rowAddRequested", row: T) => void) & ((evt: "addRowStateChanged", state: NuGridAddRowState) => void)) & (((evt: "update:globalFilter", value: string) => void) & ((evt: "update:columnFilters", value: ColumnFiltersState) => void) & ((evt: "update:columnOrder", value: ColumnOrderState) => void) & ((evt: "update:columnVisibility", value: VisibilityState) => void) & ((evt: "update:columnPinning", value: ColumnPinningState) => void) & ((evt: "update:columnSizing", value: ColumnSizingState) => void) & ((evt: "update:columnSizingInfo", value: ColumnSizingInfoState) => void) & ((evt: "update:rowSelection", value: RowSelectionState) => void) & ((evt: "update:rowPinning", value: RowPinningState) => void) & ((evt: "update:sorting", value: SortingState) => void) & ((evt: "update:grouping", value: GroupingState) => void) & ((evt: "update:expanded", value: ExpandedState) => void) & ((evt: "update:pagination", value: PaginationState) => void) & ((evt: "update:focusedRowId", value: string | null) => void));
89
+ emit: (((evt: "rowDragged", event: RowDragEvent<T>) => void) & ((evt: "cellEditingCancelled", event: NuGridCellEditingCancelledEvent<T>) => void) & ((evt: "cellEditingStarted", event: NuGridCellEditingStartedEvent<T>) => void) & ((evt: "stateChanged", state: NuGridStateSnapshot) => void) & ((evt: "filterChanged", event: NuGridFilterChangedEvent) => void) & ((evt: "sortChanged", event: NuGridSortChangedEvent) => void) & ((evt: "focusedRowChanged", event: NuGridFocusedRowChangedEvent<T>) => void) & ((evt: "focusedCellChanged", event: NuGridFocusedCellChangedEvent<T>) => void) & ((evt: "cellClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellDoubleClicked", event: NuGridCellClickEvent<T>) => void) & ((evt: "rowDoubleClicked", event: NuGridRowClickEvent<T>) => void) & ((evt: "cellValueChanged", event: NuGridCellValueChangedEvent<T>) => void) & ((evt: "rowSelectionChanged", event: RowSelectionState) => void) & ((evt: "ready") => void) & ((evt: "rowAddRequested", row: T) => void) & ((evt: "addRowStateChanged", state: NuGridAddRowState) => void)) & (((evt: "update:globalFilter", value: string) => void) & ((evt: "update:columnFilters", value: ColumnFiltersState) => void) & ((evt: "update:columnOrder", value: ColumnOrderState) => void) & ((evt: "update:columnVisibility", value: VisibilityState) => void) & ((evt: "update:columnPinning", value: ColumnPinningState) => void) & ((evt: "update:columnSizing", value: ColumnSizingState) => void) & ((evt: "update:columnSizingInfo", value: ColumnSizingInfoState) => void) & ((evt: "update:selectedRows", value: RowSelectionState) => void) & ((evt: "update:rowPinning", value: RowPinningState) => void) & ((evt: "update:sorting", value: SortingState) => void) & ((evt: "update:grouping", value: GroupingState) => void) & ((evt: "update:expanded", value: ExpandedState) => void) & ((evt: "update:pagination", value: PaginationState) => void) & ((evt: "update:focusedRowId", value: string | null) => void));
87
90
  }>) => import("vue").VNode & {
88
91
  __ctx?: Awaited<typeof __VLS_setup>;
89
92
  };