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 + + +
    { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + Add Contact + + + + {postResults.isFetching && ( + + + + )} + {postResults.isSuccess && ( + {postResults.data.Results} + )} + + ) + }} + /> + + + + ) +} + +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