diff --git a/packages/web/src/celldata/CellDataView.js b/packages/web/src/celldata/CellDataView.js new file mode 100644 index 000000000..7884907bc --- /dev/null +++ b/packages/web/src/celldata/CellDataView.js @@ -0,0 +1,68 @@ +import React from 'react'; +import { SelectField } from '../utility/inputs'; +import ErrorInfo from '../widgets/ErrorInfo'; +import styled from 'styled-components'; +import TextCellView from './TextCellView'; + +const Toolbar = styled.div` + display: flex; + background: #ccc; + align-items: center; +`; + +const MainWrapper = styled.div` + display: flex; + flex: 1; + flex-direction: column; +`; + +const DataWrapper = styled.div` + display: flex; + flex: 1; +`; + +const formats = [ + { + type: 'text', + title: 'Text', + Component: TextCellView, + single: true, + }, +]; + +export default function CellDataView({ selection, grider }) { + const [selectedFormat, setSelectedFormat] = React.useState(formats[0]); + let value = null; + if (grider && selection.length == 1) { + const rowData = grider.getRowData(selection[0].row); + const { column } = selection[0]; + if (rowData) value = rowData[column]; + } + const { Component } = selectedFormat || {}; + + return ( + + + Format: + setSelectedFormat(formats.find((x) => x.type == value))} + > + {formats.map((fmt) => ( + + ))} + + + + + {selectedFormat == null || (selectedFormat.single && value == null) ? ( + + ) : ( + + )} + + + ); +} diff --git a/packages/web/src/celldata/TextCellView.js b/packages/web/src/celldata/TextCellView.js new file mode 100644 index 000000000..3bab4e329 --- /dev/null +++ b/packages/web/src/celldata/TextCellView.js @@ -0,0 +1,18 @@ +import React from 'react'; +import styled from 'styled-components'; + +const StyledInput = styled.textarea` + flex: 1; +`; + +export default function TextCellView({ value, grider, selection }) { + return ( + grider.setCellValue(selection[0].row, selection[0].column, e.target.value)} + /> + ); +} diff --git a/packages/web/src/datagrid/DataGrid.js b/packages/web/src/datagrid/DataGrid.js index daedd00fd..518477a77 100644 --- a/packages/web/src/datagrid/DataGrid.js +++ b/packages/web/src/datagrid/DataGrid.js @@ -5,6 +5,7 @@ import ColumnManager from './ColumnManager'; import ReferenceManager from './ReferenceManager'; import { HorizontalSplitter } from '../widgets/Splitter'; import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar'; +import CellDataView from '../celldata/CellDataView'; const LeftContainer = styled.div` background-color: white; @@ -20,23 +21,28 @@ const DataGridContainer = styled.div` export default function DataGrid(props) { const { GridCore } = props; const [managerSize, setManagerSize] = React.useState(0); + const [selection, setSelection] = React.useState([]); + const [grider, setGrider] = React.useState(null); return ( - + {props.showReferences && ( - + )} + + + - + ); diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index 449b15c5f..5ad2c1a80 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -210,7 +210,7 @@ export default function DataGridCore(props) { React.useEffect(() => { if (onSelectionChanged) { - onSelectionChanged(getSelectedMacroCells()); + onSelectionChanged(getSelectedCellsPublished()); } }, [onSelectionChanged, selectedCells]); @@ -549,13 +549,30 @@ export default function DataGridCore(props) { return _.uniq((selectedCells || []).map((x) => x[1])).filter((x) => _.isNumber(x)); } - function getSelectedMacroCells() { + function getSelectedCellsPublished() { const regular = cellsToRegularCells(selectedCells); // @ts-ignore - return regular.map((cell) => ({ - row: cell[0], - column: realColumnUniqueNames[cell[1]], - })); + return regular + .map((cell) => ({ + row: cell[0], + column: realColumnUniqueNames[cell[1]], + })) + .filter((x) => x.column); + + // return regular.map((cell) => { + // const row = cell[0]; + // const column = realColumnUniqueNames[cell[1]]; + // let value = null; + // if (grider && column) { + // let rowData = grider.getRowData(row); + // if (rowData) value = rowData[column]; + // } + // return { + // row, + // column, + // value, + // }; + // }); } function getSelectedRowData() { diff --git a/packages/web/src/datagrid/LoadingDataGridCore.js b/packages/web/src/datagrid/LoadingDataGridCore.js index 66776ca0e..e54d67585 100644 --- a/packages/web/src/datagrid/LoadingDataGridCore.js +++ b/packages/web/src/datagrid/LoadingDataGridCore.js @@ -13,6 +13,7 @@ export default function LoadingDataGridCore(props) { openQuery, griderFactory, griderFactoryDeps, + onChangeGrider, } = props; const [loadProps, setLoadProps] = React.useState({ @@ -109,6 +110,10 @@ export default function LoadingDataGridCore(props) { const griderProps = { ...props, sourceRows: loadedRows }; const grider = React.useMemo(() => griderFactory(griderProps), griderFactoryDeps(griderProps)); + React.useEffect(() => { + if (onChangeGrider) onChangeGrider(grider); + }, [grider]); + const handleLoadNextData = () => { if (!isLoadedAll && !errorMessage && !grider.disableLoadNextPage) { if (dataPageAvailable(props)) { diff --git a/packages/web/src/datagrid/SqlDataGridCore.js b/packages/web/src/datagrid/SqlDataGridCore.js index d31e79931..9c8970d57 100644 --- a/packages/web/src/datagrid/SqlDataGridCore.js +++ b/packages/web/src/datagrid/SqlDataGridCore.js @@ -60,7 +60,7 @@ async function loadRowCount(props) { /** @param props {import('./types').DataGridProps} */ export default function SqlDataGridCore(props) { - const { conid, database, display, changeSetState, dispatchChangeSet, tabVisible } = props; + const { conid, database, display, changeSetState, dispatchChangeSet } = props; const showModal = useShowModal(); const setOpenedTabs = useSetOpenedTabs(); diff --git a/packages/web/src/widgets/WidgetColumnBar.js b/packages/web/src/widgets/WidgetColumnBar.js index ca527f19f..b327026a0 100644 --- a/packages/web/src/widgets/WidgetColumnBar.js +++ b/packages/web/src/widgets/WidgetColumnBar.js @@ -10,7 +10,7 @@ import { import { VerticalSplitHandle, useSplitterDrag } from './Splitter'; import useDimensions from '../utility/useDimensions'; -export function WidgetColumnBarItem({ title, children, name, height = undefined }) { +export function WidgetColumnBarItem({ title, children, name, height = undefined, collapsed = false }) { return <>; } @@ -42,7 +42,7 @@ export default function WidgetColumnBar({ children }) { const childArray = _.isArray(children) ? children : [children]; const [refNode, dimensions] = useDimensions(); const [collapsedWidgets, setCollapsedWidgets] = React.useState(() => - childArray.filter((x) => x && x.props.collapsed).map((x) => x.props.key) + childArray.filter((x) => x && x.props.collapsed).map((x) => x.props.name) ); const toggleCollapsed = (name) => { if (collapsedWidgets.includes(name)) setCollapsedWidgets(collapsedWidgets.filter((x) => x != name));