From 57a6e558f3463e2f824bf523a5f8091129d963ae Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 25 Apr 2026 18:21:53 +0300 Subject: [PATCH] fix: use CALDAV_ENABLED for calendar feature flag (#1070) * fix: add FF_ENABLE_CALDAV feature flag for CalDAV functionality Introduces a new dedicated feature flag for CalDAV sync that checks both FF_ENABLE_CALDAV and CALDAV_ENABLED environment variables. This allows the CalDAV tab to appear in profile settings when users set CALDAV_ENABLED=true as documented. The existing FF_ENABLE_CALENDAR remains unchanged as it's for a separate (hidden) calendar feature. Changes: - Added 'caldav' feature flag to backend service (checks FF_ENABLE_CALDAV or CALDAV_ENABLED) - Updated frontend FeatureFlags interface to include 'caldav' - Changed CalDAV tab to use 'caldav' feature flag instead of 'calendar' - Added FF_ENABLE_CALDAV to .env.example, .env.test, Dockerfile, and CI Fixes #1048 * fix: add caldav property to all FeatureFlags initializations Fixes TypeScript errors where FeatureFlags objects were missing the new caldav property in: - frontend/utils/featureFlags.ts (defaultFlags and error return) - frontend/components/Navbar.tsx - frontend/components/Sidebar.tsx - frontend/components/Sidebar/SidebarNav.tsx --- .github/workflows/ci.yml | 1 + Dockerfile | 1 + backend/.env.example | 1 + backend/.env.test | 1 + backend/modules/feature-flags/service.js | 3 +++ frontend/components/Navbar.tsx | 1 + frontend/components/Profile/ProfileSettings.tsx | 3 ++- frontend/components/Sidebar.tsx | 1 + frontend/components/Sidebar/SidebarNav.tsx | 1 + frontend/utils/featureFlags.ts | 4 ++++ 10 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7adf61a..4695d57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,6 +33,7 @@ jobs: run: npm run backend:test env: FF_ENABLE_BACKUPS: 'true' + FF_ENABLE_CALDAV: 'true' FF_ENABLE_CALENDAR: 'true' - name: Build frontend diff --git a/Dockerfile b/Dockerfile index 7b439fe..77a999d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -128,6 +128,7 @@ ENV NODE_ENV=production \ TUDUDI_UPLOAD_PATH="/app/backend/uploads" \ SWAGGER_ENABLED=false \ FF_ENABLE_BACKUPS=false \ + FF_ENABLE_CALDAV=false \ FF_ENABLE_CALENDAR=false \ FF_ENABLE_HABITS=false diff --git a/backend/.env.example b/backend/.env.example index 28133ed..a443a17 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -29,6 +29,7 @@ DISABLE_TELEGRAM=false # Feature Flags FF_ENABLE_BACKUPS=false +FF_ENABLE_CALDAV=false FF_ENABLE_CALENDAR=false FF_ENABLE_HABITS=false FF_ENABLE_MCP=false diff --git a/backend/.env.test b/backend/.env.test index b7b00b4..e17e4af 100644 --- a/backend/.env.test +++ b/backend/.env.test @@ -4,5 +4,6 @@ TUDUDI_SESSION_SECRET=test-secret-key-for-testing TUDUDI_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8080 FF_ENABLE_BACKUPS=false +FF_ENABLE_CALDAV=false FF_ENABLE_CALENDAR=false FF_ENABLE_HABITS=false diff --git a/backend/modules/feature-flags/service.js b/backend/modules/feature-flags/service.js index f09d023..61ff471 100644 --- a/backend/modules/feature-flags/service.js +++ b/backend/modules/feature-flags/service.js @@ -8,6 +8,9 @@ class FeatureFlagsService { return { backups: process.env.FF_ENABLE_BACKUPS === 'true', calendar: process.env.FF_ENABLE_CALENDAR === 'true', + caldav: + process.env.FF_ENABLE_CALDAV === 'true' || + process.env.CALDAV_ENABLED === 'true', habits: process.env.FF_ENABLE_HABITS === 'true', mcp: process.env.FF_ENABLE_MCP === 'true', }; diff --git a/frontend/components/Navbar.tsx b/frontend/components/Navbar.tsx index 5022053..e16985d 100644 --- a/frontend/components/Navbar.tsx +++ b/frontend/components/Navbar.tsx @@ -42,6 +42,7 @@ const Navbar: React.FC = ({ const [featureFlags, setFeatureFlags] = useState({ backups: false, calendar: false, + caldav: false, habits: false, mcp: false, }); diff --git a/frontend/components/Profile/ProfileSettings.tsx b/frontend/components/Profile/ProfileSettings.tsx index 81137e9..7658bfe 100644 --- a/frontend/components/Profile/ProfileSettings.tsx +++ b/frontend/components/Profile/ProfileSettings.tsx @@ -144,6 +144,7 @@ const ProfileSettings: React.FC = ({ const [featureFlags, setFeatureFlags] = useState({ backups: false, calendar: false, + caldav: false, habits: false, mcp: false, }); @@ -1174,7 +1175,7 @@ const ProfileSettings: React.FC = ({ id: 'caldav', name: t('profile.tabs.caldav', 'CalDAV Sync'), icon: , - featureFlag: 'calendar', + featureFlag: 'caldav', }, { id: 'mcp', diff --git a/frontend/components/Sidebar.tsx b/frontend/components/Sidebar.tsx index bc56d17..50f5a8d 100644 --- a/frontend/components/Sidebar.tsx +++ b/frontend/components/Sidebar.tsx @@ -56,6 +56,7 @@ const Sidebar: React.FC = ({ const [featureFlags, setFeatureFlags] = useState({ backups: false, calendar: false, + caldav: false, habits: false, mcp: false, }); diff --git a/frontend/components/Sidebar/SidebarNav.tsx b/frontend/components/Sidebar/SidebarNav.tsx index 5e7e0db..a9e0cfd 100644 --- a/frontend/components/Sidebar/SidebarNav.tsx +++ b/frontend/components/Sidebar/SidebarNav.tsx @@ -30,6 +30,7 @@ const SidebarNav: React.FC = ({ const [featureFlags, setFeatureFlags] = useState({ backups: false, calendar: false, + caldav: false, habits: false, mcp: false, }); diff --git a/frontend/utils/featureFlags.ts b/frontend/utils/featureFlags.ts index aa8bc99..70fa77a 100644 --- a/frontend/utils/featureFlags.ts +++ b/frontend/utils/featureFlags.ts @@ -3,6 +3,7 @@ import { getApiPath } from '../config/paths'; export interface FeatureFlags { backups: boolean; calendar: boolean; + caldav: boolean; habits: boolean; mcp: boolean; } @@ -24,6 +25,7 @@ export const getFeatureFlags = async (): Promise => { return { backups: false, calendar: false, + caldav: false, habits: false, mcp: false, }; @@ -33,6 +35,7 @@ export const getFeatureFlags = async (): Promise => { const defaultFlags: FeatureFlags = { backups: false, calendar: false, + caldav: false, habits: false, mcp: false, }; @@ -46,6 +49,7 @@ export const getFeatureFlags = async (): Promise => { return { backups: false, calendar: false, + caldav: false, habits: false, mcp: false, };