@sanity/table 2.0.1 → 3.1.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 +4 -4
- package/README.md +6 -24
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +435 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -72
- package/lib/index.cjs +0 -432
- package/lib/index.cjs.map +0 -1
- package/lib/index.d.cts +0 -40
- package/lib/index.d.ts +0 -40
- package/lib/index.js +0 -437
- package/lib/index.js.map +0 -1
- package/sanity.json +0 -8
- package/src/components/TableComponent.tsx +0 -260
- package/src/components/TableIcon.tsx +0 -14
- package/src/components/TableInput.tsx +0 -78
- package/src/components/TableMenu.tsx +0 -144
- package/src/components/TablePreview.tsx +0 -58
- package/src/index.ts +0 -73
- package/v2-incompatible.js +0 -11
package/LICENSE
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
4
|
-
Copyright (c)
|
|
5
|
-
Copyright (c)
|
|
6
|
-
Copyright (c)
|
|
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
|
-
|
|
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
|

|
|
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
|
|
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 {
|
|
40
|
+
import {defineConfig} from 'sanity'
|
|
44
41
|
|
|
45
|
-
import {
|
|
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.
|
package/dist/index.d.ts
ADDED
|
@@ -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,435 @@
|
|
|
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__ */ jsxs(Inline, { gap: 1, children: [
|
|
315
|
+
/* @__PURE__ */ jsx(Button, { fontSize: 1, padding: 2, icon: AddIcon, text: "Add row", mode: "ghost", onClick: () => addRows(1) }),
|
|
316
|
+
/* @__PURE__ */ jsx(Button, { fontSize: 1, padding: 2, icon: AddIcon, text: "Add column", mode: "ghost", onClick: () => addColumns(1) }),
|
|
317
|
+
/* @__PURE__ */ jsx(TableMenu, { addColumns, addColumnAt, addRows, addRowAt, remove: confirmRemoveTable, placement: "left" })
|
|
318
|
+
] }) : null, $[42] = addColumnAt, $[43] = addColumns, $[44] = addRowAt, $[45] = addRows, $[46] = confirmRemoveTable, $[47] = value?.rows?.length, $[48] = t10) : t10 = $[48];
|
|
319
|
+
let t11;
|
|
320
|
+
$[49] !== t10 ? (t11 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Flex, { justify: "flex-end", children: t10 }) }), $[49] = t10, $[50] = t11) : t11 = $[50];
|
|
321
|
+
let t12;
|
|
322
|
+
$[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];
|
|
323
|
+
let t13;
|
|
324
|
+
$[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];
|
|
325
|
+
let t14;
|
|
326
|
+
return $[59] !== t11 || $[60] !== t12 || $[61] !== t13 || $[62] !== t9 ? (t14 = /* @__PURE__ */ jsxs("div", { children: [
|
|
327
|
+
t9,
|
|
328
|
+
t11,
|
|
329
|
+
t12,
|
|
330
|
+
t13
|
|
331
|
+
] }), $[59] = t11, $[60] = t12, $[61] = t13, $[62] = t9, $[63] = t14) : t14 = $[63], t14;
|
|
332
|
+
};
|
|
333
|
+
function createTableComponent(rowType) {
|
|
334
|
+
return function(props) {
|
|
335
|
+
return /* @__PURE__ */ jsx(TableComponent, { ...props, rowType });
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function TableIcon() {
|
|
339
|
+
const $ = c(1);
|
|
340
|
+
let t0;
|
|
341
|
+
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;
|
|
342
|
+
}
|
|
343
|
+
const Table = (t0) => {
|
|
344
|
+
const $ = c(5), {
|
|
345
|
+
rows
|
|
346
|
+
} = t0, numCols = rows[0]?.cells.length ?? 0;
|
|
347
|
+
let t1;
|
|
348
|
+
$[0] !== rows ? (t1 = rows.map(_temp), $[0] = rows, $[1] = t1) : t1 = $[1];
|
|
349
|
+
let t2;
|
|
350
|
+
return $[2] !== numCols || $[3] !== t1 ? (t2 = /* @__PURE__ */ jsx(Grid, { gridTemplateColumns: numCols, padding: 2, children: t1 }), $[2] = numCols, $[3] = t1, $[4] = t2) : t2 = $[4], t2;
|
|
351
|
+
}, TablePreview = (props) => {
|
|
352
|
+
const $ = c(10), {
|
|
353
|
+
schemaType,
|
|
354
|
+
rows: t0,
|
|
355
|
+
title
|
|
356
|
+
} = props;
|
|
357
|
+
let t1;
|
|
358
|
+
$[0] !== t0 ? (t1 = t0 === void 0 ? [] : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
|
|
359
|
+
const rows = t1, previewTitle = schemaType?.title ?? (typeof title == "string" ? title : "Title missing");
|
|
360
|
+
let t2;
|
|
361
|
+
$[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];
|
|
362
|
+
let t3;
|
|
363
|
+
$[3] !== previewTitle ? (t3 = /* @__PURE__ */ jsx(Box, { padding: 3, children: /* @__PURE__ */ jsxs(Inline, { gap: 3, children: [
|
|
364
|
+
t2,
|
|
365
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(Text, { children: previewTitle }) })
|
|
366
|
+
] }) }), $[3] = previewTitle, $[4] = t3) : t3 = $[4];
|
|
367
|
+
let t4;
|
|
368
|
+
$[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];
|
|
369
|
+
let t5;
|
|
370
|
+
return $[7] !== t3 || $[8] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
371
|
+
t3,
|
|
372
|
+
t4
|
|
373
|
+
] }), $[7] = t3, $[8] = t4, $[9] = t5) : t5 = $[9], t5;
|
|
374
|
+
};
|
|
375
|
+
function _temp(row) {
|
|
376
|
+
return row.cells.map((cell, i) => /* @__PURE__ */ jsx(Card, { padding: 2, style: {
|
|
377
|
+
outline: "1px solid #DFE2E9"
|
|
378
|
+
}, children: /* @__PURE__ */ jsx(Text, { style: {
|
|
379
|
+
textOverflow: "elipsis"
|
|
380
|
+
}, children: cell }) }, row._key + i));
|
|
381
|
+
}
|
|
382
|
+
const table = definePlugin((config) => {
|
|
383
|
+
const tableRowSchema = defineType({
|
|
384
|
+
title: "Table Row",
|
|
385
|
+
name: config?.rowType || "tableRow",
|
|
386
|
+
type: "object",
|
|
387
|
+
fields: [{
|
|
388
|
+
name: "cells",
|
|
389
|
+
type: "array",
|
|
390
|
+
of: [{
|
|
391
|
+
type: "string"
|
|
392
|
+
}]
|
|
393
|
+
}]
|
|
394
|
+
}), tableSchema = defineType({
|
|
395
|
+
title: "Table",
|
|
396
|
+
name: "table",
|
|
397
|
+
type: "object",
|
|
398
|
+
fields: [{
|
|
399
|
+
name: "rows",
|
|
400
|
+
type: "array",
|
|
401
|
+
of: [{
|
|
402
|
+
type: tableRowSchema.name
|
|
403
|
+
}]
|
|
404
|
+
}],
|
|
405
|
+
components: {
|
|
406
|
+
input: createTableComponent(tableRowSchema.name),
|
|
407
|
+
preview: TablePreview
|
|
408
|
+
},
|
|
409
|
+
preview: {
|
|
410
|
+
select: {
|
|
411
|
+
rows: "rows",
|
|
412
|
+
title: "title"
|
|
413
|
+
},
|
|
414
|
+
prepare: ({
|
|
415
|
+
title,
|
|
416
|
+
rows = []
|
|
417
|
+
}) => ({
|
|
418
|
+
title,
|
|
419
|
+
rows
|
|
420
|
+
})
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
return {
|
|
424
|
+
name: "table",
|
|
425
|
+
schema: {
|
|
426
|
+
types: [tableRowSchema, tableSchema]
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
});
|
|
430
|
+
export {
|
|
431
|
+
TableComponent,
|
|
432
|
+
TablePreview,
|
|
433
|
+
table
|
|
434
|
+
};
|
|
435
|
+
//# 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 <Inline gap={1}>\n <Button\n fontSize={1}\n padding={2}\n icon={AddIcon}\n text=\"Add row\"\n mode=\"ghost\"\n onClick={() => addRows(1)}\n />\n <Button\n fontSize={1}\n padding={2}\n icon={AddIcon}\n text=\"Add column\"\n mode=\"ghost\"\n onClick={() => addColumns(1)}\n />\n <TableMenu\n addColumns={addColumns}\n addColumnAt={addColumnAt}\n addRows={addRows}\n addRowAt={addRowAt}\n remove={confirmRemoveTable}\n placement=\"left\"\n />\n </Inline>\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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"}
|