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:
Rafael Foster
2026-05-08 15:14:51 -03:00
committed by GitHub
parent d19689a1ab
commit 22ec13e559
38 changed files with 7127 additions and 235 deletions
+11 -1
View File
@@ -144,6 +144,7 @@ router.get('/', (req, res) => {
app_name: appName,
dashboard_widgets: dashboardWidgets,
disabled_modules: disabledModules,
housekeeping_payment_tasks: cfgGet('housekeeping_payment_tasks') === '1',
},
});
} catch (err) {
@@ -161,7 +162,7 @@ router.get('/', (req, res) => {
router.put('/', (req, res) => {
try {
const { visible_meal_types, currency, date_format, time_format, app_name, dashboard_widgets, disabled_modules } = req.body;
const { visible_meal_types, currency, date_format, time_format, app_name, dashboard_widgets, disabled_modules, housekeeping_payment_tasks } = req.body;
if (visible_meal_types !== undefined) {
if (!Array.isArray(visible_meal_types)) {
@@ -220,6 +221,13 @@ router.put('/', (req, res) => {
cfgSet('disabled_modules', JSON.stringify(unique));
}
if (housekeeping_payment_tasks !== undefined) {
if (typeof housekeeping_payment_tasks !== 'boolean') {
return res.status(400).json({ error: 'housekeeping_payment_tasks must be a boolean', code: 400 });
}
cfgSet('housekeeping_payment_tasks', housekeeping_payment_tasks ? '1' : '0');
}
const rawMealTypes = cfgGet('visible_meal_types') ?? DEFAULT_MEAL_TYPES;
const savedMealTypes = rawMealTypes.split(',').filter((t) => VALID_MEAL_TYPES.includes(t));
const savedCurrency = cfgGet('currency') ?? DEFAULT_CURRENCY;
@@ -228,6 +236,7 @@ router.put('/', (req, res) => {
const savedAppName = cfgGet('app_name') ?? DEFAULT_APP_NAME;
const savedWidgets = parseWidgetConfig(cfgGet('dashboard_widgets'));
const savedDisabledModules = parseDisabledModules(cfgGet('disabled_modules'));
const savedHousekeepingPaymentTasks = cfgGet('housekeeping_payment_tasks') === '1';
res.json({
data: {
@@ -238,6 +247,7 @@ router.put('/', (req, res) => {
app_name: savedAppName,
dashboard_widgets: savedWidgets,
disabled_modules: savedDisabledModules,
housekeeping_payment_tasks: savedHousekeepingPaymentTasks,
},
});
} catch (err) {