diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 1797888b0..b7c781bdb 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -95,6 +95,20 @@ registerCommand({ }, }); +registerCommand({ + id: 'new.freetable', + category: 'New', + icon: 'img markdown', + name: 'Free table editor', + onClick: () => { + openNewTab({ + title: 'Data #', + icon: 'img free-table', + tabComponent: 'FreeTableTab', + }); + }, +}); + export function registerFileCommands({ idPrefix, category, diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 52e95ead8..2f48cd3bc 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -13,7 +13,7 @@ keyText: 'F5', toolbar: true, icon: 'icon reload', - enabledStore: derived(currentDataGrid, grid => grid?.getDisplay().supportsReload), + enabledStore: derived(currentDataGrid, grid => grid?.getDisplay()?.supportsReload), onClick: () => get(currentDataGrid).refresh(), }); @@ -24,7 +24,10 @@ keyText: 'Ctrl+S', toolbar: true, icon: 'icon save', - enabledStore: derived(currentDataGridChangeSet, (changeSet: any) => changeSetContainsChanges(changeSet?.value)), + enabledStore: derived( + [currentDataGrid, currentDataGridChangeSet], + ([grid, changeSet]) => grid?.getGeneralAllowSave() || changeSetContainsChanges((changeSet as any)?.value) + ), onClick: () => get(currentDataGrid).save(), }); @@ -194,6 +197,7 @@ export let isLoadedAll; export let loadedTime; export let changeSetStore; + export let generalAllowSave = false; const wheelRowCount = 5; const instance = get_current_component(); @@ -325,6 +329,10 @@ } } + export function getGeneralAllowSave() { + return generalAllowSave; + } + $: autofillMarkerCell = selectedCells && selectedCells.length > 0 && _.uniq(selectedCells.map(x => x[0])).length == 1 ? [_.max(selectedCells.map(x => x[0])), _.max(selectedCells.map(x => x[1]))] diff --git a/packages/web/src/forms/FormArchiveFolderSelect.svelte b/packages/web/src/forms/FormArchiveFolderSelect.svelte new file mode 100644 index 000000000..313c63103 --- /dev/null +++ b/packages/web/src/forms/FormArchiveFolderSelect.svelte @@ -0,0 +1,52 @@ + + + diff --git a/packages/web/src/forms/FormSelectField.svelte b/packages/web/src/forms/FormSelectField.svelte index 34e5555b2..a97a8b4c4 100644 --- a/packages/web/src/forms/FormSelectField.svelte +++ b/packages/web/src/forms/FormSelectField.svelte @@ -10,5 +10,5 @@ - + diff --git a/packages/web/src/forms/FormSelectFieldRaw.svelte b/packages/web/src/forms/FormSelectFieldRaw.svelte index d43ac5adc..1ff62105c 100644 --- a/packages/web/src/forms/FormSelectFieldRaw.svelte +++ b/packages/web/src/forms/FormSelectFieldRaw.svelte @@ -1,6 +1,9 @@ + + + + Save to archive + + + + + + + + + diff --git a/packages/web/src/modals/modalTools.ts b/packages/web/src/modals/modalTools.ts index dcfd7793b..83bdee52f 100644 --- a/packages/web/src/modals/modalTools.ts +++ b/packages/web/src/modals/modalTools.ts @@ -1,4 +1,5 @@ import { openedModals } from '../stores'; +import { get } from 'svelte/store'; import uuidv1 from 'uuid/v1'; import _ from 'lodash'; @@ -12,5 +13,10 @@ export function closeModal(modalId) { } export function closeCurrentModal() { - openedModals.update(x => _.dropRight(x)); + openedModals.update(modals => modals.slice(0, modals.length - 1)); +} + +export function getActiveModalId() { + const modals = get(openedModals); + return modals[modals.length - 1]?.modalId; } diff --git a/packages/web/src/tabs/FreeTableTab.svelte b/packages/web/src/tabs/FreeTableTab.svelte index 445fcd7b3..4cbb2fd9e 100644 --- a/packages/web/src/tabs/FreeTableTab.svelte +++ b/packages/web/src/tabs/FreeTableTab.svelte @@ -4,13 +4,18 @@ import LoadingInfo from '../elements/LoadingInfo.svelte'; import FreeTableGrid from '../freetable/FreeTableGrid.svelte'; + import { showModal } from '../modals/modalTools'; + import SaveArchiveModal from '../modals/SaveArchiveModal.svelte'; import useEditorData from '../query/useEditorData'; import axiosInstance from '../utility/axiosInstance'; + import { changeTab } from '../utility/common'; import createUndoReducer from '../utility/createUndoReducer'; import useGridConfig from '../utility/useGridConfig'; export let tabid; export let initialArgs; + export let archiveFolder; + export let archiveFile; const config = useGridConfig(tabid); const [modelState, dispatchModel] = createUndoReducer(createFreeTableModel()); @@ -31,7 +36,22 @@ $: setEditorData($modelState.value); - function handleSave() {} + function handleSave() { + showModal(SaveArchiveModal, { + folder: archiveFolder, + file: archiveFile, + onSave: doSave, + }); + } + + const doSave = async (folder, file) => { + await axiosInstance.post('archive/save-free-table', { folder, file, data: $modelState.value }); + changeTab(tabid, tab => ({ + ...tab, + title: file, + props: { archiveFile: file, archiveFolder: folder }, + })); + }; {#if isLoading} @@ -45,5 +65,7 @@ modelState={$modelState} {dispatchModel} onSave={handleSave} + generalAllowSave + focusOnVisible /> {/if}