+
+
+
+
diff --git a/ui/src/routes/settings/+page.js b/ui/src/routes/settings/+page.js
new file mode 100644
index 0000000..252e476
--- /dev/null
+++ b/ui/src/routes/settings/+page.js
@@ -0,0 +1,24 @@
+import { error } from '@sveltejs/kit';
+import { getSettings } from '$lib/settings';
+import { loadablesSources } from '$lib/stores/loadable-sources.js';
+
+export const load = async({ parent, fetch }) => {
+ const data = await parent();
+
+ await loadablesSources.refresh();
+
+ let settings;
+ try {
+ settings = await getSettings();
+ } catch (err) {
+ throw error(err.status, err.statusText);
+ }
+
+ const version = fetch('/api/version').then((res) => res.json());
+
+ return {
+ ...data,
+ settings,
+ version,
+ };
+}
diff --git a/ui/src/routes/settings/+page.svelte b/ui/src/routes/settings/+page.svelte
new file mode 100644
index 0000000..9db3f0d
--- /dev/null
+++ b/ui/src/routes/settings/+page.svelte
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+ Version:
+ {#await data.version then version}
+ {version.version}
+ {/await}
+
+
+
+
+
+
+ {#each data.settings.custom_sources as source, isrc}
+
+
+
+
source.edit_name = true}
+ >
+ {#if source.kv && source.kv.name !== undefined}
+ {#if !source.edit_name}
+ {source.kv.name}
+ {:else}
+
+ {/if}
+ {:else}
+ {source.src} #{isrc}
+ {/if}
+
+ {#if source.src}
+ {source.src}
+ {/if}
+
+
+
+ {#if source.src && source.kv}
+ {#if $loadablesSources[source.src].fields}
+ {#each $loadablesSources[source.src].fields.filter((e) => e.id !== "name") as field (field.id)}
+
+
+
+
+ {/each}
+ {:else}
+ {#each Object.keys(source.kv).filter((e) => e !== "name") as k}
+
+
+
+
+ {/each}
+ {/if}
+ {:else}
+ Choose a new custom source:
+
+ {#if $loadablesSources}
+ {#each Object.keys($loadablesSources) as kls}
+
+ {/each}
+ {/if}
+
+ {/if}
+
+ {/each}
+
+
+