|
8 | 8 | --> |
9 | 9 |
|
10 | 10 | <script lang="ts"> |
| 11 | + import { createEventDispatcher } from "svelte"; |
11 | 12 | import { writable } from "svelte/store"; |
12 | 13 | import toast from "svelte-french-toast"; |
13 | 14 | import MultiFieldFormModal from "./MultiFieldFormModal.svelte"; |
|
21 | 22 | import ErrorMessages from "./forms/ErrorMessages.svelte"; |
22 | 23 | import getCommonToastOptions from "./utilities/getCommonToastOptions"; |
23 | 24 | import requestApi from "../api/requestApi"; |
| 25 | + import { organization } from "../userData/store"; |
| 26 | + import type { |
| 27 | + OmitTimestampedResourceAttributes, |
| 28 | + UserOrganization, |
| 29 | + } from "../api/resourceObjects"; |
24 | 30 |
|
25 | 31 | let email = ""; |
| 32 | + let firstName = ""; |
26 | 33 | let jobTitle = ""; |
27 | | - let name = ""; |
| 34 | + let lastName = ""; |
28 | 35 | function onFormReset() { |
29 | 36 | email = ""; |
| 37 | + firstName = ""; |
30 | 38 | jobTitle = ""; |
31 | | - name = ""; |
| 39 | + lastName = ""; |
32 | 40 | } |
33 | 41 |
|
34 | 42 | const selectedRole = writable<"standard" | "admin">("standard"); |
35 | 43 |
|
| 44 | + const dispatch = createEventDispatcher(); |
| 45 | +
|
36 | 46 | const handleOnSubmit = async () => { |
37 | | - await requestApi("userorganizations/request_invite", { |
38 | | - body: { |
39 | | - email, |
| 47 | + if (!$organization) { |
| 48 | + throw new Error("No organization"); |
| 49 | + } |
| 50 | +
|
| 51 | + const userOrganization: Omit< |
| 52 | + OmitTimestampedResourceAttributes<UserOrganization>, |
| 53 | + "id" |
| 54 | + > = { |
| 55 | + attributes: { |
| 56 | + inviteUserEmail: email, |
| 57 | + inviteUserFirstName: firstName, |
| 58 | + inviteUserLastName: lastName, |
40 | 59 | jobTitle, |
41 | | - name, |
42 | 60 | role: $selectedRole, |
43 | 61 | }, |
44 | | - isNotJSONAPI: true, |
| 62 | + relationships: { |
| 63 | + organization: { |
| 64 | + data: { |
| 65 | + id: $organization.id, |
| 66 | + type: "organization", |
| 67 | + }, |
| 68 | + }, |
| 69 | + user: { |
| 70 | + data: null, |
| 71 | + }, |
| 72 | + }, |
| 73 | + type: "userOrganization", |
| 74 | + }; |
| 75 | +
|
| 76 | + await requestApi("userorganizations/actions/invite", { |
| 77 | + body: { |
| 78 | + data: userOrganization, |
| 79 | + }, |
45 | 80 | method: "POST", |
46 | 81 | }); |
47 | 82 |
|
| 83 | + dispatch("invited"); |
| 84 | +
|
48 | 85 | toast.success("User invited!", getCommonToastOptions()); |
49 | 86 | }; |
50 | 87 | </script> |
51 | 88 |
|
52 | 89 | <MultiFieldFormModal |
53 | | - description="NOTE: invite emails can take up to a day to arrive." |
| 90 | + decideIfGeneralErrorsAreUnexpected={(errorMessages) => |
| 91 | + !errorMessages.every((errorMessage) => |
| 92 | + errorMessage.includes("already exists"), |
| 93 | + )} |
54 | 94 | schema={yup.object({ |
55 | 95 | email: commonSchema.email().label("Email"), |
56 | | - jobTitle: yup.string().label("jobTitle"), |
57 | | - name: yup.string().label("Full name").required(), |
| 96 | + firstName: yup.string().label("First name").required(), |
| 97 | + jobTitle: yup.string().label("Job title"), |
| 98 | + lastName: yup.string().label("Last name").required(), |
58 | 99 | role: yup.string().label("Role").required(), |
59 | 100 | })} |
60 | 101 | on:formReset={onFormReset} |
|
91 | 132 | aria-describedby={ariaDescribedby} |
92 | 133 | bind:value={email} |
93 | 134 | class={_class} |
94 | | - name={_name} |
95 | 135 | {id} |
| 136 | + name={_name} |
96 | 137 | required |
97 | 138 | {theme} |
98 | 139 | type="email" |
|
101 | 142 |
|
102 | 143 | <Field |
103 | 144 | {form} |
104 | | - labelText="Full name" |
105 | | - name="name" |
| 145 | + labelText="First name" |
| 146 | + name="firstName" |
106 | 147 | let:_class |
107 | 148 | let:_name |
108 | 149 | let:ariaDescribedby |
|
112 | 153 | > |
113 | 154 | <TextInput |
114 | 155 | aria-describedby={ariaDescribedby} |
115 | | - bind:value={name} |
| 156 | + bind:value={firstName} |
116 | 157 | class={_class} |
| 158 | + {id} |
117 | 159 | name={_name} |
| 160 | + {theme} |
| 161 | + required |
| 162 | + type="text" |
| 163 | + /> |
| 164 | + </Field> |
| 165 | + |
| 166 | + <Field |
| 167 | + {form} |
| 168 | + labelText="Last name" |
| 169 | + name="lastName" |
| 170 | + let:_class |
| 171 | + let:_name |
| 172 | + let:ariaDescribedby |
| 173 | + let:id |
| 174 | + let:theme |
| 175 | + theme="dark" |
| 176 | + > |
| 177 | + <TextInput |
| 178 | + aria-describedby={ariaDescribedby} |
| 179 | + bind:value={lastName} |
| 180 | + class={_class} |
118 | 181 | {id} |
| 182 | + name={_name} |
119 | 183 | {theme} |
120 | 184 | required |
121 | 185 | type="text" |
|
137 | 201 | aria-describedby={ariaDescribedby} |
138 | 202 | bind:value={$selectedRole} |
139 | 203 | class={_class} |
140 | | - name={_name} |
141 | 204 | {id} |
| 205 | + name={_name} |
142 | 206 | options={["admin", "standard"].map((role) => ({ |
143 | 207 | label: prettifyRole(role), |
144 | 208 | value: role, |
|
163 | 227 | aria-describedby={ariaDescribedby} |
164 | 228 | bind:value={jobTitle} |
165 | 229 | class={_class} |
166 | | - name={_name} |
167 | 230 | {id} |
| 231 | + name={_name} |
168 | 232 | {theme} |
169 | 233 | type="text" |
170 | 234 | /> |
|
0 commit comments