|
1 | 1 | <script lang="ts"> |
2 | 2 | import { stores } from "@sapper/app"; |
3 | 3 | import type { Membership } from "@koj/types"; |
4 | | - import { can } from "../../../api"; |
| 4 | + import { api, can } from "../../../api"; |
5 | 5 | import DataTable from "../../../components/DataTable.svelte"; |
6 | 6 | import DeleteModal from "../../../components/DeleteModal.svelte"; |
7 | 7 | import GroupRecord from "../../../components/Table/GroupRecord.svelte"; |
| 8 | + import Form from "../../../components/Form.svelte"; |
| 9 | + import { users } from "../../../stores"; |
| 10 | + import Tag from "../../../components/Tag.svelte"; |
8 | 11 |
|
9 | 12 | const { page } = stores(); |
10 | 13 | const { slug } = $page.params; |
11 | 14 | const primaryKeyType = "id"; |
12 | 15 | let data: Membership[] = []; |
13 | 16 | let deleteActiveKey: number | undefined = undefined; |
| 17 | +
|
| 18 | + const updateData = (item: any) => { |
| 19 | + if (data.find((i) => i[primaryKeyType] === item[primaryKeyType])) |
| 20 | + data = data.map((i) => { |
| 21 | + if (i[primaryKeyType] === item[primaryKeyType]) return item; |
| 22 | + return i; |
| 23 | + }); |
| 24 | + else data = [...data, item]; |
| 25 | + }; |
| 26 | +
|
| 27 | + const add = async (body: { name: string; scopes: string[] }) => { |
| 28 | + const result = await api<any>({ |
| 29 | + method: "POST", |
| 30 | + url: `/users/${slug}/memberships`, |
| 31 | + body, |
| 32 | + }); |
| 33 | + users.update((items) => { |
| 34 | + items = items.map((i) => { |
| 35 | + if (i.details.id === slug) return { ...i, memberships: [...i.memberships, result] }; |
| 36 | + return i; |
| 37 | + }); |
| 38 | + return items; |
| 39 | + }); |
| 40 | + updateData(result); |
| 41 | + }; |
14 | 42 | </script> |
15 | 43 |
|
16 | 44 | <svelte:head> |
|
25 | 53 | titleKey="name" |
26 | 54 | text="These are the groups associated with this user." |
27 | 55 | endpoint={`/users/${slug}/memberships`} |
28 | | - headers={['Group']} |
| 56 | + headers={['Group', 'Role']} |
29 | 57 | onData={(val) => (data = val)} |
30 | 58 | {primaryKeyType} |
31 | 59 | filters={[{ title: 'Name', name: 'name', type: 'string' }, { title: 'ID', name: primaryKeyType, type: 'string' }, { title: 'Created at', name: 'createdAt', type: 'datetime' }, { title: 'Updated at', name: 'updatedAt', type: 'datetime' }]}> |
32 | 60 | <td class="px-7 py-4 whitespace-nowrap"> |
33 | 61 | <GroupRecord item={item.group} /> |
34 | 62 | </td> |
| 63 | + <td class="px-7 py-4 whitespace-nowrap"> |
| 64 | + {#if item.role === 'OWNER'} |
| 65 | + <Tag href={`/users/${slug}/groups?q=${encodeURIComponent('role: OWNER')}`} color="blue"> |
| 66 | + Owner |
| 67 | + </Tag> |
| 68 | + {:else if item.role === 'ADMIN'} |
| 69 | + <Tag href={`/users/${slug}/groups?q=${encodeURIComponent('role: ADMIN')}`} color="indigo"> |
| 70 | + Admin |
| 71 | + </Tag> |
| 72 | + {:else if item.role === 'MEMBER'} |
| 73 | + <Tag href={`/users/${slug}/groups?q=${encodeURIComponent('role: MEMBER')}`} color="green"> |
| 74 | + Member |
| 75 | + </Tag> |
| 76 | + {:else} |
| 77 | + <Tag |
| 78 | + href={`/users/${slug}/groups?q=${encodeURIComponent(`role: ${item.role}`)}`} |
| 79 | + color="gray"> |
| 80 | + ${item.role} |
| 81 | + </Tag> |
| 82 | + {/if} |
| 83 | + </td> |
35 | 84 | <td class="px-7 py-4 whitespace-nowrap text-right text-sm font-medium"> |
36 | | - {#if can(`email:write-info-${item[primaryKeyType]}`)} |
| 85 | + {#if can(`user-${slug}:delete-membership-${item[primaryKeyType]}`)} |
37 | 86 | <button |
38 | 87 | aria-label="Leave" |
39 | 88 | data-balloon-pos="up" |
|
54 | 103 | </td> |
55 | 104 | </DataTable> |
56 | 105 |
|
| 106 | +<div class="p-7"> |
| 107 | + <Form |
| 108 | + title="Add group" |
| 109 | + text="Create another group to invite your team to." |
| 110 | + items={[{ name: 'name', label: 'Name', required: true }]} |
| 111 | + submitText="Create group" |
| 112 | + onSubmit={add} /> |
| 113 | +</div> |
| 114 | + |
57 | 115 | {#if deleteActiveKey} |
58 | 116 | <DeleteModal |
59 | 117 | title="Leave group" |
|
0 commit comments