button redesign

This commit is contained in:
Jan Prochazka
2020-04-04 10:20:56 +02:00
parent a50d1166d4
commit a3e9ba61af
9 changed files with 161 additions and 28 deletions

View File

@@ -0,0 +1,30 @@
import React from 'react';
import styled from 'styled-components';
import ColumnLabel from './ColumnLabel';
import DropDownButton from '../widgets/DropDownButton';
import { DropDownMenuItem } from '../modals/DropDownMenu';
const HeaderDiv = styled.div`
display: flex;
`;
const LabelDiv = styled.div`
flex: 1;
min-width: 10px;
padding-left: 2px;
margin: auto;
`;
export default function ColumnHeaderControl({ column }) {
return (
<HeaderDiv>
<LabelDiv>
<ColumnLabel {...column} />
</LabelDiv>
<DropDownButton>
<DropDownMenuItem onClick={() => {}}>Sort ascending</DropDownMenuItem>
<DropDownMenuItem onClick={() => {}}>Sort descending</DropDownMenuItem>
</DropDownButton>
</HeaderDiv>
);
}

View File

@@ -3,6 +3,7 @@ import styled from 'styled-components';
import ColumnLabel from './ColumnLabel'; import ColumnLabel from './ColumnLabel';
import { filterName } from '@dbgate/datalib'; import { filterName } from '@dbgate/datalib';
import { ExpandIcon } from '../icons'; import { ExpandIcon } from '../icons';
import InlineButton from '../widgets/InlineButton';
const Wrapper = styled.div``; const Wrapper = styled.div``;
@@ -79,8 +80,8 @@ export default function ColumnManager(props) {
<Wrapper> <Wrapper>
<SearchBoxWrapper> <SearchBoxWrapper>
<Input type="text" placeholder="Search" value={columnFilter} onChange={e => setColumnFilter(e.target.value)} /> <Input type="text" placeholder="Search" value={columnFilter} onChange={e => setColumnFilter(e.target.value)} />
<Button onClick={() => display.hideAllColumns()}>Hide</Button> <InlineButton onClick={() => display.hideAllColumns()}>Hide</InlineButton>
<Button onClick={() => display.showAllColumns()}>Show</Button> <InlineButton onClick={() => display.showAllColumns()}>Show</InlineButton>
</SearchBoxWrapper> </SearchBoxWrapper>
{display {display
.getColumns(columnFilter) .getColumns(columnFilter)

View File

@@ -4,6 +4,7 @@ import { DropDownMenuItem, DropDownMenuDivider, showMenu } from '../modals/DropD
import styled from 'styled-components'; import styled from 'styled-components';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import { parseFilter } from '@dbgate/filterparser'; import { parseFilter } from '@dbgate/filterparser';
import InlineButton from '../widgets/InlineButton';
// import { $ } from '../../Utility/jquery'; // import { $ } from '../../Utility/jquery';
// import autobind from 'autobind-decorator'; // import autobind from 'autobind-decorator';
// import * as React from 'react'; // import * as React from 'react';
@@ -37,9 +38,9 @@ const FilterInput = styled.input`
min-width: 10px; min-width: 10px;
background-color: ${props => (props.state == 'ok' ? '#CCFFCC' : props.state == 'error' ? '#FFCCCC' : 'white')}; background-color: ${props => (props.state == 'ok' ? '#CCFFCC' : props.state == 'error' ? '#FFCCCC' : 'white')};
`; `;
const FilterButton = styled.button` // const FilterButton = styled.button`
color: gray; // color: gray;
`; // `;
function DropDownContent({ filterType, setFilter, filterMultipleValues, openFilterWindow }) { function DropDownContent({ filterType, setFilter, filterMultipleValues, openFilterWindow }) {
switch (filterType) { switch (filterType) {
@@ -175,8 +176,8 @@ export default function DataFilterControl({ isReadOnly = false, filterType, filt
}; };
const filterMultipleValues = () => {}; const filterMultipleValues = () => {};
const openFilterWindow = operator => {}; const openFilterWindow = operator => {};
const buttonRef = React.createRef(); const buttonRef = React.useRef();
const editorRef = React.createRef(); const editorRef = React.useRef();
const handleKeyDown = ev => { const handleKeyDown = ev => {
if (isReadOnly) return; if (isReadOnly) return;
@@ -235,9 +236,9 @@ export default function DataFilterControl({ isReadOnly = false, filterType, filt
state={filterState} state={filterState}
onBlur={applyFilter} onBlur={applyFilter}
/> />
<FilterButton ref={buttonRef} onClick={handleShowMenu}> <InlineButton buttonRef={buttonRef} onClick={handleShowMenu} square>
<i className="fas fa-filter" /> <i className="fas fa-filter" />
</FilterButton> </InlineButton>
</FilterDiv> </FilterDiv>
); );
} }

View File

@@ -42,6 +42,8 @@ import { sleep } from '../utility/common';
import { copyTextToClipboard } from '../utility/clipboard'; import { copyTextToClipboard } from '../utility/clipboard';
import DataGridToolbar from './DataGridToolbar'; import DataGridToolbar from './DataGridToolbar';
import usePropsCompare from '../utility/usePropsCompare'; import usePropsCompare from '../utility/usePropsCompare';
import ColumnHeaderControl from './ColumnHeaderControl';
import InlineButton from '../widgets/InlineButton';
const GridContainer = styled.div` const GridContainer = styled.div`
position: absolute; position: absolute;
@@ -79,7 +81,8 @@ const TableHeaderCell = styled.td`
border: 1px solid #c0c0c0; border: 1px solid #c0c0c0;
// border-collapse: collapse; // border-collapse: collapse;
text-align: left; text-align: left;
padding: 2px; padding: 0;
margin: 0;
background-color: #f6f7f9; background-color: #f6f7f9;
overflow: hidden; overflow: hidden;
`; `;
@@ -100,6 +103,7 @@ const FocusField = styled.input`
/** @param props {import('./types').DataGridProps} */ /** @param props {import('./types').DataGridProps} */
export default function DataGridCore(props) { export default function DataGridCore(props) {
const { conid, database, display, changeSetState, dispatchChangeSet, tabVisible } = props; const { conid, database, display, changeSetState, dispatchChangeSet, tabVisible } = props;
// console.log('RENDER GRID', display.baseTable.pureName);
const columns = React.useMemo(() => display.getGridColumns(), [display]); const columns = React.useMemo(() => display.getGridColumns(), [display]);
// usePropsCompare(props); // usePropsCompare(props);
@@ -314,7 +318,8 @@ export default function DataGridCore(props) {
); );
const realColumnUniqueNames = React.useMemo( const realColumnUniqueNames = React.useMemo(
() => _.range(columnSizes.realCount).map(realIndex => columns[columnSizes.realToModel(realIndex)].uniqueName), () =>
_.range(columnSizes.realCount).map(realIndex => (columns[columnSizes.realToModel(realIndex)] || {}).uniqueName),
[columnSizes, columns] [columnSizes, columns]
); );
@@ -331,6 +336,8 @@ export default function DataGridCore(props) {
}; };
function handleGridMouseDown(event) { function handleGridMouseDown(event) {
if (event.target.closest('.buttonLike')) return;
if (event.target.closest('input')) return;
// event.target.closest('table').focus(); // event.target.closest('table').focus();
event.preventDefault(); event.preventDefault();
// @ts-ignore // @ts-ignore
@@ -838,7 +845,7 @@ export default function DataGridCore(props) {
key={col.uniqueName} key={col.uniqueName}
style={{ width: col.widthPx, minWidth: col.widthPx, maxWidth: col.widthPx }} style={{ width: col.widthPx, minWidth: col.widthPx, maxWidth: col.widthPx }}
> >
<ColumnLabel {...col} /> <ColumnHeaderControl column={col} />
</TableHeaderCell> </TableHeaderCell>
))} ))}
</TableHeaderRow> </TableHeaderRow>
@@ -849,9 +856,9 @@ export default function DataGridCore(props) {
data-col="header" data-col="header"
> >
{filterCount > 0 && ( {filterCount > 0 && (
<button onClick={handleClearFilters}> <InlineButton onClick={handleClearFilters} square>
<i className="fas fa-times" /> <i className="fas fa-times" />
</button> </InlineButton>
)} )}
</TableHeaderCell> </TableHeaderCell>
{visibleRealColumns.map(col => ( {visibleRealColumns.map(col => (

View File

@@ -29,7 +29,7 @@ export function countColumnSizes(loadedRows, columns, containerWidth, display) {
context.font = 'bold 14px Helvetica'; context.font = 'bold 14px Helvetica';
let text = column.headerText; let text = column.headerText;
let headerWidth = context.measureText(text).width + 32; let headerWidth = context.measureText(text).width + 50;
// if (column.columnClientObject != null && column.columnClientObject.icon != null) headerWidth += 16; // if (column.columnClientObject != null && column.columnClientObject.icon != null) headerWidth += 16;
// if (this.getFilterOnColumn(column.uniquePath)) headerWidth += 16; // if (this.getFilterOnColumn(column.uniquePath)) headerWidth += 16;

View File

@@ -8,6 +8,7 @@ import databaseAppObject from '../appobj/databaseAppObject';
import { useSetCurrentDatabase, useCurrentDatabase } from '../utility/globalState'; import { useSetCurrentDatabase, useCurrentDatabase } from '../utility/globalState';
import tableAppObject from '../appobj/tableAppObject'; import tableAppObject from '../appobj/tableAppObject';
import theme from '../theme'; import theme from '../theme';
import InlineButton from './InlineButton';
const SearchBoxWrapper = styled.div` const SearchBoxWrapper = styled.div`
display: flex; display: flex;
@@ -38,13 +39,6 @@ const InnerContainer = styled.div`
width: ${theme.leftPanel.width}px; width: ${theme.leftPanel.width}px;
`; `;
const Button = styled.button`
// -webkit-appearance: none;
// -moz-appearance: none;
// appearance: none;
// width: 50px;
`;
const Input = styled.input` const Input = styled.input`
flex: 1; flex: 1;
min-width: 90px; min-width: 90px;
@@ -76,7 +70,7 @@ function ConnectionList() {
<> <>
<SearchBoxWrapper> <SearchBoxWrapper>
<Input type="text" placeholder="Search connection" value={filter} onChange={e => setFilter(e.target.value)} /> <Input type="text" placeholder="Search connection" value={filter} onChange={e => setFilter(e.target.value)} />
<Button>Refresh</Button> <InlineButton>Refresh</InlineButton>
</SearchBoxWrapper> </SearchBoxWrapper>
<InnerContainer> <InnerContainer>
@@ -102,7 +96,7 @@ function SqlObjectList({ conid, database }) {
value={filter} value={filter}
onChange={e => setFilter(e.target.value)} onChange={e => setFilter(e.target.value)}
/> />
<Button>Refresh</Button> <InlineButton>Refresh</InlineButton>
</SearchBoxWrapper> </SearchBoxWrapper>
<InnerContainer> <InnerContainer>
<AppObjectList <AppObjectList

View File

@@ -0,0 +1,18 @@
import React from 'react';
import { showMenu } from '../modals/DropDownMenu';
import InlineButton from './InlineButton';
export default function DropDownButton({ children }) {
const buttonRef = React.useRef(null);
const handleShowMenu = () => {
const rect = buttonRef.current.getBoundingClientRect();
showMenu(rect.left, rect.bottom, children);
};
return (
<InlineButton buttonRef={buttonRef} onClick={handleShowMenu} square>
<i className="fas fa-chevron-down" />
</InlineButton>
);
}

View File

@@ -0,0 +1,86 @@
// @ts-nocheck
import React from 'react';
import styled from 'styled-components';
import theme from '../theme';
const ButtonDiv = styled.div`
//box-shadow: 3px 4px 0px 0px #899599;
background: linear-gradient(to bottom, #ededed 5%, #bab1ba 100%);
background-color: #ededed;
//border-radius: 15px;
border: 1px solid #bbb;
display: inline-block;
cursor: pointer;
// color: #3a8a9e;
// color: gray;
// font-family: Arial;
vertical-align: middle;
color: black;
font-size: 12px;
padding: 3px;
margin: 0;
// padding: 7px 25px;
text-decoration: none;
// text-shadow: 0px 1px 0px #e1e2ed;
&:hover {
border: 1px solid #777;
}
&:active:hover {
background: linear-gradient(to bottom, #bab1ba 5%, #ededed 100%);
background-color: #bab1ba;
}
display: flex;
${props =>
props.square &&
`
width: 18px;
`}
`;
const InnerDiv = styled.div`
margin: auto;
flex: 1;
text-align: center;
`;
// ${props =>
// !props.disabled &&
// `
// &:hover {
// background-color: #286090;
// }
// &:active:hover {
// background-color: #204d74;
// }
// `}
// ${props =>
// props.disabled &&
// `
// background-color: #ccc;
// color: gray;
// `}
export default function InlineButton({
children,
onClick = undefined,
buttonRef = undefined,
disabled = undefined,
square = false,
}) {
return (
<ButtonDiv
className="buttonLike"
ref={buttonRef}
onClick={() => {
if (!disabled && onClick) onClick();
}}
disabled={disabled}
square={square}
>
<InnerDiv>{children}</InnerDiv>
</ButtonDiv>
);
}

View File

@@ -1,11 +1,7 @@
// @ts-nocheck // @ts-nocheck
import ReactDOM from 'react-dom';
import React from 'react'; import React from 'react';
import useModalState from '../modals/useModalState';
import ConnectionModal from '../modals/ConnectionModal';
import styled from 'styled-components'; import styled from 'styled-components';
import theme from '../theme'; import theme from '../theme';
import { useOpenedTabs } from '../utility/globalState';
const ButtonDiv = styled.div` const ButtonDiv = styled.div`
// height: ${theme.toolBar.height - 5}px; // height: ${theme.toolBar.height - 5}px;