diff --git a/package-lock.json b/package-lock.json
index c7184d22eb8d..ee5a2bbb0264 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5145,9 +5145,10 @@
}
},
"node_modules/babel-loader/node_modules/loader-utils": {
- "version": "1.4.0",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
@@ -12011,9 +12012,10 @@
}
},
"node_modules/loader-utils": {
- "version": "2.0.2",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
@@ -14739,9 +14741,10 @@
}
},
"node_modules/react-dev-utils/node_modules/loader-utils": {
- "version": "3.2.0",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 12.13.0"
}
@@ -15269,25 +15272,15 @@
}
},
"node_modules/recursive-readdir": {
- "version": "2.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimatch": "3.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/recursive-readdir/node_modules/minimatch": {
- "version": "3.0.4",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
"dev": true,
- "license": "ISC",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "minimatch": "^3.0.5"
},
"engines": {
- "node": "*"
+ "node": ">=6.0.0"
}
},
"node_modules/redent": {
@@ -21453,7 +21446,9 @@
}
},
"loader-utils": {
- "version": "1.4.0",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
@@ -25773,7 +25768,9 @@
"version": "4.2.0"
},
"loader-utils": {
- "version": "2.0.2",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
@@ -27349,7 +27346,9 @@
"dev": true
},
"loader-utils": {
- "version": "3.2.0",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
"dev": true
},
"supports-color": {
@@ -27694,19 +27693,12 @@
}
},
"recursive-readdir": {
- "version": "2.2.2",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
"dev": true,
"requires": {
- "minimatch": "3.0.4"
- },
- "dependencies": {
- "minimatch": {
- "version": "3.0.4",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- }
+ "minimatch": "^3.0.5"
}
},
"redent": {
diff --git a/public/version_latest.txt b/public/version_latest.txt
index 79a00e9a07f5..6618ab5451bf 100644
--- a/public/version_latest.txt
+++ b/public/version_latest.txt
@@ -1 +1 @@
-2.16.0
\ No newline at end of file
+2.17.0
\ No newline at end of file
diff --git a/src/_nav.js b/src/_nav.js
index c2fdcf3e033d..dfd872d9136b 100644
--- a/src/_nav.js
+++ b/src/_nav.js
@@ -331,6 +331,11 @@ const _nav = [
name: 'Add Choco App',
to: '/endpoint/applications/add-choco-app',
},
+ {
+ component: CNavItem,
+ name: 'Add WinGet or Store App',
+ to: '/endpoint/applications/add-winget-app',
+ },
{
component: CNavItem,
name: 'Add Office App',
diff --git a/src/assets/images/datto.png b/src/assets/images/datto.png
new file mode 100644
index 000000000000..623e1a4446ca
Binary files /dev/null and b/src/assets/images/datto.png differ
diff --git a/src/components/layout/AppFooter.js b/src/components/layout/AppFooter.js
index 0a686d8e438d..03dc0ea09dfa 100644
--- a/src/components/layout/AppFooter.js
+++ b/src/components/layout/AppFooter.js
@@ -2,15 +2,20 @@ import React from 'react'
import { CFooter, CImage, CLink } from '@coreui/react'
import { Link } from 'react-router-dom'
import huntressLogo from 'src/assets/images/huntress_teal.png'
+import dattoLogo from 'src/assets/images/datto.png'
const AppFooter = () => {
return (
- This application is sponsored by
+ This application is sponsored by{' '}
+ {' '}
+ &
+
+
diff --git a/src/components/tables/CippTable.js b/src/components/tables/CippTable.js
index a13f59400675..c628dddd16b9 100644
--- a/src/components/tables/CippTable.js
+++ b/src/components/tables/CippTable.js
@@ -13,7 +13,8 @@ import {
import DataTable, { createTheme } from 'react-data-table-component'
import PropTypes from 'prop-types'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faSearch } from '@fortawesome/free-solid-svg-icons'
+import { faCheck, faColumns, faSearch } from '@fortawesome/free-solid-svg-icons'
+import { useEffect } from 'react'
const FilterComponent = ({ filterText, onFilter, onClear, filterlist, onFilterPreset }) => (
<>
@@ -112,10 +113,16 @@ export default function CippTable({
} = {},
}) {
const [filterText, setFilterText] = React.useState('')
+ const [updatedColumns, setUpdatedColumns] = React.useState(columns)
const [resetPaginationToggle, setResetPaginationToggle] = React.useState(false)
const filteredItems = data.filter(
(item) => JSON.stringify(item).toLowerCase().indexOf(filterText.toLowerCase()) !== -1,
)
+ useEffect(() => {
+ if (columns !== updatedColumns) {
+ setUpdatedColumns(columns)
+ }
+ }, [updatedColumns])
createTheme(
'cyberdrain',
@@ -168,13 +175,62 @@ export default function CippTable({
setFilterText('')
}
}
- const defaultActions = []
- actions.forEach((action) => {
- defaultActions.push(action)
- })
+ const defaultActions = []
+ const dataKeys = () => {
+ if (filteredItems.length >= 1) {
+ return Object.keys(filteredItems[0])
+ } else {
+ return ['No additional columns available']
+ }
+ }
if (!disablePDFExport) {
+ const addColumn = (columnname) => {
+ var index = columns.length - 1
+ let alreadyInArray = columns.find((o) => o.exportSelector === columnname)
+ if (!alreadyInArray) {
+ columns.splice(index, 0, {
+ name: columnname,
+ selector: (row) => row[columnname],
+ sortable: true,
+ exportSelector: columnname,
+ })
+ } else {
+ let indexOfExisting = columns.findIndex((o) => o.exportSelector === columnname)
+ columns = columns.splice(indexOfExisting, 1)
+ }
+ setUpdatedColumns(Date())
+ }
+ defaultActions.push([
+
+
+
+
+
+ {dataKeys() &&
+ dataKeys().map((item, idx) => {
+ return (
+ addColumn(item)}>
+ {columns.find((o) => o.exportSelector === item) && (
+
+ )}{' '}
+ {item}
+
+ )
+ })}
+
+ ,
+ ])
+ actions.forEach((action) => {
+ defaultActions.push(action)
+ })
defaultActions.push([
,
])
}
+
if (!disableCSVExport) {
const keys = []
columns.map((col) => {
@@ -231,36 +288,38 @@ export default function CippTable({
{!isFetching && error && Error loading data }
{!error && (
- }
- paginationRowsPerPageOptions={[25, 50, 100, 200, 500]}
- {...rest}
- />
+ {columns.length === updatedColumns.length && (
+ }
+ paginationRowsPerPageOptions={[25, 50, 100, 200, 500]}
+ {...rest}
+ />
+ )}
)}
diff --git a/src/routes.js b/src/routes.js
index c068673a143f..b6f9ba2480b3 100644
--- a/src/routes.js
+++ b/src/routes.js
@@ -83,6 +83,9 @@ const ApplicationsQueue = React.lazy(() =>
const ApplicationsAddChocoApp = React.lazy(() =>
import('src/views/endpoint/applications/ApplicationsAddChocoApp'),
)
+const ApplicationsAddWingetApp = React.lazy(() =>
+ import('src/views/endpoint/applications/ApplicationsAddWinGet'),
+)
const ApplicationsAddOfficeApp = React.lazy(() =>
import('src/views/endpoint/applications/ApplicationsAddOffice'),
)
@@ -145,6 +148,7 @@ const EditMailboxPermissions = React.lazy(() =>
const AddSharedMailbox = React.lazy(() =>
import('src/views/email-exchange/administration/AddSharedMailbox'),
)
+const AddContact = React.lazy(() => import('src/views/email-exchange/administration/AddContact'))
const EditCalendarPermissions = React.lazy(() =>
import('src/views/email-exchange/administration/EditCalendarPermissions'),
)
@@ -354,6 +358,11 @@ const routes = [
name: 'Add Choco App',
component: ApplicationsAddChocoApp,
},
+ {
+ path: '/endpoint/applications/add-winget-app',
+ name: 'Add Choco App',
+ component: ApplicationsAddWingetApp,
+ },
{
path: '/endpoint/applications/add-office-app',
name: 'Add Office App',
@@ -488,10 +497,15 @@ const routes = [
component: EditMailboxPermissions,
},
{
- name: 'Edit Mailbox Permissions',
+ name: 'Add Shared Mailbox',
path: '/email/administration/add-shared-mailbox',
component: AddSharedMailbox,
},
+ {
+ name: 'Edit Contact',
+ path: '/email/administration/add-contact',
+ component: AddContact,
+ },
{
name: 'Edit Calendar Permissions',
path: '/email/administration/edit-calendar-permissions',
diff --git a/src/views/cipp/CIPPSettings.js b/src/views/cipp/CIPPSettings.js
index f4cdec978688..487ca766030c 100644
--- a/src/views/cipp/CIPPSettings.js
+++ b/src/views/cipp/CIPPSettings.js
@@ -17,7 +17,6 @@ import {
CForm,
CListGroup,
CListGroupItem,
- CBadge,
CLink,
CSpinner,
} from '@coreui/react'
@@ -33,20 +32,23 @@ import {
import {
useExecAddExcludeTenantMutation,
useExecRemoveExcludeTenantMutation,
- useListExcludedTenantsQuery,
} from 'src/store/api/tenants'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import {
+ faCheckCircle,
faCircleNotch,
+ faExclamationTriangle,
+ faEye,
+ faEyeSlash,
faLink,
+ faRecycle,
faScroll,
faTrash,
- faTrashAlt,
} from '@fortawesome/free-solid-svg-icons'
import { useListTenantsQuery } from 'src/store/api/tenants'
import { useLazyEditDnsConfigQuery, useLazyGetDnsConfigQuery } from 'src/store/api/domains'
import { useDispatch, useSelector } from 'react-redux'
-import { CippTable } from 'src/components/tables'
+import { cellBooleanFormatter, CellTip, CellTipIcon, CippTable } from 'src/components/tables'
import { CippPage, CippPageList } from 'src/components/layout'
import { RFFCFormSwitch, RFFCFormInput, RFFCFormSelect, RFFCFormCheck } from 'src/components/forms'
import { Form } from 'react-final-form'
@@ -67,7 +69,7 @@ const CIPPSettings = () => {
General
setActive(2)} href="#">
- Excluded Tenants
+ Tenants
setActive(3)} href="#">
Backend
@@ -276,8 +278,15 @@ const GeneralSettings = () => {
)}
{permissionsResult.data.Results?.MissingPermissions.length > 0 && (
<>
- Your Secure Application Model is missing the following delegated
- permissions:
+ Your Secure Application Model is missing the following permissions. See the
+ documentation on how to add permissions{' '}
+
+ here
+
+ .
{permissionsResult.data.Results?.MissingPermissions?.map((r, index) => (
{r}
@@ -400,13 +409,10 @@ const GeneralSettings = () => {
const ExcludedTenantsSettings = () => {
const dispatch = useDispatch()
const currentTenant = useSelector((state) => state.app.currentTenant)
- const {
- data: excludedTenants = [],
- isFetching: excludedTenantsFetching,
- isSuccess: excludedTenantsSuccess,
- } = useListExcludedTenantsQuery()
const [removeExcludeTenant, removeExcludeTenantResult] = useExecRemoveExcludeTenantMutation()
const [addExcludeTenant, addExcludeTenantResult] = useExecAddExcludeTenantMutation()
+ const [refreshPermissions, refreshPermissionsResults] = useLazyGenericGetRequestQuery()
+
// const [selectedTenant, setSelectedTenant] = useState()
const selectedTenant = useRef()
@@ -424,6 +430,13 @@ const ExcludedTenantsSettings = () => {
onConfirm: () => removeExcludeTenant(domain),
})
+ const handleCPVPermissions = (domain) =>
+ ModalService.confirm({
+ title: 'Refresh Permissions',
+ body: Are you sure you want to refresh permissions for {domain.defaultDomainName}?
,
+ onConfirm: () =>
+ refreshPermissions({ path: `/api/ExecCPVPermissions?TenantFilter=${domain.customerId}` }),
+ })
const handleConfirmExcludeTenant = (tenant) => {
addExcludeTenant(tenant)
.unwrap()
@@ -444,66 +457,160 @@ const ExcludedTenantsSettings = () => {
onConfirm: () => handleConfirmExcludeTenant(selected),
})
}
+ const titleButton = (
+ handleExcludeTenant(selectedTenant)}
+ >
+ Add Excluded Tenant
+
+ )
+ function StatusIcon(graphErrorCount) {
+ if (graphErrorCount > 0) {
+ return
+ } else {
+ return
+ }
+ }
+
+ function StatusText(graphErrorCount, lastGraphError) {
+ if (graphErrorCount > 0) {
+ return 'Error Count: ' + graphErrorCount + ' - Last Error: ' + lastGraphError
+ } else {
+ return 'No errors detected with this tenant'
+ }
+ }
+ const Offcanvas = (row, rowIndex, formatExtraData) => {
+ return (
+ <>
+ {row.Excluded && (
+ handleRemoveExclusion(row.defaultDomainName)}
+ >
+
+
+ )}
+ {!row.Excluded && (
+ handleExcludeTenant(row)}
+ >
+
+
+ )}
+ handleCPVPermissions(row)}>
+
+
+ >
+ )
+ }
+ const columns = [
+ {
+ name: 'Latest Status',
+ selector: (row) => row['GraphErrorCount'],
+ sortable: true,
+ cell: (row) =>
+ CellTipIcon(
+ StatusText(row['GraphErrorCount'], row['LastGraphError']),
+ StatusIcon(row['GraphErrorCount']),
+ ),
+ exportSelector: 'GraphErrorCount',
+ maxWidth: '130px',
+ minWidth: '130px',
+ },
+ {
+ name: 'Name',
+ selector: (row) => row['displayName'],
+ sortable: true,
+ cell: (row) => CellTip(row['displayName']),
+ exportSelector: 'displayName',
+ },
+ {
+ name: 'Default Domain',
+ selector: (row) => row['defaultDomainName'],
+ sortable: true,
+ cell: (row) => CellTip(row['defaultDomainName']),
+ exportSelector: 'defaultDomainName',
+ },
+ {
+ name: 'Excluded',
+ selector: (row) => row['Excluded'],
+ sortable: true,
+ cell: cellBooleanFormatter({ colourless: true }),
+ exportSelector: 'Excluded',
+ maxWidth: '100px',
+ minWidth: '100px',
+ },
+ {
+ name: 'Exclude Date',
+ selector: (row) => row['ExcludeDate'],
+ sortable: true,
+ exportSelector: 'ExcludeDate',
+ maxWidth: '150px',
+ minWidth: '150px',
+ },
+ {
+ name: 'Exclude User',
+ selector: (row) => row['ExcludeUser'],
+ sortable: true,
+ exportSelector: 'ExcludeUser',
+ maxWidth: '130px',
+ minWidth: '130px',
+ },
+ {
+ name: 'Actions',
+ cell: Offcanvas,
+ maxWidth: '80px',
+ },
+ ]
return (
<>
+ {(refreshPermissionsResults.isFetching || removeExcludeTenantResult.isFetching) && (
+
+
+
+ )}
{removeExcludeTenantResult.isSuccess && (
{removeExcludeTenantResult.data?.Results}
)}
+ {refreshPermissionsResults.isSuccess && (
+
+ {refreshPermissionsResults.data.map((result, idx) => (
+ {result}
+ ))}
+
+ )}
{addExcludeTenantResult.isSuccess && (
{addExcludeTenantResult.data?.Results}
)}
-
-
-
-
-
- Excluded Tenant List
- handleExcludeTenant(selectedTenant)}
- >
- Add Excluded Tenant
-
-
-
-
- {excludedTenantsFetching && }
- {excludedTenantsSuccess && (
-
- {excludedTenants.map((excludedTenant, idx) => (
-
- {excludedTenant.Name}
-
- Added by {excludedTenant.User} on {excludedTenant.Date}
-
-
- handleRemoveExclusion(excludedTenant.Name)}
- />
-
-
- ))}
-
- )}
-
-
-
-
+
>
)
}
diff --git a/src/views/email-exchange/administration/AddContact.js b/src/views/email-exchange/administration/AddContact.js
new file mode 100644
index 000000000000..c6b323fd3467
--- /dev/null
+++ b/src/views/email-exchange/administration/AddContact.js
@@ -0,0 +1,95 @@
+import React from 'react'
+import {
+ CCallout,
+ CButton,
+ CCol,
+ CForm,
+ CRow,
+ CSpinner,
+ CCard,
+ CCardHeader,
+ CCardTitle,
+ CCardBody,
+} from '@coreui/react'
+import { Form } from 'react-final-form'
+import { RFFCFormCheck, RFFCFormInput } from 'src/components/forms'
+import { CippPage } from 'src/components/layout/CippPage'
+import { useLazyGenericPostRequestQuery } from 'src/store/api/app'
+import { useSelector } from 'react-redux'
+
+const AddContact = () => {
+ const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName)
+
+ const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery()
+ const onSubmit = (values) => {
+ const shippedValues = {
+ tenantID: tenantDomain,
+ firstName: values.firstName,
+ lastName: values.lastName,
+ displayName: values.displayName,
+ email: values.email,
+ hidefromGAL: values.hidefromGAL,
+ }
+ genericPostRequest({ path: '/api/AddContact', values: shippedValues })
+ }
+ return (
+
+
+
+ Add Contact
+
+
+
+
+
+ )
+}
+
+export default AddContact
diff --git a/src/views/email-exchange/administration/ContactsList.js b/src/views/email-exchange/administration/ContactsList.js
index 85c358c96bd3..ada566a4e7cd 100644
--- a/src/views/email-exchange/administration/ContactsList.js
+++ b/src/views/email-exchange/administration/ContactsList.js
@@ -5,11 +5,13 @@ import { CippPageList } from 'src/components/layout'
import { CellTip, cellBooleanFormatter } from 'src/components/tables'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faEdit } from '@fortawesome/free-solid-svg-icons'
+import { TitleButton } from 'src/components/buttons'
const Actions = (row, rowIndex, formatExtraData) => {
const tenant = useSelector((state) => state.app.currentTenant)
return (
@@ -65,6 +67,8 @@ const ContactList = () => {
return (
}
title="Contacts"
datatable={{
keyField: 'id',
diff --git a/src/views/email-exchange/administration/MailboxesList.js b/src/views/email-exchange/administration/MailboxesList.js
index 2fda30ee5749..c6bf04a36c28 100644
--- a/src/views/email-exchange/administration/MailboxesList.js
+++ b/src/views/email-exchange/administration/MailboxesList.js
@@ -17,7 +17,7 @@ const MailboxList = () => {
return (
<>
@@ -30,7 +30,9 @@ const MailboxList = () => {
-
+
diff --git a/src/views/endpoint/applications/ApplicationsAddChocoApp.js b/src/views/endpoint/applications/ApplicationsAddChocoApp.js
index ee72fa850fcc..48c46c93314e 100644
--- a/src/views/endpoint/applications/ApplicationsAddChocoApp.js
+++ b/src/views/endpoint/applications/ApplicationsAddChocoApp.js
@@ -43,6 +43,7 @@ const ApplyStandard = () => {
const formValues = {
InstallAsSystem: true,
DisableRestart: true,
+ AssignTo: 'On',
}
return (
@@ -153,7 +154,6 @@ const ApplyStandard = () => {
{!postResults.isSuccess && (
{(props) => {
- /* eslint-disable react/prop-types */
return (
<>
diff --git a/src/views/endpoint/applications/ApplicationsAddOffice.js b/src/views/endpoint/applications/ApplicationsAddOffice.js
index b8a40d5236e9..5fcd8c673b07 100644
--- a/src/views/endpoint/applications/ApplicationsAddOffice.js
+++ b/src/views/endpoint/applications/ApplicationsAddOffice.js
@@ -51,6 +51,7 @@ const AddOffice = () => {
arch: true,
RemoveVersions: true,
AcceptLicense: true,
+ AssignTo: 'On',
}
return (
@@ -197,7 +198,6 @@ const AddOffice = () => {
{!postResults.isSuccess && (
{(props) => {
- /* eslint-disable react/prop-types */
return (
<>
diff --git a/src/views/endpoint/applications/ApplicationsAddRMM.js b/src/views/endpoint/applications/ApplicationsAddRMM.js
index fe2d3bcd65c8..5d994c7dbbca 100644
--- a/src/views/endpoint/applications/ApplicationsAddRMM.js
+++ b/src/views/endpoint/applications/ApplicationsAddRMM.js
@@ -44,6 +44,7 @@ const AddRMM = () => {
arch: true,
RemoveVersions: true,
AcceptLicense: true,
+ AssignTo: 'On',
}
return (
diff --git a/src/views/endpoint/applications/ApplicationsAddWinGet.js b/src/views/endpoint/applications/ApplicationsAddWinGet.js
new file mode 100644
index 000000000000..78012a077fe6
--- /dev/null
+++ b/src/views/endpoint/applications/ApplicationsAddWinGet.js
@@ -0,0 +1,200 @@
+import React from 'react'
+import { CCol, CRow, CForm, CListGroup, CListGroupItem, CCallout, CSpinner } from '@coreui/react'
+import { Field, FormSpy } from 'react-final-form'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'
+import { CippWizard } from 'src/components/layout'
+import { WizardTableField } from 'src/components/tables'
+import PropTypes from 'prop-types'
+import { RFFCFormInput, RFFCFormRadio, RFFCFormSwitch } from 'src/components/forms'
+import { useLazyGenericPostRequestQuery } from 'src/store/api/app'
+
+const Error = ({ name }) => (
+
+ touched && error ? (
+
+
+ {error}
+
+ ) : null
+ }
+ />
+)
+
+Error.propTypes = {
+ name: PropTypes.string.isRequired,
+}
+
+const requiredArray = (value) => (value && value.length !== 0 ? undefined : 'Required')
+
+const AddWinGet = () => {
+ const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery()
+
+ const handleSubmit = async (values) => {
+ values.selectedTenants.map(
+ (tenant) => (values[`Select_${tenant.defaultDomainName}`] = tenant.defaultDomainName),
+ )
+ genericPostRequest({ path: '/api/AddWinGetApp', values: values })
+ }
+
+ const formValues = {
+ InstallAsSystem: true,
+ DisableRestart: true,
+ AssignTo: 'On',
+ }
+
+ return (
+
+
+
+ Step 1
+ Choose a tenant
+
+
+
+ {(props) => (
+ row['displayName'],
+ sortable: true,
+ exportselector: 'displayName',
+ },
+ {
+ name: 'Default Domain Name',
+ selector: (row) => row['defaultDomainName'],
+ sortable: true,
+ exportselector: 'mail',
+ },
+ ]}
+ fieldProps={props}
+ />
+ )}
+
+
+
+
+
+
+ Step 2
+ Supply the app information
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Step 3
+ Confirm and apply
+
+
+ {!postResults.isSuccess && (
+
+ {(props) => {
+ return (
+ <>
+
+
+
+
+
+ Chocolatey Package: {props.values.packagename}
+
+
+ Application name: {props.values.applicationName}
+
+
+ Description: {props.values.description}
+
+
+ Custom Repo:
+ {props.values.customRepo ? props.values.customRepo : ' No'}
+
+
+ Install as System: {props.values.InstallAsSystem ? 'Yes' : 'No'}
+
+
+ Disable Restart: {props.values.DisableRestart ? 'Yes' : 'No'}
+
+
+ Assign to: {props.values.AssignTo}
+
+
+
+
+ >
+ )
+ }}
+
+ )}
+ {postResults.isFetching && (
+
+ Loading
+
+ )}
+ {postResults.isSuccess && {postResults.data.Results} }
+
+
+
+ )
+}
+
+export default AddWinGet
diff --git a/src/views/home/Home.js b/src/views/home/Home.js
index f777e911ae80..ab551f407d1f 100644
--- a/src/views/home/Home.js
+++ b/src/views/home/Home.js
@@ -27,7 +27,7 @@ const Home = () => {
return (
<>
-
+
@@ -38,7 +38,7 @@ const Home = () => {
-
+
{!isLoadingDash && dashboard.Alerts ? (
dashboard.Alerts.map((mappedAlert, idx) => (
diff --git a/src/views/identity/administration/OffboardingWizard.js b/src/views/identity/administration/OffboardingWizard.js
index 9205bd570ce8..72d201ed8ecf 100644
--- a/src/views/identity/administration/OffboardingWizard.js
+++ b/src/views/identity/administration/OffboardingWizard.js
@@ -201,7 +201,7 @@ const OffboardingWizard = () => {
{!postResults.isSuccess && (
{(props) => (
- /* eslint-disable react/prop-types */ <>
+ <>
diff --git a/src/views/identity/administration/ViewBEC.js b/src/views/identity/administration/ViewBEC.js
index c1177eb6f79e..2a2101ba857f 100644
--- a/src/views/identity/administration/ViewBEC.js
+++ b/src/views/identity/administration/ViewBEC.js
@@ -22,6 +22,7 @@ import { useLazyGenericPostRequestQuery } from 'src/store/api/app'
import { CippContentCard, CippMasonry, CippMasonryItem, CippPage } from 'src/components/layout'
import 'react-loading-skeleton/dist/skeleton.css'
import Skeleton from 'react-loading-skeleton'
+import useConfirmModal from 'src/hooks/useConfirmModal'
const ViewBec = () => {
let query = useQuery()
@@ -217,7 +218,15 @@ const ViewBec = () => {
sortable: true,
},
]
-
+ const handleReMediate = useConfirmModal({
+ body: Are you sure you want to remediate this user?
,
+ onConfirm: () => {
+ execBecRemediate({
+ path: '/api/execBecRemediate',
+ values: { userId: userId, tenantFilter: tenantDomain },
+ })
+ },
+ })
return (
@@ -263,16 +272,7 @@ const ViewBec = () => {
Disconnect all current sessions
Disable all inbox rules for the user
-
- execBecRemediate({
- path: '/api/execBecRemediate',
- values: { userId: userId, tenantFilter: tenantDomain },
- })
- }
- >
- Remediate User
-
+ handleReMediate()}>Remediate User
{!execRemediateResults.isSuccess && execRemediateResults.isError && (
Error. Could not remediate user
)}
diff --git a/src/views/identity/reports/MFAReport.js b/src/views/identity/reports/MFAReport.js
index c76c6809c2ba..56cbdda9d83c 100644
--- a/src/views/identity/reports/MFAReport.js
+++ b/src/views/identity/reports/MFAReport.js
@@ -18,6 +18,13 @@ const columns = [
cell: cellBooleanFormatter({ colourless: true }),
exportSelector: 'AccountEnabled',
},
+ {
+ selector: (row) => row['isLicensed'],
+ name: 'Account Licensed',
+ sortable: true,
+ cell: cellBooleanFormatter({ colourless: true }),
+ exportSelector: 'AccountEnabled',
+ },
{
selector: (row) => row['PerUser'],
name: 'Per user MFA Status',
diff --git a/src/views/teams-share/onedrive/OneDriveList.js b/src/views/teams-share/onedrive/OneDriveList.js
index 3d119f76e8d8..d63e3a468177 100644
--- a/src/views/teams-share/onedrive/OneDriveList.js
+++ b/src/views/teams-share/onedrive/OneDriveList.js
@@ -1,3 +1,4 @@
+import { CLink } from '@coreui/react'
import React from 'react'
import { useSelector } from 'react-redux'
import { CippPageList } from 'src/components/layout'
@@ -44,6 +45,19 @@ const OneDriveList = () => {
sortable: true,
exportSelector: 'Allocated',
},
+ {
+ name: 'URL',
+ selector: (row) => row['url'],
+ sortable: true,
+ exportSelector: 'URL',
+ cell: (row) => {
+ return (
+
+ URL
+
+ )
+ },
+ },
]
return (
{
let navigate = useNavigate()
const tenant = useSelector((state) => state.app.currentTenant)
let query = useQuery()
const endpoint = query.get('endpoint')
+ const disablePagination = query.get('disablePagination')
const SearchNow = query.get('SearchNow')
const [visibleA, setVisibleA] = useState(true)
const handleSubmit = async (values) => {
setVisibleA(false)
- Object.keys(values).filter(function (x) {
- if (values[x] === null) {
- delete values[x]
- }
- return null
- })
+
const shippedValues = {
tenantFilter: tenant.defaultDomainName,
SearchNow: true,
- ...values,
+ endpoint: encodeURIComponent(values.endpoint),
+ random: (Math.random() + 1).toString(36).substring(7),
}
var queryString = Object.keys(shippedValues)
.map((key) => key + '=' + shippedValues[key])
@@ -73,11 +71,14 @@ const GraphExplorer = () => {
useEffect(() => {
execGraphRequest({
path: 'api/execGraphRequest',
- params: { tenantFilter: tenant.defaultDomainName, endpoint: endpoint },
+ params: {
+ tenantFilter: tenant.defaultDomainName,
+ endpoint: endpoint,
+ disablePagination: disablePagination,
+ },
})
- }, [endpoint, execGraphRequest, tenant.defaultDomainName])
+ }, [endpoint, execGraphRequest, tenant.defaultDomainName, query])
- /* eslint-disable react/prop-types */
const WhenFieldChanges = ({ field, set }) => (
{(
@@ -186,6 +187,9 @@ const GraphExplorer = () => {
+
+
+
@@ -194,11 +198,6 @@ const GraphExplorer = () => {
- {/**/}
- {/* */}
- {/* {JSON.stringify(values, null, 2)} */}
- {/* */}
- {/* */}
)
}}
diff --git a/version_latest.txt b/version_latest.txt
index 79a00e9a07f5..6618ab5451bf 100644
--- a/version_latest.txt
+++ b/version_latest.txt
@@ -1 +1 @@
-2.16.0
\ No newline at end of file
+2.17.0
\ No newline at end of file