feat: add housekeeping module for household staff management
* Adding flexible reminder options to birthdays * Fix database migration merge conflict * Truncate calendar popup descriptions * Log app version on backend startup * Add host-mounted data and backup folders * feat: add housekeeping module * fix: align housekeeping UI and add task creation * refactor: rebuild housekeeping experience * feat: support multiple housekeeping staff * feat: integrate housekeeping visits with calendar * feat: refine housekeeping visits and payments * feat: add housekeeping staff visit logs * feat: add housekeeping receipts and document folders * feat: localize housekeeping folders and chores * feat: refine housekeeping tabs and document folders * fix: sync housekeeping tab active state * feat: use configured app name in onboarding and manifest
This commit is contained in:
@@ -36,6 +36,7 @@ import remindersRouter from './routes/reminders.js';
|
||||
import searchRouter from './routes/search.js';
|
||||
import familyRouter from './routes/family.js';
|
||||
import backupRouter from './routes/backup.js';
|
||||
import housekeepingRouter from './routes/housekeeping.js';
|
||||
|
||||
const log = createLogger('Server');
|
||||
const logSync = createLogger('Sync');
|
||||
@@ -175,6 +176,41 @@ app.get('/api/v1/version', (req, res) => {
|
||||
res.json({ version: APP_VERSION, app_name: appName });
|
||||
});
|
||||
|
||||
app.get('/manifest.webmanifest', (req, res) => {
|
||||
let appName = DEFAULT_APP_NAME;
|
||||
try {
|
||||
const row = db.get().prepare('SELECT value FROM sync_config WHERE key = ?').get('app_name');
|
||||
if (row?.value) appName = row.value;
|
||||
} catch {
|
||||
// fall back to default
|
||||
}
|
||||
|
||||
res.type('application/manifest+json');
|
||||
res.setHeader('Cache-Control', 'no-cache, must-revalidate');
|
||||
res.json({
|
||||
name: `${appName} Familienplaner`,
|
||||
short_name: appName,
|
||||
description: 'Selbstgehosteter Familienplaner',
|
||||
id: '/',
|
||||
start_url: '/',
|
||||
scope: '/',
|
||||
display: 'standalone',
|
||||
display_override: ['standalone', 'minimal-ui'],
|
||||
orientation: 'portrait-primary',
|
||||
theme_color: '#007AFF',
|
||||
background_color: '#F5F5F7',
|
||||
lang: 'de-DE',
|
||||
categories: ['productivity', 'lifestyle'],
|
||||
icons: [
|
||||
{ src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png', purpose: 'any' },
|
||||
{ src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png', purpose: 'any' },
|
||||
{ src: '/icons/icon-maskable-192.png', sizes: '192x192', type: 'image/png', purpose: 'maskable' },
|
||||
{ src: '/icons/icon-maskable-512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' },
|
||||
],
|
||||
screenshots: [],
|
||||
});
|
||||
});
|
||||
|
||||
function sendOpenApi(req, res) {
|
||||
if (req.query.download === '1') {
|
||||
res.setHeader('Content-Disposition', 'attachment; filename="openapi.json"');
|
||||
@@ -206,6 +242,7 @@ app.use('/api/v1/reminders', remindersRouter);
|
||||
app.use('/api/v1/search', searchRouter);
|
||||
app.use('/api/v1/family', familyRouter);
|
||||
app.use('/api/v1/backup', backupRouter);
|
||||
app.use('/api/v1/housekeeping', housekeepingRouter);
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Health-Check (für Docker)
|
||||
|
||||
Reference in New Issue
Block a user