Skip to content

Commit 4582484

Browse files
committed
feat: Enhance SharePoint site member role handling
Updates the Teams Share > SharePoint page to support role-aware membership actions. Adding a user now includes a required site role selector (Members/Owners/Visitors) with a default and resubmission enabled. Removing a user now pulls from `/api/ListSiteMembers` for the selected site, includes group/type metadata, and filters to unique Owners/Members/Visitors entries. The site members panel was also updated to pass `SiteUrl` and show clearer member columns (`Title`, `Email`, `Group`, `Type`, `IsSiteAdmin`).
1 parent 0bf544e commit 4582484

1 file changed

Lines changed: 63 additions & 36 deletions

File tree

  • src/pages/teams-share/sharepoint

src/pages/teams-share/sharepoint/index.js

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const VersionCleanupStatusBody = ({ statusApi }) => {
6969
}
7070

7171
const propertyItems = VERSION_CLEANUP_FIELDS.filter(
72-
(key) => progress?.[key] !== undefined && progress?.[key] !== '',
72+
(key) => progress?.[key] !== undefined && progress?.[key] !== ''
7373
).map((key) => ({
7474
label: VERSION_CLEANUP_LABELS[key],
7575
value: String(progress[key]),
@@ -104,12 +104,7 @@ const VersionCleanupStatusModal = ({ row, tenantFilter, drawerVisible, setDrawer
104104
})
105105

106106
return (
107-
<Dialog
108-
fullWidth
109-
maxWidth="sm"
110-
open={!!drawerVisible}
111-
onClose={() => setDrawerVisible(false)}
112-
>
107+
<Dialog fullWidth maxWidth="sm" open={!!drawerVisible} onClose={() => setDrawerVisible(false)}>
113108
<DialogTitle>
114109
Cleanup Job Status{siteRow?.displayName ? ` — ${siteRow.displayName}` : ''}
115110
</DialogTitle>
@@ -151,7 +146,7 @@ const Page = () => {
151146
URL: 'webUrl',
152147
SharePointType: 'rootWebTemplate',
153148
},
154-
confirmText: 'Select the User to add as a member.',
149+
confirmText: 'Select the User to add and the site role to add them to.',
155150
fields: [
156151
{
157152
type: 'autoComplete',
@@ -177,7 +172,21 @@ const Page = () => {
177172
showRefresh: true,
178173
},
179174
},
175+
{
176+
type: 'radio',
177+
name: 'Role',
178+
label: 'Site Role',
179+
options: [
180+
{ label: 'Members', value: 'Members' },
181+
{ label: 'Owners', value: 'Owners' },
182+
{ label: 'Visitors', value: 'Visitors' },
183+
],
184+
},
180185
],
186+
defaultvalues: {
187+
Role: 'Members',
188+
},
189+
allowResubmit: true,
181190
multiPost: false,
182191
},
183192
{
@@ -191,33 +200,50 @@ const Page = () => {
191200
URL: 'webUrl',
192201
SharePointType: 'rootWebTemplate',
193202
},
194-
confirmText: 'Select the User to remove as a member.',
195-
fields: [
196-
{
197-
type: 'autoComplete',
198-
name: 'user',
199-
label: 'Select User',
200-
multiple: false,
201-
creatable: false,
202-
api: {
203-
url: '/api/ListGraphRequest',
204-
data: {
205-
Endpoint: 'users',
206-
$select: 'id,displayName,userPrincipalName',
207-
$top: 999,
208-
$count: true,
209-
},
210-
queryKey: 'ListUsersAutoComplete',
211-
dataKey: 'Results',
212-
labelField: (user) => `${user.displayName} (${user.userPrincipalName})`,
213-
valueField: 'userPrincipalName',
214-
addedField: {
215-
id: 'id',
216-
},
217-
showRefresh: true,
218-
},
219-
},
220-
],
203+
confirmText: 'Select the user to remove from their site role.',
204+
children: ({ formHook, row }) => {
205+
const siteRow = Array.isArray(row) ? row[0] : row
206+
return (
207+
<CippFormComponent
208+
type="autoComplete"
209+
name="user"
210+
label="Select Member"
211+
multiple={false}
212+
creatable={false}
213+
formControl={formHook}
214+
validators={{ required: 'Please select a member' }}
215+
api={{
216+
url: '/api/ListSiteMembers',
217+
data: {
218+
SiteId: siteRow?.siteId,
219+
SiteUrl: siteRow?.webUrl,
220+
tenantFilter: siteRow?.Tenant ?? tenantFilter,
221+
},
222+
queryKey: `SiteMembersPicker-${siteRow?.siteId}`,
223+
dataKey: 'Results',
224+
labelField: (member) =>
225+
`${member.Title} (${member.UserPrincipalName}) — ${member.Group}`,
226+
valueField: 'UserPrincipalName',
227+
addedField: {
228+
Group: 'Group',
229+
Type: 'Type',
230+
},
231+
dataFilter: (options) =>
232+
options.filter(
233+
(option, index, all) =>
234+
option.value &&
235+
['Owners', 'Members', 'Visitors'].includes(option.addedFields?.Group) &&
236+
all.findIndex(
237+
(o) =>
238+
o.value === option.value &&
239+
o.addedFields?.Group === option.addedFields?.Group
240+
) === index
241+
),
242+
showRefresh: true,
243+
}}
244+
/>
245+
)
246+
},
221247
multiPost: false,
222248
},
223249
{
@@ -544,11 +570,12 @@ const Page = () => {
544570
url: '/api/ListSiteMembers',
545571
data: {
546572
SiteId: row.siteId,
573+
SiteUrl: row.webUrl,
547574
tenantFilter: tenantFilter,
548575
},
549576
dataKey: 'Results',
550577
}}
551-
simpleColumns={['fields.Title', 'fields.EMail', 'fields.IsSiteAdmin']}
578+
simpleColumns={['Title', 'Email', 'Group', 'Type', 'IsSiteAdmin']}
552579
/>
553580
),
554581
size: 'lg', // Make the offcanvas extra large

0 commit comments

Comments
 (0)