diff --git a/package.json b/package.json index cc2c1911e40f..bfce16283445 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "8.8.0", + "version": "8.8.1", "author": "CIPP Contributors", "homepage": "https://cipp.app/", "bugs": { @@ -118,4 +118,4 @@ "eslint": "9.35.0", "eslint-config-next": "15.5.2" } -} +} \ No newline at end of file diff --git a/public/version.json b/public/version.json index 1e3a630a8132..e38593790096 100644 --- a/public/version.json +++ b/public/version.json @@ -1,3 +1,3 @@ { - "version": "8.8.0" -} + "version": "8.8.1" +} \ No newline at end of file diff --git a/src/components/CippComponents/CippTenantSelector.jsx b/src/components/CippComponents/CippTenantSelector.jsx index 0e16a5f88920..735ecfe82d40 100644 --- a/src/components/CippComponents/CippTenantSelector.jsx +++ b/src/components/CippComponents/CippTenantSelector.jsx @@ -205,7 +205,7 @@ export const CippTenantSelector = (props) => { // This effect handles when the URL parameter changes externally useEffect(() => { - if (!router.isReady || !tenantList.isSuccess) return; + if (!router.isReady || !tenantList.isSuccess || !settings.isInitialized) return; // Get the current tenant from URL or settings const urlTenant = router.query.tenantFilter || settings.currentTenant; @@ -230,11 +230,11 @@ export const CippTenantSelector = (props) => { }); } } - }, [router.isReady, router.query.tenantFilter, tenantList.isSuccess, settings.currentTenant]); + }, [router.isReady, router.query.tenantFilter, tenantList.isSuccess, settings.currentTenant, settings.isInitialized]); // This effect ensures the tenant filter parameter is included in the URL when missing useEffect(() => { - if (!router.isReady || !settings.currentTenant) return; + if (!router.isReady || !settings.isInitialized || !settings.currentTenant) return; // If the tenant parameter is missing from the URL but we have it in settings if (!router.query.tenantFilter && settings.currentTenant) { @@ -248,7 +248,7 @@ export const CippTenantSelector = (props) => { { shallow: true } ); } - }, [router.isReady, router.query, settings.currentTenant]); + }, [router.isReady, router.query, settings.currentTenant, settings.isInitialized]); useEffect(() => { if (tenant && currentTenant?.value && currentTenant?.value !== "AllTenants") { diff --git a/src/contexts/settings-context.js b/src/contexts/settings-context.js index bc2e177d73cc..37bb7a1cfdd6 100644 --- a/src/contexts/settings-context.js +++ b/src/contexts/settings-context.js @@ -132,14 +132,22 @@ export const SettingsProvider = (props) => { const handleUpdate = useCallback((settings) => { setState((prevState) => { + // Filter out null and undefined values to prevent resetting settings + const filteredSettings = Object.entries(settings).reduce((acc, [key, value]) => { + if (value !== null && value !== undefined) { + acc[key] = value; + } + return acc; + }, {}); + storeSettings({ ...prevState, - ...settings, + ...filteredSettings, }); return { ...prevState, - ...settings, + ...filteredSettings, }; }); }, []); diff --git a/src/pages/_app.js b/src/pages/_app.js index a1218d67d46a..a26f46d7f701 100644 --- a/src/pages/_app.js +++ b/src/pages/_app.js @@ -367,6 +367,7 @@ const App = (props) => { {(settings) => { if (!settings.isInitialized) { + return null; // Don't render until settings are loaded } const theme = createTheme({ colorPreset: "orange", diff --git a/src/pages/tenant/manage/applied-standards.js b/src/pages/tenant/manage/applied-standards.js index 359f8cbe59f7..2647ac4651f4 100644 --- a/src/pages/tenant/manage/applied-standards.js +++ b/src/pages/tenant/manage/applied-standards.js @@ -58,7 +58,8 @@ const Page = () => { const { templateId } = router.query; const [comparisonData, setComparisonData] = useState(null); const settings = useSettings(); - const currentTenant = settings?.currentTenant; + // Prioritize URL query parameter, then fall back to settings + const currentTenant = router.query.tenantFilter || settings?.currentTenant; const formControl = useForm({ mode: "onBlur", defaultValues: { diff --git a/src/pages/tenant/manage/configuration-backup.js b/src/pages/tenant/manage/configuration-backup.js index 8969f31ca4e4..5421a3314e79 100644 --- a/src/pages/tenant/manage/configuration-backup.js +++ b/src/pages/tenant/manage/configuration-backup.js @@ -42,16 +42,18 @@ const Page = () => { const { templateId } = router.query; const settings = useSettings(); const removeDialog = useDialog(); + // Prioritize URL query parameter, then fall back to settings + const currentTenant = router.query.tenantFilter || settings.currentTenant; // API call to get backup files const backupList = ApiGetCall({ url: "/api/ExecListBackup", data: { - tenantFilter: settings.currentTenant, + tenantFilter: currentTenant, Type: "Scheduled", NameOnly: true, }, - queryKey: `BackupList-${settings.currentTenant}`, + queryKey: `BackupList-${currentTenant}`, }); // API call to get existing backup configuration/schedule @@ -61,7 +63,7 @@ const Page = () => { showHidden: true, Type: "New-CIPPBackup", }, - queryKey: `BackupTasks-${settings.currentTenant}`, + queryKey: `BackupTasks-${currentTenant}`, }); // Use the actual backup files as the backup data @@ -380,7 +382,10 @@ const Page = () => { confirmText: "Are you sure you want to remove this backup schedule? This will stop automatic backups but won't delete existing backup files.", }} - relatedQueryKeys={[`BackupTasks-${settings.currentTenant}`, `BackupList-${settings.currentTenant}`]} + relatedQueryKeys={[ + `BackupTasks-${settings.currentTenant}`, + `BackupList-${settings.currentTenant}`, + ]} onSuccess={() => { // Refresh both queries when a backup schedule is removed setTimeout(() => { diff --git a/src/pages/tenant/manage/drift.js b/src/pages/tenant/manage/drift.js index 6e0ee47da4d3..8287c6c18cb3 100644 --- a/src/pages/tenant/manage/drift.js +++ b/src/pages/tenant/manage/drift.js @@ -34,7 +34,8 @@ const ManageDriftPage = () => { const router = useRouter(); const { templateId } = router.query; const userSettingsDefaults = useSettings(); - const tenantFilter = userSettingsDefaults.currentTenant || ""; + // Prioritize URL query parameter, then fall back to settings + const tenantFilter = router.query.tenantFilter || userSettingsDefaults.currentTenant || ""; const [anchorEl, setAnchorEl] = useState({}); const [bulkActionsAnchorEl, setBulkActionsAnchorEl] = useState(null); const createDialog = useDialog(); diff --git a/src/pages/tenant/manage/edit.js b/src/pages/tenant/manage/edit.js index 7d7bfb11fae1..8d66042e30e3 100644 --- a/src/pages/tenant/manage/edit.js +++ b/src/pages/tenant/manage/edit.js @@ -22,7 +22,8 @@ const Page = () => { const router = useRouter(); const { templateId } = router.query; const settings = useSettings(); - const currentTenant = settings.currentTenant; + // Prioritize URL query parameter, then fall back to settings + const currentTenant = router.query.tenantFilter || settings.currentTenant; const formControl = useForm({ mode: "onChange", diff --git a/src/pages/tenant/manage/history.js b/src/pages/tenant/manage/history.js index beb998fe2b75..d0e37ec3a077 100644 --- a/src/pages/tenant/manage/history.js +++ b/src/pages/tenant/manage/history.js @@ -40,7 +40,9 @@ const Page = () => { const router = useRouter(); const { templateId } = router.query; const [daysToLoad, setDaysToLoad] = useState(5); - const tenant = useSettings().currentTenant; + const userSettings = useSettings(); + // Prioritize URL query parameter, then fall back to settings + const tenant = router.query.tenantFilter || userSettings.currentTenant; const [expandedMessages, setExpandedMessages] = useState(new Set()); // Toggle message expansion diff --git a/src/pages/tenant/manage/recover-policies.js b/src/pages/tenant/manage/recover-policies.js index 3c4ed4e64376..98d10ec5208a 100644 --- a/src/pages/tenant/manage/recover-policies.js +++ b/src/pages/tenant/manage/recover-policies.js @@ -28,7 +28,9 @@ const RecoverPoliciesPage = () => { const router = useRouter(); const { templateId } = router.query; const [selectedPolicies, setSelectedPolicies] = useState([]); - const currentTenant = useSettings().currentTenant; + const userSettings = useSettings(); + // Prioritize URL query parameter, then fall back to settings + const currentTenant = router.query.tenantFilter || userSettings.currentTenant; const formControl = useForm({ mode: "onChange" });