Skip to content

Commit 833dba9

Browse files
committed
v1.5.0 Release
1 parent a54c205 commit 833dba9

6 files changed

Lines changed: 51 additions & 27 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ All notable changes to this project are documented here.
44

55
---
66

7-
## [Unreleased]
7+
## [1.5.0] — 2026-07-13
88

99
### Fixed
1010

@@ -77,6 +77,10 @@ All notable changes to this project are documented here.
7777

7878
### Changed
7979

80+
- **Permissions Report — export buttons moved to the top of the results**
81+
With large scans producing thousands of rows, the "Export to Excel"/"Export
82+
to CSV" buttons at the bottom of the table required a long scroll to reach.
83+
They now appear directly below the results summary badges instead.
8084
- User-identifying diagnostic logging in the User Access scan is now gated
8185
behind `localStorage.setItem('smartPermissionsDebug', '1')` instead of
8286
always writing to the browser console.

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Interactively browse a document library tree and inspect live permissions on any
2727
| **Three folder indicators** | Circle arrow = unique permissions below; triangle arrow = external access below; both together = both |
2828
| **External user email decoding** | Decoded email shown beneath the display name in the permissions panel |
2929
| **Tree filters** | Toggle to show only unique-permission items or only items with external user access |
30+
| **Tenant-wide access warnings** | "Everyone" and "Everyone except external users" claims are highlighted in red as tenant-wide access instead of appearing as an ordinary group row |
3031

3132
![Permissions Explorer with a folder selected and the permissions panel showing group members](docs/screenshots/05_explorer.png)
3233

@@ -50,6 +51,8 @@ Scan a site's lists, libraries, folders, and files and export a color-coded Exce
5051
| **Excel export** | In-browser `.xlsx` workbook with color-coded permission levels and an Access Via column |
5152
| **CSV export** | Plain-text alternative for scripted processing |
5253
| **Progress bar and timer** | Concurrent, throttling-aware scan with elapsed timer and live item count |
54+
| **Tenant-wide access warnings** | "Everyone" and "Everyone except external users" claims are highlighted in red as tenant-wide access instead of appearing as an ordinary group row |
55+
| **Scan-incomplete flag** | Items that couldn't be fully read after retries (transient network/throttling errors) are flagged instead of silently shown as inheriting their parent's permissions |
5356

5457
![Permissions Report configuration screen](docs/screenshots/02_report_config.png)
5558

@@ -70,6 +73,7 @@ Look up any user and see every location they can access on a site, with their ex
7073
| **Sortable results table** | Click any column header to sort |
7174
| **Export to Excel / CSV** | Download the results for any user |
7275
| **Scan history** | Past scans persist in IndexedDB — re-export without re-scanning |
76+
| **Honest M365 group ownership checks** | If a Graph permission error prevents confirming M365 Group ownership, the result is shown as "Graph permission required" rather than a false Member/Owner result |
7377

7478
![User Access results showing accessible locations for a selected user](docs/screenshots/07_user_access_complete.png)
7579

@@ -260,6 +264,8 @@ sharepoint/solution/
260264

261265
**"The scan takes a very long time"** — User Access and Permissions Report scan time scales with the number of unique permission assignments on the site. Use the scan depth and folder depth settings in the Permissions Report to limit scope, or run the scan against a specific library.
262266

267+
**"I need more detail on a User Access result"** — Run `localStorage.setItem('smartPermissionsDebug', '1')` in the browser console, then re-run the scan and check the console for step-by-step diagnostic logging. Remove the key (or set it to any other value) to turn logging back off.
268+
263269
---
264270

265271
## Limitations

USER-GUIDE.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# SharePoint Smart Permissions — User Guide
22

3-
**Version 1.4.0**
3+
**Version 1.5.0**
44
**Applies to:** SharePoint Online
55

66
---
@@ -150,6 +150,8 @@ The results table appears below the filter bar after every scan:
150150
- A **Hidden from search** badge marks libraries an admin has excluded from search indexing (NoCrawl) — worth a closer look during an audit, since that setting is sometimes used to keep sensitive content out of sight.
151151
- The filter box and the **Unique permissions only** / **External users only** checkboxes filter the table and the exports together.
152152
- Large results paginate at 200 rows — click **Load more** for the rest.
153+
- **"Everyone" and "Everyone except external users"** claims are highlighted in red as tenant-wide access, both in the table and in the Excel export, so a broad grant doesn't blend in as an ordinary group row.
154+
- If a temporary network or throttling error prevents an item from being fully read even after retries, it's flagged with a warning banner instead of being silently shown with its parent's permissions. Re-run the scan to retry those items.
153155

154156
### Understanding the Excel Export
155157

@@ -215,6 +217,8 @@ When you select an item, the right panel shows:
215217

216218
Color-coded permission badges: **red** for Full Control, **amber** for Edit/Contribute, **green** for Read/View.
217219

220+
**"Everyone" and "Everyone except external users"** claims are highlighted in red as tenant-wide access rather than appearing as an ordinary group row, since a grant to either of these claims effectively opens the item to the whole organization (or the whole internet, for external sharing links).
221+
218222
### Expand Group Members
219223

220224
Check **Expand group members** in the options bar to expand each SharePoint group, Security group, or M365 group and show the individual users inside it. This is useful when you need to see exactly which people are covered by a group assignment. Note: expanding Security groups and M365 groups requires the optional `GroupMember.Read.All` Graph permission to be approved in your tenant — SharePoint groups expand without it.
@@ -338,6 +342,8 @@ Permission level badges use the same color coding as the Permissions Explorer (r
338342

339343
When a user has site-level access, an information banner appears explaining that only locations with **unique permission assignments** are listed — all other content is accessible through the site-level permission shown at the top of the list.
340344

345+
On a Microsoft 365 Group-connected site, if a Graph permission error prevents the tool from confirming whether the user is an Owner or Member of the group, the result shows **"Graph permission required"** rather than guessing. Approving the optional `GroupMember.Read.All` Graph permission (see [Expand Group Members](#expand-group-members)) resolves this.
346+
341347
### Scan History
342348

343349
Every completed scan is saved automatically to a local history log stored in your browser. Click the **History** button in the header to open the history panel, which shows a table of past scans with the date, user, site, and accessible location count. From the history panel you can:
@@ -567,6 +573,11 @@ A: Yes. The tool communicates only with your own SharePoint environment via the
567573
- Ensure **Include system and hidden libraries** is unchecked in Settings.
568574
- These libraries are excluded by URL pattern as well as their metadata flags. If they still appear, check that you are running the latest version of the web part package.
569575

576+
### A User Access result looks wrong and you need more detail
577+
578+
- Open the browser console and run `localStorage.setItem('smartPermissionsDebug', '1')`, then re-run the scan. Step-by-step diagnostic messages for that user's access resolution will appear in the console.
579+
- Set the key to any other value (or remove it) to turn this logging back off.
580+
570581
---
571582

572583
## Administrator: Tenant-Wide Provisioning

config/package-solution.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"solution": {
44
"name": "Smart Permissions",
55
"id": "a2f2de50-4e8b-4f3c-9abc-ef0123456789",
6-
"version": "1.4.0.0",
6+
"version": "1.5.0.0",
77
"includeClientSideAssets": true,
88
"skipFeatureDeployment": true,
99
"isDomainIsolated": false,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sharepoint-smart-permissions-webpart",
3-
"version": "1.4.0",
3+
"version": "1.5.0",
44
"private": true,
55
"engines": {
66
"node": ">=18.17.1 <19.0.0"

src/webparts/smartPermissions/components/PermissionsReportView.tsx

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,32 @@ export const PermissionsReportView: React.FC<PermissionsReportViewProps> = ({
10361036
</Badge>
10371037
</div>
10381038

1039+
{/* Export buttons live here (top of the results) as well as at the
1040+
bottom of the table — with potentially thousands of rows, requiring
1041+
a full scroll just to export defeats the point of a quick export. */}
1042+
<div className={styles.row}>
1043+
<Button
1044+
appearance="primary"
1045+
icon={<DocumentArrowDown24Regular />}
1046+
onClick={handleExport}
1047+
disabled={isExporting || exportableEntries.length === 0}
1048+
>
1049+
{isExporting
1050+
? 'Generating Excel…'
1051+
: exportableEntries.length < entries.length
1052+
? `Export ${exportableEntries.length} filtered rows`
1053+
: 'Export to Excel'}
1054+
</Button>
1055+
<Button
1056+
appearance="secondary"
1057+
icon={<DocumentArrowDown24Regular />}
1058+
onClick={handleExportCsv}
1059+
disabled={isExporting || exportableEntries.length === 0}
1060+
>
1061+
Export to CSV
1062+
</Button>
1063+
</div>
1064+
10391065
{roleAssignmentsDenied && (
10401066
<MessageBar intent="warning">
10411067
<MessageBarBody>
@@ -1208,29 +1234,6 @@ export const PermissionsReportView: React.FC<PermissionsReportViewProps> = ({
12081234
)}
12091235
</>
12101236
)}
1211-
1212-
<div className={styles.row}>
1213-
<Button
1214-
appearance="primary"
1215-
icon={<DocumentArrowDown24Regular />}
1216-
onClick={handleExport}
1217-
disabled={isExporting || exportableEntries.length === 0}
1218-
>
1219-
{isExporting
1220-
? 'Generating Excel…'
1221-
: exportableEntries.length < entries.length
1222-
? `Export ${exportableEntries.length} filtered rows`
1223-
: 'Export to Excel'}
1224-
</Button>
1225-
<Button
1226-
appearance="secondary"
1227-
icon={<DocumentArrowDown24Regular />}
1228-
onClick={handleExportCsv}
1229-
disabled={isExporting || exportableEntries.length === 0}
1230-
>
1231-
Export to CSV
1232-
</Button>
1233-
</div>
12341237
</div>
12351238
)}
12361239
</div>}

0 commit comments

Comments
 (0)