Skip to content

Commit def6083

Browse files
authored
Merge pull request #2386 from JohnDuprey/dev
Frontend fixes
2 parents 459947e + ba877e4 commit def6083

File tree

8 files changed

+147
-82
lines changed

8 files changed

+147
-82
lines changed

src/App.jsx

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import React, { Suspense } from 'react'
2-
import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom'
2+
import { BrowserRouter, Route, Routes, Navigate, useLocation } from 'react-router-dom'
33
import { PrivateRoute, FullScreenLoading, ErrorBoundary } from 'src/components/utilities'
44
import 'src/scss/style.scss'
5-
import { Helmet } from 'react-helmet-async'
5+
import { Helmet, HelmetProvider } from 'react-helmet-async'
66
import Skeleton from 'react-loading-skeleton'
77
import TimeAgo from 'javascript-time-ago'
88
import en from 'javascript-time-ago/locale/en.json'
99
TimeAgo.addDefaultLocale(en)
1010
import { library } from '@fortawesome/fontawesome-svg-core'
1111
import { fas } from '@fortawesome/free-solid-svg-icons'
1212
import routes from 'src/routes'
13-
import { useAuthCheck } from './components/utilities/CippauthCheck'
1413
import importsMap from './importsMap'
1514

1615
library.add(fas)
@@ -32,59 +31,58 @@ const Logout = React.lazy(() => import('./views/pages/login/Logout'))
3231
const App = () => {
3332
return (
3433
<BrowserRouter>
35-
<Suspense fallback={<FullScreenLoading />}>
36-
<Helmet>
37-
<title>CIPP</title>
38-
</Helmet>
39-
<Routes>
40-
<Route exact path="/LogoutRedirect" name="LogoutRedirect" element={<PageLogOut />} />
41-
<Route exact path="/401" name="Page 401" element={<Page401 />} />
42-
<Route exact path="/403" name="Page 403" element={<Page403 />} />
43-
<Route exact path="/404" name="Page 404" element={<Page404 />} />
44-
<Route exact path="/500" name="Page 500" element={<Page500 />} />
45-
<Route exact path="/login" name="Login" element={<Login />} />
46-
<Route exact path="/logout" name="Logout" element={<Logout />} />
47-
<Route
48-
path="/"
49-
element={
50-
<PrivateRoute>
51-
<DefaultLayout />
52-
</PrivateRoute>
53-
}
54-
>
55-
{routes.map((route, idx) => {
56-
const allowedRoles = route.allowedRoles
57-
const Routecomponent = dynamicImport(route.path)
58-
//console.log('route', route)
59-
//console.log('Routecomponent', Routecomponent)
60-
return (
61-
route.component && (
62-
<Route
63-
key={`route-${idx}`}
64-
path={route.path}
65-
exact={route.exact}
66-
name={route.name}
67-
element={
68-
<PrivateRoute allowedRoles={allowedRoles}>
69-
<Suspense fallback={<Skeleton />}>
70-
<Helmet>
71-
<title>CIPP - {route.name}</title>
72-
</Helmet>
73-
<ErrorBoundary key={route.name}>
74-
<Routecomponent />
75-
</ErrorBoundary>
76-
</Suspense>
77-
</PrivateRoute>
78-
}
79-
/>
34+
<HelmetProvider>
35+
<Suspense fallback={<FullScreenLoading />}>
36+
<Helmet>
37+
<title>CIPP</title>
38+
</Helmet>
39+
<Routes>
40+
<Route exact path="/LogoutRedirect" name="LogoutRedirect" element={<PageLogOut />} />
41+
<Route exact path="/401" name="Page 401" element={<Page401 />} />
42+
<Route exact path="/403" name="Page 403" element={<Page403 />} />
43+
<Route exact path="/404" name="Page 404" element={<Page404 />} />
44+
<Route exact path="/500" name="Page 500" element={<Page500 />} />
45+
<Route exact path="/login" name="Login" element={<Login />} />
46+
<Route exact path="/logout" name="Logout" element={<Logout />} />
47+
<Route
48+
path="/"
49+
element={
50+
<PrivateRoute>
51+
<DefaultLayout />
52+
</PrivateRoute>
53+
}
54+
>
55+
{routes.map((route, idx) => {
56+
const allowedRoles = route.allowedRoles
57+
const Routecomponent = dynamicImport(route.path)
58+
//console.log('route', route)
59+
//console.log('Routecomponent', Routecomponent)
60+
return (
61+
route.component && (
62+
<Route
63+
key={`route-${idx}`}
64+
path={route.path}
65+
exact={route.exact}
66+
name={route.name}
67+
element={
68+
<PrivateRoute allowedRoles={allowedRoles}>
69+
<Suspense fallback={<Skeleton />}>
70+
<ErrorBoundary key={route.name}>
71+
<Routecomponent />
72+
</ErrorBoundary>
73+
</Suspense>
74+
</PrivateRoute>
75+
}
76+
/>
77+
)
8078
)
81-
)
82-
})}
83-
<Route path="/" element={<Navigate to="/home" replace={true} />} />
84-
</Route>
85-
<Route path="*" name="Page 404" element={<Page404 />} />
86-
</Routes>
87-
</Suspense>
79+
})}
80+
<Route path="/" element={<Navigate to="/home" replace={true} />} />
81+
</Route>
82+
<Route path="*" name="Page 404" element={<Page404 />} />
83+
</Routes>
84+
</Suspense>
85+
</HelmetProvider>
8886
</BrowserRouter>
8987
)
9088
}

src/components/contentcards/CippButtonCard.jsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
2-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
32
import { CCard, CCardBody, CCardFooter, CCardHeader, CCardTitle } from '@coreui/react'
43
import Skeleton from 'react-loading-skeleton'
4+
import PropTypes from 'prop-types'
55

66
export default function CippButtonCard({
77
title,
@@ -25,3 +25,11 @@ export default function CippButtonCard({
2525
</CCard>
2626
)
2727
}
28+
29+
CippButtonCard.propTypes = {
30+
title: PropTypes.string.isRequired,
31+
titleType: PropTypes.string,
32+
CardButton: PropTypes.element.isRequired,
33+
children: PropTypes.element.isRequired,
34+
isFetching: PropTypes.bool.isRequired,
35+
}

src/components/utilities/CippCopyToClipboard.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function CippCopyToClipboard({ text }) {
1414
<CopyToClipboard text={text} onCopy={() => onCodeCopied()}>
1515
<CButton
1616
color={codeCopied ? 'success' : 'info'}
17-
className="cipp-code-copy-button"
17+
className="cipp-code-copy-button ms-1"
1818
size="sm"
1919
variant="ghost"
2020
>

src/hooks/useNavFavouriteCheck.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const useNavFavouriteCheck = (navigation) => {
2828
var items = []
2929

3030
recentPages.map((path) => {
31-
const item = routes.find((route) => route.path === path)
31+
const item = routes.find((route) => route.path.toLowerCase() === path.toLowerCase())
3232
if (item?.path) {
3333
items.push({
3434
name: item.name,

src/layout/DefaultLayout.jsx

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { toggleSwitcher } from 'src/store/features/switcher'
88
import { useHotkeys } from 'react-hotkeys-hook'
99
import { useMediaPredicate } from 'react-media-hook'
1010
import { setRecentPages } from 'src/store/features/app'
11+
import routes from 'src/routes'
12+
import { Helmet } from 'react-helmet-async'
1113

1214
const DefaultLayout = () => {
1315
const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain'
@@ -17,6 +19,15 @@ const DefaultLayout = () => {
1719
const dispatch = useDispatch()
1820
const location = useLocation()
1921

22+
const [title, setTitle] = useState('CIPP')
23+
useEffect(() => {
24+
let route = routes.find((route) => route.path.toLowerCase() === location.pathname.toLowerCase())
25+
if (route?.name) {
26+
console.log(route)
27+
setTitle(route.name)
28+
}
29+
}, [setTitle, location.pathname])
30+
2031
let theme
2132
if (themePreference === 'default') {
2233
theme = preferredTheme
@@ -70,24 +81,29 @@ const DefaultLayout = () => {
7081
)
7182

7283
return (
73-
<div>
74-
<FastSwitcherModal />
75-
<ModalRoot />
76-
<Toasts />
84+
<>
85+
<Helmet>
86+
<title>CIPP - {title}</title>
87+
</Helmet>
88+
<div>
89+
<FastSwitcherModal />
90+
<ModalRoot />
91+
<Toasts />
7792

78-
<AppSidebar />
79-
<div className="wrapper d-flex flex-column min-vh-100">
80-
<AppHeader />
81-
<div className="body flex-grow-1 px-xl-3">
82-
<CContainer fluid>
83-
<Suspense fallback={<FullScreenLoading />}>
84-
<Outlet />
85-
</Suspense>
86-
</CContainer>
93+
<AppSidebar />
94+
<div className="wrapper d-flex flex-column min-vh-100">
95+
<AppHeader />
96+
<div className="body flex-grow-1 px-xl-3">
97+
<CContainer fluid>
98+
<Suspense fallback={<FullScreenLoading />}>
99+
<Outlet />
100+
</Suspense>
101+
</CContainer>
102+
</div>
103+
<AppFooter />
87104
</div>
88-
<AppFooter />
89105
</div>
90-
</div>
106+
</>
91107
)
92108
}
93109

src/views/cipp/app-settings/SettingsNotifications.jsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,20 @@ export function SettingsNotifications() {
4444
</CButton>
4545
<CButton
4646
className="me-2"
47-
onClick={() => generateTestAlert({ text: 'Test Alert', Severity: 'Alert' })}
47+
onClick={() =>
48+
generateTestAlert({ text: 'Manually Generated Test Alert', Severity: 'Alert' })
49+
}
4850
disabled={generateAlertResult.isFetching}
4951
>
50-
{generateAlertResult.isFetching && <CSpinner size="sm" className="me-2" />}
51-
{generateAlertResult.isSuccess && <FontAwesomeIcon icon={'check'} className="me-2" />}
52+
{generateAlertResult.isFetching ? (
53+
<CSpinner size="sm" className="me-2" />
54+
) : (
55+
<>
56+
{generateAlertResult.isSuccess && (
57+
<FontAwesomeIcon icon={'check'} className="me-2" />
58+
)}
59+
</>
60+
)}
5261
Generate Test Alert
5362
</CButton>
5463
</>

src/views/email-exchange/tools/MailTest.jsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,22 @@ const MailTest = () => {
4040
},
4141
{
4242
name: 'SPF',
43-
selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'spf')[0].Status == 'pass',
43+
selector: (row) => row?.AuthResult?.find((x) => x?.Name === 'spf')?.Status == 'pass',
4444
cell: cellBooleanFormatter(),
4545
},
4646
{
4747
name: 'DKIM',
48-
selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dkim')[0].Status == 'pass',
48+
selector: (row) => row?.AuthResult?.find((x) => x?.Name === 'dkim')?.Status == 'pass',
4949
cell: cellBooleanFormatter(),
5050
},
5151
{
5252
name: 'DMARC',
53-
selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'dmarc')[0].Status == 'pass',
53+
selector: (row) => row?.AuthResult?.find((x) => x?.Name === 'dmarc')?.Status == 'pass',
5454
cell: cellBooleanFormatter(),
5555
},
5656
{
5757
name: 'Comp Auth',
58-
selector: (row) => row?.AuthResult.filter((x) => x?.Name === 'compauth')[0].Status == 'pass',
58+
selector: (row) => row?.AuthResult?.find((x) => x?.Name === 'compauth')?.Status == 'pass',
5959
cell: cellBooleanFormatter(),
6060
},
6161
{

src/views/tenant/administration/GraphExplorer.jsx

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,38 @@ const GraphExplorer = () => {
7575
}, [])
7676

7777
if (graphrequest.isSuccess) {
78-
if (graphrequest.data?.Results?.length > 0) {
78+
if (
79+
graphrequest.data?.Metadata?.Parameters?.$select !== undefined &&
80+
graphrequest.data?.Metadata?.Parameters?.$select !== '' &&
81+
graphrequest.data?.Metadata?.Parameters?.$select !== null
82+
) {
83+
//set columns
84+
if (graphrequest.data?.Metadata?.TenantFilter === 'AllTenants') {
85+
QueryColumns.data.push({
86+
name: 'Tenant',
87+
selector: (row) => row['Tenant'],
88+
sortable: true,
89+
exportSelector: 'Tenant',
90+
cell: cellGenericFormatter(),
91+
})
92+
QueryColumns.data.push({
93+
name: 'CippStatus',
94+
selector: (row) => row['CippStatus'],
95+
sortable: true,
96+
exportSelector: 'CippStatus',
97+
cell: cellGenericFormatter(),
98+
})
99+
}
100+
graphrequest.data?.Metadata?.Parameters?.$select.split(',')?.map((value) =>
101+
QueryColumns.data.push({
102+
name: value,
103+
selector: (row) => row[`${value.toString()}`],
104+
sortable: true,
105+
exportSelector: value,
106+
cell: cellGenericFormatter(),
107+
}),
108+
)
109+
} else if (graphrequest.data?.Results?.length > 0) {
79110
//set columns
80111
Object.keys(graphrequest.data?.Results[0]).map((value) =>
81112
QueryColumns.data.push({
@@ -121,7 +152,7 @@ const GraphExplorer = () => {
121152
{
122153
name: 'All users with email addresses',
123154
id: '6164e239-0c9a-4a27-9049-6250bf65a3e3',
124-
params: { endpoint: '/users', $select: 'userprincipalname,mail,proxyAddresses', $filter: '' },
155+
params: { endpoint: '/users', $select: 'userPrincipalName,mail,proxyAddresses', $filter: '' },
125156
isBuiltin: true,
126157
},
127158
{
@@ -248,6 +279,9 @@ const GraphExplorer = () => {
248279
if (params?.$select) {
249280
select = params.$select.map((p) => p.value).join(',')
250281
}
282+
if (params?.name) {
283+
params.QueueNameOverride = 'Graph Explorer - ' + params.name
284+
}
251285
execGraphRequest({
252286
path: 'api/ListGraphRequest',
253287
params: {

0 commit comments

Comments
 (0)