Add profile importing/exporting

This commit is contained in:
ZXY101
2023-10-06 01:53:18 +02:00
parent 3d108df2c5
commit a92828dde0
2 changed files with 41 additions and 1 deletions

View File

@@ -7,7 +7,7 @@
renameProfile renameProfile
} from '$lib/settings'; } from '$lib/settings';
import { promptConfirmation, showSnackbar } from '$lib/util'; import { promptConfirmation, showSnackbar } from '$lib/util';
import { Listgroup, ListgroupItem, Modal, Input, Popover } from 'flowbite-svelte'; import { Listgroup, ListgroupItem, Modal, Input } from 'flowbite-svelte';
import { import {
CirclePlusSolid, CirclePlusSolid,
CopySolid, CopySolid,

View File

@@ -2,6 +2,7 @@
import { changeProfile, currentProfile, profiles } from '$lib/settings'; import { changeProfile, currentProfile, profiles } from '$lib/settings';
import { AccordionItem, Button, Select } from 'flowbite-svelte'; import { AccordionItem, Button, Select } from 'flowbite-svelte';
import ManageProfilesModal from './ManageProfilesModal.svelte'; import ManageProfilesModal from './ManageProfilesModal.svelte';
import { showSnackbar } from '$lib/util';
export let onClose: () => void; export let onClose: () => void;
@@ -16,6 +17,37 @@
onClose(); onClose();
} }
function exportProfiles() {
const link = document.createElement('a');
const json = localStorage.getItem('profiles') || '';
link.href = URL.createObjectURL(new Blob([json], { type: 'application/json' }));
link.download = 'profiles.json';
link.click();
showSnackbar('Profiles exported');
}
let files: FileList;
function importProfile() {
const [file] = files;
const reader = new FileReader();
reader.onloadend = () => {
const imported = JSON.parse(reader.result?.toString() || '');
profiles.update((prev) => {
return {
...prev,
...imported
};
});
onClose();
showSnackbar('Profiles imported');
};
if (file) {
reader.readAsText(file);
}
}
let manageModalOpen = false; let manageModalOpen = false;
</script> </script>
@@ -30,5 +62,13 @@
>Manage profiles</Button >Manage profiles</Button
> >
</div> </div>
<hr class="border-gray-100 opacity-10" />
<div class="flex flex-col gap-2">
<input class="border border-slate-700 rounded-lg" type="file" accept=".json" bind:files />
<Button on:click={importProfile} disabled={!files} size="sm" outline color="blue"
>Import profiles</Button
>
<Button on:click={exportProfiles} size="sm" color="light">Export profiles</Button>
</div>
</div> </div>
</AccordionItem> </AccordionItem>