Browse Source

Add custom site title feature with database migration

pull/1977/head
mavrag 1 month ago
parent
commit
51d9899b84
  1. 8
      src/app/app.vue
  2. 8
      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
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({
bodyAttrs: {
class: 'bg-gray-50 dark:bg-neutral-800',
@ -52,6 +58,6 @@ useHead({
content: 'black-translucent',
},
],
title: 'WireGuard',
title: siteTitle,
});
</script>

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

@ -1,6 +1,14 @@
<template>
<main v-if="data">
<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>
<FormNumberField
id="session"

2
src/i18n/locales/en.json

@ -137,6 +137,8 @@
},
"admin": {
"general": {
"siteTitle": "Site Title",
"siteTitleDesc": "Custom title for the web interface",
"sessionTimeout": "Session Timeout",
"sessionTimeoutDesc": "Session duration for Remember Me (seconds)",
"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,
"tag": "0001_classy_the_stranger",
"breakpoints": true
},
{
"idx": 2,
"version": "6",
"when": 1748427002000,
"tag": "0002_add_site_title",
"breakpoints": true
}
]
}

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

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

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

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

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

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

Loading…
Cancel
Save