conflagrate exports
This commit is contained in:
parent
0d67abc301
commit
fcdae270b7
27
src/lib/actions/clipboard.js
Normal file
27
src/lib/actions/clipboard.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// stolen from svelte-copy-clipboard-action
|
||||||
|
|
||||||
|
export function clipboard(node, { trigger = "click", text = "" } = {}) {
|
||||||
|
const handle = async (e) => {
|
||||||
|
await navigator.clipboard.writeText(text).then(
|
||||||
|
() =>
|
||||||
|
node.dispatchEvent(
|
||||||
|
new CustomEvent("copied", { detail: { clipboard: text } })
|
||||||
|
),
|
||||||
|
(e) =>
|
||||||
|
node.dispatchEvent(new CustomEvent("error", { detail: { error: e } }))
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
node.addEventListener(trigger, handle, true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
update: (params) => {
|
||||||
|
if (params.trigger !== undefined) trigger = params.trigger;
|
||||||
|
|
||||||
|
if (params.text !== undefined) text = params.text;
|
||||||
|
},
|
||||||
|
destroy() {
|
||||||
|
node.removeEventListener(trigger, handle, true);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
import ship from "./ship";
|
import ship from "./ship";
|
||||||
import { browser } from "$app/environment";
|
import { browser } from "$app/environment";
|
||||||
|
import { writable } from "svelte/store";
|
||||||
|
|
||||||
export type Api = ReturnType<typeof ship.createStore>;
|
export type Api = ReturnType<typeof ship.createStore>;
|
||||||
|
|
||||||
@ -14,12 +15,17 @@ export const createApi = () => {
|
|||||||
|
|
||||||
api.dispatch.restore(state);
|
api.dispatch.restore(state);
|
||||||
|
|
||||||
|
const svelteStore = writable(state);
|
||||||
|
|
||||||
if (browser) {
|
if (browser) {
|
||||||
api.subscribe(() => {
|
api.subscribe(() => {
|
||||||
console.log("saving...", api.getState());
|
const state = api.getState();
|
||||||
localStorage.setItem("ship", JSON.stringify(api.getState()));
|
svelteStore.set(state);
|
||||||
|
localStorage.setItem("ship", JSON.stringify(state));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
api.svelteStore = svelteStore;
|
||||||
|
|
||||||
return api;
|
return api;
|
||||||
};
|
};
|
||||||
|
4
src/params/outputFormat.js
Normal file
4
src/params/outputFormat.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/** @type {import('@sveltejs/kit').ParamMatcher} */
|
||||||
|
export function match(param) {
|
||||||
|
return ["json", "yaml"].includes(param);
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
<nav class="m l left">
|
<nav class="m l left">
|
||||||
|
<!-- set them as active -->
|
||||||
<a href="/export/json">
|
<a href="/export/json">
|
||||||
<i>output</i>
|
<i>output</i>
|
||||||
<span>json</span>
|
<span>json</span>
|
||||||
|
6
src/routes/export/[format=outputFormat]/+page.js
Normal file
6
src/routes/export/[format=outputFormat]/+page.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/** @type {import('./$types').PageLoad} */
|
||||||
|
export function load({ params }) {
|
||||||
|
return {
|
||||||
|
format: params.format,
|
||||||
|
};
|
||||||
|
}
|
21
src/routes/export/[format=outputFormat]/+page.svelte
Normal file
21
src/routes/export/[format=outputFormat]/+page.svelte
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<Serialized data={serializedShip} format={data.format} />
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getContext } from "svelte";
|
||||||
|
|
||||||
|
import Serialized from "./Serialized.svelte";
|
||||||
|
|
||||||
|
const api = getContext("api");
|
||||||
|
|
||||||
|
let shipData = api.svelteStore;
|
||||||
|
export let data;
|
||||||
|
|
||||||
|
const serialize = async (data, format) => {
|
||||||
|
if (format === "json") return JSON.stringify(data, null, 2);
|
||||||
|
|
||||||
|
return import("yaml").then(({ stringify }) => stringify(data));
|
||||||
|
};
|
||||||
|
|
||||||
|
let serializedShip;
|
||||||
|
$: serialize($shipData, data.format).then((s) => (serializedShip = s));
|
||||||
|
</script>
|
@ -1,25 +1,21 @@
|
|||||||
<article>
|
<article>
|
||||||
<nav>
|
<nav>
|
||||||
<button
|
<button
|
||||||
use:clipboard={{ text: shipJson }}
|
use:clipboard={{ text: data }}
|
||||||
on:copied={copied}
|
on:copied={copied}
|
||||||
on:error={copyError}>{copyLabel} <i>content_paste</i></button
|
on:error={copyError}>{copyLabel} <i>content_paste</i></button
|
||||||
>
|
>
|
||||||
<button on:click={handleSave}>download <i>download</i></button>
|
<button on:click={handleSave}>download <i>download</i></button>
|
||||||
</nav>
|
</nav>
|
||||||
<pre><code>{shipJson}</code></pre>
|
<pre><code>{data}</code></pre>
|
||||||
<a hidden {href} {download} bind:this={fileDownload} />
|
<a hidden {href} {download} bind:this={fileDownload} />
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getContext } from "svelte";
|
import { clipboard } from "$lib/actions/clipboard.js";
|
||||||
import { clipboard } from "svelte-copy-clipboard-action";
|
|
||||||
|
|
||||||
// TODO copy
|
export let data = "Loading...";
|
||||||
const api = getContext("api");
|
export let format;
|
||||||
|
|
||||||
let shipData = api.getState();
|
|
||||||
api.subscribe(() => (shipDate = api.getState()));
|
|
||||||
|
|
||||||
let copyLabel = "clipboard";
|
let copyLabel = "clipboard";
|
||||||
|
|
||||||
@ -33,10 +29,8 @@
|
|||||||
setTimeout(() => (copyLabel = "clipboard"), 2000);
|
setTimeout(() => (copyLabel = "clipboard"), 2000);
|
||||||
};
|
};
|
||||||
|
|
||||||
$: shipJson = JSON.stringify(shipData, null, 2);
|
$: href = "data:text/plain;charset=utf-8," + encodeURIComponent(data);
|
||||||
|
$: download = (data?.identification?.shipClass || "ship") + "." + format;
|
||||||
$: href = "data:text/plain;charset=utf-8," + encodeURIComponent(shipJson);
|
|
||||||
$: download = (shipData?.identification?.shipClass || "ship") + ".json";
|
|
||||||
|
|
||||||
let fileDownload;
|
let fileDownload;
|
||||||
|
|
@ -1,60 +0,0 @@
|
|||||||
<article>
|
|
||||||
<nav>
|
|
||||||
<button
|
|
||||||
use:clipboard={{ text: shipJson }}
|
|
||||||
on:copied={copied}
|
|
||||||
on:error={copyError}>{copyLabel} <i>content_paste</i></button
|
|
||||||
>
|
|
||||||
<button on:click={handleSave}>download <i>download</i></button>
|
|
||||||
</nav>
|
|
||||||
<pre><code>{shipJson}</code></pre>
|
|
||||||
<a hidden {href} {download} bind:this={fileDownload} />
|
|
||||||
</article>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { getContext } from "svelte";
|
|
||||||
import { clipboard } from "svelte-copy-clipboard-action";
|
|
||||||
import { stringify } from "yaml";
|
|
||||||
|
|
||||||
// TODO copy
|
|
||||||
const api = getContext("api");
|
|
||||||
|
|
||||||
let shipData = api.getState();
|
|
||||||
api.subscribe(() => (shipDate = api.getState()));
|
|
||||||
|
|
||||||
let copyLabel = "clipboard";
|
|
||||||
|
|
||||||
const copied = () => {
|
|
||||||
copyLabel = "copied!";
|
|
||||||
setTimeout(() => (copyLabel = "clipboard"), 2000);
|
|
||||||
};
|
|
||||||
|
|
||||||
const copyError = () => {
|
|
||||||
copyLabel = "error copying";
|
|
||||||
setTimeout(() => (copyLabel = "clipboard"), 2000);
|
|
||||||
};
|
|
||||||
|
|
||||||
$: shipJson = stringify(shipData, null, 2);
|
|
||||||
|
|
||||||
$: href = "data:text/plain;charset=utf-8," + encodeURIComponent(shipJson);
|
|
||||||
$: download = (shipData?.identification?.shipClass || "ship") + ".yml";
|
|
||||||
|
|
||||||
let fileDownload;
|
|
||||||
|
|
||||||
function handleSave() {
|
|
||||||
fileDownload?.click();
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
article {
|
|
||||||
background-color: var(--primary-container);
|
|
||||||
}
|
|
||||||
button {
|
|
||||||
font-size: var(--font-scale-10);
|
|
||||||
}
|
|
||||||
nav {
|
|
||||||
position: absolute;
|
|
||||||
right: 5em;
|
|
||||||
}
|
|
||||||
</style>
|
|
Loading…
Reference in New Issue
Block a user