files widget refactor

This commit is contained in:
Jan Prochazka
2020-12-30 17:11:59 +01:00
parent 351ac5e6a7
commit 99ab1b38cd
5 changed files with 115 additions and 70 deletions

View File

@@ -205,6 +205,45 @@ export function SavedChartFileAppObject({ data, commonProps }) {
);
}
export function SavedQueryFileAppObject({ data, commonProps }) {
const { file, folder } = data;
const openNewTab = useOpenNewTab();
const currentDatabase = useCurrentDatabase();
const connection = _.get(currentDatabase, 'connection') || {};
const database = _.get(currentDatabase, 'name');
const tooltip = `${connection.displayName || connection.server}\n${database}`;
return (
<SavedFileAppObjectBase
data={data}
commonProps={commonProps}
format="json"
icon="img query-design"
onLoad={(data) => {
openNewTab(
{
title: file,
icon: 'img query-design',
tooltip,
props: {
conid: connection._id,
database,
savedFile: file,
savedFolder: 'query',
savedFormat: 'json',
},
tabComponent: 'QueryDesignTab',
},
{ editor: data }
);
}}
/>
);
}
export function SavedMarkdownFileAppObject({ data, commonProps }) {
const { file, folder } = data;
const openNewTab = useOpenNewTab();
@@ -247,7 +286,29 @@ export function SavedMarkdownFileAppObject({ data, commonProps }) {
);
}
[SavedSqlFileAppObject, SavedShellFileAppObject, SavedChartFileAppObject, SavedMarkdownFileAppObject].forEach((fn) => {
export function SavedFileAppObject({ data, commonProps }) {
const { folder } = data;
const folderTypes = {
sql: SavedSqlFileAppObject,
shell: SavedShellFileAppObject,
charts: SavedChartFileAppObject,
markdown: SavedMarkdownFileAppObject,
query: SavedQueryFileAppObject,
};
const AppObject = folderTypes[folder];
if (AppObject) {
return <AppObject data={data} commonProps={commonProps} />;
}
return null;
}
[
SavedSqlFileAppObject,
SavedShellFileAppObject,
SavedChartFileAppObject,
SavedMarkdownFileAppObject,
SavedFileAppObject,
].forEach((fn) => {
// @ts-ignore
fn.extractKey = (data) => data.file;
});

View File

@@ -105,6 +105,11 @@ const filesLoader = ({ folder }) => ({
params: { folder },
reloadTrigger: `files-changed-${folder}`,
});
const allFilesLoader = () => ({
url: 'files/list-all',
params: {},
reloadTrigger: `all-files-changed`,
});
async function getCore(loader, args) {
const { url, params, reloadTrigger, transform } = loader(args);
@@ -276,6 +281,13 @@ export function useFiles(args) {
return useCore(filesLoader, args);
}
export function getAllFiles(args) {
return getCore(allFilesLoader, args);
}
export function useAllFiles(args) {
return useCore(allFilesLoader, args);
}
export function getFavorites(args) {
return getCore(favoritesLoader, args);
}

View File

@@ -2,92 +2,45 @@ import React from 'react';
import _ from 'lodash';
import { AppObjectList } from '../appobj/AppObjectList';
import { useOpenedTabs } from '../utility/globalState';
import ClosedTabAppObject from '../appobj/ClosedTabAppObject';
import { WidgetsInnerContainer } from './WidgetStyles';
import {
SavedSqlFileAppObject,
SavedShellFileAppObject,
SavedChartFileAppObject,
SavedMarkdownFileAppObject,
} from '../appobj/SavedFileAppObject';
import { SavedFileAppObject } from '../appobj/SavedFileAppObject';
import WidgetColumnBar, { WidgetColumnBarItem } from './WidgetColumnBar';
import { useFiles } from '../utility/metadataLoaders';
import useHasPermission from '../utility/useHasPermission';
function SavedFilesList() {
const sqlFiles = useFiles({ folder: 'sql' });
const shellFiles = useFiles({ folder: 'shell' });
const markdownFiles = useFiles({ folder: 'markdown' });
const chartFiles = useFiles({ folder: 'charts' });
const queryFiles = useFiles({ folder: 'query' });
function SavedSqlFilesList() {
const files = useFiles({ folder: 'sql' });
const files = [
...(sqlFiles || []),
...(shellFiles || []),
...(markdownFiles || []),
...(chartFiles || []),
...(queryFiles || []),
];
return (
<>
<WidgetsInnerContainer>
<AppObjectList list={files} AppObjectComponent={SavedSqlFileAppObject} />
</WidgetsInnerContainer>
</>
);
}
function SavedShellFilesList() {
const files = useFiles({ folder: 'shell' });
return (
<>
<WidgetsInnerContainer>
<AppObjectList list={files} AppObjectComponent={SavedShellFileAppObject} />
</WidgetsInnerContainer>
</>
);
}
function SavedChartFilesList() {
const files = useFiles({ folder: 'charts' });
return (
<>
<WidgetsInnerContainer>
<AppObjectList list={files} AppObjectComponent={SavedChartFileAppObject} />
</WidgetsInnerContainer>
</>
);
}
function SavedMarkdownFilesList() {
const files = useFiles({ folder: 'markdown' });
return (
<>
<WidgetsInnerContainer>
<AppObjectList list={files} AppObjectComponent={SavedMarkdownFileAppObject} />
<AppObjectList
list={files}
AppObjectComponent={SavedFileAppObject}
groupFunc={(data) => _.startCase(data.folder)}
/>
</WidgetsInnerContainer>
</>
);
}
export default function FilesWidget() {
const hasPermission = useHasPermission();
return (
<WidgetColumnBar>
{hasPermission('files/sql/read') && (
<WidgetColumnBarItem title="Saved SQL files" name="sqlFiles" height="15%">
<SavedSqlFilesList />
</WidgetColumnBarItem>
)}
{hasPermission('files/shell/read') && (
<WidgetColumnBarItem title="Saved shell files" name="shellFiles" height="15%">
<SavedShellFilesList />
</WidgetColumnBarItem>
)}
{hasPermission('files/charts/read') && (
<WidgetColumnBarItem title="Saved charts" name="charts" height="15%">
<SavedChartFilesList />
</WidgetColumnBarItem>
)}
{hasPermission('files/markdown/read') && (
<WidgetColumnBarItem title="Saved markdown pages" name="markdown" height="15%">
<SavedMarkdownFilesList />
</WidgetColumnBarItem>
)}
<WidgetColumnBarItem title="Saved files" name="files">
<SavedFilesList />
</WidgetColumnBarItem>
</WidgetColumnBar>
);
}

View File

@@ -47,6 +47,9 @@ export default function WidgetColumnBar({ children }) {
childArray.filter((x) => x && x.props.collapsed).map((x) => x.props.name)
);
const toggleCollapsed = (name) => {
// skip collapse last uncollapsed item
if (!childArray.find((x) => x.props.name != name && !collapsedWidgets.includes(x.props.name))) return;
if (collapsedWidgets.includes(name)) setCollapsedWidgets(collapsedWidgets.filter((x) => x != name));
else setCollapsedWidgets([...collapsedWidgets, name]);
};