cell data autodetect format, collapsed views in detail

This commit is contained in:
Jan Prochazka
2020-11-07 10:27:08 +01:00
parent c57ec68916
commit d234226750
5 changed files with 38 additions and 10 deletions

View File

@@ -76,6 +76,10 @@ export abstract class GridDisplay {
})); }));
} }
get hasReferences() {
return false;
}
get focusedColumn() { get focusedColumn() {
return this.config.focusedColumn; return this.config.focusedColumn;
} }

View File

@@ -218,4 +218,11 @@ export class TableGridDisplay extends GridDisplay {
} }
} }
} }
get hasReferences() {
if (!this.table) return false;
if (this.table.foreignKeys && this.table.foreignKeys.length > 0) return true;
if (this.table.dependencies && this.table.dependencies.length > 0) return true;
return false;
}
} }

View File

@@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import _ from 'lodash';
import { SelectField } from '../utility/inputs'; import { SelectField } from '../utility/inputs';
import ErrorInfo from '../widgets/ErrorInfo'; import ErrorInfo from '../widgets/ErrorInfo';
import styled from 'styled-components'; import styled from 'styled-components';
@@ -43,24 +44,36 @@ const formats = [
}, },
]; ];
function autodetect(selection, grider, value) {
if (_.isString(value)) {
if (value.startsWith('[') || value.startsWith('{')) return 'json';
}
return 'textWrap';
}
export default function CellDataView({ selection, grider }) { export default function CellDataView({ selection, grider }) {
const [selectedFormat, setSelectedFormat] = React.useState(formats[0]); const [selectedFormatType, setSelectedFormatType] = React.useState('autodetect');
let value = null; let value = null;
if (grider && selection.length == 1) { if (grider && selection.length == 1) {
const rowData = grider.getRowData(selection[0].row); const rowData = grider.getRowData(selection[0].row);
const { column } = selection[0]; const { column } = selection[0];
if (rowData) value = rowData[column]; if (rowData) value = rowData[column];
} }
const { Component } = selectedFormat || {}; const autodetectFormatType = React.useMemo(() => autodetect(selection, grider, value), [selection, grider, value]);
const autodetectFormat = formats.find((x) => x.type == autodetectFormatType);
const usedFormatType = selectedFormatType == 'autodetect' ? autodetectFormatType : selectedFormatType;
const usedFormat = formats.find((x) => x.type == usedFormatType);
const { Component } = usedFormat || {};
return ( return (
<MainWrapper> <MainWrapper>
<Toolbar> <Toolbar>
Format: Format:
<SelectField <SelectField value={selectedFormatType} onChange={(e) => setSelectedFormatType(e.target.value)}>
value={selectedFormat && selectedFormat.type} <option value="autodetect">Autodetect - {autodetectFormat.title}</option>
onChange={(e) => setSelectedFormat(formats.find((x) => x.type == e.target.value))}
>
{formats.map((fmt) => ( {formats.map((fmt) => (
<option value={fmt.type} key={fmt.type}> <option value={fmt.type} key={fmt.type}>
{fmt.title} {fmt.title}
@@ -70,7 +83,7 @@ export default function CellDataView({ selection, grider }) {
</Toolbar> </Toolbar>
<DataWrapper> <DataWrapper>
{selectedFormat == null || (selectedFormat.single && value == null) ? ( {usedFormat == null || (usedFormat.single && value == null) ? (
<ErrorInfo message="Must be selected one cell" /> <ErrorInfo message="Must be selected one cell" />
) : ( ) : (
<Component value={value} grider={grider} selection={selection} /> <Component value={value} grider={grider} selection={selection} />

View File

@@ -6,6 +6,7 @@ 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'; import CellDataView from '../celldata/CellDataView';
import { FreeTableGridDisplay } from '@dbgate/datalib';
const LeftContainer = styled.div` const LeftContainer = styled.div`
background-color: white; background-color: white;
@@ -30,12 +31,12 @@ export default function DataGrid(props) {
<WidgetColumnBarItem title="Columns" name="columns" height="50%"> <WidgetColumnBarItem title="Columns" name="columns" height="50%">
<ColumnManager {...props} managerSize={managerSize} /> <ColumnManager {...props} managerSize={managerSize} />
</WidgetColumnBarItem> </WidgetColumnBarItem>
{props.showReferences && ( {props.showReferences && props.display.hasReferences && (
<WidgetColumnBarItem title="References" name="references" height="30%"> <WidgetColumnBarItem title="References" name="references" height="30%" collapsed={props.isDetailView}>
<ReferenceManager {...props} managerSize={managerSize} /> <ReferenceManager {...props} managerSize={managerSize} />
</WidgetColumnBarItem> </WidgetColumnBarItem>
)} )}
<WidgetColumnBarItem title="Cell data" name="cellData"> <WidgetColumnBarItem title="Cell data" name="cellData" collapsed={props.isDetailView}>
<CellDataView selection={selection} grider={grider} /> <CellDataView selection={selection} grider={grider} />
</WidgetColumnBarItem> </WidgetColumnBarItem>
</WidgetColumnBar> </WidgetColumnBar>

View File

@@ -42,6 +42,7 @@ export default function TableDataGrid({
cache = undefined, cache = undefined,
setCache = undefined, setCache = undefined,
masterLoadedTime = undefined, masterLoadedTime = undefined,
isDetailView = false,
}) { }) {
// const [childConfig, setChildConfig] = React.useState(createGridConfig()); // const [childConfig, setChildConfig] = React.useState(createGridConfig());
const [myCache, setMyCache] = React.useState(createGridCache()); const [myCache, setMyCache] = React.useState(createGridCache());
@@ -164,6 +165,7 @@ export default function TableDataGrid({
refReloadToken={refReloadToken.toString()} refReloadToken={refReloadToken.toString()}
masterLoadedTime={masterLoadedTime} masterLoadedTime={masterLoadedTime}
GridCore={SqlDataGridCore} GridCore={SqlDataGridCore}
isDetailView={isDetailView}
/> />
{reference && ( {reference && (
<ReferenceContainer> <ReferenceContainer>
@@ -184,6 +186,7 @@ export default function TableDataGrid({
cache={childCache} cache={childCache}
setCache={setChildCache} setCache={setChildCache}
masterLoadedTime={myLoadedTime} masterLoadedTime={myLoadedTime}
isDetailView
/> />
</ReferenceGridWrapper> </ReferenceGridWrapper>
</ReferenceContainer> </ReferenceContainer>