diff --git a/packages/web/src/datagrid/DataGrid.js b/packages/web/src/datagrid/DataGrid.js index 383a88a33..226bf4233 100644 --- a/packages/web/src/datagrid/DataGrid.js +++ b/packages/web/src/datagrid/DataGrid.js @@ -21,31 +21,51 @@ const DataGridContainer = styled.div` `; export default function DataGrid(props) { - const { GridCore } = props; + const { GridCore, FormView } = props; const theme = useTheme(); const [managerSize, setManagerSize] = React.useState(0); const [selection, setSelection] = React.useState([]); const [grider, setGrider] = React.useState(null); + const [formViewData, setFormViewData] = React.useState(null); + const isFormView = !!formViewData; + + const handleSetFormView = (rowData) => { + setFormViewData(rowData); + }; + return ( - - - + {!isFormView && ( + + + + )} {props.showReferences && props.display.hasReferences && ( )} - - - + {!isFormView && ( + + + + )} - + {isFormView ? ( + + ) : ( + + )} ); diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index c3a975204..a97ce1c0d 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -116,6 +116,7 @@ export default function DataGridCore(props) { onSelectionChanged, frameSelection, onKeyDown, + onSetFormView, } = props; // console.log('RENDER GRID', display.baseTable.pureName); const columns = React.useMemo(() => display.allColumns, [display]); @@ -1047,6 +1048,7 @@ export default function DataGridCore(props) { display={display} focusedColumn={display.focusedColumn} frameSelection={frameSelection} + onSetFormView={onSetFormView} /> ) )} diff --git a/packages/web/src/datagrid/DataGridRow.js b/packages/web/src/datagrid/DataGridRow.js index cecb5001d..d213162ef 100644 --- a/packages/web/src/datagrid/DataGridRow.js +++ b/packages/web/src/datagrid/DataGridRow.js @@ -7,6 +7,7 @@ import InplaceEditor from './InplaceEditor'; import { cellIsSelected } from './gridutil'; import { isTypeLogical } from 'dbgate-tools'; import useTheme from '../theme/useTheme'; +import { FontIcon } from '../icons'; const TableBodyCell = styled.td` font-weight: normal; @@ -114,6 +115,7 @@ const TableHeaderCell = styled.td` padding: 2px; background-color: ${(props) => props.theme.gridheader_background}; overflow: hidden; + position: relative; `; const AutoFillPoint = styled.div` @@ -127,6 +129,16 @@ const AutoFillPoint = styled.div` cursor: crosshair; `; +const ShowFormButton = styled.div` + position: absolute; + right: 2px; + top: 2px; + &:hover { + background-color: ${(props) => props.theme.gridheader_background_blue[4]}; + border: 1px solid ${(props) => props.theme.border}; + } +`; + function makeBulletString(value) { return _.pad('', value.length, '•'); } @@ -167,6 +179,33 @@ function CellFormattedValue({ value, dataType }) { return value.toString(); } +function RowHeaderCell({ rowIndex, theme, onSetFormView, rowData }) { + const [mouseIn, setMouseIn] = React.useState(false); + + return ( + setMouseIn(true) : null} + onMouseLeave={onSetFormView ? () => setMouseIn(false) : null} + > + {rowIndex + 1} + {!!onSetFormView && mouseIn && ( + { + e.stopPropagation(); + onSetFormView(rowData); + }} + > + + + )} + + ); +} + /** @param props {import('./types').DataGridProps} */ function DataGridRow(props) { const { @@ -181,6 +220,7 @@ function DataGridRow(props) { focusedColumn, grider, frameSelection, + onSetFormView, } = props; // usePropsCompare({ // rowHeight, @@ -217,9 +257,8 @@ function DataGridRow(props) { return ( - - {rowIndex + 1} - + + {visibleRealColumns.map((col) => ( x.pureName == pureName && x.schemaName == schemaName) + } /> {reference && ( diff --git a/packages/web/src/formview/FormView.js b/packages/web/src/formview/FormView.js new file mode 100644 index 000000000..457a5be2a --- /dev/null +++ b/packages/web/src/formview/FormView.js @@ -0,0 +1,88 @@ +import _ from 'lodash'; +import React from 'react'; +import ColumnLabel from '../datagrid/ColumnLabel'; +import { findForeignKeyForColumn } from 'dbgate-tools'; +import styled from 'styled-components'; +import useTheme from '../theme/useTheme'; +import useDimensions from '../utility/useDimensions'; + +const Table = styled.table` + border-collapse: collapse; + outline: none; +`; + +const Wrapper = styled.div` + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + display: flex; + overflow-x: scroll; +`; + +const TableRow = styled.tr` + background-color: ${(props) => props.theme.gridbody_background}; + &:nth-child(6n + 3) { + background-color: ${(props) => props.theme.gridbody_background_alt2}; + } + &:nth-child(6n + 6) { + background-color: ${(props) => props.theme.gridbody_background_alt3}; + } +`; + +const TableHeaderCell = styled.td` + border: 1px solid ${(props) => props.theme.border}; + text-align: left; + padding: 2px; + background-color: ${(props) => props.theme.gridheader_background}; + overflow: hidden; + position: relative; +`; + +const TableBodyCell = styled.td` + font-weight: normal; + border: 1px solid ${(props) => props.theme.border}; + // border-collapse: collapse; + padding: 2px; + white-space: nowrap; + position: relative; + overflow: hidden; +`; + +const HintSpan = styled.span` + color: gray; + margin-left: 5px; +`; +const NullSpan = styled.span` + color: gray; + font-style: italic; +`; + +export default function FormView({ tableInfo, rowData }) { + const theme = useTheme(); + const [headerRowRef, { height: rowHeight }] = useDimensions(); + const [wrapperRef, { height: wrapperHeight }] = useDimensions(); + + if (!tableInfo || !rowData) return null; + + const rowCount = Math.floor((wrapperHeight - 20) / rowHeight); + const columnChunks = _.chunk(tableInfo.columns, rowCount); + + return ( + + {columnChunks.map((chunk, index) => ( + + {chunk.map((col) => ( + + + + + {rowData[col.columnName]} + + ))} +
+ ))} +
+ ); +} diff --git a/packages/web/src/formview/SqlFormView.js b/packages/web/src/formview/SqlFormView.js new file mode 100644 index 000000000..aa0f46c58 --- /dev/null +++ b/packages/web/src/formview/SqlFormView.js @@ -0,0 +1,6 @@ +import React from 'react'; +import FormView from './FormView'; + +export default function SqlFormView({ rowData, tableInfo }) { + return ; +} diff --git a/packages/web/src/icons.js b/packages/web/src/icons.js index 143231dcb..357bde17b 100644 --- a/packages/web/src/icons.js +++ b/packages/web/src/icons.js @@ -32,6 +32,7 @@ const iconNames = { 'icon web': 'mdi mdi-web', 'icon home': 'mdi mdi-home', 'icon query-design': 'mdi mdi-vector-polyline-edit', + 'icon form': 'mdi mdi-form-select', 'icon edit': 'mdi mdi-pencil', 'icon delete': 'mdi mdi-delete',