mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-03 21:03:59 +00:00
search - better work with focus, unified component
This commit is contained in:
@@ -6,6 +6,7 @@ import { ExpandIcon } from '../icons';
|
|||||||
import InlineButton from '../widgets/InlineButton';
|
import InlineButton from '../widgets/InlineButton';
|
||||||
import { ManagerInnerContainer } from './ManagerStyles';
|
import { ManagerInnerContainer } from './ManagerStyles';
|
||||||
import SearchInput from '../widgets/SearchInput';
|
import SearchInput from '../widgets/SearchInput';
|
||||||
|
import { WidgetTitle } from '../widgets/WidgetStyles';
|
||||||
|
|
||||||
const Wrapper = styled.div``;
|
const Wrapper = styled.div``;
|
||||||
|
|
||||||
@@ -87,10 +88,18 @@ function ColumnManagerRow(props) {
|
|||||||
export default function ColumnManager(props) {
|
export default function ColumnManager(props) {
|
||||||
const { display } = props;
|
const { display } = props;
|
||||||
const [columnFilter, setColumnFilter] = React.useState('');
|
const [columnFilter, setColumnFilter] = React.useState('');
|
||||||
|
const inputRef = React.useRef(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<WidgetTitle inputRef={inputRef}>Columns</WidgetTitle>
|
||||||
<SearchBoxWrapper>
|
<SearchBoxWrapper>
|
||||||
<SearchInput placeholder="Search" filter={columnFilter} setFilter={setColumnFilter} />
|
<SearchInput
|
||||||
|
placeholder="Search columns"
|
||||||
|
filter={columnFilter}
|
||||||
|
setFilter={setColumnFilter}
|
||||||
|
inputRef={inputRef}
|
||||||
|
/>
|
||||||
<InlineButton onClick={() => display.hideAllColumns()}>Hide</InlineButton>
|
<InlineButton onClick={() => display.hideAllColumns()}>Hide</InlineButton>
|
||||||
<InlineButton onClick={() => display.showAllColumns()}>Show</InlineButton>
|
<InlineButton onClick={() => display.showAllColumns()}>Show</InlineButton>
|
||||||
</SearchBoxWrapper>
|
</SearchBoxWrapper>
|
||||||
|
|||||||
@@ -47,12 +47,10 @@ export default function DataGrid(props) {
|
|||||||
<LeftContainer>
|
<LeftContainer>
|
||||||
<ManagerMainContainer>
|
<ManagerMainContainer>
|
||||||
<Container1>
|
<Container1>
|
||||||
<WidgetTitle>Columns</WidgetTitle>
|
|
||||||
<ColumnManager {...props} />
|
<ColumnManager {...props} />
|
||||||
</Container1>
|
</Container1>
|
||||||
{props.showReferences && (
|
{props.showReferences && (
|
||||||
<ManagerOuterContainer2>
|
<ManagerOuterContainer2>
|
||||||
<WidgetTitle>References</WidgetTitle>
|
|
||||||
<ReferenceManager {...props} />
|
<ReferenceManager {...props} />
|
||||||
</ManagerOuterContainer2>
|
</ManagerOuterContainer2>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { ManagerInnerContainer } from './ManagerStyles';
|
|||||||
import { LinkIcon, ReferenceIcon } from '../icons';
|
import { LinkIcon, ReferenceIcon } from '../icons';
|
||||||
import SearchInput from '../widgets/SearchInput';
|
import SearchInput from '../widgets/SearchInput';
|
||||||
import { filterName } from '@dbgate/datalib';
|
import { filterName } from '@dbgate/datalib';
|
||||||
|
import { WidgetTitle } from '../widgets/WidgetStyles';
|
||||||
|
|
||||||
const SearchBoxWrapper = styled.div`
|
const SearchBoxWrapper = styled.div`
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -46,11 +47,13 @@ export default function ReferenceManager(props) {
|
|||||||
const { baseTable } = display || {};
|
const { baseTable } = display || {};
|
||||||
const { foreignKeys } = baseTable || {};
|
const { foreignKeys } = baseTable || {};
|
||||||
const { dependencies } = baseTable || {};
|
const { dependencies } = baseTable || {};
|
||||||
|
const inputRef = React.useRef(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<WidgetTitle inputRef={inputRef}>References</WidgetTitle>
|
||||||
<SearchBoxWrapper>
|
<SearchBoxWrapper>
|
||||||
<SearchInput placeholder="Search" filter={filter} setFilter={setFilter} />
|
<SearchInput placeholder="Search references" filter={filter} setFilter={setFilter} inputRef={inputRef} />
|
||||||
</SearchBoxWrapper>
|
</SearchBoxWrapper>
|
||||||
<ManagerInnerContainer>
|
<ManagerInnerContainer>
|
||||||
{foreignKeys && foreignKeys.length > 0 && (
|
{foreignKeys && foreignKeys.length > 0 && (
|
||||||
|
|||||||
@@ -58,13 +58,14 @@ function ConnectionList() {
|
|||||||
axios.post('server-connections/refresh', { conid });
|
axios.post('server-connections/refresh', { conid });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const inputRef = React.useRef(null);
|
||||||
|
|
||||||
const [filter, setFilter] = React.useState('');
|
const [filter, setFilter] = React.useState('');
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<WidgetTitle>Connections</WidgetTitle>
|
<WidgetTitle inputRef={inputRef}>Connections</WidgetTitle>
|
||||||
<SearchBoxWrapper>
|
<SearchBoxWrapper>
|
||||||
<SearchInput placeholder="Search connection" filter={filter} setFilter={setFilter} />
|
<SearchInput placeholder="Search connection" filter={filter} setFilter={setFilter} inputRef={inputRef} />
|
||||||
<InlineButton onClick={handleRefreshConnections}>Refresh</InlineButton>
|
<InlineButton onClick={handleRefreshConnections}>Refresh</InlineButton>
|
||||||
</SearchBoxWrapper>
|
</SearchBoxWrapper>
|
||||||
|
|
||||||
@@ -94,11 +95,12 @@ function SqlObjectList({ conid, database }) {
|
|||||||
((objects || {})[objectTypeField] || []).map((obj) => ({ ...obj, objectTypeField }))
|
((objects || {})[objectTypeField] || []).map((obj) => ({ ...obj, objectTypeField }))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
const inputRef = React.useRef(null);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<WidgetTitle>Tables, views, functions</WidgetTitle>
|
<WidgetTitle inputRef={inputRef}>Tables, views, functions</WidgetTitle>
|
||||||
<SearchBoxWrapper>
|
<SearchBoxWrapper>
|
||||||
<SearchInput placeholder="Search tables or objects" filter={filter} setFilter={setFilter} />
|
<SearchInput inputRef={inputRef} placeholder="Search tables or objects" filter={filter} setFilter={setFilter} />
|
||||||
<InlineButton onClick={handleRefreshDatabase}>Refresh</InlineButton>
|
<InlineButton onClick={handleRefreshDatabase}>Refresh</InlineButton>
|
||||||
</SearchBoxWrapper>
|
</SearchBoxWrapper>
|
||||||
<WidgetsInnerContainer>
|
<WidgetsInnerContainer>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ const StyledInput = styled.input`
|
|||||||
min-width: 90px;
|
min-width: 90px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default function SearchInput({ placeholder, filter, setFilter }) {
|
export default function SearchInput({ placeholder, filter, setFilter, inputRef = undefined }) {
|
||||||
const handleKeyDown = (ev) => {
|
const handleKeyDown = (ev) => {
|
||||||
if (ev.keyCode == keycodes.escape) {
|
if (ev.keyCode == keycodes.escape) {
|
||||||
setFilter('');
|
setFilter('');
|
||||||
@@ -15,6 +15,7 @@ export default function SearchInput({ placeholder, filter, setFilter }) {
|
|||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<StyledInput
|
<StyledInput
|
||||||
|
ref={inputRef}
|
||||||
type="text"
|
type="text"
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
value={filter}
|
value={filter}
|
||||||
|
|||||||
@@ -48,10 +48,22 @@ export function WidgetsInnerContainer({ children }) {
|
|||||||
// min-width: 90px;
|
// min-width: 90px;
|
||||||
// `;
|
// `;
|
||||||
|
|
||||||
export const WidgetTitle = styled.div`
|
const StyledWidgetTitle = styled.div`
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
background-color: gray;
|
background-color: gray;
|
||||||
// background-color: #CEC;
|
// background-color: #CEC;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export function WidgetTitle({ children, inputRef = undefined }) {
|
||||||
|
return (
|
||||||
|
<StyledWidgetTitle
|
||||||
|
onClick={() => {
|
||||||
|
if (inputRef && inputRef.current) inputRef.current.focus();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</StyledWidgetTitle>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user