@kelpie/ui 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/dist/api/resources/attendances.d.ts +13 -0
  2. package/dist/api/resources/attendances.d.ts.map +1 -0
  3. package/dist/api/resources/attendances.js +34 -0
  4. package/dist/api/resources/attendances.js.map +1 -0
  5. package/dist/api/resources/eventAssociations.d.ts +12 -0
  6. package/dist/api/resources/eventAssociations.d.ts.map +1 -0
  7. package/dist/api/resources/eventAssociations.js +25 -0
  8. package/dist/api/resources/eventAssociations.js.map +1 -0
  9. package/dist/api/resources/events.d.ts +17 -0
  10. package/dist/api/resources/events.d.ts.map +1 -0
  11. package/dist/api/resources/events.js +40 -0
  12. package/dist/api/resources/events.js.map +1 -0
  13. package/dist/api/resources/handbookSeed.d.ts +11 -0
  14. package/dist/api/resources/handbookSeed.d.ts.map +1 -0
  15. package/dist/api/resources/handbookSeed.js +43 -0
  16. package/dist/api/resources/handbookSeed.js.map +1 -0
  17. package/dist/api/resources/moduleSettings.d.ts +10 -0
  18. package/dist/api/resources/moduleSettings.d.ts.map +1 -1
  19. package/dist/api/resources/moduleSettings.js +21 -0
  20. package/dist/api/resources/moduleSettings.js.map +1 -1
  21. package/dist/api/resources/planItems.d.ts +4 -4
  22. package/dist/api/resources/planItems.d.ts.map +1 -1
  23. package/dist/api/resources/planItems.js +1 -1
  24. package/dist/api/resources/planItems.js.map +1 -1
  25. package/dist/api/resources/publicConfig.js +3 -3
  26. package/dist/api/resources/sampleData.d.ts.map +1 -1
  27. package/dist/api/resources/sampleData.js +2 -0
  28. package/dist/api/resources/sampleData.js.map +1 -1
  29. package/dist/api/resources/session.d.ts +22 -1
  30. package/dist/api/resources/session.d.ts.map +1 -1
  31. package/dist/api/resources/session.js +43 -1
  32. package/dist/api/resources/session.js.map +1 -1
  33. package/dist/api/resources/workspace.d.ts.map +1 -1
  34. package/dist/api/resources/workspace.js +2 -3
  35. package/dist/api/resources/workspace.js.map +1 -1
  36. package/dist/app/KelpieApp.d.ts.map +1 -1
  37. package/dist/app/KelpieApp.js +5 -1
  38. package/dist/app/KelpieApp.js.map +1 -1
  39. package/dist/components/ActivitiesPanel.d.ts.map +1 -1
  40. package/dist/components/ActivitiesPanel.js +2 -0
  41. package/dist/components/ActivitiesPanel.js.map +1 -1
  42. package/dist/components/AddressesField.d.ts +23 -0
  43. package/dist/components/AddressesField.d.ts.map +1 -0
  44. package/dist/components/AddressesField.js +215 -0
  45. package/dist/components/AddressesField.js.map +1 -0
  46. package/dist/components/CountrySearch.d.ts +16 -0
  47. package/dist/components/CountrySearch.d.ts.map +1 -0
  48. package/dist/components/CountrySearch.js +30 -0
  49. package/dist/components/CountrySearch.js.map +1 -0
  50. package/dist/components/EnvironmentBanner.d.ts +0 -12
  51. package/dist/components/EnvironmentBanner.d.ts.map +1 -1
  52. package/dist/components/EnvironmentBanner.js +21 -6
  53. package/dist/components/EnvironmentBanner.js.map +1 -1
  54. package/dist/components/InlineEdit.d.ts +7 -1
  55. package/dist/components/InlineEdit.d.ts.map +1 -1
  56. package/dist/components/InlineEdit.js +8 -1
  57. package/dist/components/InlineEdit.js.map +1 -1
  58. package/dist/components/LinkedEventsPanel.d.ts +11 -0
  59. package/dist/components/LinkedEventsPanel.d.ts.map +1 -0
  60. package/dist/components/LinkedEventsPanel.js +18 -0
  61. package/dist/components/LinkedEventsPanel.js.map +1 -0
  62. package/dist/components/NotesPanel.d.ts +4 -6
  63. package/dist/components/NotesPanel.d.ts.map +1 -1
  64. package/dist/components/NotesPanel.js +39 -3
  65. package/dist/components/NotesPanel.js.map +1 -1
  66. package/dist/components/PlanAttention.d.ts.map +1 -1
  67. package/dist/components/PlanAttention.js +3 -2
  68. package/dist/components/PlanAttention.js.map +1 -1
  69. package/dist/components/PlanPanel.d.ts +3 -3
  70. package/dist/components/PlanPanel.d.ts.map +1 -1
  71. package/dist/components/Shell.d.ts.map +1 -1
  72. package/dist/components/Shell.js +8 -2
  73. package/dist/components/Shell.js.map +1 -1
  74. package/dist/components/SocialNetworkIcon.d.ts +17 -0
  75. package/dist/components/SocialNetworkIcon.d.ts.map +1 -0
  76. package/dist/components/SocialNetworkIcon.js +39 -0
  77. package/dist/components/SocialNetworkIcon.js.map +1 -0
  78. package/dist/components/SocialProfilesField.d.ts +8 -0
  79. package/dist/components/SocialProfilesField.d.ts.map +1 -1
  80. package/dist/components/SocialProfilesField.js +19 -5
  81. package/dist/components/SocialProfilesField.js.map +1 -1
  82. package/dist/components/TimezoneSearch.d.ts +21 -0
  83. package/dist/components/TimezoneSearch.d.ts.map +1 -0
  84. package/dist/components/TimezoneSearch.js +27 -0
  85. package/dist/components/TimezoneSearch.js.map +1 -0
  86. package/dist/components/WorkspaceSwitcher.d.ts +8 -0
  87. package/dist/components/WorkspaceSwitcher.d.ts.map +1 -0
  88. package/dist/components/WorkspaceSwitcher.js +67 -0
  89. package/dist/components/WorkspaceSwitcher.js.map +1 -0
  90. package/dist/components/environmentTone.d.ts +10 -0
  91. package/dist/components/environmentTone.d.ts.map +1 -0
  92. package/dist/components/environmentTone.js +35 -0
  93. package/dist/components/environmentTone.js.map +1 -0
  94. package/dist/index.d.ts +25 -6
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +17 -3
  97. package/dist/index.js.map +1 -1
  98. package/dist/lib/timezones.d.ts +17 -0
  99. package/dist/lib/timezones.d.ts.map +1 -0
  100. package/dist/lib/timezones.js +39 -0
  101. package/dist/lib/timezones.js.map +1 -0
  102. package/dist/pages/CompaniesPage.d.ts.map +1 -1
  103. package/dist/pages/CompaniesPage.js +12 -11
  104. package/dist/pages/CompaniesPage.js.map +1 -1
  105. package/dist/pages/CompanyDetail.d.ts.map +1 -1
  106. package/dist/pages/CompanyDetail.js +23 -12
  107. package/dist/pages/CompanyDetail.js.map +1 -1
  108. package/dist/pages/DealDetail.d.ts.map +1 -1
  109. package/dist/pages/DealDetail.js +5 -1
  110. package/dist/pages/DealDetail.js.map +1 -1
  111. package/dist/pages/DecisionsPage.d.ts.map +1 -1
  112. package/dist/pages/DecisionsPage.js +7 -0
  113. package/dist/pages/DecisionsPage.js.map +1 -1
  114. package/dist/pages/EnquiryDetail.d.ts.map +1 -1
  115. package/dist/pages/EnquiryDetail.js +5 -1
  116. package/dist/pages/EnquiryDetail.js.map +1 -1
  117. package/dist/pages/EventDetail.d.ts +2 -0
  118. package/dist/pages/EventDetail.d.ts.map +1 -0
  119. package/dist/pages/EventDetail.js +332 -0
  120. package/dist/pages/EventDetail.js.map +1 -0
  121. package/dist/pages/EventsPage.d.ts +2 -0
  122. package/dist/pages/EventsPage.d.ts.map +1 -0
  123. package/dist/pages/EventsPage.js +176 -0
  124. package/dist/pages/EventsPage.js.map +1 -0
  125. package/dist/pages/ListDetail.d.ts.map +1 -1
  126. package/dist/pages/ListDetail.js +17 -0
  127. package/dist/pages/ListDetail.js.map +1 -1
  128. package/dist/pages/OpportunityDetail.d.ts.map +1 -1
  129. package/dist/pages/OpportunityDetail.js +5 -1
  130. package/dist/pages/OpportunityDetail.js.map +1 -1
  131. package/dist/pages/PartnershipDetail.d.ts.map +1 -1
  132. package/dist/pages/PartnershipDetail.js +5 -1
  133. package/dist/pages/PartnershipDetail.js.map +1 -1
  134. package/dist/pages/PeoplePage.d.ts.map +1 -1
  135. package/dist/pages/PeoplePage.js +13 -5
  136. package/dist/pages/PeoplePage.js.map +1 -1
  137. package/dist/pages/PersonDetail.d.ts.map +1 -1
  138. package/dist/pages/PersonDetail.js +94 -28
  139. package/dist/pages/PersonDetail.js.map +1 -1
  140. package/dist/pages/PlanningPage.d.ts.map +1 -1
  141. package/dist/pages/PlanningPage.js +6 -3
  142. package/dist/pages/PlanningPage.js.map +1 -1
  143. package/dist/pages/RaiseDetail.d.ts.map +1 -1
  144. package/dist/pages/RaiseDetail.js +5 -1
  145. package/dist/pages/RaiseDetail.js.map +1 -1
  146. package/dist/pages/RoleDetail.d.ts.map +1 -1
  147. package/dist/pages/RoleDetail.js +4 -1
  148. package/dist/pages/RoleDetail.js.map +1 -1
  149. package/dist/pages/SearchPage.d.ts.map +1 -1
  150. package/dist/pages/SearchPage.js +2 -1
  151. package/dist/pages/SearchPage.js.map +1 -1
  152. package/dist/pages/account/PreferencesPage.d.ts.map +1 -1
  153. package/dist/pages/account/PreferencesPage.js +2 -28
  154. package/dist/pages/account/PreferencesPage.js.map +1 -1
  155. package/dist/pages/account/SecurityPage.js +2 -2
  156. package/dist/pages/account/SecurityPage.js.map +1 -1
  157. package/dist/pages/admin/DataPage.js +10 -9
  158. package/dist/pages/admin/DataPage.js.map +1 -1
  159. package/dist/pages/admin/FieldsPage.js +1 -1
  160. package/dist/pages/admin/FieldsPage.js.map +1 -1
  161. package/dist/pages/admin/ModulesPage.d.ts.map +1 -1
  162. package/dist/pages/admin/ModulesPage.js +1 -0
  163. package/dist/pages/admin/ModulesPage.js.map +1 -1
  164. package/dist/pages/admin/WorkspaceSettingsPage.d.ts +12 -0
  165. package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -1
  166. package/dist/pages/admin/WorkspaceSettingsPage.js +2 -21
  167. package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -1
  168. package/dist/pages/auth/AuthForm.d.ts +18 -0
  169. package/dist/pages/auth/AuthForm.d.ts.map +1 -1
  170. package/dist/pages/auth/AuthForm.js +17 -0
  171. package/dist/pages/auth/AuthForm.js.map +1 -1
  172. package/dist/pages/auth/AuthLayout.d.ts +5 -4
  173. package/dist/pages/auth/AuthLayout.d.ts.map +1 -1
  174. package/dist/pages/auth/AuthLayout.js +7 -5
  175. package/dist/pages/auth/AuthLayout.js.map +1 -1
  176. package/dist/pages/auth/AuthMethods.d.ts +12 -0
  177. package/dist/pages/auth/AuthMethods.d.ts.map +1 -0
  178. package/dist/pages/auth/AuthMethods.js +20 -0
  179. package/dist/pages/auth/AuthMethods.js.map +1 -0
  180. package/dist/pages/auth/RegionSwitcher.d.ts +10 -0
  181. package/dist/pages/auth/RegionSwitcher.d.ts.map +1 -0
  182. package/dist/pages/auth/RegionSwitcher.js +28 -0
  183. package/dist/pages/auth/RegionSwitcher.js.map +1 -0
  184. package/dist/pages/auth/SignInPage.d.ts +7 -0
  185. package/dist/pages/auth/SignInPage.d.ts.map +1 -1
  186. package/dist/pages/auth/SignInPage.js +5 -8
  187. package/dist/pages/auth/SignInPage.js.map +1 -1
  188. package/dist/pages/auth/SignUpPage.d.ts.map +1 -1
  189. package/dist/pages/auth/SignUpPage.js +9 -1
  190. package/dist/pages/auth/SignUpPage.js.map +1 -1
  191. package/dist/pages/auth/nextPath.d.ts +15 -0
  192. package/dist/pages/auth/nextPath.d.ts.map +1 -0
  193. package/dist/pages/auth/nextPath.js +17 -0
  194. package/dist/pages/auth/nextPath.js.map +1 -0
  195. package/dist/pages/auth/regionHref.d.ts +6 -0
  196. package/dist/pages/auth/regionHref.d.ts.map +1 -0
  197. package/dist/pages/auth/regionHref.js +8 -0
  198. package/dist/pages/auth/regionHref.js.map +1 -0
  199. package/dist/pages/dashboard/DashboardPage.d.ts +8 -0
  200. package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -1
  201. package/dist/pages/dashboard/DashboardPage.js +5 -13
  202. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  203. package/dist/pages/dashboard/attention.d.ts +1 -8
  204. package/dist/pages/dashboard/attention.d.ts.map +1 -1
  205. package/dist/pages/dashboard/attention.js +21 -54
  206. package/dist/pages/dashboard/attention.js.map +1 -1
  207. package/dist/pages/dashboard/sections.d.ts.map +1 -1
  208. package/dist/pages/dashboard/sections.js +3 -2
  209. package/dist/pages/dashboard/sections.js.map +1 -1
  210. package/dist/pages/forms/FormActions.d.ts.map +1 -1
  211. package/dist/pages/forms/FormActions.js +7 -3
  212. package/dist/pages/forms/FormActions.js.map +1 -1
  213. package/dist/pages/onboarding/HandbookStepPage.d.ts +4 -8
  214. package/dist/pages/onboarding/HandbookStepPage.d.ts.map +1 -1
  215. package/dist/pages/onboarding/HandbookStepPage.js +13 -13
  216. package/dist/pages/onboarding/HandbookStepPage.js.map +1 -1
  217. package/dist/pages/onboarding/InvitesStepPage.d.ts.map +1 -1
  218. package/dist/pages/onboarding/InvitesStepPage.js +13 -7
  219. package/dist/pages/onboarding/InvitesStepPage.js.map +1 -1
  220. package/dist/pages/onboarding/ModulesStepPage.d.ts +11 -0
  221. package/dist/pages/onboarding/ModulesStepPage.d.ts.map +1 -0
  222. package/dist/pages/onboarding/ModulesStepPage.js +80 -0
  223. package/dist/pages/onboarding/ModulesStepPage.js.map +1 -0
  224. package/dist/pages/onboarding/OnboardingNav.d.ts +17 -0
  225. package/dist/pages/onboarding/OnboardingNav.d.ts.map +1 -0
  226. package/dist/pages/onboarding/OnboardingNav.js +37 -0
  227. package/dist/pages/onboarding/OnboardingNav.js.map +1 -0
  228. package/dist/pages/onboarding/OrganisationStepPage.d.ts +13 -0
  229. package/dist/pages/onboarding/OrganisationStepPage.d.ts.map +1 -0
  230. package/dist/pages/onboarding/OrganisationStepPage.js +59 -0
  231. package/dist/pages/onboarding/OrganisationStepPage.js.map +1 -0
  232. package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -1
  233. package/dist/pages/onboarding/WorkspaceStepPage.js +25 -20
  234. package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -1
  235. package/dist/pages/onboarding/handbookTemplates.d.ts +19 -0
  236. package/dist/pages/onboarding/handbookTemplates.d.ts.map +1 -0
  237. package/dist/pages/onboarding/handbookTemplates.js +57 -0
  238. package/dist/pages/onboarding/handbookTemplates.js.map +1 -0
  239. package/dist/pages/onboarding/onboardingModules.d.ts +23 -0
  240. package/dist/pages/onboarding/onboardingModules.d.ts.map +1 -0
  241. package/dist/pages/onboarding/onboardingModules.js +153 -0
  242. package/dist/pages/onboarding/onboardingModules.js.map +1 -0
  243. package/dist/pages/onboarding/onboardingRerun.d.ts +21 -0
  244. package/dist/pages/onboarding/onboardingRerun.d.ts.map +1 -0
  245. package/dist/pages/onboarding/onboardingRerun.js +33 -0
  246. package/dist/pages/onboarding/onboardingRerun.js.map +1 -0
  247. package/dist/registry/context.d.ts +3 -1
  248. package/dist/registry/context.d.ts.map +1 -1
  249. package/dist/registry/context.js +4 -0
  250. package/dist/registry/context.js.map +1 -1
  251. package/dist/registry/contributions.d.ts +24 -0
  252. package/dist/registry/contributions.d.ts.map +1 -1
  253. package/dist/registry/contributions.js.map +1 -1
  254. package/dist/registry/registry.d.ts +4 -1
  255. package/dist/registry/registry.d.ts.map +1 -1
  256. package/dist/registry/registry.js +6 -0
  257. package/dist/registry/registry.js.map +1 -1
  258. package/package.json +4 -3
  259. package/src/api/resources/attendances.ts +54 -0
  260. package/src/api/resources/eventAssociations.ts +43 -0
  261. package/src/api/resources/events.ts +70 -0
  262. package/src/api/resources/handbookSeed.ts +63 -0
  263. package/src/api/resources/moduleSettings.ts +25 -0
  264. package/src/api/resources/planItems.ts +5 -5
  265. package/src/api/resources/publicConfig.ts +3 -3
  266. package/src/api/resources/sampleData.ts +2 -0
  267. package/src/api/resources/session.ts +59 -0
  268. package/src/api/resources/workspace.ts +2 -3
  269. package/src/app/KelpieApp.tsx +11 -3
  270. package/src/components/ActivitiesPanel.tsx +2 -0
  271. package/src/components/AddressesField.tsx +502 -0
  272. package/src/components/CountrySearch.tsx +71 -0
  273. package/src/components/EnvironmentBanner.tsx +23 -6
  274. package/src/components/InlineEdit.tsx +35 -1
  275. package/src/components/LinkedEventsPanel.tsx +50 -0
  276. package/src/components/NotesPanel.tsx +132 -15
  277. package/src/components/PlanAttention.tsx +5 -4
  278. package/src/components/PlanPanel.tsx +3 -3
  279. package/src/components/Shell.tsx +16 -1
  280. package/src/components/SocialNetworkIcon.tsx +88 -0
  281. package/src/components/SocialProfilesField.tsx +57 -10
  282. package/src/components/TimezoneSearch.tsx +67 -0
  283. package/src/components/WorkspaceSwitcher.tsx +136 -0
  284. package/src/components/environmentTone.ts +40 -0
  285. package/src/index.ts +49 -3
  286. package/src/lib/timezones.ts +43 -0
  287. package/src/pages/CompaniesPage.tsx +14 -13
  288. package/src/pages/CompanyDetail.tsx +59 -27
  289. package/src/pages/DealDetail.tsx +5 -0
  290. package/src/pages/DecisionsPage.tsx +7 -0
  291. package/src/pages/EnquiryDetail.tsx +7 -0
  292. package/src/pages/EventDetail.tsx +794 -0
  293. package/src/pages/EventsPage.tsx +382 -0
  294. package/src/pages/ListDetail.tsx +24 -0
  295. package/src/pages/OpportunityDetail.tsx +7 -0
  296. package/src/pages/PartnershipDetail.tsx +7 -0
  297. package/src/pages/PeoplePage.tsx +18 -5
  298. package/src/pages/PersonDetail.tsx +300 -100
  299. package/src/pages/PlanningPage.tsx +17 -14
  300. package/src/pages/RaiseDetail.tsx +5 -0
  301. package/src/pages/RoleDetail.tsx +8 -0
  302. package/src/pages/SearchPage.tsx +2 -1
  303. package/src/pages/account/PreferencesPage.tsx +2 -37
  304. package/src/pages/account/SecurityPage.tsx +6 -1
  305. package/src/pages/admin/DataPage.tsx +63 -21
  306. package/src/pages/admin/FieldsPage.tsx +1 -1
  307. package/src/pages/admin/ModulesPage.tsx +1 -0
  308. package/src/pages/admin/WorkspaceSettingsPage.tsx +10 -33
  309. package/src/pages/auth/AuthForm.tsx +38 -0
  310. package/src/pages/auth/AuthLayout.tsx +8 -4
  311. package/src/pages/auth/AuthMethods.tsx +29 -0
  312. package/src/pages/auth/RegionSwitcher.tsx +56 -0
  313. package/src/pages/auth/SignInPage.tsx +13 -14
  314. package/src/pages/auth/SignUpPage.tsx +32 -0
  315. package/src/pages/auth/nextPath.ts +17 -0
  316. package/src/pages/auth/regionHref.ts +10 -0
  317. package/src/pages/dashboard/DashboardPage.tsx +16 -48
  318. package/src/pages/dashboard/attention.ts +24 -78
  319. package/src/pages/dashboard/sections.tsx +8 -2
  320. package/src/pages/forms/FormActions.tsx +14 -8
  321. package/src/pages/onboarding/HandbookStepPage.tsx +21 -24
  322. package/src/pages/onboarding/InvitesStepPage.tsx +27 -19
  323. package/src/pages/onboarding/ModulesStepPage.tsx +145 -0
  324. package/src/pages/onboarding/OnboardingNav.tsx +97 -0
  325. package/src/pages/onboarding/OrganisationStepPage.tsx +130 -0
  326. package/src/pages/onboarding/WorkspaceStepPage.tsx +53 -38
  327. package/src/pages/onboarding/handbookTemplates.ts +77 -0
  328. package/src/pages/onboarding/onboardingModules.ts +202 -0
  329. package/src/pages/onboarding/onboardingRerun.ts +41 -0
  330. package/src/registry/context.ts +6 -0
  331. package/src/registry/contributions.ts +26 -0
  332. package/src/registry/registry.ts +12 -0
  333. package/src/styles.css +30 -0
@@ -0,0 +1,63 @@
1
+ import { seedHandbookBody, seedHandbookResultSchema } from '@kelpie/schemas'
2
+ import type { SeedHandbookInput, SeedHandbookResult } from '@kelpie/schemas'
3
+ import { useMutation, useQueryClient } from '@tanstack/react-query'
4
+
5
+ import { useApiClient } from '../context.ts'
6
+ import type { MutationResult } from '../resource.ts'
7
+ import { asMutationResult } from './mutation.ts'
8
+ import { useSession } from './session.ts'
9
+
10
+ /**
11
+ * `POST /v1/workspaces/:id/handbook/seed` — onboarding step 4 seeds the starter
12
+ * handbook once the reader has picked an organisation type.
13
+ */
14
+
15
+ export function useSeedHandbook(): MutationResult<
16
+ SeedHandbookInput & { readonly workspaceId: string },
17
+ SeedHandbookResult
18
+ > {
19
+ const client = useApiClient()
20
+ const queryClient = useQueryClient()
21
+
22
+ const mutation = useMutation({
23
+ mutationFn: ({ workspaceId, ...input }: SeedHandbookInput & { readonly workspaceId: string }) =>
24
+ client.post(
25
+ `/workspaces/${workspaceId}/handbook/seed`,
26
+ seedHandbookBody(input),
27
+ seedHandbookResultSchema.parse,
28
+ ),
29
+ onSuccess: async () => {
30
+ await queryClient.invalidateQueries({ queryKey: ['handbook_pages'] })
31
+ },
32
+ })
33
+
34
+ return asMutationResult(mutation)
35
+ }
36
+
37
+ export function useSeedHandbookForWorkspace(): MutationResult<SeedHandbookInput, SeedHandbookResult> {
38
+ const { session } = useSession()
39
+ const seedHandbook = useSeedHandbook()
40
+
41
+ return {
42
+ run: (input: SeedHandbookInput) => {
43
+ const workspaceId = session?.workspaceId
44
+
45
+ if (workspaceId === null || workspaceId === undefined) {
46
+ return
47
+ }
48
+
49
+ seedHandbook.run({ ...input, workspaceId })
50
+ },
51
+ runAsync: async (input: SeedHandbookInput) => {
52
+ const workspaceId = session?.workspaceId
53
+
54
+ if (workspaceId === null || workspaceId === undefined) {
55
+ throw new Error('No workspace is active')
56
+ }
57
+
58
+ return seedHandbook.runAsync({ ...input, workspaceId })
59
+ },
60
+ isPending: seedHandbook.isPending,
61
+ error: seedHandbook.error,
62
+ }
63
+ }
@@ -41,6 +41,31 @@ export function useModuleSettings(): ModuleSettingsState {
41
41
  }
42
42
  }
43
43
 
44
+ /**
45
+ * Whether this workspace currently has a toggleable module on.
46
+ *
47
+ * Record tabs that belong to a module (Events on a Person) must not render
48
+ * while that module is off: the page answers 403. Loading counts as off so the
49
+ * tab cannot flash on a workspace that has switched it off. A module missing
50
+ * from the list after load is treated as on, matching the sidebar: core
51
+ * surfaces that are not toggleable stay visible.
52
+ */
53
+ export function useModuleEnabled(moduleId: string): boolean {
54
+ const { session } = useSession()
55
+ const { settings, isLoading } = useModuleSettings()
56
+
57
+ // No workspace yet (session still loading) is the same as settings still
58
+ // loading: treating a missing list as "on" would fetch attendances, then
59
+ // 403, on a workspace that has Events off.
60
+ if (session?.workspaceId === undefined || isLoading) {
61
+ return false
62
+ }
63
+
64
+ const setting = settings.find((entry) => entry.moduleId === moduleId)
65
+
66
+ return setting === undefined || setting.enabled
67
+ }
68
+
44
69
  export interface SetModuleEnabledArguments {
45
70
  readonly moduleId: string
46
71
  readonly enabled: boolean
@@ -1,10 +1,10 @@
1
1
  import { createPlanItemBody, planItemBody, planItemSchema } from '@kelpie/schemas'
2
2
  import type {
3
3
  CreatePlanItemInput,
4
- PipelineKind,
5
4
  PlanItem,
6
5
  PlanItemInput,
7
6
  PlanItemStatus,
7
+ PlanItemTargetType,
8
8
  } from '@kelpie/schemas'
9
9
 
10
10
  import type { QueryParameters } from '../client.ts'
@@ -12,7 +12,7 @@ import { createResourceHooks } from '../resource.ts'
12
12
  import type { ListOptions, MutationResult, RecordListResult, UpdateArguments } from '../resource.ts'
13
13
 
14
14
  /**
15
- * `/v1/plan_items`: the dated next steps on the four pipelines.
15
+ * `/v1/plan_items`: the dated next steps on pipeline records and Events.
16
16
  *
17
17
  * Unlike notes, this list is answerable workspace-wide, because the Planning
18
18
  * page is exactly that question. `useRecordPlanItems` narrows it to one record's
@@ -35,7 +35,7 @@ const planItems = createResourceHooks<PlanItem, CreatePlanItemInput, PlanItemInp
35
35
  export const MAX_PAGE_SIZE = 200
36
36
 
37
37
  export interface PlanItemFilters {
38
- readonly targetType?: PipelineKind | undefined
38
+ readonly targetType?: PlanItemTargetType | undefined
39
39
  /** The records to read steps for. Repeats on the wire: `?target_id=a&target_id=b`. */
40
40
  readonly targetIds?: readonly string[] | undefined
41
41
  readonly statuses?: readonly PlanItemStatus[] | undefined
@@ -66,7 +66,7 @@ export function usePlanItems(
66
66
 
67
67
  /** One record's plan, in date order: what the panel on a detail page shows. */
68
68
  export function useRecordPlanItems(
69
- targetType: PipelineKind,
69
+ targetType: PlanItemTargetType,
70
70
  targetId: string,
71
71
  ): RecordListResult<PlanItem> {
72
72
  return usePlanItems({ targetType, targetIds: [targetId] })
@@ -81,7 +81,7 @@ export function useRecordPlanItems(
81
81
  * dropped rather than sent, because the request would be a 422 in full.
82
82
  */
83
83
  export function usePlanItemsForRecords(
84
- targetType: PipelineKind,
84
+ targetType: PlanItemTargetType,
85
85
  targetIds: readonly string[],
86
86
  ): RecordListResult<PlanItem> {
87
87
  return usePlanItems(
@@ -8,9 +8,9 @@ import { toError } from '../errors.ts'
8
8
  /**
9
9
  * The deployment metadata `GET /v1/public/config` reports.
10
10
  *
11
- * Read once, cached forever: neither `runtimeMode` nor `siteName` changes
12
- * while the app is open. The endpoint is public, so this hook works before a
13
- * session exists (the sign-in page reads it too).
11
+ * Read once, cached forever: neither `runtimeMode` nor `siteName` nor
12
+ * `regions` changes while the app is open. The endpoint is public, so this
13
+ * hook works before a session exists (the sign-in page reads it too).
14
14
  */
15
15
 
16
16
  const PUBLIC_CONFIG_KEY = ['public-config'] as const
@@ -48,6 +48,8 @@ export function useInstallSampleData(): MutationResult<InstallSampleDataInput, S
48
48
  'enquiries',
49
49
  'roles',
50
50
  'candidates',
51
+ 'events',
52
+ 'attendances',
51
53
  ].map((name) => cache.invalidateQueries({ queryKey: [name] })),
52
54
  )
53
55
  },
@@ -1,4 +1,5 @@
1
1
  import {
2
+ accountWorkspaceSchema,
2
3
  confirmEmailVerificationBody,
3
4
  confirmPasswordResetBody,
4
5
  createWorkspaceBody,
@@ -7,9 +8,11 @@ import {
7
8
  sessionSchema,
8
9
  signUpBody,
9
10
  signedInAccountSchema,
11
+ switchWorkspaceBody,
10
12
  workspaceSchema,
11
13
  } from '@kelpie/schemas'
12
14
  import type {
15
+ AccountWorkspace,
13
16
  ConfirmEmailVerificationInput,
14
17
  ConfirmPasswordResetInput,
15
18
  CreateWorkspaceInput,
@@ -18,6 +21,7 @@ import type {
18
21
  Session,
19
22
  SignUpInput,
20
23
  SignedInAccount,
24
+ SwitchWorkspaceInput,
21
25
  Workspace,
22
26
  } from '@kelpie/schemas'
23
27
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
@@ -254,3 +258,58 @@ export function useCreateWorkspace(): MutationResult<CreateWorkspaceInput, Works
254
258
  return asMutationResult(mutation)
255
259
  }
256
260
 
261
+ const ACCOUNT_WORKSPACES_KEY = ['account', 'workspaces'] as const
262
+
263
+ export interface AccountWorkspacesState {
264
+ readonly workspaces: readonly AccountWorkspace[]
265
+ readonly isLoading: boolean
266
+ readonly error: Error | null
267
+ }
268
+
269
+ /**
270
+ * Workspaces this account belongs to.
271
+ *
272
+ * Lives under `/auth` rather than `/workspaces/:id` so a session whose current
273
+ * workspace is suspended can still list the others and switch. The shell reads
274
+ * this for the header switcher.
275
+ */
276
+ export function useAccountWorkspaces(): AccountWorkspacesState {
277
+ const client = useApiClient()
278
+ const result = useQuery({
279
+ queryKey: ACCOUNT_WORKSPACES_KEY,
280
+ queryFn: async () => {
281
+ const page = await client.list('/auth/workspaces', accountWorkspaceSchema.parse)
282
+
283
+ return page.items
284
+ },
285
+ })
286
+
287
+ return {
288
+ workspaces: result.data ?? [],
289
+ isLoading: result.isPending,
290
+ error: toError(result.error),
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Moves this session into another membership.
296
+ *
297
+ * Every cached CRM list belongs to the workspace that is being left, so the
298
+ * whole cache is dropped. Leaving Acme's people in the cache for Globex would
299
+ * mix two tenants, not just show stale names.
300
+ */
301
+ export function useSwitchWorkspace(): MutationResult<SwitchWorkspaceInput, Session> {
302
+ const client = useApiClient()
303
+ const queryClient = useQueryClient()
304
+ const mutation = useMutation({
305
+ mutationFn: (input: SwitchWorkspaceInput) =>
306
+ client.post('/auth/workspace', switchWorkspaceBody(input), sessionSchema.parse),
307
+ onSuccess: async () => {
308
+ queryClient.clear()
309
+ await queryClient.fetchQuery(sessionQuery(client))
310
+ },
311
+ })
312
+
313
+ return asMutationResult(mutation)
314
+ }
315
+
@@ -11,9 +11,8 @@ import { useSession } from './session.ts'
11
11
  /**
12
12
  * The workspace the session is in.
13
13
  *
14
- * Not a CRM resource: there is one of them, its id comes from the session rather
15
- * than a route, and there is no list. `createResourceHooks` would have nothing
16
- * to configure.
14
+ * Not a CRM resource: the id comes from the session rather than a route.
15
+ * The account's memberships are a different list (`GET /v1/auth/workspaces`).
17
16
  */
18
17
 
19
18
  const WORKSPACE_KEY = 'workspace'
@@ -21,6 +21,8 @@ import { NotFoundPage } from '../pages/NotFoundPage.tsx'
21
21
  import { EnquiriesPage } from '../pages/EnquiriesPage.tsx'
22
22
  import { EnquiryDetail } from '../pages/EnquiryDetail.tsx'
23
23
  import { EnquiryStageSettingsPage } from '../pages/EnquiryStageSettingsPage.tsx'
24
+ import { EventDetail } from '../pages/EventDetail.tsx'
25
+ import { EventsPage } from '../pages/EventsPage.tsx'
24
26
  import { OpportunitiesPage } from '../pages/OpportunitiesPage.tsx'
25
27
  import { OpportunityDetail } from '../pages/OpportunityDetail.tsx'
26
28
  import { OpportunityStageSettingsPage } from '../pages/OpportunityStageSettingsPage.tsx'
@@ -58,6 +60,8 @@ import { DashboardPage } from '../pages/dashboard/DashboardPage.tsx'
58
60
  import { HandbookLayout } from '../pages/handbook/HandbookPage.tsx'
59
61
  import { HandbookStepPage } from '../pages/onboarding/HandbookStepPage.tsx'
60
62
  import { InvitesStepPage } from '../pages/onboarding/InvitesStepPage.tsx'
63
+ import { ModulesStepPage } from '../pages/onboarding/ModulesStepPage.tsx'
64
+ import { OrganisationStepPage } from '../pages/onboarding/OrganisationStepPage.tsx'
61
65
  import { WorkspaceStepPage } from '../pages/onboarding/WorkspaceStepPage.tsx'
62
66
  import { UiExtensionProvider } from '../registry/UiExtensionProvider.tsx'
63
67
  import type { RouteContribution } from '../registry/contributions.ts'
@@ -138,9 +142,11 @@ function AppRoutes(): React.JSX.Element {
138
142
  <Route path="/verify-email/pending" element={<VerifyEmailPendingPage />} />
139
143
 
140
144
  <Route element={<SessionGate />}>
141
- {/* Inside the gate and outside the Shell: both steps need the workspace
142
- that step 1 created, and neither is a place to start navigating the
143
- app from. */}
145
+ {/* Inside the gate and outside the Shell: these steps need the workspace
146
+ that step 1 created, and none of them is a place to start navigating
147
+ the app from. */}
148
+ <Route path="/onboarding/organisation" element={<OrganisationStepPage />} />
149
+ <Route path="/onboarding/modules" element={<ModulesStepPage />} />
144
150
  <Route path="/onboarding/invites" element={<InvitesStepPage />} />
145
151
  <Route path="/onboarding/handbook" element={<HandbookStepPage />} />
146
152
 
@@ -167,6 +173,8 @@ function AppRoutes(): React.JSX.Element {
167
173
  <Route path="fundraising" element={<FundraisingPage />} />
168
174
  <Route path="fundraising/settings" element={<RaiseStageSettingsPage />} />
169
175
  <Route path="fundraising/:id" element={<RaiseDetail />} />
176
+ <Route path="events" element={<EventsPage />} />
177
+ <Route path="events/:id" element={<EventDetail />} />
170
178
  <Route path="partnerships" element={<PartnershipsPage />} />
171
179
  <Route path="partnerships/settings" element={<PartnershipStageSettingsPage />} />
172
180
  <Route path="partnerships/:id" element={<PartnershipDetail />} />
@@ -50,6 +50,8 @@ const TARGET_TYPE_LABELS: Readonly<Record<RecordTargetType, string>> = {
50
50
  raise: 'Raise',
51
51
  enquiry: 'Enquiry',
52
52
  candidate: 'Candidate',
53
+ event: 'Event',
54
+ attendance: 'Attendance',
53
55
  }
54
56
 
55
57
  interface MonthGroup {