diff --git a/generate-placeholders.js b/generate-placeholders.js index 9858fc7f7b7c..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" }, @@ -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" }, @@ -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/package.json b/package.json index eb70d4b08762..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": { @@ -8,7 +8,7 @@ }, "license": "AGPL-3.0", "engines": { - "node": "^18.17.0" + "node": "^20.18.1" }, "repository": { "type": "git", diff --git a/public/assets/integrations/github.png b/public/assets/integrations/github.png new file mode 100644 index 000000000000..e03d8dd8bcf0 Binary files /dev/null and b/public/assets/integrations/github.png differ diff --git a/public/assets/integrations/github_dark.png b/public/assets/integrations/github_dark.png new file mode 100644 index 000000000000..c61ab9d0582e Binary files /dev/null and b/public/assets/integrations/github_dark.png differ 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" } 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"} + /> { } else { Object.keys(dataObject).forEach((key) => { const value = dataObject[key]; - if (typeof value === "string" && value.startsWith("!")) { newData[key] = value.slice(1); } else if (typeof value === "string") { 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/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/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" ? ( { - 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" + /> + )} + + + + )) + ) )} 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 /> + + { + 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 && 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/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/layouts/config.js b/src/layouts/config.js index d9685ba29de4..e8c6d541c9be 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", }, ], }, @@ -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" }, @@ -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" }, @@ -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", }, ], }, @@ -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", + }, ], }, { @@ -399,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" }, @@ -411,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/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 + + )} )} 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 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: ( + + ), + }, ]} /> 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 d32c9f8a2a6b..ac22d6596579 100644 --- a/src/pages/email/administration/contacts/index.js +++ b/src/pages/email/administration/contacts/index.js @@ -1,8 +1,9 @@ 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'; const Page = () => { const pageTitle = "Contacts"; @@ -10,22 +11,23 @@ const Page = () => { const actions = [ { label: "Remove Contact", - type: "POST", + type: "GET", 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"]; @@ -38,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 81726a1abd14..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, @@ -131,6 +132,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 @@ -182,7 +270,11 @@ const Page = () => { filters={filterList} cardButton={ <> - 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", }, ]; 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..95f80532ee5c 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,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 { PlaylistAdd } from "@mui/icons-material"; const Page = () => { const pageTitle = "Tenant Allow/Block Lists"; @@ -12,12 +14,12 @@ const Page = () => { type: "POST", url: "/api/RemoveTenantAllowBlockList", data: { - TenantFilter: "Tenant", Entries: "Value", ListType: "ListType", }, confirmText: "Are you sure you want to delete?", color: "danger", + icon: , }, ]; @@ -48,7 +50,11 @@ const Page = () => { }} cardButton={ <> - 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/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; 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={{ 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/global-address-list/index.js b/src/pages/email/reports/global-address-list/index.js index 5b0be1040072..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,21 +8,25 @@ const Page = () => { label: "Unhide from Global Address List", type: "POST", url: "/api/ExecHideFromGAL", + icon: , data: { HideFromGAL: false, 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", type: "POST", url: "/api/ExecHideFromGAL", + icon: , data: { HideFromGAL: true, ID: "PrimarySmtpAddress", }, confirmText: "Are you sure you want to hide this mailbox from the Global Address List?", + condition: (row) => row.HiddenFromAddressListsEnabled == false, }, ]; 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..11e15a1bdea7 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/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/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 79% rename from src/pages/email/connectionfilter/list-connectionfilter/index.js rename to src/pages/email/spamfilter/list-connectionfilter/index.js index cd6e9482ada8..02481161dc18 100644 --- a/src/pages/email/connectionfilter/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, AddModerator } 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?", }, ]; @@ -32,13 +34,7 @@ const Page = () => { actions: actions, }; - const simpleColumns = [ - "Name", - "IsDefault", - "IPAllowList", - "IPBlockList", - "EnableSafeList", - ]; + const simpleColumns = ["Name", "IsDefault", "IPAllowList", "IPBlockList", "EnableSafeList"]; return ( { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/email/spamfilter/list-spamfilter/index.js b/src/pages/email/spamfilter/list-spamfilter/index.js index 062f9e71dc87..55985f5d7316 100644 --- a/src/pages/email/spamfilter/list-spamfilter/index.js +++ b/src/pages/email/spamfilter/list-spamfilter/index.js @@ -1,15 +1,20 @@ 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"; +import { RocketLaunch } from "@mui/icons-material"; 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 +23,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,13 +95,17 @@ const Page = () => { return ( - diff --git a/src/pages/email/tools/mailbox-restores/index.js b/src/pages/email/tools/mailbox-restores/index.js index ffa463800bd5..1871eb7e130a 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,8 +13,8 @@ const Page = () => { label: "Resume Restore Request", type: "POST", url: "/api/ExecMailboxRestore", + icon: , data: { - TenantFilter: "Tenant", Identity: "Identity", Action: "Resume", }, @@ -24,8 +25,8 @@ const Page = () => { label: "Suspend Restore Request", type: "POST", url: "/api/ExecMailboxRestore", + icon: , data: { - TenantFilter: "Tenant", Identity: "Identity", Action: "Suspend", }, @@ -36,8 +37,8 @@ const Page = () => { label: "Remove Restore Request", type: "POST", url: "/api/ExecMailboxRestore", + icon: , data: { - TenantFilter: "Tenant", Identity: "Identity", Action: "Remove", }, @@ -63,7 +64,11 @@ const Page = () => { simpleColumns={simpleColumns} cardButton={ <> - diff --git a/src/pages/email/connectors/list-connector-templates/index.js b/src/pages/email/transport/list-connector-templates/index.js similarity index 77% rename from src/pages/email/connectors/list-connector-templates/index.js rename to src/pages/email/transport/list-connector-templates/index.js index 671c148f21e2..188e87254ab6 100644 --- a/src/pages/email/connectors/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/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 85% rename from src/pages/email/connectors/list-connectors/index.js rename to src/pages/email/transport/list-connectors/index.js index 58799a4bd6dc..477b191fdff5 100644 --- a/src/pages/email/connectors/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 new file mode 100644 index 000000000000..a381de6b12df --- /dev/null +++ b/src/pages/endpoint/MEM/devices/index.js @@ -0,0 +1,291 @@ +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, + Archive, + AutoMode, + Recycling, +} from "@mui/icons-material"; + +const Page = () => { + const pageTitle = "Devices"; + 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", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "syncDevice", + }, + confirmText: "Are you sure you want to sync this device?", + }, + { + label: "Reboot Device", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "rebootNow", + }, + confirmText: "Are you sure you want to reboot this device?", + }, + { + label: "Locate Device", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "locateDevice", + }, + confirmText: "Are you sure you want to locate this device?", + }, + { + label: "Retrieve LAPs password", + type: "POST", + icon: , + url: "/api/ExecGetLocalAdminPassword", + data: { + GUID: "azureADDeviceId", + }, + confirmText: "Are you sure you want to retrieve the local admin password?", + }, + { + label: "Rotate Local Admin Password", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "RotateLocalAdminPassword", + }, + confirmText: "Are you sure you want to rotate the password for this device?", + }, + { + label: "Retrieve Bitlocker Keys", + type: "POST", + icon: , + url: "/api/ExecGetRecoveryKey", + data: { + GUID: "azureADDeviceId", + }, + confirmText: "Are you sure you want to retrieve the Bitlocker keys?", + }, + { + label: "Windows Defender Full Scan", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "WindowsDefenderScan", + quickScan: false, + }, + confirmText: "Are you sure you want to perform a full scan on this device?", + }, + { + label: "Windows Defender Quick Scan", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "WindowsDefenderScan", + quickScan: true, + }, + confirmText: "Are you sure you want to perform a quick scan on this device?", + }, + { + label: "Update Windows Defender", + type: "POST", + icon: , + url: "/api/ExecDeviceAction", + data: { + GUID: "id", + Action: "windowsDefenderUpdateSignatures", + }, + confirmText: "Are you sure you want to update the Windows Defender signatures for this device?", + }, + { + 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?", + }, + ]; + + const offCanvas = { + extendedInfoFields: ["deviceName", "userPrincipalName"], + actions: actions, + }; + + return ( + + ); +}; + +Page.getLayout = (page) => {page}; + +export default Page; diff --git a/src/pages/endpoint/applications/list/index.js b/src/pages/endpoint/applications/list/index.js index 5a3d8eef0cfb..cfde01fbfce0 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"; @@ -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?", @@ -95,7 +91,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/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-devices/index.js b/src/pages/endpoint/autopilot/list-devices/index.js index b738be0ba6af..038e5b9d8d2a 100644 --- a/src/pages/endpoint/autopilot/list-devices/index.js +++ b/src/pages/endpoint/autopilot/list-devices/index.js @@ -1,14 +1,20 @@ 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, 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 = [ { label: "Assign device", + icon: , type: "POST", url: "/api/ExecAssignAPDevice", data: { @@ -38,6 +44,7 @@ const Page = () => { }, { label: "Delete Device", + icon: , type: "POST", url: "/api/RemoveAPDevice", data: { ID: "id" }, @@ -67,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/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..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/endpoint/reports/devices/index.js b/src/pages/endpoint/reports/devices/index.js deleted file mode 100644 index 4ce9ebcbc46a..000000000000 --- a/src/pages/endpoint/reports/devices/index.js +++ /dev/null @@ -1,143 +0,0 @@ -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"; - -const Page = () => { - const pageTitle = "Devices"; - const tenantFilter = useSettings().currentTenant; - - const actions = [ - { - label: "Sync Device", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "syncDevice", - }, - confirmText: "Are you sure you want to sync this device?", - }, - { - label: "Reboot Device", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "rebootNow", - }, - confirmText: "Are you sure you want to reboot this device?", - }, - { - label: "Locate Device", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "locateDevice", - }, - confirmText: "Are you sure you want to locate this device?", - }, - { - label: "Retrieve LAPs password", - type: "POST", - url: "/api/ExecGetLocalAdminPassword", - data: { - GUID: "azureADDeviceId", - }, - confirmText: "Are you sure you want to retrieve the local admin password?", - }, - { - label: "Rotate Local Admin Password", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "RotateLocalAdminPassword", - }, - confirmText: "Are you sure you want to rotate the password for this device?", - }, - { - label: "Retrieve Bitlocker Keys", - type: "POST", - url: "/api/ExecGetRecoveryKey", - data: { - GUID: "azureADDeviceId", - }, - confirmText: "Are you sure you want to retrieve the Bitlocker keys?", - }, - { - label: "Windows Defender Full Scan", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "WindowsDefenderScan", - quickScan: false, - }, - confirmText: "Are you sure you want to perform a full scan on this device?", - }, - { - label: "Windows Defender Quick Scan", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "WindowsDefenderScan", - quickScan: true, - }, - confirmText: "Are you sure you want to perform a quick scan on this device?", - }, - { - label: "Update Windows Defender", - type: "POST", - url: "/api/ExecDeviceAction", - data: { - GUID: "id", - Action: "windowsDefenderUpdateSignatures", - }, - 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, - }, - ]; - - const offCanvas = { - extendedInfoFields: ["deviceName", "userPrincipalName"], - actions: actions, - }; - - return ( - - ); -}; - -Page.getLayout = (page) => {page}; - -export default Page; 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, }, 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/add.jsx b/src/pages/identity/administration/group-templates/add.jsx index 808fa0b81985..fe5b597fe926 100644 --- a/src/pages/identity/administration/group-templates/add.jsx +++ b/src/pages/identity/administration/group-templates/add.jsx @@ -17,6 +17,7 @@ const Page = () => { return ( <> { 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..7915d4656404 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", }, { @@ -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", }, @@ -49,9 +47,8 @@ const Page = () => { label: "Only allow messages from people inside the organisation", type: "GET", url: "/api/ExecGroupsDeliveryManagement", - icon: , + icon: , data: { - TenantFilter: "TenantFilter", ID: "mail", GroupType: "calculatedGroupType", OnlyAllowInternal: true, @@ -63,10 +60,9 @@ const Page = () => { { label: "Allow messages from people inside and outside the organisation", type: "GET", - icon: , + icon: , url: "/api/ExecGroupsDeliveryManagement", data: { - TenantFilter: "TenantFilter", ID: "mail", GroupType: "calculatedGroupType", }, @@ -106,7 +102,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 c03a62bb56cd..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"; @@ -9,6 +10,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) @@ -35,15 +54,15 @@ const Page = () => { apiUrl="/api/ListGraphRequest" cardButton={ <> - + - - } apiData={{ @@ -67,24 +86,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} /> ); }; diff --git a/src/pages/identity/administration/users/user/bec.jsx b/src/pages/identity/administration/users/user/bec.jsx index 88619b41fc13..74c8364c4ddb 100644 --- a/src/pages/identity/administration/users/user/bec.jsx +++ b/src/pages/identity/administration/users/user/bec.jsx @@ -5,7 +5,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 { CheckCircle, Download, Mail } from "@mui/icons-material"; +import { CheckCircle, Download, Mail, Fingerprint } from "@mui/icons-material"; import { HeaderedTabbedLayout } from "../../../../../layouts/HeaderedTabbedLayout"; import tabOptions from "./tabOptions"; import ReactTimeAgo from "react-time-ago"; @@ -142,34 +142,32 @@ const Page = () => { 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: ), }, 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} /> ); diff --git a/src/pages/identity/reports/mfa-report/index.js b/src/pages/identity/reports/mfa-report/index.js index fd18f1bdef0c..206e8337e2ef 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 = [ + { + 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, + creatable: false, + }, + ], + confirmText: "Are you sure you want to set per-user MFA for these users?", + multiPost: false, + }, + ]; - return ; + return ( + + ); }; Page.getLayout = (page) => {page}; 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", 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)}`} /> 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..00748c78552c 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,9 +10,9 @@ const Page = () => { { label: "Set status to in progress", type: "POST", + icon: , url: "/api/ExecSetSecurityAlert", data: { - TenantFilter: "Tenant", GUID: "id", Status: "inProgress", Vendor: "vendorInformation.vendor", @@ -22,9 +23,9 @@ const Page = () => { { label: "Set status to resolved", type: "POST", + icon: , 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..ec9860e7e96f 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,9 +10,9 @@ const Page = () => { { label: "Assign to self", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Assigned: "currentUserId", }, @@ -20,9 +21,9 @@ const Page = () => { { label: "Set status to active", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Status: "active", Assigned: "currentAssignedUser", @@ -32,9 +33,9 @@ const Page = () => { { label: "Set status to in progress", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Status: "inProgress", Assigned: "currentAssignedUser", @@ -44,9 +45,9 @@ const Page = () => { { label: "Set status to resolved", type: "POST", + icon: , url: "/api/ExecSetSecurityIncident", data: { - TenantFilter: "Tenant", GUID: "id", Status: "resolved", Assigned: "currentAssignedUser", 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 ( { @@ -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 db874b1091da..fb3580cc2622 100644 --- a/src/pages/teams-share/teams/list-team/index.js +++ b/src/pages/teams-share/teams/list-team/index.js @@ -1,7 +1,9 @@ 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"; const Page = () => { const pageTitle = "Teams"; @@ -12,6 +14,7 @@ const Page = () => { link: "/identity/administration/groups/edit?groupId=[id]", multiPost: false, color: "warning", + icon: , }, ]; @@ -23,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 877d38a6411b..834efd07eb32 100644 --- a/src/pages/tenant/conditional/list-named-locations/index.js +++ b/src/pages/tenant/conditional/list-named-locations/index.js @@ -2,6 +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 { MinusIcon, PlusIcon } from "@heroicons/react/24/outline"; +import { LocationOn } from "@mui/icons-material"; const Page = () => { const pageTitle = "Named Locations"; @@ -11,51 +13,58 @@ const Page = () => { label: "Add location to named location", type: "GET", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "addLocation", }, 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", type: "POST", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "removeLocation", }, 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", type: "POST", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", change: "addIp", }, 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", type: "POST", url: "/api/ExecNamedLocation", + icon: , data: { namedLocationId: "id", 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, }; @@ -67,7 +76,7 @@ const Page = () => { offCanvas={offCanvas} cardButton={ <> - @@ -75,7 +84,7 @@ const Page = () => { simpleColumns={[ "displayName", "includeUnknownCountriesAndRegions", - "type", + "isTrusted", "rangeOrLocation", "modifiedDateTime", ]} 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/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 94% rename from src/pages/tenant/administration/list-csp-licenses/index.jsx rename to src/pages/tenant/reports/list-csp-licenses/index.jsx index 611d4f5d9b10..9e6264df4c74 100644 --- a/src/pages/tenant/administration/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/administration/list-licenses/index.js b/src/pages/tenant/reports/list-licenses/index.js similarity index 58% rename from src/pages/tenant/administration/list-licenses/index.js rename to src/pages/tenant/reports/list-licenses/index.js index 1a4abfc73707..417e1ef16910 100644 --- a/src/pages/tenant/administration/list-licenses/index.js +++ b/src/pages/tenant/reports/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}; 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 218e8a8633b4..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={ - } 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 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; };