diff --git a/packages/web/src/appobj/ArchiveFileAppObject.js b/packages/web/src/appobj/ArchiveFileAppObject.js index 686655964..b88f36d6f 100644 --- a/packages/web/src/appobj/ArchiveFileAppObject.js +++ b/packages/web/src/appobj/ArchiveFileAppObject.js @@ -35,7 +35,7 @@ function Menu({ data, setOpenedTabs }) { icon: 'img archive', tabComponent: 'FreeTableTab', props: { - initialData: { + initialArgs: { functionName: 'archiveReader', props: { fileName: data.fileName, diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.js b/packages/web/src/appobj/DatabaseObjectAppObject.js index 02eab3ffb..5c26173f9 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.js +++ b/packages/web/src/appobj/DatabaseObjectAppObject.js @@ -146,7 +146,7 @@ function Menu({ data }) { icon: 'img free-table', tabComponent: 'FreeTableTab', props: { - initialData: { + initialArgs: { functionName: 'tableReader', props: { connection: { diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index a2c1b10a0..2d3cf6146 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -324,19 +324,21 @@ export default function DataGridCore(props) { const handleOpenFreeTable = () => { const columns = getSelectedColumns(); const rows = getSelectedRowData().map((row) => _.pickBy(row, (v, col) => columns.find((x) => x.columnName == col))); - openNewTab(setOpenedTabs, { - title: 'selection', - icon: 'img free-table', - tabComponent: 'FreeTableTab', - props: { - initialData: { - structure: { - columns, - }, - rows, - }, + openNewTab( + setOpenedTabs, + { + title: 'selection', + icon: 'img free-table', + tabComponent: 'FreeTableTab', + props: {}, }, - }); + { + structure: { + columns, + }, + rows, + } + ); }; const handleContextMenu = (event) => { diff --git a/packages/web/src/tabs/FreeTableTab.js b/packages/web/src/tabs/FreeTableTab.js index d6af083d1..6c86c3cc4 100644 --- a/packages/web/src/tabs/FreeTableTab.js +++ b/packages/web/src/tabs/FreeTableTab.js @@ -1,9 +1,7 @@ import React from 'react'; -import { createGridCache, createChangeSet, createGridConfig, createFreeTableModel } from 'dbgate-datalib'; +import { createFreeTableModel } from 'dbgate-datalib'; import useUndoReducer from '../utility/useUndoReducer'; -import usePropsCompare from '../utility/usePropsCompare'; -import { useSetOpenedTabs, useUpdateDatabaseForTab } from '../utility/globalState'; -import TableDataGrid from '../datagrid/TableDataGrid'; +import { useSetOpenedTabs } from '../utility/globalState'; import useGridConfig from '../utility/useGridConfig'; import FreeTableGrid from '../freetable/FreeTableGrid'; import SaveArchiveModal from '../modals/SaveArchiveModal'; @@ -12,46 +10,28 @@ import axios from '../utility/axios'; import LoadingInfo from '../widgets/LoadingInfo'; import { changeTab } from '../utility/common'; import ErrorInfo from '../widgets/ErrorInfo'; +import useEditorData from '../utility/useEditorData'; -export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, toolbarPortalRef, tabid, initialData }) { +export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, toolbarPortalRef, tabid, initialArgs }) { const [config, setConfig] = useGridConfig(tabid); const [modelState, dispatchModel] = useUndoReducer(createFreeTableModel()); - const storageKey = `tabdata_freetable_${tabid}`; const saveFileModalState = useModalState(); const setOpenedTabs = useSetOpenedTabs(); - const [isLoading, setIsLoading] = React.useState(false); - const [errorMessage, setErrorMessage] = React.useState(null); - - const handleLoadInitialData = async () => { - setIsLoading(true); - try { - const resp = await axios.post('runners/load-reader', initialData); - // @ts-ignore - dispatchModel({ type: 'reset', value: resp.data }); - setIsLoading(false); - } catch (err) { - setIsLoading(false); - const errorMessage = (err && err.response && err.response.data && err.response.data.error) || 'Loading failed'; - setErrorMessage(errorMessage); - console.error(err.response); - } - }; + const { initialData, setEditorData, errorMessage, isLoading } = useEditorData({ + tabid, + loadFromArgs: + initialArgs && initialArgs.functionName + ? () => axios.post('runners/load-reader', initialArgs).then((x) => x.data) + : null, + }); React.useEffect(() => { - const existingData = localStorage.getItem(storageKey); - if (existingData) { - const value = JSON.parse(existingData); - // @ts-ignore - dispatchModel({ type: 'reset', value }); - } else if (initialData) { - if (initialData.functionName) handleLoadInitialData(); - // @ts-ignore - else dispatchModel({ type: 'reset', value: initialData }); - } - }, []); + // @ts-ignore + if (initialData) dispatchModel({ type: 'reset', value: initialData }); + }, [initialData]); React.useEffect(() => { - localStorage.setItem(storageKey, JSON.stringify(modelState.value)); + setEditorData(modelState.value); }, [modelState]); const handleSave = async (folder, file) => { @@ -81,12 +61,7 @@ export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, to toolbarPortalRef={toolbarPortalRef} onSave={() => saveFileModalState.open()} /> - + ); } diff --git a/packages/web/src/utility/useEditorData.js b/packages/web/src/utility/useEditorData.js index 156c3058e..2e200d863 100644 --- a/packages/web/src/utility/useEditorData.js +++ b/packages/web/src/utility/useEditorData.js @@ -4,26 +4,35 @@ import localforage from 'localforage'; import { changeTab } from './common'; import { useSetOpenedTabs } from './globalState'; -export default function useEditorData({ tabid, loadFromArgs }) { +export default function useEditorData({ tabid, loadFromArgs = null }) { const localStorageKey = `tabdata_${tabid}`; const setOpenedTabs = useSetOpenedTabs(); const changeCounterRef = React.useRef(0); const savedCounterRef = React.useRef(0); + const [errorMessage, setErrorMessage] = React.useState(null); const [value, setValue] = React.useState(null); const [isLoading, setIsLoading] = React.useState(true); + const initialDataRef = React.useRef(null); const valueRef = React.useRef(null); const initialLoad = async () => { if (loadFromArgs) { - const init = await loadFromArgs(); - changeTab(tabid, setOpenedTabs, (tab) => ({ - ...tab, - props: _.omit(tab.props, ['initialArgs']), - })); - setValue(init); - valueRef.current = init; + try { + const init = await loadFromArgs(); + changeTab(tabid, setOpenedTabs, (tab) => ({ + ...tab, + props: _.omit(tab.props, ['initialArgs']), + })); + setValue(init); + valueRef.current = init; + initialDataRef.current = init; + } catch (err) { + const message = (err && err.response && err.response.data && err.response.data.error) || 'Loading failed'; + setErrorMessage(message); + console.error(err.response); + } } else { const initFallback = localStorage.getItem(localStorageKey); if (initFallback != null) { @@ -33,11 +42,13 @@ export default function useEditorData({ tabid, loadFromArgs }) { // move to local forage await localforage.setItem(localStorageKey, init); localStorage.removeItem(localStorageKey); + initialDataRef.current = init; } else { const init = await localforage.getItem(localStorageKey); if (init) { setValue(init); valueRef.current = init; + initialDataRef.current = init; } } } @@ -82,5 +93,11 @@ export default function useEditorData({ tabid, loadFromArgs }) { }; }, []); - return { editorData: value, setEditorData: handleChange, isLoading }; + return { + editorData: value, + setEditorData: handleChange, + isLoading, + initialData: initialDataRef.current, + errorMessage, + }; }