@dxos/react-ui-table 0.6.13 → 0.6.14-main.2b6a0f3

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 (63) hide show
  1. package/dist/lib/browser/index.mjs +49 -132
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/ColumnMenu/ColumnMenu.d.ts +6 -3
  5. package/dist/types/src/components/ColumnMenu/ColumnMenu.d.ts.map +1 -1
  6. package/dist/types/src/components/ColumnMenu/ColumnMenu.stories.d.ts +3 -3
  7. package/dist/types/src/components/ColumnMenu/ColumnMenu.stories.d.ts.map +1 -1
  8. package/dist/types/src/components/ColumnMenu/ColumnSettings.d.ts +15 -0
  9. package/dist/types/src/components/ColumnMenu/ColumnSettings.d.ts.map +1 -0
  10. package/dist/types/src/components/ColumnMenu/ColumnSettings.stories.d.ts +84 -0
  11. package/dist/types/src/components/ColumnMenu/ColumnSettings.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/ColumnMenu/index.d.ts +1 -1
  13. package/dist/types/src/components/ColumnMenu/index.d.ts.map +1 -1
  14. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  15. package/dist/types/src/components/Table/Table.stories.d.ts +9 -27
  16. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Table/TableContext.d.ts +2 -4
  18. package/dist/types/src/components/Table/TableContext.d.ts.map +1 -1
  19. package/dist/types/src/components/Table/TableHead.d.ts.map +1 -1
  20. package/dist/types/src/components/Table/index.d.ts +2 -1
  21. package/dist/types/src/components/Table/index.d.ts.map +1 -1
  22. package/dist/types/src/helpers.d.ts +1 -1
  23. package/dist/types/src/helpers.d.ts.map +1 -1
  24. package/dist/types/src/hooks/useRowSelection.d.ts.map +1 -1
  25. package/dist/types/src/schema/{SchemaToTable.stories.d.ts → Schema.stories.d.ts} +2 -3
  26. package/dist/types/src/schema/Schema.stories.d.ts.map +1 -0
  27. package/dist/types/src/schema/{schemaToColumns.d.ts → column-utils.d.ts} +2 -2
  28. package/dist/types/src/schema/column-utils.d.ts.map +1 -0
  29. package/dist/types/src/schema/index.d.ts +1 -1
  30. package/dist/types/src/schema/index.d.ts.map +1 -1
  31. package/dist/types/src/schema/types.d.ts +10 -4
  32. package/dist/types/src/schema/types.d.ts.map +1 -1
  33. package/package.json +23 -20
  34. package/src/components/ColumnMenu/ColumnMenu.stories.tsx +14 -13
  35. package/src/components/ColumnMenu/ColumnMenu.tsx +8 -5
  36. package/src/components/ColumnMenu/{ColumnSettingsForm.stories.tsx → ColumnSettings.stories.tsx} +27 -23
  37. package/src/components/ColumnMenu/{ColumnSettingsForm.tsx → ColumnSettings.tsx} +44 -43
  38. package/src/components/ColumnMenu/index.ts +1 -1
  39. package/src/components/Table/Table.stories.tsx +93 -95
  40. package/src/components/Table/Table.tsx +10 -15
  41. package/src/components/Table/TableContext.tsx +13 -7
  42. package/src/components/Table/TableHead.tsx +0 -1
  43. package/src/components/Table/index.ts +2 -1
  44. package/src/components/Table/props.ts +4 -4
  45. package/src/helpers.tsx +4 -6
  46. package/src/hooks/useRowSelection.ts +1 -0
  47. package/src/schema/{SchemaToTable.stories.tsx → Schema.stories.tsx} +11 -23
  48. package/src/schema/{schemaToColumns.ts → column-utils.ts} +10 -10
  49. package/src/schema/index.ts +1 -1
  50. package/src/schema/types.ts +14 -6
  51. package/src/translations.ts +1 -1
  52. package/dist/types/src/components/ColumnMenu/ColumnSettingsForm.d.ts +0 -12
  53. package/dist/types/src/components/ColumnMenu/ColumnSettingsForm.d.ts.map +0 -1
  54. package/dist/types/src/components/ColumnMenu/ColumnSettingsForm.stories.d.ts +0 -63
  55. package/dist/types/src/components/ColumnMenu/ColumnSettingsForm.stories.d.ts.map +0 -1
  56. package/dist/types/src/schema/SchemaToTable.stories.d.ts.map +0 -1
  57. package/dist/types/src/schema/schema.d.ts +0 -5
  58. package/dist/types/src/schema/schema.d.ts.map +0 -1
  59. package/dist/types/src/schema/schema.test.d.ts +0 -2
  60. package/dist/types/src/schema/schema.test.d.ts.map +0 -1
  61. package/dist/types/src/schema/schemaToColumns.d.ts.map +0 -1
  62. package/src/schema/schema.test.ts +0 -148
  63. package/src/schema/schema.ts +0 -93
@@ -5,14 +5,15 @@
5
5
  import '@dxos-theme';
6
6
 
7
7
  import { Plugs, PlugsConnected } from '@phosphor-icons/react';
8
+ import { type StoryObj } from '@storybook/react';
8
9
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
9
10
 
10
11
  import { create } from '@dxos/echo-schema';
11
- import { registerSignalRuntime } from '@dxos/echo-signals/react';
12
12
  import { PublicKey } from '@dxos/keys';
13
+ import { log } from '@dxos/log';
13
14
  import { faker } from '@dxos/random';
14
- import { Button, DensityProvider } from '@dxos/react-ui';
15
- import { withTheme } from '@dxos/storybook-utils';
15
+ import { Button } from '@dxos/react-ui';
16
+ import { withSignals, withTheme } from '@dxos/storybook-utils';
16
17
  import { range } from '@dxos/util';
17
18
 
18
19
  import { Table } from './Table';
@@ -127,7 +128,7 @@ const MinimalTable = (props: any) => {
127
128
  };
128
129
 
129
130
  export default {
130
- title: 'react-ui-table/Table',
131
+ title: 'ui/react-ui-table/Table',
131
132
  component: MinimalTable,
132
133
  args: {
133
134
  header: true,
@@ -157,14 +158,7 @@ export default {
157
158
  },
158
159
  rowsSelectable: { control: 'select', options: [false, true, 'multi'] },
159
160
  },
160
- decorators: [
161
- withTheme,
162
- (Story: any) => (
163
- <DensityProvider density='fine'>
164
- <Story />
165
- </DensityProvider>
166
- ),
167
- ],
161
+ decorators: [withTheme],
168
162
  };
169
163
 
170
164
  export const Default = {
@@ -406,105 +400,109 @@ export const TenThousandRows = {
406
400
  },
407
401
  };
408
402
 
409
- registerSignalRuntime();
410
- const state = create({ items: createItems(10) });
403
+ // TODO(burdon): Warning: Encountered two children with the same key.
411
404
 
412
- export const RealTimeUpdates = {
413
- args: {
414
- periodicMutations: true,
415
- mutationInterval: 1000,
416
- periodicDeletions: false,
417
- deletionInterval: 5000,
418
- periodicInsertions: false,
419
- insertionInterval: 3000,
420
- },
421
- argTypes: {
422
- mutationInterval: { control: 'number' },
423
- periodicDeletions: { control: 'boolean' },
424
- deletionInterval: { control: 'number' },
425
- periodicInsertions: { control: 'boolean' },
426
- insertionInterval: { control: 'number' },
427
- },
428
- render: ({
429
- periodicMutations,
430
- mutationInterval,
431
- periodicDeletions,
432
- deletionInterval,
433
- periodicInsertions,
434
- insertionInterval,
435
- }: any) => {
436
- useEffect(() => {
437
- if (!periodicMutations) {
405
+ type StoryProps = {
406
+ periodicMutations: boolean;
407
+ mutationInterval: number;
408
+ periodicDeletions: boolean;
409
+ deletionInterval: number;
410
+ periodicInsertions: boolean;
411
+ insertionInterval: number;
412
+ };
413
+
414
+ const DefaultStory = ({
415
+ periodicMutations,
416
+ mutationInterval,
417
+ periodicDeletions,
418
+ deletionInterval,
419
+ periodicInsertions,
420
+ insertionInterval,
421
+ }: StoryProps) => {
422
+ const [state] = useState(() => create({ items: createItems(10) }));
423
+
424
+ useEffect(() => {
425
+ if (!periodicMutations) {
426
+ return;
427
+ }
428
+
429
+ const i = setInterval(() => {
430
+ if (state.items.length === 0) {
438
431
  return;
439
432
  }
440
433
 
441
- const interval = setInterval(() => {
442
- if (state.items.length === 0) {
443
- return;
444
- }
434
+ const idx = Math.floor(Math.random() * state.items.length);
435
+ log('mutating', { idx });
436
+ state.items[idx].name = faker.commerce.productName();
437
+ state.items[idx].count = Math.floor(Math.random() * 1000);
438
+ state.items[idx].started = new Date();
439
+ }, mutationInterval);
445
440
 
446
- const randomIndex = Math.floor(Math.random() * state.items.length);
447
- console.log('Mutating row', randomIndex);
448
- state.items[randomIndex].name = faker.commerce.productName();
449
- state.items[randomIndex].count = Math.floor(Math.random() * 1000);
450
- state.items[randomIndex].started = new Date();
451
- }, mutationInterval);
441
+ return () => clearInterval(i);
442
+ }, [periodicMutations, mutationInterval, state.items]);
452
443
 
453
- return () => clearInterval(interval);
454
- }, [periodicMutations, mutationInterval, state.items]);
444
+ useEffect(() => {
445
+ if (!periodicInsertions) {
446
+ return;
447
+ }
455
448
 
456
- useEffect(() => {
457
- if (!periodicInsertions) {
458
- return;
459
- }
449
+ const i = setInterval(() => {
450
+ log('inserting...');
451
+ state.items.push(createItems(1)[0]);
452
+ }, insertionInterval);
460
453
 
461
- const interval = setInterval(() => {
462
- console.log('Inserting...');
463
- state.items.push(createItems(1)[0]);
464
- }, insertionInterval);
454
+ return () => clearInterval(i);
455
+ }, [periodicInsertions, insertionInterval, state.items]);
465
456
 
466
- return () => clearInterval(interval);
467
- }, [periodicInsertions, insertionInterval, state.items]);
457
+ useEffect(() => {
458
+ if (!periodicDeletions) {
459
+ return;
460
+ }
468
461
 
469
- useEffect(() => {
470
- if (!periodicDeletions) {
462
+ const i = setInterval(() => {
463
+ if (state.items.length === 0) {
471
464
  return;
472
465
  }
473
466
 
474
- const interval = setInterval(() => {
475
- if (state.items.length === 0) {
476
- return;
477
- }
478
-
479
- console.log('Deleting');
467
+ log('deleting...');
468
+ const randomIndex = Math.floor(Math.random() * state.items.length);
469
+ state.items.splice(randomIndex, 1);
470
+ }, deletionInterval);
480
471
 
481
- // Randomly delete a row from state.items
482
- const randomIndex = Math.floor(Math.random() * state.items.length);
483
- state.items.splice(randomIndex, 1);
484
- }, deletionInterval);
472
+ return () => clearInterval(i);
473
+ }, [periodicDeletions, deletionInterval, state.items]);
485
474
 
486
- return () => clearInterval(interval);
487
- }, [periodicDeletions, deletionInterval, state.items]);
475
+ const onUpdate = useCallback((...args: any[]) => {}, []);
476
+ const columns = useMemo(() => makeColumns(onUpdate), []);
488
477
 
489
- const onUpdate = useCallback((...args: any[]) => {}, []);
490
- const columns = useMemo(() => makeColumns(onUpdate), []);
478
+ return (
479
+ <Table.Root>
480
+ <Table.Viewport classNames='fixed inset-0'>
481
+ <Table.Main<Item>
482
+ role='grid'
483
+ rowsSelectable='multi'
484
+ keyAccessor={(row) => row.publicKey.toHex()}
485
+ columns={columns}
486
+ data={state.items}
487
+ fullWidth
488
+ stickyHeader
489
+ border
490
+ pinLastRow
491
+ />
492
+ </Table.Viewport>
493
+ </Table.Root>
494
+ );
495
+ };
491
496
 
492
- return (
493
- <Table.Root>
494
- <Table.Viewport classNames='fixed inset-0'>
495
- <Table.Main<Item>
496
- role='grid'
497
- rowsSelectable='multi'
498
- keyAccessor={(row) => row.publicKey.toHex()}
499
- columns={columns}
500
- data={state.items}
501
- fullWidth
502
- stickyHeader
503
- border
504
- pinLastRow
505
- />
506
- </Table.Viewport>
507
- </Table.Root>
508
- );
497
+ export const RealTimeUpdates: StoryObj<StoryProps> = {
498
+ render: DefaultStory,
499
+ decorators: [withSignals],
500
+ args: {
501
+ periodicMutations: true,
502
+ mutationInterval: 1000,
503
+ periodicDeletions: false,
504
+ deletionInterval: 5000,
505
+ periodicInsertions: false,
506
+ insertionInterval: 3000,
509
507
  },
510
508
  };
@@ -16,16 +16,16 @@ import {
16
16
  } from '@tanstack/react-table';
17
17
  import React, {
18
18
  type ComponentPropsWithoutRef,
19
+ type ReactNode,
19
20
  Fragment,
21
+ memo,
20
22
  useCallback,
21
23
  useEffect,
22
24
  useState,
23
25
  useContext,
24
- type ReactNode,
25
- memo,
26
26
  } from 'react';
27
27
 
28
- import { DensityProvider, type ThemedClassName, useDefaultValue } from '@dxos/react-ui';
28
+ import { type ThemedClassName, useDefaultValue } from '@dxos/react-ui';
29
29
  import { mx } from '@dxos/react-ui-theme';
30
30
 
31
31
  import { TableBody } from './TableBody';
@@ -40,11 +40,7 @@ type TableRootProps = { children: ReactNode };
40
40
 
41
41
  const TableRoot = ({ children }: TableRootProps) => {
42
42
  const contextValue = useTableRootContext();
43
- return (
44
- <TableRootContext.Provider value={contextValue}>
45
- <DensityProvider density='fine'>{children}</DensityProvider>
46
- </TableRootContext.Provider>
47
- );
43
+ return <TableRootContext.Provider value={contextValue}>{children}</TableRootContext.Provider>;
48
44
  };
49
45
 
50
46
  type TableViewportProps = ThemedClassName<ComponentPropsWithoutRef<typeof Primitive.div>> & {
@@ -55,7 +51,6 @@ const TableViewport = ({ children, classNames, asChild, ...props }: TableViewpor
55
51
  const { scrollContextRef } = useContext(TableRootContext);
56
52
 
57
53
  const classes = mx(classNames, 'overflow-auto');
58
-
59
54
  return asChild ? (
60
55
  <Slot ref={scrollContextRef} className={classes} {...props}>
61
56
  {children}
@@ -70,17 +65,17 @@ const TableViewport = ({ children, classNames, asChild, ...props }: TableViewpor
70
65
  export const TablePrimitive = <TData extends RowData>(props: TableProps<TData>) => {
71
66
  const {
72
67
  role,
73
- onColumnResize,
74
- columnVisibility,
75
68
  header = true,
76
69
  rowsSelectable,
77
70
  debug,
78
- onDataSelectionChange,
79
71
  pinLastRow,
72
+ columnVisibility,
73
+ onColumnResize,
74
+ onDataSelectionChange,
80
75
  } = props;
81
76
 
82
- const columns = useDefaultValue(props.columns, []);
83
- const incomingData = useDefaultValue(props.data, []);
77
+ const columns = useDefaultValue(props.columns, () => []);
78
+ const incomingData = useDefaultValue(props.data, () => []);
84
79
 
85
80
  const [data, setData] = useState([...incomingData]);
86
81
 
@@ -110,7 +105,7 @@ export const TablePrimitive = <TData extends RowData>(props: TableProps<TData>)
110
105
  // Columns
111
106
  columns,
112
107
  defaultColumn: {
113
- size: 256, // Required in order remove default width.
108
+ size: 400, // Required in order remove default width.
114
109
  maxSize: 1024,
115
110
  },
116
111
 
@@ -3,26 +3,32 @@
3
3
  //
4
4
 
5
5
  import { type RowData } from '@tanstack/react-table';
6
- import React, { useContext, createContext, type JSX, type ReactNode, type FC, type Context } from 'react';
6
+ import React, {
7
+ useContext,
8
+ createContext,
9
+ type Context,
10
+ type JSX,
11
+ type PropsWithChildren,
12
+ type ReactNode,
13
+ } from 'react';
14
+
15
+ import { raise } from '@dxos/debug';
7
16
 
8
17
  import { type TableContextValue } from './props';
9
18
 
10
19
  export const TABLE_NAME = 'Table';
11
20
 
12
- // Create the context without a default value.
13
- // The expectation is that the provider will always supply a value, so no need to define a default here.
14
- const TableContext = createContext<TableContextValue<RowData>>({} as TableContextValue<RowData>);
21
+ const TableContext = createContext<TableContextValue<RowData> | undefined>(undefined);
15
22
 
16
23
  export type TypedTableProvider<TData extends RowData> = {
17
24
  (props: TableContextValue<TData> & { children: ReactNode }): JSX.Element;
18
25
  displayName: string;
19
26
  };
20
27
 
21
- export const TableProvider: FC<TableContextValue<RowData> & { children: ReactNode }> = ({ children, ...value }) => {
28
+ export const TableProvider = ({ children, ...value }: PropsWithChildren<TableContextValue<RowData>>) => {
22
29
  return <TableContext.Provider value={value}>{children}</TableContext.Provider>;
23
30
  };
24
31
 
25
- // Create a custom hook to consume the context.
26
32
  export const useTableContext = <TData extends RowData>(): TableContextValue<TData> => {
27
- return useContext(TableContext as Context<TableContextValue<TData>>);
33
+ return useContext(TableContext as Context<TableContextValue<TData>>) ?? raise(new Error('Missing TableContext'));
28
34
  };
@@ -49,7 +49,6 @@ const TableHead = (_props: TableHeadProps) => {
49
49
  * Resize handle.
50
50
  * https://codesandbox.io/p/sandbox/github/tanstack/table/tree/main/examples/react/column-sizing
51
51
  */}
52
-
53
52
  {resizable && (
54
53
  <div
55
54
  className={theadResizeRoot({ isResizing })}
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './Table';
6
5
  export * from './props';
6
+ export * from './Table';
7
+ export * from './TableContext';
7
8
  export * from './TableRootContext';
@@ -25,7 +25,7 @@ export type TableFlags = Partial<{
25
25
  * This is ‘current’ in the `aria-current` sense.
26
26
  */
27
27
  export type TableCurrent<TData extends RowData> = Partial<{
28
- // App state
28
+ // App state.
29
29
  currentDatum: TData;
30
30
  onDatumClick: (datum: TData) => void;
31
31
  }>;
@@ -39,13 +39,13 @@ export type TableProps<TData extends RowData> = TableFlags &
39
39
  onColumnResize: (state: Record<string, number>) => void;
40
40
  onColumnReorder: (columnId: string, direction: 'left' | 'right') => void;
41
41
  columnVisibility: VisibilityState;
42
- // Controllable row selection
42
+ // Controllable row selection.
43
43
  rowSelection: RowSelectionState;
44
44
  defaultRowSelection: RowSelectionState;
45
45
  onRowSelectionChange: (rowSelection: RowSelectionState) => void;
46
- // Derived from row selection
46
+ // Derived from row selection.
47
47
  onDataSelectionChange: (dataSelection: TData[]) => void;
48
- // `table` element props
48
+ // `table` element props.
49
49
  classNames: ClassNameValue;
50
50
  pinLastRow: boolean;
51
51
  }>;
package/src/helpers.tsx CHANGED
@@ -21,8 +21,7 @@ import { log } from '@dxos/log';
21
21
  import { type ClassNameValue, Input, Tooltip } from '@dxos/react-ui';
22
22
  import { getSize, mx } from '@dxos/react-ui-theme';
23
23
 
24
- import { CellCombobox } from './components';
25
- import { useTableContext } from './components/Table/TableContext';
24
+ import { CellCombobox, useTableContext } from './components';
26
25
  import { textPadding } from './theme';
27
26
 
28
27
  export type ValueUpdater<TData extends RowData, TValue> = (row: TData, id: string, value: TValue) => void;
@@ -470,7 +469,7 @@ export class ColumnBuilder<TData extends RowData> {
470
469
  size: 50,
471
470
  minSize: 50,
472
471
  header: (column) => label ?? column.header.id,
473
- // TODO(zan): Implement sort algorithm
472
+ // TODO(zan): Implement sort algorithm.
474
473
  enableSorting: true,
475
474
  cell: SwitchBuilderCell,
476
475
  ...props,
@@ -486,7 +485,7 @@ export class ColumnBuilder<TData extends RowData> {
486
485
  const IconOff = off?.Icon ?? X;
487
486
  return {
488
487
  size: size ?? 32,
489
- // TODO(zan): Implement sort algorithm
488
+ // TODO(zan): Implement sort algorithm.
490
489
  enableSorting: false,
491
490
  header: (column) => <div className={'justify-center'}>{label ?? column.header.id}</div>,
492
491
  cell: (cell) => {
@@ -506,14 +505,13 @@ export class ColumnBuilder<TData extends RowData> {
506
505
  /**
507
506
  * This display column type is for nested/unhandled data to appear as JSON.
508
507
  */
509
- display({ label, classNames, ...props }: KeyColumnOptions<TData> = {}): Partial<ColumnDef<TData, PublicKey>> {
508
+ json({ label, classNames, ...props }: KeyColumnOptions<TData> = {}): Partial<ColumnDef<TData, PublicKey>> {
510
509
  return {
511
510
  size: 120,
512
511
  minSize: 120,
513
512
  header: (cell) => label ?? cell.header.id,
514
513
  cell: (cell) => {
515
514
  const value = cell.getValue();
516
-
517
515
  return (
518
516
  <div className='overflow-scroll'>
519
517
  <code className='text-xs'>{JSON.stringify(value)}</code>
@@ -1,6 +1,7 @@
1
1
  //
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
+
4
5
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
5
6
  import { type OnChangeFn, type RowSelectionState } from '@tanstack/react-table';
6
7
  import { useCallback } from 'react';
@@ -4,31 +4,22 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import * as Arbitrary from '@effect/schema/Arbitrary';
7
+ import { Arbitrary } from '@effect/schema';
8
8
  import * as fc from 'fast-check';
9
9
  import React from 'react';
10
10
 
11
11
  import { S } from '@dxos/echo-schema';
12
- import { DensityProvider } from '@dxos/react-ui';
13
- import { withTheme } from '@dxos/storybook-utils';
12
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
14
13
 
15
- import { schemaToColumnDefs } from './schemaToColumns';
14
+ import { schemaToColumnDefs } from './column-utils';
16
15
  import { Table } from '../components';
17
16
 
18
17
  export default {
19
- title: 'react-ui-table/SchemaTable',
20
- args: {},
21
- decorators: [
22
- withTheme,
23
- (Story: any) => (
24
- <DensityProvider density='fine'>
25
- <Story />
26
- </DensityProvider>
27
- ),
28
- ],
18
+ title: 'ui/react-ui-table/Schema',
19
+ decorators: [withTheme, withLayout()],
29
20
  };
30
21
 
31
- const exampleSchema = S.Struct({
22
+ const TestSchema = S.Struct({
32
23
  field1: S.String,
33
24
  field2: S.Number,
34
25
  field3: S.Date,
@@ -41,20 +32,17 @@ const exampleSchema = S.Struct({
41
32
  ),
42
33
  });
43
34
 
44
- type ExampleSchema = S.Schema.Type<typeof exampleSchema>;
35
+ type TestType = S.Schema.Type<typeof TestSchema>;
45
36
 
46
- const columns = schemaToColumnDefs(exampleSchema);
37
+ const columns = schemaToColumnDefs(TestSchema);
38
+ const items = fc.sample(Arbitrary.make(TestSchema), 10);
47
39
 
48
- const exampleSchemaArbitrary = Arbitrary.make(exampleSchema);
49
-
50
- const items = fc.sample(exampleSchemaArbitrary, 10);
51
-
52
- export const SchemaTable = {
40
+ export const Default = {
53
41
  render: () => {
54
42
  return (
55
43
  <Table.Root>
56
44
  <Table.Viewport classNames='fixed inset-0'>
57
- <Table.Main<ExampleSchema>
45
+ <Table.Main<TestType>
58
46
  role='grid'
59
47
  rowsSelectable='multi'
60
48
  keyAccessor={(row) => JSON.stringify(row)}
@@ -4,38 +4,38 @@
4
4
 
5
5
  import { type ColumnDef } from '@tanstack/react-table';
6
6
 
7
- import type { S } from '@dxos/echo-schema';
7
+ import { type S } from '@dxos/echo-schema';
8
+ import { FieldValueType, mapSchemaToFields } from '@dxos/schema';
8
9
 
9
- import { classifySchemaProperties } from './schema';
10
10
  import { createColumnBuilder } from '../helpers';
11
11
 
12
12
  export const schemaToColumnDefs = <T>(schema: S.Schema<T, any>): ColumnDef<T, any>[] => {
13
13
  const { helper, builder } = createColumnBuilder<T>();
14
14
 
15
- const classified = classifySchemaProperties(schema);
15
+ const classified = mapSchemaToFields(schema);
16
16
  return classified.map(([name, type]) => {
17
17
  const propertyKey = name.toString();
18
18
 
19
19
  let column: Partial<ColumnDef<any, any>> | undefined;
20
20
  switch (type) {
21
- case 'string': {
22
- column = builder.string({ label: propertyKey });
21
+ case FieldValueType.String: {
22
+ column = builder.string({ label: propertyKey, classNames: [name === 'id' && 'font-mono'] });
23
23
  break;
24
24
  }
25
- case 'number': {
25
+ case FieldValueType.Number: {
26
26
  column = builder.number({ label: propertyKey });
27
27
  break;
28
28
  }
29
- case 'boolean': {
29
+ case FieldValueType.Boolean: {
30
30
  column = builder.switch({ label: propertyKey });
31
31
  break;
32
32
  }
33
- case 'date': {
33
+ case FieldValueType.Date: {
34
34
  column = builder.date({ label: propertyKey });
35
35
  break;
36
36
  }
37
- case 'display': {
38
- column = builder.display({ label: propertyKey, id: propertyKey });
37
+ case FieldValueType.JSON: {
38
+ column = builder.json({ label: propertyKey, id: propertyKey });
39
39
  break;
40
40
  }
41
41
  default: {
@@ -2,5 +2,5 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './schemaToColumns';
5
+ export * from './column-utils';
6
6
  export * from './types';
@@ -2,18 +2,26 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { type FieldValueType } from '@dxos/schema';
6
+
7
+ /**
8
+ * @deprecated
9
+ */
10
+ // TODO(burdon): Reconcile with @dxos/schema/View.
5
11
  export type TableDef = {
6
12
  id: string;
7
- name?: string; // TODO(burdon): Required?
8
- columns: ColumnProps[];
13
+ name?: string;
14
+ columns: ColumnDef[];
9
15
  };
10
16
 
11
- export type ColumnType = 'number' | 'boolean' | 'date' | 'string' | 'ref';
12
-
13
- export type ColumnProps = {
17
+ /**
18
+ * @deprecated
19
+ */
20
+ // TODO(burdon): Reconcile with @dxos/schema/Field.
21
+ export type ColumnDef = {
14
22
  id: string;
15
23
  prop: string;
16
- type: ColumnType;
24
+ type: FieldValueType;
17
25
  size?: number;
18
26
  label?: string;
19
27
 
@@ -10,7 +10,7 @@ export default [
10
10
  [translationKey]: {
11
11
  'no selection label': ' ',
12
12
  'number column type label': 'Number',
13
- 'boolean column type label': 'Toggle',
13
+ 'boolean column type label': 'Boolean',
14
14
  'date column type label': 'Date',
15
15
  'string column type label': 'Text',
16
16
  'ref column type label': 'Reference',
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import { type TableDef, type ColumnProps } from '../../schema';
3
- export type ColumnSettingsFormProps = {
4
- column: ColumnProps;
5
- tableDef: TableDef;
6
- tablesToReference: TableDef[];
7
- onUpdate?: ((id: string, column: ColumnProps) => void) | undefined;
8
- onDelete?: ((id: string) => void) | undefined;
9
- onClose?: () => void;
10
- };
11
- export declare const ColumnSettingsForm: ({ column, tableDef, tablesToReference, onUpdate, onDelete, onClose, }: ColumnSettingsFormProps) => React.JSX.Element;
12
- //# sourceMappingURL=ColumnSettingsForm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ColumnSettingsForm.d.ts","sourceRoot":"","sources":["../../../../../src/components/ColumnMenu/ColumnSettingsForm.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAKhD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAmB,MAAM,cAAc,CAAC;AAGhF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,kBAAkB,0EAO5B,uBAAuB,sBAkLzB,CAAC"}