Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
fcc2dc0
Merge pull request #9 from KelvinTegelaar/dev
Brad-M-K Mar 10, 2026
163f6ef
chore(deps): bump react-virtuoso from 4.18.1 to 4.18.3
dependabot[bot] Mar 11, 2026
81a2975
chore(deps): bump i18next from 25.8.13 to 25.8.18
dependabot[bot] Mar 11, 2026
5832129
chore(deps): bump typescript from 5.9.2 to 5.9.3
dependabot[bot] Mar 11, 2026
21bb15a
chore(deps): bump @tiptap/starter-kit from 3.20.0 to 3.20.1
dependabot[bot] Mar 11, 2026
f09f11e
chore(deps): bump LanceMcCarthy/Action-AzureBlobUpload
dependabot[bot] Mar 11, 2026
973abb5
Add password configuration page with Classic and Passphrase options
Brad-M-K Mar 12, 2026
19e961b
fix: resolve SharePoint User Information List by template instead of …
Mar 13, 2026
435a133
Add App Management Policy to standards.json
TecharyJames Mar 13, 2026
5980ad7
fix: add SID to automatic copy-chip in tables
kris6673 Mar 13, 2026
12747e5
feat: add "Operating system default" and "User Select" options to Aut…
kris6673 Mar 14, 2026
1fd441f
Default values bug fix
OwenIbarra Mar 14, 2026
805df59
Merge pull request #5609 from OwenIbarra/dev
KelvinTegelaar Mar 14, 2026
f55af87
fix: standards dialog display
JohnDuprey Mar 14, 2026
aef30da
fix: adjust sidebar height calculation for improved layout and move i…
JohnDuprey Mar 14, 2026
b630421
Fix Secure Score crash when switching to AllTenants
Mar 15, 2026
c0d595b
Persistent Bookmarks with Migration from local storage
Zacgoose Mar 15, 2026
046d131
compact nav for bookmarks
Zacgoose Mar 15, 2026
2a3457e
Fixes guest add drawer
Zacgoose Mar 15, 2026
5a1f629
Merge pull request #5613 from Zacgoose/guest-add-drawer
KelvinTegelaar Mar 15, 2026
ec2be0b
Merge pull request #5612 from Zacgoose/save-bookmarks
KelvinTegelaar Mar 15, 2026
954216f
Merge pull request #5611 from luimen6/fix/securescore-alltenants-not-…
KelvinTegelaar Mar 15, 2026
d1c90f6
Merge pull request #5607 from kris6673/ap-language
KelvinTegelaar Mar 15, 2026
81bbd05
Merge pull request #5593 from luimen6/Bug/sharepoint-user-list
KelvinTegelaar Mar 15, 2026
1f9257d
Merge pull request #5604 from kris6673/SID
KelvinTegelaar Mar 15, 2026
c285579
Merge pull request #5602 from TecharyJames/feat/app-management-policy
KelvinTegelaar Mar 15, 2026
82d110e
Merge pull request #5588 from Brad-M-K/pass-config
KelvinTegelaar Mar 15, 2026
6c5d107
Merge pull request #5586 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Mar 15, 2026
d025342
Merge pull request #5585 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 15, 2026
f35d6c6
Merge pull request #5584 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 15, 2026
606fe04
Merge pull request #5583 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 15, 2026
764d48b
Merge pull request #5582 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 15, 2026
ef3dcbe
Add gdap trace & make settings tenants a regular table
rvdwegen Mar 16, 2026
ab20286
Have portals button use existing info
rvdwegen Mar 16, 2026
3de126e
fix(settings): resolve number field focus loss on retention settings
kris6673 Mar 16, 2026
d110260
Merge pull request #5621 from kris6673/fix-settings-loss-of-focus
KelvinTegelaar Mar 16, 2026
24b0b8b
Add "Show Usage" toggle to Tenant Groups page
Mar 16, 2026
eb2f113
GDAP trace fix
rvdwegen Mar 17, 2026
6d1fef2
Merge pull request #5624 from luimen6/feat/tenant-group-usage-report
KelvinTegelaar Mar 17, 2026
938cc4d
fix: enable Next Step button after template selection
kris6673 Mar 17, 2026
1ab985b
Merge pull request #5632 from kris6673/issue5594
KelvinTegelaar Mar 17, 2026
0f6d9a4
feat: enhance user offboarding functionality
JohnDuprey Mar 17, 2026
7be8724
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
JohnDuprey Mar 17, 2026
8400d20
improve user management table filters for businessPhones and assigned…
Mar 17, 2026
e008368
fix: adjust dialog fullScreen behavior and height for non-mdDown screens
JohnDuprey Mar 17, 2026
1f6b185
remove fullscreen prop
JohnDuprey Mar 17, 2026
3128bfe
Merge pull request #5635 from luimen6/fix/user-management-filters
KelvinTegelaar Mar 17, 2026
8ac1658
feat: allow scheduled task actions to be limited by label
JohnDuprey Mar 17, 2026
320ac28
chore: update version to 10.2.4 in package.json and version.json
JohnDuprey Mar 17, 2026
c70d642
Merge pull request #5639 from KelvinTegelaar/dev
JohnDuprey Mar 17, 2026
27ec503
Merge remote-tracking branch 'upstream/main' into merge-upstream-main
TecharyJames Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/cipp_dev_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:

# Upload to Azure Blob Storage
- name: Azure Blob Upload
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.8.0
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.9.0
with:
connection_string: ${{ secrets.AZURE_CONNECTION_STRING }}
container_name: cipp
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cipp_frontend_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:

# Upload to Azure Blob Storage
- name: Azure Blob Upload
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.8.0
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.9.0
with:
connection_string: ${{ secrets.AZURE_CONNECTION_STRING }}
container_name: cipp
Expand Down
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cipp",
"version": "10.2.2",
"version": "10.2.4",
"author": "CIPP Contributors",
"homepage": "https://cipp.app/",
"bugs": {
Expand Down Expand Up @@ -51,7 +51,7 @@
"@tiptap/extension-table": "^3.19.0",
"@tiptap/pm": "^3.4.1",
"@tiptap/react": "^3.4.1",
"@tiptap/starter-kit": "^3.20.0",
"@tiptap/starter-kit": "^3.20.1",
"@uiw/react-json-view": "^2.0.0-alpha.41",
"@vvo/tzdb": "^6.198.0",
"apexcharts": "5.3.5",
Expand All @@ -61,7 +61,7 @@
"export-to-csv": "^1.3.0",
"formik": "2.4.9",
"gray-matter": "4.0.3",
"i18next": "25.8.13",
"i18next": "25.8.18",
"javascript-time-ago": "^2.6.2",
"jspdf": "^4.2.0",
"jspdf-autotable": "^5.0.7",
Expand Down Expand Up @@ -98,7 +98,7 @@
"react-redux": "9.2.0",
"react-syntax-highlighter": "^16.1.0",
"react-time-ago": "^7.3.3",
"react-virtuoso": "^4.18.1",
"react-virtuoso": "^4.18.3",
"react-window": "^2.2.5",
"recharts": "^3.7.0",
"redux": "5.0.1",
Expand All @@ -110,7 +110,7 @@
"simplebar": "6.3.3",
"simplebar-react": "3.3.2",
"stylis-plugin-rtl": "2.1.1",
"typescript": "5.9.2",
"typescript": "5.9.3",
"yup": "1.7.1"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion public/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "10.2.2"
"version": "10.2.4"
}
2 changes: 1 addition & 1 deletion src/components/CippComponents/CippApiDialog.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export const CippApiDialog = (props) => {
useEffect(() => {
if (createDialog.open) {
setIsFormSubmitted(false);
formHook.reset(defaultvalues || {});
formHook.reset(typeof defaultvalues === "function" ? defaultvalues(row) : defaultvalues || {});
}
}, [createDialog.open, defaultvalues]);

Expand Down
16 changes: 10 additions & 6 deletions src/components/CippComponents/CippAutopilotProfileDrawer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ export const CippAutopilotProfileDrawer = ({
{createProfile.isLoading
? "Creating..."
: createProfile.isSuccess
? "Create Another"
: "Create Profile"}
? "Create Another"
: "Create Profile"}
</Button>
<Button variant="outlined" onClick={handleCloseDrawer}>
Close
Expand Down Expand Up @@ -154,10 +154,14 @@ export const CippAutopilotProfileDrawer = ({
type="autoComplete"
label="Language"
name="languages"
options={languageList.map(({ language, tag, "Geographic area": geographicArea }) => ({
value: tag,
label: `${language} - ${geographicArea}`, // Format as "language - geographic area" for display
}))}
options={[
{ value: "os-default", label: "Operating system default" },
{ value: "user-select", label: "User Select" },
...languageList.map(({ language, tag, "Geographic area": geographicArea }) => ({
value: tag,
label: `${language} - ${geographicArea}`, // Format as "language - geographic area" for display
})),
]}
formControl={formControl}
multiple={false}
/>
Expand Down
14 changes: 13 additions & 1 deletion src/components/CippComponents/CippInviteGuestDrawer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,23 @@ export const CippInviteGuestDrawer = ({
});
};

const handleOpenDrawer = () => {
formControl.reset({
tenantFilter: userSettingsDefaults.currentTenant,
displayName: "",
mail: "",
redirectUri: "",
message: "",
sendInvite: true,
});
setDrawerVisible(true);
};

return (
<>
<PermissionButton
requiredPermissions={requiredPermissions}
onClick={() => setDrawerVisible(true)}
onClick={handleOpenDrawer}
startIcon={<Send />}
>
{buttonText}
Expand Down
125 changes: 125 additions & 0 deletions src/components/CippComponents/CippRoleOverview.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import React from "react";
import { Box, Typography, Chip, Paper, Grid, Tooltip } from "@mui/material";
import {
CheckCircle,
Cancel,
Warning,
Security,
Info,
} from "@mui/icons-material";

/**
* Visual Role Overview Component
* Displays all roles in a grid with visual status indicators
*/
export const CippRoleOverview = ({ roles = [], onRoleClick }) => {
if (!roles || roles.length === 0) return null;

const getRoleStatus = (role) => {
if (role.isUserHasAccess) {
return {
icon: <CheckCircle />,
color: "success",
label: "Has Access",
bgColor: "success.light",
};
} else if (role.isAssigned) {
return {
icon: <Warning />,
color: "warning",
label: "Assigned but No Access",
bgColor: "warning.light",
};
} else if (role.roleExistsInRelationship) {
return {
icon: <Info />,
color: "info",
label: "In Relationship but Not Assigned",
bgColor: "info.light",
};
} else {
return {
icon: <Cancel />,
color: "default",
label: "Not In Any Relationship",
bgColor: "grey.200",
};
}
};

return (
<Grid container spacing={2}>
{roles.map((role) => {
const status = getRoleStatus(role);
return (
<Grid item xs={12} sm={6} md={4} key={role.roleId}>
<Tooltip title={role.roleDescription || role.roleName} arrow>
<Paper
elevation={2}
sx={{
p: 2,
height: "100%",
cursor: onRoleClick ? "pointer" : "default",
backgroundColor: status.bgColor,
border: 2,
borderColor: `${status.color}.main`,
transition: "all 0.2s",
"&:hover": onRoleClick
? {
elevation: 4,
transform: "translateY(-2px)",
}
: {},
}}
onClick={() => onRoleClick && onRoleClick(role)}
>
<Box sx={{ display: "flex", alignItems: "flex-start", gap: 1 }}>
<Box
sx={{
color: `${status.color}.main`,
display: "flex",
alignItems: "center",
}}
>
<Security />
</Box>
<Box sx={{ flex: 1, minWidth: 0 }}>
<Typography
variant="subtitle2"
sx={{
fontWeight: "bold",
mb: 0.5,
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
}}
>
{role.roleName}
</Typography>
<Chip
icon={status.icon}
label={status.label}
color={status.color}
size="small"
sx={{ fontSize: "0.7rem" }}
/>
{role.accessPaths && role.accessPaths.length > 0 && (
<Typography variant="caption" color="text.secondary" sx={{ display: "block", mt: 0.5 }}>
{role.accessPaths.length} access path{role.accessPaths.length !== 1 ? "s" : ""}
</Typography>
)}
{role.relationshipsWithRole && role.relationshipsWithRole.length > 0 && (
<Typography variant="caption" color="text.secondary" sx={{ display: "block", mt: 0.5 }}>
{role.relationshipsWithRole.length} group{role.relationshipsWithRole.length !== 1 ? "s" : ""}
</Typography>
)}
</Box>
</Box>
</Paper>
</Tooltip>
</Grid>
);
})}
</Grid>
);
};
6 changes: 2 additions & 4 deletions src/components/CippComponents/CippScheduledTaskActions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { EyeIcon, TrashIcon } from "@heroicons/react/24/outline";
import { CopyAll, Edit, PlayArrow } from "@mui/icons-material";
import { usePermissions } from "../../hooks/use-permissions";

export const CippScheduledTaskActions = (drawerHandlers = {}) => {
export const CippScheduledTaskActions = (drawerHandlers = {}, { hideActions = [] } = {}) => {
const { checkPermissions } = usePermissions();
const canWriteScheduler = checkPermissions(["CIPP.Scheduler.ReadWrite"]);
const canReadScheduler = checkPermissions(["CIPP.Scheduler.Read", "CIPP.Scheduler.ReadWrite"]);
Expand All @@ -29,7 +29,6 @@ export const CippScheduledTaskActions = (drawerHandlers = {}) => {
customFunction:
drawerHandlers.openEditDrawer ||
((row) => {
// Fallback to page navigation if no drawer handler provided
window.location.href = `/cipp/scheduler/job?id=${row.RowKey}`;
}),
multiPost: false,
Expand All @@ -44,7 +43,6 @@ export const CippScheduledTaskActions = (drawerHandlers = {}) => {
customFunction:
drawerHandlers.openCloneDrawer ||
((row) => {
// Fallback to page navigation if no drawer handler provided
window.location.href = `/cipp/scheduler/job?id=${row.RowKey}&Clone=True`;
}),
multiPost: false,
Expand All @@ -64,7 +62,7 @@ export const CippScheduledTaskActions = (drawerHandlers = {}) => {
multiPost: false,
condition: () => canWriteScheduler,
},
];
].filter((action) => !hideActions.includes(action.label));
};

export default CippScheduledTaskActions;
9 changes: 6 additions & 3 deletions src/components/CippComponents/CippSettingsSideBar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ export const CippSettingsSideBar = (props) => {
// Table Filter Preferences
persistFilters: formValues.persistFilters,

// Navigation Settings
bookmarkSidebar: formValues.bookmarkSidebar,
bookmarkPopover: formValues.bookmarkPopover,
bookmarkReorderMode: formValues.bookmarkReorderMode,
compactNav: formValues.compactNav,

// Portal Links Configuration
portalLinks: {
M365_Portal: formValues.portalLinks?.M365_Portal,
Expand Down Expand Up @@ -137,9 +143,6 @@ export const CippSettingsSideBar = (props) => {
Settings on this page can be saved for the current user, or all users. Select the
desired option below.
</Typography>
<Alert severity="info" variant="outlined" icon={false} sx={{ py: 0.5, px: 2 }}>
Navigation settings are per-device and stored locally, regardless of the user selector.
</Alert>
<CippFormComponent
type="autoComplete"
disableClearable={true}
Expand Down
59 changes: 27 additions & 32 deletions src/components/CippSettings/CippBackupRetentionSettings.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { Button, ButtonGroup, SvgIcon, Typography, TextField, Box } from "@mui/material";
import { Button, Typography, TextField, Box } from "@mui/material";
import CippButtonCard from "../CippCards/CippButtonCard";
import { ApiGetCall, ApiPostCall } from "../../api/ApiCall";
import { CippApiResults } from "../CippComponents/CippApiResults";
import { History } from "@mui/icons-material";
import { useState, useEffect } from "react";

const CippBackupRetentionSettings = () => {
Expand Down Expand Up @@ -55,40 +54,36 @@ const CippBackupRetentionSettings = () => {
}
};

const RetentionControls = () => {
return (
<Box sx={{ display: "flex", gap: 1, alignItems: "flex-start" }}>
<TextField
size="small"
type="number"
value={retentionDays}
onChange={handleInputChange}
disabled={retentionChange.isPending || retentionSetting.isLoading}
inputProps={{ min: 7 }}
error={!!error}
helperText={error}
sx={{ width: "120px" }}
label="Days"
/>
<Button
variant="contained"
color="primary"
size="small"
disabled={retentionChange.isPending || retentionSetting.isLoading || !!error}
onClick={handleRetentionChange}
sx={{ mt: 0.5 }}
>
Save
</Button>
</Box>
);
};

return (
<CippButtonCard
title="Backup Retention"
cardSx={{ display: "flex", flexDirection: "column", height: "100%" }}
CardButton={<RetentionControls />}
CardButton={
<Box sx={{ display: "flex", gap: 1, alignItems: "flex-start" }}>
<TextField
size="small"
type="number"
value={retentionDays}
onChange={handleInputChange}
disabled={retentionChange.isPending || retentionSetting.isLoading}
inputProps={{ min: 7 }}
error={!!error}
helperText={error}
sx={{ width: "120px" }}
label="Days"
/>
<Button
variant="contained"
color="primary"
size="small"
disabled={retentionChange.isPending || retentionSetting.isLoading || !!error}
onClick={handleRetentionChange}
sx={{ mt: 0.5 }}
>
Save
</Button>
</Box>
}
>
<Typography variant="body2">
Configure how long to keep backup files. Both CIPP system backups and tenant backups will be
Expand Down
Loading