From a7975c6f734c3519bd8c1caf30e4ed602190e8ea Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:55:36 +0200 Subject: [PATCH 01/27] fixed tenant selector https://github.com/KelvinTegelaar/CIPP/issues/1606 --- src/scss/_tenantselector.scss | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/scss/_tenantselector.scss b/src/scss/_tenantselector.scss index 20affa6d0cdc..3ae83ce3746e 100644 --- a/src/scss/_tenantselector.scss +++ b/src/scss/_tenantselector.scss @@ -182,10 +182,16 @@ } .select-search__options { + background-color: var(--cipp-search-bg); + white-space: nowrap; + text-overflow: ellipsis !important; + overflow: hidden; + &:hover { + background-color: var(--cipp-search-border-color); + } list-style: none; padding-inline-start: 0; } - .select-search__row:not(:first-child) { border-top: 1px solid var(--cipp-search-border-color); } @@ -201,4 +207,3 @@ .tenantDropdown { min-width: 25rem; } - From 728734f1d12862cecd22cbc4ded3a1373e141d8f Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Fri, 14 Jul 2023 12:38:22 +0100 Subject: [PATCH 02/27] Fixed issue with archive values Fixed issue with archive values --- src/views/identity/administration/UserEmailUsage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/identity/administration/UserEmailUsage.js b/src/views/identity/administration/UserEmailUsage.js index 6a0a3dbf8fe7..3f3f3e83d276 100644 --- a/src/views/identity/administration/UserEmailUsage.js +++ b/src/views/identity/administration/UserEmailUsage.js @@ -35,7 +35,7 @@ export default function UserEmailUsage({ userId, tenantDomain, className = null }, { heading: 'Total Archive Size', - body: String(`${usage?.TotalArchiveItemSize} GB`), + body: String(`${usage?.TotalArchiveItemSize}`), }, { heading: 'Total Archive Items', From 978c1f05c9bc892af66202c7d2421391bc063e5a Mon Sep 17 00:00:00 2001 From: John Duprey Date: Sun, 16 Jul 2023 20:46:40 -0400 Subject: [PATCH 03/27] Create pull.yml --- .github/pull.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/pull.yml diff --git a/.github/pull.yml b/.github/pull.yml new file mode 100644 index 000000000000..6ea67b80037d --- /dev/null +++ b/.github/pull.yml @@ -0,0 +1,11 @@ +version: "1" +rules: + - base: main + upstream: KelvinTegelaar:main + mergeMethod: merge + - base: dev + upstream: KelvinTegelaar:dev + mergeMethod: none + - base: website + upstream: KelvinTegelaar:website + mergeMethod: merge From c74ce976da02d88fc1b301c310d69012a8866328 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Tue, 18 Jul 2023 11:29:35 +0200 Subject: [PATCH 04/27] added offboard link to dropdown menu --- src/views/identity/administration/Users.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/views/identity/administration/Users.js b/src/views/identity/administration/Users.js index 7cf8eda1368b..c0764e90c649 100644 --- a/src/views/identity/administration/Users.js +++ b/src/views/identity/administration/Users.js @@ -16,6 +16,7 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) const viewLink = `/identity/administration/users/view?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}&userEmail=${row.userPrincipalName}` const editLink = `/identity/administration/users/edit?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}` + const OffboardLink = `/identity/administration/offboarding-wizard?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}` let licenses = [] row.assignedLicenses?.map((licenseAssignment, idx) => { @@ -79,6 +80,11 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { link: `/identity/administration/ViewBec?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}`, color: 'info', }, + { + label: 'Offboard User', + link: OffboardLink, + color: 'info', + }, { label: 'Create Temporary Access Password', color: 'info', From e7dba425c61faf99e9c344e13fa418dd217ce4c0 Mon Sep 17 00:00:00 2001 From: DChorn-ANS <94991453+DChorn-ANS@users.noreply.github.com> Date: Tue, 18 Jul 2023 14:14:35 -0600 Subject: [PATCH 05/27] Adding CellTip to CoverbyCA and Licensed Users Filter --- src/views/identity/reports/MFAReport.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/views/identity/reports/MFAReport.js b/src/views/identity/reports/MFAReport.js index 3d6be946f001..da29c7e33b87 100644 --- a/src/views/identity/reports/MFAReport.js +++ b/src/views/identity/reports/MFAReport.js @@ -1,6 +1,6 @@ import React from 'react' import { useSelector } from 'react-redux' -import { cellBooleanFormatter } from 'src/components/tables' +import { cellBooleanFormatter, CellTip } from 'src/components/tables' import { CippPageList } from 'src/components/layout' const columns = [ @@ -42,6 +42,7 @@ const columns = [ selector: (row) => row['CoveredByCA'], name: 'Enforced via Conditional Access', sortable: true, + cell: (row) => CellTip(row['CoveredByCA']), exportSelector: 'CoveredByCA', }, { @@ -99,6 +100,7 @@ const Altcolumns = [ selector: (row) => row['CoveredByCA'], name: 'Enforced via Conditional Access', sortable: true, + cell: (row) => CellTip(row['CoveredByCA']), exportSelector: 'CoveredByCA', }, { @@ -130,7 +132,10 @@ const MFAList = () => { title="MFA Report" capabilities={{ allTenants: true, helpContext: 'https://google.com' }} datatable={{ - filterlist: [{ filterName: 'Enabled users', filter: '"accountEnabled":true' }], + filterlist: [ + { filterName: 'Enabled users', filter: '"accountEnabled":true' }, + { filterName: 'Licensed users', filter: '"isLicensed":"true"' }, + ], columns: tenant.defaultDomainName === 'AllTenants' ? Altcolumns : columns, path: '/api/ListMFAUsers', reportName: `${tenant?.defaultDomainName}-MFAReport-List`, From 5a243f6b9e7dedfbdd00c711cca4a62755693ea4 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 10:13:35 +0200 Subject: [PATCH 06/27] updates --- package-lock.json | 319 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 222 insertions(+), 97 deletions(-) diff --git a/package-lock.json b/package-lock.json index 619b33124282..e5a5e59bfafe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4006,9 +4006,10 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4134,9 +4135,10 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4302,9 +4304,10 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4354,9 +4357,10 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5525,24 +5529,34 @@ "license": "BSD-2-Clause" }, "node_modules/browserslist": { - "version": "4.19.3", - "license": "MIT", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { @@ -5698,9 +5712,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001377", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001377.tgz", - "integrity": "sha512-I5XeHI1x/mRSGl96LFOaSk528LA/yZG3m3iQgImGujjO8gotd/DL8QaI1R1h1dg5ATeI2jqPblMpKq4Tr5iKfQ==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "funding": [ { "type": "opencollective", @@ -5709,6 +5723,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -6149,26 +6167,18 @@ } }, "node_modules/core-js-compat": { - "version": "3.21.1", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { "version": "3.21.1", "dev": true, @@ -6325,9 +6335,10 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7066,8 +7077,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.75", - "license": "ISC" + "version": "1.4.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.464.tgz", + "integrity": "sha512-guZ84yoou4+ILNdj0XEbmGs6DEWj6zpVOWYpY09GU66yEb0DSYvP/biBPzHn0GuW/3RC/pnaYNUWlQE1fJYtgA==" }, "node_modules/element-resize-detector": { "version": "1.2.4", @@ -8555,9 +8567,10 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11328,9 +11341,10 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12585,8 +12599,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.2", - "license": "MIT" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/normalize-package-data": { "version": "3.0.3", @@ -12603,9 +12618,10 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -13661,9 +13677,10 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14519,6 +14536,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "dev": true, @@ -15086,9 +15109,10 @@ } }, "node_modules/react-scripts/node_modules/semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -15318,9 +15342,10 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -15929,8 +15954,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "license": "ISC", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -17170,22 +17196,25 @@ } }, "node_modules/tough-cookie": { - "version": "4.0.0", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -17427,6 +17456,35 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "license": "BSD-2-Clause", @@ -17434,6 +17492,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "dev": true, @@ -17972,9 +18040,10 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20865,7 +20934,9 @@ "dev": true }, "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20924,7 +20995,9 @@ } }, "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21007,7 +21080,9 @@ "dev": true }, "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21033,7 +21108,9 @@ }, "dependencies": { "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21815,13 +21892,14 @@ "dev": true }, "browserslist": { - "version": "4.19.3", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "requires": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bser": { @@ -21910,9 +21988,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001377", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001377.tgz", - "integrity": "sha512-I5XeHI1x/mRSGl96LFOaSk528LA/yZG3m3iQgImGujjO8gotd/DL8QaI1R1h1dg5ATeI2jqPblMpKq4Tr5iKfQ==" + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==" }, "canvg": { "version": "3.0.10", @@ -22192,17 +22270,12 @@ "version": "3.21.1" }, "core-js-compat": { - "version": "3.21.1", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "requires": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "dev": true - } + "browserslist": "^4.21.9" } }, "core-js-pure": { @@ -22294,7 +22367,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22765,7 +22840,9 @@ } }, "electron-to-chromium": { - "version": "1.4.75" + "version": "1.4.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.464.tgz", + "integrity": "sha512-guZ84yoou4+ILNdj0XEbmGs6DEWj6zpVOWYpY09GU66yEb0DSYvP/biBPzHn0GuW/3RC/pnaYNUWlQE1fJYtgA==" }, "element-resize-detector": { "version": "1.2.4", @@ -23734,7 +23811,9 @@ } }, "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25445,7 +25524,9 @@ "dev": true }, "semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26231,7 +26312,9 @@ "dev": true }, "node-releases": { - "version": "2.0.2" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "normalize-package-data": { "version": "3.0.3", @@ -26244,7 +26327,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26829,7 +26914,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -27313,6 +27400,12 @@ "version": "6.9.7", "dev": true }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "dev": true @@ -27674,7 +27767,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -27788,7 +27883,9 @@ } }, "semver": { - "version": "5.7.1", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "type-fest": { @@ -28200,7 +28297,9 @@ } }, "semver": { - "version": "6.3.0" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "send": { "version": "0.17.2", @@ -29042,16 +29141,21 @@ "dev": true }, "tough-cookie": { - "version": "4.0.0", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "dependencies": { "universalify": { - "version": "0.1.2", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true } } @@ -29201,12 +29305,31 @@ "version": "1.2.0", "dev": true }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "requires": { "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "dev": true @@ -29569,7 +29692,9 @@ } }, "word-wrap": { - "version": "1.2.3", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "wordwrap": { From c46345be8589d9121f805c186afbeaa3c726af84 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:08:28 +0200 Subject: [PATCH 07/27] added alert --- .../tenant/administration/AlertWizard.js | 78 +++++++++++-------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/src/views/tenant/administration/AlertWizard.js b/src/views/tenant/administration/AlertWizard.js index 54b42e424dd2..aa8a2b07fd60 100644 --- a/src/views/tenant/administration/AlertWizard.js +++ b/src/views/tenant/administration/AlertWizard.js @@ -94,39 +94,51 @@ const AlertWizard = () => {
- These alerts will be sent to the user or webhook configured in the CIPP notification - settings menu.

- - - - - - - - - - - - - - - +

+ These alerts will be sent to the user or webhook configured in the CIPP notification + settings menu. +

+ + + + + + + + + + + + + + + + + + + + + +

From 4bbcb10cddae877d2ec0590203a83a18ef91db10 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:37:25 +0200 Subject: [PATCH 08/27] Sharepoint quota add --- src/views/tenant/administration/ListAlertsQueue.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/views/tenant/administration/ListAlertsQueue.js b/src/views/tenant/administration/ListAlertsQueue.js index bd05c3f1b51b..4df0d23a8ce8 100644 --- a/src/views/tenant/administration/ListAlertsQueue.js +++ b/src/views/tenant/administration/ListAlertsQueue.js @@ -142,6 +142,13 @@ const ListAlertsQueue = () => { exportSelector: 'SecDefaultsUpsell', cell: cellBooleanFormatter(), }, + { + name: 'Sharepoint Quota', + selector: (row) => row['SharePointQuota'], + sortable: true, + exportSelector: 'SharePointQuota', + cell: cellBooleanFormatter(), + }, { name: 'Actions', cell: Actions, From c4fd5f5f40f9e9cf90fee5899c83d5abe66e42c5 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:41:17 +0200 Subject: [PATCH 09/27] add sharepoint quota --- src/views/tenant/administration/ListAlertsQueue.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/tenant/administration/ListAlertsQueue.js b/src/views/tenant/administration/ListAlertsQueue.js index 4df0d23a8ce8..f70e44b40565 100644 --- a/src/views/tenant/administration/ListAlertsQueue.js +++ b/src/views/tenant/administration/ListAlertsQueue.js @@ -144,9 +144,9 @@ const ListAlertsQueue = () => { }, { name: 'Sharepoint Quota', - selector: (row) => row['SharePointQuota'], + selector: (row) => row['SharepointQuota'], sortable: true, - exportSelector: 'SharePointQuota', + exportSelector: 'SharepointQuota', cell: cellBooleanFormatter(), }, { From d904147100b2b8ee8f8f1a421475d0c84805bcf1 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 12:27:11 +0200 Subject: [PATCH 10/27] Fixes #1609 --- src/views/identity/administration/Users.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/views/identity/administration/Users.js b/src/views/identity/administration/Users.js index c0764e90c649..da5db287e270 100644 --- a/src/views/identity/administration/Users.js +++ b/src/views/identity/administration/Users.js @@ -363,27 +363,27 @@ const Users = (row) => { { label: 'Convert to Shared Mailbox', modal: true, - modalUrl: `/api/ExecConvertToSharedMailbox?TenantFilter=${tenant.defaultDomainName}&ID=!userPrincipalName`, + modalUrl: `/api/ExecConvertToSharedMailbox?TenantFilter=!Tenant&ID=!userPrincipalName`, modalMessage: 'Are you sure you want to convert these users to a shared mailbox?', }, { label: 'Rerequire MFA registration', modal: true, - modalUrl: `/api/ExecResetMFA?TenantFilter=${tenant.defaultDomainName}&ID=!id`, + modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!id`, modalMessage: 'Are you sure you want to enable MFA for these users?', }, { label: 'Enable Online Archive', color: 'info', modal: true, - modalUrl: `/api/ExecEnableArchive?TenantFilter=${tenant.defaultDomainName}&ID=!id`, + modalUrl: `/api/ExecEnableArchive?TenantFilter=!Tenant&ID=!id`, modalMessage: 'Are you sure you want to enable the online archive for these users?', }, { label: 'Reset Password (Must Change)', color: 'info', modal: true, - modalUrl: `/api/ExecResetPass?MustChange=true&TenantFilter=${tenant.defaultDomainName}&ID=!userPrincipalName&displayName=!displayName`, + modalUrl: `/api/ExecResetPass?MustChange=true&TenantFilter=!Tenant&ID=!userPrincipalName&displayName=!displayName`, modalMessage: 'Are you sure you want to reset the password for these users? The users must change their password at next logon.', }, @@ -391,7 +391,7 @@ const Users = (row) => { label: 'Reset Password', color: 'info', modal: true, - modalUrl: `/api/ExecResetPass?MustChange=false&TenantFilter=${tenant.defaultDomainName}&ID=!userPrincipalName&displayName=!displayName`, + modalUrl: `/api/ExecResetPass?MustChange=false&TenantFilter=!Tenant&ID=!userPrincipalName&displayName=!displayName`, modalMessage: 'Are you sure you want to reset the password for these users? The users must change their password at next logon.', }, @@ -399,21 +399,21 @@ const Users = (row) => { label: 'Block signin', color: 'info', modal: true, - modalUrl: `/api/ExecDisableUser?TenantFilter=${tenant.defaultDomainName}&ID=!userPrincipalName`, + modalUrl: `/api/ExecDisableUser?TenantFilter=!Tenant&ID=!userPrincipalName`, modalMessage: 'Are you sure you want to disable these users?', }, { label: 'Unblock signin', color: 'info', modal: true, - modalUrl: `/api/ExecDisableUser?Enable=true&TenantFilter=${tenant.defaultDomainName}&ID=!userPrincipalName`, + modalUrl: `/api/ExecDisableUser?Enable=true&TenantFilter=!Tenant&ID=!userPrincipalName`, modalMessage: 'Are you sure you want to enable these users?', }, { label: 'Revoke sessions', color: 'info', modal: true, - modalUrl: `/api/ExecRevokeSessions?Enable=true&TenantFilter=${tenant.defaultDomainName}&ID=!userPrincipalName`, + modalUrl: `/api/ExecRevokeSessions?Enable=true&TenantFilter=!Tenant&ID=!userPrincipalName`, modalMessage: 'Are you sure you want to revoke all sessions for these users?', }, { @@ -459,7 +459,7 @@ const Users = (row) => { label: 'Delete User', color: 'danger', modal: true, - modalUrl: `/api/RemoveUser?TenantFilter=${tenant.defaultDomainName}&ID=!id`, + modalUrl: `/api/RemoveUser?TenantFilter=!Tenant&ID=!id`, modalMessage: 'Are you sure you want to delete these users?', }, ], From e8561bbe72a1ad8a4a8d12ab8ae6c9c9cf22a4d5 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 15:32:39 +0200 Subject: [PATCH 11/27] added sublabel --- src/components/forms/RFFComponents.js | 10 +++- .../tenant/standards/ListAppliedStandards.js | 46 ++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/components/forms/RFFComponents.js b/src/components/forms/RFFComponents.js index 8659c07aa85a..bda737a33a19 100644 --- a/src/components/forms/RFFComponents.js +++ b/src/components/forms/RFFComponents.js @@ -75,7 +75,14 @@ RFFCFormCheck.propTypes = { ...sharedPropTypes, } -export const RFFCFormSwitch = ({ name, label, className = 'mb-3', validate, disabled = false }) => { +export const RFFCFormSwitch = ({ + name, + label, + sublabel, + className = 'mb-3', + validate, + disabled = false, +}) => { return ( {({ meta, input }) => ( @@ -90,6 +97,7 @@ export const RFFCFormSwitch = ({ name, label, className = 'mb-3', validate, disa label={label} /> {input.value && } + {sublabel} )} diff --git a/src/views/tenant/standards/ListAppliedStandards.js b/src/views/tenant/standards/ListAppliedStandards.js index ebb248fe2da2..35bf11859df1 100644 --- a/src/views/tenant/standards/ListAppliedStandards.js +++ b/src/views/tenant/standards/ListAppliedStandards.js @@ -131,7 +131,15 @@ const ListAppliedStandards = () => { const [caGetRequest, caTemplates] = useLazyGenericGetRequestQuery() const [groupGetRequest, groupTemplates] = useLazyGenericGetRequestQuery() const initialValues = listStandardResults[0] - console.log(initialValues) + const allTenantsStandard = listStandardsAllTenants.find( + (tenant) => tenant.displayName === 'AllTenants', + ) + function getLabel(item) { + const keys = item.name.split('.') + let value = keys.reduce((prev, curr) => prev && prev[curr], allTenantsStandard) + return value ? `* Enabled via All Tenants` : '' + } + return ( <> @@ -175,7 +183,13 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'Global') .map((item, key) => ( <> - + {console.log(item.name)} + {item.addedComponent && ( {item.addedComponent.type === 'Select' ? ( @@ -204,7 +218,12 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'AAD') .map((item, key) => ( <> - + {item.addedComponent && ( {item.addedComponent.type === 'Select' ? ( @@ -233,7 +252,12 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'Exchange') .map((item, key) => ( <> - + {item.addedComponent && ( {item.addedComponent.type === 'Select' ? ( @@ -262,7 +286,12 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'Intune') .map((item, key) => ( <> - + {item.addedComponent && ( {item.addedComponent.type === 'Select' ? ( @@ -291,7 +320,12 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'SharePoint') .map((item, key) => ( <> - + {item.addedComponent && ( {item.addedComponent.type === 'Select' ? ( From 4b36eaed4813ff6f2abcb079fabf77c3524d3a95 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:27:12 +0200 Subject: [PATCH 12/27] Add updates webhook --- src/views/cipp/CIPPSettings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/cipp/CIPPSettings.js b/src/views/cipp/CIPPSettings.js index 931ecdb7ea4c..f4d145b593ca 100644 --- a/src/views/cipp/CIPPSettings.js +++ b/src/views/cipp/CIPPSettings.js @@ -1016,6 +1016,7 @@ const NotificationsSettings = () => { label="Choose which logs you'd like to receive alerts from. This notification will be sent every 15 minutes." name="logsToInclude" values={[ + { value: 'Updates', name: 'Updates Status' }, { value: 'Standards', name: 'All Standards' }, { value: 'TokensUpdater', name: 'Token Events' }, { value: 'ExecDnsConfig', name: 'Changing DNS Settings' }, From 2f681351e78436d7c8732ae9e33e6cba4a6326e0 Mon Sep 17 00:00:00 2001 From: Roel van der Wegen Date: Wed, 19 Jul 2023 22:21:28 +0200 Subject: [PATCH 13/27] Create portals.json --- src/data/portals.json | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/data/portals.json diff --git a/src/data/portals.json b/src/data/portals.json new file mode 100644 index 000000000000..264b8a4aaab0 --- /dev/null +++ b/src/data/portals.json @@ -0,0 +1,66 @@ +[ + { + "label" : "M365 Portal", + "name" : "M365_Portal", + "url" : "https://portal.office.com/Partner/BeginClientSession.aspx?CTID=${row.customerId}&CSDEST=o365admincenter", + "variable" : "${row.customerId}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Exchange Portal", + "name" : "Exchange_Portal", + "url" : "https://admin.exchange.microsoft.com/?landingpage=homepage&form=mac_sidebar&delegatedOrg=${row.defaultDomainName}#", + "variable" : "${row.defaultDomainName}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Entra Portal", + "name" : "Entra_Portal", + "url" : "https://entra.microsoft.com/${row.defaultDomainName}", + "variable" : "${row.defaultDomainName}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Teams Portal", + "name" : "Teams_Portal", + "url" : "https://admin.teams.microsoft.com/?delegatedOrg=${row.defaultDomainName}", + "variable" : "${row.defaultDomainName}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Azure Portal", + "name" : "Azure_Portal", + "url" : "https://portal.azure.com/${row.defaultDomainName}", + "variable" : "${row.defaultDomainName}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Intune Portal", + "name" : "Intune_Portal", + "url" : "https://intune.microsoft.com/${row.defaultDomainName}", + "variable" : "${row.defaultDomainName}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Security Portal", + "name" : "Security_Portal", + "url" : "https://security.microsoft.com/?tid=${row.customerId}", + "variable" : "${row.customerId}", + "target" : "_blank", + "external" : true + }, + { + "label" : "Sharepoint Admin", + "name" : "Sharepoint_Admin", + "url" : "https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=${row.customerId}&CSDEST=SharePoint", + "variable" : "${row.customerId}", + "target" : "_blank", + "external" : true + } +] From a005d17034f26610ccd6aae15b748d25533669f6 Mon Sep 17 00:00:00 2001 From: Roel van der Wegen Date: Wed, 19 Jul 2023 22:22:18 +0200 Subject: [PATCH 14/27] Update Tenants.js --- src/views/tenant/administration/Tenants.js | 127 ++++++++++++++------- 1 file changed, 88 insertions(+), 39 deletions(-) diff --git a/src/views/tenant/administration/Tenants.js b/src/views/tenant/administration/Tenants.js index f3431c1a8eb7..45f6d7769a5e 100644 --- a/src/views/tenant/administration/Tenants.js +++ b/src/views/tenant/administration/Tenants.js @@ -15,6 +15,7 @@ import { CippActionsOffcanvas } from 'src/components/utilities' import { useLazyGenericGetRequestQuery } from 'src/store/api/app' import Skeleton from 'react-loading-skeleton' import { TitleButton } from 'src/components/buttons' +import Portals from 'src/data/portals' const Offcanvas = (row, rowIndex, formatExtraData) => { const [getTenantDetails, tenantDetails] = useLazyGenericGetRequestQuery() @@ -86,59 +87,83 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { }, { icon: , - label: 'M365 Portal', - link: `https://portal.office.com/Partner/BeginClientSession.aspx?CTID=${row.customerId}&CSDEST=o365admincenter`, + label: Portals.find((obj) => obj.name === 'M365_Portal').label, external: true, color: 'info', + link: Portals.find((obj) => obj.name === 'M365_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'Exchange Portal', - color: 'info', + label: Portals.find((obj) => obj.name === 'Exchange_Portal').label, external: true, - link: `https://admin.exchange.microsoft.com/?landingpage=homepage&form=mac_sidebar&delegatedOrg=${row.defaultDomainName}#`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Exchange_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'Entra Portal', - color: 'info', + label: Portals.find((obj) => obj.name === 'Entra_Portal').label, external: true, - link: `https://entra.microsoft.com/${row.defaultDomainName}`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Entra_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'Teams Portal', - color: 'info', + label: Portals.find((obj) => obj.name === 'Teams_Portal').label, external: true, - link: `https://admin.teams.microsoft.com/?delegatedOrg=${row.defaultDomainName}`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Teams_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'Azure Portal', - color: 'info', + label: Portals.find((obj) => obj.name === 'Azure_Portal').label, external: true, - link: `https://portal.azure.com/${row.defaultDomainName}`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Azure_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'MEM (Intune) Portal', - color: 'info', + label: Portals.find((obj) => obj.name === 'Intune_Portal').label, external: true, - link: `https://intune.microsoft.com/${row.defaultDomainName}`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Intune_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'Security Portal (GDAP)', - color: 'info', + label: Portals.find((obj) => obj.name === 'Security_Portal').label, external: true, - link: `https://security.microsoft.com/?tid=${row.customerId}`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Security_Portal').url.replace( + '${row.customerId}', + row.customerId, + ), }, { icon: , - label: 'Sharepoint Admin', - color: 'info', + label: Portals.find((obj) => obj.name === 'Sharepoint_Admin').label, external: true, - link: `https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=${row.customerId}&CSDEST=SharePoint`, + color: 'info', + link: Portals.find((obj) => obj.name === 'Sharepoint_Admin').url.replace( + '${row.customerId}', + row.customerId, + ), }, ]} placement="end" @@ -189,13 +214,16 @@ const TenantsList = () => { minWidth: '200px', }, { - name: 'M365 Portal', + name: Portals.find((obj) => obj.name === 'M365_Portal').label, omit: columnOmits, selector: (row) => row['customerId'], center: true, cell: (row) => ( obj.name === 'M365_Portal').url.replace( + '${row.customerId}', + row.customerId, + )} target="_blank" className="dlink" rel="noreferrer" @@ -205,13 +233,16 @@ const TenantsList = () => { ), }, { - name: 'Exchange Portal', + name: Portals.find((obj) => obj.name === 'Exchange_Portal').label, omit: columnOmits, selector: (row) => row['defaultDomainName'], center: true, cell: (row) => ( obj.name === 'Exchange_Portal').url.replace( + '${row.defaultDomainName}', + row.defaultDomainName, + )} target="_blank" className="dlink" rel="noreferrer" @@ -221,13 +252,16 @@ const TenantsList = () => { ), }, { - name: 'Entra Portal', + name: Portals.find((obj) => obj.name === 'Entra_Portal').label, omit: columnOmits, selector: (row) => row['defaultDomainName'], center: true, cell: (row) => ( obj.name === 'Entra_Portal').url.replace( + '${row.defaultDomainName}', + row.defaultDomainName, + )} target="_blank" className="dlink" rel="noreferrer" @@ -237,13 +271,16 @@ const TenantsList = () => { ), }, { - name: 'Teams Portal', + name: Portals.find((obj) => obj.name === 'Teams_Portal').label, omit: columnOmits, selector: (row) => row['defaultDomainName'], center: true, cell: (row) => ( obj.name === 'Teams_Portal').url.replace( + '${row.defaultDomainName}', + row.defaultDomainName, + )} target="_blank" className="dlink" rel="noreferrer" @@ -253,13 +290,16 @@ const TenantsList = () => { ), }, { - name: 'Azure Portal', + name: Portals.find((obj) => obj.name === 'Azure_Portal').label, omit: columnOmits, selector: (row) => row['defaultDomainName'], center: true, cell: (row) => ( obj.name === 'Azure_Portal').url.replace( + '${row.defaultDomainName}', + row.defaultDomainName, + )} target="_blank" className="dlink" rel="noreferrer" @@ -269,13 +309,16 @@ const TenantsList = () => { ), }, { - name: 'MEM (Intune) Portal', + name: Portals.find((obj) => obj.name === 'Intune_Portal').label, omit: columnOmits, selector: (row) => row['defaultDomainName'], center: true, cell: (row) => ( obj.name === 'Intune_Portal').url.replace( + '${row.defaultDomainName}', + row.defaultDomainName, + )} target="_blank" className="dlink" rel="noreferrer" @@ -285,13 +328,16 @@ const TenantsList = () => { ), }, { - name: 'Security Portal (GDAP)', + name: Portals.find((obj) => obj.name === 'Security_Portal').label, selector: (row) => row['defaultDomainName'], center: true, omit: columnOmits, cell: (row) => ( obj.name === 'Security_Portal').url.replace( + '${row.customerId}', + row.customerId, + )} target="_blank" className="dlink" rel="noreferrer" @@ -301,13 +347,16 @@ const TenantsList = () => { ), }, { - name: 'SharePoint Admin', + name: Portals.find((obj) => obj.name === 'Sharepoint_Admin').label, selector: (row) => row['defaultDomainName'], center: true, omit: columnOmits, cell: (row) => ( obj.name === 'Sharepoint_Admin').url.replace( + '${row.customerId}', + row.customerId, + )} target="_blank" className="dlink" rel="noreferrer" From 0c49e6f0ded053c1f90c5a36d3b24ff6a2d995cb Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 19 Jul 2023 20:07:55 -0400 Subject: [PATCH 15/27] GDAP Invites - New wizard to create invites - GDAP Relationship - Add button for manually kicking off group mapping - Fix bug with GDAP relationship offcanvas --- src/_nav.js | 5 + src/adminRoutes.js | 2 + src/components/tables/CippTable.js | 2 +- .../tenant/administration/GDAPInviteWizard.js | 144 ++++++++++++++++++ .../administration/ListGDAPRelationships.js | 36 ++++- 5 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 src/views/tenant/administration/GDAPInviteWizard.js diff --git a/src/_nav.js b/src/_nav.js index b6d536bb1976..6db81f2e2398 100644 --- a/src/_nav.js +++ b/src/_nav.js @@ -693,6 +693,11 @@ const _nav = [ name: 'GDAP Migration Status', to: '/tenant/administration/gdap-status', }, + { + component: CNavItem, + name: 'Invite Wizard', + to: '/tenant/administration/gdap-invite', + }, { component: CNavItem, name: 'GDAP Relationships', diff --git a/src/adminRoutes.js b/src/adminRoutes.js index 7fb235df0e0e..b57360064384 100644 --- a/src/adminRoutes.js +++ b/src/adminRoutes.js @@ -4,6 +4,7 @@ const Setup = React.lazy(() => import('src/views/cipp/Setup')) const ApplyStandard = React.lazy(() => import('src/views/tenant/standards/ApplyStandard')) const GDAPStatus = React.lazy(() => import('src/views/tenant/administration/ListGDAPQueue')) const GDAP = React.lazy(() => import('src/views/tenant/administration/GDAPWizard')) +const GDAPInvite = React.lazy(() => import('src/views/tenant/administration/GDAPInviteWizard')) const GDAPRoleWizard = React.lazy(() => import('src/views/tenant/administration/GDAPRoleWizard')) const GDAPRoles = React.lazy(() => import('src/views/tenant/administration/ListGDAPRoles')) const GDAPRelationships = React.lazy(() => @@ -17,6 +18,7 @@ const adminRoutes = [ { path: '/cipp/settings', name: 'Settings', component: CIPPSettings }, { path: '/cipp/setup', name: 'Setup', component: Setup }, { path: '/tenant/administration/gdap', name: 'GDAP Wizard', component: GDAP }, + { path: '/tenant/administration/gdap-invite', name: 'GDAP Invite Wizard', component: GDAPInvite }, { path: '/tenant/administration/gdap-role-wizard', name: 'GDAP Role Wizard', diff --git a/src/components/tables/CippTable.js b/src/components/tables/CippTable.js index c3cc3f0665f2..ee16566de436 100644 --- a/src/components/tables/CippTable.js +++ b/src/components/tables/CippTable.js @@ -344,7 +344,7 @@ export default function CippTable({ if (key.length > 1) { var property = obj for (var x = 0; x < key.length; x++) { - if (property[key[x]] !== null) { + if (property.hasOwnProperty(key[x]) && property[key[x]] !== null) { property = property[key[x]] } else { property = 'n/a' diff --git a/src/views/tenant/administration/GDAPInviteWizard.js b/src/views/tenant/administration/GDAPInviteWizard.js new file mode 100644 index 000000000000..9adb90081c62 --- /dev/null +++ b/src/views/tenant/administration/GDAPInviteWizard.js @@ -0,0 +1,144 @@ +import React from 'react' +import { CCol, CRow, CForm, CCallout, CSpinner, CButton } 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 { TitleButton } from 'src/components/buttons' +import PropTypes from 'prop-types' +import { useLazyGenericGetRequestQuery, 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 GDAPInviteWizard = () => { + const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() + const [genericGetRequest, getResults] = useLazyGenericGetRequestQuery() + + const handleSubmit = async (values) => { + genericPostRequest({ path: '/api/ExecGDAPInvite', values: values }) + } + + const formValues = {} + + return ( + + +
+

Step 1

+
+ Select which roles you want to add to GDAP relationship. +
+
+
+ + + CIPP will create a single relationship with all roles you've selected for the maximum + duration of 730 days using a GUID as a random name for the relationship. +
It is recommend to put CIPP user in the correct GDAP Role Groups to manage your + environment secure after deployment of GDAP. +
+
+ +
+ + {(props) => ( + row['RoleName'], + sortable: true, + exportselector: 'Name', + }, + { + name: 'Group', + selector: (row) => row['GroupName'], + sortable: true, + }, + ]} + fieldProps={props} + /> + )} + + +
+
+
+ +
+

Step 2

+
Confirm and apply
+
+
+ {!postResults.isSuccess && ( + + {(props) => { + return ( + <> + + + +
Roles and group names
+ + {props.values.gdapRoles.map((role, idx) => ( +
  • + {role.RoleName} - {role.GroupName} +
  • + ))} +
    +
    +
    + + ) + }} +
    + )} + {postResults.isFetching && ( + + Loading + + )} + {postResults.isSuccess && ( + + {postResults.data.Results.map((message, idx) => { + return
  • {message}
  • + })} +
    + )} +
    +
    +
    + ) +} + +export default GDAPInviteWizard diff --git a/src/views/tenant/administration/ListGDAPRelationships.js b/src/views/tenant/administration/ListGDAPRelationships.js index ae40d66ddd40..13c7b0e64e70 100644 --- a/src/views/tenant/administration/ListGDAPRelationships.js +++ b/src/views/tenant/administration/ListGDAPRelationships.js @@ -1,5 +1,10 @@ -import { CButton } from '@coreui/react' -import { faEllipsisV, faTrashAlt } from '@fortawesome/free-solid-svg-icons' +import { CSpinner, CButton } from '@coreui/react' +import { + faEllipsisV, + faTrashAlt, + faExclamationTriangle, + faCheck, +} from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import React, { useState } from 'react' import { useSelector } from 'react-redux' @@ -7,6 +12,30 @@ import { CippPageList } from 'src/components/layout' import { cellDateFormatter, cellNullTextFormatter } from 'src/components/tables' import { CippActionsOffcanvas } from 'src/components/utilities' import GDAPRoles from 'src/data/GDAPRoles' +import { useLazyGenericGetRequestQuery } from 'src/store/api/app' +import { ModalService } from 'src/components/utilities' + +const RefreshAction = () => { + const [execGdapInviteQueue, { isLoading, isSuccess, error }] = useLazyGenericGetRequestQuery() + + const showModal = () => + ModalService.confirm({ + body:
    Process recently approved GDAP relationships?
    , + onConfirm: () => + execGdapInviteQueue({ + path: 'api/ExecGDAPInviteApproved', + }), + }) + + return ( + + {isLoading && } + {error && } + {isSuccess && } + Map GDAP Groups + + ) +} const Actions = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) @@ -31,7 +60,7 @@ const Actions = (row, rowIndex, formatExtraData) => { { modalMessage: 'Are you sure you want to terminate these relationships?', }, ], + actions: [], }, keyField: 'id', columns, From cc8e6a0d5a765022634212fbcd4c8b6151182562 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 19 Jul 2023 20:45:03 -0400 Subject: [PATCH 16/27] Add invite URL to offcanvas --- .../administration/ListGDAPRelationships.js | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/views/tenant/administration/ListGDAPRelationships.js b/src/views/tenant/administration/ListGDAPRelationships.js index 13c7b0e64e70..8efe4f6795ee 100644 --- a/src/views/tenant/administration/ListGDAPRelationships.js +++ b/src/views/tenant/administration/ListGDAPRelationships.js @@ -14,6 +14,8 @@ import { CippActionsOffcanvas } from 'src/components/utilities' import GDAPRoles from 'src/data/GDAPRoles' import { useLazyGenericGetRequestQuery } from 'src/store/api/app' import { ModalService } from 'src/components/utilities' +import { constants } from 'buffer' +import Skeleton from 'react-loading-skeleton' const RefreshAction = () => { const [execGdapInviteQueue, { isLoading, isSuccess, error }] = useLazyGenericGetRequestQuery() @@ -39,10 +41,33 @@ const RefreshAction = () => { const Actions = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) + const [getGdapInvite, gdapInvite] = useLazyGenericGetRequestQuery() - const tenant = useSelector((state) => state.app.currentTenant) + function inviteProperty(gdapInvite, propertyName) { + return ( + <> + {gdapInvite.isFetching && } + {!gdapInvite.isFetching && + gdapInvite.isSuccess && + (gdapInvite.data[propertyName]?.toString() ?? ' ')} + + ) + } + function loadOffCanvasDetails(id) { + setOCVisible(true) + getGdapInvite({ + path: 'api/ListGDAPInvite', + params: { RelationshipId: id }, + }) + } var extendedInfo = [] + extendedInfo.push({ + label: 'Invite URL', + value: inviteProperty(gdapInvite, 'InviteUrl'), + }) + const tenant = useSelector((state) => state.app.currentTenant) + row?.accessDetails.unifiedRoles.map((role) => { for (var x = 0; x < GDAPRoles.length; x++) { if (GDAPRoles[x].ObjectId == role.roleDefinitionId) { @@ -54,9 +79,10 @@ const Actions = (row, rowIndex, formatExtraData) => { } } }) + return ( <> - setOCVisible(true)}> + loadOffCanvasDetails(row.id)}> Date: Thu, 20 Jul 2023 10:16:39 +0200 Subject: [PATCH 17/27] updates to new portal logic --- src/data/portals.json | 128 +++++----- src/views/tenant/administration/Tenants.js | 275 ++------------------- 2 files changed, 90 insertions(+), 313 deletions(-) diff --git a/src/data/portals.json b/src/data/portals.json index 264b8a4aaab0..0e49317032f2 100644 --- a/src/data/portals.json +++ b/src/data/portals.json @@ -1,66 +1,66 @@ [ - { - "label" : "M365 Portal", - "name" : "M365_Portal", - "url" : "https://portal.office.com/Partner/BeginClientSession.aspx?CTID=${row.customerId}&CSDEST=o365admincenter", - "variable" : "${row.customerId}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Exchange Portal", - "name" : "Exchange_Portal", - "url" : "https://admin.exchange.microsoft.com/?landingpage=homepage&form=mac_sidebar&delegatedOrg=${row.defaultDomainName}#", - "variable" : "${row.defaultDomainName}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Entra Portal", - "name" : "Entra_Portal", - "url" : "https://entra.microsoft.com/${row.defaultDomainName}", - "variable" : "${row.defaultDomainName}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Teams Portal", - "name" : "Teams_Portal", - "url" : "https://admin.teams.microsoft.com/?delegatedOrg=${row.defaultDomainName}", - "variable" : "${row.defaultDomainName}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Azure Portal", - "name" : "Azure_Portal", - "url" : "https://portal.azure.com/${row.defaultDomainName}", - "variable" : "${row.defaultDomainName}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Intune Portal", - "name" : "Intune_Portal", - "url" : "https://intune.microsoft.com/${row.defaultDomainName}", - "variable" : "${row.defaultDomainName}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Security Portal", - "name" : "Security_Portal", - "url" : "https://security.microsoft.com/?tid=${row.customerId}", - "variable" : "${row.customerId}", - "target" : "_blank", - "external" : true - }, - { - "label" : "Sharepoint Admin", - "name" : "Sharepoint_Admin", - "url" : "https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=${row.customerId}&CSDEST=SharePoint", - "variable" : "${row.customerId}", - "target" : "_blank", - "external" : true - } + { + "label": "M365 Portal", + "name": "M365_Portal", + "url": "https://portal.office.com/Partner/BeginClientSession.aspx?CTID=customerId&CSDEST=o365admincenter", + "variable": "customerId", + "target": "_blank", + "external": true + }, + { + "label": "Exchange Portal", + "name": "Exchange_Portal", + "url": "https://admin.exchange.microsoft.com/?landingpage=homepage&form=mac_sidebar&delegatedOrg=defaultDomainName#", + "variable": "defaultDomainName", + "target": "_blank", + "external": true + }, + { + "label": "Entra Portal", + "name": "Entra_Portal", + "url": "https://entra.microsoft.com/defaultDomainName", + "variable": "defaultDomainName", + "target": "_blank", + "external": true + }, + { + "label": "Teams Portal", + "name": "Teams_Portal", + "url": "https://admin.teams.microsoft.com/?delegatedOrg=defaultDomainName", + "variable": "defaultDomainName", + "target": "_blank", + "external": true + }, + { + "label": "Azure Portal", + "name": "Azure_Portal", + "url": "https://portal.azure.com/defaultDomainName", + "variable": "defaultDomainName", + "target": "_blank", + "external": true + }, + { + "label": "Intune Portal", + "name": "Intune_Portal", + "url": "https://intune.microsoft.com/defaultDomainName", + "variable": "defaultDomainName", + "target": "_blank", + "external": true + }, + { + "label": "Security Portal", + "name": "Security_Portal", + "url": "https://security.microsoft.com/?tid=customerId", + "variable": "customerId", + "target": "_blank", + "external": true + }, + { + "label": "Sharepoint Admin", + "name": "Sharepoint_Admin", + "url": "https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=customerId&CSDEST=SharePoint", + "variable": "customerId", + "target": "_blank", + "external": true + } ] diff --git a/src/views/tenant/administration/Tenants.js b/src/views/tenant/administration/Tenants.js index 45f6d7769a5e..3347f1f84471 100644 --- a/src/views/tenant/administration/Tenants.js +++ b/src/views/tenant/administration/Tenants.js @@ -36,7 +36,13 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { ) } - + const actions = Portals.map((portal) => ({ + icon: , + label: portal.label, + external: true, + color: 'info', + link: portal.url.replace(portal.variable, row[portal.variable]), + })) return ( <> loadOffCanvasDetails(row.defaultDomainName)}> @@ -85,86 +91,7 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { link: `/tenant/administration/tenants/Edit?tenantFilter=${row.defaultDomainName}&customerId=${row.customerId}`, color: 'warning', }, - { - icon: , - label: Portals.find((obj) => obj.name === 'M365_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'M365_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Exchange_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Exchange_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Entra_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Entra_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Teams_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Teams_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Azure_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Azure_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Intune_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Intune_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Security_Portal').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Security_Portal').url.replace( - '${row.customerId}', - row.customerId, - ), - }, - { - icon: , - label: Portals.find((obj) => obj.name === 'Sharepoint_Admin').label, - external: true, - color: 'info', - link: Portals.find((obj) => obj.name === 'Sharepoint_Admin').url.replace( - '${row.customerId}', - row.customerId, - ), - }, + ...actions, ]} placement="end" visible={ocVisible} @@ -175,27 +102,28 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { ) } -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 TenantsList = () => { const TenantListSelector = useSelector((state) => state.app.TenantListSelector) const tenant = useSelector((state) => state.app.currentTenant) const [columnOmits, setOmitVisible] = useState(TenantListSelector) + const generatePortalColumn = (portal) => ({ + name: portal.label, + omit: columnOmits, + selector: (row) => row['defaultDomainName'], + center: true, + cell: (row) => ( +
    + + + ), + }) + const columns = [ { name: 'Name', @@ -213,158 +141,7 @@ const TenantsList = () => { exportSelector: 'defaultDomainName', minWidth: '200px', }, - { - name: Portals.find((obj) => obj.name === 'M365_Portal').label, - omit: columnOmits, - selector: (row) => row['customerId'], - center: true, - cell: (row) => ( - obj.name === 'M365_Portal').url.replace( - '${row.customerId}', - row.customerId, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Exchange_Portal').label, - omit: columnOmits, - selector: (row) => row['defaultDomainName'], - center: true, - cell: (row) => ( - obj.name === 'Exchange_Portal').url.replace( - '${row.defaultDomainName}', - row.defaultDomainName, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Entra_Portal').label, - omit: columnOmits, - selector: (row) => row['defaultDomainName'], - center: true, - cell: (row) => ( - obj.name === 'Entra_Portal').url.replace( - '${row.defaultDomainName}', - row.defaultDomainName, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Teams_Portal').label, - omit: columnOmits, - selector: (row) => row['defaultDomainName'], - center: true, - cell: (row) => ( - obj.name === 'Teams_Portal').url.replace( - '${row.defaultDomainName}', - row.defaultDomainName, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Azure_Portal').label, - omit: columnOmits, - selector: (row) => row['defaultDomainName'], - center: true, - cell: (row) => ( - obj.name === 'Azure_Portal').url.replace( - '${row.defaultDomainName}', - row.defaultDomainName, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Intune_Portal').label, - omit: columnOmits, - selector: (row) => row['defaultDomainName'], - center: true, - cell: (row) => ( - obj.name === 'Intune_Portal').url.replace( - '${row.defaultDomainName}', - row.defaultDomainName, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Security_Portal').label, - selector: (row) => row['defaultDomainName'], - center: true, - omit: columnOmits, - cell: (row) => ( - obj.name === 'Security_Portal').url.replace( - '${row.customerId}', - row.customerId, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, - { - name: Portals.find((obj) => obj.name === 'Sharepoint_Admin').label, - selector: (row) => row['defaultDomainName'], - center: true, - omit: columnOmits, - cell: (row) => ( - obj.name === 'Sharepoint_Admin').url.replace( - '${row.customerId}', - row.customerId, - )} - target="_blank" - className="dlink" - rel="noreferrer" - > - - - ), - }, + ...Portals.map(generatePortalColumn), { exportSelector: 'customerId', }, From 6101cf3f4e18549199d7c4c7147d01abd52a1892 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Thu, 20 Jul 2023 17:10:22 +0200 Subject: [PATCH 18/27] Added API authentication option --- src/data/Extensions.json | 34 +++++++++++++++++++++++++++++++++- src/views/cipp/CIPPSettings.js | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/data/Extensions.json b/src/data/Extensions.json index 2c15dbf56878..84e18fdf6553 100644 --- a/src/data/Extensions.json +++ b/src/data/Extensions.json @@ -1,4 +1,37 @@ [ + { + "name": "CIPP-API Integration", + "type": "CIPP-API", + "cat": "API", + "forceSyncButton": false, + "helpText": "This integration allows you to use to enable API access outside of CIPP usage. Requires Global Administrator permissions inside your tenant for activation of the API. These credentials will only be shown once.", + "SettingOptions": [ + { + "type": "input", + "fieldtype": "input", + "name": "cippapi.ApplicationID", + "label": "Application ID", + "placeholder": "None." + }, + { + "type": "input", + "fieldtype": "input", + "name": "cippapi.ApplicationSecret", + "label": "Application Secret", + "placeholder": "None." + }, + { + "type": "checkbox", + "name": "cippapi.resetcreds", + "label": "Reset Credentials" + }, + { + "type": "checkbox", + "name": "cippapi.Enabled", + "label": "Enable Integration" + } + ] + }, { "name": "Gradient Integration", "type": "Gradient", @@ -32,7 +65,6 @@ } ] }, - { "name": "Halo PSA Ticketing Integration", "type": "HaloPSA", diff --git a/src/views/cipp/CIPPSettings.js b/src/views/cipp/CIPPSettings.js index f4d145b593ca..509f4304a39f 100644 --- a/src/views/cipp/CIPPSettings.js +++ b/src/views/cipp/CIPPSettings.js @@ -1353,7 +1353,7 @@ const ExtensionsTab = () => { {Extensions.map((integration) => ( - + {integration.name} From 900aae154b6040a81494c627d4692e80165ecccc Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:41:00 +0200 Subject: [PATCH 19/27] add cipp-api extension --- src/data/Extensions.json | 19 ------------------- src/views/cipp/CIPPSettings.js | 2 +- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/src/data/Extensions.json b/src/data/Extensions.json index 84e18fdf6553..523d9d249c96 100644 --- a/src/data/Extensions.json +++ b/src/data/Extensions.json @@ -6,25 +6,6 @@ "forceSyncButton": false, "helpText": "This integration allows you to use to enable API access outside of CIPP usage. Requires Global Administrator permissions inside your tenant for activation of the API. These credentials will only be shown once.", "SettingOptions": [ - { - "type": "input", - "fieldtype": "input", - "name": "cippapi.ApplicationID", - "label": "Application ID", - "placeholder": "None." - }, - { - "type": "input", - "fieldtype": "input", - "name": "cippapi.ApplicationSecret", - "label": "Application Secret", - "placeholder": "None." - }, - { - "type": "checkbox", - "name": "cippapi.resetcreds", - "label": "Reset Credentials" - }, { "type": "checkbox", "name": "cippapi.Enabled", diff --git a/src/views/cipp/CIPPSettings.js b/src/views/cipp/CIPPSettings.js index 509f4304a39f..bb428a0fac45 100644 --- a/src/views/cipp/CIPPSettings.js +++ b/src/views/cipp/CIPPSettings.js @@ -1353,7 +1353,7 @@ const ExtensionsTab = () => { {Extensions.map((integration) => ( - + {integration.name} From dcd339a3308314c97a9d0eb05bcd0d7f1c1b3c98 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Thu, 20 Jul 2023 21:48:11 +0200 Subject: [PATCH 20/27] fix version check --- src/components/layout/AppHeader.js | 9 ++------- src/store/api/app.js | 10 ++++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/layout/AppHeader.js b/src/components/layout/AppHeader.js index e902401f52a9..bfda84ceee1b 100644 --- a/src/components/layout/AppHeader.js +++ b/src/components/layout/AppHeader.js @@ -21,18 +21,13 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCaretSquareLeft, faCaretSquareRight } from '@fortawesome/free-solid-svg-icons' import { toggleSidebarShow } from 'src/store/features/app' import { useMediaPredicate } from 'react-media-hook' -import { useGenericGetRequestQuery } from 'src/store/api/app' - +import { useLoadAlertsDashQuery } from 'src/store/api/app' const AppHeader = () => { const dispatch = useDispatch() const sidebarShow = useSelector((state) => state.app.sidebarShow) const currentTheme = useSelector((state) => state.app.currentTheme) const preferredTheme = useMediaPredicate('(prefers-color-scheme: dark)') ? 'impact' : 'cyberdrain' - const { - data: dashboard, - isLoading: isLoadingDash, - isSuccess: issuccessDash, - } = useGenericGetRequestQuery({ path: '/api/GetCippAlerts' }) + const { data: dashboard } = useLoadAlertsDashQuery() return ( <> diff --git a/src/store/api/app.js b/src/store/api/app.js index 5f366d65ee93..77cab1b67fc9 100644 --- a/src/store/api/app.js +++ b/src/store/api/app.js @@ -20,6 +20,15 @@ export const appApi = baseApi.injectEndpoints({ params: { localversion: localVersion }, }), }), + loadAlertsDash: builder.query({ + queryFn: (_args, _baseQueryApi, _options, baseQuery) => + baseQuery({ path: '/version_latest.txt' }).then(({ data }) => + baseQuery({ + path: '/api/GetCippAlerts', + params: { localversion: data.replace(/(\r\n|\n|\r)/gm, '') }, + }), + ), + }), loadDash: builder.query({ query: (localVersion) => ({ path: '/api/GetDashboard', @@ -114,6 +123,7 @@ export const { useLoadVersionRemoteQuery, useLoadVersionsQuery, useLoadDashQuery, + useLoadAlertsDashQuery, useExecPermissionsAccessCheckQuery, useLazyExecPermissionsAccessCheckQuery, useExecTenantsAccessCheckQuery, From 9bd050e17f7f024d5bd581d3d40284b0d3e12d46 Mon Sep 17 00:00:00 2001 From: DChorn-ANS <94991453+DChorn-ANS@users.noreply.github.com> Date: Thu, 20 Jul 2023 15:03:58 -0600 Subject: [PATCH 21/27] Connector and Transport Fixes Correcting links renaming constants to template value added titlebuttons --- .../connectors/AddConnectorTemplate.js | 10 +++++----- .../connectors/ConnectorList.js | 2 +- .../connectors/DeployConnector.js | 14 ++++++------- .../connectors/ListConnectorTemplates.js | 6 ++++-- .../transport/DeployTransport.js | 20 +++++++++---------- .../transport/ListTransportTemplates.js | 4 ++-- .../transport/TransportRules.js | 6 ++++++ 7 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/views/email-exchange/connectors/AddConnectorTemplate.js b/src/views/email-exchange/connectors/AddConnectorTemplate.js index 339ff4fd87d7..d2936d2f7352 100644 --- a/src/views/email-exchange/connectors/AddConnectorTemplate.js +++ b/src/views/email-exchange/connectors/AddConnectorTemplate.js @@ -5,17 +5,17 @@ import { CippContentCard, CippPage } from 'src/components/layout' import { RFFCFormTextarea } from 'src/components/forms' import { useLazyGenericPostRequestQuery } from 'src/store/api/app' -const TransportAddTemplate = () => { +const ConnectorAddTemplate = () => { const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const handleSubmit = async (values) => { // alert(JSON.stringify(values, null, 2)) // @todo hook this up - genericPostRequest({ path: '/api/AddTransportTemplate', values }) + genericPostRequest({ path: '/api/AddEXConnectorTemplate', values }) } return ( - + {postResults.isFetching && ( @@ -32,7 +32,7 @@ const TransportAddTemplate = () => { @@ -58,4 +58,4 @@ const TransportAddTemplate = () => { ) } -export default TransportAddTemplate +export default ConnectorAddTemplate diff --git a/src/views/email-exchange/connectors/ConnectorList.js b/src/views/email-exchange/connectors/ConnectorList.js index 488f2a88e24a..2b818a2734d5 100644 --- a/src/views/email-exchange/connectors/ConnectorList.js +++ b/src/views/email-exchange/connectors/ConnectorList.js @@ -143,7 +143,7 @@ const ConnectorList = () => { title="Connector List" titleButton={ <> - + } tenantSelector={true} diff --git a/src/views/email-exchange/connectors/DeployConnector.js b/src/views/email-exchange/connectors/DeployConnector.js index 9b3d03e6c4ad..fee824106b2b 100644 --- a/src/views/email-exchange/connectors/DeployConnector.js +++ b/src/views/email-exchange/connectors/DeployConnector.js @@ -31,7 +31,7 @@ Error.propTypes = { const requiredArray = (value) => (value && value.length !== 0 ? undefined : 'Required') const DeployConnectorTemplate = () => { - const [intuneGetRequest, intuneTemplates] = useLazyGenericGetRequestQuery() + const [EXConnectorGetRequest, EXConnectorTemplates] = useLazyGenericGetRequestQuery() const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const handleSubmit = async (values) => { @@ -51,7 +51,7 @@ const DeployConnectorTemplate = () => { {({ form }) => ( {(value) => { - let template = intuneTemplates.data.filter(function (obj) { + let template = EXConnectorTemplates.data.filter(function (obj) { return obj.GUID === value }) // console.log(template[0][set]) @@ -86,7 +86,7 @@ const DeployConnectorTemplate = () => { {(props) => ( {
    - {intuneTemplates.isUninitialized && - intuneGetRequest({ path: 'api/ListExConnectorTemplates' })} - {intuneTemplates.isSuccess && ( + {EXConnectorTemplates.isUninitialized && + EXConnectorGetRequest({ path: 'api/ListExConnectorTemplates' })} + {EXConnectorTemplates.isSuccess && ( ({ + values={EXConnectorTemplates.data?.map((template) => ({ value: template.GUID, label: template.name, }))} diff --git a/src/views/email-exchange/connectors/ListConnectorTemplates.js b/src/views/email-exchange/connectors/ListConnectorTemplates.js index b7c5abaca2cd..beba4bc003ef 100644 --- a/src/views/email-exchange/connectors/ListConnectorTemplates.js +++ b/src/views/email-exchange/connectors/ListConnectorTemplates.js @@ -8,6 +8,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { useLazyGenericGetRequestQuery } from 'src/store/api/app' import { CippPageList } from 'src/components/layout' import { ModalService } from 'src/components/utilities' +import { TitleButton } from 'src/components/buttons' const ConnectorListTemplates = () => { const tenant = useSelector((state) => state.app.currentTenant) @@ -15,7 +16,7 @@ const ConnectorListTemplates = () => { const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() const Offcanvas = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) - const handleDeleteIntuneTemplate = (apiurl, message) => { + const handleDeleteEXConnectorTemplate = (apiurl, message) => { ModalService.confirm({ title: 'Confirm', body:
    {message}
    , @@ -34,7 +35,7 @@ const ConnectorListTemplates = () => { variant="ghost" color="danger" onClick={() => - handleDeleteIntuneTemplate( + handleDeleteEXConnectorTemplate( `/api/RemoveExConnectorTemplate?ID=${row.GUID}`, 'Do you want to delete the template?', ) @@ -98,6 +99,7 @@ const ConnectorListTemplates = () => { )} } datatable={{ reportName: `${tenant?.defaultDomainName}-Groups`, path: '/api/ListExconnectorTemplates', diff --git a/src/views/email-exchange/transport/DeployTransport.js b/src/views/email-exchange/transport/DeployTransport.js index e8498ffa0022..e53991072fa2 100644 --- a/src/views/email-exchange/transport/DeployTransport.js +++ b/src/views/email-exchange/transport/DeployTransport.js @@ -31,7 +31,7 @@ Error.propTypes = { const requiredArray = (value) => (value && value.length !== 0 ? undefined : 'Required') const AddPolicy = () => { - const [intuneGetRequest, intuneTemplates] = useLazyGenericGetRequestQuery() + const [TransportGetRequest, TransportTemplates] = useLazyGenericGetRequestQuery() const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const handleSubmit = async (values) => { @@ -41,7 +41,7 @@ const AddPolicy = () => { values.TemplateType = values.Type genericPostRequest({ path: '/api/AddTransportRule', values: values }) } - /* eslint-disable react/prop-types */ + //* eslint-disable react/prop-types */ const WhenFieldChanges = ({ field, set }) => ( {( @@ -52,7 +52,7 @@ const AddPolicy = () => { {({ form }) => ( {(value) => { - let template = intuneTemplates.data.filter(function (obj) { + let template = TransportTemplates.data.filter(function (obj) { return obj.GUID === value }) // console.log(template[0][set]) @@ -73,7 +73,7 @@ const AddPolicy = () => { { {(props) => ( {
    - {intuneTemplates.isUninitialized && - intuneGetRequest({ path: 'api/ListTransportRulesTemplates' })} - {intuneTemplates.isSuccess && ( + {TransportTemplates.isUninitialized && + TransportGetRequest({ path: 'api/ListTransportRulesTemplates' })} + {TransportTemplates.isSuccess && ( ({ + values={TransportTemplates.data?.map((template) => ({ value: template.GUID, label: template.name, }))} @@ -160,7 +160,7 @@ const AddPolicy = () => { {!postResults.isSuccess && ( {(props) => { - /* eslint-disable react/prop-types */ + //* eslint-disable react/prop-types */ return ( <> diff --git a/src/views/email-exchange/transport/ListTransportTemplates.js b/src/views/email-exchange/transport/ListTransportTemplates.js index 3be990ce2db7..3a8cf38287bd 100644 --- a/src/views/email-exchange/transport/ListTransportTemplates.js +++ b/src/views/email-exchange/transport/ListTransportTemplates.js @@ -16,7 +16,7 @@ const TransportListTemplates = () => { const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() const Offcanvas = (row, rowIndex, formatExtraData) => { const [ocVisible, setOCVisible] = useState(false) - const handleDeleteIntuneTemplate = (apiurl, message) => { + const handleDeleteTransportTemplate = (apiurl, message) => { ModalService.confirm({ title: 'Confirm', body:
    {message}
    , @@ -35,7 +35,7 @@ const TransportListTemplates = () => { variant="ghost" color="danger" onClick={() => - handleDeleteIntuneTemplate( + handleDeleteTransportTemplate( `/api/RemoveTransportRuleTemplate?ID=${row.GUID}`, 'Do you want to delete the template?', ) diff --git a/src/views/email-exchange/transport/TransportRules.js b/src/views/email-exchange/transport/TransportRules.js index 9dab60d88d8a..ecb39e6d9af6 100644 --- a/src/views/email-exchange/transport/TransportRules.js +++ b/src/views/email-exchange/transport/TransportRules.js @@ -6,6 +6,7 @@ import { useSelector } from 'react-redux' import { CippPageList } from 'src/components/layout' import { CippActionsOffcanvas } from 'src/components/utilities' import { CellTip } from 'src/components/tables' +import { TitleButton } from 'src/components/buttons' const Offcanvas = (row, rowIndex, formatExtraData) => { const tenant = useSelector((state) => state.app.currentTenant) @@ -119,6 +120,11 @@ const TransportRulesList = () => { + + + } datatable={{ reportName: `${tenant?.defaultDomainName}-transport-rules-list`, path: '/api/ListTransportRules', From f565090bde9d98b0cc42d2c148eab5558e5c7c44 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Thu, 20 Jul 2023 23:59:53 +0200 Subject: [PATCH 22/27] updates to ext --- src/data/Extensions.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/data/Extensions.json b/src/data/Extensions.json index 523d9d249c96..194c0c6c153d 100644 --- a/src/data/Extensions.json +++ b/src/data/Extensions.json @@ -6,6 +6,11 @@ "forceSyncButton": false, "helpText": "This integration allows you to use to enable API access outside of CIPP usage. Requires Global Administrator permissions inside your tenant for activation of the API. These credentials will only be shown once.", "SettingOptions": [ + { + "type": "checkbox", + "name": "cippapi.ResetPassword", + "label": "Reset application secret - this will invalidate all existing API tokens" + }, { "type": "checkbox", "name": "cippapi.Enabled", From 31aa0d29ca113e2ebff619b486741200831e616c Mon Sep 17 00:00:00 2001 From: DChorn-ANS <94991453+DChorn-ANS@users.noreply.github.com> Date: Thu, 20 Jul 2023 21:47:18 -0600 Subject: [PATCH 23/27] New standard and padding adjustments Adding User submissions button standard Adjusting layout in Apply and List standards so that additional context appears under the switch Move post results --- src/data/standards.json | 14 + src/views/tenant/standards/ApplyStandard.js | 410 +++++++++-------- .../tenant/standards/ListAppliedStandards.js | 427 +++++++++--------- 3 files changed, 458 insertions(+), 393 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index 48d8f9aff018..db21afee83f6 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -366,6 +366,20 @@ }, "label": "Set Sharing Level for Default calendar" }, + { + "name": "standards.UserSubmissions.enable", + "cat": "Exchange", + "helpText": "This is the default helptext", + "addedComponent": null, + "label": "Enable the built-in Report button in Outlook" + }, + { + "name": "standards.UserSubmissions.disable", + "cat": "Exchange", + "helpText": "This is the default helptext", + "addedComponent": null, + "label": "Disable the built-in Report button in Outlook" + }, { "name": "standards.intuneDeviceReg.Enabled", "cat": "Intune", diff --git a/src/views/tenant/standards/ApplyStandard.js b/src/views/tenant/standards/ApplyStandard.js index 174e22980770..4b687d57cdcb 100644 --- a/src/views/tenant/standards/ApplyStandard.js +++ b/src/views/tenant/standards/ApplyStandard.js @@ -135,24 +135,28 @@ const ApplyStandard = () => { .filter((obj) => obj.cat === 'Global') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))}
    @@ -174,24 +178,28 @@ const ApplyStandard = () => { .filter((obj) => obj.cat === 'AAD') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))}
    @@ -213,24 +221,28 @@ const ApplyStandard = () => { .filter((obj) => obj.cat === 'Exchange') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))}
    @@ -252,24 +264,28 @@ const ApplyStandard = () => { .filter((obj) => obj.cat === 'Intune') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))}
    @@ -291,24 +307,28 @@ const ApplyStandard = () => { .filter((obj) => obj.cat === 'SharePoint') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))}
    @@ -331,102 +351,120 @@ const ApplyStandard = () => {
    - - - {intuneTemplates.isUninitialized && - intuneGetRequest({ path: 'api/ListIntuneTemplates' })} - {intuneTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.Displayname, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - - - - {transportTemplates.isUninitialized && - transportGetRequest({ path: 'api/ListTransportRulesTemplates' })} - {transportTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.name, - }))} - placeholder="Select a template" - label="Choose your Transport Rule templates to apply" - /> - )} - - - - {caTemplates.isUninitialized && caGetRequest({ path: 'api/ListCAtemplates' })} - {caTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.displayName, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - - - - {exConnectorTemplates.isUninitialized && - exConnectorGetRequest({ path: 'api/ListExConnectorTemplates' })} - {exConnectorTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.name, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - - - - {groupTemplates.isUninitialized && - groupGetRequest({ path: 'api/ListGroupTemplates' })} - {groupTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.Displayname, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - + + + + {intuneTemplates.isUninitialized && + intuneGetRequest({ path: 'api/ListIntuneTemplates' })} + {intuneTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.Displayname, + }))} + placeholder="Select a template" + label="Choose your Intune templates to apply" + /> + )} + + + + + + {transportTemplates.isUninitialized && + transportGetRequest({ path: 'api/ListTransportRulesTemplates' })} + {transportTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.name, + }))} + placeholder="Select a template" + label="Choose your Transport Rule templates to apply" + /> + )} + + + + + + {caTemplates.isUninitialized && caGetRequest({ path: 'api/ListCAtemplates' })} + {caTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.displayName, + }))} + placeholder="Select a template" + label="Choose your Conditional Access templates to apply" + /> + )} + + + + + + {exConnectorTemplates.isUninitialized && + exConnectorGetRequest({ path: 'api/ListExConnectorTemplates' })} + {exConnectorTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.name, + }))} + placeholder="Select a template" + label="Choose your Exchange Connector templates to apply" + /> + )} + + + + + + {groupTemplates.isUninitialized && + groupGetRequest({ path: 'api/ListGroupTemplates' })} + {groupTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.Displayname, + }))} + placeholder="Select a template" + label="Choose your Group templates to apply" + /> + )} + +

    diff --git a/src/views/tenant/standards/ListAppliedStandards.js b/src/views/tenant/standards/ListAppliedStandards.js index 35bf11859df1..26912a7b6d89 100644 --- a/src/views/tenant/standards/ListAppliedStandards.js +++ b/src/views/tenant/standards/ListAppliedStandards.js @@ -184,29 +184,28 @@ const ListAppliedStandards = () => { .map((item, key) => ( <> {console.log(item.name)} - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))} @@ -218,29 +217,28 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'AAD') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))} @@ -252,29 +250,28 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'Exchange') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))} @@ -286,29 +283,28 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'Intune') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))} @@ -320,29 +316,28 @@ const ListAppliedStandards = () => { .filter((obj) => obj.cat === 'SharePoint') .map((item, key) => ( <> - - {item.addedComponent && ( - - {item.addedComponent.type === 'Select' ? ( - - ) : ( - - )} - - )} + + + {item.addedComponent && ( + + {item.addedComponent.type === 'Select' ? ( + + ) : ( + + )} + + )} + ))} @@ -354,103 +349,121 @@ const ListAppliedStandards = () => {
    Templates

    - + + - - {intuneTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.Displayname, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - - + + {intuneTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.Displayname, + }))} + placeholder="Select a template" + label="Choose your intune templates to apply" + /> + )} + + + + - - {transportTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.name, - }))} - placeholder="Select a template" - label="Choose your Transport Rule templates to apply" - /> - )} - - + + {transportTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.name, + }))} + placeholder="Select a template" + label="Choose your Transport Rule templates to apply" + /> + )} + + + + - - {caTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.displayName, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - - + + {caTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.displayName, + }))} + placeholder="Select a template" + label="Choose your intune templates to apply" + /> + )} + + + + - - {exConnectorTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.name, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - - - - {groupTemplates.isSuccess && ( - ({ - value: template.GUID, - name: template.Displayname, - }))} - placeholder="Select a template" - label="Choose your intune templates to apply" - /> - )} - + + {exConnectorTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.name, + }))} + placeholder="Select a template" + label="Choose your intune templates to apply" + /> + )} + + + + + + {groupTemplates.isSuccess && ( + ({ + value: template.GUID, + name: template.Displayname, + }))} + placeholder="Select a template" + label="Choose your intune templates to apply" + /> + )} + + + {postResults.isSuccess && ( + {postResults.data.Results} + )} - + Save {postResults.isFetching && ( @@ -463,7 +476,7 @@ const ListAppliedStandards = () => { )} - + {listStandardResults[0].appliedBy && ( )} From 93f5b52fe99e12607920594719e4db62b7d53dc4 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:07:32 +0200 Subject: [PATCH 24/27] Improved List Licenses --- .../tenant/administration/ListLicences.js | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/views/tenant/administration/ListLicences.js b/src/views/tenant/administration/ListLicences.js index db9ed2917b90..f743975b9fba 100644 --- a/src/views/tenant/administration/ListLicences.js +++ b/src/views/tenant/administration/ListLicences.js @@ -1,7 +1,7 @@ import React from 'react' import { useSelector } from 'react-redux' import { CippPageList } from 'src/components/layout' -import { CellTip } from 'src/components/tables' +import { CellTip, cellBooleanFormatter, cellDateFormatter } from 'src/components/tables' const columns = [ { @@ -38,6 +38,39 @@ const columns = [ sortable: true, exportSelector: 'TotalLicenses', }, + { + name: 'Estimated Term', + selector: (row) => row['EstTerm'], + sortable: true, + exportSelector: 'EstTerm', + }, + { + name: 'Trial', + selector: (row) => row['Trial'], + sortable: true, + exportSelector: 'Trial', + cell: cellBooleanFormatter(), + }, + { + name: 'Time until renewal (days)', + selector: (row) => row['TimeUntilRenew'], + sortable: true, + exportSelector: 'TimeUntilRenew', + }, + { + name: 'Date Created', + selector: (row) => row['dateCreated'], + sortable: true, + exportSelector: 'dateCreated', + cell: cellDateFormatter(), + }, + { + name: 'Time until renewal (days)', + selector: (row) => row['dateExpires'], + sortable: true, + exportSelector: 'dateExpires', + cell: cellDateFormatter(), + }, ] const LicenseList = () => { From 3b2666a3fc045a9f2d3bc8da0ea234026fe32076 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:17:25 +0200 Subject: [PATCH 25/27] add alert for expiring licenses --- src/views/tenant/administration/AlertWizard.js | 5 +++++ src/views/tenant/administration/ListAlertsQueue.js | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/views/tenant/administration/AlertWizard.js b/src/views/tenant/administration/AlertWizard.js index aa8a2b07fd60..934e3f26ce2d 100644 --- a/src/views/tenant/administration/AlertWizard.js +++ b/src/views/tenant/administration/AlertWizard.js @@ -126,6 +126,11 @@ const AlertWizard = () => { + + { exportSelector: 'SharepointQuota', cell: cellBooleanFormatter(), }, + { + name: 'Expiring Licenses', + selector: (row) => row['ExpiringLicenses'], + sortable: true, + exportSelector: 'ExpiringLicenses', + cell: cellBooleanFormatter(), + }, { name: 'Actions', cell: Actions, From e92ddd19554c33057ee66788f38552841b1c7e42 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:24:13 +0200 Subject: [PATCH 26/27] version upped --- version_latest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version_latest.txt b/version_latest.txt index 240bba90696a..0be1fc7d2427 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -3.7.0 \ No newline at end of file +3.8.0 \ No newline at end of file From a8c9bb32e1bbbffc509e8c3cf972e4fd6d3afad4 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com> Date: Fri, 21 Jul 2023 18:24:46 +0200 Subject: [PATCH 27/27] version upped --- public/version_latest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/version_latest.txt b/public/version_latest.txt index 240bba90696a..0be1fc7d2427 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -3.7.0 \ No newline at end of file +3.8.0 \ No newline at end of file