@izumisy-tailor/tailor-data-viewer 0.2.16 → 0.2.18

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@izumisy-tailor/tailor-data-viewer",
3
3
  "private": false,
4
- "version": "0.2.16",
4
+ "version": "0.2.18",
5
5
  "type": "module",
6
6
  "description": "Flexible data viewer component for Tailor Platform",
7
7
  "files": [
@@ -54,10 +54,7 @@ type ResolveVariables<TQuery> =
54
54
  * const [result] = useQuery({ ...collection.toQueryArgs() });
55
55
  * ```
56
56
  */
57
- export function useCollection<
58
- const TTable extends TableMetadata,
59
- TQuery,
60
- >(
57
+ export function useCollection<const TTable extends TableMetadata, TQuery>(
61
58
  options: UseCollectionOptions<
62
59
  TableFieldName<TTable>,
63
60
  TableMetadataFilter<TTable>
@@ -1,4 +1,4 @@
1
- import { useCallback, useMemo, useState } from "react";
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
2
  import type {
3
3
  Column,
4
4
  DataTableCellProps,
@@ -54,7 +54,7 @@ export function useDataTable<TRow extends Record<string, unknown>>(
54
54
  const rows = optimisticRows ?? sourceRows;
55
55
 
56
56
  // Reset optimistic state when source data changes
57
- useMemo(() => {
57
+ useEffect(() => {
58
58
  setOptimisticRows(null);
59
59
  }, [sourceRows]);
60
60
 
@@ -70,11 +70,11 @@ export function useDataTable<TRow extends Record<string, unknown>>(
70
70
  }, [data]);
71
71
 
72
72
  // Sync pageInfo to collection so hasPrevPage/hasNextPage are up-to-date
73
- useMemo(() => {
73
+ useEffect(() => {
74
74
  if (data?.pageInfo) {
75
75
  collection?.setPageInfo(data.pageInfo);
76
76
  }
77
- }, [data?.pageInfo, collection]);
77
+ }, [data?.pageInfo, collection?.setPageInfo]);
78
78
 
79
79
  // ---------------------------------------------------------------------------
80
80
  // Column visibility management
@@ -130,41 +130,49 @@ export function createColumnHelper<TRow extends Record<string, unknown>>(): {
130
130
  * Automatically infers sort/filter configuration from field types,
131
131
  * including enum options.
132
132
  *
133
+ * @typeParam TRow - The row type for type-safe renderer access.
133
134
  * @param tableMetadata - A single table metadata object from the generated map.
134
135
  *
135
136
  * @example
136
137
  * ```tsx
137
138
  * import { tableMetadata } from "./generated/data-viewer-metadata.generated";
138
139
  *
139
- * const { column, columns } = inferColumnHelper(tableMetadata.task);
140
+ * type Task = { id: string; title: string; status: string; dueDate: string };
141
+ *
142
+ * const { column, columns } = inferColumnHelper<Task>(tableMetadata.task);
140
143
  *
141
144
  * const taskColumns = [
142
145
  * column("title"), // sort/filter auto-detected
143
146
  * column("status"), // enum options auto-populated
144
147
  * column("dueDate"), // date type auto-recognized
145
- * display("actions", { render: (row) => <ActionMenu row={row} /> }),
148
+ * column("title", {
149
+ * renderer: ({ row }) => <span>{row.title}</span>, // row: Task
150
+ * }),
146
151
  * ];
147
152
  * ```
148
153
  */
149
- export function inferColumnHelper<const TTable extends TableMetadata>(
154
+ export function inferColumnHelper<
155
+ TRow extends Record<string, unknown>,
156
+ const TTable extends TableMetadata = TableMetadata,
157
+ >(
150
158
  tableMetadata: TTable,
151
159
  ): {
152
160
  column: (
153
161
  dataKey: TableFieldName<TTable>,
154
- options?: MetadataFieldOptions,
155
- ) => FieldColumn<Record<string, unknown>>;
162
+ options?: MetadataFieldOptions<TRow>,
163
+ ) => FieldColumn<TRow>;
156
164
 
157
165
  columns: (
158
166
  dataKeys: TableFieldName<TTable>[],
159
167
  options?: MetadataFieldsOptions,
160
- ) => FieldColumn<Record<string, unknown>>[];
168
+ ) => FieldColumn<TRow>[];
161
169
  } {
162
170
  const fields = tableMetadata.fields;
163
171
 
164
172
  const column = (
165
173
  dataKey: TableFieldName<TTable>,
166
- columnOptions?: MetadataFieldOptions,
167
- ): FieldColumn<Record<string, unknown>> => {
174
+ columnOptions?: MetadataFieldOptions<TRow>,
175
+ ): FieldColumn<TRow> => {
168
176
  const fieldMeta = fields.find((f) => f.name === dataKey);
169
177
  if (!fieldMeta) {
170
178
  throw new Error(
@@ -197,20 +205,19 @@ export function inferColumnHelper<const TTable extends TableMetadata>(
197
205
  width: columnOptions?.width,
198
206
  sort,
199
207
  filter,
200
- renderer: columnOptions?.renderer as
201
- | CellRenderer<Record<string, unknown>>
202
- | undefined,
208
+ renderer: columnOptions?.renderer as CellRenderer<TRow> | undefined,
203
209
  };
204
210
  };
205
211
 
206
212
  const columnsHelper = (
207
213
  dataKeys: TableFieldName<TTable>[],
208
214
  options?: MetadataFieldsOptions,
209
- ): FieldColumn<Record<string, unknown>>[] => {
215
+ ): FieldColumn<TRow>[] => {
210
216
  return dataKeys.map((dataKey) => {
211
217
  const overrides = options?.overrides?.[dataKey as string];
212
218
  return column(dataKey, {
213
- ...overrides,
219
+ label: overrides?.label,
220
+ width: overrides?.width,
214
221
  sort: overrides?.sort ?? options?.sort,
215
222
  filter: overrides?.filter ?? options?.filter,
216
223
  });
@@ -942,14 +942,18 @@ export type MatchingTableName<
942
942
 
943
943
  /**
944
944
  * Options for metadata-based single field definition.
945
+ *
946
+ * @typeParam TRow - The row type for type-safe renderer access.
945
947
  */
946
- export interface MetadataFieldOptions {
948
+ export interface MetadataFieldOptions<
949
+ TRow extends Record<string, unknown> = Record<string, unknown>,
950
+ > {
947
951
  /** Label override (defaults to metadata description or field name) */
948
952
  label?: string;
949
953
  /** Column width */
950
954
  width?: number;
951
- /** Custom cell renderer */
952
- renderer?: CellRenderer<Record<string, unknown>>;
955
+ /** Custom cell renderer with typed row data */
956
+ renderer?: CellRenderer<TRow>;
953
957
  /** Enable/disable sort (default: auto-detected from type) */
954
958
  sort?: boolean;
955
959
  /** Enable/disable filter (default: auto-detected from type) */