mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-02 18:23:59 +00:00
cell data view
This commit is contained in:
68
packages/web/src/celldata/CellDataView.js
Normal file
68
packages/web/src/celldata/CellDataView.js
Normal file
@@ -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 (
|
||||||
|
<MainWrapper>
|
||||||
|
<Toolbar>
|
||||||
|
Format:
|
||||||
|
<SelectField
|
||||||
|
value={selectedFormat && selectedFormat.type}
|
||||||
|
onChange={(value) => setSelectedFormat(formats.find((x) => x.type == value))}
|
||||||
|
>
|
||||||
|
{formats.map((fmt) => (
|
||||||
|
<option value={fmt.type} key={fmt.type}>
|
||||||
|
{fmt.title}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</SelectField>
|
||||||
|
</Toolbar>
|
||||||
|
|
||||||
|
<DataWrapper>
|
||||||
|
{selectedFormat == null || (selectedFormat.single && value == null) ? (
|
||||||
|
<ErrorInfo message="Must be selected one cell" />
|
||||||
|
) : (
|
||||||
|
<Component value={value} grider={grider} selection={selection} />
|
||||||
|
)}
|
||||||
|
</DataWrapper>
|
||||||
|
</MainWrapper>
|
||||||
|
);
|
||||||
|
}
|
||||||
18
packages/web/src/celldata/TextCellView.js
Normal file
18
packages/web/src/celldata/TextCellView.js
Normal file
@@ -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 (
|
||||||
|
<StyledInput
|
||||||
|
value={value}
|
||||||
|
wrap="off"
|
||||||
|
readOnly
|
||||||
|
// readOnly={grider ? !grider.editable : true}
|
||||||
|
// onChange={(e) => grider.setCellValue(selection[0].row, selection[0].column, e.target.value)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import ColumnManager from './ColumnManager';
|
|||||||
import ReferenceManager from './ReferenceManager';
|
import ReferenceManager from './ReferenceManager';
|
||||||
import { HorizontalSplitter } from '../widgets/Splitter';
|
import { HorizontalSplitter } from '../widgets/Splitter';
|
||||||
import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar';
|
import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar';
|
||||||
|
import CellDataView from '../celldata/CellDataView';
|
||||||
|
|
||||||
const LeftContainer = styled.div`
|
const LeftContainer = styled.div`
|
||||||
background-color: white;
|
background-color: white;
|
||||||
@@ -20,23 +21,28 @@ const DataGridContainer = styled.div`
|
|||||||
export default function DataGrid(props) {
|
export default function DataGrid(props) {
|
||||||
const { GridCore } = props;
|
const { GridCore } = props;
|
||||||
const [managerSize, setManagerSize] = React.useState(0);
|
const [managerSize, setManagerSize] = React.useState(0);
|
||||||
|
const [selection, setSelection] = React.useState([]);
|
||||||
|
const [grider, setGrider] = React.useState(null);
|
||||||
return (
|
return (
|
||||||
<HorizontalSplitter initialValue="300px" size={managerSize} setSize={setManagerSize}>
|
<HorizontalSplitter initialValue="300px" size={managerSize} setSize={setManagerSize}>
|
||||||
<LeftContainer>
|
<LeftContainer>
|
||||||
<WidgetColumnBar>
|
<WidgetColumnBar>
|
||||||
<WidgetColumnBarItem title="Columns" name="columns" height="60%">
|
<WidgetColumnBarItem title="Columns" name="columns" height="50%">
|
||||||
<ColumnManager {...props} managerSize={managerSize} />
|
<ColumnManager {...props} managerSize={managerSize} />
|
||||||
</WidgetColumnBarItem>
|
</WidgetColumnBarItem>
|
||||||
{props.showReferences && (
|
{props.showReferences && (
|
||||||
<WidgetColumnBarItem title="References" name="references">
|
<WidgetColumnBarItem title="References" name="references" height="30%">
|
||||||
<ReferenceManager {...props} managerSize={managerSize} />
|
<ReferenceManager {...props} managerSize={managerSize} />
|
||||||
</WidgetColumnBarItem>
|
</WidgetColumnBarItem>
|
||||||
)}
|
)}
|
||||||
|
<WidgetColumnBarItem title="Cell data" name="cellData">
|
||||||
|
<CellDataView selection={selection} grider={grider} />
|
||||||
|
</WidgetColumnBarItem>
|
||||||
</WidgetColumnBar>
|
</WidgetColumnBar>
|
||||||
</LeftContainer>
|
</LeftContainer>
|
||||||
|
|
||||||
<DataGridContainer>
|
<DataGridContainer>
|
||||||
<GridCore {...props} />
|
<GridCore {...props} onSelectionChanged={setSelection} onChangeGrider={setGrider} />
|
||||||
</DataGridContainer>
|
</DataGridContainer>
|
||||||
</HorizontalSplitter>
|
</HorizontalSplitter>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ export default function DataGridCore(props) {
|
|||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (onSelectionChanged) {
|
if (onSelectionChanged) {
|
||||||
onSelectionChanged(getSelectedMacroCells());
|
onSelectionChanged(getSelectedCellsPublished());
|
||||||
}
|
}
|
||||||
}, [onSelectionChanged, selectedCells]);
|
}, [onSelectionChanged, selectedCells]);
|
||||||
|
|
||||||
@@ -549,13 +549,30 @@ export default function DataGridCore(props) {
|
|||||||
return _.uniq((selectedCells || []).map((x) => x[1])).filter((x) => _.isNumber(x));
|
return _.uniq((selectedCells || []).map((x) => x[1])).filter((x) => _.isNumber(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSelectedMacroCells() {
|
function getSelectedCellsPublished() {
|
||||||
const regular = cellsToRegularCells(selectedCells);
|
const regular = cellsToRegularCells(selectedCells);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
return regular.map((cell) => ({
|
return regular
|
||||||
row: cell[0],
|
.map((cell) => ({
|
||||||
column: realColumnUniqueNames[cell[1]],
|
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() {
|
function getSelectedRowData() {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export default function LoadingDataGridCore(props) {
|
|||||||
openQuery,
|
openQuery,
|
||||||
griderFactory,
|
griderFactory,
|
||||||
griderFactoryDeps,
|
griderFactoryDeps,
|
||||||
|
onChangeGrider,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
const [loadProps, setLoadProps] = React.useState({
|
const [loadProps, setLoadProps] = React.useState({
|
||||||
@@ -109,6 +110,10 @@ export default function LoadingDataGridCore(props) {
|
|||||||
const griderProps = { ...props, sourceRows: loadedRows };
|
const griderProps = { ...props, sourceRows: loadedRows };
|
||||||
const grider = React.useMemo(() => griderFactory(griderProps), griderFactoryDeps(griderProps));
|
const grider = React.useMemo(() => griderFactory(griderProps), griderFactoryDeps(griderProps));
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (onChangeGrider) onChangeGrider(grider);
|
||||||
|
}, [grider]);
|
||||||
|
|
||||||
const handleLoadNextData = () => {
|
const handleLoadNextData = () => {
|
||||||
if (!isLoadedAll && !errorMessage && !grider.disableLoadNextPage) {
|
if (!isLoadedAll && !errorMessage && !grider.disableLoadNextPage) {
|
||||||
if (dataPageAvailable(props)) {
|
if (dataPageAvailable(props)) {
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ async function loadRowCount(props) {
|
|||||||
|
|
||||||
/** @param props {import('./types').DataGridProps} */
|
/** @param props {import('./types').DataGridProps} */
|
||||||
export default function SqlDataGridCore(props) {
|
export default function SqlDataGridCore(props) {
|
||||||
const { conid, database, display, changeSetState, dispatchChangeSet, tabVisible } = props;
|
const { conid, database, display, changeSetState, dispatchChangeSet } = props;
|
||||||
const showModal = useShowModal();
|
const showModal = useShowModal();
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const setOpenedTabs = useSetOpenedTabs();
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
import { VerticalSplitHandle, useSplitterDrag } from './Splitter';
|
import { VerticalSplitHandle, useSplitterDrag } from './Splitter';
|
||||||
import useDimensions from '../utility/useDimensions';
|
import useDimensions from '../utility/useDimensions';
|
||||||
|
|
||||||
export function WidgetColumnBarItem({ title, children, name, height = undefined }) {
|
export function WidgetColumnBarItem({ title, children, name, height = undefined, collapsed = false }) {
|
||||||
return <></>;
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ export default function WidgetColumnBar({ children }) {
|
|||||||
const childArray = _.isArray(children) ? children : [children];
|
const childArray = _.isArray(children) ? children : [children];
|
||||||
const [refNode, dimensions] = useDimensions();
|
const [refNode, dimensions] = useDimensions();
|
||||||
const [collapsedWidgets, setCollapsedWidgets] = React.useState(() =>
|
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) => {
|
const toggleCollapsed = (name) => {
|
||||||
if (collapsedWidgets.includes(name)) setCollapsedWidgets(collapsedWidgets.filter((x) => x != name));
|
if (collapsedWidgets.includes(name)) setCollapsedWidgets(collapsedWidgets.filter((x) => x != name));
|
||||||
|
|||||||
Reference in New Issue
Block a user