feat: Add basic event settings management page

This commit introduces a new page at /events/[event_id]/settings that allows users to view and edit the JSON configuration fields for an event. The page provides textareas for each config field and a 'Save' button to persist the changes.
This commit is contained in:
Scott Idem
2025-11-18 18:59:49 -05:00
parent 0987cd6ad9
commit 0be878c8c1

View File

@@ -0,0 +1,110 @@
<script lang="ts">
import { page } from '$app/stores';
import { liveQuery } from 'dexie';
import { db_events } from '$lib/ae_events/db_events';
import { onMount } from 'svelte';
import { events_func } from '$lib/ae_events_functions';
import { ae_api } from '$lib/stores/ae_stores';
let event_id = $page.params.event_id;
let event_obj = $state(null);
onMount(() => {
const observable = liveQuery(() => db_events.event.get(event_id));
const subscription = observable.subscribe((value) => {
event_obj = value;
});
return () => {
subscription.unsubscribe();
};
});
async function handle_save(field_name: string, json_string: string) {
try {
const parsed_json = JSON.parse(json_string);
const data_kv = { [field_name]: parsed_json };
await events_func.update_ae_obj__event({
api_cfg: $ae_api,
event_id: event_id,
data_kv: data_kv
});
alert('Settings saved successfully!');
} catch (error) {
console.error('Error saving settings:', error);
alert('Failed to save settings. Please check if the JSON is valid.');
}
}
</script>
<h1 class="h1">Event Settings</h1>
{#if event_obj}
<div class="space-y-4">
<div>
<h2 class="h2">General Config (cfg_json)</h2>
<textarea class="textarea w-full h-64" bind:value={event_obj.cfg_json}></textarea>
<button
class="btn preset-tonal-primary"
on:click={() => handle_save('cfg_json', event_obj.cfg_json)}>Save</button
>
</div>
<div>
<h2 class="h2">Presentation Management (mod_pres_mgmt_json)</h2>
<textarea
class="textarea w-full h-64"
bind:value={event_obj.mod_pres_mgmt_json}></textarea>
<button
class="btn preset-tonal-primary"
on:click={() => handle_save('mod_pres_mgmt_json', event_obj.mod_pres_mgmt_json)}
>Save</button
>
</div>
<div>
<h2 class="h2">Badges (mod_badges_json)</h2>
<textarea class="textarea w-full h-64" bind:value={event_obj.mod_badges_json}></textarea>
<button
class="btn preset-tonal-primary"
on:click={() => handle_save('mod_badges_json', event_obj.mod_badges_json)}>Save</button
>
</div>
<div>
<h2 class="h2">Abstracts (mod_abstracts_json)</h2>
<textarea
class="textarea w-full h-64"
bind:value={event_obj.mod_abstracts_json}></textarea>
<button
class="btn preset-tonal-primary"
on:click={() => handle_save('mod_abstracts_json', event_obj.mod_abstracts_json)}
>Save</button
>
</div>
<div>
<h2 class="h2">Exhibits (mod_exhibits_json)</h2>
<textarea class="textarea w-full h-64" bind:value={event_obj.mod_exhibits_json}></textarea>
<button
class="btn preset-tonal-primary"
on:click={() => handle_save('mod_exhibits_json', event_obj.mod_exhibits_json)}
>Save</button
>
</div>
<div>
<h2 class="h2">Meetings (mod_meetings_json)</h2>
<textarea class="textarea w-full h-64" bind:value={event_obj.mod_meetings_json}></textarea>
<button
class="btn preset-tonal-primary"
on:click={() => handle_save('mod_meetings_json', event_obj.mod_meetings_json)}
>Save</button
>
</div>
</div>
{:else}
<p>Loading event data...</p>
{/if}