From 2aa112c77dd0d4d90b4f1c75520c67f4e5e3b338 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:09:02 +0200 Subject: [PATCH 01/13] fixes new bpa sync --- src/components/CippComponents/BPASyncDialog.jsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/components/CippComponents/BPASyncDialog.jsx b/src/components/CippComponents/BPASyncDialog.jsx index cba62df8e67c..10ae3cecd724 100644 --- a/src/components/CippComponents/BPASyncDialog.jsx +++ b/src/components/CippComponents/BPASyncDialog.jsx @@ -27,22 +27,16 @@ export const BPASyncDialog = ({ createDialog }) => { // Use methods for form handling and control const { handleSubmit, control } = methods; - const [tenantId, setTenantId] = useState(""); const [isSyncing, setIsSyncing] = useState(false); - - // Use ApiGetCall instead of useApiCall const bpaSyncResults = ApiPostCall({ urlfromdata: true, }); const handleForm = (values) => { - setTenantId(values.tenantFilter || ""); - setIsSyncing(true); - bpaSyncResults.mutate({ url: "/api/ExecBPA", - queryKey: `bpa-sync-${tenantId}`, - data: tenantId ? { TenantFilter: tenantId } : {}, + queryKey: `bpa-sync-${values.tenantFilter}`, + data: values.tenantFilter ? { TenantFilter: values.tenantFilter } : {}, }); }; From 47e539194b7c564e4d21ba63d96eeceed0298d8f Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 12:29:44 -0400 Subject: [PATCH 02/13] csv fix prettify licenses in table and allow for multi select sorting --- src/components/csvExportButton.js | 37 ++++++++++----- src/utils/get-cipp-filter-variant.js | 8 ++++ src/utils/get-cipp-formatting.js | 56 +++++++++++++++++------ src/utils/get-cipp-license-translation.js | 11 +++-- 4 files changed, 83 insertions(+), 29 deletions(-) diff --git a/src/components/csvExportButton.js b/src/components/csvExportButton.js index 5e7424dad1c8..1d1dedddbb28 100644 --- a/src/components/csvExportButton.js +++ b/src/components/csvExportButton.js @@ -14,19 +14,28 @@ const flattenObject = (obj, parentKey = "") => { const fullKey = parentKey ? `${parentKey}.${key}` : key; if (typeof obj[key] === "object" && obj[key] !== null && !Array.isArray(obj[key])) { Object.assign(flattened, flattenObject(obj[key], fullKey)); + } else if (Array.isArray(obj[key]) && typeof obj[key][0] === "string") { + flattened[fullKey] = obj[key]; } else if (Array.isArray(obj[key])) { - // Handle arrays of objects by applying the formatter on each property - flattened[fullKey] = obj[key] - .map((item) => - typeof item === "object" - ? JSON.stringify( - Object.fromEntries( - Object.entries(flattenObject(item)).map(([k, v]) => [k, getCippFormatting(v, k, "text", false)]) + let testFormatting = getCippFormatting(obj[key], key, "text", false, false); + if (typeof testFormatting === "string" && !testFormatting.includes("[object Object]")) { + flattened[fullKey] = testFormatting; + } else { + flattened[fullKey] = obj[key] + .map((item) => + typeof item === "object" + ? JSON.stringify( + Object.fromEntries( + Object.entries(flattenObject(item)).map(([k, v]) => [ + k, + getCippFormatting(v, k, "text", false), + ]) + ) ) - ) - : getCippFormatting(item, fullKey, "text", false) - ) - .join(", "); + : getCippFormatting(item, fullKey, "text", false, false) + ) + .join(", "); + } } else { flattened[fullKey] = obj[key]; } @@ -57,6 +66,12 @@ export const CSVExportButton = (props) => { const formattedRow = {}; columnKeys.forEach((key) => { const value = row[key]; + // check for string and do not format + if (typeof value === "string") { + formattedRow[key] = value; + return; + } + // Pass flattened data to the formatter for CSV export formattedRow[key] = getCippFormatting(value, key, "text", false); }); diff --git a/src/utils/get-cipp-filter-variant.js b/src/utils/get-cipp-filter-variant.js index cbd5ac15f227..375b470e7bf3 100644 --- a/src/utils/get-cipp-filter-variant.js +++ b/src/utils/get-cipp-filter-variant.js @@ -32,6 +32,14 @@ export const getCippFilterVariant = (providedColumnKeys) => { case "assignedLicenses": return { filterVariant: "multi-select", + sortingFn: "alphanumeric", + filterFn: "arrIncludesSome", + }; + case "Tenant": + return { + filterVariant: "multi-select", + sortingFn: "alphanumeric", + filterFn: "arrIncludesSome", }; case "accountEnabled": return { diff --git a/src/utils/get-cipp-formatting.js b/src/utils/get-cipp-formatting.js index 019407339e10..12292a9395ef 100644 --- a/src/utils/get-cipp-formatting.js +++ b/src/utils/get-cipp-formatting.js @@ -32,7 +32,7 @@ import { getCippTranslation } from "./get-cipp-translation"; import DOMPurify from "dompurify"; import { getSignInErrorCodeTranslation } from "./get-cipp-signin-errorcode-translation"; -export const getCippFormatting = (data, cellName, type, canReceive) => { +export const getCippFormatting = (data, cellName, type, canReceive, flatten = true) => { const isText = type === "text"; const cellNameLower = cellName.toLowerCase(); // if data is a data object, return a fFormatted date @@ -266,19 +266,30 @@ export const getCippFormatting = (data, cellName, type, canReceive) => { if (cellName === "excludedTenants") { // Handle null or undefined data if (data === null || data === undefined) { - return isText ? "No data" : ; + return isText ? ( + "No data" + ) : ( + + + + ); } //check if data is an array. if (Array.isArray(data)) { return isText - ? data.map(item => (typeof item === 'object' && item?.label) ? item.label : item).join(", ") - : data.map((item) => ( - item && - )); + ? data + .map((item) => (typeof item === "object" && item?.label ? item.label : item)) + .join(", ") + : data.map( + (item) => + item && ( + + ) + ); } } if (cellName === "bulkUser") { @@ -331,7 +342,7 @@ export const getCippFormatting = (data, cellName, type, canReceive) => { ); } - if (cellName === 'AccessRights') { + if (cellName === "AccessRights") { // Handle data as an array or string const accessRights = Array.isArray(data) ? data.flatMap((item) => (typeof item === "string" ? item.split(", ") : [])) @@ -380,6 +391,9 @@ export const getCippFormatting = (data, cellName, type, canReceive) => { // Handle proxyAddresses if (cellName === "proxyAddresses") { + if (!Array.isArray(data)) { + data = [data]; + } const emails = data.map((email) => email.replace(/smtp:/i, "")); return isText ? emails.join(", ") @@ -388,7 +402,21 @@ export const getCippFormatting = (data, cellName, type, canReceive) => { // Handle assigned licenses if (cellName === "assignedLicenses") { - return isText ? getCippLicenseTranslation(data) : getCippLicenseTranslation(data); + var translatedLicenses = getCippLicenseTranslation(data); + return isText + ? Array.isArray(translatedLicenses) + ? translatedLicenses.join(", ") + : translatedLicenses + : translatedLicenses.map((license) => ( + + )); + } + + if (cellName === "unifiedRoles") { + if (Array.isArray(data)) { + const roles = data.map((role) => getCippRoleTranslation(role.roleDefinitionId)); + return isText ? roles.join(", ") : roles; + } } // Handle roleDefinitionId @@ -540,7 +568,7 @@ export const getCippFormatting = (data, cellName, type, canReceive) => { } // Handle arrays of strings - if (Array.isArray(data) && data.every((item) => typeof item === "string")) { + if (Array.isArray(data) && data.every((item) => typeof item === "string") && flatten) { // if string matches json format, parse it if (data.every((item) => item.startsWith("{") || item.startsWith("["))) { return isText ? ( @@ -560,7 +588,7 @@ export const getCippFormatting = (data, cellName, type, canReceive) => { } // Handle objects - if (typeof data === "object" && data !== null) { + if (typeof data === "object" && data !== null && flatten) { return isText ? ( JSON.stringify(data) ) : ( diff --git a/src/utils/get-cipp-license-translation.js b/src/utils/get-cipp-license-translation.js index e77574c713a9..9303303a9a27 100644 --- a/src/utils/get-cipp-license-translation.js +++ b/src/utils/get-cipp-license-translation.js @@ -3,6 +3,10 @@ import M365Licenses from "../data/M365Licenses.json"; export const getCippLicenseTranslation = (licenseArray) => { let licenses = []; + if (!Array.isArray(licenseArray) && typeof licenseArray === "object") { + licenseArray = [licenseArray]; + } + licenseArray?.forEach((licenseAssignment) => { let found = false; for (let x = 0; x < M365Licenses.length; x++) { @@ -21,9 +25,8 @@ export const getCippLicenseTranslation = (licenseArray) => { } }); - const result = licenses.join(", "); - if (!result) { - return "No Licenses Assigned"; + if (!licenses || licenses.length === 0) { + return ["No Licenses Assigned"]; } - return result; + return licenses; }; From f6a4303f165bfa53bbe3d4f9d5b3483dac656f2a Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 12:29:59 -0400 Subject: [PATCH 03/13] add null safety to standard report action --- src/pages/tenant/standards/compare/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/tenant/standards/compare/index.js b/src/pages/tenant/standards/compare/index.js index 59f092bd81ab..144b96900376 100644 --- a/src/pages/tenant/standards/compare/index.js +++ b/src/pages/tenant/standards/compare/index.js @@ -175,9 +175,9 @@ const Page = () => { // Check if reporting is enabled for this standard by checking the action property // The standard should be reportable if there's an action with value === 'Report' - const actions = standardConfig.action || []; + const actions = standardConfig?.action ?? []; const reportingEnabled = - actions.filter((action) => action.value === "Report").length > 0; + actions.filter((action) => action?.value === "Report").length > 0; // Find the tenant's value for this standard const currentTenantStandard = currentTenantData.find( From f57111902656ec2581734230de7790c3a2c17daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Mon, 14 Apr 2025 21:03:44 +0200 Subject: [PATCH 04/13] update icons and fix casing --- .../CippComponents/CippExchangeActions.jsx | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/components/CippComponents/CippExchangeActions.jsx b/src/components/CippComponents/CippExchangeActions.jsx index 0cce26aec516..79ad7ee2e619 100644 --- a/src/components/CippComponents/CippExchangeActions.jsx +++ b/src/components/CippComponents/CippExchangeActions.jsx @@ -1,9 +1,4 @@ -import { - EyeIcon, - TrashIcon, - MagnifyingGlassIcon, - PlayCircleIcon, -} from "@heroicons/react/24/outline"; +import { TrashIcon, MagnifyingGlassIcon, PlayCircleIcon } from "@heroicons/react/24/outline"; import { Archive, MailOutline, @@ -14,8 +9,11 @@ import { PhonelinkLock, Key, PostAdd, - Add, Gavel, + Language, + Outbox, + NotificationImportant, + DataUsage, } from "@mui/icons-material"; export const CippExchangeActions = () => { @@ -190,12 +188,12 @@ export const CippExchangeActions = () => { ], }, { - label: "Set mailbox locale", + label: "Set Mailbox Locale", type: "POST", url: "/api/ExecSetMailboxLocale", data: { user: "UPN", ProhibitSendQuota: true }, confirmText: "Enter a locale, e.g. en-US", - icon: , + icon: , fields: [ { label: "Locale", @@ -211,7 +209,7 @@ export const CippExchangeActions = () => { url: "/api/ExecSetMailboxQuota", data: { user: "UPN", ProhibitSendQuota: true }, confirmText: "Enter a quota. e.g. 1000MB, 10GB,1TB", - icon: , + icon: , fields: [ { label: "Quota", @@ -230,7 +228,7 @@ export const CippExchangeActions = () => { ProhibitSendReceiveQuota: true, }, confirmText: "Enter a quota. e.g. 1000MB, 10GB,1TB", - icon: , + icon: , fields: [ { label: "Quota", @@ -246,7 +244,7 @@ export const CippExchangeActions = () => { url: "/api/ExecSetMailboxQuota", data: { user: "UPN", IssueWarningQuota: true }, confirmText: "Enter a quota. e.g. 1000MB, 10GB,1TB", - icon: , + icon: , fields: [ { label: "Quota", From 1cc846db7d3b012da1b460b53a6d05cf701938d1 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 17:25:12 -0400 Subject: [PATCH 05/13] tidy console logging --- src/components/CippCards/CippInfoBar.jsx | 1 - src/components/CippComponents/CippAppPermissionBuilder.jsx | 2 +- src/components/CippTable/CippGraphExplorerFilter.js | 2 +- src/pages/cipp/custom-data/schema-extensions/add.js | 2 +- src/pages/tenant/administration/add-subscription/index.jsx | 1 - src/pages/tenant/administration/alert-configuration/alert.jsx | 2 +- src/pages/tenant/gdap-management/roles/add.js | 1 - src/pages/tenant/standards/compare/index.js | 2 +- 8 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/components/CippCards/CippInfoBar.jsx b/src/components/CippCards/CippInfoBar.jsx index bcdf4930475f..28ca740199f7 100644 --- a/src/components/CippCards/CippInfoBar.jsx +++ b/src/components/CippCards/CippInfoBar.jsx @@ -63,7 +63,6 @@ export const CippInfoBar = ({ data, isFetching }) => { {item.offcanvas && ( <> - {console.log("item.offcanvas", item.offcanvas)} { savePresetApi.mutate({ url: "/api/ExecGraphExplorerPreset", diff --git a/src/pages/cipp/custom-data/schema-extensions/add.js b/src/pages/cipp/custom-data/schema-extensions/add.js index 208e332c3773..605d50ed4f15 100644 --- a/src/pages/cipp/custom-data/schema-extensions/add.js +++ b/src/pages/cipp/custom-data/schema-extensions/add.js @@ -48,7 +48,7 @@ const Page = () => { }); const handleAddSchema = (data) => { - console.log(data); + //console.log(data); if (!data.properties || data.properties.length === 0) { formControl.setError("properties", { type: "manual", diff --git a/src/pages/tenant/administration/add-subscription/index.jsx b/src/pages/tenant/administration/add-subscription/index.jsx index 43e3e07b61ff..e46a5a2fb5ac 100644 --- a/src/pages/tenant/administration/add-subscription/index.jsx +++ b/src/pages/tenant/administration/add-subscription/index.jsx @@ -103,7 +103,6 @@ const Page = () => { {selectedSku?.value && ( - {console.log(selectedSku)} { if (alert?.LogType === "Scripted") { setAlertType("script"); - console.log(alert); + //console.log(alert); // Create formatted excluded tenants array if it exists const excludedTenantsFormatted = Array.isArray(alert.excludedTenants) diff --git a/src/pages/tenant/gdap-management/roles/add.js b/src/pages/tenant/gdap-management/roles/add.js index c6cbf12598ec..50fb24b47137 100644 --- a/src/pages/tenant/gdap-management/roles/add.js +++ b/src/pages/tenant/gdap-management/roles/add.js @@ -188,7 +188,6 @@ const Page = () => { The following groups will be created in your partner tenant if they do not already exist: - {console.log(selectedGdapRoles)} ({ label: `M365 GDAP ${role.label}${customSuffix ? ` - ${customSuffix}` : ""}`, diff --git a/src/pages/tenant/standards/compare/index.js b/src/pages/tenant/standards/compare/index.js index 144b96900376..7f65d1eb1e48 100644 --- a/src/pages/tenant/standards/compare/index.js +++ b/src/pages/tenant/standards/compare/index.js @@ -171,7 +171,7 @@ const Page = () => { const standardId = `standards.${standardKey}`; const standardInfo = standards.find((s) => s.name === standardId); const standardSettings = standardConfig.standards?.[standardKey] || {}; - console.log(standardInfo); + //console.log(standardInfo); // Check if reporting is enabled for this standard by checking the action property // The standard should be reportable if there's an action with value === 'Report' From 909b6b4538d4f22b2d948285f261444c421b6740 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 17:27:36 -0400 Subject: [PATCH 06/13] null safety --- src/pages/tenant/standards/compare/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/tenant/standards/compare/index.js b/src/pages/tenant/standards/compare/index.js index 7f65d1eb1e48..d5710a31dcfa 100644 --- a/src/pages/tenant/standards/compare/index.js +++ b/src/pages/tenant/standards/compare/index.js @@ -221,7 +221,7 @@ const Page = () => { // Use the direct standard value from the tenant object if it exists allStandards.push({ standardId, - standardName: standardInfo.label || standardKey, + standardName: standardInf?.label || standardKey, currentTenantValue: directStandardValue !== undefined ? directStandardValue @@ -726,7 +726,7 @@ const Page = () => { {typeof value === "object" && value !== null - ? value.label || JSON.stringify(value) + ? value?.label || JSON.stringify(value) : value === true ? "Enabled" : value === false @@ -902,7 +902,7 @@ const Page = () => { {standard.complianceStatus === "Compliant" && value === true ? "Compliant" : typeof value === "object" && value !== null - ? value.label || JSON.stringify(value) + ? value?.label || JSON.stringify(value) : value === true ? "Enabled" : value === false From db8d7aefda0c747e9f2ccda36442066c9e541522 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 17:29:50 -0400 Subject: [PATCH 07/13] typo --- src/pages/tenant/standards/compare/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/tenant/standards/compare/index.js b/src/pages/tenant/standards/compare/index.js index d5710a31dcfa..504fd330f526 100644 --- a/src/pages/tenant/standards/compare/index.js +++ b/src/pages/tenant/standards/compare/index.js @@ -221,7 +221,7 @@ const Page = () => { // Use the direct standard value from the tenant object if it exists allStandards.push({ standardId, - standardName: standardInf?.label || standardKey, + standardName: standardInfo?.label || standardKey, currentTenantValue: directStandardValue !== undefined ? directStandardValue From 853c50b74007ce2cc2d8745e39693e21e25e6aee Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 17:43:00 -0400 Subject: [PATCH 08/13] handle no clients set up in azure --- src/components/CippIntegrations/CippApiClientManagement.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CippIntegrations/CippApiClientManagement.jsx b/src/components/CippIntegrations/CippApiClientManagement.jsx index 71b60116dd50..9eadb67a9c7b 100644 --- a/src/components/CippIntegrations/CippApiClientManagement.jsx +++ b/src/components/CippIntegrations/CippApiClientManagement.jsx @@ -259,7 +259,7 @@ const CippApiClientManagement = () => { apiClients.data?.pages?.[0]?.Results?.filter((c) => c.Enabled) .map((c) => c.ClientId) .sort(), - azureConfig.data?.Results?.ClientIDs?.sort() + (azureConfig.data?.Results?.ClientIDs || []).sort() ) && ( From 20d413f8d98bd4bf4faeb745346cf29803d3c36b Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 17:44:08 -0400 Subject: [PATCH 09/13] Update CippApiClientManagement.jsx --- src/components/CippIntegrations/CippApiClientManagement.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CippIntegrations/CippApiClientManagement.jsx b/src/components/CippIntegrations/CippApiClientManagement.jsx index 9eadb67a9c7b..5e7db0b495d5 100644 --- a/src/components/CippIntegrations/CippApiClientManagement.jsx +++ b/src/components/CippIntegrations/CippApiClientManagement.jsx @@ -253,7 +253,7 @@ const CippApiClientManagement = () => { showDivider={false} isFetching={azureConfig.isFetching} /> - {azureConfig.isSuccess && azureConfig.data?.Results?.ClientIDs && ( + {azureConfig.isSuccess && ( <> {!isEqual( apiClients.data?.pages?.[0]?.Results?.filter((c) => c.Enabled) From 60e6d908d462ca5f371fbf2355c7a3b881ebf670 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 14 Apr 2025 18:43:52 -0400 Subject: [PATCH 10/13] update icon --- src/pages/tenant/standards/list-standards/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/tenant/standards/list-standards/index.js b/src/pages/tenant/standards/list-standards/index.js index 132ac07cbb7e..236eefb61925 100644 --- a/src/pages/tenant/standards/list-standards/index.js +++ b/src/pages/tenant/standards/list-standards/index.js @@ -6,6 +6,7 @@ import { CopyAll, Delete, PlayArrow, AddBox, Edit, GitHub } from "@mui/icons-mat import { ApiGetCall, ApiPostCall } from "../../../../api/ApiCall"; import { Grid } from "@mui/system"; import { CippApiResults } from "../../../../components/CippComponents/CippApiResults"; +import { EyeIcon } from "@heroicons/react/24/outline"; const Page = () => { const oldStandards = ApiGetCall({ url: "/api/ListStandards", queryKey: "ListStandards-legacy" }); @@ -20,7 +21,7 @@ const Page = () => { { label: "View Tenant Report", link: "/tenant/standards/compare?templateId=[GUID]", - icon: , + icon: , color: "info", target: "_self", }, From 1ef7097973ee4f08e72b1bba51e9122f178665e5 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 15 Apr 2025 01:06:15 -0400 Subject: [PATCH 11/13] Fix category grouping --- src/pages/tenant/standards/compare/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/tenant/standards/compare/index.js b/src/pages/tenant/standards/compare/index.js index 504fd330f526..b26632b4befd 100644 --- a/src/pages/tenant/standards/compare/index.js +++ b/src/pages/tenant/standards/compare/index.js @@ -265,7 +265,7 @@ const Page = () => { comparisonData.forEach((standard) => { // Find the standard info in the standards.json data - const standardInfo = standards.find((s) => s.name === standard.standardId); + const standardInfo = standards.find((s) => standard.standardId.includes(s.name)); // Use the category from standards.json, or default to "Other Standards" const category = standardInfo?.cat || "Other Standards"; From 48bba397860b9071c985034bbb27b930c8e01d5c Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 15 Apr 2025 10:36:42 -0400 Subject: [PATCH 12/13] trigger quarantine message viewer update after data change --- src/pages/email/administration/quarantine/index.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pages/email/administration/quarantine/index.js b/src/pages/email/administration/quarantine/index.js index fc0323c4f77e..e8eb9cf6603c 100644 --- a/src/pages/email/administration/quarantine/index.js +++ b/src/pages/email/administration/quarantine/index.js @@ -39,6 +39,7 @@ const Page = () => { const [traceDetails, setTraceDetails] = useState([]); const [traceMessageId, setTraceMessageId] = useState(null); const [messageSubject, setMessageSubject] = useState(null); + const [messageContentsWaiting, setMessageContentsWaiting] = useState(false); const getMessageContents = ApiGetCall({ url: "/api/ListMailQuarantineMessage", @@ -46,7 +47,7 @@ const Page = () => { tenantFilter: tenantFilter, Identity: messageId, }, - waiting: false, + waiting: messageContentsWaiting, queryKey: `ListMailQuarantineMessage-${messageId}`, }); @@ -61,7 +62,9 @@ const Page = () => { const viewMessage = (row) => { const id = row.Identity; setMessageId(id); - getMessageContents.waiting = true; + if (!messageContentsWaiting) { + setMessageContentsWaiting(true); + } getMessageContents.refetch(); setDialogOpen(true); }; @@ -85,7 +88,7 @@ const Page = () => { } else { setDialogContent(); } - }, [getMessageContents.isSuccess]); + }, [getMessageContents.isSuccess, getMessageContents.data]); const actions = [ { From 7ec97126fd8cbe7ed233b1f91d22aa1f44dfcc76 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 15 Apr 2025 10:39:03 -0400 Subject: [PATCH 13/13] up version --- public/version.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/version.json b/public/version.json index a687242f92c7..a85ab8e9a599 100644 --- a/public/version.json +++ b/public/version.json @@ -1,3 +1,3 @@ { - "version": "7.5.0" -} + "version": "7.5.1" +} \ No newline at end of file