Skip to content

Commit bca20ff

Browse files
committed
Integrate with new Org member APIs
1 parent e0bf85f commit bca20ff

File tree

8 files changed

+69
-126
lines changed

8 files changed

+69
-126
lines changed

src/UnisonShare/AddOrgMemberModal.elm

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,10 @@ update appContext orgHandle currentMembers msg model =
112112
userHandles m =
113113
case m of
114114
OrgMember.UserMember { user } ->
115-
Just user.handle
116-
117-
_ ->
118-
Nothing
115+
user.handle
119116

120117
usersToIgnore =
121-
account.handle :: List.filterMap userHandles currentMembers
118+
account.handle :: List.map userHandles currentMembers
122119

123120
model_ =
124121
if Search.queryEquals q search then
@@ -158,7 +155,7 @@ update appContext orgHandle currentMembers msg model =
158155
AddMemberFinished res ->
159156
case ( model, res ) of
160157
( Saving member, Ok _ ) ->
161-
( Success member, Cmd.none, AddedMember (OrgMember.UserMember { user = member.user, roles = [ member.role ] }) )
158+
( Success member, Cmd.none, AddedMember (OrgMember.UserMember { user = member.user, role = member.role }) )
162159

163160
( Saving member, Err e ) ->
164161
( Failure e member, Cmd.none, NoOutMsg )
@@ -197,7 +194,7 @@ fetchUsers appContext query =
197194

198195
addMember : AppContext -> UserHandle -> PotentialOrgMember -> Cmd Msg
199196
addMember appContext orgHandle member =
200-
ShareApi.createOrgRoleAssignment orgHandle [ OrgMember.UserMember { user = member.user, roles = [ member.role ] } ]
197+
ShareApi.createOrgRoleMember orgHandle [ OrgMember.UserMember { user = member.user, role = member.role } ]
201198
|> HttpApi.toRequestWithEmptyResponse AddMemberFinished
202199
|> HttpApi.perform appContext.api
203200

src/UnisonShare/Api.elm

Lines changed: 16 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -251,95 +251,60 @@ createOrg owner name orgHandle isCommercial =
251251
}
252252

253253

254-
orgRoleAssignments : UserHandle -> Endpoint
255-
orgRoleAssignments orgHandle =
254+
orgRoleMembers : UserHandle -> Endpoint
255+
orgRoleMembers orgHandle =
256256
let
257257
handle =
258258
UserHandle.toUnprefixedString orgHandle
259259
in
260260
GET
261-
{ path = [ "orgs", handle, "roles" ]
261+
{ path = [ "orgs", handle, "members" ]
262262
, queryParams = []
263263
}
264264

265265

266-
createOrgRoleAssignment : UserHandle -> List OrgMember -> Endpoint
267-
createOrgRoleAssignment orgHandle members =
266+
createOrgRoleMember : UserHandle -> List OrgMember -> Endpoint
267+
createOrgRoleMember orgHandle members =
268268
let
269269
handle =
270270
UserHandle.toUnprefixedString orgHandle
271271

272-
toAssignment member =
272+
encodeMember member =
273273
case member of
274274
OrgMember.UserMember u ->
275275
Encode.object
276-
[ ( "subject"
277-
, Encode.object
278-
[ ( "kind", Encode.string "user" )
279-
, ( "id", Encode.string u.user.id )
280-
]
281-
)
282-
, ( "roles", Encode.list OrgRole.encode u.roles )
283-
]
284-
285-
OrgMember.TeamMember t ->
286-
Encode.object
287-
[ ( "subject"
288-
, Encode.object
289-
[ ( "kind", Encode.string "team" )
290-
, ( "id", Encode.string t.teamId )
291-
]
292-
)
293-
, ( "roles", Encode.list OrgRole.encode t.roles )
276+
[ ( "subject", Encode.string (UserHandle.toUnprefixedString u.user.handle) )
277+
, ( "role", OrgRole.encode u.role )
294278
]
295279

296280
body =
297281
Encode.object
298-
[ ( "role_assignments", Encode.list toAssignment members ) ]
282+
[ ( "members", Encode.list encodeMember members ) ]
299283
in
300284
POST
301-
{ path = [ "orgs", handle, "roles" ]
285+
{ path = [ "orgs", handle, "members" ]
302286
, queryParams = []
303287
, body = Http.jsonBody body
304288
}
305289

306290

307-
deleteOrgRoleAssignment : UserHandle -> OrgMember -> Endpoint
308-
deleteOrgRoleAssignment orgHandle member =
291+
deleteOrgRoleMember : UserHandle -> OrgMember -> Endpoint
292+
deleteOrgRoleMember orgHandle member =
309293
let
310294
handle =
311295
UserHandle.toUnprefixedString orgHandle
312296

313-
toAssignment member_ =
297+
toMember member_ =
314298
case member_ of
315299
OrgMember.UserMember u ->
316-
Encode.object
317-
[ ( "subject"
318-
, Encode.object
319-
[ ( "kind", Encode.string "user" )
320-
, ( "id", Encode.string u.user.id )
321-
]
322-
)
323-
, ( "roles", Encode.list OrgRole.encode u.roles )
324-
]
325-
326-
OrgMember.TeamMember t ->
327-
Encode.object
328-
[ ( "subject"
329-
, Encode.object
330-
[ ( "kind", Encode.string "team" )
331-
, ( "id", Encode.string t.teamId )
332-
]
333-
)
334-
, ( "roles", Encode.list OrgRole.encode t.roles )
335-
]
300+
Encode.string (UserHandle.toUnprefixedString u.user.handle)
336301

337302
body =
338303
Encode.object
339-
[ ( "role_assignments", Encode.list toAssignment [ member ] ) ]
304+
[ ( "members", Encode.list toMember [ member ] ) ]
340305
in
341306
DELETE
342-
{ path = [ "orgs", handle, "roles" ]
307+
{ path = [ "orgs", handle, "members" ]
343308
, queryParams = []
344309
, body = Http.jsonBody body
345310
}

src/UnisonShare/OrgMember.elm

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,27 @@ module UnisonShare.OrgMember exposing (..)
22

33
import Json.Decode as Decode exposing (string)
44
import Json.Decode.Extra exposing (when)
5-
import Json.Decode.Pipeline exposing (required, requiredAt)
5+
import Json.Decode.Pipeline exposing (required)
66
import Lib.Decode.Helpers exposing (failInvalid)
77
import UnisonShare.OrgRole as OrgRole exposing (OrgRole)
88
import UnisonShare.User as User exposing (UserSummaryWithId)
99

1010

11-
type OrgMember
12-
= UserMember { roles : List OrgRole, user : UserSummaryWithId }
13-
| TeamMember { roles : List OrgRole, teamId : String }
11+
type
12+
OrgMember
13+
-- | TeamMember { role : OrgRole, teamId : String }
14+
= UserMember { role : OrgRole, user : UserSummaryWithId }
1415

1516

1617
decodeOrgUserMember : Decode.Decoder OrgMember
1718
decodeOrgUserMember =
1819
let
19-
make roles user =
20-
UserMember { roles = roles, user = user }
20+
make role user =
21+
UserMember { role = role, user = user }
2122
in
2223
Decode.succeed make
23-
|> required "roles" (Decode.list OrgRole.decode)
24-
|> requiredAt [ "subject", "data" ] User.decodeSummaryWithId
25-
26-
27-
decodeOrgTeamMember : Decode.Decoder OrgMember
28-
decodeOrgTeamMember =
29-
let
30-
make roles teamId =
31-
TeamMember { roles = roles, teamId = teamId }
32-
in
33-
Decode.succeed make
34-
|> required "roles" (Decode.list OrgRole.decode)
35-
|> requiredAt [ "subject", "data", "teamId" ] Decode.string
24+
|> required "role" OrgRole.decode
25+
|> required "subject" User.decodeSummaryWithId
3626

3727

3828
whenPathIs : List String -> String -> Decode.Decoder a -> Decode.Decoder a
@@ -42,13 +32,8 @@ whenPathIs path val =
4232

4333
decodeMaybe : Decode.Decoder (Maybe OrgMember)
4434
decodeMaybe =
45-
let
46-
whenKindIs kind =
47-
whenPathIs [ "subject", "kind" ] kind
48-
in
4935
Decode.oneOf
50-
[ whenKindIs "user" (Decode.map Just decodeOrgUserMember)
51-
, whenKindIs "team" (Decode.map Just decodeOrgTeamMember)
36+
[ Decode.map Just decodeOrgUserMember
5237
, Decode.succeed Nothing
5338
]
5439

src/UnisonShare/Page/OrgPeoplePage.elm

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,6 @@ update appContext orgHandle msg model =
110110
OrgMember.UserMember { user } ->
111111
not (UserHandle.equals user.handle handle)
112112

113-
_ ->
114-
True
115-
116113
members =
117114
RemoteData.map
118115
(List.filter withoutRemovedMember)
@@ -180,16 +177,16 @@ update appContext orgHandle msg model =
180177

181178
fetchMembers : AppContext -> UserHandle -> Cmd Msg
182179
fetchMembers appContext orgHandle =
183-
ShareApi.orgRoleAssignments orgHandle
180+
ShareApi.orgRoleMembers orgHandle
184181
|> HttpApi.toRequest
185-
(Decode.field "role_assignments" OrgMember.decodeList)
182+
(Decode.field "members" OrgMember.decodeList)
186183
(RemoteData.fromResult >> FetchMembersFinished)
187184
|> HttpApi.perform appContext.api
188185

189186

190187
removeMember : AppContext -> UserHandle -> UserHandle -> OrgMember -> Cmd Msg
191188
removeMember appContext orgHandle memberHandle member =
192-
ShareApi.deleteOrgRoleAssignment orgHandle member
189+
ShareApi.deleteOrgRoleMember orgHandle member
193190
|> HttpApi.toRequestWithEmptyResponse (RemoveMemberFinished memberHandle)
194191
|> HttpApi.perform appContext.api
195192

@@ -206,11 +203,11 @@ viewRole role =
206203
|> Tooltip.view (role |> OrgRole.toString |> text)
207204

208205

209-
viewUserMember : ConfirmDeletes -> Bool -> { user : UserSummaryWithId, roles : List OrgRole } -> Html Msg
210-
viewUserMember deletes isLastUser ({ user, roles } as member) =
206+
viewUserMember : ConfirmDeletes -> Bool -> { user : UserSummaryWithId, role : OrgRole } -> Html Msg
207+
viewUserMember deletes isLastUser ({ user, role } as member) =
211208
let
212209
canRemove =
213-
not (List.member OrgRole.Owner roles) && not isLastUser
210+
OrgRole.Owner /= role && not isLastUser
214211

215212
remove =
216213
if canRemove then
@@ -236,7 +233,7 @@ viewUserMember deletes isLastUser ({ user, roles } as member) =
236233
div [ class "member" ]
237234
[ div [ class "member_profile-snippet" ]
238235
[ ProfileSnippet.profileSnippet user |> ProfileSnippet.view ]
239-
, div [ class "member_role" ] (roles |> List.map viewRole |> List.intersperse (text ", "))
236+
, div [ class "member_role" ] [ viewRole role ]
240237
, div [ class "member_remove" ] [ remove ]
241238
]
242239

@@ -247,10 +244,6 @@ viewMember deletes isLastUser member =
247244
OrgMember.UserMember m ->
248245
viewUserMember deletes isLastUser m
249246

250-
OrgMember.TeamMember _ ->
251-
-- TODO: Teams are not yet fully supported
252-
UI.nothing
253-
254247

255248
viewContent : Model -> List (Html Msg)
256249
viewContent model =

src/css/confirm-delete.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,14 @@
55
font-size: var(--font-size-small);
66
align-items: center;
77
}
8+
9+
.confirm-delete .status-banner {
10+
font-size: var(--font-size-small);
11+
gap: 0.25rem;
12+
padding: 0.2rem 0.5rem;
13+
padding-left: 0.25rem;
14+
}
15+
.confirm-delete .status-indicator.status-indicator_regular {
16+
--c-size_status-indicator: 1rem;
17+
--c-size_status-indicator_icon: 0.75rem;
18+
}

src/css/unison-share/page/org-people-page.css

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
.org-people-page .member_profile-snippet {
2626
width: 50%;
2727
}
28-
.org-people-page .member_role,
28+
2929
.org-people-page .member_remove {
30-
width: 25%;
30+
width: 21rem;
3131
}
3232

3333
.org-people-page .member_role {
@@ -87,13 +87,9 @@
8787
width: 8rem;
8888
text-align: right;
8989
}
90-
91-
.org-people-page .member_remove {
92-
width: 2rem;
93-
}
9490
}
9591

96-
@container org-people-members (max-width: 500px) {
92+
@container org-people-members (max-width: 750px) {
9793
.org-people-page .members_list {
9894
gap: 2rem;
9995
}

tests/e2e/OrgPeoplePage.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ test.describe("without being signed in", () => {
1414
test("can *NOT* view the org people page", async ({ page }) => {
1515
const orgHandle = "@unison";
1616
await API.getOrgProfile(page, orgHandle);
17-
await API.getOrgRoleAssignments_(page, orgHandle, { status: 403 });
17+
await API.getOrgRoleMembers_(page, orgHandle, { status: 403 });
1818

1919
const response = await page.goto(
2020
`http://localhost:1234/${orgHandle}/p/people`,
@@ -37,7 +37,7 @@ test.describe("without org:manage permission", () => {
3737
test("can *NOT* view the org people page", async ({ page }) => {
3838
const orgHandle = "@unison";
3939
await API.getOrgProfile(page, orgHandle, { permissions: ["org:view"] });
40-
await API.getOrgRoleAssignments_(page, orgHandle, { status: 403 });
40+
await API.getOrgRoleMembers_(page, orgHandle, { status: 403 });
4141

4242
const response = await page.goto(
4343
`http://localhost:1234/${orgHandle}/p/people`,
@@ -60,7 +60,7 @@ test.describe("with org:manage permission", () => {
6060
test("can view the org people page", async ({ page }) => {
6161
const orgHandle = "@unison";
6262
await API.getOrgProfile(page, orgHandle, { permissions: ["org:manage"] });
63-
await API.getOrgRoleAssignments(page, orgHandle);
63+
await API.getOrgRoleMembers(page, orgHandle);
6464

6565
const response = await page.goto(
6666
`http://localhost:1234/${orgHandle}/p/people`,

0 commit comments

Comments
 (0)