From d2391d071b69008486edee306f927d18eb627557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Thu, 24 Jul 2025 23:51:13 +0200 Subject: [PATCH 1/3] remove valueField prop from componentProps to fix current tenant autoselect --- src/pages/endpoint/MEM/add-policy/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/endpoint/MEM/add-policy/index.js b/src/pages/endpoint/MEM/add-policy/index.js index 158d85c81539..b0ff95a5c89e 100644 --- a/src/pages/endpoint/MEM/add-policy/index.js +++ b/src/pages/endpoint/MEM/add-policy/index.js @@ -10,7 +10,7 @@ const Page = () => { title: "Step 1", description: "Tenant Selection", component: CippTenantStep, - componentProps: { type: "multiple", valueField: "customerId" }, + componentProps: { type: "multiple" }, }, { title: "Step 2", From 9c1235e9a86b04cc385e0a167d1c02bdc5d3360f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Thu, 24 Jul 2025 23:51:43 +0200 Subject: [PATCH 2/3] Add Deploy Policy button with permissions to pages Add preselected option to tenant selector in JIT Admin form --- .../MEM/list-appprotection-policies/index.js | 15 +- .../MEM/list-compliance-policies/index.js | 15 +- src/pages/endpoint/MEM/list-policies/index.js | 15 +- .../identity/administration/jit-admin/add.jsx | 477 +++++++++--------- 4 files changed, 281 insertions(+), 241 deletions(-) diff --git a/src/pages/endpoint/MEM/list-appprotection-policies/index.js b/src/pages/endpoint/MEM/list-appprotection-policies/index.js index 0e889eaee6a7..b637aa950730 100644 --- a/src/pages/endpoint/MEM/list-appprotection-policies/index.js +++ b/src/pages/endpoint/MEM/list-appprotection-policies/index.js @@ -1,10 +1,13 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; -import { Book } from "@mui/icons-material"; +import { Book, RocketLaunch } from "@mui/icons-material"; import { TrashIcon } from "@heroicons/react/24/outline"; +import { PermissionButton } from "/src/utils/permissions.js"; +import Link from "next/link"; const Page = () => { const pageTitle = "App Protection & Configuration Policies"; + const cardButtonPermissions = ["Endpoint.MEM.ReadWrite"]; const actions = [ { @@ -58,6 +61,16 @@ const Page = () => { actions={actions} offCanvas={offCanvas} simpleColumns={simpleColumns} + cardButton={ + } + > + Deploy Policy + + } /> ); }; diff --git a/src/pages/endpoint/MEM/list-compliance-policies/index.js b/src/pages/endpoint/MEM/list-compliance-policies/index.js index a55d76931cc3..a2bb8eb989d1 100644 --- a/src/pages/endpoint/MEM/list-compliance-policies/index.js +++ b/src/pages/endpoint/MEM/list-compliance-policies/index.js @@ -1,10 +1,13 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; -import { Book, LaptopChromebook } from "@mui/icons-material"; +import { Book, LaptopChromebook, RocketLaunch } from "@mui/icons-material"; import { GlobeAltIcon, TrashIcon, UserIcon } from "@heroicons/react/24/outline"; +import { PermissionButton } from "/src/utils/permissions.js"; +import Link from "next/link"; const Page = () => { const pageTitle = "Intune Compliance Policies"; + const cardButtonPermissions = ["Endpoint.MEM.ReadWrite"]; const actions = [ { @@ -99,6 +102,16 @@ const Page = () => { actions={actions} offCanvas={offCanvas} simpleColumns={simpleColumns} + cardButton={ + } + > + Deploy Policy + + } /> ); }; diff --git a/src/pages/endpoint/MEM/list-policies/index.js b/src/pages/endpoint/MEM/list-policies/index.js index 79a705984f39..a59547b8cbf7 100644 --- a/src/pages/endpoint/MEM/list-policies/index.js +++ b/src/pages/endpoint/MEM/list-policies/index.js @@ -1,10 +1,13 @@ import { Layout as DashboardLayout } from "/src/layouts/index.js"; import { CippTablePage } from "/src/components/CippComponents/CippTablePage.jsx"; -import { Book, LaptopChromebook } from "@mui/icons-material"; +import { Book, LaptopChromebook, RocketLaunch } from "@mui/icons-material"; import { GlobeAltIcon, TrashIcon, UserIcon } from "@heroicons/react/24/outline"; +import { PermissionButton } from "/src/utils/permissions.js"; +import Link from "next/link"; const Page = () => { const pageTitle = "Configuration Policies"; + const cardButtonPermissions = ["Endpoint.MEM.ReadWrite"]; const actions = [ { @@ -98,6 +101,16 @@ const Page = () => { actions={actions} offCanvas={offCanvas} simpleColumns={simpleColumns} + cardButton={ + } + > + Deploy Policy + + } /> ); }; diff --git a/src/pages/identity/administration/jit-admin/add.jsx b/src/pages/identity/administration/jit-admin/add.jsx index 7bb042fb9dcf..7f16c5c2ba0e 100644 --- a/src/pages/identity/administration/jit-admin/add.jsx +++ b/src/pages/identity/administration/jit-admin/add.jsx @@ -1,238 +1,239 @@ -import { Box, Divider } from "@mui/material"; -import { Grid } from "@mui/system"; -import CippFormPage from "../../../../components/CippFormPages/CippFormPage"; -import { Layout as DashboardLayout } from "/src/layouts/index.js"; -import { CippFormTenantSelector } from "../../../../components/CippComponents/CippFormTenantSelector"; -import { useForm } from "react-hook-form"; -import CippFormComponent from "../../../../components/CippComponents/CippFormComponent"; -import { CippFormCondition } from "../../../../components/CippComponents/CippFormCondition"; -import gdaproles from "/src/data/GDAPRoles.json"; -import { CippFormDomainSelector } from "../../../../components/CippComponents/CippFormDomainSelector"; -import { CippFormUserSelector } from "../../../../components/CippComponents/CippFormUserSelector"; -const Page = () => { - const formControl = useForm({ Mode: "onChange" }); - return ( - <> - - - - - - - - - - - - - - - - - - - - - - - { - if (!option?.value) { - return "Domain is required"; - } - return true; - }, - }} - /> - - - - - - - - - - - - - - { - if (!value) { - return "Start date is required"; - } - return true; - }, - }} - /> - - - { - const startDate = formControl.getValues("startDate"); - if (!value) { - return "End date is required"; - } - if (new Date(value) < new Date(startDate)) { - return "End date must be after start date"; - } - return true; - }, - }} - /> - - - ({ label: role.Name, value: role.ObjectId }))} - formControl={formControl} - required={true} - validators={{ - validate: (options) => { - if (!options?.length) { - return "At least one role is required"; - } - return true; - }, - }} - /> - - - - - - { - if (!option?.value) { - return "Expiration action is required"; - } - return true; - }, - }} - /> - - - - - - - - - ); -}; - -Page.getLayout = (page) => {page}; - -export default Page; +import { Box, Divider } from "@mui/material"; +import { Grid } from "@mui/system"; +import CippFormPage from "../../../../components/CippFormPages/CippFormPage"; +import { Layout as DashboardLayout } from "/src/layouts/index.js"; +import { CippFormTenantSelector } from "../../../../components/CippComponents/CippFormTenantSelector"; +import { useForm } from "react-hook-form"; +import CippFormComponent from "../../../../components/CippComponents/CippFormComponent"; +import { CippFormCondition } from "../../../../components/CippComponents/CippFormCondition"; +import gdaproles from "/src/data/GDAPRoles.json"; +import { CippFormDomainSelector } from "../../../../components/CippComponents/CippFormDomainSelector"; +import { CippFormUserSelector } from "../../../../components/CippComponents/CippFormUserSelector"; +const Page = () => { + const formControl = useForm({ Mode: "onChange" }); + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + { + if (!option?.value) { + return "Domain is required"; + } + return true; + }, + }} + /> + + + + + + + + + + + + + + { + if (!value) { + return "Start date is required"; + } + return true; + }, + }} + /> + + + { + const startDate = formControl.getValues("startDate"); + if (!value) { + return "End date is required"; + } + if (new Date(value) < new Date(startDate)) { + return "End date must be after start date"; + } + return true; + }, + }} + /> + + + ({ label: role.Name, value: role.ObjectId }))} + formControl={formControl} + required={true} + validators={{ + validate: (options) => { + if (!options?.length) { + return "At least one role is required"; + } + return true; + }, + }} + /> + + + + + + { + if (!option?.value) { + return "Expiration action is required"; + } + return true; + }, + }} + /> + + + + + + + + + ); +}; + +Page.getLayout = (page) => {page}; + +export default Page; From 2598bee8291e37ed1fa639ef13eab68fd7311f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Fri, 25 Jul 2025 00:02:56 +0200 Subject: [PATCH 3/3] Add preselected option for tenant selection across multiple forms --- .../contacts-template/deploy.jsx | 1 + .../spamfilter/list-connectionfilter/add.jsx | 1 + .../list-quarantine-policies/add.jsx | 127 +++++++++--------- .../email/spamfilter/list-spamfilter/add.jsx | 1 + .../email/transport/list-connectors/add.jsx | 1 + src/pages/email/transport/list-rules/add.jsx | 1 + src/pages/endpoint/applications/list/add.jsx | 1 + .../autopilot/add-status-page/index.js | 3 +- .../endpoint/autopilot/list-profiles/add.jsx | 1 + .../identity/administration/jit-admin/add.jsx | 1 + .../security/defender/deployment/index.js | 1 + .../safelinks/safelinks-template/add.jsx | 9 +- .../conditional/list-named-locations/add.jsx | 2 + 13 files changed, 79 insertions(+), 71 deletions(-) diff --git a/src/pages/email/administration/contacts-template/deploy.jsx b/src/pages/email/administration/contacts-template/deploy.jsx index 1da26d9a5952..6766b209d6ba 100644 --- a/src/pages/email/administration/contacts-template/deploy.jsx +++ b/src/pages/email/administration/contacts-template/deploy.jsx @@ -31,6 +31,7 @@ const Page = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/email/spamfilter/list-connectionfilter/add.jsx b/src/pages/email/spamfilter/list-connectionfilter/add.jsx index 2fad50d45b26..a0c30550356d 100644 --- a/src/pages/email/spamfilter/list-connectionfilter/add.jsx +++ b/src/pages/email/spamfilter/list-connectionfilter/add.jsx @@ -41,6 +41,7 @@ const AddPolicy = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/email/spamfilter/list-quarantine-policies/add.jsx b/src/pages/email/spamfilter/list-quarantine-policies/add.jsx index bd2e36fc3764..69def81cf558 100644 --- a/src/pages/email/spamfilter/list-quarantine-policies/add.jsx +++ b/src/pages/email/spamfilter/list-quarantine-policies/add.jsx @@ -47,6 +47,7 @@ const AddPolicy = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> @@ -72,73 +73,67 @@ const AddPolicy = () => { */} - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + ); diff --git a/src/pages/email/spamfilter/list-spamfilter/add.jsx b/src/pages/email/spamfilter/list-spamfilter/add.jsx index eaa81a6909ec..b25c936e8ecc 100644 --- a/src/pages/email/spamfilter/list-spamfilter/add.jsx +++ b/src/pages/email/spamfilter/list-spamfilter/add.jsx @@ -41,6 +41,7 @@ const AddPolicy = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/email/transport/list-connectors/add.jsx b/src/pages/email/transport/list-connectors/add.jsx index 233101bf3e09..acd4f0c0a50f 100644 --- a/src/pages/email/transport/list-connectors/add.jsx +++ b/src/pages/email/transport/list-connectors/add.jsx @@ -41,6 +41,7 @@ const AddPolicy = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/email/transport/list-rules/add.jsx b/src/pages/email/transport/list-rules/add.jsx index b72592a724a4..e98931c56eda 100644 --- a/src/pages/email/transport/list-rules/add.jsx +++ b/src/pages/email/transport/list-rules/add.jsx @@ -41,6 +41,7 @@ const AddPolicy = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/endpoint/applications/list/add.jsx b/src/pages/endpoint/applications/list/add.jsx index f52d33491005..1c431696526c 100644 --- a/src/pages/endpoint/applications/list/add.jsx +++ b/src/pages/endpoint/applications/list/add.jsx @@ -118,6 +118,7 @@ const ApplicationDeploymentForm = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/endpoint/autopilot/add-status-page/index.js b/src/pages/endpoint/autopilot/add-status-page/index.js index 4d109115ce94..3057f7e365d8 100644 --- a/src/pages/endpoint/autopilot/add-status-page/index.js +++ b/src/pages/endpoint/autopilot/add-status-page/index.js @@ -1,6 +1,6 @@ import { Divider } from "@mui/material"; import { Grid } from "@mui/system"; -import { useForm} from "react-hook-form"; +import { useForm } 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"; @@ -40,6 +40,7 @@ const Page = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/endpoint/autopilot/list-profiles/add.jsx b/src/pages/endpoint/autopilot/list-profiles/add.jsx index 1d6b4cd68a38..6f86da5c0d63 100644 --- a/src/pages/endpoint/autopilot/list-profiles/add.jsx +++ b/src/pages/endpoint/autopilot/list-profiles/add.jsx @@ -45,6 +45,7 @@ const AutopilotProfileForm = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/identity/administration/jit-admin/add.jsx b/src/pages/identity/administration/jit-admin/add.jsx index 7f16c5c2ba0e..fd3f8e5ddfe0 100644 --- a/src/pages/identity/administration/jit-admin/add.jsx +++ b/src/pages/identity/administration/jit-admin/add.jsx @@ -29,6 +29,7 @@ const Page = () => { type="single" allTenants={false} preselectedEnabled={true} + validators={{ required: "A tenant must be selected" }} /> diff --git a/src/pages/security/defender/deployment/index.js b/src/pages/security/defender/deployment/index.js index d0d81b526bf1..c429c3107e45 100644 --- a/src/pages/security/defender/deployment/index.js +++ b/src/pages/security/defender/deployment/index.js @@ -33,6 +33,7 @@ const DeployDefenderForm = () => { name="selectedTenants" type="multiple" allTenants={true} + preselectedEnabled={true} validators={{ required: "At least one tenant must be selected" }} /> diff --git a/src/pages/security/safelinks/safelinks-template/add.jsx b/src/pages/security/safelinks/safelinks-template/add.jsx index f421d31ecbe0..3e9998b0a63e 100644 --- a/src/pages/security/safelinks/safelinks-template/add.jsx +++ b/src/pages/security/safelinks/safelinks-template/add.jsx @@ -25,25 +25,26 @@ const DeploySafeLinksPolicyTemplate = () => { postUrl="/api/AddSafeLinksPolicyFromTemplate" > - + - + { }; DeploySafeLinksPolicyTemplate.getLayout = (page) => {page}; -export default DeploySafeLinksPolicyTemplate; \ No newline at end of file +export default DeploySafeLinksPolicyTemplate; diff --git a/src/pages/tenant/conditional/list-named-locations/add.jsx b/src/pages/tenant/conditional/list-named-locations/add.jsx index 06180dfdb1ae..906b869ed9d1 100644 --- a/src/pages/tenant/conditional/list-named-locations/add.jsx +++ b/src/pages/tenant/conditional/list-named-locations/add.jsx @@ -38,6 +38,8 @@ const DeployNamedLocationForm = () => { formControl={formControl} name="selectedTenants" type="multiple" + preselectedEnabled={true} + validators={{ required: "At least one tenant must be selected" }} allTenants={true} />