Add export / import function fix #4
This commit is contained in:
+48
-7
@@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onBeforeUnmount } from "vue";
|
import { ref, watch, computed, onBeforeUnmount } from "vue";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
|
||||||
import { faMinus, faPlus, faPlay, faStop, faTrash, faArrowDown, faList, faGrip, faDownload, faUpload } from "@fortawesome/free-solid-svg-icons";
|
import { faMinus, faPlus, faPlay, faStop, faTrash, faArrowDown, faList, faGrip, faDownload, faUpload } from "@fortawesome/free-solid-svg-icons";
|
||||||
|
|
||||||
@@ -132,14 +132,10 @@ function addPreset() {
|
|||||||
const nextId = Math.max(0, ...presets.value.map(p => p.id)) + 1;
|
const nextId = Math.max(0, ...presets.value.map(p => p.id)) + 1;
|
||||||
const preset = { tempo: bpm.value, id: nextId };
|
const preset = { tempo: bpm.value, id: nextId };
|
||||||
presets.value.push(preset);
|
presets.value.push(preset);
|
||||||
|
|
||||||
localStorage.setItem(STORAGE_KEY_PRESETS, JSON.stringify(presets.value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function deletePreset() {
|
function deletePreset() {
|
||||||
presets.value = presets.value.filter(f => f.id != selectedPreset.value.id);
|
presets.value = presets.value.filter(f => f.id != selectedPreset.value.id);
|
||||||
|
|
||||||
localStorage.setItem(STORAGE_KEY_PRESETS, JSON.stringify(presets.value));
|
|
||||||
stop();
|
stop();
|
||||||
selectedPreset = ref(null);
|
selectedPreset = ref(null);
|
||||||
}
|
}
|
||||||
@@ -174,10 +170,55 @@ function switchView(val) {
|
|||||||
localStorage.setItem(STORAGE_KEY_VIEW, val);
|
localStorage.setItem(STORAGE_KEY_VIEW, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EXPORT / IMPORT
|
||||||
|
|
||||||
|
function exportPresets() {
|
||||||
|
const json = JSON.stringify(presets.value, null, 2);
|
||||||
|
const blob = new Blob([json], { type: "application/json" });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
|
||||||
|
const a = document.createElement("a");
|
||||||
|
a.href = url;
|
||||||
|
a.download = "click-presets.json";
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function importPresets(event) {
|
||||||
|
const file = event.target.files[0];
|
||||||
|
if (!file) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(await file.text());
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
presets.value = data.filter(p => Number.isInteger(p.id) && Number.isFinite(p.tempo));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Import fehlgeschlagen:", error);
|
||||||
|
}
|
||||||
|
event.target.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watchers
|
||||||
|
watch(
|
||||||
|
presets,
|
||||||
|
(value) => {
|
||||||
|
try {
|
||||||
|
localStorage.setItem(STORAGE_KEY_PRESETS, JSON.stringify(value));
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Presets konnten nicht gespeichert werden:", error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ deep: true }
|
||||||
|
);
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<input type="file" ref="fileInput" accept="application/json" @change="importPresets" hidden>
|
||||||
<header>
|
<header>
|
||||||
<div id="controls">
|
<div id="controls">
|
||||||
<h1>Speed</h1>
|
<h1>Speed</h1>
|
||||||
@@ -225,10 +266,10 @@ function switchView(val) {
|
|||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<button>
|
<button @click="$refs.fileInput.click()">
|
||||||
<font-awesome-icon :icon="faUpload" size="xl" />
|
<font-awesome-icon :icon="faUpload" size="xl" />
|
||||||
</button>
|
</button>
|
||||||
<button>
|
<button @click="exportPresets">
|
||||||
<font-awesome-icon :icon="faDownload" size="xl" />
|
<font-awesome-icon :icon="faDownload" size="xl" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user