Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
5b8019f
Add JIT group membership UI with dynamic expiration actions
Mar 15, 2026
6bacc79
chore: update intuneCollection.json
kris6673 Mar 17, 2026
e8b5d0d
Merge pull request #3 from KelvinTegelaar/main
pull[bot] Mar 18, 2026
1aabd9e
chore: Remove 'recipientType' from table
kris6673 Mar 18, 2026
75d3ed0
Update standards.json
TecharyJames Mar 18, 2026
c217027
feat(nav): add global scope indicator to nav items and search
kris6673 Mar 18, 2026
d520e8c
fix: update notification form button disabled state and add offcanvas…
JohnDuprey Mar 18, 2026
31b6d67
fix: remove tenantFilter from router query before resetting form values
JohnDuprey Mar 18, 2026
a6558bd
feat: added remaining options for Teams Global Meeting Policy standard
RSI-KaleGraybill Mar 18, 2026
92cf939
feat: add ability to edit existing User Default Templates
Mar 18, 2026
913813a
Merge pull request #5652 from RSI-KaleGraybill/dev
KelvinTegelaar Mar 18, 2026
873504c
Merge pull request #5649 from luimen6/feat/edit-user-default-templates
KelvinTegelaar Mar 18, 2026
aaaab89
Merge pull request #5647 from kris6673/nav-global-scope-indicator
KelvinTegelaar Mar 18, 2026
7d79788
Merge pull request #5615 from luimen6/feat/jit-group-membership
KelvinTegelaar Mar 18, 2026
3229315
Merge pull request #5641 from kris6673/recipientTypeGoBye
KelvinTegelaar Mar 18, 2026
4c1f480
Merge pull request #5644 from kris6673/intunecollection-update
KelvinTegelaar Mar 18, 2026
3812e2a
feat: add date range filter for incidents list
kris6673 Mar 18, 2026
20c4f5b
fix(SpeedDial): close on X click when hovering
kris6673 Mar 18, 2026
d7026fe
chore(deps): bump @tanstack/query-sync-storage-persister
dependabot[bot] Mar 18, 2026
85f1961
chore(deps): bump react-window from 2.2.5 to 2.2.7
dependabot[bot] Mar 18, 2026
41baab5
chore(deps): bump @tiptap/pm from 3.20.1 to 3.20.4
dependabot[bot] Mar 18, 2026
0ca352e
chore(deps): bump apexcharts from 5.3.5 to 5.10.4
dependabot[bot] Mar 18, 2026
30b3ccb
fix: defender deployment improvements
JohnDuprey Mar 19, 2026
018107e
fix: update logs querykey to include current tenant
JohnDuprey Mar 19, 2026
b80caa1
Disable remediation for DMARC standard as it is no longer possible
Zacgoose Mar 19, 2026
b830666
Merge pull request #5666 from TecharyJames/fix/app-management-wording
KelvinTegelaar Mar 19, 2026
d6c8302
Merge pull request #5664 from Zacgoose/dmarc-standard
KelvinTegelaar Mar 19, 2026
52ac446
Merge pull request #5656 from kris6673/add-date-range-filter-incidents
KelvinTegelaar Mar 19, 2026
97c20a6
Merge pull request #5657 from kris6673/fiz-speeddial-close
KelvinTegelaar Mar 19, 2026
d7d96da
Merge pull request #5660 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 19, 2026
1b434e1
Merge pull request #5661 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 19, 2026
8e9a59c
Merge pull request #5659 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 19, 2026
2eb21ff
Merge pull request #5662 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 19, 2026
5ee2fbc
refactor: DeployDefenderForm to enhance layout and organization with …
JohnDuprey Mar 19, 2026
1c9184e
chore: yarn updates
JohnDuprey Mar 19, 2026
c7fcd3c
fix: useSecureScore state issue and section toggle widths in executiv…
JohnDuprey Mar 19, 2026
c78c37d
fix: default bookmarks to locked
JohnDuprey Mar 19, 2026
5bcf9e5
v up
KelvinTegelaar Mar 19, 2026
3ccac64
Merge pull request #5675 from KelvinTegelaar/dev
KelvinTegelaar Mar 19, 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
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cipp",
"version": "10.2.4",
"version": "10.2.6",
"author": "CIPP Contributors",
"homepage": "https://cipp.app/",
"bugs": {
Expand Down Expand Up @@ -40,7 +40,7 @@
"@nivo/sankey": "^0.99.0",
"@react-pdf/renderer": "^4.3.2",
"@reduxjs/toolkit": "^2.11.2",
"@tanstack/query-sync-storage-persister": "^5.76.0",
"@tanstack/query-sync-storage-persister": "^5.90.25",
"@tanstack/react-query": "^5.51.11",
"@tanstack/react-query-devtools": "^5.51.11",
"@tanstack/react-query-persist-client": "^5.76.0",
Expand All @@ -49,12 +49,12 @@
"@tiptap/extension-heading": "^3.4.1",
"@tiptap/extension-image": "^3.4.1",
"@tiptap/extension-table": "^3.19.0",
"@tiptap/pm": "^3.4.1",
"@tiptap/pm": "^3.20.4",
"@tiptap/react": "^3.4.1",
"@tiptap/starter-kit": "^3.20.1",
"@uiw/react-json-view": "^2.0.0-alpha.41",
"@vvo/tzdb": "^6.198.0",
"apexcharts": "5.3.5",
"apexcharts": "5.10.4",
"axios": "^1.7.2",
"date-fns": "4.1.0",
"eml-parse-js": "^1.2.0-beta.0",
Expand Down Expand Up @@ -99,7 +99,7 @@
"react-syntax-highlighter": "^16.1.0",
"react-time-ago": "^7.3.3",
"react-virtuoso": "^4.18.3",
"react-window": "^2.2.5",
"react-window": "^2.2.7",
"recharts": "^3.7.0",
"redux": "5.0.1",
"redux-devtools-extension": "2.13.9",
Expand All @@ -118,4 +118,4 @@
"eslint": "9.39.2",
"eslint-config-next": "16.1.6"
}
}
}
4 changes: 2 additions & 2 deletions public/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "10.2.4"
}
"version": "10.2.6"
}
23 changes: 20 additions & 3 deletions src/components/CippComponents/CippCentralSearch.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,9 @@ export const CippCentralSearch = ({ handleClose, open }) => {
const inBreadcrumbs = leaf.breadcrumbs?.some((crumb) =>
crumb?.toLowerCase().includes(normalizedSearch),
);
const inScope = (leaf.scope === "global" ? "global" : "tenant").includes(normalizedSearch);
// If there's no search value, show no results (you could change this logic)
return normalizedSearch ? inTitle || inPath || inBreadcrumbs : false;
return normalizedSearch ? inTitle || inPath || inBreadcrumbs || inScope : false;
});

// Helper to bold‐highlight the matched text
Expand Down Expand Up @@ -310,7 +311,9 @@ export const CippCentralSearch = ({ handleClose, open }) => {
{searchValue.trim().length > 0 ? (
filteredItems.length > 0 ? (
<Grid container spacing={2} mt={2}>
{filteredItems.map((item, index) => (
{filteredItems.map((item, index) => {
const isGlobal = item.scope === "global";
return (
<Grid size={{ md: 12, sm: 12, xs: 12 }} key={index}>
<Card variant="outlined" sx={{ height: "100%" }}>
<CardActionArea
Expand All @@ -333,6 +336,19 @@ export const CippCentralSearch = ({ handleClose, open }) => {
>
{getItemTypeLabel(item)}
</Typography>
<Typography
variant="caption"
sx={{
px: 1,
py: 0.25,
borderRadius: 1,
backgroundColor: isGlobal ? "info.main" : "success.main",
color: "white",
fontSize: "0.7rem",
}}
>
{isGlobal ? "Global" : "Tenant"}
</Typography>
</Box>
{item.breadcrumbs && item.breadcrumbs.length > 0 && (
<Typography variant="body2" color="textSecondary" sx={{ mb: 0.5 }}>
Expand All @@ -353,7 +369,8 @@ export const CippCentralSearch = ({ handleClose, open }) => {
</CardActionArea>
</Card>
</Grid>
))}
);
})}
</Grid>
) : (
<Box mt={2}>No results found.</Box>
Expand Down
4 changes: 2 additions & 2 deletions src/components/CippComponents/CippNotificationForm.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export const CippNotificationForm = ({
.filter(Boolean);

const Severity = listNotificationConfig.data?.Severity?.map((sev) =>
severityTypes.find((stype) => stype.value === sev)
severityTypes.find((stype) => stype.value === sev),
).filter(Boolean);

formControl.reset({
Expand Down Expand Up @@ -142,7 +142,7 @@ export const CippNotificationForm = ({
<Button
variant="outlined"
onClick={notificationDialog.handleOpen}
disabled={formState.isDirty}
disabled={formState.isDirty && !formState.isSubmitSuccessful}
>
Send Test Alert
</Button>
Expand Down
7 changes: 6 additions & 1 deletion src/components/CippComponents/CippSpeedDial.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,12 @@ const CippSpeedDial = ({
return acc;
}, {});

const handleSpeedDialClose = () => {
const handleSpeedDialClose = (event, reason) => {
if (reason === "toggle") {
setSpeedDialOpen(false);
setIsHovering(false);
return;
}
if (!isHovering) {
setTimeout(() => {
setSpeedDialOpen(false);
Expand Down
29 changes: 21 additions & 8 deletions src/components/CippFormPages/CippFormPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,11 @@ const CippFormPage = (props) => {
const { isValid, isDirty } = useFormState({ control: formControl.control });

useEffect(() => {
delete router.query.tenantFilter;

if (router.query) {
const { tenantFilter: _tenantFilter, ...queryWithoutTenant } = router.query;
const resetValues = {
...formControl.getValues(),
...router.query,
...queryWithoutTenant,
};
formControl.reset(resetValues);
}
Expand All @@ -79,12 +78,26 @@ const CippFormPage = (props) => {
const values = customDataformatter
? customDataformatter(formControl.getValues())
: formControl.getValues();
//remove all empty values or blanks
Object.keys(values).forEach((key) => {
if (values[key] === "" || values[key] === null) {
delete values[key];
//remove all empty values or blanks (recursively)
const removeEmpty = (obj) => {
if (Array.isArray(obj)) {
return obj
.map((item) => (item && typeof item === "object" ? removeEmpty(item) : item))
.filter((item) => item !== "" && item !== null && item !== undefined);
}
});
Object.keys(obj).forEach((key) => {
if (obj[key] === "" || obj[key] === null || obj[key] === undefined) {
delete obj[key];
} else if (typeof obj[key] === "object") {
obj[key] = removeEmpty(obj[key]);
if (!Array.isArray(obj[key]) && Object.keys(obj[key]).length === 0) {
delete obj[key];
}
}
});
return obj;
};
removeEmpty(values);
postCall.mutate({
url: postUrl,
data: values,
Expand Down
106 changes: 51 additions & 55 deletions src/components/ExecutiveReportButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
Switch,
Grid,
Paper,
Stack,
IconButton,
} from "@mui/material";
import { PictureAsPdf, Download, Close, Settings } from "@mui/icons-material";
Expand Down Expand Up @@ -3065,64 +3066,59 @@ export const ExecutiveReportButton = (props) => {
in real-time.
</Typography>

<Grid container spacing={1.5}>
<Stack spacing={1.5}>
{sectionOptions.map((option) => (
<Grid item xs={12} key={option.key}>
<Paper
sx={{
p: 1.5,
border: "1px solid",
borderColor: sectionConfig[option.key] ? "primary.main" : "divider",
bgcolor: sectionConfig[option.key] ? "primary.50" : "background.paper",
cursor: "pointer",
transition: "all 0.2s ease-in-out",
"&:hover": {
borderColor: "primary.main",
bgcolor: sectionConfig[option.key] ? "primary.100" : "primary.25",
},
<Paper
key={option.key}
onClick={() => handleSectionToggle(option.key)}
sx={{
p: 1.5,
border: "1px solid",
borderColor: sectionConfig[option.key] ? "primary.main" : "divider",
bgcolor: sectionConfig[option.key] ? "primary.50" : "background.paper",
cursor: "pointer",
transition: "all 0.2s ease-in-out",
display: "flex",
alignItems: "center",
"&:hover": {
borderColor: "primary.main",
bgcolor: sectionConfig[option.key] ? "primary.100" : "primary.25",
},
}}
>
<Switch
checked={sectionConfig[option.key]}
onChange={(event) => {
event.stopPropagation();
handleSectionToggle(option.key);
}}
>
<FormControlLabel
control={
<Switch
checked={sectionConfig[option.key]}
onChange={(event) => {
event.stopPropagation();
handleSectionToggle(option.key);
}}
color="primary"
size="small"
disabled={
// Disable if this is the last enabled section
sectionConfig[option.key] &&
Object.values(sectionConfig).filter(Boolean).length === 1
}
/>
}
label={
<Box onClick={() => handleSectionToggle(option.key)}>
<Typography
variant="subtitle2"
fontWeight="bold"
sx={{ fontSize: "0.875rem" }}
>
{option.label}
</Typography>
<Typography
variant="caption"
color="text.secondary"
sx={{ fontSize: "0.75rem" }}
>
{option.description}
</Typography>
</Box>
}
sx={{ margin: 0, width: "100%" }}
/>
</Paper>
</Grid>
onClick={(event) => event.stopPropagation()}
color="primary"
size="small"
disabled={
sectionConfig[option.key] &&
Object.values(sectionConfig).filter(Boolean).length === 1
}
/>
<Box sx={{ ml: 1, flexGrow: 1 }}>
<Typography
variant="subtitle2"
fontWeight="bold"
sx={{ fontSize: "0.875rem" }}
>
{option.label}
</Typography>
<Typography
variant="caption"
color="text.secondary"
sx={{ fontSize: "0.75rem" }}
>
{option.description}
</Typography>
</Box>
</Paper>
))}
</Grid>
</Stack>

<Box sx={{ mt: 3, p: 2, bgcolor: "primary.50", borderRadius: 1 }}>
<Typography variant="caption" color="primary.main" fontWeight="bold">
Expand Down
Loading