From 5952a7d28db4e60ec7ee308c51f2e544922b50ac Mon Sep 17 00:00:00 2001 From: redanthrax Date: Mon, 27 Jan 2025 12:51:56 -0800 Subject: [PATCH 01/51] Update required engine to Node 20. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c2c57ba925d..6ee40b74d760 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "https://github.com/KelvinTegelaar/CIPP/issues" }, "engines": { - "node": "^18.17.0" + "node": "^20.18.2" }, "repository": { "type": "git", From 56242de9403fb97e68a51b0474914374d3c21724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Mon, 27 Jan 2025 23:12:57 +0100 Subject: [PATCH 02/51] Add fallback message for empty license translations --- src/utils/get-cipp-license-translation.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/get-cipp-license-translation.js b/src/utils/get-cipp-license-translation.js index 813e52a5d1e9..e77574c713a9 100644 --- a/src/utils/get-cipp-license-translation.js +++ b/src/utils/get-cipp-license-translation.js @@ -21,5 +21,9 @@ export const getCippLicenseTranslation = (licenseArray) => { } }); - return licenses.join(", "); + const result = licenses.join(", "); + if (!result) { + return "No Licenses Assigned"; + } + return result; }; From 2968075eb198bbe524b011bd08ae774e6fb607d6 Mon Sep 17 00:00:00 2001 From: redanthrax Date: Mon, 27 Jan 2025 14:38:19 -0800 Subject: [PATCH 03/51] Trim standards search, show output with 0 results, min width --- .../CippStandards/CippStandardDialog.jsx | 224 ++++++++++-------- 1 file changed, 126 insertions(+), 98 deletions(-) diff --git a/src/components/CippStandards/CippStandardDialog.jsx b/src/components/CippStandards/CippStandardDialog.jsx index 2fb081155944..d2b94853e6ee 100644 --- a/src/components/CippStandards/CippStandardDialog.jsx +++ b/src/components/CippStandards/CippStandardDialog.jsx @@ -42,13 +42,18 @@ const CippStandardDialog = ({ const handleSearchQueryChange = useCallback( debounce((query) => { - setSearchQuery(query); + setSearchQuery(query.trim()); }, 50), [] ); return ( - + Select a Standard to Add handleSearchQueryChange(e.target.value.toLowerCase())} /> - {Object.keys(categories).map((category) => - filterStandards(categories[category]).map((standard) => ( - - - - - {standard.label} - - {standard.helpText && ( - <> - - Description: - - - {standard.helpText} - - - )} - - Category: - - - {standard.tag?.filter((tag) => !tag.toLowerCase().includes("impact")).length > - 0 && ( - <> - - Tags: - - - {standard.tag - .filter((tag) => !tag.toLowerCase().includes("impact")) - .map((tag, idx) => ( - - ))} - - - )} - - Impact: - - - {standard.recommendedBy?.length > 0 && ( - <> - - Recommended By: - - - {standard.recommendedBy.join(", ")} - - - )} - - - - {standard.multiple ? ( - filterStandards(categories[category]).length === 0 + ) ? ( + + Search returned no results + + ) : ( + Object.keys(categories).map((category) => + filterStandards(categories[category]).map((standard) => ( + + + + + {standard.label} + + {standard.helpText && ( + <> + + Description: + + + {standard.helpText} + + + )} + + Category: + + handleAddClick(standard.name)} - > - - - ) : ( - handleToggleSingleStandard(standard.name)} - /> + sx={{ mt: 1, mb: 2 }} + /> + {standard.tag?.filter((tag) => !tag.toLowerCase().includes("impact")).length > + 0 && ( + <> + + Tags: + + + {standard.tag + .filter((tag) => !tag.toLowerCase().includes("impact")) + .map((tag, idx) => ( + + ))} + + + )} + + Impact: + + - )} - - - - )) + {standard.recommendedBy?.length > 0 && ( + <> + + Recommended By: + + + {standard.recommendedBy.join(", ")} + + + )} + + + + {standard.multiple ? ( + handleAddClick(standard.name)} + > + + + ) : ( + + handleToggleSingleStandard(standard.name) + } + /> + } + label="Add this standard to the template" + /> + )} + + + + )) + ) )} From 6005b874999d0db4d1c8f71bd6528509a78f304f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Mon, 27 Jan 2025 23:41:21 +0100 Subject: [PATCH 04/51] Add User ID display to user tabs --- src/components/CippCards/CippUserInfoCard.jsx | 5 ++ .../administration/users/user/bec.jsx | 48 +++++++++---------- .../users/user/conditional-access.jsx | 6 ++- .../administration/users/user/devices.jsx | 6 ++- .../administration/users/user/edit.jsx | 8 +++- .../administration/users/user/exchange.jsx | 8 +++- .../administration/users/user/index.jsx | 8 +++- 7 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/components/CippCards/CippUserInfoCard.jsx b/src/components/CippCards/CippUserInfoCard.jsx index 8b9048f46fec..49c0ec716ab1 100644 --- a/src/components/CippCards/CippUserInfoCard.jsx +++ b/src/components/CippCards/CippUserInfoCard.jsx @@ -91,6 +91,11 @@ export const CippUserInfoCard = (props) => { ) } /> + : user?.id || "N/A"} + /> { return "No mailbox permission changes found."; }; + const subtitle = userRequest.isSuccess + ? [ + { + icon: , + text: , + }, + { + icon: , + text: , + }, + { + icon: , + text: ( + <> + Created: + + ), + }, + ] + : []; + return ( , - text: ( - - ), - }, - { - icon: , - text: ( - <> - Created:{" "} - - - ), - }, - ] - : [] - } + subtitle={subtitle} isFetching={userRequest.isFetching} > {/* Loading State: Show only Remediation Card and Check 1 with Loading Skeleton */} diff --git a/src/pages/identity/administration/users/user/conditional-access.jsx b/src/pages/identity/administration/users/user/conditional-access.jsx index 6bda3f8534c2..5d85ae736cff 100644 --- a/src/pages/identity/administration/users/user/conditional-access.jsx +++ b/src/pages/identity/administration/users/user/conditional-access.jsx @@ -4,7 +4,7 @@ import { useSettings } from "/src/hooks/use-settings"; import { useRouter } from "next/router"; import CippFormSkeleton from "/src/components/CippFormPages/CippFormSkeleton"; import CalendarIcon from "@heroicons/react/24/outline/CalendarIcon"; -import { Mail, Forward } from "@mui/icons-material"; +import { Mail, Forward, Fingerprint } from "@mui/icons-material"; import { HeaderedTabbedLayout } from "../../../../../layouts/HeaderedTabbedLayout"; import tabOptions from "./tabOptions"; import ReactTimeAgo from "react-time-ago"; @@ -41,6 +41,10 @@ const Page = () => { icon: , text: , }, + { + icon: , + text: , + }, { icon: , text: ( diff --git a/src/pages/identity/administration/users/user/devices.jsx b/src/pages/identity/administration/users/user/devices.jsx index b0d5d9649b89..23cda503df3a 100644 --- a/src/pages/identity/administration/users/user/devices.jsx +++ b/src/pages/identity/administration/users/user/devices.jsx @@ -4,7 +4,7 @@ import { useRouter } from "next/router"; import { ApiGetCall } from "/src/api/ApiCall"; import CippFormSkeleton from "/src/components/CippFormPages/CippFormSkeleton"; import CalendarIcon from "@heroicons/react/24/outline/CalendarIcon"; -import { Check, Mail } from "@mui/icons-material"; +import { Check, Mail, Fingerprint } from "@mui/icons-material"; import { HeaderedTabbedLayout } from "../../../../../layouts/HeaderedTabbedLayout"; import tabOptions from "./tabOptions"; import ReactTimeAgo from "react-time-ago"; @@ -50,6 +50,10 @@ const Page = () => { icon: , text: , }, + { + icon: , + text: , + }, { icon: , text: ( diff --git a/src/pages/identity/administration/users/user/edit.jsx b/src/pages/identity/administration/users/user/edit.jsx index 8cd113275022..539ed69d1d98 100644 --- a/src/pages/identity/administration/users/user/edit.jsx +++ b/src/pages/identity/administration/users/user/edit.jsx @@ -9,7 +9,7 @@ import { useEffect } from "react"; import CippFormSkeleton from "/src/components/CippFormPages/CippFormSkeleton"; import { getCippLicenseTranslation } from "/src/utils/get-cipp-license-translation"; import CalendarIcon from "@heroicons/react/24/outline/CalendarIcon"; -import { Mail } from "@mui/icons-material"; +import { Mail, Fingerprint } from "@mui/icons-material"; import { HeaderedTabbedLayout } from "../../../../../layouts/HeaderedTabbedLayout"; import tabOptions from "./tabOptions"; import { CippCopyToClipBoard } from "../../../../../components/CippComponents/CippCopyToClipboard"; @@ -55,11 +55,15 @@ const Page = () => { icon: , text: , }, + { + icon: , + text: , + }, { icon: , text: ( <> - Created + Created: ), }, diff --git a/src/pages/identity/administration/users/user/exchange.jsx b/src/pages/identity/administration/users/user/exchange.jsx index 29082e3b6fb8..beccf92393e2 100644 --- a/src/pages/identity/administration/users/user/exchange.jsx +++ b/src/pages/identity/administration/users/user/exchange.jsx @@ -4,7 +4,7 @@ import { useRouter } from "next/router"; import { ApiGetCall } from "/src/api/ApiCall"; import CippFormSkeleton from "/src/components/CippFormPages/CippFormSkeleton"; import CalendarIcon from "@heroicons/react/24/outline/CalendarIcon"; -import { Check, Error, Mail } from "@mui/icons-material"; +import { Check, Error, Mail, Fingerprint } from "@mui/icons-material"; import { HeaderedTabbedLayout } from "../../../../../layouts/HeaderedTabbedLayout"; import tabOptions from "./tabOptions"; import { CippTimeAgo } from "../../../../../components/CippComponents/CippTimeAgo"; @@ -101,11 +101,15 @@ const Page = () => { ), }, + { + icon: , + text: , + }, { icon: , text: ( <> - Created + Created: ), }, diff --git a/src/pages/identity/administration/users/user/index.jsx b/src/pages/identity/administration/users/user/index.jsx index 984371102e4f..f7d8937590d5 100644 --- a/src/pages/identity/administration/users/user/index.jsx +++ b/src/pages/identity/administration/users/user/index.jsx @@ -4,7 +4,7 @@ import { useRouter } from "next/router"; import { ApiGetCall } from "/src/api/ApiCall"; import CippFormSkeleton from "/src/components/CippFormPages/CippFormSkeleton"; import CalendarIcon from "@heroicons/react/24/outline/CalendarIcon"; -import { AdminPanelSettings, Check, Group, Mail } from "@mui/icons-material"; +import { AdminPanelSettings, Check, Group, Mail, Fingerprint } from "@mui/icons-material"; import { HeaderedTabbedLayout } from "../../../../../layouts/HeaderedTabbedLayout"; import tabOptions from "./tabOptions"; import { CippCopyToClipBoard } from "../../../../../components/CippComponents/CippCopyToClipboard"; @@ -122,11 +122,15 @@ const Page = () => { icon: , text: , }, + { + icon: , + text: , + }, { icon: , text: ( <> - Created + Created: ), }, From bcdbd1a081cd6cc2cd3538b4a2cf5db3e6027536 Mon Sep 17 00:00:00 2001 From: Esco Date: Tue, 28 Jan 2025 13:11:17 +0100 Subject: [PATCH 05/51] fix: revert back to location --- src/pages/identity/reports/risk-detections/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/pages/identity/reports/risk-detections/index.js b/src/pages/identity/reports/risk-detections/index.js index f6fe5e6b07da..3c54fc260e31 100644 --- a/src/pages/identity/reports/risk-detections/index.js +++ b/src/pages/identity/reports/risk-detections/index.js @@ -23,8 +23,7 @@ const Page = () => { "userDisplayName", "userPrincipalName", "detectedDateTime", - "location.city", - "location.countryOrRegion", + "location", "ipAddress", "riskLevel", "riskState", @@ -39,8 +38,7 @@ const Page = () => { const simpleColumns = [ "detectedDateTime", "userPrincipalName", - "location.city", - "location.countryOrRegion", + "location", "ipAddress", "riskState", "riskDetail", From 0523c8cc4db8a5f9b25cf3708af11f76d6c916ed Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 28 Jan 2025 10:59:24 -0500 Subject: [PATCH 06/51] bring back offboarding defaults --- .../CippWizard/CippWizardOffboarding.jsx | 10 ++++++++++ src/pages/cipp/preferences.js | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/components/CippWizard/CippWizardOffboarding.jsx b/src/components/CippWizard/CippWizardOffboarding.jsx index 7d69817bcf52..d61e9365c1e5 100644 --- a/src/components/CippWizard/CippWizardOffboarding.jsx +++ b/src/components/CippWizard/CippWizardOffboarding.jsx @@ -5,12 +5,14 @@ import { CippFormCondition } from "../CippComponents/CippFormCondition"; import { useWatch } from "react-hook-form"; import { useEffect, useState } from "react"; import { Grid } from "@mui/system"; +import { useSettings } from "../../hooks/use-settings"; export const CippWizardOffboarding = (props) => { const { postUrl, formControl, onPreviousStep, onNextStep, currentStep } = props; const currentTenant = formControl.watch("tenantFilter"); const selectedUsers = useWatch({ control: formControl.control, name: "user" }); const [showAlert, setShowAlert] = useState(false); + const userSettingsDefaults = useSettings().userSettingsDefaults; useEffect(() => { if (selectedUsers.length >= 4) { @@ -19,6 +21,14 @@ export const CippWizardOffboarding = (props) => { } }, [selectedUsers]); + useEffect(() => { + if (userSettingsDefaults?.offboardingDefaults) { + userSettingsDefaults.offboardingDefaults.forEach((setting) => { + formControl.setValue(setting.name, setting.value); + }); + } + }, [userSettingsDefaults]); + return ( diff --git a/src/pages/cipp/preferences.js b/src/pages/cipp/preferences.js index 6cc782d44508..a6c34d96bbab 100644 --- a/src/pages/cipp/preferences.js +++ b/src/pages/cipp/preferences.js @@ -255,6 +255,26 @@ const Page = () => { /> ), }, + { + label: "Disable Sign in", + value: ( + + ), + }, + { + label: "Remove all MFA Devices", + value: ( + + ), + }, ]} /> From 6dd731b63dfa29de61712c41f9bfaaf1d1a0b33e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 22:44:59 +0100 Subject: [PATCH 07/51] Add icons for permission actions in OneDrive page --- src/pages/teams-share/onedrive/index.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/pages/teams-share/onedrive/index.js b/src/pages/teams-share/onedrive/index.js index c14fd268acb2..842b0737cbcc 100644 --- a/src/pages/teams-share/onedrive/index.js +++ b/src/pages/teams-share/onedrive/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { PersonAdd, PersonRemove } from "@mui/icons-material"; const Page = () => { const pageTitle = "OneDrive"; @@ -7,6 +8,7 @@ const Page = () => { const actions = [ { label: "Add permissions to OneDrive", + icon: , type: "POST", url: "/api/ExecSharePointPerms", data: { @@ -36,6 +38,7 @@ const Page = () => { }, { label: "Remove permissions from OneDrive", + icon: , type: "POST", url: "/api/ExecSharePointPerms", data: { @@ -65,17 +68,11 @@ const Page = () => { }, ]; - const offCanvas = { - extendedInfoFields: ["UPN"], - actions: actions, - }; - return ( Date: Tue, 28 Jan 2025 23:06:56 +0100 Subject: [PATCH 08/51] Remove unused actions and offCanvas variables from Azure AD Connect report --- src/pages/identity/reports/azure-ad-connect-report/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/pages/identity/reports/azure-ad-connect-report/index.js b/src/pages/identity/reports/azure-ad-connect-report/index.js index 529ce0333b4e..97594a13d6ac 100644 --- a/src/pages/identity/reports/azure-ad-connect-report/index.js +++ b/src/pages/identity/reports/azure-ad-connect-report/index.js @@ -9,9 +9,6 @@ const simpleColumns = [ ]; const apiUrl = "/api/ListAzureADConnectStatus"; -const actions = []; // No actions specified in the original code - -const offCanvas = null; // No off-canvas details provided const Page = () => { return ( @@ -21,8 +18,6 @@ const Page = () => { apiData={{ DataToReturn: "AzureADObjectsInError", }} - actions={actions} - offCanvas={offCanvas} simpleColumns={simpleColumns} /> ); From a4f8f1b45d02565cceab345a25d09daa0028ddd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:07:01 +0100 Subject: [PATCH 09/51] Remove unused actions and offCanvas variables from Sign Ins Report --- src/pages/identity/reports/signin-report/index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pages/identity/reports/signin-report/index.js b/src/pages/identity/reports/signin-report/index.js index 6304b8fa0da6..619f99ef8bcd 100644 --- a/src/pages/identity/reports/signin-report/index.js +++ b/src/pages/identity/reports/signin-report/index.js @@ -7,8 +7,6 @@ import CippButtonCard from "/src/components/CippCards/CippButtonCard"; const Page = () => { const pageTitle = "Sign Ins Report"; const apiUrl = "/api/ListSignIns"; - const actions = []; - const offCanvas = null; const simpleColumns = [ "createdDateTime", "userPrincipalName", @@ -16,6 +14,7 @@ const Page = () => { "authenticationRequirement", "errorCode", "additionalDetails", + "ipAddress", "locationcipp", ]; @@ -102,8 +101,6 @@ const Page = () => { title={pageTitle} apiUrl={apiUrl} apiData={appliedFilters} - actions={actions} - offCanvas={offCanvas} simpleColumns={simpleColumns} queryKey={`ListSignIns-${JSON.stringify(appliedFilters)}`} /> From 2e095d04182ce497b60b05a4bca5a98c369ce791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:21:52 +0100 Subject: [PATCH 10/51] Refactor user filters in administration page for improved readability --- .../identity/administration/users/index.js | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/pages/identity/administration/users/index.js b/src/pages/identity/administration/users/index.js index c03a62bb56cd..ec4552915b18 100644 --- a/src/pages/identity/administration/users/index.js +++ b/src/pages/identity/administration/users/index.js @@ -9,6 +9,24 @@ const Page = () => { const pageTitle = "Users"; const tenant = useSettings().currentTenant; + const filters = [ + { + filterName: "Account Enabled", + value: [{ id: "accountEnabled", value: "Yes" }], + type: "column", + }, + { + filterName: "Account Disabled", + value: [{ id: "accountEnabled", value: "No" }], + type: "column", + }, + { + filterName: "Guest Accounts", + value: [{ id: "userType", value: "Guest" }], + type: "column", + }, + ]; + const offCanvas = { extendedInfoFields: [ "createdDateTime", // Created Date (UTC) @@ -67,24 +85,7 @@ const Page = () => { "proxyAddresses", "assignedLicenses", ]} - filters={[ - { - filterName: "Account Enabled", - //true or false filters by yes/no - value: [{ id: "accountEnabled", value: "Yes" }], - type: "column", - }, - { - filterName: "Account Disabled", - value: [{ id: "accountEnabled", value: "No" }], - type: "column", - }, - { - filterName: "Guest Accounts", - value: [{ id: "userType", value: "Guest" }], - type: "column", - }, - ]} + filters={filters} /> ); }; From 4745883169c56171d618cea04c07d979373b64af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:22:02 +0100 Subject: [PATCH 11/51] Add filters and actions to MFA Report page --- .../identity/reports/mfa-report/index.js | 75 ++++++++++++++++--- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/src/pages/identity/reports/mfa-report/index.js b/src/pages/identity/reports/mfa-report/index.js index fd18f1bdef0c..02ee1058648e 100644 --- a/src/pages/identity/reports/mfa-report/index.js +++ b/src/pages/identity/reports/mfa-report/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { LockPerson } from "@mui/icons-material"; const Page = () => { const pageTitle = "MFA Report"; @@ -15,19 +16,71 @@ const Page = () => { "MFAMethods", "CAPolicies", ]; + const filters = [ + { + filterName: "Enabled, licensed users", + value: [ + { id: "AccountEnabled", value: "Yes" }, + { id: "isLicensed", value: "Yes" }, + ], + type: "column", + }, + { + filterName: "Enabled, licensed users missing MFA", + value: [ + { id: "AccountEnabled", value: "Yes" }, + { id: "isLicensed", value: "Yes" }, + { id: "MFARegistration", value: "No" }, + ], + type: "column", + }, + { + filterName: "No MFA methods registered", + value: [{ id: "MFARegistration", value: "No" }], + type: "column", + }, + { + filterName: "MFA methods registered", + value: [{ id: "MFARegistration", value: "Yes" }], + type: "column", + }, + ]; - /* Filters not supported in the current structure, need dev attention for integration. - filterlist: [ - { filterName: 'Enabled users', filter: '"accountEnabled":true' }, - { filterName: 'Non-guest users', filter: 'Complex: UPN notlike #EXT#' }, - { filterName: 'Licensed users', filter: 'Complex: IsLicensed eq true' }, - { filterName: 'Enabled, licensed non-guest users missing MFA', filter: 'Complex: UPN notlike #EXT#; IsLicensed eq true; accountEnabled eq true; MFARegistration ne true' }, - { filterName: 'No MFA methods registered', filter: 'Complex: MFARegistration ne true' }, - { filterName: 'MFA methods registered', filter: 'Complex: MFARegistration eq true' }, - ], - */ + const actions = [ + { + //tested + label: "Set Per-User MFA", + type: "POST", + icon: , + url: "/api/ExecPerUserMFA", + data: { userId: "UPN" }, + fields: [ + { + type: "autoComplete", + name: "State", + label: "State", + options: [ + { label: "Enforced", value: "Enforced" }, + { label: "Enabled", value: "Enabled" }, + { label: "Disabled", value: "Disabled" }, + ], + multiple: false, + }, + ], + confirmText: "Are you sure you want to set per-user MFA for these users?", + multiPost: false, + }, + ]; - return ; + return ( + + ); }; Page.getLayout = (page) => {page}; From 59adc40f8811ebe16bdd2f0f7c2fd643e2e0f945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:24:02 +0100 Subject: [PATCH 12/51] Restrict creatable option for MFA user actions --- src/components/CippComponents/CippUserActions.jsx | 1 + src/pages/identity/reports/mfa-report/index.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/CippComponents/CippUserActions.jsx b/src/components/CippComponents/CippUserActions.jsx index fe532d259f4b..f88d909281e8 100644 --- a/src/components/CippComponents/CippUserActions.jsx +++ b/src/components/CippComponents/CippUserActions.jsx @@ -98,6 +98,7 @@ export const CippUserActions = () => { { label: "Disabled", value: "Disabled" }, ], multiple: false, + creatable: false, }, ], confirmText: "Are you sure you want to set per-user MFA for these users?", diff --git a/src/pages/identity/reports/mfa-report/index.js b/src/pages/identity/reports/mfa-report/index.js index 02ee1058648e..206e8337e2ef 100644 --- a/src/pages/identity/reports/mfa-report/index.js +++ b/src/pages/identity/reports/mfa-report/index.js @@ -48,7 +48,6 @@ const Page = () => { const actions = [ { - //tested label: "Set Per-User MFA", type: "POST", icon: , @@ -65,6 +64,7 @@ const Page = () => { { label: "Disabled", value: "Disabled" }, ], multiple: false, + creatable: false, }, ], confirmText: "Are you sure you want to set per-user MFA for these users?", From b363c663a22bc9113076e9d570f28e65a035456e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:40:19 +0100 Subject: [PATCH 13/51] Remove unused actions and offCanvas variables --- .../tenant/administration/list-licenses/index.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/pages/tenant/administration/list-licenses/index.js b/src/pages/tenant/administration/list-licenses/index.js index 1a4abfc73707..417e1ef16910 100644 --- a/src/pages/tenant/administration/list-licenses/index.js +++ b/src/pages/tenant/administration/list-licenses/index.js @@ -5,28 +5,16 @@ const Page = () => { const pageTitle = "Licenses Report"; const apiUrl = "/api/ListLicenses"; - const actions = []; // No actions specified, setting to empty array - - const offCanvas = null; // No off-canvas details provided - const simpleColumns = [ "Tenant", "License", "CountUsed", "CountAvailable", "TotalLicenses", - "TermInfo", + "TermInfo", // TODO TermInfo is not showing as a clickable json object in the table, like CApolicies does in the mfa report. IDK how to fix it. -Bobby ]; - return ( - - ); + return ; }; Page.getLayout = (page) => {page}; From 8cf68f8379742398d95fef88b546f1e3acf3fb51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:47:09 +0100 Subject: [PATCH 14/51] Update tenant reports pathing to be the same as other pages --- src/layouts/config.js | 6 +++--- .../application-consent/index.js | 0 .../{administration => reports}/list-csp-licenses/index.jsx | 0 .../{administration => reports}/list-licenses/index.js | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/pages/tenant/{administration => reports}/application-consent/index.js (100%) rename src/pages/tenant/{administration => reports}/list-csp-licenses/index.jsx (100%) rename src/pages/tenant/{administration => reports}/list-licenses/index.js (100%) diff --git a/src/layouts/config.js b/src/layouts/config.js index d9685ba29de4..c2f375de7f8b 100644 --- a/src/layouts/config.js +++ b/src/layouts/config.js @@ -154,15 +154,15 @@ export const nativeMenuItems = [ items: [ { title: "Licence Report", - path: "/tenant/administration/list-licenses", + path: "/tenant/reports/list-licenses", }, { title: "Sherweb Licence Report", - path: "/tenant/administration/list-csp-licenses", + path: "/tenant/reports/list-csp-licenses", }, { title: "Consented Applications", - path: "/tenant/administration/application-consent", + path: "/tenant/reports/application-consent", }, ], }, diff --git a/src/pages/tenant/administration/application-consent/index.js b/src/pages/tenant/reports/application-consent/index.js similarity index 100% rename from src/pages/tenant/administration/application-consent/index.js rename to src/pages/tenant/reports/application-consent/index.js diff --git a/src/pages/tenant/administration/list-csp-licenses/index.jsx b/src/pages/tenant/reports/list-csp-licenses/index.jsx similarity index 100% rename from src/pages/tenant/administration/list-csp-licenses/index.jsx rename to src/pages/tenant/reports/list-csp-licenses/index.jsx diff --git a/src/pages/tenant/administration/list-licenses/index.js b/src/pages/tenant/reports/list-licenses/index.js similarity index 100% rename from src/pages/tenant/administration/list-licenses/index.js rename to src/pages/tenant/reports/list-licenses/index.js From 295d71f44c3872a29ed2379b09a66b7a2f3ca3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 28 Jan 2025 23:49:46 +0100 Subject: [PATCH 15/51] Update device management path to align with new endpoint structure --- src/layouts/config.js | 2 +- src/pages/endpoint/{reports => MEM}/devices/index.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/pages/endpoint/{reports => MEM}/devices/index.js (100%) diff --git a/src/layouts/config.js b/src/layouts/config.js index c2f375de7f8b..bc501b15c43e 100644 --- a/src/layouts/config.js +++ b/src/layouts/config.js @@ -244,7 +244,7 @@ export const nativeMenuItems = [ title: "Device Management", path: "/endpoint/MEM", items: [ - { title: "Devices", path: "/endpoint/reports/devices" }, + { title: "Devices", path: "/endpoint/MEM/devices" }, { title: "Configuration Policies", path: "/endpoint/MEM/list-policies" }, { title: "Compliance Policies", path: "/endpoint/MEM/list-compliance-policies" }, { title: "Protection Policies", path: "/endpoint/MEM/list-appprotection-policies" }, diff --git a/src/pages/endpoint/reports/devices/index.js b/src/pages/endpoint/MEM/devices/index.js similarity index 100% rename from src/pages/endpoint/reports/devices/index.js rename to src/pages/endpoint/MEM/devices/index.js From ac0f4523cf2f5bc4f2d6e68978559af2a5af94ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:02:51 +0100 Subject: [PATCH 16/51] forgot a spot --- generate-placeholders.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate-placeholders.js b/generate-placeholders.js index 9858fc7f7b7c..f1733c0eb830 100644 --- a/generate-placeholders.js +++ b/generate-placeholders.js @@ -82,7 +82,7 @@ const pages = [ { title: "Add Profile", path: "/endpoint/autopilot/add-profile" }, { title: "Status Pages", path: "/endpoint/autopilot/list-status-pages" }, { title: "Add Status Page", path: "/endpoint/autopilot/add-status-page" }, - { title: "Devices", path: "/endpoint/reports/devices" }, + { title: "Devices", path: "/endpoint/MEM/devices" }, { title: "Configuration Policies", path: "/endpoint/MEM/list-policies" }, { title: "Compliance Policies", path: "/endpoint/MEM/list-compliance-policies" }, { title: "Protection Policies", path: "/endpoint/MEM/list-appprotection-policies" }, From d41a0b72c806023d0b078f6fdd19e63be03ba5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:04:36 +0100 Subject: [PATCH 17/51] Update transport paths in email layout for consistency --- src/layouts/config.js | 6 +++--- .../list-connector-templates/index.js | 0 .../email/{connectors => transport}/list-connectors/add.jsx | 0 .../{connectors => transport}/list-connectors/index.js | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/pages/email/{connectors => transport}/list-connector-templates/index.js (100%) rename src/pages/email/{connectors => transport}/list-connectors/add.jsx (100%) rename src/pages/email/{connectors => transport}/list-connectors/index.js (100%) diff --git a/src/layouts/config.js b/src/layouts/config.js index bc501b15c43e..f14a9b4feb0b 100644 --- a/src/layouts/config.js +++ b/src/layouts/config.js @@ -315,17 +315,17 @@ export const nativeMenuItems = [ }, { title: "Transport", - path: "/email/Transport", + path: "/email/transport", items: [ { title: "Transport rules", path: "/email/transport/list-rules" }, { title: "Transport Templates", path: "/email/transport/list-templates", }, - { title: "Connectors", path: "/email/connectors/list-connectors" }, + { title: "Connectors", path: "/email/transport/list-connectors" }, { title: "Connector Templates", - path: "/email/connectors/list-connector-templates", + path: "/email/transport/list-connector-templates", }, ], }, diff --git a/src/pages/email/connectors/list-connector-templates/index.js b/src/pages/email/transport/list-connector-templates/index.js similarity index 100% rename from src/pages/email/connectors/list-connector-templates/index.js rename to src/pages/email/transport/list-connector-templates/index.js diff --git a/src/pages/email/connectors/list-connectors/add.jsx b/src/pages/email/transport/list-connectors/add.jsx similarity index 100% rename from src/pages/email/connectors/list-connectors/add.jsx rename to src/pages/email/transport/list-connectors/add.jsx diff --git a/src/pages/email/connectors/list-connectors/index.js b/src/pages/email/transport/list-connectors/index.js similarity index 100% rename from src/pages/email/connectors/list-connectors/index.js rename to src/pages/email/transport/list-connectors/index.js From db5f73f69e92ad766c3e0cb8fd3669abb70b9dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:05:26 +0100 Subject: [PATCH 18/51] Update connectors paths to align with transport structure --- generate-placeholders.js | 4 ++-- src/pages/email/transport/list-connectors/index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generate-placeholders.js b/generate-placeholders.js index f1733c0eb830..560e7680e3b1 100644 --- a/generate-placeholders.js +++ b/generate-placeholders.js @@ -108,9 +108,9 @@ const pages = [ { title: "Transport rules", path: "/email/transport/list-rules" }, { title: "Deploy Transport rule", path: "/email/transport/deploy-rules" }, { title: "Transport Templates", path: "/email/transport/list-templates" }, - { title: "Connectors", path: "/email/connectors/list-connectors" }, + { title: "Connectors", path: "/email/transport/list-connectors" }, { title: "Deploy Connector Templates", path: "/email/connectors/deploy-connector" }, - { title: "Connector Templates", path: "/email/connectors/list-connector-templates" }, + { title: "Connector Templates", path: "/email/transport/list-connector-templates" }, { title: "Spamfilter", path: "/email/spamfilter/list-spamfilter" }, { title: "Apply Spamfilter Template", path: "/email/spamfilter/deploy" }, { title: "Templates", path: "/email/spamfilter/list-templates" }, diff --git a/src/pages/email/transport/list-connectors/index.js b/src/pages/email/transport/list-connectors/index.js index 58799a4bd6dc..c61b44ad6fa2 100644 --- a/src/pages/email/transport/list-connectors/index.js +++ b/src/pages/email/transport/list-connectors/index.js @@ -83,7 +83,7 @@ const Page = () => { }} cardButton={ <> - From 311c3606565ecb4d4e64821c2f2d60ffc7099bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:09:48 +0100 Subject: [PATCH 19/51] Fix path casing in email administration and remove unused deploy connector page --- src/layouts/config.js | 2 +- .../email/connectors/deploy-connector/index.js | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) delete mode 100644 src/pages/email/connectors/deploy-connector/index.js diff --git a/src/layouts/config.js b/src/layouts/config.js index f14a9b4feb0b..75bf312ddd87 100644 --- a/src/layouts/config.js +++ b/src/layouts/config.js @@ -300,7 +300,7 @@ export const nativeMenuItems = [ items: [ { title: "Administration", - path: "/email/Administration", + path: "/email/administration", items: [ { title: "Mailboxes", path: "/email/administration/mailboxes" }, { title: "Deleted Mailboxes", path: "/email/administration/deleted-mailboxes" }, diff --git a/src/pages/email/connectors/deploy-connector/index.js b/src/pages/email/connectors/deploy-connector/index.js deleted file mode 100644 index cddfb2691027..000000000000 --- a/src/pages/email/connectors/deploy-connector/index.js +++ /dev/null @@ -1,17 +0,0 @@ - -import { Layout as DashboardLayout } from "/src/layouts/index.js"; - -const Page = () => { - const pageTitle = "Deploy Connector Templates"; - - return ( -
-

{pageTitle}

-

This is a placeholder page for the deploy connector templates section.

-
- ); -}; - -Page.getLayout = (page) => {page}; - -export default Page; From f040f64cecfd240b8844661a80039e98e17300e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:17:42 +0100 Subject: [PATCH 20/51] Remove unused placeholder and reorder to fit the rest of CIPPs pages --- src/layouts/config.js | 7 +++++-- .../email/connectionfilter/deploy/index.js | 17 ----------------- src/pages/email/spamfilter/deploy/index.js | 17 ----------------- .../list-connectionfilter-templates}/index.js | 0 .../list-connectionfilter/add.jsx | 0 .../list-connectionfilter/index.js | 10 ++-------- 6 files changed, 7 insertions(+), 44 deletions(-) delete mode 100644 src/pages/email/connectionfilter/deploy/index.js delete mode 100644 src/pages/email/spamfilter/deploy/index.js rename src/pages/email/{connectionfilter/list-templates => spamfilter/list-connectionfilter-templates}/index.js (100%) rename src/pages/email/{connectionfilter => spamfilter}/list-connectionfilter/add.jsx (100%) rename src/pages/email/{connectionfilter => spamfilter}/list-connectionfilter/index.js (85%) diff --git a/src/layouts/config.js b/src/layouts/config.js index 75bf312ddd87..d3e24167dc9d 100644 --- a/src/layouts/config.js +++ b/src/layouts/config.js @@ -335,8 +335,11 @@ export const nativeMenuItems = [ items: [ { title: "Spamfilter", path: "/email/spamfilter/list-spamfilter" }, { title: "Spamfilter templates", path: "/email/spamfilter/list-templates" }, - { title: "Connection filter", path: "/email/connectionfilter/list-connectionfilter" }, - { title: "Connection filter templates", path: "/email/connectionfilter/list-templates" }, + { title: "Connection filter", path: "/email/spamfilter/list-connectionfilter" }, + { + title: "Connection filter templates", + path: "/email/spamfilter/list-connectionfilter-templates", + }, ], }, { diff --git a/src/pages/email/connectionfilter/deploy/index.js b/src/pages/email/connectionfilter/deploy/index.js deleted file mode 100644 index 92cbabc77ae2..000000000000 --- a/src/pages/email/connectionfilter/deploy/index.js +++ /dev/null @@ -1,17 +0,0 @@ - -import { Layout as DashboardLayout } from "/src/layouts/index.js"; - -const Page = () => { - const pageTitle = "Apply Spamfilter Template"; - - return ( -
-

{pageTitle}

-

This is a placeholder page for the apply spamfilter template section.

-
- ); -}; - -Page.getLayout = (page) => {page}; - -export default Page; diff --git a/src/pages/email/spamfilter/deploy/index.js b/src/pages/email/spamfilter/deploy/index.js deleted file mode 100644 index 92cbabc77ae2..000000000000 --- a/src/pages/email/spamfilter/deploy/index.js +++ /dev/null @@ -1,17 +0,0 @@ - -import { Layout as DashboardLayout } from "/src/layouts/index.js"; - -const Page = () => { - const pageTitle = "Apply Spamfilter Template"; - - return ( -
-

{pageTitle}

-

This is a placeholder page for the apply spamfilter template section.

-
- ); -}; - -Page.getLayout = (page) => {page}; - -export default Page; diff --git a/src/pages/email/connectionfilter/list-templates/index.js b/src/pages/email/spamfilter/list-connectionfilter-templates/index.js similarity index 100% rename from src/pages/email/connectionfilter/list-templates/index.js rename to src/pages/email/spamfilter/list-connectionfilter-templates/index.js diff --git a/src/pages/email/connectionfilter/list-connectionfilter/add.jsx b/src/pages/email/spamfilter/list-connectionfilter/add.jsx similarity index 100% rename from src/pages/email/connectionfilter/list-connectionfilter/add.jsx rename to src/pages/email/spamfilter/list-connectionfilter/add.jsx diff --git a/src/pages/email/connectionfilter/list-connectionfilter/index.js b/src/pages/email/spamfilter/list-connectionfilter/index.js similarity index 85% rename from src/pages/email/connectionfilter/list-connectionfilter/index.js rename to src/pages/email/spamfilter/list-connectionfilter/index.js index cd6e9482ada8..be6506c4db26 100644 --- a/src/pages/email/connectionfilter/list-connectionfilter/index.js +++ b/src/pages/email/spamfilter/list-connectionfilter/index.js @@ -32,13 +32,7 @@ const Page = () => { actions: actions, }; - const simpleColumns = [ - "Name", - "IsDefault", - "IPAllowList", - "IPBlockList", - "EnableSafeList", - ]; + const simpleColumns = ["Name", "IsDefault", "IPAllowList", "IPBlockList", "EnableSafeList"]; return ( { simpleColumns={simpleColumns} cardButton={ <> - From dcdfc849ab8f8dd21abc29148433c06e46f5e85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:20:26 +0100 Subject: [PATCH 21/51] Add Book icon to connection filter page --- src/pages/email/spamfilter/list-connectionfilter/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/email/spamfilter/list-connectionfilter/index.js b/src/pages/email/spamfilter/list-connectionfilter/index.js index be6506c4db26..97e8cd8f963f 100644 --- a/src/pages/email/spamfilter/list-connectionfilter/index.js +++ b/src/pages/email/spamfilter/list-connectionfilter/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { Book } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -14,6 +15,7 @@ const Page = () => { dataFunction: (data) => { return { ...data }; }, + icon: , confirmText: "Are you sure you want to create a template based on this rule?", }, ]; From c7c8a3e235d7c0969df67557ebaffa94b53c46d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:29:17 +0100 Subject: [PATCH 22/51] Update link in domains analyser to point to tools section --- src/pages/tenant/standards/domains-analyser/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/tenant/standards/domains-analyser/index.js b/src/pages/tenant/standards/domains-analyser/index.js index 218e8a8633b4..1a5c2e9b4a68 100644 --- a/src/pages/tenant/standards/domains-analyser/index.js +++ b/src/pages/tenant/standards/domains-analyser/index.js @@ -36,7 +36,7 @@ const Page = () => { apiUrl="/api/ListDomainAnalyser" cardButton={ <> - {/* This needs to be replaced with a CippApiDialog. */} From a1b4b46907719a9e524c62904ac768de203c403d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:31:46 +0100 Subject: [PATCH 23/51] Update paths for Graph Explorer, Application Approval, and Individual Domain Check to align with tools section --- generate-placeholders.js | 6 +++--- src/layouts/config.js | 6 +++--- .../tenant/{administration => tools}/appapproval/index.js | 0 .../{administration => tools}/graph-explorer/index.js | 0 .../tenant/{standards => tools}/individual-domains/index.js | 0 5 files changed, 6 insertions(+), 6 deletions(-) rename src/pages/tenant/{administration => tools}/appapproval/index.js (100%) rename src/pages/tenant/{administration => tools}/graph-explorer/index.js (100%) rename src/pages/tenant/{standards => tools}/individual-domains/index.js (100%) diff --git a/generate-placeholders.js b/generate-placeholders.js index 560e7680e3b1..2f6b614fe9a8 100644 --- a/generate-placeholders.js +++ b/generate-placeholders.js @@ -35,11 +35,11 @@ const pages = [ { title: "Backup Wizard", path: "/tenant/backup/backup-wizard" }, { title: "Restore Wizard", path: "/tenant/backup/restore-wizard" }, { title: "Tools", path: "/tenant/administration" }, - { title: "Graph Explorer", path: "/tenant/administration/graph-explorer" }, - { title: "Application Approval", path: "/tenant/administration/appapproval" }, + { title: "Graph Explorer", path: "/tenant/tools/graph-explorer" }, + { title: "Application Approval", path: "/tenant/tools/appapproval" }, { title: "IP Database", path: "/tenant/tools/geoiplookup" }, { title: "Tenant Lookup", path: "/tenant/administration/tenantlookup" }, - { title: "Individual Domain Check", path: "/tenant/standards/individual-domains" }, + { title: "Individual Domain Check", path: "/tenant/tools/individual-domains" }, { title: "BPA Report Builder", path: "/tenant/tools/bpa-report-builder" }, { title: "Standards", path: "/tenant/standards" }, { title: "Edit Standards", path: "/tenant/standards/list-applied-standards" }, diff --git a/src/layouts/config.js b/src/layouts/config.js index d3e24167dc9d..e8c6d541c9be 100644 --- a/src/layouts/config.js +++ b/src/layouts/config.js @@ -402,11 +402,11 @@ export const nativeMenuItems = [ items: [ { title: "Graph Explorer", - path: "/tenant/administration/graph-explorer", + path: "/tenant/tools/graph-explorer", }, { title: "Application Approval", - path: "/tenant/administration/appapproval", + path: "/tenant/tools/appapproval", }, { title: "Tenant Lookup", path: "/tenant/tools/tenantlookup" }, @@ -414,7 +414,7 @@ export const nativeMenuItems = [ { title: "Individual Domain Check", - path: "/tenant/standards/individual-domains", + path: "/tenant/tools/individual-domains", }, ], }, diff --git a/src/pages/tenant/administration/appapproval/index.js b/src/pages/tenant/tools/appapproval/index.js similarity index 100% rename from src/pages/tenant/administration/appapproval/index.js rename to src/pages/tenant/tools/appapproval/index.js diff --git a/src/pages/tenant/administration/graph-explorer/index.js b/src/pages/tenant/tools/graph-explorer/index.js similarity index 100% rename from src/pages/tenant/administration/graph-explorer/index.js rename to src/pages/tenant/tools/graph-explorer/index.js diff --git a/src/pages/tenant/standards/individual-domains/index.js b/src/pages/tenant/tools/individual-domains/index.js similarity index 100% rename from src/pages/tenant/standards/individual-domains/index.js rename to src/pages/tenant/tools/individual-domains/index.js From afbfd9c7d31babbdbb969ab5f7dacb4a0b93478c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 00:54:32 +0100 Subject: [PATCH 24/51] Add icons for device actions in the autopilot device list --- src/pages/endpoint/autopilot/list-devices/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/endpoint/autopilot/list-devices/index.js b/src/pages/endpoint/autopilot/list-devices/index.js index b738be0ba6af..d924ec33b3d5 100644 --- a/src/pages/endpoint/autopilot/list-devices/index.js +++ b/src/pages/endpoint/autopilot/list-devices/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { PersonAdd, Delete } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -9,6 +10,7 @@ const Page = () => { const actions = [ { label: "Assign device", + icon: , type: "POST", url: "/api/ExecAssignAPDevice", data: { @@ -38,6 +40,7 @@ const Page = () => { }, { label: "Delete Device", + icon: , type: "POST", url: "/api/RemoveAPDevice", data: { ID: "id" }, From 23bb3774e178fd14cfd6f76984bf6575957144c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 01:07:58 +0100 Subject: [PATCH 25/51] Fix Add Status Page placeholder --- .../autopilot/add-status-page/index.js | 118 ++++++++++++++++- .../autopilot/list-status-pages/add.jsx | 123 ------------------ .../autopilot/list-status-pages/index.js | 2 +- 3 files changed, 113 insertions(+), 130 deletions(-) delete mode 100644 src/pages/endpoint/autopilot/list-status-pages/add.jsx diff --git a/src/pages/endpoint/autopilot/add-status-page/index.js b/src/pages/endpoint/autopilot/add-status-page/index.js index 2ee87af41a8e..1a3454035a19 100644 --- a/src/pages/endpoint/autopilot/add-status-page/index.js +++ b/src/pages/endpoint/autopilot/add-status-page/index.js @@ -1,14 +1,120 @@ - +import React from "react"; +import { Grid, Divider } from "@mui/material"; +import { useForm, useWatch } from "react-hook-form"; import { Layout as DashboardLayout } from "/src/layouts/index.js"; +import CippFormPage from "/src/components/CippFormPages/CippFormPage"; +import CippFormComponent from "/src/components/CippComponents/CippFormComponent"; +import { CippFormTenantSelector } from "/src/components/CippComponents/CippFormTenantSelector"; const Page = () => { - const pageTitle = "Add Status Page"; + const formControl = useForm({ + mode: "onChange", + defaultValues: { + TimeOutInMinutes: "", + ErrorMessage: "", + ShowProgress: false, + EnableLog: false, + OBEEOnly: false, + blockDevice: false, + Allowretry: false, + AllowReset: false, + AllowFail: false, + }, + }); return ( -
-

{pageTitle}

-

This is a placeholder page for the add status page section.

-
+ + + {/* Tenant Selector */} + + + + + + + {/* Form Fields */} + + + + + + + + + {/* Switches */} + + + + + + + + + + + ); }; diff --git a/src/pages/endpoint/autopilot/list-status-pages/add.jsx b/src/pages/endpoint/autopilot/list-status-pages/add.jsx deleted file mode 100644 index 328283d07829..000000000000 --- a/src/pages/endpoint/autopilot/list-status-pages/add.jsx +++ /dev/null @@ -1,123 +0,0 @@ -import React from "react"; -import { Grid, Divider } from "@mui/material"; -import { useForm, useWatch } from "react-hook-form"; -import { Layout as DashboardLayout } from "/src/layouts/index.js"; -import CippFormPage from "/src/components/CippFormPages/CippFormPage"; -import CippFormComponent from "/src/components/CippComponents/CippFormComponent"; -import { CippFormTenantSelector } from "/src/components/CippComponents/CippFormTenantSelector"; - -const AutopilotStatusPageForm = () => { - const formControl = useForm({ - mode: "onChange", - defaultValues: { - TimeOutInMinutes: "", - ErrorMessage: "", - ShowProgress: false, - EnableLog: false, - OBEEOnly: false, - blockDevice: false, - Allowretry: false, - AllowReset: false, - AllowFail: false, - }, - }); - - return ( - - - {/* Tenant Selector */} - - - - - - - {/* Form Fields */} - - - - - - - - - {/* Switches */} - - - - - - - - - - - - ); -}; - -AutopilotStatusPageForm.getLayout = (page) => {page}; - -export default AutopilotStatusPageForm; diff --git a/src/pages/endpoint/autopilot/list-status-pages/index.js b/src/pages/endpoint/autopilot/list-status-pages/index.js index 939685bd69ad..d49f4281b043 100644 --- a/src/pages/endpoint/autopilot/list-status-pages/index.js +++ b/src/pages/endpoint/autopilot/list-status-pages/index.js @@ -25,7 +25,7 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - From be8d2cfe068195d4e043f51149bcab77146214e9 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 28 Jan 2025 22:32:54 -0500 Subject: [PATCH 26/51] adjust logo size --- src/pages/cipp/integrations/configure.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pages/cipp/integrations/configure.js b/src/pages/cipp/integrations/configure.js index 2861a241edad..62bc4990350b 100644 --- a/src/pages/cipp/integrations/configure.js +++ b/src/pages/cipp/integrations/configure.js @@ -101,7 +101,6 @@ const Page = () => { backButtonTitle="Integrations" headerText={extension.headerText} hideTitleText={true} - headerImage={logo} > {logo && ( @@ -109,7 +108,7 @@ const Page = () => { component="img" src={logo} alt={extension.name} - sx={{ width: "50%", mx: "auto" }} + sx={{ maxWidth: "50%", mx: "auto", maxHeight: "125px" }} /> )} @@ -187,6 +186,7 @@ const Page = () => { {extension?.mappingRequired && } {extension?.fieldMapping && } + {extension?.id === "cippapi" && } @@ -202,6 +202,11 @@ const Page = () => { )} + {extension?.id === "cippapi" && ( + + API Client component to go here + + )} )} From f75f84fc175b14202075523b81e511f3828fe508 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 13:36:09 +0100 Subject: [PATCH 27/51] fix: added condition to name location actions --- .../tenant/conditional/list-named-locations/index.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pages/tenant/conditional/list-named-locations/index.js b/src/pages/tenant/conditional/list-named-locations/index.js index 877d38a6411b..99e704323535 100644 --- a/src/pages/tenant/conditional/list-named-locations/index.js +++ b/src/pages/tenant/conditional/list-named-locations/index.js @@ -17,6 +17,7 @@ const Page = () => { }, fields: [{ type: "textField", name: "input", label: "Country Code" }], confirmText: "Enter a two-letter country code, e.g., US.", + condition: (row) => row["@odata.type"] == "#microsoft.graph.countryNamedLocation", }, { label: "Remove location from named location", @@ -28,6 +29,7 @@ const Page = () => { }, fields: [{ type: "textField", name: "input", label: "Country Code" }], confirmText: "Enter a two-letter country code, e.g., US.", + condition: (row) => row["@odata.type"] == "#microsoft.graph.countryNamedLocation", }, { label: "Add IP to named location", @@ -39,6 +41,7 @@ const Page = () => { }, fields: [{ type: "textField", name: "input", label: "IP" }], confirmText: "Enter an IP in CIDR format, e.g., 1.1.1.1/32.", + condition: (row) => row["@odata.type"] == "#microsoft.graph.ipNamedLocation", }, { label: "Remove IP from named location", @@ -49,13 +52,13 @@ const Page = () => { change: "removeIp", }, fields: [{ type: "textField", name: "input", label: "IP" }], - confirmText: "Enter an IP in CIDR format, e.g., 1.1.1.1/32.", + condition: (row) => row["@odata.type"] == "#microsoft.graph.ipNamedLocation", }, ]; const offCanvas = { - extendedInfoFields: ["displayName", "type", "rangeOrLocation"], + extendedInfoFields: ["displayName", "rangeOrLocation"], actions: actions, }; @@ -75,7 +78,7 @@ const Page = () => { simpleColumns={[ "displayName", "includeUnknownCountriesAndRegions", - "type", + "isTrusted", "rangeOrLocation", "modifiedDateTime", ]} From c3986009e8ca4b4c6268766bfa9bd108c05c2d9f Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 14:13:35 +0100 Subject: [PATCH 28/51] fix: added conditional action to Quarantine Management --- src/pages/email/administration/quarantine/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/email/administration/quarantine/index.js b/src/pages/email/administration/quarantine/index.js index e784d8888a0e..7415aa9dc5d0 100644 --- a/src/pages/email/administration/quarantine/index.js +++ b/src/pages/email/administration/quarantine/index.js @@ -101,6 +101,7 @@ const Page = () => { }, confirmText: "Are you sure you want to release this message?", icon: , + condition: (row) => row.ReleaseStatus !== "RELEASED", }, { label: "Deny", @@ -112,6 +113,7 @@ const Page = () => { }, confirmText: "Are you sure you want to deny this message?", icon: , + condition: (row) => row.ReleaseStatus !== "DENIED", }, { label: "Release & Allow Sender", @@ -125,6 +127,7 @@ const Page = () => { confirmText: "Are you sure you want to release this email and add the sender to the whitelist?", icon: , + condition: (row) => row.ReleaseStatus !== "RELEASED", }, ]; From f6029e362c72bd7d39d28bba3b2b382a6fb9e5f8 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 14:15:23 +0100 Subject: [PATCH 29/51] fix: added trashbin to Remove --- .../email/administration/tenant-allow-block-lists/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/email/administration/tenant-allow-block-lists/index.js b/src/pages/email/administration/tenant-allow-block-lists/index.js index 97925a29f708..508d5c67110e 100644 --- a/src/pages/email/administration/tenant-allow-block-lists/index.js +++ b/src/pages/email/administration/tenant-allow-block-lists/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; +import TrashIcon from '@heroicons/react/24/outline/TrashIcon'; const Page = () => { const pageTitle = "Tenant Allow/Block Lists"; @@ -18,6 +19,7 @@ const Page = () => { }, confirmText: "Are you sure you want to delete?", color: "danger", + icon: , }, ]; From 3ed5d8019519c03fb7b24a11b091293e6df22042 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 14:32:36 +0100 Subject: [PATCH 30/51] fix: fixed Contacts Page --- src/pages/email/administration/contacts/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/email/administration/contacts/index.js b/src/pages/email/administration/contacts/index.js index d32c9f8a2a6b..89a6a65d74c8 100644 --- a/src/pages/email/administration/contacts/index.js +++ b/src/pages/email/administration/contacts/index.js @@ -3,6 +3,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" import { Edit } from "@mui/icons-material"; import { Button } from "@mui/material"; import Link from "next/link"; +import TrashIcon from '@heroicons/react/24/outline/TrashIcon'; const Page = () => { const pageTitle = "Contacts"; @@ -13,19 +14,20 @@ const Page = () => { type: "POST", url: "/api/RemoveContact", data: { - TenantFilter: "Tenant", GUID: "id", }, confirmText: "Are you sure you want to delete this contact?", color: "danger", + icon: , }, + /* TODO: Implement edit contact { label: "Edit Contact", link: "/email/administration/edit-contact/[id]", multiPost: false, icon: , color: "warning", - }, + },*/ ]; const simpleColumns = ["displayName", "mail", "companyName", "onPremisesSyncEnabled"]; From 21ba3325d6858cad7911f23d104020e418e7cbe2 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 14:50:30 +0100 Subject: [PATCH 31/51] fix: added condition to Global Address list --- src/pages/email/reports/global-address-list/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/email/reports/global-address-list/index.js b/src/pages/email/reports/global-address-list/index.js index 5b0be1040072..6e78b2dacc26 100644 --- a/src/pages/email/reports/global-address-list/index.js +++ b/src/pages/email/reports/global-address-list/index.js @@ -12,6 +12,7 @@ const Page = () => { ID: "PrimarySmtpAddress", }, confirmText: "Are you sure you want to show this mailbox in the Global Address List?", + condition: (row) => row.HiddenFromAddressListsEnabled == true, }, { label: "Hide from Global Address List", @@ -22,6 +23,7 @@ const Page = () => { ID: "PrimarySmtpAddress", }, confirmText: "Are you sure you want to hide this mailbox from the Global Address List?", + condition: (row) => row.HiddenFromAddressListsEnabled == false, }, ]; From 360e2757c47c3b247bc128471b4122e6d5b4c008 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 14:56:18 +0100 Subject: [PATCH 32/51] fix: added edit icon --- src/pages/teams-share/teams/list-team/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/teams-share/teams/list-team/index.js b/src/pages/teams-share/teams/list-team/index.js index db874b1091da..b1a41a9adbb6 100644 --- a/src/pages/teams-share/teams/list-team/index.js +++ b/src/pages/teams-share/teams/list-team/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; +import { Edit } from "@mui/icons-material"; const Page = () => { const pageTitle = "Teams"; @@ -12,6 +13,7 @@ const Page = () => { link: "/identity/administration/groups/edit?groupId=[id]", multiPost: false, color: "warning", + icon: , }, ]; From 51fe974da2d5b32f4a2459d9797f30067081ae48 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 15:07:56 +0100 Subject: [PATCH 33/51] fix: added icon to global address list --- src/pages/email/reports/global-address-list/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/email/reports/global-address-list/index.js b/src/pages/email/reports/global-address-list/index.js index 6e78b2dacc26..314fb23f66f0 100644 --- a/src/pages/email/reports/global-address-list/index.js +++ b/src/pages/email/reports/global-address-list/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Visibility, VisibilityOff } from "@mui/icons-material"; const Page = () => { const actions = [ @@ -7,6 +8,7 @@ const Page = () => { label: "Unhide from Global Address List", type: "POST", url: "/api/ExecHideFromGAL", + icon: , data: { HideFromGAL: false, ID: "PrimarySmtpAddress", @@ -18,6 +20,7 @@ const Page = () => { label: "Hide from Global Address List", type: "POST", url: "/api/ExecHideFromGAL", + icon: , data: { HideFromGAL: true, ID: "PrimarySmtpAddress", From a99e4b75dd5914fdfdb69fb1634c08a068d560ed Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 30 Jan 2025 10:05:35 -0500 Subject: [PATCH 34/51] hide tenant in title for logbook --- src/pages/cipp/logs/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/cipp/logs/index.js b/src/pages/cipp/logs/index.js index f98368546531..fdee0356920d 100644 --- a/src/pages/cipp/logs/index.js +++ b/src/pages/cipp/logs/index.js @@ -95,6 +95,7 @@ const Page = () => { apiUrl={apiUrl} simpleColumns={simpleColumns} queryKey={`Listlogs-${dateFilter}-${filterEnabled}`} + tenantInTitle={false} apiData={{ DateFilter: dateFilter, // Pass date filter from state Filter: filterEnabled, // Pass filter toggle state From c0e01eb428a5dfe4827c1d5d1efcc79d481ee597 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 19:02:55 +0100 Subject: [PATCH 35/51] fix: irons for named location --- src/pages/tenant/conditional/list-named-locations/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pages/tenant/conditional/list-named-locations/index.js b/src/pages/tenant/conditional/list-named-locations/index.js index 99e704323535..2f72a57d5325 100644 --- a/src/pages/tenant/conditional/list-named-locations/index.js +++ b/src/pages/tenant/conditional/list-named-locations/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; +import { MinusIcon, PlusIcon } from "@heroicons/react/24/outline"; const Page = () => { const pageTitle = "Named Locations"; @@ -11,6 +12,7 @@ const Page = () => { label: "Add location to named location", type: "GET", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "addLocation", @@ -23,6 +25,7 @@ const Page = () => { label: "Remove location from named location", type: "POST", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "removeLocation", @@ -35,6 +38,7 @@ const Page = () => { label: "Add IP to named location", type: "POST", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "addIp", @@ -47,6 +51,7 @@ const Page = () => { label: "Remove IP from named location", type: "POST", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "removeIp", From 215c6a328991ec97697a908eccb1c956ec9845af Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 19:03:22 +0100 Subject: [PATCH 36/51] fix: icons and fix block signin on Shared Mailboxes --- .../email/reports/SharedMailboxEnabledAccount/index.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pages/email/reports/SharedMailboxEnabledAccount/index.js b/src/pages/email/reports/SharedMailboxEnabledAccount/index.js index c72597ef6a25..186556bbe91e 100644 --- a/src/pages/email/reports/SharedMailboxEnabledAccount/index.js +++ b/src/pages/email/reports/SharedMailboxEnabledAccount/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Block } from "@mui/icons-material"; /* NOTE for Devs: @@ -18,10 +19,11 @@ const Page = () => { actions={[ { label: "Block Sign In", - type: "POST", + type: "GET", + icon: , url: "/api/ExecDisableUser", - data: { TenantFilter: "Tenant", ID: "id" }, - confirmText: "Are you sure you want to block this user from signing in?", + data: { ID: "id" }, + confirmText: "Are you sure you want to block the sign-in for this user?", }, ]} offCanvas={{ From 86ec1c9d29313d8645d5db9b444aa2ce45dd8fb7 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 19:07:17 +0100 Subject: [PATCH 37/51] fix: fix remove contact type --- src/pages/email/administration/contacts/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/email/administration/contacts/index.js b/src/pages/email/administration/contacts/index.js index 89a6a65d74c8..a6d7fa23c5fe 100644 --- a/src/pages/email/administration/contacts/index.js +++ b/src/pages/email/administration/contacts/index.js @@ -11,7 +11,7 @@ const Page = () => { const actions = [ { label: "Remove Contact", - type: "POST", + type: "GET", url: "/api/RemoveContact", data: { GUID: "id", From 6003bb18a69496c44066ace02fb02fb0f84101cb Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 19:18:17 +0100 Subject: [PATCH 38/51] fix: added icon to deleted items --- src/pages/identity/administration/deleted-items/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/identity/administration/deleted-items/index.js b/src/pages/identity/administration/deleted-items/index.js index ab568cfb92d9..43d9ddb9d817 100644 --- a/src/pages/identity/administration/deleted-items/index.js +++ b/src/pages/identity/administration/deleted-items/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import RestoreFromTrashIcon from '@mui/icons-material/RestoreFromTrash'; const Page = () => { const pageTitle = "Deleted Items"; @@ -8,8 +9,9 @@ const Page = () => { { label: "Restore Object", type: "GET", + icon: , url: "/api/ExecRestoreDeleted", - data: { TenantFilter: "Tenant", ID: "id" }, + data: { ID: "id" }, confirmText: "Are you sure you want to restore this user?", multiPost: false, }, From abd2d8c10e22e917bbb59af02280273455637325 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 20:20:42 +0100 Subject: [PATCH 39/51] fix: fix and add icons for email filter pages --- .../reports/antiphishing-filters/index.js | 18 ++- .../email/reports/malware-filters/index.js | 18 ++- .../reports/safeattachments-filters/index.js | 22 +-- .../email/reports/safelinks-filters/index.js | 141 ++++++++++-------- .../email/spamfilter/list-spamfilter/index.js | 20 ++- 5 files changed, 120 insertions(+), 99 deletions(-) diff --git a/src/pages/email/reports/antiphishing-filters/index.js b/src/pages/email/reports/antiphishing-filters/index.js index 96a1080d9498..0d3d3d26e736 100644 --- a/src/pages/email/reports/antiphishing-filters/index.js +++ b/src/pages/email/reports/antiphishing-filters/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Block, Check } from "@mui/icons-material"; const Page = () => { const pageTitle = "List of Anti-Phishing Filters"; @@ -8,25 +9,27 @@ const Page = () => { const actions = [ { label: "Enable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditAntiPhishingFilter", data: { State: "Enable", - TenantFilter: "TenantFilter", // TenantFilter used in API path as per original file - RuleName: "id", + RuleName: "RuleName", }, confirmText: "Are you sure you want to enable this rule?", + condition: (row) => row.State === "Disabled", }, { label: "Disable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditAntiPhishingFilter", data: { State: "Disable", - TenantFilter: "TenantFilter", - RuleName: "id", + RuleName: "RuleName", }, confirmText: "Are you sure you want to disable this rule?", + condition: (row) => row.State === "Enabled", }, // Uncomment the following block if Delete Rule is to be re-enabled in the future /* @@ -35,8 +38,7 @@ const Page = () => { type: "POST", url: "/api/RemoveAntiPhishingFilter", data: { - TenantFilter: "TenantFilter", - RuleName: "id", + RuleName: "RuleName", }, confirmText: "Are you sure you want to delete this rule?", }, diff --git a/src/pages/email/reports/malware-filters/index.js b/src/pages/email/reports/malware-filters/index.js index 4d5ffe472d98..5ede0778ed93 100644 --- a/src/pages/email/reports/malware-filters/index.js +++ b/src/pages/email/reports/malware-filters/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Block, Check } from "@mui/icons-material"; const Page = () => { return ( @@ -9,25 +10,27 @@ const Page = () => { actions={[ { label: "Enable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditMalwareFilter", data: { State: "Enable", - TenantFilter: "tenant.defaultDomainName", - RuleName: "row.RuleName", + RuleName: "RuleName", }, confirmText: "Are you sure you want to enable this rule?", + condition: (row) => row.State === "Disabled", }, { label: "Disable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditMalwareFilter", data: { State: "Disable", - TenantFilter: "tenant.defaultDomainName", - RuleName: "row.RuleName", + RuleName: "RuleName", }, confirmText: "Are you sure you want to disable this rule?", + condition: (row) => row.State === "Enabled", }, /* Uncomment and add additional actions if required by future specs { @@ -35,8 +38,7 @@ const Page = () => { type: "POST", url: "/api/RemoveMalwareFilter", data: { - TenantFilter: "tenant.defaultDomainName", - RuleName: "row.RuleName", + RuleName: "RuleName", }, confirmText: "Are you sure you want to delete this rule?", }, diff --git a/src/pages/email/reports/safeattachments-filters/index.js b/src/pages/email/reports/safeattachments-filters/index.js index b61ac47207bc..ae3d6930785e 100644 --- a/src/pages/email/reports/safeattachments-filters/index.js +++ b/src/pages/email/reports/safeattachments-filters/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Block, Check } from "@mui/icons-material"; const Page = () => { const pageTitle = "List of Safe Attachment Filters"; @@ -9,37 +10,38 @@ const Page = () => { const actions = [ { label: "Enable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditSafeAttachmentsFilter", data: { - State: "Enable", - TenantFilter: "tenant.defaultDomainName", // TenantFilter uses default domain name in context - RuleName: "row.RuleName", + State: "!Enable", + RuleName: "RuleName", }, confirmText: "Are you sure you want to enable this rule?", color: "info", + condition: (row) => row.State === "Disabled" }, { label: "Disable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditSafeAttachmentsFilter", data: { State: "Disable", - TenantFilter: "tenant.defaultDomainName", // TenantFilter uses default domain name in context - RuleName: "row.RuleName", + RuleName: "RuleName", }, confirmText: "Are you sure you want to disable this rule?", color: "info", + condition: (row) => row.State === "Enabled", }, // Commented out "Delete Rule" action from the original file as it was also commented in legacy code /* { label: "Delete Rule", - type: "POST", + type: "GET", url: "/api/RemoveSafeAttachmentsFilter", data: { - TenantFilter: "tenant.defaultDomainName", - RuleName: "row.RuleName", + RuleName: "RuleName", }, confirmText: "Are you sure you want to delete this rule?", color: "danger", diff --git a/src/pages/email/reports/safelinks-filters/index.js b/src/pages/email/reports/safelinks-filters/index.js index 7d2bf1ad5a37..bee1985d9745 100644 --- a/src/pages/email/reports/safelinks-filters/index.js +++ b/src/pages/email/reports/safelinks-filters/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Block, Check } from "@mui/icons-material"; /* Note: Tenant information is passed directly in apiData instead of using Redux (e.g., useSelector) */ /* Original file included a "Delete Rule" action. If needed, add back by following other action formats. */ @@ -7,74 +8,82 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" /* Removed custom formatters and FontAwesome imports, as table formatting is handled by CippTablePage */ const Page = () => { + const pageTitle = "List of Safe Link Filters"; + const apiUrl = "/api/ListSafeLinksFilters"; + + const actions = [ + { + label: "Enable Rule", + type: "GET", + icon: , + url: "/api/EditSafeLinksFilter", + data: { + State: "Enable", + RuleName: "RuleName", + }, + confirmText: "Are you sure you want to enable this rule?", + color: "info", + condition: (row) => row.State === "Disabled", + }, + { + label: "Disable Rule", + type: "GET", + icon: , + url: "/api/EditSafeLinksFilter", + data: { + State: "Disable", + RuleName: "RuleName", + }, + confirmText: "Are you sure you want to disable this rule?", + color: "info", + condition: (row) => row.State === "Enabled", + }, + /* TODO: implement Delete Rule action + { + label: "Delete Rule", + type: "GET", + url: "/api/EditSafeLinksFilter", + data: { + RuleName: "RuleName", + }, + confirmText: "Are you sure you want to delete this rule?", + color: "danger", + }, + */ + ]; + + const offCanvas = { + extendedInfoFields: ["RuleName", "Name", "State", "WhenCreated", "WhenChanged"], + actions: actions, // Attaching actions to offCanvas per original design + }; + + const simpleColumns = [ + "RuleName", + "Name", + "State", + "Priority", + "RecipientDomainIs", + "EnableSafeLinksForEmail", + "EnableSafeLinksForTeams", + "EnableSafeLinksForOffice", + "TrackClicks", + "ScanUrls", + "EnableForInternalSenders", + "DeliverMessageAfterScan", + "AllowClickThrough", + "DisableUrlRewrite", + "EnableOrganizationBranding", + "WhenCreated", + "WhenChanged", + ]; + return ( ); }; diff --git a/src/pages/email/spamfilter/list-spamfilter/index.js b/src/pages/email/spamfilter/list-spamfilter/index.js index 062f9e71dc87..e3c017d1cdbd 100644 --- a/src/pages/email/spamfilter/list-spamfilter/index.js +++ b/src/pages/email/spamfilter/list-spamfilter/index.js @@ -1,15 +1,19 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { Book, Block, Check } from "@mui/icons-material"; +import { TrashIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; const Page = () => { const pageTitle = "Spam Filters"; + const apiUrl = "/api/ListSpamfilter" const actions = [ { label: "Create template based on rule", type: "POST", + icon: , url: "/api/AddSpamfilterTemplate", dataFunction: (data) => { return { ...data }; @@ -18,32 +22,34 @@ const Page = () => { }, { label: "Enable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditSpamfilter", data: { State: "enable", - TenantFilter: "Tenant", name: "Name", }, confirmText: "Are you sure you want to enable this rule?", + condition: (row) => row.ruleState === "Disabled", }, { label: "Disable Rule", - type: "POST", + type: "GET", + icon: , url: "/api/EditSpamfilter", data: { State: "disable", - TenantFilter: "Tenant", name: "Name", }, confirmText: "Are you sure you want to disable this rule?", + condition: (row) => row.ruleState === "Enabled", }, { label: "Delete Rule", - type: "POST", + type: "GET", + icon: , url: "/api/RemoveSpamFilter", data: { - TenantFilter: "Tenant", name: "Name", }, confirmText: "Are you sure you want to delete this rule?", @@ -88,7 +94,7 @@ const Page = () => { return ( Date: Thu, 30 Jan 2025 16:28:54 -0500 Subject: [PATCH 40/51] Update CippApiDialog.jsx --- src/components/CippComponents/CippApiDialog.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/CippComponents/CippApiDialog.jsx b/src/components/CippComponents/CippApiDialog.jsx index 834cb3e958dc..2e37e00f3c4f 100644 --- a/src/components/CippComponents/CippApiDialog.jsx +++ b/src/components/CippComponents/CippApiDialog.jsx @@ -79,8 +79,7 @@ export const CippApiDialog = (props) => { } else { Object.keys(dataObject).forEach((key) => { const value = dataObject[key]; - - if (typeof value === "string" && value.startsWith("!")) { + if (value.startsWith("!")) { newData[key] = value.slice(1); } else if (typeof value === "string") { if (row[value] !== undefined) { From 7e8bdc61e430888ab0b6e3c408c35f25916fc2ee Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 30 Jan 2025 22:36:51 +0100 Subject: [PATCH 41/51] fix: no idea why lower case works as expected --- src/pages/email/reports/safeattachments-filters/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/email/reports/safeattachments-filters/index.js b/src/pages/email/reports/safeattachments-filters/index.js index ae3d6930785e..11e15a1bdea7 100644 --- a/src/pages/email/reports/safeattachments-filters/index.js +++ b/src/pages/email/reports/safeattachments-filters/index.js @@ -14,7 +14,7 @@ const Page = () => { icon: , url: "/api/EditSafeAttachmentsFilter", data: { - State: "!Enable", + State: "!enable", RuleName: "RuleName", }, confirmText: "Are you sure you want to enable this rule?", From f15e30a196669b192947fa870d685f7611adc2f6 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 30 Jan 2025 16:42:23 -0500 Subject: [PATCH 42/51] Update CippApiDialog.jsx --- src/components/CippComponents/CippApiDialog.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CippComponents/CippApiDialog.jsx b/src/components/CippComponents/CippApiDialog.jsx index 2e37e00f3c4f..bd6348868c8b 100644 --- a/src/components/CippComponents/CippApiDialog.jsx +++ b/src/components/CippComponents/CippApiDialog.jsx @@ -79,7 +79,7 @@ export const CippApiDialog = (props) => { } else { Object.keys(dataObject).forEach((key) => { const value = dataObject[key]; - if (value.startsWith("!")) { + if (typeof value === "string" && value.startsWith("!")) { newData[key] = value.slice(1); } else if (typeof value === "string") { if (row[value] !== undefined) { From 4a812c0d9ecbdffe502ae1df96b92b12d5861999 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 30 Jan 2025 17:13:43 -0500 Subject: [PATCH 43/51] add missing mailbox actions --- .../email/administration/mailboxes/index.js | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/pages/email/administration/mailboxes/index.js b/src/pages/email/administration/mailboxes/index.js index 81726a1abd14..eea3d264e425 100644 --- a/src/pages/email/administration/mailboxes/index.js +++ b/src/pages/email/administration/mailboxes/index.js @@ -131,6 +131,93 @@ const Page = () => { confirmText: "Are you sure you want to delete this mailbox?", multiPost: false, }, + { + label: "Copy Sent Items to Shared Mailbox", + type: "GET", + url: "/api/ExecCopyForSent", + data: { ID: "UPN" }, + confirmText: "Are you sure you want to enable Copy Sent Items to Shared Mailbox?", + icon: , + condition: (row) => + row.MessageCopyForSentAsEnabled === false && row.recipientTypeDetails === "SharedMailbox", + }, + { + label: "Disable Copy Sent Items to Shared Mailbox", + type: "GET", + url: "/api/ExecCopyForSent", + data: { ID: "UPN", MessageCopyForSentAsEnabled: false }, + confirmText: "Are you sure you want to disable Copy Sent Items to Shared Mailbox?", + icon: , + condition: (row) => + row.MessageCopyForSentAsEnabled === true && row.recipientTypeDetails === "SharedMailbox", + }, + { + label: "Set mailbox locale", + type: "POST", + url: "/api/ExecSetMailboxLocale", + data: { user: "UPN", ProhibitSendQuota: true }, + confirmText: "Enter a locale, e.g. en-US", + icon: , + fields: [ + { + label: "Locale", + name: "locale", + type: "textField", + placeholder: "e.g. en-US", + }, + ], + }, + { + label: "Set Send Quota", + type: "POST", + url: "/api/ExecSetMailboxQuota", + data: { user: "UPN", ProhibitSendQuota: true }, + confirmText: "Enter a quota. e.g. 1000MB, 10GB,1TB", + icon: , + fields: [ + { + label: "Quota", + name: "quota", + type: "textField", + placeholder: "e.g. 1000MB, 10GB,1TB", + }, + ], + }, + { + label: "Set Send and Receive Quota", + type: "POST", + url: "/api/ExecSetMailboxQuota", + data: { + user: "UPN", + ProhibitSendReceiveQuota: true, + }, + confirmText: "Enter a quota. e.g. 1000MB, 10GB,1TB", + icon: , + fields: [ + { + label: "Quota", + name: "quota", + type: "textField", + placeholder: "e.g. 1000MB, 10GB,1TB", + }, + ], + }, + { + label: "Set Quota Warning Level", + type: "POST", + url: "/api/ExecSetMailboxQuota", + data: { user: "UPN", IssueWarningQuota: true }, + confirmText: "Enter a quota. e.g. 1000MB, 10GB,1TB", + icon: , + fields: [ + { + label: "Quota", + name: "quota", + type: "textField", + placeholder: "e.g. 1000MB, 10GB,1TB", + }, + ], + }, ]; // Define off-canvas details From eba21f51540b5567957206000588a974e99bb467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 29 Jan 2025 20:44:15 +0100 Subject: [PATCH 44/51] Add back sync autopilot devices button Add icons More icons Add SharePoint Admin portal and update icons in bulk actions menu update icon property there must be a less ugly way to do this, help Add icons to action buttons across various pages --- src/components/bulk-actions-menu.js | 29 +++++++++++ src/data/portals.json | 34 ++++++------- src/pages/cipp/settings/tenants.js | 7 ++- .../email/administration/contacts/index.js | 8 ++- .../email/administration/mailboxes/index.js | 7 ++- .../tenant-allow-block-lists/index.js | 9 +++- .../resources/management/list-rooms/index.js | 7 ++- .../resources/management/room-lists/index.js | 4 +- .../spamfilter/list-connectionfilter/index.js | 8 ++- .../email/spamfilter/list-spamfilter/index.js | 7 ++- .../email/tools/mailbox-restores/index.js | 10 +++- .../list-connector-templates/index.js | 14 ++++++ .../email/transport/list-connectors/index.js | 12 ++++- src/pages/email/transport/list-rules/index.js | 8 ++- .../email/transport/list-templates/index.js | 7 ++- src/pages/endpoint/MEM/devices/index.js | 20 ++++++++ src/pages/endpoint/applications/list/index.js | 4 +- .../endpoint/applications/queue/index.js | 7 ++- .../endpoint/autopilot/list-devices/index.js | 50 +++++++++++++------ .../endpoint/autopilot/list-profiles/index.js | 7 ++- .../autopilot/list-status-pages/index.js | 7 ++- .../identity/administration/devices/index.js | 8 ++- .../administration/group-templates/index.js | 6 ++- .../identity/administration/groups/index.js | 12 ++--- .../administration/jit-admin/index.js | 3 +- .../administration/risky-users/index.js | 5 +- .../identity/administration/users/index.js | 11 ++-- src/pages/index.js | 1 + .../security/incidents/list-alerts/index.js | 3 ++ .../incidents/list-incidents/index.js | 5 ++ src/pages/teams-share/sharepoint/index.js | 20 +++++++- .../teams-share/teams/business-voice/index.js | 4 ++ .../teams-share/teams/list-team/index.js | 3 +- .../alert-configuration/index.js | 8 ++- .../authentication-methods/index.js | 3 ++ .../tenant/backup/backup-wizard/index.js | 9 +++- .../conditional/deploy-vacation/index.js | 3 +- .../conditional/list-named-locations/index.js | 3 +- .../tenant/conditional/list-policies/index.js | 7 ++- .../tenant/conditional/list-template/index.js | 2 + .../tenant/gdap-management/invites/index.js | 3 +- .../gdap-management/onboarding/index.js | 8 ++- .../gdap-management/role-templates/index.js | 9 ++-- .../tenant/gdap-management/roles/index.js | 12 +++-- .../reports/list-csp-licenses/index.jsx | 4 +- .../tenant/standards/bpa-report/index.js | 4 +- .../standards/domains-analyser/index.js | 12 +++-- .../tenant/standards/list-standards/index.js | 6 +-- 48 files changed, 337 insertions(+), 103 deletions(-) diff --git a/src/components/bulk-actions-menu.js b/src/components/bulk-actions-menu.js index b4ceba4c48bd..fd15898e28a3 100644 --- a/src/components/bulk-actions-menu.js +++ b/src/components/bulk-actions-menu.js @@ -2,6 +2,33 @@ import PropTypes from "prop-types"; import ChevronDownIcon from "@heroicons/react/24/outline/ChevronDownIcon"; import { Button, Link, ListItemText, Menu, MenuItem, SvgIcon } from "@mui/material"; import { usePopover } from "../hooks/use-popover"; +import { FilePresent, Laptop, Mail, Share, Shield, ShieldMoon } from "@mui/icons-material"; +import { GlobeAltIcon, UsersIcon, ServerIcon } from "@heroicons/react/24/outline"; + +function getIconByName(iconName) { + switch (iconName) { + case "GlobeAltIcon": + return ; + case "Mail": + return ; + case "UsersIcon": + return ; + case "FilePresent": + return ; + case "ServerIcon": + return ; + case "Laptop": + return ; + case "Share": + return ; + case "Shield": + return ; + case "ShieldMoon": + return ; + default: + return null; + } +} export const BulkActionsMenu = (props) => { const { buttonName, sx, row, actions = [], ...other } = props; @@ -55,12 +82,14 @@ export const BulkActionsMenu = (props) => { target="_blank" rel="noreferrer" > + {getIconByName(action.icon)} ); } else { return ( + {getIconByName(action.icon)} ); diff --git a/src/data/portals.json b/src/data/portals.json index 130c9f2d11e4..d5fdbd5ebeb0 100644 --- a/src/data/portals.json +++ b/src/data/portals.json @@ -6,7 +6,7 @@ "variable": "customerId", "target": "_blank", "external": true, - "icon": "cog" + "icon": "GlobeAltIcon" }, { "label": "Exchange Portal", @@ -15,7 +15,7 @@ "variable": "defaultDomainName", "target": "_blank", "external": true, - "icon": "mail-bulk" + "icon": "Mail" }, { "label": "Entra Portal", @@ -24,7 +24,7 @@ "variable": "defaultDomainName", "target": "_blank", "external": true, - "icon": "users" + "icon": "UsersIcon" }, { "label": "Teams Portal", @@ -33,7 +33,7 @@ "variable": "defaultDomainName", "target": "_blank", "external": true, - "icon": "comments" + "icon": "FilePresent" }, { "label": "Azure Portal", @@ -42,7 +42,7 @@ "variable": "defaultDomainName", "target": "_blank", "external": true, - "icon": "server" + "icon": "ServerIcon" }, { "label": "Intune Portal", @@ -51,7 +51,16 @@ "variable": "defaultDomainName", "target": "_blank", "external": true, - "icon": "laptop-code" + "icon": "Laptop" + }, + { + "label": "SharePoint Admin", + "name": "SharePoint_Admin", + "url": "https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=customerId&CSDEST=SharePoint", + "variable": "customerId", + "target": "_blank", + "external": true, + "icon": "Share" }, { "label": "Security Portal", @@ -60,7 +69,7 @@ "variable": "customerId", "target": "_blank", "external": true, - "icon": "shield-alt" + "icon": "Shield" }, { "label": "Compliance Portal", @@ -69,15 +78,6 @@ "variable": "customerId", "target": "_blank", "external": true, - "icon": "shield-alt" - }, - { - "label": "SharePoint Admin", - "name": "SharePoint_Admin", - "url": "https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=customerId&CSDEST=SharePoint", - "variable": "customerId", - "target": "_blank", - "external": true, - "icon": "book" + "icon": "ShieldMoon" } ] diff --git a/src/pages/cipp/settings/tenants.js b/src/pages/cipp/settings/tenants.js index 3a09b8ff8aa4..529e7c413a18 100644 --- a/src/pages/cipp/settings/tenants.js +++ b/src/pages/cipp/settings/tenants.js @@ -5,7 +5,7 @@ import tabOptions from "./tabOptions"; import { Button, SvgIcon } from "@mui/material"; import { CippApiDialog } from "/src/components/CippComponents/CippApiDialog"; import { useDialog } from "/src/hooks/use-dialog"; -import { Sync } from "@mui/icons-material"; +import { Sync, Block, PlayArrow, RestartAlt, Delete, Add } from "@mui/icons-material"; const Page = () => { const pageTitle = "Tenants - Backend"; @@ -17,6 +17,7 @@ const Page = () => { label: "Exclude Tenants", type: "POST", url: `/api/ExecExcludeTenant?AddExclusion=true`, + icon: , data: { value: "customerId" }, confirmText: "Are you sure you want to exclude these tenants?", multiPost: false, @@ -25,6 +26,7 @@ const Page = () => { label: "Include Tenants", type: "POST", url: `/api/ExecExcludeTenant?RemoveExclusion=true`, + icon: , data: { value: "customerId" }, confirmText: "Are you sure you want to include these tenants?", multiPost: false, @@ -33,6 +35,7 @@ const Page = () => { label: "Refresh CPV Permissions", type: "POST", url: `/api/ExecCPVPermissions`, + icon: , data: { TenantFilter: "customerId" }, confirmText: "Are you sure you want to refresh the CPV permissions for these tenants?", multiPost: false, @@ -41,6 +44,7 @@ const Page = () => { label: "Reset CPV Permissions", type: "POST", url: `/api/ExecCPVPermissions?&ResetSP=true`, + icon: , data: { TenantFilter: "customerId" }, confirmText: "Are you sure you want to reset the CPV permissions for these tenants? (This will delete the Service Principal and re-add it.)", @@ -50,6 +54,7 @@ const Page = () => { label: "Remove Tenant", type: "POST", url: `/api/ExecRemoveTenant`, + icon: , data: { TenantID: "customerId" }, confirmText: "Are you sure you want to remove this tenant?", multiPost: false, diff --git a/src/pages/email/administration/contacts/index.js b/src/pages/email/administration/contacts/index.js index a6d7fa23c5fe..ac22d6596579 100644 --- a/src/pages/email/administration/contacts/index.js +++ b/src/pages/email/administration/contacts/index.js @@ -1,6 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; -import { Edit } from "@mui/icons-material"; +import { Edit, PersonAdd } from "@mui/icons-material"; import { Button } from "@mui/material"; import Link from "next/link"; import TrashIcon from '@heroicons/react/24/outline/TrashIcon'; @@ -40,7 +40,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/email/administration/mailboxes/index.js b/src/pages/email/administration/mailboxes/index.js index eea3d264e425..90bfc401266e 100644 --- a/src/pages/email/administration/mailboxes/index.js +++ b/src/pages/email/administration/mailboxes/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import Link from "next/link"; import { Button } from "@mui/material"; +import { Add } from "@mui/icons-material"; import { Archive, @@ -269,7 +270,11 @@ const Page = () => { filters={filterList} cardButton={ <> - diff --git a/src/pages/email/administration/tenant-allow-block-lists/index.js b/src/pages/email/administration/tenant-allow-block-lists/index.js index 508d5c67110e..f88d18848767 100644 --- a/src/pages/email/administration/tenant-allow-block-lists/index.js +++ b/src/pages/email/administration/tenant-allow-block-lists/index.js @@ -2,7 +2,8 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; -import TrashIcon from '@heroicons/react/24/outline/TrashIcon'; +import TrashIcon from "@heroicons/react/24/outline/TrashIcon"; +import { PlaylistAdd } from "@mui/icons-material"; const Page = () => { const pageTitle = "Tenant Allow/Block Lists"; @@ -50,7 +51,11 @@ const Page = () => { }} cardButton={ <> - diff --git a/src/pages/email/resources/management/list-rooms/index.js b/src/pages/email/resources/management/list-rooms/index.js index e81e9313ef7a..a3fe7dab1547 100644 --- a/src/pages/email/resources/management/list-rooms/index.js +++ b/src/pages/email/resources/management/list-rooms/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; +import { AddHomeWork } from "@mui/icons-material"; const Page = () => { const pageTitle = "Rooms"; @@ -12,7 +13,11 @@ const Page = () => { apiUrl="/api/ListRooms" simpleColumns={["displayName", "building", "floorNumber", "capacity", "bookingType"]} cardButton={ - } diff --git a/src/pages/email/resources/management/room-lists/index.js b/src/pages/email/resources/management/room-lists/index.js index 11abfc1683cb..6ae175a9ed1f 100644 --- a/src/pages/email/resources/management/room-lists/index.js +++ b/src/pages/email/resources/management/room-lists/index.js @@ -1,15 +1,17 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Visibility } from "@mui/icons-material"; const Page = () => { const pageTitle = "Room Lists"; - const apiUrl = "/api/ListRoomLists" + const apiUrl = "/api/ListRoomLists"; const actions = [ { label: "View included Rooms", link: `/email/resources/management/room-lists/list/view?roomAddress=[emailAddress]`, color: "info", + icon: , }, ]; diff --git a/src/pages/email/spamfilter/list-connectionfilter/index.js b/src/pages/email/spamfilter/list-connectionfilter/index.js index 97e8cd8f963f..02481161dc18 100644 --- a/src/pages/email/spamfilter/list-connectionfilter/index.js +++ b/src/pages/email/spamfilter/list-connectionfilter/index.js @@ -1,7 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; -import { Book } from "@mui/icons-material"; +import { Book, AddModerator } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -45,7 +45,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/email/spamfilter/list-spamfilter/index.js b/src/pages/email/spamfilter/list-spamfilter/index.js index e3c017d1cdbd..55985f5d7316 100644 --- a/src/pages/email/spamfilter/list-spamfilter/index.js +++ b/src/pages/email/spamfilter/list-spamfilter/index.js @@ -4,6 +4,7 @@ import { Button } from "@mui/material"; import { Book, Block, Check } from "@mui/icons-material"; import { TrashIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; +import { RocketLaunch } from "@mui/icons-material"; const Page = () => { const pageTitle = "Spam Filters"; @@ -100,7 +101,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/email/tools/mailbox-restores/index.js b/src/pages/email/tools/mailbox-restores/index.js index ffa463800bd5..cedc2e73f0a9 100644 --- a/src/pages/email/tools/mailbox-restores/index.js +++ b/src/pages/email/tools/mailbox-restores/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; +import { RestoreFromTrash, PlayArrow, Pause, Delete } from "@mui/icons-material"; import MailboxRestoreDetails from "../../../../components/CippComponents/MailboxRestoreDetails"; const Page = () => { @@ -12,6 +13,7 @@ const Page = () => { label: "Resume Restore Request", type: "POST", url: "/api/ExecMailboxRestore", + icon: , data: { TenantFilter: "Tenant", Identity: "Identity", @@ -24,6 +26,7 @@ const Page = () => { label: "Suspend Restore Request", type: "POST", url: "/api/ExecMailboxRestore", + icon: , data: { TenantFilter: "Tenant", Identity: "Identity", @@ -36,6 +39,7 @@ const Page = () => { label: "Remove Restore Request", type: "POST", url: "/api/ExecMailboxRestore", + icon: , data: { TenantFilter: "Tenant", Identity: "Identity", @@ -63,7 +67,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/email/transport/list-connector-templates/index.js b/src/pages/email/transport/list-connector-templates/index.js index 671c148f21e2..188e87254ab6 100644 --- a/src/pages/email/transport/list-connector-templates/index.js +++ b/src/pages/email/transport/list-connector-templates/index.js @@ -1,4 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; +import { Button } from "@mui/material"; +import Link from "next/link"; +import { RocketLaunch } from "@mui/icons-material"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { EyeIcon, TrashIcon } from "@heroicons/react/24/outline"; import ConnectorTemplateDetails from "../../../../components/CippComponents/ConnectorTemplateDetails"; @@ -39,6 +42,17 @@ const Page = () => { label: "Add Template", href: "/email/connectors/add-connector-templates", }} + cardButton={ + <> + + + } /> ); }; diff --git a/src/pages/email/transport/list-connectors/index.js b/src/pages/email/transport/list-connectors/index.js index c61b44ad6fa2..477b191fdff5 100644 --- a/src/pages/email/transport/list-connectors/index.js +++ b/src/pages/email/transport/list-connectors/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { RocketLaunch, Book, Check, Block, Delete } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -11,6 +12,7 @@ const Page = () => { label: "Create template based on connector", type: "POST", url: "/api/AddExConnectorTemplate", + icon: , postEntireRow: true, confirmText: "Are you sure you want to create a template based on this connector?", color: "info", @@ -19,6 +21,7 @@ const Page = () => { label: "Enable Connector", type: "POST", url: "/api/EditExConnector", + icon: , data: { State: "Enable", GUID: "Guid", @@ -31,6 +34,7 @@ const Page = () => { label: "Disable Connector", type: "POST", url: "/api/EditExConnector", + icon: , data: { State: "Disable", GUID: "Guid", @@ -43,6 +47,7 @@ const Page = () => { label: "Delete Connector", type: "POST", url: "/api/RemoveExConnector", + icon: , data: { GUID: "Guid", Type: "cippconnectortype", @@ -80,10 +85,15 @@ const Page = () => { titleButton={{ label: "Deploy Connector", href: "/email/connectors/deploy-connector", + startIcon: , // Added icon }} cardButton={ <> - diff --git a/src/pages/email/transport/list-rules/index.js b/src/pages/email/transport/list-rules/index.js index 7312f49794fc..0c6128024c6e 100644 --- a/src/pages/email/transport/list-rules/index.js +++ b/src/pages/email/transport/list-rules/index.js @@ -1,7 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; -import { Book, DoDisturb, Done } from "@mui/icons-material"; +import { Book, DoDisturb, Done, RocketLaunch } from "@mui/icons-material"; import { TrashIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; @@ -88,7 +88,11 @@ const Page = () => { ]} cardButton={ <> - diff --git a/src/pages/email/transport/list-templates/index.js b/src/pages/email/transport/list-templates/index.js index 1bfff7428f93..fb40f8da0e9b 100644 --- a/src/pages/email/transport/list-templates/index.js +++ b/src/pages/email/transport/list-templates/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { EyeIcon, TrashIcon } from "@heroicons/react/24/outline"; import { Button } from "@mui/material"; +import { RocketLaunch } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -35,7 +36,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/endpoint/MEM/devices/index.js b/src/pages/endpoint/MEM/devices/index.js index 4ce9ebcbc46a..0965bb50462f 100644 --- a/src/pages/endpoint/MEM/devices/index.js +++ b/src/pages/endpoint/MEM/devices/index.js @@ -2,6 +2,17 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { useSettings } from "/src/hooks/use-settings"; import { EyeIcon } from "@heroicons/react/24/outline"; +import { + Sync, + RestartAlt, + LocationOn, + Password, + PasswordOutlined, + Key, + Security, + FindInPage, + Shield, +} from "@mui/icons-material"; const Page = () => { const pageTitle = "Devices"; @@ -11,6 +22,7 @@ const Page = () => { { label: "Sync Device", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", @@ -21,6 +33,7 @@ const Page = () => { { label: "Reboot Device", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", @@ -31,6 +44,7 @@ const Page = () => { { label: "Locate Device", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", @@ -41,6 +55,7 @@ const Page = () => { { label: "Retrieve LAPs password", type: "POST", + icon: , url: "/api/ExecGetLocalAdminPassword", data: { GUID: "azureADDeviceId", @@ -50,6 +65,7 @@ const Page = () => { { label: "Rotate Local Admin Password", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", @@ -60,6 +76,7 @@ const Page = () => { { label: "Retrieve Bitlocker Keys", type: "POST", + icon: , url: "/api/ExecGetRecoveryKey", data: { GUID: "azureADDeviceId", @@ -69,6 +86,7 @@ const Page = () => { { label: "Windows Defender Full Scan", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", @@ -80,6 +98,7 @@ const Page = () => { { label: "Windows Defender Quick Scan", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", @@ -91,6 +110,7 @@ const Page = () => { { label: "Update Windows Defender", type: "POST", + icon: , url: "/api/ExecDeviceAction", data: { GUID: "id", diff --git a/src/pages/endpoint/applications/list/index.js b/src/pages/endpoint/applications/list/index.js index 5a3d8eef0cfb..9530d9712981 100644 --- a/src/pages/endpoint/applications/list/index.js +++ b/src/pages/endpoint/applications/list/index.js @@ -1,7 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { GlobeAltIcon, TrashIcon, UserIcon } from "@heroicons/react/24/outline"; -import { LaptopMac } from "@mui/icons-material"; +import { Add, LaptopMac } from "@mui/icons-material"; import { Button } from "@mui/material"; import Link from "next/link"; @@ -95,7 +95,7 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/endpoint/applications/queue/index.js b/src/pages/endpoint/applications/queue/index.js index 0f30341cefcb..3e683b11e8b0 100644 --- a/src/pages/endpoint/applications/queue/index.js +++ b/src/pages/endpoint/applications/queue/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { CheckmarkIcon } from "react-hot-toast"; import { Button } from "@mui/material"; +import { PlayArrow, Add } from "@mui/icons-material"; import Link from "next/link"; import { ApiPostCall } from "../../../../api/ApiCall"; import { CippApiResults } from "../../../../components/CippComponents/CippApiResults"; @@ -40,9 +41,11 @@ const Page = () => { tenantInTitle={false} cardButton={ <> - + - diff --git a/src/pages/endpoint/autopilot/list-devices/index.js b/src/pages/endpoint/autopilot/list-devices/index.js index d924ec33b3d5..038e5b9d8d2a 100644 --- a/src/pages/endpoint/autopilot/list-devices/index.js +++ b/src/pages/endpoint/autopilot/list-devices/index.js @@ -1,11 +1,15 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { CippApiDialog } from "/src/components/CippComponents/CippApiDialog.jsx"; import { Button } from "@mui/material"; -import { PersonAdd, Delete } from "@mui/icons-material"; +import { PersonAdd, Delete, Sync, Add } from "@mui/icons-material"; +import { useDialog } from "../../../../hooks/use-dialog"; import Link from "next/link"; +import { useState } from "react"; const Page = () => { const pageTitle = "Autopilot Devices"; + const createDialog = useDialog(); const actions = [ { @@ -70,20 +74,36 @@ const Page = () => { ]; return ( - - - - } - /> + <> + + + + + } + /> + + ); }; diff --git a/src/pages/endpoint/autopilot/list-profiles/index.js b/src/pages/endpoint/autopilot/list-profiles/index.js index 2e9d5f419aef..e1e3e8375b1a 100644 --- a/src/pages/endpoint/autopilot/list-profiles/index.js +++ b/src/pages/endpoint/autopilot/list-profiles/index.js @@ -3,6 +3,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" import { EyeIcon } from "@heroicons/react/24/outline"; import { Button } from "@mui/material"; import Link from "next/link"; +import { AccountCircle } from "@mui/icons-material"; import CippJsonView from "../../../../components/CippFormPages/CippJSONView"; const Page = () => { @@ -32,7 +33,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/endpoint/autopilot/list-status-pages/index.js b/src/pages/endpoint/autopilot/list-status-pages/index.js index d49f4281b043..fc1525f4cbbb 100644 --- a/src/pages/endpoint/autopilot/list-status-pages/index.js +++ b/src/pages/endpoint/autopilot/list-status-pages/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; +import { PostAdd } from "@mui/icons-material"; const Page = () => { const pageTitle = "Autopilot Status Pages"; @@ -25,7 +26,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/identity/administration/devices/index.js b/src/pages/identity/administration/devices/index.js index 456329c33755..0ae68838f469 100644 --- a/src/pages/identity/administration/devices/index.js +++ b/src/pages/identity/administration/devices/index.js @@ -1,7 +1,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Layout as DashboardLayout } from "/src/layouts/index.js"; // had to add an extra path here because I added an extra folder structure. We should switch to absolute pathing so we dont have to deal with relative. import { useSettings } from "/src/hooks/use-settings"; -import { EyeIcon } from "@heroicons/react/24/outline"; +import { Visibility, CheckCircleOutline, Block, VpnKey, DeleteForever } from "@mui/icons-material"; const Page = () => { const pageTitle = "Devices"; @@ -12,7 +12,7 @@ const Page = () => { label: "View in Entra", link: `https://entra.microsoft.com/${tenantFilter}/#view/Microsoft_AAD_Devices/DeviceDetailsMenuBlade/~/Properties/objectId/[id]/deviceId/`, color: "info", - icon: , + icon: , target: "_blank", multiPost: false, external: true, @@ -27,6 +27,7 @@ const Page = () => { }, confirmText: "Are you sure you want to enable this device?", multiPost: false, + icon: , }, { label: "Disable Device", @@ -38,6 +39,7 @@ const Page = () => { }, confirmText: "Are you sure you want to disable this device?", multiPost: false, + icon: , }, { label: "Retrieve BitLocker Keys", @@ -48,6 +50,7 @@ const Page = () => { }, confirmText: "Are you sure you want to retrieve the BitLocker keys?", multiPost: false, + icon: , }, { label: "Delete Device", @@ -59,6 +62,7 @@ const Page = () => { }, confirmText: "Are you sure you want to delete this device?", multiPost: false, + icon: , }, ]; diff --git a/src/pages/identity/administration/group-templates/index.js b/src/pages/identity/administration/group-templates/index.js index 52bb163880a8..69a3a55d6911 100644 --- a/src/pages/identity/administration/group-templates/index.js +++ b/src/pages/identity/administration/group-templates/index.js @@ -1,6 +1,7 @@ import { Button } from "@mui/material"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Layout as DashboardLayout } from "/src/layouts/index.js"; +import { AddBox, RocketLaunch, Delete } from "@mui/icons-material"; import Link from "next/link"; import { CippCodeBlock } from "../../../../components/CippComponents/CippCodeBlock"; @@ -12,6 +13,7 @@ const Page = () => { label: "Delete Template", type: "GET", url: "/api/RemoveGroupTemplate", + icon: , data: { ID: "GUID", }, @@ -31,10 +33,10 @@ const Page = () => { actions={actions} cardButton={ <> - - diff --git a/src/pages/identity/administration/groups/index.js b/src/pages/identity/administration/groups/index.js index 1fb57be03d1e..0c9fc8452887 100644 --- a/src/pages/identity/administration/groups/index.js +++ b/src/pages/identity/administration/groups/index.js @@ -2,8 +2,8 @@ import { Button } from "@mui/material"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Layout as DashboardLayout } from "/src/layouts/index.js"; import Link from "next/link"; -import { EyeIcon, LockClosedIcon, LockOpenIcon, PencilIcon, TrashIcon } from "@heroicons/react/24/outline"; -import { LockOpen, Visibility, VisibilityOff } from "@mui/icons-material"; +import { TrashIcon } from "@heroicons/react/24/outline"; +import { Visibility, VisibilityOff, GroupAdd, Edit, LockOpen, Lock } from "@mui/icons-material"; const Page = () => { const pageTitle = "Groups"; @@ -13,7 +13,7 @@ const Page = () => { label: "Edit Group", link: "/identity/administration/groups/edit?groupId=[id]", multiPost: false, - icon: , + icon: , color: "success", }, { @@ -49,7 +49,7 @@ const Page = () => { label: "Only allow messages from people inside the organisation", type: "GET", url: "/api/ExecGroupsDeliveryManagement", - icon: , + icon: , data: { TenantFilter: "TenantFilter", ID: "mail", @@ -63,7 +63,7 @@ const Page = () => { { label: "Allow messages from people inside and outside the organisation", type: "GET", - icon: , + icon: , url: "/api/ExecGroupsDeliveryManagement", data: { TenantFilter: "TenantFilter", @@ -106,7 +106,7 @@ const Page = () => { title={pageTitle} cardButton={ <> - diff --git a/src/pages/identity/administration/jit-admin/index.js b/src/pages/identity/administration/jit-admin/index.js index cc90ab853599..e4ad1c00ce46 100644 --- a/src/pages/identity/administration/jit-admin/index.js +++ b/src/pages/identity/administration/jit-admin/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import CippTablePage from "/src/components/CippComponents/CippTablePage"; import { Button } from "@mui/material"; +import { AdminPanelSettings } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -8,7 +9,7 @@ const Page = () => { - diff --git a/src/pages/identity/administration/risky-users/index.js b/src/pages/identity/administration/risky-users/index.js index 759117480d8b..a5327f24d7f3 100644 --- a/src/pages/identity/administration/risky-users/index.js +++ b/src/pages/identity/administration/risky-users/index.js @@ -1,7 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; -import { Clear } from "@mui/icons-material"; -import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import { Clear, Search } from "@mui/icons-material"; const Page = () => { const pageTitle = "Risky Users"; @@ -19,7 +18,7 @@ const Page = () => { { label: "Research Compromised Account", type: "GET", - icon: , + icon: , link: "/identity/administration/users/user/bec?userId=[id]", confirmText: "Are you sure you want to research this compromised account?", multiPost: false, diff --git a/src/pages/identity/administration/users/index.js b/src/pages/identity/administration/users/index.js index ec4552915b18..5d646a68fb69 100644 --- a/src/pages/identity/administration/users/index.js +++ b/src/pages/identity/administration/users/index.js @@ -1,6 +1,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { Button } from "@mui/material"; +import { Send, GroupAdd, PersonAdd } from "@mui/icons-material"; import Link from "next/link"; import { useSettings } from "/src/hooks/use-settings.js"; import { CippUserActions } from "/src/components/CippComponents/CippUserActions.jsx"; @@ -53,15 +54,15 @@ const Page = () => { apiUrl="/api/ListGraphRequest" cardButton={ <> - + - - } apiData={{ diff --git a/src/pages/index.js b/src/pages/index.js index 0c60b06fe5a2..c5810877c598 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -167,6 +167,7 @@ const Page = () => { label: portal.label, target: "_blank", link: portal.url.replace(portal.variable, tenantLookup?.[portal.variable]), + icon: portal.icon, })); setPortalMenuItems(menuItems); } diff --git a/src/pages/security/incidents/list-alerts/index.js b/src/pages/security/incidents/list-alerts/index.js index 09e1411d9d3b..4110754efd8d 100644 --- a/src/pages/security/incidents/list-alerts/index.js +++ b/src/pages/security/incidents/list-alerts/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Assignment, Done } from "@mui/icons-material"; const Page = () => { const pageTitle = "Alerts List"; @@ -9,6 +10,7 @@ const Page = () => { { label: "Set status to in progress", type: "POST", + icon: , url: "/api/ExecSetSecurityAlert", data: { TenantFilter: "Tenant", @@ -22,6 +24,7 @@ const Page = () => { { label: "Set status to resolved", type: "POST", + icon: , url: "/api/ExecSetSecurityAlert", data: { TenantFilter: "Tenant", diff --git a/src/pages/security/incidents/list-incidents/index.js b/src/pages/security/incidents/list-incidents/index.js index bebae5e2f983..9737696a1d02 100644 --- a/src/pages/security/incidents/list-incidents/index.js +++ b/src/pages/security/incidents/list-incidents/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { PersonAdd, PlayArrow, Assignment, Done } from "@mui/icons-material"; const Page = () => { const pageTitle = "Incidents List"; @@ -9,6 +10,7 @@ const Page = () => { { label: "Assign to self", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { TenantFilter: "Tenant", @@ -20,6 +22,7 @@ const Page = () => { { label: "Set status to active", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { TenantFilter: "Tenant", @@ -32,6 +35,7 @@ const Page = () => { { label: "Set status to in progress", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { TenantFilter: "Tenant", @@ -44,6 +48,7 @@ const Page = () => { { label: "Set status to resolved", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { TenantFilter: "Tenant", diff --git a/src/pages/teams-share/sharepoint/index.js b/src/pages/teams-share/sharepoint/index.js index d88d75533e92..5b15705536f9 100644 --- a/src/pages/teams-share/sharepoint/index.js +++ b/src/pages/teams-share/sharepoint/index.js @@ -1,6 +1,14 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { + Add, + AddToPhotos, + PersonAdd, + PersonRemove, + AdminPanelSettings, + NoAccounts, +} from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -10,6 +18,7 @@ const Page = () => { { label: "Add Member", type: "POST", + icon: , url: "/api/ExecSetSharePointMember", data: { groupId: "ownerPrincipalName", @@ -40,6 +49,7 @@ const Page = () => { { label: "Remove Member", type: "POST", + icon: , url: "/api/ExecSetSharePointMember", data: { groupId: "ownerPrincipalName", @@ -70,6 +80,7 @@ const Page = () => { { label: "Add Site Admin", type: "POST", + icon: , url: "/api/ExecSharePointPerms", data: { UPN: "ownerPrincipalName", @@ -99,6 +110,7 @@ const Page = () => { { label: "Remove Site Admin", type: "POST", + icon: , url: "/api/ExecSharePointPerms", data: { UPN: "ownerPrincipalName", @@ -151,10 +163,14 @@ const Page = () => { ]} cardButton={ <> - - diff --git a/src/pages/teams-share/teams/business-voice/index.js b/src/pages/teams-share/teams/business-voice/index.js index 725a2a8a5331..6cef4fd00045 100644 --- a/src/pages/teams-share/teams/business-voice/index.js +++ b/src/pages/teams-share/teams/business-voice/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { PersonAdd, PersonRemove, LocationOn } from "@mui/icons-material"; const Page = () => { const pageTitle = "Teams Business Voice"; @@ -9,6 +10,7 @@ const Page = () => { { label: "Assign User", type: "POST", + icon: , url: "/api/ExecTeamsVoicePhoneNumberAssignment", data: { PhoneNumber: "TelephoneNumber", @@ -34,6 +36,7 @@ const Page = () => { { label: "Unassign User", type: "POST", + icon: , url: "/api/ExecRemoveTeamsVoicePhoneNumberAssignment", data: { PhoneNumber: "TelephoneNumber", @@ -45,6 +48,7 @@ const Page = () => { { label: "Set Emergency Location", type: "POST", + icon: , url: "/api/ExecTeamsVoicePhoneNumberAssignment", data: { PhoneNumber: "TelephoneNumber", diff --git a/src/pages/teams-share/teams/list-team/index.js b/src/pages/teams-share/teams/list-team/index.js index b1a41a9adbb6..fb3580cc2622 100644 --- a/src/pages/teams-share/teams/list-team/index.js +++ b/src/pages/teams-share/teams/list-team/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { GroupAdd } from "@mui/icons-material"; import Link from "next/link"; import { Edit } from "@mui/icons-material"; @@ -25,7 +26,7 @@ const Page = () => { simpleColumns={["displayName", "description", "visibility", "mailNickname", "id"]} cardButton={ <> - diff --git a/src/pages/tenant/administration/alert-configuration/index.js b/src/pages/tenant/administration/alert-configuration/index.js index 6b68555d0e66..1544d84c8e39 100644 --- a/src/pages/tenant/administration/alert-configuration/index.js +++ b/src/pages/tenant/administration/alert-configuration/index.js @@ -3,7 +3,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" import { Layout as DashboardLayout } from "/src/layouts/index.js"; // had to add an extra path here because I added an extra folder structure. We should switch to absolute pathing so we dont have to deal with relative. import Link from "next/link"; import { EyeIcon } from "@heroicons/react/24/outline"; -import { CopyAll, Delete } from "@mui/icons-material"; +import { CopyAll, Delete, NotificationAdd } from "@mui/icons-material"; const Page = () => { const pageTitle = "Alerts"; @@ -43,7 +43,11 @@ const Page = () => { apiUrl="/api/ListAlertsQueue" tenantInTitle={false} cardButton={ - } diff --git a/src/pages/tenant/administration/authentication-methods/index.js b/src/pages/tenant/administration/authentication-methods/index.js index 7da41b844058..cd8fc26259c3 100644 --- a/src/pages/tenant/administration/authentication-methods/index.js +++ b/src/pages/tenant/administration/authentication-methods/index.js @@ -1,5 +1,6 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; +import { Check, Block } from "@mui/icons-material"; const Page = () => { const pageTitle = "Auth Methods"; @@ -12,6 +13,7 @@ const Page = () => { { label: "Enable Policy", type: "POST", + icon: , url: "/api/SetAuthMethod", data: { state: "enabled", id: "id" }, confirmText: "Are you sure you want to enable this policy?", @@ -20,6 +22,7 @@ const Page = () => { { label: "Disable Policy", type: "POST", + icon: , url: "/api/SetAuthMethod", data: { state: "disabled", id: "id" }, confirmText: "Are you sure you want to disable this policy?", diff --git a/src/pages/tenant/backup/backup-wizard/index.js b/src/pages/tenant/backup/backup-wizard/index.js index a5a5b04b6d62..ef07baf9d842 100644 --- a/src/pages/tenant/backup/backup-wizard/index.js +++ b/src/pages/tenant/backup/backup-wizard/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { Restore, Backup } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -10,10 +11,14 @@ const Page = () => { apiUrl="/api/ListScheduledItems" cardButton={ <> - - diff --git a/src/pages/tenant/conditional/deploy-vacation/index.js b/src/pages/tenant/conditional/deploy-vacation/index.js index ddddd13809c2..ca4092689195 100644 --- a/src/pages/tenant/conditional/deploy-vacation/index.js +++ b/src/pages/tenant/conditional/deploy-vacation/index.js @@ -1,6 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import CippTablePage from "/src/components/CippComponents/CippTablePage"; import { Button } from "@mui/material"; +import { EventAvailable } from "@mui/icons-material"; import Link from "next/link"; const Page = () => { @@ -8,7 +9,7 @@ const Page = () => { - diff --git a/src/pages/tenant/conditional/list-named-locations/index.js b/src/pages/tenant/conditional/list-named-locations/index.js index 2f72a57d5325..834efd07eb32 100644 --- a/src/pages/tenant/conditional/list-named-locations/index.js +++ b/src/pages/tenant/conditional/list-named-locations/index.js @@ -3,6 +3,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" import { Button } from "@mui/material"; import Link from "next/link"; import { MinusIcon, PlusIcon } from "@heroicons/react/24/outline"; +import { LocationOn } from "@mui/icons-material"; const Page = () => { const pageTitle = "Named Locations"; @@ -75,7 +76,7 @@ const Page = () => { offCanvas={offCanvas} cardButton={ <> - diff --git a/src/pages/tenant/conditional/list-policies/index.js b/src/pages/tenant/conditional/list-policies/index.js index 35f77a73f286..df42715f9801 100644 --- a/src/pages/tenant/conditional/list-policies/index.js +++ b/src/pages/tenant/conditional/list-policies/index.js @@ -5,6 +5,7 @@ import { Check as CheckIcon, Delete as DeleteIcon, MenuBook as MenuBookIcon, + AddModerator as AddModeratorIcon, Visibility as VisibilityIcon, } from "@mui/icons-material"; import { Button } from "@mui/material"; @@ -105,7 +106,11 @@ const Page = () => { - diff --git a/src/pages/tenant/conditional/list-template/index.js b/src/pages/tenant/conditional/list-template/index.js index 41a8010d6b50..b45950ba60dc 100644 --- a/src/pages/tenant/conditional/list-template/index.js +++ b/src/pages/tenant/conditional/list-template/index.js @@ -2,6 +2,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import CippJsonView from "../../../../components/CippFormPages/CippJSONView"; +import { Delete } from "@mui/icons-material"; const Page = () => { const pageTitle = "Available Conditional Access Templates"; @@ -11,6 +12,7 @@ const Page = () => { label: "Delete Template", type: "GET", url: "/api/RemoveCATemplate", + icon: , data: { ID: "GUID" }, confirmText: "Do you want to delete the template?", multiPost: false, diff --git a/src/pages/tenant/gdap-management/invites/index.js b/src/pages/tenant/gdap-management/invites/index.js index 7cf52a876857..54670b22330e 100644 --- a/src/pages/tenant/gdap-management/invites/index.js +++ b/src/pages/tenant/gdap-management/invites/index.js @@ -3,6 +3,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import tabOptions from "../tabOptions"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { Add } from "@mui/icons-material"; import Link from "next/link"; const pageTitle = "GDAP Invites"; @@ -13,7 +14,7 @@ const Page = () => { return ( + } diff --git a/src/pages/tenant/gdap-management/onboarding/index.js b/src/pages/tenant/gdap-management/onboarding/index.js index 3835749a7cac..f5f2042f3064 100644 --- a/src/pages/tenant/gdap-management/onboarding/index.js +++ b/src/pages/tenant/gdap-management/onboarding/index.js @@ -4,7 +4,7 @@ import tabOptions from "../tabOptions"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; import Link from "next/link"; -import { Cancel, Replay } from "@mui/icons-material"; +import { Cancel, PlayArrow, Replay } from "@mui/icons-material"; const pageTitle = "Tenant Onboarding"; @@ -49,7 +49,11 @@ const Page = () => { tenantInTitle={false} queryKey="ListTenantOnboarding" cardButton={ - } diff --git a/src/pages/tenant/gdap-management/role-templates/index.js b/src/pages/tenant/gdap-management/role-templates/index.js index def2717cc986..3b82189aeb14 100644 --- a/src/pages/tenant/gdap-management/role-templates/index.js +++ b/src/pages/tenant/gdap-management/role-templates/index.js @@ -9,7 +9,7 @@ import { useEffect, useState } from "react"; import { Box, Stack } from "@mui/system"; import { PlusIcon, TrashIcon } from "@heroicons/react/24/outline"; import { CippApiResults } from "../../../../components/CippComponents/CippApiResults"; -import { Edit } from "@mui/icons-material"; +import { Edit, AddBox } from "@mui/icons-material"; const Page = () => { const pageTitle = "GDAP Role Templates"; @@ -42,7 +42,6 @@ const Page = () => { urlFromData: true, relatedQueryKeys: "ListGDAPRoleTemplates", }); - useEffect(() => { if (currentTemplates.isSuccess) { @@ -98,7 +97,11 @@ const Page = () => { tenantInTitle={false} sx={{ flexGrow: 1, pb: 4 }} cardButton={ - } diff --git a/src/pages/tenant/gdap-management/roles/index.js b/src/pages/tenant/gdap-management/roles/index.js index 2de5ad32b096..e97820abaf08 100644 --- a/src/pages/tenant/gdap-management/roles/index.js +++ b/src/pages/tenant/gdap-management/roles/index.js @@ -3,15 +3,15 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import tabOptions from "../tabOptions"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { Button } from "@mui/material"; +import { AdminPanelSettings, Add, Delete } from "@mui/icons-material"; import Link from "next/link"; -import { PlusIcon, TrashIcon } from "@heroicons/react/24/outline"; const pageTitle = "GDAP Role Mappings"; const actions = [ { label: "Add to Template", - icon: , + icon: , type: "POST", url: "/api/ExecGDAPRoleTemplate?Action=Add", confirmText: "Select a template to add the selected role mapping(s) to.", @@ -40,7 +40,7 @@ const actions = [ }, { label: "Delete Mapping", - icon: , + icon: , type: "POST", url: "/api/ExecDeleteGDAPRoleMapping", data: { @@ -64,7 +64,11 @@ const Page = () => { simpleColumns={simpleColumns} tenantInTitle={false} cardButton={ - } diff --git a/src/pages/tenant/reports/list-csp-licenses/index.jsx b/src/pages/tenant/reports/list-csp-licenses/index.jsx index 611d4f5d9b10..9e6264df4c74 100644 --- a/src/pages/tenant/reports/list-csp-licenses/index.jsx +++ b/src/pages/tenant/reports/list-csp-licenses/index.jsx @@ -1,7 +1,7 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; import { MinusIcon, PlusIcon } from "@heroicons/react/24/outline"; -import { DeleteForever } from "@mui/icons-material"; +import { DeleteForever, ShoppingCart } from "@mui/icons-material"; import { Button } from "@mui/material"; import Link from "next/link"; @@ -93,7 +93,7 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/tenant/standards/bpa-report/index.js b/src/pages/tenant/standards/bpa-report/index.js index 2c786341cd68..50cf80d53b99 100644 --- a/src/pages/tenant/standards/bpa-report/index.js +++ b/src/pages/tenant/standards/bpa-report/index.js @@ -3,7 +3,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" import { Layout as DashboardLayout } from "/src/layouts/index.js"; // had to add an extra path here because I added an extra folder structure. We should switch to absolute pathing so we dont have to deal with relative. import Link from "next/link"; import { EyeIcon } from "@heroicons/react/24/outline"; -import { CopyAll, Delete, Edit } from "@mui/icons-material"; +import { CopyAll, Delete, Edit, AddBox } from "@mui/icons-material"; const Page = () => { const pageTitle = "Best Practice Reports"; @@ -48,7 +48,7 @@ const Page = () => { title={pageTitle} apiUrl="/api/listBPATemplates" cardButton={ - } diff --git a/src/pages/tenant/standards/domains-analyser/index.js b/src/pages/tenant/standards/domains-analyser/index.js index 1a5c2e9b4a68..c90254aab4df 100644 --- a/src/pages/tenant/standards/domains-analyser/index.js +++ b/src/pages/tenant/standards/domains-analyser/index.js @@ -6,7 +6,7 @@ import { ApiGetCall } from "../../../../api/ApiCall"; import { useSettings } from "../../../../hooks/use-settings"; import { CippApiResults } from "../../../../components/CippComponents/CippApiResults"; import { CippDomainCards } from "../../../../components/CippCards/CippDomainCards"; -import { DeleteForever } from "@mui/icons-material"; +import { DeleteForever, TravelExplore, Refresh } from "@mui/icons-material"; const Page = () => { const currentTenant = useSettings().currentTenant; @@ -36,11 +36,17 @@ const Page = () => { apiUrl="/api/ListDomainAnalyser" cardButton={ <> - {/* This needs to be replaced with a CippApiDialog. */} - + } prependComponents={} diff --git a/src/pages/tenant/standards/list-standards/index.js b/src/pages/tenant/standards/list-standards/index.js index e041ea9cd23b..2d9b4493d975 100644 --- a/src/pages/tenant/standards/list-standards/index.js +++ b/src/pages/tenant/standards/list-standards/index.js @@ -3,7 +3,7 @@ import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx" import { Layout as DashboardLayout } from "/src/layouts/index.js"; // had to add an extra path here because I added an extra folder structure. We should switch to absolute pathing so we dont have to deal with relative. import Link from "next/link"; import { EyeIcon } from "@heroicons/react/24/outline"; -import { CopyAll, Delete, PlayArrow } from "@mui/icons-material"; +import { CopyAll, Delete, PlayArrow, AddBox, Visibility, Edit } from "@mui/icons-material"; import { ApiGetCall, ApiPostCall } from "../../../../api/ApiCall"; import { Grid } from "@mui/system"; import { CippApiResults } from "../../../../components/CippComponents/CippApiResults"; @@ -17,7 +17,7 @@ const Page = () => { label: "Edit Template", //when using a link it must always be the full path /identity/administration/users/[id] for example. link: "/tenant/standards/template?id=[GUID]", - icon: , + icon: , color: "success", target: "_self", }, @@ -105,7 +105,7 @@ const Page = () => { apiUrl="/api/listStandardTemplates" tenantInTitle={false} cardButton={ - } From b0aa77755d3716bbd5fa74f15da702dbdf50eaac Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 30 Jan 2025 22:16:29 -0500 Subject: [PATCH 45/51] add github logos --- public/assets/integrations/github.png | Bin 0 -> 13001 bytes public/assets/integrations/github_dark.png | Bin 0 -> 31120 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/assets/integrations/github.png create mode 100644 public/assets/integrations/github_dark.png diff --git a/public/assets/integrations/github.png b/public/assets/integrations/github.png new file mode 100644 index 0000000000000000000000000000000000000000..e03d8dd8bcf0d851fe1eb89f93a39de843e5c69c GIT binary patch literal 13001 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 Dq_KSN literal 0 HcmV?d00001 diff --git a/public/assets/integrations/github_dark.png b/public/assets/integrations/github_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c61ab9d0582e487852d3afdbf22987208123591e GIT binary patch literal 31120 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 Date: Thu, 30 Jan 2025 22:37:26 -0500 Subject: [PATCH 46/51] downgrade node to 20.18.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index af7519d616d5..d4d4aad1955a 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "license": "AGPL-3.0", "engines": { - "node": "^20.18.2" + "node": "^20.18.1" }, "repository": { "type": "git", From 1ea3338b4c572482a8d7dc51ed516b67429ed65e Mon Sep 17 00:00:00 2001 From: John Duprey Date: Thu, 30 Jan 2025 22:44:50 -0500 Subject: [PATCH 47/51] cleanup manually specified tenant filters in actions --- .../email/administration/tenant-allow-block-lists/index.js | 1 - src/pages/email/tools/mailbox-restores/index.js | 3 --- src/pages/endpoint/applications/list/index.js | 4 ---- src/pages/identity/administration/groups/index.js | 4 ---- src/pages/security/incidents/list-alerts/index.js | 2 -- src/pages/security/incidents/list-incidents/index.js | 4 ---- 6 files changed, 18 deletions(-) diff --git a/src/pages/email/administration/tenant-allow-block-lists/index.js b/src/pages/email/administration/tenant-allow-block-lists/index.js index 508d5c67110e..e0348868e263 100644 --- a/src/pages/email/administration/tenant-allow-block-lists/index.js +++ b/src/pages/email/administration/tenant-allow-block-lists/index.js @@ -13,7 +13,6 @@ const Page = () => { type: "POST", url: "/api/RemoveTenantAllowBlockList", data: { - TenantFilter: "Tenant", Entries: "Value", ListType: "ListType", }, diff --git a/src/pages/email/tools/mailbox-restores/index.js b/src/pages/email/tools/mailbox-restores/index.js index ffa463800bd5..d9956d0d742b 100644 --- a/src/pages/email/tools/mailbox-restores/index.js +++ b/src/pages/email/tools/mailbox-restores/index.js @@ -13,7 +13,6 @@ const Page = () => { type: "POST", url: "/api/ExecMailboxRestore", data: { - TenantFilter: "Tenant", Identity: "Identity", Action: "Resume", }, @@ -25,7 +24,6 @@ const Page = () => { type: "POST", url: "/api/ExecMailboxRestore", data: { - TenantFilter: "Tenant", Identity: "Identity", Action: "Suspend", }, @@ -37,7 +35,6 @@ const Page = () => { type: "POST", url: "/api/ExecMailboxRestore", data: { - TenantFilter: "Tenant", Identity: "Identity", Action: "Remove", }, diff --git a/src/pages/endpoint/applications/list/index.js b/src/pages/endpoint/applications/list/index.js index 5a3d8eef0cfb..67e16ece37bd 100644 --- a/src/pages/endpoint/applications/list/index.js +++ b/src/pages/endpoint/applications/list/index.js @@ -15,7 +15,6 @@ const Page = () => { url: "/api/ExecAssignApp", data: { AssignTo: "AllUsers", - TenantFilter: "Tenant", ID: "id", }, confirmText: "Are you sure you want to assign this app to all users?", @@ -28,7 +27,6 @@ const Page = () => { url: "/api/ExecAssignApp", data: { AssignTo: "AllDevices", - TenantFilter: "Tenant", ID: "id", }, confirmText: "Are you sure you want to assign this app to all devices?", @@ -41,7 +39,6 @@ const Page = () => { url: "/api/ExecAssignApp", data: { AssignTo: "Both", - TenantFilter: "Tenant", ID: "id", }, confirmText: "Are you sure you want to assign this app to all users and devices?", @@ -53,7 +50,6 @@ const Page = () => { type: "POST", url: "/api/RemoveApp", data: { - TenantFilter: "Tenant", ID: "id", }, confirmText: "Are you sure you want to delete this application?", diff --git a/src/pages/identity/administration/groups/index.js b/src/pages/identity/administration/groups/index.js index 1fb57be03d1e..934526687979 100644 --- a/src/pages/identity/administration/groups/index.js +++ b/src/pages/identity/administration/groups/index.js @@ -22,7 +22,6 @@ const Page = () => { url: "/api/ExecGroupsHideFromGAL", icon: , data: { - TenantFilter: "TenantFilter", ID: "mail", GroupType: "calculatedGroupType", HidefromGAL: true, @@ -37,7 +36,6 @@ const Page = () => { url: "/api/ExecGroupsHideFromGAL", icon: , data: { - TenantFilter: "TenantFilter", ID: "mail", GroupType: "calculatedGroupType", }, @@ -51,7 +49,6 @@ const Page = () => { url: "/api/ExecGroupsDeliveryManagement", icon: , data: { - TenantFilter: "TenantFilter", ID: "mail", GroupType: "calculatedGroupType", OnlyAllowInternal: true, @@ -66,7 +63,6 @@ const Page = () => { icon: , url: "/api/ExecGroupsDeliveryManagement", data: { - TenantFilter: "TenantFilter", ID: "mail", GroupType: "calculatedGroupType", }, diff --git a/src/pages/security/incidents/list-alerts/index.js b/src/pages/security/incidents/list-alerts/index.js index 09e1411d9d3b..837db5087312 100644 --- a/src/pages/security/incidents/list-alerts/index.js +++ b/src/pages/security/incidents/list-alerts/index.js @@ -11,7 +11,6 @@ const Page = () => { type: "POST", url: "/api/ExecSetSecurityAlert", data: { - TenantFilter: "Tenant", GUID: "id", Status: "inProgress", Vendor: "vendorInformation.vendor", @@ -24,7 +23,6 @@ const Page = () => { type: "POST", url: "/api/ExecSetSecurityAlert", data: { - TenantFilter: "Tenant", GUID: "id", Status: "resolved", Vendor: "vendorInformation.vendor", diff --git a/src/pages/security/incidents/list-incidents/index.js b/src/pages/security/incidents/list-incidents/index.js index bebae5e2f983..53ac8ab1ef30 100644 --- a/src/pages/security/incidents/list-incidents/index.js +++ b/src/pages/security/incidents/list-incidents/index.js @@ -11,7 +11,6 @@ const Page = () => { type: "POST", url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Assigned: "currentUserId", }, @@ -22,7 +21,6 @@ const Page = () => { type: "POST", url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Status: "active", Assigned: "currentAssignedUser", @@ -34,7 +32,6 @@ const Page = () => { type: "POST", url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Status: "inProgress", Assigned: "currentAssignedUser", @@ -46,7 +43,6 @@ const Page = () => { type: "POST", url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Status: "resolved", Assigned: "currentAssignedUser", From 8830a02a37de356486fe9d12c65ab24cc6eb1911 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:30:33 +0100 Subject: [PATCH 48/51] fix reset form issue --- .../CippFormPages/CippAddGroupForm.jsx | 4 ++-- src/components/CippFormPages/CippFormPage.jsx | 3 +-- .../CippStandards/CippStandardsSideBar.jsx | 23 ++++++++++--------- .../administration/group-templates/add.jsx | 1 + 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/components/CippFormPages/CippAddGroupForm.jsx b/src/components/CippFormPages/CippAddGroupForm.jsx index 9745d9858636..49be141db5dd 100644 --- a/src/components/CippFormPages/CippAddGroupForm.jsx +++ b/src/components/CippFormPages/CippAddGroupForm.jsx @@ -51,7 +51,7 @@ const CippAddGroupForm = (props) => { formControl={formControl} name="owners" label="Owners" - multiple={false} + multiple={true} select={"id,userPrincipalName,displayName"} /> @@ -62,7 +62,7 @@ const CippAddGroupForm = (props) => { formControl={formControl} name="members" label="Members" - multiple={false} + multiple={true} select={"id,userPrincipalName,displayName"} /> diff --git a/src/components/CippFormPages/CippFormPage.jsx b/src/components/CippFormPages/CippFormPage.jsx index 585975b073bb..7db1575e9620 100644 --- a/src/components/CippFormPages/CippFormPage.jsx +++ b/src/components/CippFormPages/CippFormPage.jsx @@ -27,7 +27,7 @@ const CippFormPage = (props) => { formControl, postUrl, customDataformatter, - resetForm = true, + resetForm = false, hideBackButton = false, hidePageType = false, hideTitle = false, @@ -36,7 +36,6 @@ const CippFormPage = (props) => { ...other } = props; const router = useRouter(); - //check if there are const postCall = ApiPostCall({ datafromUrl: true, diff --git a/src/components/CippStandards/CippStandardsSideBar.jsx b/src/components/CippStandards/CippStandardsSideBar.jsx index c6a405de636f..2c87c7562fe8 100644 --- a/src/components/CippStandards/CippStandardsSideBar.jsx +++ b/src/components/CippStandards/CippStandardsSideBar.jsx @@ -1,14 +1,5 @@ import PropTypes from "prop-types"; -import { - Card, - CardContent, - CardHeader, - Divider, - formControlLabelClasses, - Stack, - SvgIcon, - Typography, -} from "@mui/material"; +import { Card, CardContent, CardHeader, Divider, Stack, SvgIcon, Typography } from "@mui/material"; import { styled } from "@mui/material/styles"; import { Timeline, @@ -24,7 +15,7 @@ import { ActionListItem } from "/src/components/action-list-item"; import CheckIcon from "@heroicons/react/24/outline/CheckIcon"; import CloseIcon from "@mui/icons-material/Close"; import { useWatch } from "react-hook-form"; -import { useEffect, useState } from "react"; +import { use, useEffect, useState } from "react"; import _ from "lodash"; import CippFormComponent from "/src/components/CippComponents/CippFormComponent"; import { CippFormTenantSelector } from "../CippComponents/CippFormTenantSelector"; @@ -127,6 +118,15 @@ const CippStandardsSideBar = ({ fullWidth /> + + { return ( <> Date: Fri, 31 Jan 2025 14:22:35 +0100 Subject: [PATCH 49/51] feat: readded MDM wipe methods --- src/pages/endpoint/MEM/devices/index.js | 146 ++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 9 deletions(-) diff --git a/src/pages/endpoint/MEM/devices/index.js b/src/pages/endpoint/MEM/devices/index.js index 0965bb50462f..a381de6b12df 100644 --- a/src/pages/endpoint/MEM/devices/index.js +++ b/src/pages/endpoint/MEM/devices/index.js @@ -12,6 +12,9 @@ import { Security, FindInPage, Shield, + Archive, + AutoMode, + Recycling, } from "@mui/icons-material"; const Page = () => { @@ -19,6 +22,15 @@ const Page = () => { const tenantFilter = useSettings().currentTenant; const actions = [ + { + label: "View in InTune", + link: `https://intune.microsoft.com/${tenantFilter}/#view/Microsoft_Intune_Devices/DeviceSettingsMenuBlade/~/overview/mdmDeviceId/[id]`, + color: "info", + icon: , + target: "_blank", + multiPost: false, + external: true, + }, { label: "Sync Device", type: "POST", @@ -116,17 +128,133 @@ const Page = () => { GUID: "id", Action: "windowsDefenderUpdateSignatures", }, - confirmText: - "Are you sure you want to update the Windows Defender signatures for this device?", + confirmText: "Are you sure you want to update the Windows Defender signatures for this device?", }, { - label: "View in InTune", - link: `https://intune.microsoft.com/${tenantFilter}/#view/Microsoft_Intune_Devices/DeviceSettingsMenuBlade/~/overview/mdmDeviceId/[id]`, - color: "info", - icon: , - target: "_blank", - multiPost: false, - external: true, + label: "Generate logs and ship to MEM", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "CreateDeviceLogCollectionRequest", + }, + confirmText: "Are you sure you want to generate logs and ship these to MEM?", + }, + /* + { + label: "Rename device", + type: "POST", + icon: null, + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "setDeviceName", + }, + confirmText: "Enter the new name for the device", + }, + */ + { + label: "Fresh Start (Remove user data)", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "cleanWindowsDevice", + keepUserData: false, + }, + confirmText: "Are you sure you want to Fresh Start this device?", + }, + { + label: "Fresh Start (Do not remove user data)", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "cleanWindowsDevice", + keepUserData: true, + }, + confirmText: "Are you sure you want to Fresh Start this device?", + }, + { + label: "Wipe Device, keep enrollment data", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "cleanWindowsDevice", + keepUserData: false, + keepEnrollmentData: true, + }, + confirmText: "Are you sure you want to wipe this device, and retain enrollment data?", + }, + { + label: "Wipe Device, remove enrollment data", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "cleanWindowsDevice", + keepUserData: false, + keepEnrollmentData: false, + }, + confirmText: "Are you sure you want to wipe this device, and remove enrollment data?", + }, + { + label: "Wipe Device, keep enrollment data, and continue at powerloss", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "cleanWindowsDevice", + keepEnrollmentData: true, + keepUserData: false, + useProtectedWipe: true, + }, + confirmText: "Are you sure you want to wipe this device? This will retain enrollment data. Continuing at powerloss may cause boot issues if wipe is interrupted.", + }, + { + label: "Wipe Device, remove enrollment data, and continue at powerloss", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "cleanWindowsDevice", + keepEnrollmentData: false, + keepUserData: false, + useProtectedWipe: true, + }, + confirmText: "Are you sure you want to wipe this device? This will also remove enrollment data. Continuing at powerloss may cause boot issues if wipe is interrupted.", + }, + { + label: "Autopilot Reset", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "wipe", + keepUserData: "false", + keepEnrollmentData: "true", + }, + confirmText: "Are you sure you want to Autopilot Reset this device?", + }, + { + label: "Retire device", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "retire", + }, + confirmText: "Are you sure you want to retire this device?", }, ]; From 392baf39fcc77bad3da2cdb0893432d94729245f Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 31 Jan 2025 17:02:59 -0500 Subject: [PATCH 50/51] fix graph explorer in offcanvas fix scheduler parameters --- .../CippFormPages/CippSchedulerForm.jsx | 3 +- .../CippTable/CippGraphExplorerFilter.js | 72 ++++++++++--------- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/components/CippFormPages/CippSchedulerForm.jsx b/src/components/CippFormPages/CippSchedulerForm.jsx index e18e9c57421a..5bc71dd02211 100644 --- a/src/components/CippFormPages/CippSchedulerForm.jsx +++ b/src/components/CippFormPages/CippSchedulerForm.jsx @@ -206,7 +206,8 @@ const CippSchedulerForm = (props) => { formControl={formControl} > - {param.Type === "System.Boolean" ? ( + {param.Type === "System.Boolean" || + param.Type === "System.Management.Automation.SwitchParameter" ? ( { + const endpoint = watchedValues.endpoint; + if (endpoint && endpoint !== currentEndpoint) { + setCurrentEndpoint(endpoint); + } + }, [watchedValues.endpoint]); // API call for available properties const propertyList = ApiGetCall({ url: "/api/ListGraphRequest", - queryKey: `graph-properties-${endpoint}`, + queryKey: `graph-properties-${currentEndpoint}`, data: { - Endpoint: endpoint, + Endpoint: currentEndpoint, ListProperties: true, TenantFilter: tenant, IgnoreErrors: true, @@ -141,16 +149,16 @@ const CippGraphExplorerFilter = ({ }); } setPresetOptions(presetOptionList); - }, [defaultPresets, presetList.isSuccess]); + }, [defaultPresets, presetList.isSuccess, presetList.data]); // Debounced refetch when endpoint, put in in a useEffect dependand on endpoint const debouncedRefetch = useCallback( debounce(() => { - if (endpoint) { + if (currentEndpoint) { propertyList.refetch(); } }, 1000), - [endpoint] // Dependencies that the debounce function depends on + [currentEndpoint] // Dependencies that the debounce function depends on ); useEffect(() => { @@ -159,10 +167,10 @@ const CippGraphExplorerFilter = ({ return () => { debouncedRefetch.cancel(); }; - }, [endpoint, debouncedRefetch]); + }, [currentEndpoint, debouncedRefetch]); const savePresetApi = ApiPostCall({ - relatedQueryKeys: "ListGraphExplorerPresets", + relatedQueryKeys: ["ListGraphExplorerPresets", "ListGraphRequest"], }); // Save preset function @@ -278,13 +286,13 @@ const CippGraphExplorerFilter = ({ }; // Schedule report function const handleScheduleReport = () => { - const formParameters = formControl.getValues(); + const formParameters = watchedValues; const selectString = formParameters.$select ? formParameters.$select?.map((item) => item.value).join(",") : null; //compose the parameters for the form based on what is available - const Parameters = [ + var Parameters = [ { Key: "$select", Value: selectString, @@ -309,32 +317,17 @@ const CippGraphExplorerFilter = ({ Key: "$expand", Value: formParameters.$expand, }, - { - Key: "ReverseTenantLookup", - Value: formParameters.ReverseTenantLookup, - }, - { - Key: "ReverseTenantLookupProperty", - Value: formParameters.ReverseTenantLookupProperty, - }, - { - Key: "NoPagination", - Value: formParameters.NoPagination, - }, - { - Key: "AsApp", - Value: formParameters.AsApp, - }, { Key: "$format", Value: formParameters.$format, }, ]; - Parameters.forEach((param) => { - if (param.Value == null || param.Value === "") { - //delete the index - Parameters.splice(Parameters.indexOf(param), 1); - } + Parameters = Parameters.filter((param) => { + return ( + param.Value != null && + param.Value !== "" && + !(typeof param.Value === "boolean" && param.Value === false) + ); }); const resetParams = { tenantFilter: tenant, @@ -350,6 +343,9 @@ const CippGraphExplorerFilter = ({ Endpoint: formParameters.endpoint, skipCache: true, NoPagination: formParameters.NoPagination, + AsApp: formParameters.AsApp, + ReverseTenantLookup: formParameters.ReverseTenantLookup, + ReverseTenantLookupProperty: formParameters.ReverseTenantLookupProperty, Parameters: Parameters, }, advancedParameters: false, @@ -375,12 +371,14 @@ const CippGraphExplorerFilter = ({ function getPresetProps(values) { var newvals = Object.assign({}, values); + console.log(values); if (newvals?.$select !== undefined && Array.isArray(newvals?.$select)) { newvals.$select = newvals?.$select.map((p) => p.value).join(","); } delete newvals["reportTemplate"]; delete newvals["tenantFilter"]; delete newvals["IsShared"]; + delete newvals["id"]; if (newvals.ReverseTenantLookup === false) { delete newvals.ReverseTenantLookup; } @@ -390,6 +388,9 @@ const CippGraphExplorerFilter = ({ if (newvals.$count === false) { delete newvals.$count; } + if (newvals.AsApp === false) { + delete newvals.AsApp; + } Object.keys(newvals).forEach((key) => { if (values[key] === "" || values[key] === null) { delete newvals[key]; @@ -399,7 +400,7 @@ const CippGraphExplorerFilter = ({ } useEffect(() => { - var values = getPresetProps(formControl.getValues()); + var values = getPresetProps(watchedValues); setOffCanvasContent(() => ( <> @@ -425,7 +426,7 @@ const CippGraphExplorerFilter = ({ )); - }, [editorValues, savePresetApi.isPending, formControl, selectedPresets]); + }, [editorValues, savePresetApi.isPending, formControl, selectedPresets, watchedValues]); const handleImport = () => { setOffCanvasOpen(true); // Open the offCanvas, the content will be updated by useEffect @@ -555,6 +556,7 @@ const CippGraphExplorerFilter = ({ multiple={false} formControl={formControl} options={presetOptions} + isFetching={presetList.isFetching} groupBy={(option) => option.type} renderGroup={(params) => (
  • @@ -594,7 +596,7 @@ const CippGraphExplorerFilter = ({ name="$select" label="Select" formControl={formControl} - isFetching={propertyList.isLoading} + isFetching={propertyList.isFetching} options={ (propertyList.isSuccess && propertyList?.data?.Results?.length > 0 && From f740ad5a73220e10b8acf219da29be84ea55dfd0 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 31 Jan 2025 17:10:38 -0500 Subject: [PATCH 51/51] up version --- package.json | 2 +- public/version.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d4d4aad1955a..13dac459bf3f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "7.0.0", + "version": "7.1.3", "author": "CIPP Contributors", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version.json b/public/version.json index ef511cf84994..795806e4fd04 100644 --- a/public/version.json +++ b/public/version.json @@ -1,3 +1,3 @@ { - "version": "7.1.2" + "version": "7.1.3" }