@sanity/table
3.1.163.1.17
dist/index.js.map~
dist/index.js.mapModified+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["{width: '100%'}","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 ))","(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 )","rows[0]?.cells || []","cells","(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 ))","(_, 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 )","<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>","<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>","(e) => {\n setCount(e.currentTarget.value)\n }","() => {\n setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n setCount('') // ensure input starts controlled when dialog opens\n }","() => {\n setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n setCount('')\n }","() => {\n setDialog({\n type: 'columns',\n callback: (c) => props.addColumns(c),\n })\n setCount('')\n }","c","() => {\n setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n setCount('')\n }","index","Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100","() => {\n if (!isValidCount) {\n return\n }\n setDialog(null)\n dialog?.callback(parsedCount)\n setCount('')\n }","dialog?.callback","dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id={`${id}-dialog-add`}\n onClose={() => {\n setDialog(null)\n setCount('')\n }}\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 customValidity={\n count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n }\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button\n text=\"Cancel\"\n mode=\"ghost\"\n onClick={() => {\n setDialog(null)\n setCount('')\n }}\n />\n <Button\n text=\"Confirm\"\n tone=\"critical\"\n onClick={onConfirm}\n disabled={!isValidCount}\n />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )","<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />","<MenuItem\n icon={AddIcon}\n fontSize={1}\n text=\"Add Column At Index\"\n onClick={addColumnsAt}\n />","<MenuDivider />","<MenuItem\n icon={WarningOutlineIcon}\n fontSize={1}\n text=\"Remove\"\n tone=\"critical\"\n onClick={handleRemove}\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>","{placement: props.placement}","placement","<MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id={`${id}-menu-button`}\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 />","`${id}-menu-button`","<>\n {dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id={`${id}-dialog-add`}\n onClose={() => {\n setDialog(null)\n setCount('')\n }}\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 customValidity={\n count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n }\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button\n text=\"Cancel\"\n mode=\"ghost\"\n onClick={() => {\n setDialog(null)\n setCount('')\n }}\n />\n <Button\n text=\"Confirm\"\n tone=\"critical\"\n onClick={onConfirm}\n disabled={!isValidCount}\n />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )}\n <MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id={`${id}-menu-button`}\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 </>","rowType = 'tableRow'","(v?: Omit<TableValue, '_type'>) => {\n return onChange(set(v))\n }","() => {\n return onChange(unset())\n }","() => {\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 }","(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 }","value?.rows","count = 1","(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 }","index = 0","newRows","columnCount","(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 }","index","(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 }","(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 }","count","(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 }","(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 }","row","dialog && (\n <Dialog\n header={`Remove ${dialog.type}`}\n id={`${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 )","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 id={id}\n addColumns={addColumns}\n addColumnAt={addColumnAt}\n addRows={addRows}\n addRowAt={addRowAt}\n remove={confirmRemoveTable}\n placement=\"left\"\n />\n </Inline>\n ) : null","length","<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 id={id}\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>","value?.rows?.length ? (\n <TableInput\n rows={value.rows}\n removeRow={confirmRemoveRow}\n removeColumn={confirmRemoveColumn}\n updateCell={updateCell}\n />\n ) : null","value?.rows?.length","!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","<div>\n {dialog && (\n <Dialog\n header={`Remove ${dialog.type}`}\n id={`${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 id={id}\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>","<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>","{rows}: {rows: TableRow[]}","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 textOverflow=\"ellipsis\">{cell}</Text>\n </Card>\n )),\n )","(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 textOverflow=\"ellipsis\">{cell}</Text>\n </Card>\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 textOverflow=\"ellipsis\">{cell}</Text>\n </Card>\n )),\n )}\n </Grid>","rows = []","<Card>\n <Label size={4}>\n <TableIcon />\n </Label>\n </Card>","<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>","<Box padding={2}>\n {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n </Box>","rows.length","<>\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 </>"],"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/Remove'\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} from '@sanity/icons/Add'\nimport {ControlsIcon} from '@sanity/icons/Controls'\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Card, Dialog, Inline, type Placement, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEventHandler, useState} from 'react'\n\ninterface TableMenuProps {\n id: string\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): React.JSX.Element => {\n const {id, remove: handleRemove} = props\n const [dialog, setDialog] = useState<{\n type: string\n callback: (count: number) => void\n } | null>(null)\n\n // Keep `count` always a string so the TextInput is controlled for the component lifetime.\n const [count, setCount] = useState<string>('')\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 setCount('') // ensure input starts controlled when dialog opens\n }\n\n const addRowAt = () => {\n setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n setCount('')\n }\n\n const addColumns = () => {\n setDialog({\n type: 'columns',\n callback: (c) => props.addColumns(c),\n })\n setCount('')\n }\n\n const addColumnsAt = () => {\n setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n setCount('')\n }\n\n // The dialog is reused for \"add N rows/columns\" (a count) and \"add at index\"\n // (a position where 0 is valid), so allow 0 but reject NaN/negative/too-large.\n const parsedCount = Number.parseInt(count, 10)\n const isValidCount = Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100\n\n const onConfirm = () => {\n if (!isValidCount) {\n return\n }\n setDialog(null)\n dialog?.callback(parsedCount)\n setCount('')\n }\n\n return (\n <>\n {dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id={`${id}-dialog-add`}\n onClose={() => {\n setDialog(null)\n setCount('')\n }}\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 customValidity={\n count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n }\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button\n text=\"Cancel\"\n mode=\"ghost\"\n onClick={() => {\n setDialog(null)\n setCount('')\n }}\n />\n <Button\n text=\"Confirm\"\n tone=\"critical\"\n onClick={onConfirm}\n disabled={!isValidCount}\n />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )}\n <MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id={`${id}-menu-button`}\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/Add'\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 deepClone stuff to use proper patches\n// TODO use callback all the things\n\nexport const TableComponent = (props: TableProps & {rowType?: string}) => {\n const {id, 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={`${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 id={id}\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 textOverflow=\"ellipsis\">{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 '@sanity/ui/styles.css'\nimport {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"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{width: '100%'}","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 ))","(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 )","rows[0]?.cells || []","cells","(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 ))","(_, 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 )","<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>","<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>","_c","(e) => {\n setCount(e.currentTarget.value)\n }","() => {\n setDialog({type: 'rows', callback: (c) => props.addRows(c)})\n setCount('') // ensure input starts controlled when dialog opens\n }","() => {\n setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n setCount('')\n }","() => {\n setDialog({\n type: 'columns',\n callback: (c) => props.addColumns(c),\n })\n setCount('')\n }","c","() => {\n setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n setCount('')\n }","index","Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100","() => {\n if (!isValidCount) {\n return\n }\n setDialog(null)\n dialog?.callback(parsedCount)\n setCount('')\n }","dialog?.callback","dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id={`${id}-dialog-add`}\n onClose={() => {\n setDialog(null)\n setCount('')\n }}\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 customValidity={\n count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n }\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button\n text=\"Cancel\"\n mode=\"ghost\"\n onClick={() => {\n setDialog(null)\n setCount('')\n }}\n />\n <Button\n text=\"Confirm\"\n tone=\"critical\"\n onClick={onConfirm}\n disabled={!isValidCount}\n />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )","<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row(s)\" onClick={addRows} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Row At Index\" onClick={addRowAt} />","<MenuItem icon={AddIcon} fontSize={1} text=\"Add Column(s)\" onClick={addColumns} />","<MenuItem\n icon={AddIcon}\n fontSize={1}\n text=\"Add Column At Index\"\n onClick={addColumnsAt}\n />","<MenuDivider />","<MenuItem\n icon={WarningOutlineIcon}\n fontSize={1}\n text=\"Remove\"\n tone=\"critical\"\n onClick={handleRemove}\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>","{placement: props.placement}","placement","<MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id={`${id}-menu-button`}\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 />","`${id}-menu-button`","<>\n {dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id={`${id}-dialog-add`}\n onClose={() => {\n setDialog(null)\n setCount('')\n }}\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 customValidity={\n count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n }\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button\n text=\"Cancel\"\n mode=\"ghost\"\n onClick={() => {\n setDialog(null)\n setCount('')\n }}\n />\n <Button\n text=\"Confirm\"\n tone=\"critical\"\n onClick={onConfirm}\n disabled={!isValidCount}\n />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )}\n <MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id={`${id}-menu-button`}\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 </>","_c","_Fragment","rowType = 'tableRow'","(v?: Omit<TableValue, '_type'>) => {\n return onChange(set(v))\n }","() => {\n return onChange(unset())\n }","() => {\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 }","(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 }","value?.rows","count = 1","(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 }","index = 0","newRows","columnCount","(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 }","index","(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 }","(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 }","count","(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 }","(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 }","row","dialog && (\n <Dialog\n header={`Remove ${dialog.type}`}\n id={`${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 )","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 id={id}\n addColumns={addColumns}\n addColumnAt={addColumnAt}\n addRows={addRows}\n addRowAt={addRowAt}\n remove={confirmRemoveTable}\n placement=\"left\"\n />\n </Inline>\n ) : null","length","<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 id={id}\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>","value?.rows?.length ? (\n <TableInput\n rows={value.rows}\n removeRow={confirmRemoveRow}\n removeColumn={confirmRemoveColumn}\n updateCell={updateCell}\n />\n ) : null","value?.rows?.length","!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","<div>\n {dialog && (\n <Dialog\n header={`Remove ${dialog.type}`}\n id={`${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 id={id}\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>","_c","<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>","_c","{rows}: {rows: TableRow[]}","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 textOverflow=\"ellipsis\">{cell}</Text>\n </Card>\n )),\n )","(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 textOverflow=\"ellipsis\">{cell}</Text>\n </Card>\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 textOverflow=\"ellipsis\">{cell}</Text>\n </Card>\n )),\n )}\n </Grid>","rows = []","<Card>\n <Label size={4}>\n <TableIcon />\n </Label>\n </Card>","<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>","<Box padding={2}>\n {rows.length === 0 ? <Label muted>Empty Table</Label> : <Table rows={rows} />}\n </Box>","rows.length","<>\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 </>","_c","_Fragment"],"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/Remove'\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} from '@sanity/icons/Add'\nimport {ControlsIcon} from '@sanity/icons/Controls'\nimport {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Card, Dialog, Inline, type Placement, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEventHandler, useState} from 'react'\n\ninterface TableMenuProps {\n id: string\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): React.JSX.Element => {\n const {id, remove: handleRemove} = props\n const [dialog, setDialog] = useState<{\n type: string\n callback: (count: number) => void\n } | null>(null)\n\n // Keep `count` always a string so the TextInput is controlled for the component lifetime.\n const [count, setCount] = useState<string>('')\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 setCount('') // ensure input starts controlled when dialog opens\n }\n\n const addRowAt = () => {\n setDialog({type: 'rows', callback: (index) => props.addRowAt(index)})\n setCount('')\n }\n\n const addColumns = () => {\n setDialog({\n type: 'columns',\n callback: (c) => props.addColumns(c),\n })\n setCount('')\n }\n\n const addColumnsAt = () => {\n setDialog({type: 'columns', callback: (index) => props.addColumnAt(index)})\n setCount('')\n }\n\n // The dialog is reused for \"add N rows/columns\" (a count) and \"add at index\"\n // (a position where 0 is valid), so allow 0 but reject NaN/negative/too-large.\n const parsedCount = Number.parseInt(count, 10)\n const isValidCount = Number.isInteger(parsedCount) && parsedCount >= 0 && parsedCount < 100\n\n const onConfirm = () => {\n if (!isValidCount) {\n return\n }\n setDialog(null)\n dialog?.callback(parsedCount)\n setCount('')\n }\n\n return (\n <>\n {dialog && (\n <Dialog\n header={`Add ${dialog.type}`}\n id={`${id}-dialog-add`}\n onClose={() => {\n setDialog(null)\n setCount('')\n }}\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 customValidity={\n count !== '' && !isValidCount ? 'Enter a whole number from 0 to 99' : undefined\n }\n />\n <Box marginTop={4}>\n <Inline gap={1} style={{textAlign: 'right'}}>\n <Button\n text=\"Cancel\"\n mode=\"ghost\"\n onClick={() => {\n setDialog(null)\n setCount('')\n }}\n />\n <Button\n text=\"Confirm\"\n tone=\"critical\"\n onClick={onConfirm}\n disabled={!isValidCount}\n />\n </Inline>\n </Box>\n </Card>\n </Dialog>\n )}\n <MenuButton\n button={<Button icon={ControlsIcon} fontSize={1} padding={2} mode=\"ghost\" />}\n id={`${id}-menu-button`}\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/Add'\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 deepClone stuff to use proper patches\n// TODO use callback all the things\n\nexport const TableComponent = (props: TableProps & {rowType?: string}) => {\n const {id, 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={`${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 id={id}\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 textOverflow=\"ellipsis\">{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 '@sanity/ui/styles.css'\nimport {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"],"mappings":"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"}
\ No newline at end of file