-
diff --git a/front-src/client/components/Panels/Selector.svelte b/front-src/client/components/Panels/Selector.svelte
index 01ff1510..69ab85da 100644
--- a/front-src/client/components/Panels/Selector.svelte
+++ b/front-src/client/components/Panels/Selector.svelte
@@ -1,6 +1,8 @@
{#if $currentPanel}
@@ -65,6 +74,13 @@
>
{_('words.remove')}
+
+ {_('words.export')}
+
diff --git a/front-src/client/libs/panels.js b/front-src/client/libs/panels.js
index 2ad96308..164cbccd 100644
--- a/front-src/client/libs/panels.js
+++ b/front-src/client/libs/panels.js
@@ -11,3 +11,15 @@ export function update(panel) {
export function removeWidgetComponent(panel, widget) {
return api.removeWidgetComponent(panel, widget);
}
+
+export function exportWidget(panel, widget) {
+ return api.exportWidget(panel, widget);
+}
+
+export function importArchive(panel, widget) {
+ return api.importArchive(panel, widget);
+}
+
+export function exportPanel(panel) {
+ return api.exportPanel(panel);
+}
diff --git a/front-src/client/stores/panels.js b/front-src/client/stores/panels.js
index 14349092..0c551581 100644
--- a/front-src/client/stores/panels.js
+++ b/front-src/client/stores/panels.js
@@ -47,7 +47,7 @@ export function setCurrentPanel(panel) {
localStorage.setItem("currentPanel", panel && panel.id);
}
-function findSpaceForWidget(panel, props = {}) {
+export function findSpaceForWidget(panel, props = {}) {
const cols = get(gridOptions).cols;
const item = { ...gridHelper.item(get(itemOptions)), ...props };
const pos = gridHelper.findSpaceForItem(item, panel.grid, cols);
@@ -79,6 +79,9 @@ export async function moveWidgetToPanel({ panel, targetPanel, item }) {
}
function onAdd(panel, { owner }) {
+ if (panel.grid.length) {
+ makeGrid(panel);
+ }
panels.update((state) => [...state, panel]);
if (owner || !get(currentPanel)) {
setCurrentPanel(panel);
@@ -113,6 +116,8 @@ function makeGrid(panel) {
}
function onUpdate(panel) {
+ if (!panel) return;
+
const cp = get(currentPanel);
makeGrid(panel);
diff --git a/package.json b/package.json
index e8e2c06f..9bb9c88e 100644
--- a/package.json
+++ b/package.json
@@ -52,8 +52,10 @@
"electron-rebuild": "^2.3.2",
"eslint": "^7.12.0",
"eslint-plugin-svelte3": "^2.7.3",
+ "file-saver": "^2.0.5",
"i18next": "^19.8.3",
"i18next-http-backend": "^1.0.21",
+ "jszip": "^3.6.0",
"prettier": "^2.1.2",
"prettier-plugin-svelte": "^1.4.1",
"rollup": "^2.32.1",
diff --git a/yarn.lock b/yarn.lock
index b7d46368..7c4102e3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2185,6 +2185,11 @@ file-entry-cache@^5.0.1:
dependencies:
flat-cache "^2.0.1"
+file-saver@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38"
+ integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
+
filelist@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.1.tgz#f10d1a3ae86c1694808e8f20906f43d4c9132dbb"
@@ -2791,6 +2796,11 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+immediate@~3.0.5:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+ integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
@@ -3272,6 +3282,16 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
+jszip@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.6.0.tgz#839b72812e3f97819cc13ac4134ffced95dd6af9"
+ integrity sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==
+ dependencies:
+ lie "~3.3.0"
+ pako "~1.0.2"
+ readable-stream "~2.3.6"
+ set-immediate-shim "~1.0.1"
+
keyv@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
@@ -3330,6 +3350,13 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
+lie@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
+ integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
+ dependencies:
+ immediate "~3.0.5"
+
lines-and-columns@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
@@ -4142,6 +4169,11 @@ package-json@^6.3.0:
registry-url "^5.0.0"
semver "^6.2.0"
+pako@~1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -5001,6 +5033,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+set-immediate-shim@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"