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
This commit is contained in:
parent
2103f633eb
commit
57a6e558f3
10 changed files with 16 additions and 1 deletions
1
.github/workflows/ci.yml
vendored
1
.github/workflows/ci.yml
vendored
|
|
@ -33,6 +33,7 @@ jobs:
|
||||||
run: npm run backend:test
|
run: npm run backend:test
|
||||||
env:
|
env:
|
||||||
FF_ENABLE_BACKUPS: 'true'
|
FF_ENABLE_BACKUPS: 'true'
|
||||||
|
FF_ENABLE_CALDAV: 'true'
|
||||||
FF_ENABLE_CALENDAR: 'true'
|
FF_ENABLE_CALENDAR: 'true'
|
||||||
|
|
||||||
- name: Build frontend
|
- name: Build frontend
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,7 @@ ENV NODE_ENV=production \
|
||||||
TUDUDI_UPLOAD_PATH="/app/backend/uploads" \
|
TUDUDI_UPLOAD_PATH="/app/backend/uploads" \
|
||||||
SWAGGER_ENABLED=false \
|
SWAGGER_ENABLED=false \
|
||||||
FF_ENABLE_BACKUPS=false \
|
FF_ENABLE_BACKUPS=false \
|
||||||
|
FF_ENABLE_CALDAV=false \
|
||||||
FF_ENABLE_CALENDAR=false \
|
FF_ENABLE_CALENDAR=false \
|
||||||
FF_ENABLE_HABITS=false
|
FF_ENABLE_HABITS=false
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ DISABLE_TELEGRAM=false
|
||||||
|
|
||||||
# Feature Flags
|
# Feature Flags
|
||||||
FF_ENABLE_BACKUPS=false
|
FF_ENABLE_BACKUPS=false
|
||||||
|
FF_ENABLE_CALDAV=false
|
||||||
FF_ENABLE_CALENDAR=false
|
FF_ENABLE_CALENDAR=false
|
||||||
FF_ENABLE_HABITS=false
|
FF_ENABLE_HABITS=false
|
||||||
FF_ENABLE_MCP=false
|
FF_ENABLE_MCP=false
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,6 @@ TUDUDI_SESSION_SECRET=test-secret-key-for-testing
|
||||||
TUDUDI_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8080
|
TUDUDI_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8080
|
||||||
|
|
||||||
FF_ENABLE_BACKUPS=false
|
FF_ENABLE_BACKUPS=false
|
||||||
|
FF_ENABLE_CALDAV=false
|
||||||
FF_ENABLE_CALENDAR=false
|
FF_ENABLE_CALENDAR=false
|
||||||
FF_ENABLE_HABITS=false
|
FF_ENABLE_HABITS=false
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,9 @@ class FeatureFlagsService {
|
||||||
return {
|
return {
|
||||||
backups: process.env.FF_ENABLE_BACKUPS === 'true',
|
backups: process.env.FF_ENABLE_BACKUPS === 'true',
|
||||||
calendar: process.env.FF_ENABLE_CALENDAR === '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',
|
habits: process.env.FF_ENABLE_HABITS === 'true',
|
||||||
mcp: process.env.FF_ENABLE_MCP === 'true',
|
mcp: process.env.FF_ENABLE_MCP === 'true',
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ const Navbar: React.FC<NavbarProps> = ({
|
||||||
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,7 @@ const ProfileSettings: React.FC<ProfileSettingsProps> = ({
|
||||||
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
});
|
});
|
||||||
|
|
@ -1174,7 +1175,7 @@ const ProfileSettings: React.FC<ProfileSettingsProps> = ({
|
||||||
id: 'caldav',
|
id: 'caldav',
|
||||||
name: t('profile.tabs.caldav', 'CalDAV Sync'),
|
name: t('profile.tabs.caldav', 'CalDAV Sync'),
|
||||||
icon: <CalendarIcon className="w-5 h-5" />,
|
icon: <CalendarIcon className="w-5 h-5" />,
|
||||||
featureFlag: 'calendar',
|
featureFlag: 'caldav',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'mcp',
|
id: 'mcp',
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ const Sidebar: React.FC<SidebarProps> = ({
|
||||||
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ const SidebarNav: React.FC<SidebarNavProps> = ({
|
||||||
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
const [featureFlags, setFeatureFlags] = useState<FeatureFlags>({
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { getApiPath } from '../config/paths';
|
||||||
export interface FeatureFlags {
|
export interface FeatureFlags {
|
||||||
backups: boolean;
|
backups: boolean;
|
||||||
calendar: boolean;
|
calendar: boolean;
|
||||||
|
caldav: boolean;
|
||||||
habits: boolean;
|
habits: boolean;
|
||||||
mcp: boolean;
|
mcp: boolean;
|
||||||
}
|
}
|
||||||
|
|
@ -24,6 +25,7 @@ export const getFeatureFlags = async (): Promise<FeatureFlags> => {
|
||||||
return {
|
return {
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
};
|
};
|
||||||
|
|
@ -33,6 +35,7 @@ export const getFeatureFlags = async (): Promise<FeatureFlags> => {
|
||||||
const defaultFlags: FeatureFlags = {
|
const defaultFlags: FeatureFlags = {
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
};
|
};
|
||||||
|
|
@ -46,6 +49,7 @@ export const getFeatureFlags = async (): Promise<FeatureFlags> => {
|
||||||
return {
|
return {
|
||||||
backups: false,
|
backups: false,
|
||||||
calendar: false,
|
calendar: false,
|
||||||
|
caldav: false,
|
||||||
habits: false,
|
habits: false,
|
||||||
mcp: false,
|
mcp: false,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue