@sanity/table 2.0.1 → 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/LICENSE CHANGED
@@ -1,9 +1,9 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 ʞunp ʇɹǝdnɹ
4
- Copyright (c) 2025 Mathis Bullinger
5
- Copyright (c) 2025 Dave Lucia
6
- Copyright (c) 2025 Sanity.io
3
+ Copyright (c) 2026 ʞunp ʇɹǝdnɹ
4
+ Copyright (c) 2026 Mathis Bullinger
5
+ Copyright (c) 2026 Dave Lucia
6
+ Copyright (c) 2026 Sanity.io
7
7
 
8
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
9
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,9 +1,6 @@
1
1
  # Sanity Table Plugin
2
2
 
3
- > For the v2 version, please refer to the [v2 repository](https://github.com/rdunk/sanity-plugin-table).
4
-
5
- This is a (triple) fork of the Sanity Plugin Table, migrated to [Sanity Studio V3](https://beta.sanity.io/docs/platform/studio/v2-to-v3).
6
- Only the v3 version is maintained by Sanity.io.
3
+ This is a (triple) fork of the Sanity Plugin Table, now maintained by Sanity.io.
7
4
 
8
5
  ![example](https://user-images.githubusercontent.com/8467307/48703530-e369be00-ebeb-11e8-8299-14812461aee8.gif)
9
6
 
@@ -13,7 +10,7 @@ Big thanks to the original contributors for their work!
13
10
 
14
11
  - Original version: [rdunk/sanity-plugin-table](https://github.com/rdunk/sanity-plugin-table).
15
12
  - Further improvements in fork [MathisBullinger/sanity-plugin-another-table](https://github.com/MathisBullinger/sanity-plugin-another-table).
16
- - Initial V3 port: [bitfo/sanity-plugin-table](https://github.com/bitfo/sanity-plugin-table)
13
+ - Initial Studio port: [bitfo/sanity-plugin-table](https://github.com/bitfo/sanity-plugin-table)
17
14
 
18
15
  ## Disclaimer
19
16
 
@@ -40,9 +37,9 @@ Add the plugin to your project configuration. Then use the type in your schemas
40
37
  ```js
41
38
  // sanity.config.ts
42
39
 
43
- import { defineConfig } from 'sanity';
40
+ import {defineConfig} from 'sanity'
44
41
 
45
- import { table } from '@sanity/table';
42
+ import {table} from '@sanity/table'
46
43
 
47
44
  export default defineConfig({
48
45
  name: 'default',
@@ -71,7 +68,7 @@ export default defineConfig({
71
68
  },
72
69
  ],
73
70
  },
74
- });
71
+ })
75
72
  ```
76
73
 
77
74
  ## Configuration
@@ -87,24 +84,9 @@ export default defineConfig({
87
84
  }),
88
85
  ],
89
86
  // ...
90
- });
87
+ })
91
88
  ```
92
89
 
93
90
  ## License
94
91
 
95
92
  [MIT](LICENSE) © ʞunp ʇɹǝdnɹ, Mathis Bullinger, Dave Lucia and Sanity.io
96
-
97
- ## Develop & test
98
-
99
- This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
100
- with default configuration for build & watch scripts.
101
-
102
- See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
103
- on how to run this plugin with hotreload in the studio.
104
-
105
- ### Release new version
106
-
107
- Run ["CI & Release" workflow](https://github.com/sanity-io/table/actions/workflows/main.yml).
108
- Make sure to select the main branch and check "Release new version".
109
-
110
- Semantic release will only release on configured branches, so it is safe to run release on any branch.
@@ -0,0 +1,24 @@
1
+ import { ObjectInputProps, PreviewProps } from "sanity";
2
+ interface TableValue {
3
+ _type?: 'table';
4
+ rows?: TableRow[];
5
+ }
6
+ type TableProps = ObjectInputProps<TableValue>;
7
+ type TableRow = {
8
+ _type: string;
9
+ _key: string;
10
+ cells: string[];
11
+ };
12
+ declare const TableComponent: (props: TableProps & {
13
+ rowType?: string;
14
+ }) => import("react").JSX.Element;
15
+ interface TablePreviewProps extends PreviewProps {
16
+ rows?: TableRow[];
17
+ }
18
+ declare const TablePreview: (props: TablePreviewProps) => import("react").JSX.Element;
19
+ interface TableConfig {
20
+ rowType?: string;
21
+ }
22
+ declare const table: import("sanity").Plugin<void | TableConfig>;
23
+ export { TableComponent, TableConfig, TablePreview, type TableProps, type TableRow, type TableValue, table };
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/components/TableComponent.tsx","../src/components/TablePreview.tsx","../src/index.ts"],"mappings":";UAYiB,UAAA;EACf,KAAA;EACA,IAAA,GAAO,QAAQ;AAAA;AAAA,KAGL,UAAA,GAAa,gBAAgB,CAAC,UAAA;AAAA,KAE9B,QAAA;EACV,KAAA;EACA,IAAA;EACA,KAAA;AAAA;AAAA,cAMW,cAAA,GAAkB,KAAA,EAAO,UAAU;EAAI,OAAA;AAAA,sBAAiB,GAAA,CAAA,OAAA;AAAA,UCtB3D,iBAAA,SAA0B,YAAY;EAC9C,IAAA,GAAO,QAAA;AAAA;AAAA,cAqBI,YAAA,GAAgB,KAAA,EAAO,iBAAiB,qBAAA,GAAA,CAAA,OAAA;AAAA,UCpBpC,WAAA;EACf,OAAO;AAAA;AAAA,cAGI,KAAA,mBAAK,MAAA,QAAA,WAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,431 @@
1
+ import { set, unset, definePlugin, defineType } from "sanity";
2
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
+ import { c } from "react/compiler-runtime";
4
+ import { RemoveIcon, ControlsIcon, AddIcon, WarningOutlineIcon } from "@sanity/icons";
5
+ import { TextInput, Box, Button, Dialog, Card, Inline, MenuItem, MenuDivider, Menu, MenuButton, Text, Flex, Label, Grid } from "@sanity/ui";
6
+ import { uuid } from "@sanity/uuid";
7
+ import { useState } from "react";
8
+ const TableInput = (props) => {
9
+ const $ = c(20), {
10
+ rows,
11
+ updateCell,
12
+ removeRow,
13
+ removeColumn
14
+ } = props;
15
+ let t0;
16
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
17
+ width: "100%"
18
+ }, $[0] = t0) : t0 = $[0];
19
+ let t1;
20
+ if ($[1] !== removeRow || $[2] !== rows || $[3] !== updateCell) {
21
+ let t22;
22
+ $[5] !== removeRow || $[6] !== updateCell ? (t22 = (row, rowIndex) => /* @__PURE__ */ jsxs("tr", { children: [
23
+ row.cells.map((cell, cellIndex) => /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(TextInput, { fontSize: 1, padding: 3, value: cell, onChange: (e) => updateCell(e, rowIndex, cellIndex) }) }, `${row._key}-${cellIndex}`)),
24
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Box, { marginLeft: 1, style: {
25
+ textAlign: "center"
26
+ }, children: /* @__PURE__ */ jsx(Button, { icon: RemoveIcon, padding: 2, onClick: () => removeRow(rowIndex), mode: "bleed" }) }) }, `${row._key}-remove`)
27
+ ] }, row._key), $[5] = removeRow, $[6] = updateCell, $[7] = t22) : t22 = $[7], t1 = rows.map(t22), $[1] = removeRow, $[2] = rows, $[3] = updateCell, $[4] = t1;
28
+ } else
29
+ t1 = $[4];
30
+ let t2;
31
+ $[8] !== rows[0]?.cells ? (t2 = rows[0]?.cells || [], $[8] = rows[0]?.cells, $[9] = t2) : t2 = $[9];
32
+ let t3;
33
+ if ($[10] !== removeColumn || $[11] !== t2) {
34
+ let t42;
35
+ $[13] !== removeColumn ? (t42 = (_, i) => /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Box, { marginTop: 1, style: {
36
+ textAlign: "center"
37
+ }, children: /* @__PURE__ */ jsx(Button, { icon: RemoveIcon, padding: 2, onClick: () => removeColumn(i), mode: "bleed" }) }) }, i), $[13] = removeColumn, $[14] = t42) : t42 = $[14], t3 = t2.map(t42), $[10] = removeColumn, $[11] = t2, $[12] = t3;
38
+ } else
39
+ t3 = $[12];
40
+ let t4;
41
+ $[15] !== t3 ? (t4 = /* @__PURE__ */ jsx("tr", { children: t3 }), $[15] = t3, $[16] = t4) : t4 = $[16];
42
+ let t5;
43
+ return $[17] !== t1 || $[18] !== t4 ? (t5 = /* @__PURE__ */ jsx("table", { style: t0, children: /* @__PURE__ */ jsxs("tbody", { children: [
44
+ t1,
45
+ t4
46
+ ] }) }), $[17] = t1, $[18] = t4, $[19] = t5) : t5 = $[19], t5;
47
+ }, TableMenu = (props) => {
48
+ const $ = c(42), {
49
+ remove: handleRemove
50
+ } = props, [dialog, setDialog] = useState(null), [count, setCount] = useState("");
51
+ let t0;
52
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = (e) => {
53
+ setCount(e.currentTarget.value);
54
+ }, $[0] = t0) : t0 = $[0];
55
+ const updateCount = t0;
56
+ let t1;
57
+ $[1] !== props ? (t1 = () => {
58
+ setDialog({
59
+ type: "rows",
60
+ callback: (c2) => props.addRows(c2)
61
+ });
62
+ }, $[1] = props, $[2] = t1) : t1 = $[2];
63
+ const addRows = t1;
64
+ let t2;
65
+ $[3] !== props ? (t2 = () => {
66
+ setDialog({
67
+ type: "rows",
68
+ callback: (index) => props.addRowAt(index)
69
+ });
70
+ }, $[3] = props, $[4] = t2) : t2 = $[4];
71
+ const addRowAt = t2;
72
+ let t3;
73
+ $[5] !== props ? (t3 = () => {
74
+ setDialog({
75
+ type: "columns",
76
+ callback: (c_0) => props.addColumns(c_0)
77
+ });
78
+ }, $[5] = props, $[6] = t3) : t3 = $[6];
79
+ const addColumns = t3;
80
+ let t4;
81
+ $[7] !== props ? (t4 = () => {
82
+ setDialog({
83
+ type: "columns",
84
+ callback: (index_0) => props.addColumnAt(index_0)
85
+ });
86
+ }, $[7] = props, $[8] = t4) : t4 = $[8];
87
+ const addColumnsAt = t4;
88
+ let t5;
89
+ $[9] !== count || $[10] !== dialog ? (t5 = () => {
90
+ const parsedCount = parseInt(count ?? "0", 10);
91
+ parsedCount < 100 && (setDialog(null), dialog?.callback(parsedCount), setCount(void 0));
92
+ }, $[9] = count, $[10] = dialog, $[11] = t5) : t5 = $[11];
93
+ const onConfirm = t5;
94
+ let t6;
95
+ $[12] !== count || $[13] !== dialog || $[14] !== onConfirm ? (t6 = dialog && /* @__PURE__ */ jsx(Dialog, { header: `Add ${dialog.type}`, id: "dialog-add", onClose: () => setDialog(null), zOffset: 1e3, children: /* @__PURE__ */ jsxs(Card, { padding: 4, children: [
96
+ /* @__PURE__ */ jsx(TextInput, { style: {
97
+ textAlign: "left"
98
+ }, fontSize: 2, padding: 3, type: "number", value: count, onChange: updateCount }),
99
+ /* @__PURE__ */ jsx(Box, { marginTop: 4, children: /* @__PURE__ */ jsxs(Inline, { gap: 1, style: {
100
+ textAlign: "right"
101
+ }, children: [
102
+ /* @__PURE__ */ jsx(Button, { text: "Cancel", mode: "ghost", onClick: () => setDialog(null) }),
103
+ /* @__PURE__ */ jsx(Button, { text: "Confirm", tone: "critical", onClick: onConfirm })
104
+ ] }) })
105
+ ] }) }), $[12] = count, $[13] = dialog, $[14] = onConfirm, $[15] = t6) : t6 = $[15];
106
+ let t7;
107
+ $[16] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = /* @__PURE__ */ jsx(Button, { icon: ControlsIcon, fontSize: 1, padding: 2, mode: "ghost" }), $[16] = t7) : t7 = $[16];
108
+ let t8;
109
+ $[17] !== addRows ? (t8 = /* @__PURE__ */ jsx(MenuItem, { icon: AddIcon, fontSize: 1, text: "Add Row(s)", onClick: addRows }), $[17] = addRows, $[18] = t8) : t8 = $[18];
110
+ let t9;
111
+ $[19] !== addRowAt ? (t9 = /* @__PURE__ */ jsx(MenuItem, { icon: AddIcon, fontSize: 1, text: "Add Row At Index", onClick: addRowAt }), $[19] = addRowAt, $[20] = t9) : t9 = $[20];
112
+ let t10;
113
+ $[21] !== addColumns ? (t10 = /* @__PURE__ */ jsx(MenuItem, { icon: AddIcon, fontSize: 1, text: "Add Column(s)", onClick: addColumns }), $[21] = addColumns, $[22] = t10) : t10 = $[22];
114
+ let t11;
115
+ $[23] !== addColumnsAt ? (t11 = /* @__PURE__ */ jsx(MenuItem, { icon: AddIcon, fontSize: 1, text: "Add Column At Index", onClick: addColumnsAt }), $[23] = addColumnsAt, $[24] = t11) : t11 = $[24];
116
+ let t12;
117
+ $[25] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(MenuDivider, {}), $[25] = t12) : t12 = $[25];
118
+ let t13;
119
+ $[26] !== handleRemove ? (t13 = /* @__PURE__ */ jsx(MenuItem, { icon: WarningOutlineIcon, fontSize: 1, text: "Remove", tone: "critical", onClick: handleRemove }), $[26] = handleRemove, $[27] = t13) : t13 = $[27];
120
+ let t14;
121
+ $[28] !== t10 || $[29] !== t11 || $[30] !== t13 || $[31] !== t8 || $[32] !== t9 ? (t14 = /* @__PURE__ */ jsxs(Menu, { children: [
122
+ t8,
123
+ t9,
124
+ t10,
125
+ t11,
126
+ t12,
127
+ t13
128
+ ] }), $[28] = t10, $[29] = t11, $[30] = t13, $[31] = t8, $[32] = t9, $[33] = t14) : t14 = $[33];
129
+ let t15;
130
+ $[34] !== props.placement ? (t15 = {
131
+ placement: props.placement
132
+ }, $[34] = props.placement, $[35] = t15) : t15 = $[35];
133
+ let t16;
134
+ $[36] !== t14 || $[37] !== t15 ? (t16 = /* @__PURE__ */ jsx(MenuButton, { button: t7, id: "menu-button-example", menu: t14, popover: t15 }), $[36] = t14, $[37] = t15, $[38] = t16) : t16 = $[38];
135
+ let t17;
136
+ return $[39] !== t16 || $[40] !== t6 ? (t17 = /* @__PURE__ */ jsxs(Fragment, { children: [
137
+ t6,
138
+ t16
139
+ ] }), $[39] = t16, $[40] = t6, $[41] = t17) : t17 = $[41], t17;
140
+ }, deepClone = globalThis.structuredClone ?? ((data) => JSON.parse(JSON.stringify(data))), TableComponent = (props) => {
141
+ const $ = c(64), {
142
+ rowType: t0,
143
+ value,
144
+ onChange
145
+ } = props, rowType = t0 === void 0 ? "tableRow" : t0, [dialog, setDialog] = useState(null);
146
+ let t1;
147
+ $[0] !== onChange ? (t1 = (v) => onChange(set(v)), $[0] = onChange, $[1] = t1) : t1 = $[1];
148
+ const updateValue = t1;
149
+ let t2;
150
+ $[2] !== onChange ? (t2 = () => onChange(unset()), $[2] = onChange, $[3] = t2) : t2 = $[3];
151
+ const resetValue = t2;
152
+ let t3;
153
+ $[4] !== rowType || $[5] !== updateValue || $[6] !== value ? (t3 = () => {
154
+ const newValue = {
155
+ rows: [{
156
+ _type: rowType,
157
+ _key: uuid(),
158
+ cells: ["", ""]
159
+ }, {
160
+ _type: rowType,
161
+ _key: uuid(),
162
+ cells: ["", ""]
163
+ }]
164
+ };
165
+ return updateValue({
166
+ ...value,
167
+ ...newValue
168
+ });
169
+ }, $[4] = rowType, $[5] = updateValue, $[6] = value, $[7] = t3) : t3 = $[7];
170
+ const createTable = t3;
171
+ let confirmRemoveTable;
172
+ if ($[8] !== resetValue) {
173
+ confirmRemoveTable = () => {
174
+ setDialog({
175
+ type: "table",
176
+ callback: removeTable
177
+ });
178
+ };
179
+ const removeTable = () => {
180
+ resetValue(), setDialog(null);
181
+ };
182
+ $[8] = resetValue, $[9] = confirmRemoveTable;
183
+ } else
184
+ confirmRemoveTable = $[9];
185
+ let t4;
186
+ $[10] !== rowType || $[11] !== updateValue || $[12] !== value ? (t4 = (t52) => {
187
+ const count = t52 === void 0 ? 1 : t52;
188
+ if (!value?.rows)
189
+ return;
190
+ const newRows = deepClone(value.rows), columnCount = value.rows[0]?.cells.length ?? 0;
191
+ for (let i = 0; i < count; i++)
192
+ newRows.push({
193
+ _type: rowType,
194
+ _key: uuid(),
195
+ cells: Array(columnCount).fill("")
196
+ });
197
+ return updateValue({
198
+ ...value,
199
+ rows: newRows
200
+ });
201
+ }, $[10] = rowType, $[11] = updateValue, $[12] = value, $[13] = t4) : t4 = $[13];
202
+ const addRows = t4;
203
+ let t5;
204
+ $[14] !== rowType || $[15] !== updateValue || $[16] !== value ? (t5 = (t62) => {
205
+ const index = t62 === void 0 ? 0 : t62;
206
+ if (!value?.rows)
207
+ return;
208
+ const newRows_0 = deepClone(value.rows), columnCount_0 = value.rows[0]?.cells.length ?? 0;
209
+ return newRows_0.splice(index, 0, {
210
+ _type: rowType,
211
+ _key: uuid(),
212
+ cells: Array(columnCount_0).fill("")
213
+ }), updateValue({
214
+ ...value,
215
+ rows: newRows_0
216
+ });
217
+ }, $[14] = rowType, $[15] = updateValue, $[16] = value, $[17] = t5) : t5 = $[17];
218
+ const addRowAt = t5;
219
+ let t6;
220
+ $[18] !== updateValue || $[19] !== value ? (t6 = (index_0) => {
221
+ if (!value?.rows)
222
+ return;
223
+ const newRows_1 = deepClone(value.rows);
224
+ newRows_1.splice(index_0, 1), updateValue({
225
+ ...value,
226
+ rows: newRows_1
227
+ }), setDialog(null);
228
+ }, $[18] = updateValue, $[19] = value, $[20] = t6) : t6 = $[20];
229
+ const removeRow = t6;
230
+ let t7;
231
+ $[21] !== confirmRemoveTable || $[22] !== removeRow || $[23] !== value ? (t7 = (index_1) => {
232
+ if (value?.rows)
233
+ return value.rows.length <= 1 ? confirmRemoveTable() : setDialog({
234
+ type: "row",
235
+ callback: () => removeRow(index_1)
236
+ });
237
+ }, $[21] = confirmRemoveTable, $[22] = removeRow, $[23] = value, $[24] = t7) : t7 = $[24];
238
+ const confirmRemoveRow = t7;
239
+ let addColumnAt, addColumns, confirmRemoveColumn;
240
+ if ($[25] !== confirmRemoveTable || $[26] !== updateValue || $[27] !== value) {
241
+ confirmRemoveColumn = (index_2) => {
242
+ if (value?.rows)
243
+ return (value.rows[0]?.cells.length ?? 0) <= 1 ? confirmRemoveTable() : setDialog({
244
+ type: "column",
245
+ callback: () => removeColumn(index_2)
246
+ });
247
+ };
248
+ let t82;
249
+ $[31] !== updateValue || $[32] !== value ? (t82 = (count_0) => {
250
+ if (!value?.rows)
251
+ return;
252
+ const newRows_2 = deepClone(value.rows);
253
+ return newRows_2.forEach((row) => {
254
+ for (let j = 0; j < count_0; j++)
255
+ row.cells.push("");
256
+ }), updateValue({
257
+ ...value,
258
+ rows: newRows_2
259
+ });
260
+ }, $[31] = updateValue, $[32] = value, $[33] = t82) : t82 = $[33], addColumns = t82;
261
+ let t92;
262
+ $[34] !== updateValue || $[35] !== value ? (t92 = (index_3) => {
263
+ if (!value?.rows)
264
+ return;
265
+ const newRows_3 = deepClone(value.rows);
266
+ return newRows_3.forEach((row_0) => {
267
+ row_0.cells.splice(index_3, 0, "");
268
+ }), updateValue({
269
+ ...value,
270
+ rows: newRows_3
271
+ });
272
+ }, $[34] = updateValue, $[35] = value, $[36] = t92) : t92 = $[36], addColumnAt = t92;
273
+ const removeColumn = (index_4) => {
274
+ if (!value?.rows)
275
+ return;
276
+ const newRows_4 = deepClone(value.rows);
277
+ newRows_4.forEach((row_1) => {
278
+ row_1.cells.splice(index_4, 1);
279
+ }), updateValue({
280
+ ...value,
281
+ rows: newRows_4
282
+ }), setDialog(null);
283
+ };
284
+ $[25] = confirmRemoveTable, $[26] = updateValue, $[27] = value, $[28] = addColumnAt, $[29] = addColumns, $[30] = confirmRemoveColumn;
285
+ } else
286
+ addColumnAt = $[28], addColumns = $[29], confirmRemoveColumn = $[30];
287
+ let t8;
288
+ $[37] !== updateValue || $[38] !== value ? (t8 = (e, rowIndex, cellIndex) => {
289
+ if (!value?.rows)
290
+ return;
291
+ const newRows_5 = deepClone(value.rows), row_2 = newRows_5[rowIndex];
292
+ if (row_2)
293
+ return row_2.cells[cellIndex] = e.currentTarget.value, updateValue({
294
+ ...value,
295
+ rows: newRows_5
296
+ });
297
+ }, $[37] = updateValue, $[38] = value, $[39] = t8) : t8 = $[39];
298
+ const updateCell = t8;
299
+ let t9;
300
+ $[40] !== dialog ? (t9 = dialog && /* @__PURE__ */ jsx(Dialog, { header: `Remove ${dialog.type}`, id: "dialog-remove", onClose: () => setDialog(null), zOffset: 1e3, children: /* @__PURE__ */ jsxs(Card, { padding: 4, children: [
301
+ /* @__PURE__ */ jsxs(Text, { children: [
302
+ "Are you sure you want to remove this ",
303
+ dialog.type,
304
+ "?"
305
+ ] }),
306
+ /* @__PURE__ */ jsx(Box, { marginTop: 4, children: /* @__PURE__ */ jsxs(Inline, { gap: 1, style: {
307
+ textAlign: "right"
308
+ }, children: [
309
+ /* @__PURE__ */ jsx(Button, { text: "Cancel", mode: "ghost", onClick: () => setDialog(null) }),
310
+ /* @__PURE__ */ jsx(Button, { text: "Confirm", tone: "critical", onClick: () => dialog.callback() })
311
+ ] }) })
312
+ ] }) }), $[40] = dialog, $[41] = t9) : t9 = $[41];
313
+ let t10;
314
+ $[42] !== addColumnAt || $[43] !== addColumns || $[44] !== addRowAt || $[45] !== addRows || $[46] !== confirmRemoveTable || $[47] !== value?.rows?.length ? (t10 = value?.rows?.length ? /* @__PURE__ */ jsx(TableMenu, { addColumns, addColumnAt, addRows, addRowAt, remove: confirmRemoveTable, placement: "left" }) : null, $[42] = addColumnAt, $[43] = addColumns, $[44] = addRowAt, $[45] = addRows, $[46] = confirmRemoveTable, $[47] = value?.rows?.length, $[48] = t10) : t10 = $[48];
315
+ let t11;
316
+ $[49] !== t10 ? (t11 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Flex, { justify: "flex-end", children: t10 }) }), $[49] = t10, $[50] = t11) : t11 = $[50];
317
+ let t12;
318
+ $[51] !== confirmRemoveColumn || $[52] !== confirmRemoveRow || $[53] !== updateCell || $[54] !== value ? (t12 = value?.rows?.length ? /* @__PURE__ */ jsx(TableInput, { rows: value.rows, removeRow: confirmRemoveRow, removeColumn: confirmRemoveColumn, updateCell }) : null, $[51] = confirmRemoveColumn, $[52] = confirmRemoveRow, $[53] = updateCell, $[54] = value, $[55] = t12) : t12 = $[55];
319
+ let t13;
320
+ $[56] !== createTable || $[57] !== value ? (t13 = !value || !value?.rows?.length ? /* @__PURE__ */ jsx(Inline, { gap: 1, children: /* @__PURE__ */ jsx(Button, { fontSize: 1, padding: 3, icon: AddIcon, text: "Create Table", tone: "primary", mode: "ghost", onClick: createTable }) }) : null, $[56] = createTable, $[57] = value, $[58] = t13) : t13 = $[58];
321
+ let t14;
322
+ return $[59] !== t11 || $[60] !== t12 || $[61] !== t13 || $[62] !== t9 ? (t14 = /* @__PURE__ */ jsxs("div", { children: [
323
+ t9,
324
+ t11,
325
+ t12,
326
+ t13
327
+ ] }), $[59] = t11, $[60] = t12, $[61] = t13, $[62] = t9, $[63] = t14) : t14 = $[63], t14;
328
+ };
329
+ function createTableComponent(rowType) {
330
+ return function(props) {
331
+ return /* @__PURE__ */ jsx(TableComponent, { ...props, rowType });
332
+ };
333
+ }
334
+ function TableIcon() {
335
+ const $ = c(1);
336
+ let t0;
337
+ return $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = /* @__PURE__ */ jsx("svg", { width: "1em", height: "1em", viewBox: "0 0 25 25", fill: "none", stroke: "currentColor", strokeWidth: "1.2", children: /* @__PURE__ */ jsx("path", { d: "M3 3h18v18H3zM21 9H3M21 15H3M12 3v18" }) }), $[0] = t0) : t0 = $[0], t0;
338
+ }
339
+ const Table = (t0) => {
340
+ const $ = c(5), {
341
+ rows
342
+ } = t0, numCols = rows[0]?.cells.length ?? 0;
343
+ let t1;
344
+ $[0] !== rows ? (t1 = rows.map(_temp), $[0] = rows, $[1] = t1) : t1 = $[1];
345
+ let t2;
346
+ return $[2] !== numCols || $[3] !== t1 ? (t2 = /* @__PURE__ */ jsx(Grid, { gridTemplateColumns: numCols, padding: 2, children: t1 }), $[2] = numCols, $[3] = t1, $[4] = t2) : t2 = $[4], t2;
347
+ }, TablePreview = (props) => {
348
+ const $ = c(10), {
349
+ schemaType,
350
+ rows: t0,
351
+ title
352
+ } = props;
353
+ let t1;
354
+ $[0] !== t0 ? (t1 = t0 === void 0 ? [] : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
355
+ const rows = t1, previewTitle = schemaType?.title ?? (typeof title == "string" ? title : "Title missing");
356
+ let t2;
357
+ $[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t2 = /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(Label, { size: 4, children: /* @__PURE__ */ jsx(TableIcon, {}) }) }), $[2] = t2) : t2 = $[2];
358
+ let t3;
359
+ $[3] !== previewTitle ? (t3 = /* @__PURE__ */ jsx(Box, { padding: 3, children: /* @__PURE__ */ jsxs(Inline, { gap: 3, children: [
360
+ t2,
361
+ /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(Text, { children: previewTitle }) })
362
+ ] }) }), $[3] = previewTitle, $[4] = t3) : t3 = $[4];
363
+ let t4;
364
+ $[5] !== rows ? (t4 = /* @__PURE__ */ jsx(Box, { padding: 2, children: rows.length === 0 ? /* @__PURE__ */ jsx(Label, { muted: !0, children: "Empty Table" }) : /* @__PURE__ */ jsx(Table, { rows }) }), $[5] = rows, $[6] = t4) : t4 = $[6];
365
+ let t5;
366
+ return $[7] !== t3 || $[8] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Fragment, { children: [
367
+ t3,
368
+ t4
369
+ ] }), $[7] = t3, $[8] = t4, $[9] = t5) : t5 = $[9], t5;
370
+ };
371
+ function _temp(row) {
372
+ return row.cells.map((cell, i) => /* @__PURE__ */ jsx(Card, { padding: 2, style: {
373
+ outline: "1px solid #DFE2E9"
374
+ }, children: /* @__PURE__ */ jsx(Text, { style: {
375
+ textOverflow: "elipsis"
376
+ }, children: cell }) }, row._key + i));
377
+ }
378
+ const table = definePlugin((config) => {
379
+ const tableRowSchema = defineType({
380
+ title: "Table Row",
381
+ name: config?.rowType || "tableRow",
382
+ type: "object",
383
+ fields: [{
384
+ name: "cells",
385
+ type: "array",
386
+ of: [{
387
+ type: "string"
388
+ }]
389
+ }]
390
+ }), tableSchema = defineType({
391
+ title: "Table",
392
+ name: "table",
393
+ type: "object",
394
+ fields: [{
395
+ name: "rows",
396
+ type: "array",
397
+ of: [{
398
+ type: tableRowSchema.name
399
+ }]
400
+ }],
401
+ components: {
402
+ input: createTableComponent(tableRowSchema.name),
403
+ preview: TablePreview
404
+ },
405
+ preview: {
406
+ select: {
407
+ rows: "rows",
408
+ title: "title"
409
+ },
410
+ prepare: ({
411
+ title,
412
+ rows = []
413
+ }) => ({
414
+ title,
415
+ rows
416
+ })
417
+ }
418
+ });
419
+ return {
420
+ name: "table",
421
+ schema: {
422
+ types: [tableRowSchema, tableSchema]
423
+ }
424
+ };
425
+ });
426
+ export {
427
+ TableComponent,
428
+ TablePreview,
429
+ table
430
+ };
431
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/components/TableInput.tsx","../src/components/TableMenu.tsx","../src/components/TableComponent.tsx","../src/components/TableIcon.tsx","../src/components/TablePreview.tsx","../src/index.ts"],"sourcesContent":["import {RemoveIcon} from '@sanity/icons'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport type {ChangeEvent} from 'react'\n\nimport type {TableRow} from './TableComponent'\n\ninterface TableInputProps {\n rows: TableRow[]\n updateCell: (e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => void\n removeRow: (index: number) => void\n removeColumn: (index: number) => void\n}\n\nexport const TableInput = (props: TableInputProps) => {\n const {rows, updateCell, removeRow, removeColumn} = props\n\n return (\n <table style={{width: '100%'}}>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={row._key}>\n {row.cells.map((cell, cellIndex) => (\n // Cells are plain strings; the cell position is the only stable identity\n // eslint-disable-next-line react/no-array-index-key\n <td key={`${row._key}-${cellIndex}`}>\n <TextInput\n fontSize={1}\n padding={3}\n value={cell}\n onChange={(e) => updateCell(e, rowIndex, cellIndex)}\n />\n </td>\n ))}\n <td key={`${row._key}-remove`}>\n <Box marginLeft={1} style={{textAlign: 'center'}}>\n <Button\n icon={RemoveIcon}\n padding={2}\n onClick={() => removeRow(rowIndex)}\n mode=\"bleed\"\n />\n </Box>\n </td>\n </tr>\n ))}\n <tr>\n {(rows[0]?.cells || []).map((_, i) => (\n // Cells are plain strings; the column position is the only stable identity\n // eslint-disable-next-line react/no-array-index-key\n <td key={i}>\n <Box marginTop={1} style={{textAlign: 'center'}}>\n <Button\n icon={RemoveIcon}\n padding={2}\n onClick={() => removeColumn(i)}\n mode=\"bleed\"\n />\n </Box>\n </td>\n ))}\n </tr>\n </tbody>\n </table>\n )\n}\n","import {AddIcon, ControlsIcon, WarningOutlineIcon} from '@sanity/icons'\nimport {\n Box,\n Button,\n Card,\n Dialog,\n Inline,\n Menu,\n MenuButton,\n MenuDivider,\n MenuItem,\n type Placement,\n TextInput,\n} from '@sanity/ui'\nimport {type ChangeEventHandler, useState} from 'react'\n\ninterface TableMenuProps {\n addColumns: (count: number) => void\n addColumnAt: (index: number) => void\n addRows: (count: number) => void\n addRowAt: (index: number) => void\n remove: () => void\n placement: Placement\n}\n\nexport const TableMenu = (props: TableMenuProps) => {\n const {remove: handleRemove} = props\n const [dialog, setDialog] = useState<{\n type: string\n callback: (count: number) => void\n } | null>(null)\n\n const [count, setCount] = useState<string | undefined>('')\n\n const updateCount: ChangeEventHandler<HTMLInputElement> = (e) => {\n setCount(e.currentTarget.value)\n }\n\n const addRows = () => {\n setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n }\n\n const addRowAt = () => {\n setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n }\n\n const addColumns = () => {\n setDialog({\n type: 'columns',\n callback: (c) => props.addColumns(c),\n })\n }\n\n const addColumnsAt = () => {\n setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n }\n\n const onConfirm = () => {\n const parsedCount = parseInt(count ?? '0', 10)\n\n if (parsedCount < 100) {\n setDialog(null)\n dialog?.callback(parsedCount)\n setCount(undefined)\n }\n }\n\n return (\n <>\n {dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id=\"dialog-add\"\n onClose={() => setDialog(null)}\n zOffset={1000}\n >\n <Card padding={4}>\n <TextInput\n style={{textAlign: 'left'}}\n fontSize={2}\n padding={3}\n type=\"number\"\n value={count}\n onChange={updateCount}\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n <Button text=\"Confirm\" tone=\"critical\" onClick={onConfirm} />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )}\n <MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id=\"menu-button-example\"\n menu={\n <Menu>\n <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />\n <MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />\n <MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />\n <MenuItem\n icon={AddIcon}\n fontSize={1}\n text=\"Add Column At Index\"\n onClick={addColumnsAt}\n />\n <MenuDivider />\n <MenuItem\n icon={WarningOutlineIcon}\n fontSize={1}\n text=\"Remove\"\n tone=\"critical\"\n onClick={handleRemove}\n />\n </Menu>\n }\n popover={{placement: props.placement}}\n />\n </>\n )\n}\n","import {AddIcon} from '@sanity/icons'\nimport {Box, Button, Card, Dialog, Flex, Inline, Text} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {type ChangeEvent, useState} from 'react'\nimport {type ObjectInputProps, set, unset} from 'sanity'\n\nimport {TableInput} from './TableInput'\nimport {TableMenu} from './TableMenu'\n\nconst deepClone: <T>(data: T) => T =\n globalThis.structuredClone ?? ((data) => JSON.parse(JSON.stringify(data)))\n\nexport interface TableValue {\n _type?: 'table'\n rows?: TableRow[]\n}\n\nexport type TableProps = ObjectInputProps<TableValue>\n\nexport type TableRow = {\n _type: string\n _key: string\n cells: string[]\n}\n\n// TODO refactor deeplone stuff to use proper patches\n// TODO use callback all the things\n\nexport const TableComponent = (props: TableProps & {rowType?: string}) => {\n const {rowType = 'tableRow', value, onChange} = props\n const [dialog, setDialog] = useState<{\n type: string\n callback: () => void\n } | null>(null)\n\n const updateValue = (v?: Omit<TableValue, '_type'>) => {\n return onChange(set(v))\n }\n\n const resetValue = () => {\n return onChange(unset())\n }\n\n const createTable = () => {\n const newValue: Omit<TableValue, '_type'> = {\n rows: [\n {\n _type: rowType,\n _key: uuid(),\n cells: ['', ''],\n },\n {\n _type: rowType,\n _key: uuid(),\n cells: ['', ''],\n },\n ],\n }\n return updateValue({...value, ...newValue})\n }\n\n const confirmRemoveTable = () => {\n setDialog({type: 'table', callback: removeTable})\n }\n\n const removeTable = () => {\n resetValue()\n setDialog(null)\n }\n\n const addRows = (count = 1) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n // Calculate the column count from the first row\n const columnCount = value.rows[0]?.cells.length ?? 0\n for (let i = 0; i < count; i++) {\n // Add as many cells as we have columns\n newRows.push({\n _type: rowType,\n _key: uuid(),\n cells: Array(columnCount).fill(''),\n })\n }\n return updateValue({...value, rows: newRows})\n }\n\n const addRowAt = (index = 0) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n // Calculate the column count from the first row\n const columnCount = value.rows[0]?.cells.length ?? 0\n\n newRows.splice(index, 0, {\n _type: rowType,\n _key: uuid(),\n cells: Array(columnCount).fill(''),\n })\n\n return updateValue({...value, rows: newRows})\n }\n\n const removeRow = (index: number) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n newRows.splice(index, 1)\n updateValue({...value, rows: newRows})\n setDialog(null)\n }\n\n const confirmRemoveRow = (index: number) => {\n if (!value?.rows) {\n return\n }\n if (value.rows.length <= 1) return confirmRemoveTable()\n return setDialog({type: 'row', callback: () => removeRow(index)})\n }\n\n const confirmRemoveColumn = (index: number) => {\n if (!value?.rows) {\n return\n }\n if ((value.rows[0]?.cells.length ?? 0) <= 1) return confirmRemoveTable()\n return setDialog({type: 'column', callback: () => removeColumn(index)})\n }\n\n const addColumns = (count: number) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n // Add a cell to each of the rows\n newRows.forEach((row) => {\n for (let j = 0; j < count; j++) {\n row.cells.push('')\n }\n })\n return updateValue({...value, rows: newRows})\n }\n\n const addColumnAt = (index: number) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n\n newRows.forEach((row) => {\n row.cells.splice(index, 0, '')\n })\n\n return updateValue({...value, rows: newRows})\n }\n\n const removeColumn = (index: number) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n newRows.forEach((row) => {\n row.cells.splice(index, 1)\n })\n updateValue({...value, rows: newRows})\n setDialog(null)\n }\n\n const updateCell = (e: ChangeEvent<HTMLInputElement>, rowIndex: number, cellIndex: number) => {\n if (!value?.rows) {\n return\n }\n const newRows = deepClone(value.rows)\n const row = newRows[rowIndex]\n if (!row) {\n return\n }\n row.cells[cellIndex] = e.currentTarget.value\n return updateValue({...value, rows: newRows})\n }\n\n return (\n <div>\n {dialog && (\n <Dialog\n header={`Remove ${dialog.type}`}\n id=\"dialog-remove\"\n onClose={() => setDialog(null)}\n zOffset={1000}\n >\n <Card padding={4}>\n <Text>Are you sure you want to remove this {dialog.type}?</Text>\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button text=\"Cancel\" mode=\"ghost\" onClick={() => setDialog(null)} />\n <Button text=\"Confirm\" tone=\"critical\" onClick={() => dialog.callback()} />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )}\n <Box>\n <Flex justify=\"flex-end\">\n {value?.rows?.length ? (\n <TableMenu\n addColumns={addColumns}\n addColumnAt={addColumnAt}\n addRows={addRows}\n addRowAt={addRowAt}\n remove={confirmRemoveTable}\n placement=\"left\"\n />\n ) : null}\n </Flex>\n </Box>\n {value?.rows?.length ? (\n <TableInput\n rows={value.rows}\n removeRow={confirmRemoveRow}\n removeColumn={confirmRemoveColumn}\n updateCell={updateCell}\n />\n ) : null}\n {!value || !value?.rows?.length ? (\n <Inline gap={1}>\n <Button\n fontSize={1}\n padding={3}\n icon={AddIcon}\n text=\"Create Table\"\n tone=\"primary\"\n mode=\"ghost\"\n onClick={createTable}\n />\n </Inline>\n ) : null}\n </div>\n )\n}\n\nexport function createTableComponent(rowType: string) {\n return function Table(props: TableProps) {\n return <TableComponent {...props} rowType={rowType} />\n }\n}\n","export function TableIcon() {\n return (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n >\n <path d=\"M3 3h18v18H3zM21 9H3M21 15H3M12 3v18\" />\n </svg>\n )\n}\n","import {Box, Card, Grid, Inline, Label, Text} from '@sanity/ui'\nimport type {PreviewProps} from 'sanity'\n\nimport type {TableRow} from './TableComponent'\nimport {TableIcon} from './TableIcon'\n\ninterface TablePreviewProps extends PreviewProps {\n rows?: TableRow[]\n}\n\nconst Table = ({rows}: {rows: TableRow[]}) => {\n const numCols = rows[0]?.cells.length ?? 0\n\n return (\n <Grid gridTemplateColumns={numCols} padding={2}>\n {rows.map((row) =>\n row.cells.map((cell, i) => (\n // Cells are plain strings; the cell position is the only stable identity\n // eslint-disable-next-line react/no-array-index-key\n <Card key={row._key + i} padding={2} style={{outline: '1px solid #DFE2E9'}}>\n <Text style={{textOverflow: 'elipsis'}}>{cell}</Text>\n </Card>\n )),\n )}\n </Grid>\n )\n}\n\nexport const TablePreview = (props: TablePreviewProps) => {\n const {schemaType, rows = [], title} = props\n const previewTitle = schemaType?.title ?? (typeof title === 'string' ? title : 'Title missing')\n\n return (\n <>\n <Box padding={3}>\n <Inline gap={3}>\n <Card>\n <Label size={4}>\n <TableIcon />\n </Label>\n </Card>\n <Card>\n <Text>{previewTitle}</Text>\n </Card>\n </Inline>\n </Box>\n <Box padding={2}>\n {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n </Box>\n </>\n )\n}\n","import {definePlugin, defineType} from 'sanity'\n\nimport {createTableComponent, TableComponent} from './components/TableComponent'\nimport {TablePreview} from './components/TablePreview'\nexport type {TableProps, TableRow, TableValue} from './components/TableComponent'\n\nexport {TableComponent, TablePreview}\n\nexport interface TableConfig {\n rowType?: string\n}\n\nexport const table = definePlugin<TableConfig | void>((config) => {\n const tableRowSchema = defineType({\n title: 'Table Row',\n name: config?.rowType || 'tableRow',\n type: 'object',\n fields: [\n {\n name: 'cells',\n type: 'array',\n of: [{type: 'string'}],\n },\n ],\n })\n\n const tableSchema = defineType({\n title: 'Table',\n name: 'table',\n type: 'object',\n fields: [\n {\n name: 'rows',\n type: 'array',\n of: [\n {\n type: tableRowSchema.name,\n },\n ],\n },\n ],\n components: {\n input: createTableComponent(tableRowSchema.name),\n preview: TablePreview,\n },\n preview: {\n select: {\n rows: 'rows',\n title: 'title',\n },\n prepare: ({title, rows = []}) => ({\n title,\n rows,\n }),\n },\n })\n\n return {\n name: 'table',\n schema: {\n types: [tableRowSchema, tableSchema],\n },\n }\n})\n"],"names":["TableInput","props","$","_c","rows","updateCell","removeRow","removeColumn","t0","for","width","t1","t2","row","rowIndex","cells","map","cell","cellIndex","e","_key","textAlign","RemoveIcon","t3","t4","_","i","t5","TableMenu","remove","handleRemove","dialog","setDialog","useState","count","setCount","Symbol","currentTarget","value","updateCount","type","callback","c","addRows","index","addRowAt","c_0","addColumns","index_0","addColumnAt","addColumnsAt","parsedCount","parseInt","undefined","onConfirm","t6","t7","ControlsIcon","t8","AddIcon","t9","t10","t11","t12","t13","WarningOutlineIcon","t14","t15","placement","t16","t17","deepClone","globalThis","structuredClone","data","JSON","parse","stringify","TableComponent","rowType","onChange","v","set","updateValue","unset","resetValue","newValue","_type","uuid","createTable","confirmRemoveTable","removeTable","newRows","columnCount","length","push","Array","fill","newRows_0","columnCount_0","splice","newRows_1","index_1","confirmRemoveRow","confirmRemoveColumn","index_2","count_0","newRows_2","forEach","j","index_3","newRows_3","row_0","index_4","newRows_4","row_1","newRows_5","row_2","createTableComponent","TableIcon","Table","numCols","_temp","TablePreview","schemaType","title","previewTitle","outline","textOverflow","table","definePlugin","config","tableRowSchema","defineType","name","fields","of","tableSchema","components","input","preview","select","prepare","schema","types"],"mappings":"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"}