mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-01 12:03:58 +00:00
filter tables
This commit is contained in:
@@ -9,23 +9,25 @@ const SubItemsDiv = styled.div`
|
|||||||
margin-left: 16px;
|
margin-left: 16px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const ExpandIconHolder = styled.span`
|
const ExpandIconHolder2 = styled.span`
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -3px;
|
top: -3px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// function ExpandIcon({ isBlank, isExpanded, isHover }) {
|
const ExpandIconHolder = styled.span`
|
||||||
// if (column.foreignKey) {
|
margin-right: 5px;
|
||||||
// return (
|
`;
|
||||||
// <FontIcon
|
|
||||||
// icon={`far ${isExpanded ? 'fa-minus-square' : 'fa-plus-square'} `}
|
const GroupDiv = styled.div`
|
||||||
// {...other}
|
padding: 5px;
|
||||||
// />
|
&:hover {
|
||||||
// );
|
background-color: lightblue;
|
||||||
// }
|
}
|
||||||
// return <FontIcon icon={`fas fa-square ${isHover ? 'lightblue' : 'white'}`} {...other} />;
|
cursor: pointer;
|
||||||
// }
|
white-space: nowrap;
|
||||||
|
font-weight: bold;
|
||||||
|
`;
|
||||||
|
|
||||||
function AppObjectListItem({ makeAppObj, data, filter, appobj, onObjectClick, SubItems }) {
|
function AppObjectListItem({ makeAppObj, data, filter, appobj, onObjectClick, SubItems }) {
|
||||||
const [isExpanded, setIsExpanded] = React.useState(false);
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
||||||
@@ -47,9 +49,9 @@ function AppObjectListItem({ makeAppObj, data, filter, appobj, onObjectClick, Su
|
|||||||
onMouseLeave={() => setIsHover(false)}
|
onMouseLeave={() => setIsHover(false)}
|
||||||
prefix={
|
prefix={
|
||||||
SubItems ? (
|
SubItems ? (
|
||||||
<ExpandIconHolder>
|
<ExpandIconHolder2>
|
||||||
<ExpandIcon isSelected={isHover} isExpanded={isExpanded} />
|
<ExpandIcon isSelected={isHover} isExpanded={isExpanded} />
|
||||||
</ExpandIconHolder>
|
</ExpandIconHolder2>
|
||||||
) : null
|
) : null
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
@@ -67,26 +69,64 @@ function AppObjectListItem({ makeAppObj, data, filter, appobj, onObjectClick, Su
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function AppObjectGroup({ group, items }) {
|
||||||
|
const [isExpanded, setIsExpanded] = React.useState(true);
|
||||||
|
const [isHover, setIsHover] = React.useState(false);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<GroupDiv
|
||||||
|
onMouseEnter={() => setIsHover(true)}
|
||||||
|
onMouseLeave={() => setIsHover(false)}
|
||||||
|
onClick={() => setIsExpanded(!isExpanded)}
|
||||||
|
>
|
||||||
|
<ExpandIconHolder>
|
||||||
|
<ExpandIcon isSelected={isHover} isExpanded={isExpanded} />
|
||||||
|
</ExpandIconHolder>
|
||||||
|
{group} {items && `(${items.length})`}
|
||||||
|
</GroupDiv>
|
||||||
|
{isExpanded && items.map(x => x.component)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function AppObjectList({
|
export function AppObjectList({
|
||||||
list,
|
list,
|
||||||
makeAppObj,
|
makeAppObj,
|
||||||
SubItems = undefined,
|
SubItems = undefined,
|
||||||
onObjectClick = undefined,
|
onObjectClick = undefined,
|
||||||
filter = undefined,
|
filter = undefined,
|
||||||
|
groupFunc = undefined,
|
||||||
|
groupOrdered = undefined,
|
||||||
}) {
|
}) {
|
||||||
const setOpenedTabs = useSetOpenedTabs();
|
const setOpenedTabs = useSetOpenedTabs();
|
||||||
|
|
||||||
|
const createComponent = (data, appobj) => (
|
||||||
|
<AppObjectListItem
|
||||||
|
key={appobj.key}
|
||||||
|
appobj={appobj}
|
||||||
|
makeAppObj={makeAppObj}
|
||||||
|
data={data}
|
||||||
|
filter={filter}
|
||||||
|
onObjectClick={onObjectClick}
|
||||||
|
SubItems={SubItems}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
if (groupFunc) {
|
||||||
|
const listGrouped = (list || []).map(data => {
|
||||||
|
const appobj = makeAppObj(data, { setOpenedTabs });
|
||||||
|
const component = createComponent(data, appobj);
|
||||||
|
const group = groupFunc(appobj);
|
||||||
|
return { group, appobj, component };
|
||||||
|
});
|
||||||
|
const groups = _.groupBy(listGrouped, 'group');
|
||||||
|
return (groupOrdered || _.keys(groups)).map(group => (
|
||||||
|
<AppObjectGroup key={group} group={group} items={groups[group]} />
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
return (list || []).map(data => {
|
return (list || []).map(data => {
|
||||||
const appobj = makeAppObj(data, { setOpenedTabs });
|
const appobj = makeAppObj(data, { setOpenedTabs });
|
||||||
return (
|
return createComponent(data, appobj);
|
||||||
<AppObjectListItem
|
|
||||||
key={appobj.key}
|
|
||||||
appobj={appobj}
|
|
||||||
makeAppObj={makeAppObj}
|
|
||||||
data={data}
|
|
||||||
filter={filter}
|
|
||||||
onObjectClick={onObjectClick}
|
|
||||||
SubItems={SubItems}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,14 @@ import { DropDownMenuItem } from '../modals/DropDownMenu';
|
|||||||
import { openNewTab } from '../utility/common';
|
import { openNewTab } from '../utility/common';
|
||||||
import getConnectionInfo from '../utility/getConnectionInfo';
|
import getConnectionInfo from '../utility/getConnectionInfo';
|
||||||
import fullDisplayName from '../utility/fullDisplayName';
|
import fullDisplayName from '../utility/fullDisplayName';
|
||||||
|
import { filterName } from '@dbgate/datalib';
|
||||||
|
|
||||||
async function openTableDetail(setOpenedTabs, tabComponent, { schemaName, pureName, conid, database }) {
|
async function openTableDetail(setOpenedTabs, tabComponent, { schemaName, pureName, conid, database }) {
|
||||||
const connection = await getConnectionInfo(conid);
|
const connection = await getConnectionInfo(conid);
|
||||||
const tooltip = `${connection.displayName || connection.server}\n${database}\n${fullDisplayName({schemaName, pureName})}`;
|
const tooltip = `${connection.displayName || connection.server}\n${database}\n${fullDisplayName({
|
||||||
|
schemaName,
|
||||||
|
pureName,
|
||||||
|
})}`;
|
||||||
|
|
||||||
openNewTab(setOpenedTabs, {
|
openNewTab(setOpenedTabs, {
|
||||||
title: pureName,
|
title: pureName,
|
||||||
@@ -54,6 +58,7 @@ export default function tableAppObject({ conid, database, pureName, schemaName }
|
|||||||
database,
|
database,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
const matcher = filter => filterName(filter, pureName);
|
||||||
|
|
||||||
return { title, key, Icon, Menu, onClick };
|
return { title, key, Icon, Menu, onClick, matcher };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,9 +91,21 @@ function SqlObjectList({ conid, database }) {
|
|||||||
reloadTrigger: `database-structure-changed-${conid}-${database}`,
|
reloadTrigger: `database-structure-changed-${conid}-${database}`,
|
||||||
});
|
});
|
||||||
const { tables } = objects || {};
|
const { tables } = objects || {};
|
||||||
|
const [filter, setFilter] = React.useState('');
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<AppObjectList list={(tables || []).map(x => ({ ...x, conid, database }))} makeAppObj={tableAppObject} />
|
<SearchBoxWrapper>
|
||||||
|
<Input type="text" placeholder="Search tables or objects" value={filter} onChange={e => setFilter(e.target.value)} />
|
||||||
|
<Button>Refresh</Button>
|
||||||
|
</SearchBoxWrapper>
|
||||||
|
<InnerContainer>
|
||||||
|
<AppObjectList
|
||||||
|
list={(tables || []).map(x => ({ ...x, conid, database }))}
|
||||||
|
makeAppObj={tableAppObject}
|
||||||
|
groupFunc={appobj => 'Tables'}
|
||||||
|
filter={filter}
|
||||||
|
/>
|
||||||
|
</InnerContainer>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user