Skip to content

Commit 4d1f7a9

Browse files
authored
Merge pull request #11 from KelvinTegelaar/dev
[pull] dev from KelvinTegelaar:dev
2 parents dd548f5 + 147f7fe commit 4d1f7a9

File tree

20 files changed

+245
-86
lines changed

20 files changed

+245
-86
lines changed

public/version_latest.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.2.0
1+
5.2.1

src/components/forms/RFFComponents.jsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,12 @@ export const RFFSelectSearch = ({
429429
{label}
430430
{refreshFunction && (
431431
<CTooltip content="Refresh" placement="right">
432-
<CButton onClick={refreshFunction} variant="ghost" className="ms-1" size="sm">
432+
<CButton
433+
onClick={refreshFunction}
434+
variant="ghost"
435+
className="ms-1 py-0 border-0"
436+
size="sm"
437+
>
433438
<FontAwesomeIcon icon="sync" />
434439
</CButton>
435440
</CTooltip>

src/components/layout/AppSidebarNav.jsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export const AppSidebarNav = ({ items }) => {
6565
)
6666
}
6767
const navGroup = (item, index) => {
68-
const { component, name, icon, to, ...rest } = item
68+
const { component, name, icon, to, items, ...rest } = item
6969
const Component = component
7070
const navGroupKey = `${item.name.toLowerCase().replace(' ', '-')}_${index}`
7171
const navGroupIdx = `${item.section.toLowerCase().replace(' ', '-')}_${item.name
@@ -79,9 +79,7 @@ export const AppSidebarNav = ({ items }) => {
7979
visible={location.pathname.startsWith(to)}
8080
{...rest}
8181
>
82-
{item.items?.map((item, index) =>
83-
item.items ? navGroup(item, index) : navItem(item, index),
84-
)}
82+
{items?.map((item, index) => (item.items ? navGroup(item, index) : navItem(item, index)))}
8583
</Component>
8684
)
8785
}

src/components/tables/CippDatatable.jsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import { CippTablePropTypes } from 'src/components/tables/CippTable'
66
import { CCallout } from '@coreui/react'
77

88
export default function CippDatatable({ path, params, ...rest }) {
9-
const [refreshGuid, setRefreshGuid] = React.useState('')
109
const [graphFilter, setGraphFilter] = React.useState(params?.Parameters?.$filter)
1110
const {
1211
data = [],
1312
isFetching,
1413
error,
15-
} = useListDatatableQuery({ path, params: { refreshGuid, $filter: graphFilter, ...params } })
14+
refetch,
15+
} = useListDatatableQuery({ path, params: { $filter: graphFilter, ...params } })
1616

1717
var defaultFilterText = ''
1818
if (params?.Parameters?.$filter) {
@@ -23,11 +23,12 @@ export default function CippDatatable({ path, params, ...rest }) {
2323
{data?.Metadata?.Queued && <CCallout color="info">{data?.Metadata?.QueueMessage}</CCallout>}
2424
<CippTable
2525
{...rest}
26+
endpointName={path}
2627
data={Array.isArray(data?.Results) ? data?.Results : data}
2728
isFetching={isFetching}
2829
error={error}
2930
defaultFilterText={defaultFilterText}
30-
refreshFunction={setRefreshGuid}
31+
refreshFunction={() => refetch()}
3132
graphFilterFunction={setGraphFilter}
3233
/>
3334
</>

src/components/tables/CippTable.jsx

Lines changed: 109 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useRef, useMemo, useState, useCallback, useEffect } from 'react'
2-
import { useSelector } from 'react-redux'
2+
import { useDispatch, useSelector } from 'react-redux'
33
import { ExportCsvButton, ExportPDFButton } from 'src/components/buttons'
44
import {
55
CSpinner,
@@ -10,9 +10,6 @@ import {
1010
CDropdownMenu,
1111
CDropdownItem,
1212
CButton,
13-
CModal,
14-
CModalBody,
15-
CModalTitle,
1613
CCallout,
1714
CFormSelect,
1815
CAccordion,
@@ -32,15 +29,15 @@ import {
3229
faFilePdf,
3330
faSearch,
3431
faSync,
35-
faTasks,
3632
} from '@fortawesome/free-solid-svg-icons'
3733
import { cellGenericFormatter } from './CellGenericFormat'
3834
import { ModalService } from '../utilities'
3935
import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app'
40-
import { ConfirmModal } from '../utilities/SharedModal'
41-
import { debounce } from 'lodash-es'
36+
import { debounce, update } from 'lodash-es'
4237
import { useSearchParams } from 'react-router-dom'
4338
import CopyToClipboard from 'react-copy-to-clipboard'
39+
import { setDefaultColumns } from 'src/store/features/app'
40+
import { end } from '@popperjs/core'
4441

4542
const FilterComponent = ({ filterText, onFilter, onClear, filterlist, onFilterPreset }) => (
4643
<>
@@ -126,6 +123,7 @@ export default function CippTable({
126123
exportFiltered = false,
127124
filterlist,
128125
showFilter = true,
126+
endpointName,
129127
tableProps: {
130128
keyField = 'id',
131129
theme = 'cyberdrain',
@@ -150,10 +148,43 @@ export default function CippTable({
150148
}) {
151149
const inputRef = useRef('')
152150
const [loopRunning, setLoopRunning] = React.useState(false)
151+
const defaultColumns = useSelector((state) => state.app.defaultColumns[endpointName])
152+
const [defaultColumnsSet, setDefaultColumnsSet] = React.useState(false)
153153
const [massResults, setMassResults] = React.useState([])
154154
const [filterText, setFilterText] = React.useState(defaultFilterText)
155155
const [filterviaURL, setFilterviaURL] = React.useState(false)
156+
const [originalColumns, setOrginalColumns] = React.useState(columns)
156157
const [updatedColumns, setUpdatedColumns] = React.useState(columns)
158+
if (defaultColumns && defaultColumnsSet === false) {
159+
const defaultColumnsArray = defaultColumns.split(',').filter((item) => item)
160+
161+
const actionsColumn = columns.length > 0 ? columns[columns.length - 1] : null
162+
163+
let tempColumns = actionsColumn ? columns.slice(0, -1) : [...columns]
164+
165+
defaultColumnsArray.forEach((columnName) => {
166+
if (!tempColumns.find((c) => c.exportSelector === columnName && c?.omit !== true)) {
167+
tempColumns.push({
168+
name: columnName,
169+
selector: (row) => row[columnName],
170+
sortable: true,
171+
exportSelector: columnName,
172+
cell: cellGenericFormatter(),
173+
})
174+
}
175+
})
176+
177+
if (actionsColumn) {
178+
tempColumns.push(actionsColumn)
179+
}
180+
let newColumns = tempColumns.filter(
181+
(column) => defaultColumnsArray.includes(column.exportSelector) || column === actionsColumn,
182+
)
183+
184+
setUpdatedColumns(newColumns)
185+
setDefaultColumnsSet(true)
186+
}
187+
157188
const [selectedRows, setSelectedRows] = React.useState(false)
158189
const [genericGetRequest, getResults] = useLazyGenericGetRequestQuery()
159190
const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery()
@@ -171,6 +202,32 @@ export default function CippTable({
171202
searchParams.delete('updateTableFilter')
172203
}
173204

205+
// eslint-disable-next-line react-hooks/exhaustive-deps
206+
const addColumn = (columnname) => {
207+
let alreadyInArray = updatedColumns.some(
208+
(o) => o.exportSelector === columnname && o?.omit !== true,
209+
)
210+
let newColumns = [...updatedColumns]
211+
const actionsColumn = newColumns.length > 0 ? newColumns.pop() : null
212+
213+
if (!alreadyInArray) {
214+
const newColumn = {
215+
name: columnname,
216+
selector: (row) => row[columnname],
217+
sortable: true,
218+
exportSelector: columnname,
219+
cell: cellGenericFormatter(),
220+
}
221+
newColumns.push(newColumn)
222+
} else {
223+
newColumns = newColumns.filter((o) => o.exportSelector !== columnname)
224+
}
225+
if (actionsColumn) {
226+
newColumns.push(actionsColumn)
227+
}
228+
setUpdatedColumns(newColumns)
229+
}
230+
174231
const handleSelectedChange = ({ selectedRows }) => {
175232
setSelectedRows(selectedRows)
176233
if (selectedRows.length < 1) {
@@ -272,12 +329,34 @@ export default function CippTable({
272329
const applyFilter = (e) => {
273330
setFilterText(e.target.value)
274331
}
332+
// eslint-disable-next-line react-hooks/exhaustive-deps
333+
const setColumnDefaultLayout = (endpoint, columns) => {
334+
dispatch(setDefaultColumns({ endpoint, columns }))
335+
}
275336

337+
const resetDropdown = () => {
338+
setUpdatedColumns(originalColumns)
339+
setColumnDefaultLayout(endpointName, null)
340+
}
341+
const dispatch = useDispatch()
276342
useEffect(() => {
277-
if (columns !== updatedColumns) {
278-
setUpdatedColumns(columns)
343+
if (columns.length !== updatedColumns.length) {
344+
setUpdatedColumns(updatedColumns)
345+
setColumnDefaultLayout(
346+
endpointName,
347+
updatedColumns.map((column) => column.exportSelector).join(','),
348+
)
279349
}
280-
}, [columns, updatedColumns])
350+
}, [
351+
columns,
352+
defaultColumns,
353+
dispatch,
354+
dynamicColumns,
355+
originalColumns,
356+
endpointName,
357+
setColumnDefaultLayout,
358+
updatedColumns,
359+
])
281360

282361
createTheme(
283362
'cyberdrain',
@@ -495,7 +574,7 @@ export default function CippTable({
495574
}
496575

497576
const executeselectedAction = (item) => {
498-
console.log(item)
577+
// console.log(item)
499578
setModalContent({
500579
item,
501580
})
@@ -617,24 +696,6 @@ export default function CippTable({
617696

618697
if (!disablePDFExport) {
619698
if (dynamicColumns === true) {
620-
const addColumn = (columnname) => {
621-
var index = columns.length - 1
622-
let alreadyInArray = columns.find((o) => o.exportSelector === columnname)
623-
if (!alreadyInArray) {
624-
columns.splice(index, 0, {
625-
name: columnname,
626-
selector: (row) => row[columnname],
627-
sortable: true,
628-
exportSelector: columnname,
629-
cell: cellGenericFormatter(),
630-
})
631-
} else {
632-
let indexOfExisting = columns.findIndex((o) => o.exportSelector === columnname)
633-
columns = columns.splice(indexOfExisting, 1)
634-
}
635-
setUpdatedColumns(Date())
636-
}
637-
638699
defaultActions.push([
639700
<CDropdown key={'column-selector'} className="me-2" variant="input-group">
640701
<CDropdownToggle
@@ -647,13 +708,14 @@ export default function CippTable({
647708
<FontAwesomeIcon icon={faColumns} />
648709
</CDropdownToggle>
649710
<CDropdownMenu>
711+
<CDropdownItem onClick={() => resetDropdown()}>Reset to default</CDropdownItem>
650712
{dataKeys() &&
651713
dataKeys().map((item, idx) => {
652714
return (
653715
<CDropdownItem key={idx} onClick={() => addColumn(item)}>
654-
{columns.find((o) => o.exportSelector === item) && (
655-
<FontAwesomeIcon icon={faCheck} />
656-
)}{' '}
716+
{updatedColumns.find(
717+
(o) => o.exportSelector === item && o?.omit !== true,
718+
) && <FontAwesomeIcon icon={faCheck} />}{' '}
657719
{item}
658720
</CDropdownItem>
659721
)
@@ -778,18 +840,27 @@ export default function CippTable({
778840
</>
779841
)
780842
}, [
843+
refreshFunction,
781844
actions,
782-
selectedRows,
783845
disablePDFExport,
784846
disableCSVExport,
847+
selectedRows,
848+
actionsList,
849+
showFilter,
785850
filterText,
786851
filterlist,
787852
resetPaginationToggle,
788-
data,
853+
handleModal,
854+
getDrowndownInfo,
855+
filteredItems,
789856
columns,
857+
data,
858+
dynamicColumns,
790859
reportName,
791-
selectedRows,
792-
filteredItems,
860+
resetDropdown,
861+
updatedColumns,
862+
addColumn,
863+
setGraphFilter,
793864
])
794865
const tablePageSize = useSelector((state) => state.app.tablePageSize)
795866
const [codeCopied, setCodeCopied] = useState(false)
@@ -803,7 +874,7 @@ export default function CippTable({
803874
<div className="ms-n3 me-n3 cipp-tablewrapper">
804875
{!isFetching && error && <CCallout color="info">Error loading data</CCallout>}
805876
<div>
806-
{(columns.length === updatedColumns.length || !dynamicColumns) && (
877+
{(updatedColumns || !dynamicColumns) && (
807878
<>
808879
{(massResults.length >= 1 || loopRunning) && (
809880
<CCallout color="info">
@@ -900,7 +971,7 @@ export default function CippTable({
900971
responsive={responsive}
901972
dense={dense}
902973
striped={striped}
903-
columns={columns}
974+
columns={updatedColumns}
904975
data={filteredItems}
905976
expandableRows={expandableRows}
906977
expandableRowsComponent={expandableRowsComponent}

src/store/features/app.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const initialState = {
1111
tablePageSize: 25,
1212
pageSizes: [25, 50, 100, 200, 500],
1313
TenantListSelector: false,
14+
defaultColumns: {},
1415
}
1516

1617
export const appSlice = createSlice({
@@ -47,6 +48,9 @@ export const appSlice = createSlice({
4748
setOffboardingDefaults: (state, action) => {
4849
state.offboardingDefaults = action.payload?.offboardingDefaults
4950
},
51+
setDefaultColumns: (state, action) => {
52+
state.defaultColumns[action.payload.endpoint] = action.payload?.columns
53+
},
5054
setUserSettings: (state, action) => {
5155
//foreach key in the userSettings, set the state key to the value of that setting
5256
Object.keys(action.payload?.userSettings).forEach((key) => {
@@ -68,6 +72,7 @@ export const {
6872
setReportImage,
6973
setOffboardingDefaults,
7074
setUserSettings,
75+
setDefaultColumns,
7176
} = appSlice.actions
7277

7378
export default persistReducer(

src/views/cipp/CIPPSettings.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,12 +230,14 @@ const GeneralSettings = () => {
230230
selector: (row) => row?.GDAPRoles,
231231
cell: cellTableFormatter('GDAPRoles', false, true),
232232
omit: showExtendedInfo,
233+
exportSelector: 'GDAPRoles',
233234
},
234235
{
235236
name: 'SAM User Roles',
236237
selector: (row) => row?.SAMUserRoles,
237238
cell: cellTableFormatter('SAMUserRoles', false, true),
238239
omit: showExtendedInfo,
240+
exportSelector: 'SAMUserRoles',
239241
},
240242
]
241243

src/views/email-exchange/administration/ContactsList.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ const columns = [
8080
selector: (row) => row['id'],
8181
name: 'id',
8282
omit: true,
83+
exportSelector: 'id',
8384
},
8485
{
8586
selector: (row) => row['onPremisesSyncEnabled'],

src/views/email-exchange/transport/TransportRules.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,13 @@ const columns = [
100100
name: 'description',
101101
selector: (row) => row['Description'],
102102
omit: true,
103+
exportSelector: 'Description',
103104
},
104105
{
105106
name: 'GUID',
106107
selector: (row) => row['Guid'],
107108
omit: true,
109+
exportSelector: 'Guid',
108110
},
109111
{
110112
name: 'Actions',

0 commit comments

Comments
 (0)