@kelpie/ui 0.7.0 → 0.9.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 (349) hide show
  1. package/dist/api/resource.d.ts +59 -6
  2. package/dist/api/resource.d.ts.map +1 -1
  3. package/dist/api/resource.js +106 -24
  4. package/dist/api/resource.js.map +1 -1
  5. package/dist/api/resources/companies.d.ts +2 -0
  6. package/dist/api/resources/companies.d.ts.map +1 -1
  7. package/dist/api/resources/companies.js +5 -1
  8. package/dist/api/resources/companies.js.map +1 -1
  9. package/dist/api/resources/consentPurposes.d.ts +13 -0
  10. package/dist/api/resources/consentPurposes.d.ts.map +1 -0
  11. package/dist/api/resources/consentPurposes.js +39 -0
  12. package/dist/api/resources/consentPurposes.js.map +1 -0
  13. package/dist/api/resources/customFields.d.ts +15 -0
  14. package/dist/api/resources/customFields.d.ts.map +1 -0
  15. package/dist/api/resources/customFields.js +41 -0
  16. package/dist/api/resources/customFields.js.map +1 -0
  17. package/dist/api/resources/decisions.d.ts +2 -0
  18. package/dist/api/resources/decisions.d.ts.map +1 -1
  19. package/dist/api/resources/decisions.js +1 -0
  20. package/dist/api/resources/decisions.js.map +1 -1
  21. package/dist/api/resources/emailDomainLinker.d.ts +16 -0
  22. package/dist/api/resources/emailDomainLinker.d.ts.map +1 -0
  23. package/dist/api/resources/emailDomainLinker.js +16 -0
  24. package/dist/api/resources/emailDomainLinker.js.map +1 -0
  25. package/dist/api/resources/enquiries.d.ts +39 -0
  26. package/dist/api/resources/enquiries.d.ts.map +1 -0
  27. package/dist/api/resources/enquiries.js +68 -0
  28. package/dist/api/resources/enquiries.js.map +1 -0
  29. package/dist/api/resources/forms.d.ts +21 -1
  30. package/dist/api/resources/forms.d.ts.map +1 -1
  31. package/dist/api/resources/forms.js +44 -17
  32. package/dist/api/resources/forms.js.map +1 -1
  33. package/dist/api/resources/handbookPages.d.ts +1 -1
  34. package/dist/api/resources/handbookPages.js +1 -1
  35. package/dist/api/resources/importJobs.d.ts +5 -0
  36. package/dist/api/resources/importJobs.d.ts.map +1 -1
  37. package/dist/api/resources/importJobs.js +3 -0
  38. package/dist/api/resources/importJobs.js.map +1 -1
  39. package/dist/api/resources/listMembers.d.ts +27 -0
  40. package/dist/api/resources/listMembers.d.ts.map +1 -0
  41. package/dist/api/resources/listMembers.js +108 -0
  42. package/dist/api/resources/listMembers.js.map +1 -0
  43. package/dist/api/resources/lists.d.ts +14 -0
  44. package/dist/api/resources/lists.d.ts.map +1 -0
  45. package/dist/api/resources/lists.js +34 -0
  46. package/dist/api/resources/lists.js.map +1 -0
  47. package/dist/api/resources/opportunities.d.ts +2 -0
  48. package/dist/api/resources/opportunities.d.ts.map +1 -1
  49. package/dist/api/resources/opportunities.js +1 -0
  50. package/dist/api/resources/opportunities.js.map +1 -1
  51. package/dist/api/resources/people.d.ts.map +1 -1
  52. package/dist/api/resources/people.js +4 -1
  53. package/dist/api/resources/people.js.map +1 -1
  54. package/dist/api/resources/roles.d.ts +2 -0
  55. package/dist/api/resources/roles.d.ts.map +1 -1
  56. package/dist/api/resources/roles.js +1 -1
  57. package/dist/api/resources/roles.js.map +1 -1
  58. package/dist/api/resources/sampleData.d.ts +17 -0
  59. package/dist/api/resources/sampleData.d.ts.map +1 -0
  60. package/dist/api/resources/sampleData.js +31 -0
  61. package/dist/api/resources/sampleData.js.map +1 -0
  62. package/dist/api/resources/webhooks.d.ts.map +1 -1
  63. package/dist/api/resources/webhooks.js +7 -22
  64. package/dist/api/resources/webhooks.js.map +1 -1
  65. package/dist/app/KelpieApp.d.ts.map +1 -1
  66. package/dist/app/KelpieApp.js +9 -1
  67. package/dist/app/KelpieApp.js.map +1 -1
  68. package/dist/components/ActivitiesPanel.d.ts.map +1 -1
  69. package/dist/components/ActivitiesPanel.js +3 -1
  70. package/dist/components/ActivitiesPanel.js.map +1 -1
  71. package/dist/components/ColumnPicker.d.ts +24 -0
  72. package/dist/components/ColumnPicker.d.ts.map +1 -0
  73. package/dist/components/ColumnPicker.js +56 -0
  74. package/dist/components/ColumnPicker.js.map +1 -0
  75. package/dist/components/CustomFieldsPanel.d.ts +23 -0
  76. package/dist/components/CustomFieldsPanel.d.ts.map +1 -0
  77. package/dist/components/CustomFieldsPanel.js +116 -0
  78. package/dist/components/CustomFieldsPanel.js.map +1 -0
  79. package/dist/components/DataTable.d.ts +16 -1
  80. package/dist/components/DataTable.d.ts.map +1 -1
  81. package/dist/components/DataTable.js +51 -10
  82. package/dist/components/DataTable.js.map +1 -1
  83. package/dist/components/DecisionsPanel.d.ts.map +1 -1
  84. package/dist/components/DecisionsPanel.js +4 -3
  85. package/dist/components/DecisionsPanel.js.map +1 -1
  86. package/dist/components/EntitySearch.d.ts.map +1 -1
  87. package/dist/components/EntitySearch.js +11 -5
  88. package/dist/components/EntitySearch.js.map +1 -1
  89. package/dist/components/FormsPanel.d.ts +18 -0
  90. package/dist/components/FormsPanel.d.ts.map +1 -0
  91. package/dist/components/FormsPanel.js +37 -0
  92. package/dist/components/FormsPanel.js.map +1 -0
  93. package/dist/components/ListsPanel.d.ts +14 -0
  94. package/dist/components/ListsPanel.d.ts.map +1 -0
  95. package/dist/components/ListsPanel.js +56 -0
  96. package/dist/components/ListsPanel.js.map +1 -0
  97. package/dist/components/NotesPanel.d.ts.map +1 -1
  98. package/dist/components/NotesPanel.js +6 -5
  99. package/dist/components/NotesPanel.js.map +1 -1
  100. package/dist/components/Paginator.d.ts +26 -0
  101. package/dist/components/Paginator.d.ts.map +1 -0
  102. package/dist/components/Paginator.js +16 -0
  103. package/dist/components/Paginator.js.map +1 -0
  104. package/dist/components/PlanAttention.d.ts +3 -2
  105. package/dist/components/PlanAttention.d.ts.map +1 -1
  106. package/dist/components/PlanAttention.js +7 -3
  107. package/dist/components/PlanAttention.js.map +1 -1
  108. package/dist/components/PlanPanel.d.ts.map +1 -1
  109. package/dist/components/PlanPanel.js +2 -1
  110. package/dist/components/PlanPanel.js.map +1 -1
  111. package/dist/components/Shell.d.ts.map +1 -1
  112. package/dist/components/Shell.js +4 -0
  113. package/dist/components/Shell.js.map +1 -1
  114. package/dist/components/useHasCustomFields.d.ts +13 -0
  115. package/dist/components/useHasCustomFields.d.ts.map +1 -0
  116. package/dist/components/useHasCustomFields.js +16 -0
  117. package/dist/components/useHasCustomFields.js.map +1 -0
  118. package/dist/index.d.ts +8 -2
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +4 -1
  121. package/dist/index.js.map +1 -1
  122. package/dist/lib/listView.d.ts +15 -0
  123. package/dist/lib/listView.d.ts.map +1 -0
  124. package/dist/lib/listView.js +66 -0
  125. package/dist/lib/listView.js.map +1 -0
  126. package/dist/lib/sort.d.ts +43 -0
  127. package/dist/lib/sort.d.ts.map +1 -0
  128. package/dist/lib/sort.js +102 -0
  129. package/dist/lib/sort.js.map +1 -0
  130. package/dist/pages/CompaniesPage.d.ts.map +1 -1
  131. package/dist/pages/CompaniesPage.js +88 -3
  132. package/dist/pages/CompaniesPage.js.map +1 -1
  133. package/dist/pages/CompanyDetail.d.ts.map +1 -1
  134. package/dist/pages/CompanyDetail.js +40 -15
  135. package/dist/pages/CompanyDetail.js.map +1 -1
  136. package/dist/pages/DealDetail.d.ts.map +1 -1
  137. package/dist/pages/DealDetail.js +20 -1
  138. package/dist/pages/DealDetail.js.map +1 -1
  139. package/dist/pages/DealsPage.d.ts.map +1 -1
  140. package/dist/pages/DealsPage.js +134 -14
  141. package/dist/pages/DealsPage.js.map +1 -1
  142. package/dist/pages/DecisionsPage.d.ts.map +1 -1
  143. package/dist/pages/DecisionsPage.js +52 -8
  144. package/dist/pages/DecisionsPage.js.map +1 -1
  145. package/dist/pages/EnquiriesPage.d.ts +2 -0
  146. package/dist/pages/EnquiriesPage.d.ts.map +1 -0
  147. package/dist/pages/EnquiriesPage.js +251 -0
  148. package/dist/pages/EnquiriesPage.js.map +1 -0
  149. package/dist/pages/EnquiryDetail.d.ts +2 -0
  150. package/dist/pages/EnquiryDetail.d.ts.map +1 -0
  151. package/dist/pages/EnquiryDetail.js +207 -0
  152. package/dist/pages/EnquiryDetail.js.map +1 -0
  153. package/dist/pages/EnquiryStageSettingsPage.d.ts +3 -0
  154. package/dist/pages/EnquiryStageSettingsPage.d.ts.map +1 -0
  155. package/dist/pages/EnquiryStageSettingsPage.js +34 -0
  156. package/dist/pages/EnquiryStageSettingsPage.js.map +1 -0
  157. package/dist/pages/FormDetail.d.ts.map +1 -1
  158. package/dist/pages/FormDetail.js +19 -1
  159. package/dist/pages/FormDetail.js.map +1 -1
  160. package/dist/pages/FormsPage.d.ts.map +1 -1
  161. package/dist/pages/FormsPage.js +53 -2
  162. package/dist/pages/FormsPage.js.map +1 -1
  163. package/dist/pages/FundraisingPage.d.ts.map +1 -1
  164. package/dist/pages/FundraisingPage.js +116 -14
  165. package/dist/pages/FundraisingPage.js.map +1 -1
  166. package/dist/pages/HiringPage.d.ts.map +1 -1
  167. package/dist/pages/HiringPage.js +27 -4
  168. package/dist/pages/HiringPage.js.map +1 -1
  169. package/dist/pages/ListDetail.d.ts +11 -0
  170. package/dist/pages/ListDetail.d.ts.map +1 -0
  171. package/dist/pages/ListDetail.js +214 -0
  172. package/dist/pages/ListDetail.js.map +1 -0
  173. package/dist/pages/ListsPage.d.ts +9 -0
  174. package/dist/pages/ListsPage.d.ts.map +1 -0
  175. package/dist/pages/ListsPage.js +125 -0
  176. package/dist/pages/ListsPage.js.map +1 -0
  177. package/dist/pages/OpportunitiesPage.d.ts.map +1 -1
  178. package/dist/pages/OpportunitiesPage.js +97 -14
  179. package/dist/pages/OpportunitiesPage.js.map +1 -1
  180. package/dist/pages/OpportunityDetail.d.ts.map +1 -1
  181. package/dist/pages/OpportunityDetail.js +64 -3
  182. package/dist/pages/OpportunityDetail.js.map +1 -1
  183. package/dist/pages/PartnershipDetail.d.ts.map +1 -1
  184. package/dist/pages/PartnershipDetail.js +19 -1
  185. package/dist/pages/PartnershipDetail.js.map +1 -1
  186. package/dist/pages/PartnershipsPage.d.ts.map +1 -1
  187. package/dist/pages/PartnershipsPage.js +111 -14
  188. package/dist/pages/PartnershipsPage.js.map +1 -1
  189. package/dist/pages/PeoplePage.d.ts.map +1 -1
  190. package/dist/pages/PeoplePage.js +119 -3
  191. package/dist/pages/PeoplePage.js.map +1 -1
  192. package/dist/pages/PersonDetail.d.ts.map +1 -1
  193. package/dist/pages/PersonDetail.js +67 -5
  194. package/dist/pages/PersonDetail.js.map +1 -1
  195. package/dist/pages/PlanningPage.d.ts.map +1 -1
  196. package/dist/pages/PlanningPage.js +88 -17
  197. package/dist/pages/PlanningPage.js.map +1 -1
  198. package/dist/pages/RaiseDetail.d.ts.map +1 -1
  199. package/dist/pages/RaiseDetail.js +13 -1
  200. package/dist/pages/RaiseDetail.js.map +1 -1
  201. package/dist/pages/RoleDetail.d.ts.map +1 -1
  202. package/dist/pages/RoleDetail.js +5 -4
  203. package/dist/pages/RoleDetail.js.map +1 -1
  204. package/dist/pages/SearchPage.d.ts.map +1 -1
  205. package/dist/pages/SearchPage.js +1 -0
  206. package/dist/pages/SearchPage.js.map +1 -1
  207. package/dist/pages/admin/DataPage.d.ts.map +1 -1
  208. package/dist/pages/admin/DataPage.js +126 -13
  209. package/dist/pages/admin/DataPage.js.map +1 -1
  210. package/dist/pages/admin/FieldsPage.d.ts +2 -0
  211. package/dist/pages/admin/FieldsPage.d.ts.map +1 -0
  212. package/dist/pages/admin/FieldsPage.js +164 -0
  213. package/dist/pages/admin/FieldsPage.js.map +1 -0
  214. package/dist/pages/admin/PrivacyPage.d.ts +9 -0
  215. package/dist/pages/admin/PrivacyPage.d.ts.map +1 -0
  216. package/dist/pages/admin/PrivacyPage.js +170 -0
  217. package/dist/pages/admin/PrivacyPage.js.map +1 -0
  218. package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -1
  219. package/dist/pages/admin/WebhookDeliveries.js +3 -2
  220. package/dist/pages/admin/WebhookDeliveries.js.map +1 -1
  221. package/dist/pages/admin/WebhooksPage.d.ts.map +1 -1
  222. package/dist/pages/admin/WebhooksPage.js +3 -2
  223. package/dist/pages/admin/WebhooksPage.js.map +1 -1
  224. package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -1
  225. package/dist/pages/admin/WorkspaceSettingsPage.js +45 -2
  226. package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -1
  227. package/dist/pages/dashboard/attention.d.ts.map +1 -1
  228. package/dist/pages/dashboard/attention.js +3 -0
  229. package/dist/pages/dashboard/attention.js.map +1 -1
  230. package/dist/pages/forms/AddFieldMenu.d.ts +17 -0
  231. package/dist/pages/forms/AddFieldMenu.d.ts.map +1 -0
  232. package/dist/pages/forms/AddFieldMenu.js +43 -0
  233. package/dist/pages/forms/AddFieldMenu.js.map +1 -0
  234. package/dist/pages/forms/EmbedPanel.d.ts +4 -0
  235. package/dist/pages/forms/EmbedPanel.d.ts.map +1 -1
  236. package/dist/pages/forms/EmbedPanel.js +62 -3
  237. package/dist/pages/forms/EmbedPanel.js.map +1 -1
  238. package/dist/pages/forms/FieldsEditor.d.ts.map +1 -1
  239. package/dist/pages/forms/FieldsEditor.js +179 -36
  240. package/dist/pages/forms/FieldsEditor.js.map +1 -1
  241. package/dist/pages/forms/FormActions.d.ts +6 -0
  242. package/dist/pages/forms/FormActions.d.ts.map +1 -0
  243. package/dist/pages/forms/FormActions.js +149 -0
  244. package/dist/pages/forms/FormActions.js.map +1 -0
  245. package/dist/pages/forms/FormSettings.d.ts.map +1 -1
  246. package/dist/pages/forms/FormSettings.js +15 -19
  247. package/dist/pages/forms/FormSettings.js.map +1 -1
  248. package/dist/pages/forms/SubmissionDetail.d.ts +2 -0
  249. package/dist/pages/forms/SubmissionDetail.d.ts.map +1 -0
  250. package/dist/pages/forms/SubmissionDetail.js +76 -0
  251. package/dist/pages/forms/SubmissionDetail.js.map +1 -0
  252. package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -1
  253. package/dist/pages/forms/SubmissionsTable.js +57 -8
  254. package/dist/pages/forms/SubmissionsTable.js.map +1 -1
  255. package/dist/pages/forms/fieldList.d.ts +11 -5
  256. package/dist/pages/forms/fieldList.d.ts.map +1 -1
  257. package/dist/pages/forms/fieldList.js +66 -6
  258. package/dist/pages/forms/fieldList.js.map +1 -1
  259. package/dist/pages/forms/template.d.ts +17 -0
  260. package/dist/pages/forms/template.d.ts.map +1 -1
  261. package/dist/pages/forms/template.js +93 -0
  262. package/dist/pages/forms/template.js.map +1 -1
  263. package/dist/pages/handbook/HandbookPage.js +1 -1
  264. package/dist/pages/hiringDirectory.js +2 -2
  265. package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -1
  266. package/dist/pages/onboarding/WorkspaceStepPage.js +15 -2
  267. package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -1
  268. package/dist/pages/positionDirectory.js +2 -2
  269. package/package.json +2 -2
  270. package/src/api/resource.ts +155 -32
  271. package/src/api/resources/companies.ts +7 -1
  272. package/src/api/resources/consentPurposes.ts +83 -0
  273. package/src/api/resources/customFields.ts +88 -0
  274. package/src/api/resources/decisions.ts +3 -0
  275. package/src/api/resources/emailDomainLinker.ts +43 -0
  276. package/src/api/resources/enquiries.ts +118 -0
  277. package/src/api/resources/forms.ts +59 -19
  278. package/src/api/resources/handbookPages.ts +1 -1
  279. package/src/api/resources/importJobs.ts +9 -0
  280. package/src/api/resources/listMembers.ts +173 -0
  281. package/src/api/resources/lists.ts +61 -0
  282. package/src/api/resources/opportunities.ts +3 -0
  283. package/src/api/resources/people.ts +4 -1
  284. package/src/api/resources/roles.ts +3 -1
  285. package/src/api/resources/sampleData.ts +57 -0
  286. package/src/api/resources/webhooks.ts +8 -24
  287. package/src/app/KelpieApp.tsx +16 -0
  288. package/src/components/ActivitiesPanel.tsx +3 -10
  289. package/src/components/ColumnPicker.tsx +124 -0
  290. package/src/components/CustomFieldsPanel.tsx +330 -0
  291. package/src/components/DataTable.tsx +89 -10
  292. package/src/components/DecisionsPanel.tsx +4 -12
  293. package/src/components/EntitySearch.tsx +12 -5
  294. package/src/components/FormsPanel.tsx +86 -0
  295. package/src/components/ListsPanel.tsx +176 -0
  296. package/src/components/NotesPanel.tsx +6 -14
  297. package/src/components/Paginator.tsx +78 -0
  298. package/src/components/PlanAttention.tsx +20 -3
  299. package/src/components/PlanPanel.tsx +2 -10
  300. package/src/components/Shell.tsx +4 -0
  301. package/src/components/useHasCustomFields.ts +18 -0
  302. package/src/index.ts +10 -1
  303. package/src/lib/listView.ts +149 -0
  304. package/src/lib/sort.ts +143 -0
  305. package/src/pages/CompaniesPage.tsx +125 -11
  306. package/src/pages/CompanyDetail.tsx +98 -63
  307. package/src/pages/DealDetail.tsx +34 -0
  308. package/src/pages/DealsPage.tsx +178 -24
  309. package/src/pages/DecisionsPage.tsx +75 -18
  310. package/src/pages/EnquiriesPage.tsx +434 -0
  311. package/src/pages/EnquiryDetail.tsx +554 -0
  312. package/src/pages/EnquiryStageSettingsPage.tsx +63 -0
  313. package/src/pages/FormDetail.tsx +23 -1
  314. package/src/pages/FormsPage.tsx +81 -17
  315. package/src/pages/FundraisingPage.tsx +152 -24
  316. package/src/pages/HiringPage.tsx +39 -11
  317. package/src/pages/ListDetail.tsx +470 -0
  318. package/src/pages/ListsPage.tsx +281 -0
  319. package/src/pages/OpportunitiesPage.tsx +130 -24
  320. package/src/pages/OpportunityDetail.tsx +168 -2
  321. package/src/pages/PartnershipDetail.tsx +35 -0
  322. package/src/pages/PartnershipsPage.tsx +149 -24
  323. package/src/pages/PeoplePage.tsx +157 -11
  324. package/src/pages/PersonDetail.tsx +157 -6
  325. package/src/pages/PlanningPage.tsx +259 -29
  326. package/src/pages/RaiseDetail.tsx +24 -0
  327. package/src/pages/RoleDetail.tsx +21 -26
  328. package/src/pages/SearchPage.tsx +1 -0
  329. package/src/pages/admin/DataPage.tsx +324 -13
  330. package/src/pages/admin/FieldsPage.tsx +455 -0
  331. package/src/pages/admin/PrivacyPage.tsx +461 -0
  332. package/src/pages/admin/WebhookDeliveries.tsx +10 -15
  333. package/src/pages/admin/WebhooksPage.tsx +14 -19
  334. package/src/pages/admin/WorkspaceSettingsPage.tsx +134 -2
  335. package/src/pages/dashboard/attention.ts +3 -0
  336. package/src/pages/forms/AddFieldMenu.tsx +121 -0
  337. package/src/pages/forms/EmbedPanel.tsx +163 -2
  338. package/src/pages/forms/FieldsEditor.tsx +539 -165
  339. package/src/pages/forms/FormActions.tsx +552 -0
  340. package/src/pages/forms/FormSettings.tsx +29 -70
  341. package/src/pages/forms/SubmissionDetail.tsx +249 -0
  342. package/src/pages/forms/SubmissionsTable.tsx +112 -26
  343. package/src/pages/forms/fieldList.ts +68 -5
  344. package/src/pages/forms/template.ts +103 -0
  345. package/src/pages/handbook/HandbookPage.tsx +1 -1
  346. package/src/pages/hiringDirectory.ts +2 -2
  347. package/src/pages/onboarding/WorkspaceStepPage.tsx +31 -3
  348. package/src/pages/positionDirectory.ts +2 -2
  349. package/src/styles.css +3 -3
@@ -12,6 +12,8 @@ import {
12
12
  useUpdateCompany,
13
13
  } from '../api/resources/companies.ts'
14
14
  import { useDeals } from '../api/resources/deals.ts'
15
+ import { useEnquiries } from '../api/resources/enquiries.ts'
16
+ import { useFormSubmissionsForRecord } from '../api/resources/forms.ts'
15
17
  import { useOpportunities } from '../api/resources/opportunities.ts'
16
18
  import { usePartnerships } from '../api/resources/partnerships.ts'
17
19
  import { usePeople } from '../api/resources/people.ts'
@@ -29,7 +31,11 @@ import type { ChipTone } from '../components/Chip.tsx'
29
31
  import { DecisionsPanel } from '../components/DecisionsPanel.tsx'
30
32
  import { DeleteRecord } from '../components/DeleteRecord.tsx'
31
33
  import { EntitySearch } from '../components/EntitySearch.tsx'
34
+ import { FormsPanel } from '../components/FormsPanel.tsx'
35
+ import { CustomFieldsPanel } from '../components/CustomFieldsPanel.tsx'
36
+ import { useHasCustomFields } from '../components/useHasCustomFields.ts'
32
37
  import { InlineEdit } from '../components/InlineEdit.tsx'
38
+ import { ListsPanel } from '../components/ListsPanel.tsx'
33
39
  import { NotesPanel } from '../components/NotesPanel.tsx'
34
40
  import { RelatedPlanAttention } from '../components/PlanAttention.tsx'
35
41
  import { ErrorPanel, LoadingPanel, NotFoundPanel } from '../components/QueryState.tsx'
@@ -45,7 +51,7 @@ import { toOptions, toTags } from './fields.ts'
45
51
  /**
46
52
  * One company.
47
53
  *
48
- * Overview, Activity, Notes and Decisions render today. As with People, the
54
+ * Overview, Activity, Notes, Decisions, Lists and People render today. The
49
55
  * tabs for Deals, Opportunities, Partnerships and Raises wait for their
50
56
  * endpoints. A UI module can add its own through the `company` record-tab slot.
51
57
  */
@@ -68,7 +74,9 @@ export function CompanyDetail(): React.JSX.Element {
68
74
  const { record, isLoading, isNotFound, error } = useCompany(id)
69
75
  const deleteCompany = useDeleteCompany()
70
76
  const moduleTabs = inSlotOrder(useRecordTabs('company'))
77
+ const hasCustomFields = useHasCustomFields('company')
71
78
  const [activeTab, setActiveTab] = useState('overview')
79
+ const formSubmissions = useFormSubmissionsForRecord('company', id)
72
80
 
73
81
  if (isNotFound) {
74
82
  return <NotFoundPanel label="Company" backTo="/companies" />
@@ -84,9 +92,15 @@ export function CompanyDetail(): React.JSX.Element {
84
92
 
85
93
  const tabs: readonly RecordTabDescriptor<string>[] = [
86
94
  { id: 'overview', label: 'Overview' },
95
+ ...(hasCustomFields ? [{ id: 'fields', label: 'Fields' }] : []),
87
96
  { id: 'activity', label: 'Activity' },
97
+ { id: 'people', label: 'People' },
88
98
  { id: 'notes', label: 'Notes' },
89
99
  { id: 'decisions', label: 'Decisions' },
100
+ { id: 'lists', label: 'Lists' },
101
+ ...(formSubmissions.records.length === 0
102
+ ? []
103
+ : [{ id: 'forms', label: 'Forms', count: formSubmissions.records.length }]),
90
104
  ...moduleTabs.map((tab) => ({ id: tab.id, label: tab.label })),
91
105
  ]
92
106
  const active = tabs.some((tab) => tab.id === activeTab) ? activeTab : 'overview'
@@ -128,16 +142,19 @@ export function CompanyDetail(): React.JSX.Element {
128
142
  ariaLabel="Company sections"
129
143
  >
130
144
  {active === 'overview' && <CompanyOverview company={record} />}
145
+ {active === 'fields' && <CompanyFields company={record} />}
131
146
  {active === 'activity' && <ActivitiesPanel targetType="company" targetId={record.id} />}
147
+ {active === 'people' && <CompanyPeople company={record} />}
132
148
  {active === 'notes' && <NotesPanel targetType="company" targetId={record.id} />}
133
149
  {active === 'decisions' && <DecisionsPanel targetType="company" targetId={record.id} />}
150
+ {active === 'lists' && <ListsPanel targetType="company" targetId={record.id} />}
151
+ {active === 'forms' && <FormsPanel targetType="company" targetId={record.id} />}
134
152
  {moduleTab?.render({ objectType: 'company', recordId: record.id })}
135
153
  </RecordTabs>
136
154
  </div>
137
155
 
138
156
  <aside className="space-y-4 text-[12px] lg:sticky lg:top-6">
139
157
  <CompanySidebar company={record} />
140
- <CompanyPeople company={record} />
141
158
  </aside>
142
159
  </div>
143
160
  </div>
@@ -192,6 +209,7 @@ function CompanyOverview({ company }: { readonly company: Company }): React.JSX.
192
209
  const opportunities = useOpportunities({ companyIds: [company.id] })
193
210
  const raises = useRaises({ companyIds: [company.id] })
194
211
  const partnerships = usePartnerships({ companyIds: [company.id] })
212
+ const enquiries = useEnquiries({ companyIds: [company.id] })
195
213
 
196
214
  return (
197
215
  <div className="space-y-8">
@@ -207,8 +225,13 @@ function CompanyOverview({ company }: { readonly company: Company }): React.JSX.
207
225
  opportunities={opportunities.records}
208
226
  raises={raises.records}
209
227
  partnerships={partnerships.records}
228
+ enquiries={enquiries.records}
210
229
  isLoading={
211
- deals.isLoading || opportunities.isLoading || raises.isLoading || partnerships.isLoading
230
+ deals.isLoading ||
231
+ opportunities.isLoading ||
232
+ raises.isLoading ||
233
+ partnerships.isLoading ||
234
+ enquiries.isLoading
212
235
  }
213
236
  />
214
237
  <LatestActivity targetType="company" targetId={company.id} />
@@ -353,6 +376,22 @@ function CompanySidebar({ company }: { readonly company: Company }): React.JSX.E
353
376
  )
354
377
  }
355
378
 
379
+ function CompanyFields({ company }: { readonly company: Company }): React.JSX.Element {
380
+ const { patch, error } = useCompanyPatch(company)
381
+ return (
382
+ <div className="space-y-4">
383
+ {error !== null && <ErrorPanel error={error} />}
384
+ <CustomFieldsPanel
385
+ objectType="company"
386
+ values={company.customFields}
387
+ onPatch={(customFields) => {
388
+ patch({ customFields })
389
+ }}
390
+ />
391
+ </div>
392
+ )
393
+ }
394
+
356
395
  /** The other side of the Position link: who holds a title here. */
357
396
  function CompanyPeople({ company }: { readonly company: Company }): React.JSX.Element {
358
397
  const positions = usePositions({ companyIds: [company.id] })
@@ -380,7 +419,7 @@ function CompanyPeople({ company }: { readonly company: Company }): React.JSX.El
380
419
  function submit(event: FormEvent): void {
381
420
  event.preventDefault()
382
421
 
383
- if (personId.length === 0 || title.trim().length === 0) {
422
+ if (personId.length === 0) {
384
423
  return
385
424
  }
386
425
 
@@ -389,73 +428,28 @@ function CompanyPeople({ company }: { readonly company: Company }): React.JSX.El
389
428
  }
390
429
 
391
430
  return (
392
- <section className="rounded-md border border-border">
393
- <div className="border-b border-border px-3.5 py-2.5">
394
- <SectionHeader
395
- title="People"
396
- onAdd={() => {
397
- setAdding((current) => !current)
398
- }}
399
- addLabel="Add person"
400
- compact
401
- />
402
- </div>
431
+ <section>
432
+ <SectionHeader
433
+ title="People"
434
+ onAdd={() => {
435
+ setAdding((current) => !current)
436
+ }}
437
+ addLabel="Add person"
438
+ />
403
439
 
404
440
  {createPosition.error !== null && (
405
- <div className="px-3.5 py-2">
441
+ <div className="mb-3">
406
442
  <ErrorPanel error={createPosition.error} />
407
443
  </div>
408
444
  )}
409
445
  {deletePosition.error !== null && (
410
- <div className="px-3.5 py-2">
446
+ <div className="mb-3">
411
447
  <ErrorPanel error={deletePosition.error} />
412
448
  </div>
413
449
  )}
414
450
 
415
- <ul className="divide-y divide-border">
416
- {positions.isLoading && (
417
- <li className="px-3.5 py-4 text-[12px] text-ink-faint">Loading people…</li>
418
- )}
419
- {!positions.isLoading && positions.records.length === 0 && !adding && (
420
- <li className="px-3.5 py-4 text-[12px] text-ink-faint">No people yet.</li>
421
- )}
422
- {positions.records.map((position) => {
423
- const person = personById.get(position.personId)
424
-
425
- return (
426
- <li key={position.id} className="space-y-1 px-3.5 py-2.5">
427
- <div className="flex items-start justify-between gap-2">
428
- <Link
429
- to={`/people/${position.personId}`}
430
- className="text-[13px] font-medium text-ink hover:text-accent"
431
- >
432
- {person?.name ?? 'Unknown'}
433
- </Link>
434
- <button
435
- type="button"
436
- onClick={() => {
437
- deletePosition.run(position.id)
438
- }}
439
- className="text-[11px] font-medium text-danger hover:underline"
440
- >
441
- Remove
442
- </button>
443
- </div>
444
- <InlineEdit
445
- value={position.title}
446
- onChange={(next) => {
447
- updateTitle.run({ id: position.id, changes: { title: next } })
448
- }}
449
- displayClassName="not-italic text-[12px]"
450
- emptyLabel="Add position title…"
451
- />
452
- </li>
453
- )
454
- })}
455
- </ul>
456
-
457
451
  {adding && (
458
- <form onSubmit={submit} className="space-y-2 border-t border-border bg-surface px-3.5 py-3">
452
+ <form onSubmit={submit} className="mb-4 space-y-2 rounded-md border border-border bg-surface p-3">
459
453
  <EntitySearch
460
454
  options={searchable.records
461
455
  .filter((person) => !held.has(person.id))
@@ -476,9 +470,8 @@ function CompanyPeople({ company }: { readonly company: Company }): React.JSX.El
476
470
  onChange={(event) => {
477
471
  setTitle(event.target.value)
478
472
  }}
479
- placeholder="Position title"
480
- className="w-full rounded-md border border-border bg-surface-raised px-2 py-1.5 text-[12px] outline-none focus:border-accent"
481
- required
473
+ placeholder="Position title (optional)"
474
+ className="w-full rounded-md border border-border bg-surface-raised px-2 py-1.5 text-[13px] outline-none focus:border-accent"
482
475
  />
483
476
  <div className="flex justify-end gap-2">
484
477
  <button
@@ -497,6 +490,48 @@ function CompanyPeople({ company }: { readonly company: Company }): React.JSX.El
497
490
  </div>
498
491
  </form>
499
492
  )}
493
+
494
+ {positions.isLoading && <p className="text-[13px] text-ink-faint">Loading people…</p>}
495
+
496
+ {!positions.isLoading && positions.records.length === 0 && !adding ? (
497
+ <p className="text-[13px] text-ink-faint">No people yet.</p>
498
+ ) : (
499
+ <ul className="divide-y divide-border rounded-md border border-border">
500
+ {positions.records.map((position) => {
501
+ const person = personById.get(position.personId)
502
+
503
+ return (
504
+ <li key={position.id} className="space-y-1 px-3.5 py-3">
505
+ <div className="flex items-start justify-between gap-2">
506
+ <Link
507
+ to={`/people/${position.personId}`}
508
+ className="text-[13px] font-medium text-ink hover:text-accent"
509
+ >
510
+ {person?.name ?? 'Unknown'}
511
+ </Link>
512
+ <button
513
+ type="button"
514
+ onClick={() => {
515
+ deletePosition.run(position.id)
516
+ }}
517
+ className="text-[11px] font-medium text-danger hover:underline"
518
+ >
519
+ Remove
520
+ </button>
521
+ </div>
522
+ <InlineEdit
523
+ value={position.title}
524
+ onChange={(next) => {
525
+ updateTitle.run({ id: position.id, changes: { title: next } })
526
+ }}
527
+ displayClassName="not-italic text-[12px] text-ink-muted"
528
+ emptyLabel="Add position title…"
529
+ />
530
+ </li>
531
+ )
532
+ })}
533
+ </ul>
534
+ )}
500
535
  </section>
501
536
  )
502
537
  }
@@ -7,6 +7,7 @@ import { usePatch } from '../api/resource.ts'
7
7
  import type { PatchResult } from '../api/resource.ts'
8
8
  import { useCompanies, useCompany } from '../api/resources/companies.ts'
9
9
  import { useDeal, useDeleteDeal, useUpdateDeal } from '../api/resources/deals.ts'
10
+ import { useFormSubmissionsForRecord } from '../api/resources/forms.ts'
10
11
  import { useMembers } from '../api/resources/members.ts'
11
12
  import { usePeople } from '../api/resources/people.ts'
12
13
  import { usePipelineStages } from '../api/resources/pipelineStages.ts'
@@ -18,7 +19,11 @@ import type { ChipTone } from '../components/Chip.tsx'
18
19
  import { DecisionsPanel } from '../components/DecisionsPanel.tsx'
19
20
  import { DeleteRecord } from '../components/DeleteRecord.tsx'
20
21
  import { EntitySearch } from '../components/EntitySearch.tsx'
22
+ import { FormsPanel } from '../components/FormsPanel.tsx'
23
+ import { CustomFieldsPanel } from '../components/CustomFieldsPanel.tsx'
24
+ import { useHasCustomFields } from '../components/useHasCustomFields.ts'
21
25
  import { InlineEdit } from '../components/InlineEdit.tsx'
26
+ import { ListsPanel } from '../components/ListsPanel.tsx'
22
27
  import { NotesPanel } from '../components/NotesPanel.tsx'
23
28
  import { PlanAttention } from '../components/PlanAttention.tsx'
24
29
  import { PlanPanel } from '../components/PlanPanel.tsx'
@@ -53,7 +58,9 @@ export function DealDetail(): React.JSX.Element {
53
58
  const { record, isLoading, isNotFound, error } = useDeal(id)
54
59
  const deleteDeal = useDeleteDeal()
55
60
  const moduleTabs = inSlotOrder(useRecordTabs('deal'))
61
+ const hasCustomFields = useHasCustomFields('deal')
56
62
  const [activeTab, setActiveTab] = useState('overview')
63
+ const formSubmissions = useFormSubmissionsForRecord('deal', id)
57
64
 
58
65
  if (isNotFound) {
59
66
  return <NotFoundPanel label="Deal" backTo="/deals" />
@@ -69,10 +76,15 @@ export function DealDetail(): React.JSX.Element {
69
76
 
70
77
  const tabs: readonly RecordTabDescriptor<string>[] = [
71
78
  { id: 'overview', label: 'Overview' },
79
+ ...(hasCustomFields ? [{ id: 'fields', label: 'Fields' }] : []),
72
80
  { id: 'plan', label: 'Plan' },
73
81
  { id: 'activity', label: 'Activity' },
74
82
  { id: 'notes', label: 'Notes' },
75
83
  { id: 'decisions', label: 'Decisions' },
84
+ { id: 'lists', label: 'Lists' },
85
+ ...(formSubmissions.records.length === 0
86
+ ? []
87
+ : [{ id: 'forms', label: 'Forms', count: formSubmissions.records.length }]),
76
88
  ...moduleTabs.map((tab) => ({ id: tab.id, label: tab.label })),
77
89
  ]
78
90
  const active = tabs.some((tab) => tab.id === activeTab) ? activeTab : 'overview'
@@ -109,10 +121,15 @@ export function DealDetail(): React.JSX.Element {
109
121
 
110
122
  <RecordTabs tabs={tabs} active={active} onChange={setActiveTab} ariaLabel="Deal sections">
111
123
  {active === 'overview' && <DealOverview deal={record} />}
124
+ {active === 'fields' && (
125
+ <DealFields deal={record} />
126
+ )}
112
127
  {active === 'plan' && <PlanPanel targetType="deal" targetId={record.id} />}
113
128
  {active === 'activity' && <ActivitiesPanel targetType="deal" targetId={record.id} />}
114
129
  {active === 'notes' && <NotesPanel targetType="deal" targetId={record.id} />}
115
130
  {active === 'decisions' && <DecisionsPanel targetType="deal" targetId={record.id} />}
131
+ {active === 'lists' && <ListsPanel targetType="deal" targetId={record.id} />}
132
+ {active === 'forms' && <FormsPanel targetType="deal" targetId={record.id} />}
116
133
  {moduleTab?.render({ objectType: 'deal', recordId: record.id })}
117
134
  </RecordTabs>
118
135
  </div>
@@ -239,6 +256,23 @@ function DealOverview({ deal }: { readonly deal: Deal }): React.JSX.Element {
239
256
  )
240
257
  }
241
258
 
259
+ /** The Fields tab: the workspace's custom fields for this deal. */
260
+ function DealFields({ deal }: { readonly deal: Deal }): React.JSX.Element {
261
+ const { patch, error } = useDealPatch(deal)
262
+ return (
263
+ <div className="space-y-4">
264
+ {error !== null && <ErrorPanel error={error} />}
265
+ <CustomFieldsPanel
266
+ objectType="deal"
267
+ values={deal.customFields}
268
+ onPatch={(customFields) => {
269
+ patch({ customFields })
270
+ }}
271
+ />
272
+ </div>
273
+ )
274
+ }
275
+
242
276
  /** Whole units in the box, cents on the wire. Blank clears the value. */
243
277
  function toValueCents(raw: string): number | null | undefined {
244
278
  const trimmed = raw.trim()