diff --git a/src/components/utilities/CippActionsOffcanvas.jsx b/src/components/utilities/CippActionsOffcanvas.jsx index 6bc9d896d71c..c2cab6d24539 100644 --- a/src/components/utilities/CippActionsOffcanvas.jsx +++ b/src/components/utilities/CippActionsOffcanvas.jsx @@ -40,7 +40,7 @@ export default function CippActionsOffcanvas(props) { (modalMessage, modalUrl, modalType = 'GET', modalBody, modalInput, modalDropdown) => { const handlePostConfirm = () => { const selectedValue = inputRef.current.value - console.log(inputRef) + //console.log(inputRef) let additionalFields = {} if (inputRef.current.nodeName === 'SELECT') { diff --git a/src/components/utilities/CippJsonView.jsx b/src/components/utilities/CippJsonView.jsx index 635da48a9cdf..90b7f9fe1fe2 100644 --- a/src/components/utilities/CippJsonView.jsx +++ b/src/components/utilities/CippJsonView.jsx @@ -1,8 +1,23 @@ -import React from 'react' -import JsonView from '@uiw/react-json-view' +import React, { useState } from 'react' import { useSelector } from 'react-redux' import { useMediaPredicate } from 'react-media-hook' -import translator from 'src/data/translator.json' +import JsonView from '@uiw/react-json-view' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { + CAccordion, + CAccordionBody, + CAccordionHeader, + CAccordionItem, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CFormSwitch, + CRow, +} from '@coreui/react' +import translator from 'src/data/translator.json' // Ensure the path to your translator.json is correct + const githubLightTheme = { '--w-rjv-font-family': 'monospace', '--w-rjv-color': '#6f42c1', @@ -64,10 +79,10 @@ export const githubDarkTheme = { '--w-rjv-type-nan-color': '#859900', '--w-rjv-type-undefined-color': '#79c0ff', } + const matchPattern = (key, patterns) => { return patterns.some((pattern) => { if (pattern.includes('*')) { - // Replace * with regex that matches any character sequence and create a RegExp object const regex = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`, 'i') return regex.test(key) } @@ -75,42 +90,100 @@ const matchPattern = (key, patterns) => { }) } +const removeNullOrEmpty = (obj) => { + if (Array.isArray(obj)) { + const filteredArray = obj.filter((item) => item != null).map(removeNullOrEmpty) + return filteredArray.length > 0 ? filteredArray : null + } else if (typeof obj === 'object' && obj !== null) { + const result = Object.entries(obj).reduce((acc, [key, value]) => { + const processedValue = removeNullOrEmpty(value) + if (processedValue != null) { + acc[key] = processedValue + } + return acc + }, {}) + return Object.keys(result).length > 0 ? result : null + } + return obj +} + const translateAndRemoveKeys = (obj, removePatterns = []) => { + obj = removeNullOrEmpty(obj) if (Array.isArray(obj)) { return obj.map((item) => translateAndRemoveKeys(item, removePatterns)) - } else if (obj !== null && typeof obj === 'object') { + } else if (typeof obj === 'object' && obj !== null) { return Object.entries(obj).reduce((acc, [key, value]) => { - // Check if the key matches any removal pattern if (!matchPattern(key, removePatterns)) { const translatedKey = translator[key.toLowerCase()] || key.replace(/([A-Z])/g, ' $1').replace(/^./, (str) => str.toUpperCase()) - acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) // Recursively process + acc[translatedKey] = translateAndRemoveKeys(value, removePatterns) } return acc }, {}) } return obj } +function renderObjectAsColumns(object, level = 0, maxLevel = 4) { + const content = [] + let nextLevelObject = null + + for (const [key, value] of Object.entries(object)) { + if (level < maxLevel && typeof value === 'object' && value !== null && !Array.isArray(value)) { + nextLevelObject = value // Prepare the next level's object for rendering + continue // Skip to avoid rendering this as a separate card + } + + // Render current level key-value pairs + content.push( + + + {key} + {JSON.stringify(value, null, 2)} + + , + ) + } + + return ( + <> + {content} + {nextLevelObject && renderObjectAsColumns(nextLevelObject, level + 1, maxLevel)} + + ) +} -function CippJsonView({ object, removeKeys = ['*@odata*'] }) { - const currentTheme = useSelector((state) => state.app.currentTheme) - const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain' +function CippJsonView({ + jsonData = { 'No Data Selected': 'No Data Selected' }, + removeKeys = ['*@odata*', 'id', 'guid', 'createdDateTime', '*modified*', 'deletedDateTime'], +}) { + const [showRawJson, setShowRawJson] = useState(false) const theme = - currentTheme === 'impact' || (currentTheme === preferredTheme) === 'impact' - ? githubDarkTheme - : githubLightTheme - const translatedObject = translateAndRemoveKeys(object, removeKeys) - console.log('translatedObject', translatedObject) + useSelector((state) => state.app.currentTheme) === 'dark' ? githubDarkTheme : githubLightTheme + const cleanedJsonData = translateAndRemoveKeys(jsonData, removeKeys) return ( - +
+ + + Settings + + setShowRawJson(!showRawJson)} /> + {showRawJson ? ( + + ) : ( + {renderObjectAsColumns(cleanedJsonData)} + )} + + + +
) } diff --git a/src/components/utilities/CippListOffcanvas.jsx b/src/components/utilities/CippListOffcanvas.jsx index b27c1ed3dbd4..4fbde6931ce3 100644 --- a/src/components/utilities/CippListOffcanvas.jsx +++ b/src/components/utilities/CippListOffcanvas.jsx @@ -39,7 +39,7 @@ CippListOffcanvas.propTypes = { } export function OffcanvasListSection({ title, items }) { - console.log(items) + //console.log(items) const mappedItems = items.map((item, key) => ({ value: item.content, label: item.heading })) return ( <> diff --git a/src/components/utilities/CippOffcanvas.jsx b/src/components/utilities/CippOffcanvas.jsx index d3eaece82e94..eb20726fbfbe 100644 --- a/src/components/utilities/CippOffcanvas.jsx +++ b/src/components/utilities/CippOffcanvas.jsx @@ -23,7 +23,7 @@ export default function CippOffcanvas(props) { color="link" size="lg" onClick={() => { - console.log('refresh') + //console.log('refresh') props.refreshFunction() }} > diff --git a/src/hooks/useNavFavouriteCheck.jsx b/src/hooks/useNavFavouriteCheck.jsx index 90f710405b18..2045b101ea25 100644 --- a/src/hooks/useNavFavouriteCheck.jsx +++ b/src/hooks/useNavFavouriteCheck.jsx @@ -15,7 +15,7 @@ export const useNavFavouriteCheck = (navigation) => { to: '/favorites', icon: , items: favourites.map((item) => { - console.log(item) + //console.log(item) return { name: item.value.name, to: item.value.to, diff --git a/src/hooks/useRouteNavCompare.jsx b/src/hooks/useRouteNavCompare.jsx index aee23a37474d..27fc1f9a3a14 100644 --- a/src/hooks/useRouteNavCompare.jsx +++ b/src/hooks/useRouteNavCompare.jsx @@ -21,7 +21,7 @@ export const useRouteNavCompare = (navigation) => { ) { return true } else { - console.log('Removing route', item) + //console.log('Removing route', item) return false } }) diff --git a/src/views/cipp/UserSettings.jsx b/src/views/cipp/UserSettings.jsx index 21ab0182287c..955101c02921 100644 --- a/src/views/cipp/UserSettings.jsx +++ b/src/views/cipp/UserSettings.jsx @@ -216,14 +216,12 @@ const UserSettings = () => { multi={true} values={_nav .reduce((acc, val) => acc.concat(val.items), []) - .map( - (item) => ( - console.log(item), - { - name: item?.name, - value: { to: item?.to, name: item?.name }, - } - ), + .map((item) => + // console.log(item), + ({ + name: item?.name, + value: { to: item?.to, name: item?.name }, + }), )} allowCreate={false} refreshFunction={() => diff --git a/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx b/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx index 7d4ef791b391..2995fd32bb16 100644 --- a/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx +++ b/src/views/endpoint/applications/ApplicationsAddChocoApp.jsx @@ -87,7 +87,7 @@ const ApplyStandard = () => { {(value) => { let template = foundPackages.data.Results.filter(function (obj) { - console.log(value) + //console.log(value) return obj.packagename === value }) onChange(template[0][set]) diff --git a/src/views/endpoint/applications/ApplicationsAddWinGet.jsx b/src/views/endpoint/applications/ApplicationsAddWinGet.jsx index dda13eecf7c6..525c39d93799 100644 --- a/src/views/endpoint/applications/ApplicationsAddWinGet.jsx +++ b/src/views/endpoint/applications/ApplicationsAddWinGet.jsx @@ -88,10 +88,10 @@ const AddWinGet = () => { {(value) => { let template = foundPackages.data.filter(function (obj) { - console.log(value) + // console.log(value) return obj.packagename === value }) - console.log(template[0]) + //console.log(template[0]) onChange(template[0][set]) }} diff --git a/src/views/endpoint/intune/MEMListAppProtection.jsx b/src/views/endpoint/intune/MEMListAppProtection.jsx index 9f63b4820fde..b3e59de4c9e7 100644 --- a/src/views/endpoint/intune/MEMListAppProtection.jsx +++ b/src/views/endpoint/intune/MEMListAppProtection.jsx @@ -19,7 +19,7 @@ import { cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' const Actions = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) - console.log(row) + //console.log(row) const tenant = useSelector((state) => state.app.currentTenant) return ( <> diff --git a/src/views/tenant/administration/ListGDAPRelationships.jsx b/src/views/tenant/administration/ListGDAPRelationships.jsx index e55def41f1ce..c463797c16c9 100644 --- a/src/views/tenant/administration/ListGDAPRelationships.jsx +++ b/src/views/tenant/administration/ListGDAPRelationships.jsx @@ -128,7 +128,6 @@ const Actions = (row, rowIndex, formatExtraData) => { ) } - const GDAPRelationships = () => { const columns = [ { diff --git a/src/views/tenant/administration/Tenants.jsx b/src/views/tenant/administration/Tenants.jsx index 87ab0a9d12da..f4d14335e6cc 100644 --- a/src/views/tenant/administration/Tenants.jsx +++ b/src/views/tenant/administration/Tenants.jsx @@ -11,9 +11,9 @@ import { CippTenantOffcanvasRow } from 'src/components/utilities/CippTenantOffca const TenantsList = () => { const TenantListSelector = useSelector((state) => state.app.TenantListSelector) const tenant = useSelector((state) => state.app.currentTenant) - console.log('TenantListSelector', TenantListSelector) + //console.log('TenantListSelector', TenantListSelector) const [columnOmits, setOmitVisible] = useState(TenantListSelector) - console.log('columnOmits', columnOmits) + //console.log('columnOmits', columnOmits) const generatePortalColumn = (portal) => ({ name: portal.label, omit: columnOmits,