Skip to content

Dev to release #4431

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 139 commits into from
Jul 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
a481730
Feat: Add button to create new room list in Room Lists page
kris6673 Jun 18, 2025
f9e528a
Add Edit functionality to Room Lists Page: Introduce an 'Edit Room Li…
kris6673 Jun 18, 2025
66c134a
standalone edit page
kris6673 Jun 23, 2025
f78bb97
Enhance EditRoomList component to track original allowExternal value …
kris6673 Jun 23, 2025
ba739f5
Remove 'View included Rooms' action from Room Lists page and delete a…
kris6673 Jun 23, 2025
71ec479
Added Clear Immutable ID to preferences page
BNWEIN Jun 24, 2025
8438d8e
Add alert for on-premises Active Directory sync warning in group edit…
BNWEIN Jun 24, 2025
0f80f46
feat: Enhance group editing functionality with initial value tracking…
kris6673 Jun 24, 2025
9dc920e
Feat: Implement compact list view for standards in CippStandardDialog…
Jr7468 Jun 24, 2025
ba66f3d
Enhance CippChartCard with onClick functionality and add Tooltip for …
Jr7468 Jun 24, 2025
89c351a
Enhance CippUserActions component by adding available licenses count
kris6673 Jun 26, 2025
29f875e
feat: Add 'Hide group mailbox from Outlook' option in group editing form
kris6673 Jun 26, 2025
481ffe0
simplify with a loop
kris6673 Jun 26, 2025
9d3f1b1
Feat: Add new standard for configuring SharePoint default sharing lin…
kris6673 Jun 26, 2025
5fb2cf8
Deprecate SPDirectSharing
kris6673 Jun 26, 2025
a6e4b89
Remove last of grid and unstable grid 2 imports
Zacgoose Jun 27, 2025
30cb8d6
fix trailing slash
JohnDuprey Jun 27, 2025
d85e252
Move stuff into consts and add icons
kris6673 Jun 28, 2025
76adbd1
Fix: Fix tablefilter
kris6673 Jun 28, 2025
ed3f5d3
Few more filters
kris6673 Jun 28, 2025
35563f2
Update default filter settings for app consent requests
kris6673 Jun 28, 2025
eb58b29
Change method to PATCH as used by the CIPP-API
ngms-psh Jun 29, 2025
d768c12
Dynamically set language by script type
ngms-psh Jun 29, 2025
a0f3e3d
Merge pull request #4374 from kris6673/app-consent
KelvinTegelaar Jun 29, 2025
7741312
Merge pull request #4372 from Zacgoose/more-grid-fixes
KelvinTegelaar Jun 29, 2025
c8019cb
Merge pull request #4367 from kris6673/feat-license-count
KelvinTegelaar Jun 29, 2025
60cc854
Merge pull request #4349 from Jr7468/StandardListView
KelvinTegelaar Jun 29, 2025
f8cde3f
Merge pull request #4347 from kris6673/edit-group
KelvinTegelaar Jun 29, 2025
2c21331
Merge pull request #4346 from BNWEIN/dev
KelvinTegelaar Jun 29, 2025
688968d
Merge pull request #4336 from kris6673/room-lists
KelvinTegelaar Jun 29, 2025
5f137c9
Merge pull request #4350 from Jr7468/StandardsAppliedCard
KelvinTegelaar Jun 29, 2025
053f05d
Fixes ugly filter bar.
KelvinTegelaar Jun 29, 2025
6ea5361
visual changes
KelvinTegelaar Jun 29, 2025
ae28a73
Fixes duplicate scroll
KelvinTegelaar Jun 29, 2025
ad89e42
API endpoint now uses POST method
ngms-psh Jun 29, 2025
958f5d9
Make list view prettier
KelvinTegelaar Jun 29, 2025
a03a6c3
HOTFIX: Another index on BEC page not defined
Zacgoose Jun 30, 2025
a669419
new standard CustomBannedPasswordList
kris6673 Jun 29, 2025
cd749af
added AzureADandPersonalMicrosoftAccount
KelvinTegelaar Jun 30, 2025
7947600
Merge pull request #4376 from Zacgoose/BECFIX
KelvinTegelaar Jun 30, 2025
e32a812
Add defender exclusions page
kris6673 Jun 30, 2025
6b2a51f
Prettification
KelvinTegelaar Jun 30, 2025
d0caebf
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jun 30, 2025
6fbc794
improve handling of saving and loading of user settings
JohnDuprey Jul 1, 2025
4041811
invalidate userSettings on branding save
JohnDuprey Jul 1, 2025
17b0125
fix immutable getValues
JohnDuprey Jul 1, 2025
66910ae
remove invalid property from form defaultValues
JohnDuprey Jul 1, 2025
bdb3f12
explicitly define payload
JohnDuprey Jul 1, 2025
76b765b
prep for menu hiding
KelvinTegelaar Jul 1, 2025
65d75fb
edit template experiment
KelvinTegelaar Jul 1, 2025
49f1b83
remove config file
KelvinTegelaar Jul 1, 2025
c973095
edit template functionality changes
KelvinTegelaar Jul 1, 2025
ae0f207
Merge pull request #4375 from ngms-psh/fix-scriptedit
KelvinTegelaar Jul 2, 2025
88a9bb9
Merge pull request #4377 from kris6673/CustomBannedPasswordList
KelvinTegelaar Jul 2, 2025
9f173f7
Merge pull request #4368 from kris6673/issue4234
KelvinTegelaar Jul 2, 2025
f07a00d
add ability to hide menu items
KelvinTegelaar Jul 2, 2025
849ff93
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jul 2, 2025
7ada3da
update CA template editing
KelvinTegelaar Jul 2, 2025
c8deed2
add some helper text to graph filters
JohnDuprey Jul 2, 2025
cce9ca9
finish template editor
KelvinTegelaar Jul 2, 2025
bc78e70
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jul 2, 2025
f1b3ce0
Merge pull request #4380 from kris6673/defender-exclusions
JohnDuprey Jul 2, 2025
e262c24
Another CIPP heater issues
Zacgoose Jul 3, 2025
73d9e35
Merge pull request #4394 from Zacgoose/another-cipp-heater-issues
KelvinTegelaar Jul 3, 2025
27d5e6b
unused imports
KelvinTegelaar Jul 3, 2025
8424e95
consolidate convert mailbox action and add more options
kris6673 Jul 3, 2025
aa2e9c1
Consolidate sign in and reset password
kris6673 Jul 3, 2025
2834b50
Enhance CippApiDialog and CippUserActions with real-time validation a…
kris6673 Jul 3, 2025
e1733d9
Refactor mailbox conversion options in CippExchangeActions and update…
kris6673 Jul 3, 2025
db09fc4
consolidate copy sent items and hide from GAL actions
kris6673 Jul 3, 2025
bd706bb
Merge pull request #4398 from kris6673/user-actions-smallification
KelvinTegelaar Jul 4, 2025
a5bc5bb
Improve CippFormUserSelector and edit group form
JohnDuprey Jul 8, 2025
7decd9d
Update CippFormContactSelector.jsx
JohnDuprey Jul 8, 2025
08c183b
fix posted properties for edit group
JohnDuprey Jul 8, 2025
8a86a18
add migration sstandard for auth states
KelvinTegelaar Jul 8, 2025
bfc3efa
potential fix for thing
KelvinTegelaar Jul 8, 2025
b4c9fac
updated date
KelvinTegelaar Jul 8, 2025
ac6c9cd
tenant group support in cipp roles
JohnDuprey Jul 8, 2025
eb72725
Add service provider exception
Jul 9, 2025
a7c7b93
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
Jul 9, 2025
3aa4ec7
remove unnecessary key prop from RichTextEditor to fix loss of focus …
kris6673 Jul 9, 2025
34fda06
Add CippFormSkeleton while loading the data
kris6673 Jul 9, 2025
5d266dd
add support for tenant groups
JohnDuprey Jul 10, 2025
024a524
tenant group support for scripted alerts
JohnDuprey Jul 10, 2025
95302c4
prettier tenant handling
JohnDuprey Jul 10, 2025
83162db
update alerts page
JohnDuprey Jul 10, 2025
d34ad01
summarize permissions with wildcards
JohnDuprey Jul 10, 2025
a62f6ff
add permission checking hook and functions
JohnDuprey Jul 10, 2025
043fd20
Add Dynamics Business Central role
Jul 10, 2025
26534ac
fix dev bug for the goose man
JohnDuprey Jul 10, 2025
59c264a
Merge pull request #4415 from kris6673/add-skeleton
KelvinTegelaar Jul 10, 2025
f5b5bbe
Update AppApprovalTemplateForm.jsx
JohnDuprey Jul 10, 2025
145cc6a
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
JohnDuprey Jul 10, 2025
6015794
add company name
JohnDuprey Jul 10, 2025
5731e4a
multiple user support for vacation mode
JohnDuprey Jul 11, 2025
fa4f12f
fix positioning in offcanvas
JohnDuprey Jul 11, 2025
c449fcc
add view task details for vacation mode
JohnDuprey Jul 11, 2025
551c97d
Update index.js
JohnDuprey Jul 11, 2025
b2408b7
scheduled task improvements
JohnDuprey Jul 11, 2025
d5c4bc5
improve vacation mode form
JohnDuprey Jul 11, 2025
a78392e
Update index.js
JohnDuprey Jul 11, 2025
f9a40ef
Merge pull request #4413 from kris6673/fix-loss-of-focus
KelvinTegelaar Jul 11, 2025
7cec816
scheduler fixes
JohnDuprey Jul 11, 2025
c12eaf5
application gallery support
JohnDuprey Jul 11, 2025
6495dae
app manifest support
JohnDuprey Jul 11, 2025
947ea5f
Update AppApprovalTemplateForm.jsx
JohnDuprey Jul 11, 2025
397e03e
form tweaks
JohnDuprey Jul 11, 2025
813b584
Update AppApprovalTemplateForm.jsx
JohnDuprey Jul 11, 2025
bddee63
cleanup console logs
JohnDuprey Jul 11, 2025
95212bb
new actions for applications
JohnDuprey Jul 12, 2025
2cc8e25
tweak form element
JohnDuprey Jul 12, 2025
9dad757
add file upload
JohnDuprey Jul 12, 2025
a0464cd
Add template creation
JohnDuprey Jul 12, 2025
eb64e9a
Update app-registrations.js
JohnDuprey Jul 12, 2025
0479415
Update app-registrations.js
JohnDuprey Jul 12, 2025
21d85b2
Update app-registrations.js
JohnDuprey Jul 12, 2025
15a7b64
fixes richText
KelvinTegelaar Jul 12, 2025
2c29cb5
compliance stuff
KelvinTegelaar Jul 12, 2025
288c8e4
Add loading skeleton for contact edit and template pages
kris6673 Jul 10, 2025
6146b3b
Update license files to newest from MS
kris6673 Jul 11, 2025
f4a6da5
add disable Ca
KelvinTegelaar Jul 12, 2025
38312f6
add support for details objects in api results
JohnDuprey Jul 12, 2025
5ab9caa
new allignment score page
KelvinTegelaar Jul 12, 2025
c0af995
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jul 12, 2025
264726b
interface pimpin;
KelvinTegelaar Jul 12, 2025
b75f1da
Fixes standards
KelvinTegelaar Jul 12, 2025
dc8657d
allow remediation again
KelvinTegelaar Jul 12, 2025
bbc6a6d
Alerts added
KelvinTegelaar Jul 13, 2025
2cad20e
licensesing stuff
KelvinTegelaar Jul 14, 2025
cbb2bb8
combined alignment score
KelvinTegelaar Jul 14, 2025
0c0cd09
Refactor .gitignore to update AI rules section
kris6673 Jul 14, 2025
458f406
Merge pull request #4425 from kris6673/license-update
KelvinTegelaar Jul 14, 2025
65bf0a0
Merge pull request #4419 from kris6673/more-skeletons
KelvinTegelaar Jul 14, 2025
da72513
adds new filters and status for licenses
KelvinTegelaar Jul 14, 2025
8ee3692
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jul 14, 2025
5ac0ae2
Merge pull request #4430 from kris6673/ai-rules-folders
KelvinTegelaar Jul 14, 2025
fced2b9
removes date
KelvinTegelaar Jul 14, 2025
1915961
flipped colour levels for clarify
KelvinTegelaar Jul 14, 2025
471c082
up version
KelvinTegelaar Jul 14, 2025
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
5 changes: 2 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,5 @@ yarn-error.log*
debug.log
app.log

# Cursor IDE
.cursor/rules

# AI rules
.*/rules
4 changes: 2 additions & 2 deletions public/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "8.1.1"
}
"version": "8.2.0"
}
14 changes: 13 additions & 1 deletion src/components/CippCards/CippChartCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ export const CippChartCard = ({
chartType = "donut",
title,
actions,
onClick,
}) => {
const [range, setRange] = useState("Last 7 days");
const [barSeries, setBarSeries] = useState([]);
Expand All @@ -109,7 +110,18 @@ export const CippChartCard = ({
}, [chartType, chartSeries.length, labels]);

return (
<Card style={{ width: "100%", height: "100%" }}>
<Card
style={{ width: "100%", height: "100%" }}
onClick={onClick}
sx={{
cursor: onClick ? "pointer" : "default",
transition: "all 0.2s ease-in-out",
"&:hover": onClick ? {
boxShadow: (theme) => theme.shadows[8],
transform: "translateY(-2px)",
} : {},
}}
>
<CardHeader
action={
actions ? (
Expand Down
326 changes: 326 additions & 0 deletions src/components/CippCards/CippStandardsDialog.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,326 @@
import React, { useState } from "react";
import _ from "lodash";
import {
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Typography,
Box,
Chip,
Stack,
Divider,
Card,
CardContent,
Grid,
IconButton,
Tooltip,
Accordion,
AccordionSummary,
AccordionDetails,
} from "@mui/material";
import {
Close as CloseIcon,
Info as InfoIcon,
Warning as WarningIcon,
CheckCircle as CheckCircleIcon,
Assignment as AssignmentIcon,
Notifications as NotificationsIcon,
Construction as ConstructionIcon,
Public as PublicIcon,
Cloud as CloudIcon,
Email as EmailIcon,
Security as SecurityIcon,
PhoneAndroid as PhoneAndroidIcon,
ExpandMore as ExpandMoreIcon,
} from "@mui/icons-material";
import { SvgIcon } from "@mui/material";
import standards from "../../data/standards.json";

const getCategoryIcon = (category) => {
switch (category) {
case "Global Standards":
return <PublicIcon fontSize="small" />;
case "Entra (AAD) Standards":
return <CloudIcon fontSize="small" />;
case "Exchange Standards":
return <EmailIcon fontSize="small" />;
case "Defender Standards":
return <SecurityIcon fontSize="small" />;
case "Intune Standards":
return <PhoneAndroidIcon fontSize="small" />;
default:
return <PublicIcon fontSize="small" />;
}
};

const getActionIcon = (action) => {
switch (action?.toLowerCase()) {
case "report":
return <AssignmentIcon fontSize="small" />;
case "alert":
case "warn":
return <NotificationsIcon fontSize="small" />;
case "remediate":
return <ConstructionIcon fontSize="small" />;
default:
return <InfoIcon fontSize="small" />;
}
};

const getImpactColor = (impact) => {
switch (impact?.toLowerCase()) {
case "low impact":
return "info";
case "medium impact":
return "warning";
case "high impact":
return "error";
default:
return "default";
}
};

export const CippStandardsDialog = ({ open, onClose, standardsData, currentTenant }) => {
const [expanded, setExpanded] = useState(false);
if (!standardsData) return null;

// Get applicable templates for the current tenant
const applicableTemplates = standardsData.filter((template) => {
const tenantFilterArr = Array.isArray(template?.tenantFilter) ? template.tenantFilter : [];
const excludedTenantsArr = Array.isArray(template?.excludedTenants)
? template.excludedTenants
: [];

const tenantInFilter =
tenantFilterArr.length > 0 && tenantFilterArr.some((tf) => tf.value === currentTenant);

const allTenantsTemplate =
tenantFilterArr.some((tf) => tf.value === "AllTenants") &&
(excludedTenantsArr.length === 0 ||
!excludedTenantsArr.some((et) => et.value === currentTenant));

return tenantInFilter || allTenantsTemplate;
});

// Combine standards from all applicable templates
const combinedStandards = {};
for (const template of applicableTemplates) {
for (const [standardKey, standardValue] of Object.entries(template.standards)) {
combinedStandards[standardKey] = standardValue;
}
}

// Group standards by category
const standardsByCategory = {};
Object.entries(combinedStandards).forEach(([standardKey, standardConfig]) => {
const standardInfo = standards.find((s) => s.name === `standards.${standardKey}`);
if (standardInfo) {
const category = standardInfo.cat;
if (!standardsByCategory[category]) {
standardsByCategory[category] = [];
}
standardsByCategory[category].push({
key: standardKey,
config: standardConfig,
info: standardInfo,
});
}
});

const handleAccordionChange = (panel) => (event, isExpanded) => {
setExpanded(isExpanded ? panel : false);
};

return (
<Dialog
open={open}
onClose={onClose}
maxWidth="lg"
fullWidth
PaperProps={{
sx: {
maxHeight: "90vh",
},
}}
>
<DialogTitle
sx={{ m: 0, p: 2, display: "flex", justifyContent: "space-between", alignItems: "center" }}
>
<Typography variant="h6">Standards Configuration</Typography>
<IconButton
aria-label="close"
onClick={onClose}
sx={{
color: (theme) => theme.palette.grey[500],
}}
>
<CloseIcon />
</IconButton>
</DialogTitle>
<DialogContent dividers>
<Stack spacing={2}>
<Box>
<Typography variant="body2" color="text.secondary" gutterBottom>
Showing standards configuration for tenant: <strong>{currentTenant}</strong>
</Typography>
<Typography variant="body2" color="text.secondary">
Total templates applied: <strong>{applicableTemplates.length}</strong> | Total
standards: <strong>{Object.keys(combinedStandards).length}</strong>
</Typography>
</Box>

{Object.entries(standardsByCategory).map(([category, categoryStandards], idx) => (
<Accordion
key={category}
expanded={expanded === category}
onChange={handleAccordionChange(category)}
sx={{
mb: 1,
borderRadius: 2,
boxShadow: "none",
border: (theme) => `1px solid ${theme.palette.divider}`,
"&:before": { display: "none" },
}}
>
<AccordionSummary
expandIcon={<ExpandMoreIcon />}
aria-controls={`${category}-content`}
id={`${category}-header`}
sx={{
minHeight: 48,
"& .MuiAccordionSummary-content": { alignItems: "center", m: 0 },
}}
>
<Stack direction="row" alignItems="center" spacing={1}>
<SvgIcon color="primary">{getCategoryIcon(category)}</SvgIcon>
<Typography variant="subtitle1" fontWeight={600}>
{category}
</Typography>
<Chip
label={`${categoryStandards.length} standards`}
size="small"
variant="outlined"
/>
</Stack>
</AccordionSummary>
<AccordionDetails sx={{ pt: 1, pb: 2 }}>
<Grid container spacing={1}>
{categoryStandards.map(({ key, config, info }) => (
<Grid item xs={12} md={6} key={key}>
<Card variant="outlined" sx={{ height: "100%", mb: 1, p: 0 }}>
<CardContent sx={{ p: 1.5, "&:last-child": { pb: 1.5 } }}>
<Stack spacing={1}>
<Box>
<Typography variant="subtitle2" fontWeight="bold">
{info.label}
</Typography>
<Typography variant="caption" color="text.secondary">
{info.helpText}
</Typography>
</Box>
<Stack direction="row" spacing={0.5} flexWrap="wrap">
<Chip
label={info.impact}
size="small"
color={getImpactColor(info.impact)}
variant="outlined"
/>
{info.tag && info.tag.length > 0 && (
<Chip
label={`${info.tag.length} tags`}
size="small"
variant="outlined"
/>
)}
</Stack>
<Box>
<Typography variant="caption" fontWeight="bold" gutterBottom>
Actions:
</Typography>
<Stack direction="row" spacing={0.5} flexWrap="wrap">
{config.action && Array.isArray(config.action) ? (
config.action.map((action, index) => (
<Chip
key={index}
icon={getActionIcon(action.value)}
label={action.value}
size="small"
variant="outlined"
color={
action.value?.toLowerCase() === "remediate"
? "error"
: action.value?.toLowerCase() === "alert" ||
action.value?.toLowerCase() === "warn"
? "warning"
: "info"
}
/>
))
) : (
<Typography variant="caption" color="text.secondary">
No actions configured
</Typography>
)}
</Stack>
</Box>

{info.addedComponent && info.addedComponent.length > 0 && (
<Box>
<Typography variant="caption" fontWeight="bold" gutterBottom>
Fields:
</Typography>
<Stack spacing={0.5}>
{info.addedComponent.map((component, index) => {
const componentValue = _.get(config, component.name);
const displayValue =
componentValue?.label || componentValue || "N/A";
return (
<Box
key={index}
sx={{ display: "flex", flexDirection: "column", gap: 0.5 }}
>
<Typography variant="caption" color="text.secondary">
{component.label || component.name}:
</Typography>
<Chip
label={displayValue}
size="small"
variant="outlined"
/>
</Box>
);
})}
</Stack>
</Box>
)}
</Stack>
</CardContent>
</Card>
</Grid>
))}
</Grid>
</AccordionDetails>
</Accordion>
))}

{Object.keys(standardsByCategory).length === 0 && (
<Box textAlign="center" py={4}>
<Typography variant="h6" color="text.secondary">
No standards configured for this tenant
</Typography>
<Typography variant="body2" color="text.secondary">
Standards templates may not be applied to this tenant or no standards are currently
active.
</Typography>
</Box>
)}
</Stack>
</DialogContent>
<DialogActions>
<Button onClick={onClose}>Close</Button>
</DialogActions>
</Dialog>
);
};
Loading
Loading