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

@@ -1,4 +1,5 @@
import React from 'react';
import _ from 'lodash';
import { SelectField } from '../utility/inputs';
import ErrorInfo from '../widgets/ErrorInfo';
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 }) {
const [selectedFormat, setSelectedFormat] = React.useState(formats[0]);
const [selectedFormatType, setSelectedFormatType] = React.useState('autodetect');
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 || {};
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 (
<MainWrapper>
<Toolbar>
Format:
<SelectField
value={selectedFormat && selectedFormat.type}
onChange={(e) => setSelectedFormat(formats.find((x) => x.type == e.target.value))}
>
<SelectField value={selectedFormatType} onChange={(e) => setSelectedFormatType(e.target.value)}>
<option value="autodetect">Autodetect - {autodetectFormat.title}</option>
{formats.map((fmt) => (
<option value={fmt.type} key={fmt.type}>
{fmt.title}
@@ -70,7 +83,7 @@ export default function CellDataView({ selection, grider }) {
</Toolbar>
<DataWrapper>
{selectedFormat == null || (selectedFormat.single && value == null) ? (
{usedFormat == null || (usedFormat.single && value == null) ? (
<ErrorInfo message="Must be selected one cell" />
) : (
<Component value={value} grider={grider} selection={selection} />

View File

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

View File

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