Browse Source

Merge 72de3fb7f6 into c1dd494d0f

pull/1977/merge
Mavrag 4 days ago
committed by GitHub
parent
commit
caba38cea7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 8
      src/app/app.vue
  2. 16
      src/app/pages/admin/general.vue
  3. 2
      src/i18n/locales/en.json
  4. 1
      src/server/database/migrations/0002_add_site_title.sql
  5. 7
      src/server/database/migrations/meta/_journal.json
  6. 2
      src/server/database/repositories/general/schema.ts
  7. 1
      src/server/database/repositories/general/service.ts
  8. 6
      src/server/database/repositories/general/types.ts

8
src/app/app.vue

@ -19,6 +19,12 @@ toast.setToast(toastRef);
// make sure to fetch release early // make sure to fetch release early
useGlobalStore(); useGlobalStore();
// Fetch site title from general configuration with a key for refreshing
const { data: generalConfig } = await useFetch('/api/admin/general', { key: 'site-title' });
// Compute the title with fallback
const siteTitle = computed(() => generalConfig.value?.siteTitle || 'WireGuard');
useHead({ useHead({
bodyAttrs: { bodyAttrs: {
class: 'bg-gray-50 dark:bg-neutral-800', class: 'bg-gray-50 dark:bg-neutral-800',
@ -52,6 +58,6 @@ useHead({
content: 'black-translucent', content: 'black-translucent',
}, },
], ],
title: 'WireGuard', title: siteTitle,
}); });
</script> </script>

16
src/app/pages/admin/general.vue

@ -1,6 +1,14 @@
<template> <template>
<main v-if="data"> <main v-if="data">
<FormElement @submit.prevent="submit"> <FormElement @submit.prevent="submit">
<FormGroup>
<FormNullTextField
id="site-title"
v-model="data.siteTitle"
label="Site Title"
description="Custom title for browser tabs. Leave empty to use the default 'WireGuard' title."
/>
</FormGroup>
<FormGroup> <FormGroup>
<FormNumberField <FormNumberField
id="session" id="session"
@ -53,8 +61,12 @@ const _submit = useSubmit(
{ revert } { revert }
); );
function submit() { async function submit() {
return _submit(data.value); // Submit the form data
await _submit(data.value);
// Refresh the site-title data globally to update the browser tab title
await refreshNuxtData('site-title');
} }
async function revert() { async function revert() {

2
src/i18n/locales/en.json

@ -140,6 +140,8 @@
}, },
"admin": { "admin": {
"general": { "general": {
"siteTitle": "Site Title",
"siteTitleDesc": "Custom title for the web interface",
"sessionTimeout": "Session Timeout", "sessionTimeout": "Session Timeout",
"sessionTimeoutDesc": "Session duration for Remember Me (seconds)", "sessionTimeoutDesc": "Session duration for Remember Me (seconds)",
"metrics": "Metrics", "metrics": "Metrics",

1
src/server/database/migrations/0002_add_site_title.sql

@ -0,0 +1 @@
ALTER TABLE general_table ADD COLUMN site_title text;

7
src/server/database/migrations/meta/_journal.json

@ -15,6 +15,13 @@
"when": 1748427001203, "when": 1748427001203,
"tag": "0001_classy_the_stranger", "tag": "0001_classy_the_stranger",
"breakpoints": true "breakpoints": true
},
{
"idx": 2,
"version": "6",
"when": 1748427002000,
"tag": "0002_add_site_title",
"breakpoints": true
} }
] ]
} }

2
src/server/database/repositories/general/schema.ts

@ -12,6 +12,8 @@ export const general = sqliteTable('general_table', {
metricsPrometheus: int('metrics_prometheus', { mode: 'boolean' }).notNull(), metricsPrometheus: int('metrics_prometheus', { mode: 'boolean' }).notNull(),
metricsJson: int('metrics_json', { mode: 'boolean' }).notNull(), metricsJson: int('metrics_json', { mode: 'boolean' }).notNull(),
metricsPassword: text('metrics_password'), metricsPassword: text('metrics_password'),
siteTitle: text('site_title'),
createdAt: text('created_at') createdAt: text('created_at')
.notNull() .notNull()

1
src/server/database/repositories/general/service.ts

@ -36,6 +36,7 @@ function createPreparedStatement(db: DBType) {
metricsPrometheus: true, metricsPrometheus: true,
metricsJson: true, metricsJson: true,
metricsPassword: true, metricsPassword: true,
siteTitle: true,
}, },
}) })
.prepare(), .prepare(),

6
src/server/database/repositories/general/types.ts

@ -13,11 +13,17 @@ const metricsPassword = z
.min(1, { message: t('zod.general.metricsPassword') }) .min(1, { message: t('zod.general.metricsPassword') })
.nullable(); .nullable();
const siteTitle = z
.string({ message: 'Site Title' })
.nullable();
export const GeneralUpdateSchema = z.object({ export const GeneralUpdateSchema = z.object({
sessionTimeout: sessionTimeout, sessionTimeout: sessionTimeout,
metricsPrometheus: metricsEnabled, metricsPrometheus: metricsEnabled,
metricsJson: metricsEnabled, metricsJson: metricsEnabled,
metricsPassword: metricsPassword, metricsPassword: metricsPassword,
siteTitle: siteTitle,
}); });
export type GeneralUpdateType = z.infer<typeof GeneralUpdateSchema>; export type GeneralUpdateType = z.infer<typeof GeneralUpdateSchema>;

Loading…
Cancel
Save