diff --git a/packages/api/src/controllers/apps.js b/packages/api/src/controllers/apps.js index 94b9f050b..ba2afe587 100644 --- a/packages/api/src/controllers/apps.js +++ b/packages/api/src/controllers/apps.js @@ -265,4 +265,16 @@ module.exports = { return true; }, + + createConfigFile_meta: true, + async createConfigFile({ appFolder, fileName, content }) { + const file = path.join(appdir(), appFolder, fileName); + if (!(await fs.exists(file))) { + await fs.writeFile(file, JSON.stringify(content, undefined, 2)); + socket.emitChanged(`app-files-changed-${appFolder}`); + socket.emitChanged('used-apps-changed'); + return true; + } + return false; + }, }; diff --git a/packages/api/src/controllers/files.js b/packages/api/src/controllers/files.js index 6d82c2e29..350f72262 100644 --- a/packages/api/src/controllers/files.js +++ b/packages/api/src/controllers/files.js @@ -98,6 +98,7 @@ module.exports = { const app = folder.substring('app:'.length); await fs.writeFile(path.join(appdir(), app, file), serialize(format, data)); socket.emitChanged(`app-files-changed-${app}`); + socket.emitChanged('used-apps-changed'); apps.emitChangedDbApp(folder); return true; } else { diff --git a/packages/web/src/tabs/JsonEditorTab.svelte b/packages/web/src/tabs/JsonEditorTab.svelte index e9a1e51e4..030a0c7cb 100644 --- a/packages/web/src/tabs/JsonEditorTab.svelte +++ b/packages/web/src/tabs/JsonEditorTab.svelte @@ -22,6 +22,8 @@ import useEditorData from '../query/useEditorData'; import invalidateCommands from '../commands/invalidateCommands'; import createActivator, { getActiveComponent } from '../utility/createActivator'; + import ToolStripContainer from '../buttons/ToolStripContainer.svelte'; + import ToolStripSaveButton from '../buttons/ToolStripSaveButton.svelte'; export let tabid; @@ -70,14 +72,20 @@ } - setEditorData(e.detail)} - on:focus={() => { - activator.activate(); - invalidateCommands(); - }} - bind:this={domEditor} - mode="json" -/> + + setEditorData(e.detail)} + on:focus={() => { + activator.activate(); + invalidateCommands(); + }} + bind:this={domEditor} + mode="json" + /> + + + + + diff --git a/packages/web/src/widgets/AppFilesList.svelte b/packages/web/src/widgets/AppFilesList.svelte index c4f34cbe8..3c50951ab 100644 --- a/packages/web/src/widgets/AppFilesList.svelte +++ b/packages/web/src/widgets/AppFilesList.svelte @@ -37,6 +37,7 @@ import { useAppFiles, useArchiveFolders } from '../utility/metadataLoaders'; import openNewTab from '../utility/openNewTab'; import WidgetsInnerContainer from './WidgetsInnerContainer.svelte'; + import { showSnackbarError } from '../utility/snackbar'; let filter = ''; @@ -66,12 +67,27 @@ }); } + async function handleNewConfigFile(fileName, content) { + if (!(await apiCall('apps/create-config-file', { fileName, content, appFolder: $currentApplication }))) { + showSnackbarError('File not created, probably already exists'); + } + } + function createAddMenu() { return [ { text: 'New SQL command', onClick: () => handleNewSqlFile('command.sql', 'Create new SQL command', COMMAND_TEMPLATE), }, + { + text: 'New virtual references file', + onClick: () => handleNewConfigFile('virtual-references.config.json', []), + }, + { + text: 'New disctionary descriptions file', + onClick: () => handleNewConfigFile('dictionary-descriptions.config.json', []), + }, + // { text: 'New query view', onClick: () => handleNewSqlFile('query.sql', 'Create new SQL query', QUERY_TEMPLATE) }, ]; }