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',