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}