mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-29 08:43:57 +00:00
designer - theme, remove table op
This commit is contained in:
@@ -2,19 +2,28 @@ import React from 'react';
|
|||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import DesignerTable from './DesignerTable';
|
import DesignerTable from './DesignerTable';
|
||||||
import uuidv1 from 'uuid/v1';
|
import uuidv1 from 'uuid/v1';
|
||||||
|
import useTheme from '../theme/useTheme';
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
const Wrapper = styled.div`
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
background-color: ${(props) => props.theme.designer_background};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default function Designer({ value, onChange }) {
|
export default function Designer({ value, onChange }) {
|
||||||
const { tables } = value || {};
|
const { tables } = value || {};
|
||||||
|
const theme = useTheme();
|
||||||
|
|
||||||
|
const [sourceDragColumn, setSourceDragColumn] = React.useState(null);
|
||||||
|
const [targetDragColumn, setTargetDragColumn] = React.useState(null);
|
||||||
|
|
||||||
const handleDrop = (e) => {
|
const handleDrop = (e) => {
|
||||||
var data = e.dataTransfer.getData('app_object_drag_data');
|
var data = e.dataTransfer.getData('app_object_drag_data');
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (!data) return;
|
if (!data) return;
|
||||||
var json = JSON.parse(data);
|
var json = JSON.parse(data);
|
||||||
json.designerId = uuidv1();
|
json.designerId = uuidv1();
|
||||||
|
json.left = e.clientX;
|
||||||
|
json.top = e.clientY;
|
||||||
onChange({
|
onChange({
|
||||||
...value,
|
...value,
|
||||||
tables: [...(tables || []), json],
|
tables: [...(tables || []), json],
|
||||||
@@ -47,10 +56,30 @@ export default function Designer({ value, onChange }) {
|
|||||||
[onChange]
|
[onChange]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const removeTable = React.useCallback(
|
||||||
|
(table) => {
|
||||||
|
onChange((current) => ({
|
||||||
|
...current,
|
||||||
|
tables: (current.tables || []).filter((x) => x.designerId != table.designerId),
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
[onChange]
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Wrapper onDragOver={(e) => e.preventDefault()} onDrop={handleDrop}>
|
<Wrapper onDragOver={(e) => e.preventDefault()} onDrop={handleDrop} theme={theme}>
|
||||||
{(tables || []).map((table) => (
|
{(tables || []).map((table) => (
|
||||||
<DesignerTable key={table.designerId} {...table} onChangeTable={changeTable} onBringToFront={bringToFront} />
|
<DesignerTable
|
||||||
|
key={table.designerId}
|
||||||
|
sourceDragColumn={sourceDragColumn}
|
||||||
|
setSourceDragColumn={setSourceDragColumn}
|
||||||
|
targetDragColumn={targetDragColumn}
|
||||||
|
setTargetDragColumn={setTargetDragColumn}
|
||||||
|
table={table}
|
||||||
|
onChangeTable={changeTable}
|
||||||
|
onBringToFront={bringToFront}
|
||||||
|
onRemoveTable={removeTable}
|
||||||
|
/>
|
||||||
))}
|
))}
|
||||||
</Wrapper>
|
</Wrapper>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,31 +1,96 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import ColumnLabel from '../datagrid/ColumnLabel';
|
import ColumnLabel from '../datagrid/ColumnLabel';
|
||||||
|
import { FontIcon } from '../icons';
|
||||||
|
import useTheme from '../theme/useTheme';
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
const Wrapper = styled.div`
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: white;
|
// background-color: white;
|
||||||
|
background-color: ${(props) => props.theme.designtable_background};
|
||||||
|
border: 1px solid ${(props) => props.theme.border};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const Header = styled.div`
|
const Header = styled.div`
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
background: lightblue;
|
background: ${(props) => props.theme.designtable_background_blue[2]};
|
||||||
|
border-bottom: 1px solid ${(props) => props.theme.border};
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const ColumnsWrapper = styled.div`
|
const ColumnsWrapper = styled.div`
|
||||||
max-height: 400px;
|
max-height: 400px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
width: 100%;
|
width: calc(100% - 10px);
|
||||||
margin: 5px;
|
padding: 5px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default function DesignerTable(props) {
|
const HeaderLabel = styled.div``;
|
||||||
const { pureName, columns, left, top, onChangeTable, onBringToFront } = props;
|
|
||||||
|
const CloseWrapper = styled.div`
|
||||||
|
${(props) =>
|
||||||
|
`
|
||||||
|
background-color: ${props.theme.toolbar_background} ;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: ${props.theme.toolbar_background2} ;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active:hover {
|
||||||
|
background-color: ${props.theme.toolbar_background3};
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
`;
|
||||||
|
|
||||||
|
// &:hover {
|
||||||
|
// background-color: ${(props) => props.theme.designtable_background_gold[1]};
|
||||||
|
// }
|
||||||
|
|
||||||
|
const ColumnLine = styled.div`
|
||||||
|
${(props) =>
|
||||||
|
// @ts-ignore
|
||||||
|
!props.isDragSource &&
|
||||||
|
// @ts-ignore
|
||||||
|
!props.isDragTarget &&
|
||||||
|
`
|
||||||
|
&:hover {
|
||||||
|
background-color: ${props.theme.designtable_background_gold[1]};
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
|
||||||
|
${(props) =>
|
||||||
|
// @ts-ignore
|
||||||
|
props.isDragSource &&
|
||||||
|
`
|
||||||
|
background-color: ${props.theme.designtable_background_green[4]};
|
||||||
|
`}
|
||||||
|
|
||||||
|
${(props) =>
|
||||||
|
// @ts-ignore
|
||||||
|
props.isDragTarget &&
|
||||||
|
`
|
||||||
|
background-color: ${props.theme.designtable_background_volcano[4]};
|
||||||
|
`}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default function DesignerTable({
|
||||||
|
table,
|
||||||
|
onChangeTable,
|
||||||
|
onBringToFront,
|
||||||
|
onRemoveTable,
|
||||||
|
sourceDragColumn,
|
||||||
|
setSourceDragColumn,
|
||||||
|
targetDragColumn,
|
||||||
|
setTargetDragColumn,
|
||||||
|
}) {
|
||||||
|
const { pureName, columns, left, top, designerId } = table;
|
||||||
const [movingPosition, setMovingPosition] = React.useState(null);
|
const [movingPosition, setMovingPosition] = React.useState(null);
|
||||||
const movingPositionRef = React.useRef(null);
|
const movingPositionRef = React.useRef(null);
|
||||||
|
const theme = useTheme();
|
||||||
|
|
||||||
const moveStartXRef = React.useRef(null);
|
const moveStartXRef = React.useRef(null);
|
||||||
const moveStartYRef = React.useRef(null);
|
const moveStartYRef = React.useRef(null);
|
||||||
@@ -55,7 +120,7 @@ export default function DesignerTable(props) {
|
|||||||
(e) => {
|
(e) => {
|
||||||
if (movingPositionRef.current) {
|
if (movingPositionRef.current) {
|
||||||
onChangeTable({
|
onChangeTable({
|
||||||
...props,
|
...table,
|
||||||
left: movingPositionRef.current.left,
|
left: movingPositionRef.current.left,
|
||||||
top: movingPositionRef.current.top,
|
top: movingPositionRef.current.top,
|
||||||
});
|
});
|
||||||
@@ -68,7 +133,7 @@ export default function DesignerTable(props) {
|
|||||||
|
|
||||||
// this.props.designer.changedModel(true);
|
// this.props.designer.changedModel(true);
|
||||||
},
|
},
|
||||||
[onChangeTable, props]
|
[onChangeTable, table]
|
||||||
);
|
);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
@@ -96,18 +161,64 @@ export default function DesignerTable(props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Wrapper
|
<Wrapper
|
||||||
|
theme={theme}
|
||||||
style={{
|
style={{
|
||||||
left: movingPosition ? movingPosition.left : left,
|
left: movingPosition ? movingPosition.left : left,
|
||||||
top: movingPosition ? movingPosition.top : top,
|
top: movingPosition ? movingPosition.top : top,
|
||||||
}}
|
}}
|
||||||
onMouseDown={() => onBringToFront(props)}
|
onMouseDown={() => onBringToFront(table)}
|
||||||
>
|
>
|
||||||
<Header onMouseDown={headerMouseDown}>{pureName}</Header>
|
<Header onMouseDown={headerMouseDown} theme={theme}>
|
||||||
|
<HeaderLabel>{pureName}</HeaderLabel>
|
||||||
|
<CloseWrapper onClick={() => onRemoveTable(table)} theme={theme}>
|
||||||
|
<FontIcon icon="icon close" />
|
||||||
|
</CloseWrapper>
|
||||||
|
</Header>
|
||||||
<ColumnsWrapper>
|
<ColumnsWrapper>
|
||||||
{(columns || []).map((column) => (
|
{(columns || []).map((column) => (
|
||||||
<div key={column.columnName}>
|
<ColumnLine
|
||||||
<ColumnLabel {...column} />
|
key={column.columnName}
|
||||||
</div>
|
theme={theme}
|
||||||
|
draggable
|
||||||
|
// @ts-ignore
|
||||||
|
isDragSource={
|
||||||
|
sourceDragColumn &&
|
||||||
|
sourceDragColumn.designerId == designerId &&
|
||||||
|
sourceDragColumn.columnName == column.columnName
|
||||||
|
}
|
||||||
|
// @ts-ignore
|
||||||
|
isDragTarget={
|
||||||
|
targetDragColumn &&
|
||||||
|
targetDragColumn.designerId == designerId &&
|
||||||
|
targetDragColumn.columnName == column.columnName
|
||||||
|
}
|
||||||
|
onDragStart={(e) => {
|
||||||
|
const dragData = {
|
||||||
|
...column,
|
||||||
|
designerId,
|
||||||
|
};
|
||||||
|
setSourceDragColumn(dragData);
|
||||||
|
e.dataTransfer.setData('designer_column_drag_data', JSON.stringify(dragData));
|
||||||
|
}}
|
||||||
|
onDragOver={(e) => {
|
||||||
|
if (sourceDragColumn) {
|
||||||
|
e.preventDefault();
|
||||||
|
setTargetDragColumn({
|
||||||
|
...column,
|
||||||
|
designerId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onDrop={(e) => {
|
||||||
|
var data = e.dataTransfer.getData('designer_column_drag_data');
|
||||||
|
e.preventDefault();
|
||||||
|
if (!data) return;
|
||||||
|
setTargetDragColumn(null);
|
||||||
|
setSourceDragColumn(null);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ColumnLabel {...column} forceIcon />
|
||||||
|
</ColumnLine>
|
||||||
))}
|
))}
|
||||||
</ColumnsWrapper>
|
</ColumnsWrapper>
|
||||||
</Wrapper>
|
</Wrapper>
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ const theme = {
|
|||||||
button_background: '#004488',
|
button_background: '#004488',
|
||||||
statusbar_background: '#00c',
|
statusbar_background: '#00c',
|
||||||
inlinebtn_background: '#222',
|
inlinebtn_background: '#222',
|
||||||
|
|
||||||
|
designer_background: '#333',
|
||||||
|
designtable_background: '#000',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fillTheme(theme);
|
export default fillTheme(theme);
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ const theme = {
|
|||||||
button_background: '#337ab7',
|
button_background: '#337ab7',
|
||||||
statusbar_background: '#00c',
|
statusbar_background: '#00c',
|
||||||
inlinebtn_background: '#ededed',
|
inlinebtn_background: '#ededed',
|
||||||
|
|
||||||
|
designer_background: '#eee',
|
||||||
|
designtable_background: '#fff',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fillTheme(theme);
|
export default fillTheme(theme);
|
||||||
|
|||||||
Reference in New Issue
Block a user