mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-02 19:33:59 +00:00
column list in database widget
This commit is contained in:
@@ -107,7 +107,10 @@ module.exports = {
|
|||||||
if (existing) {
|
if (existing) {
|
||||||
existing.subprocess.send({ msgtype: 'ping' });
|
existing.subprocess.send({ msgtype: 'ping' });
|
||||||
}
|
}
|
||||||
return { status: 'ok' };
|
return {
|
||||||
|
status: 'ok',
|
||||||
|
connectionStatus: existing ? existing.status : null,
|
||||||
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
refresh_meta: 'post',
|
refresh_meta: 'post',
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ function start() {
|
|||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
const time = new Date().getTime();
|
const time = new Date().getTime();
|
||||||
if (time - lastPing > 60 * 1000) {
|
if (time - lastPing > 60 * 1000) {
|
||||||
|
console.log('Database connection not alive, exiting');
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
}, 60 * 1000);
|
}, 60 * 1000);
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ function AppObjectListItem({
|
|||||||
isExpandable,
|
isExpandable,
|
||||||
SubItems,
|
SubItems,
|
||||||
getCommonProps,
|
getCommonProps,
|
||||||
|
expandOnClick,
|
||||||
}) {
|
}) {
|
||||||
const [isExpanded, setIsExpanded] = React.useState(false);
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
||||||
|
|
||||||
@@ -51,12 +52,22 @@ function AppObjectListItem({
|
|||||||
let commonProps = {
|
let commonProps = {
|
||||||
prefix: SubItems ? (
|
prefix: SubItems ? (
|
||||||
<ExpandIconHolder2>
|
<ExpandIconHolder2>
|
||||||
{expandable ? <ExpandIcon isExpanded={isExpanded} /> : <ExpandIcon isBlank />}
|
{expandable ? (
|
||||||
|
<ExpandIcon
|
||||||
|
isExpanded={isExpanded}
|
||||||
|
onClick={e => {
|
||||||
|
setIsExpanded(v => !v);
|
||||||
|
e.stopPropagation();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<ExpandIcon isBlank />
|
||||||
|
)}
|
||||||
</ExpandIconHolder2>
|
</ExpandIconHolder2>
|
||||||
) : null,
|
) : null,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (SubItems) {
|
if (SubItems && expandOnClick) {
|
||||||
commonProps.onClick2 = () => setIsExpanded(v => !v);
|
commonProps.onClick2 = () => setIsExpanded(v => !v);
|
||||||
}
|
}
|
||||||
if (onObjectClick) {
|
if (onObjectClick) {
|
||||||
@@ -107,6 +118,7 @@ export function AppObjectList({
|
|||||||
groupOrdered = undefined,
|
groupOrdered = undefined,
|
||||||
isExpandable = undefined,
|
isExpandable = undefined,
|
||||||
getCommonProps = undefined,
|
getCommonProps = undefined,
|
||||||
|
expandOnClick = false,
|
||||||
}) {
|
}) {
|
||||||
const createComponent = data => (
|
const createComponent = data => (
|
||||||
<AppObjectListItem
|
<AppObjectListItem
|
||||||
@@ -118,6 +130,7 @@ export function AppObjectList({
|
|||||||
SubItems={SubItems}
|
SubItems={SubItems}
|
||||||
isExpandable={isExpandable}
|
isExpandable={isExpandable}
|
||||||
getCommonProps={getCommonProps}
|
getCommonProps={getCommonProps}
|
||||||
|
expandOnClick={expandOnClick}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { findEngineDriver } from 'dbgate-tools';
|
|||||||
import useExtensions from '../utility/useExtensions';
|
import useExtensions from '../utility/useExtensions';
|
||||||
import useOpenNewTab from '../utility/useOpenNewTab';
|
import useOpenNewTab from '../utility/useOpenNewTab';
|
||||||
import uuidv1 from 'uuid/v1';
|
import uuidv1 from 'uuid/v1';
|
||||||
|
import { AppObjectList } from './AppObjectList';
|
||||||
|
|
||||||
const icons = {
|
const icons = {
|
||||||
tables: 'img table',
|
tables: 'img table',
|
||||||
|
|||||||
33
packages/web/src/appobj/SubColumnParamList.js
Normal file
33
packages/web/src/appobj/SubColumnParamList.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { findForeignKeyForColumn } from 'dbgate-tools';
|
||||||
|
import React from 'react';
|
||||||
|
import { getColumnIcon } from '../datagrid/ColumnLabel';
|
||||||
|
import { AppObjectCore } from './AppObjectCore';
|
||||||
|
import { AppObjectList } from './AppObjectList';
|
||||||
|
|
||||||
|
function ColumnAppObject({ data, commonProps }) {
|
||||||
|
const { columnName, dataType } = data;
|
||||||
|
return (
|
||||||
|
<AppObjectCore
|
||||||
|
{...commonProps}
|
||||||
|
data={data}
|
||||||
|
title={columnName}
|
||||||
|
extInfo={dataType}
|
||||||
|
icon={getColumnIcon(data, true)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ColumnAppObject.extractKey = ({ columnName }) => columnName;
|
||||||
|
|
||||||
|
export default function SubColumnParamList({ data }) {
|
||||||
|
const { columns } = data;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AppObjectList
|
||||||
|
list={(columns || []).map(col => ({
|
||||||
|
...col,
|
||||||
|
foreignKey: findForeignKeyForColumn(data, col),
|
||||||
|
}))}
|
||||||
|
AppObjectComponent={ColumnAppObject}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -9,11 +9,16 @@ const Label = styled.span`
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export function getColumnIcon(column, forceIcon = false) {
|
||||||
|
if (column.autoIncrement) return 'img autoincrement';
|
||||||
|
if (column.foreignKey) return 'img foreign-key';
|
||||||
|
if (forceIcon) return 'img column';
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/** @param column {import('dbgate-datalib').DisplayColumn|import('dbgate-types').ColumnInfo} */
|
/** @param column {import('dbgate-datalib').DisplayColumn|import('dbgate-types').ColumnInfo} */
|
||||||
export default function ColumnLabel(column) {
|
export default function ColumnLabel(column) {
|
||||||
let icon = column.forceIcon ? 'img column' : null;
|
const icon = getColumnIcon(column, column.forceIcon);
|
||||||
if (column.autoIncrement) icon = 'img autoincrement';
|
|
||||||
if (column.foreignKey) icon = 'img foreign-key';
|
|
||||||
return (
|
return (
|
||||||
<Label {...column}>
|
<Label {...column}>
|
||||||
{icon ? <FontIcon icon={icon} /> : null} {column.headerText || column.columnName}
|
{icon ? <FontIcon icon={icon} /> : null} {column.headerText || column.columnName}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import WidgetColumnBar, { WidgetColumnBarItem } from './WidgetColumnBar';
|
|||||||
import ToolbarButton from './ToolbarButton';
|
import ToolbarButton from './ToolbarButton';
|
||||||
import useShowModal from '../modals/showModal';
|
import useShowModal from '../modals/showModal';
|
||||||
import ConnectionModal from '../modals/ConnectionModal';
|
import ConnectionModal from '../modals/ConnectionModal';
|
||||||
|
import SubColumnParamList from '../appobj/SubColumnParamList';
|
||||||
|
|
||||||
function SubDatabaseList({ data }) {
|
function SubDatabaseList({ data }) {
|
||||||
const setDb = useSetCurrentDatabase();
|
const setDb = useSetCurrentDatabase();
|
||||||
@@ -82,6 +83,7 @@ function ConnectionList() {
|
|||||||
SubItems={SubDatabaseList}
|
SubItems={SubDatabaseList}
|
||||||
filter={filter}
|
filter={filter}
|
||||||
isExpandable={data => openedConnections.includes(data._id)}
|
isExpandable={data => openedConnections.includes(data._id)}
|
||||||
|
expandOnClick
|
||||||
/>
|
/>
|
||||||
{connections && connections.length == 0 && (
|
{connections && connections.length == 0 && (
|
||||||
<ToolbarButton icon="icon new-connection" onClick={showNewConnection}>
|
<ToolbarButton icon="icon new-connection" onClick={showNewConnection}>
|
||||||
@@ -149,6 +151,8 @@ function SqlObjectList({ conid, database }) {
|
|||||||
AppObjectComponent={DatabaseObjectAppObject}
|
AppObjectComponent={DatabaseObjectAppObject}
|
||||||
groupFunc={data => _.startCase(data.objectTypeField)}
|
groupFunc={data => _.startCase(data.objectTypeField)}
|
||||||
filter={filter}
|
filter={filter}
|
||||||
|
SubItems={SubColumnParamList}
|
||||||
|
isExpandable={data => data.objectTypeField == 'tables'}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</WidgetsInnerContainer>
|
</WidgetsInnerContainer>
|
||||||
|
|||||||
Reference in New Issue
Block a user