@kelpie/ui 0.8.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 (200) hide show
  1. package/dist/api/resource.d.ts +1 -1
  2. package/dist/api/resource.d.ts.map +1 -1
  3. package/dist/api/resource.js.map +1 -1
  4. package/dist/api/resources/consentPurposes.d.ts +13 -0
  5. package/dist/api/resources/consentPurposes.d.ts.map +1 -0
  6. package/dist/api/resources/consentPurposes.js +39 -0
  7. package/dist/api/resources/consentPurposes.js.map +1 -0
  8. package/dist/api/resources/customFields.d.ts +15 -0
  9. package/dist/api/resources/customFields.d.ts.map +1 -0
  10. package/dist/api/resources/customFields.js +41 -0
  11. package/dist/api/resources/customFields.js.map +1 -0
  12. package/dist/api/resources/enquiries.d.ts +39 -0
  13. package/dist/api/resources/enquiries.d.ts.map +1 -0
  14. package/dist/api/resources/enquiries.js +68 -0
  15. package/dist/api/resources/enquiries.js.map +1 -0
  16. package/dist/api/resources/forms.d.ts +21 -1
  17. package/dist/api/resources/forms.d.ts.map +1 -1
  18. package/dist/api/resources/forms.js +41 -0
  19. package/dist/api/resources/forms.js.map +1 -1
  20. package/dist/api/resources/importJobs.d.ts +5 -0
  21. package/dist/api/resources/importJobs.d.ts.map +1 -1
  22. package/dist/api/resources/importJobs.js +3 -0
  23. package/dist/api/resources/importJobs.js.map +1 -1
  24. package/dist/api/resources/opportunities.d.ts +2 -0
  25. package/dist/api/resources/opportunities.d.ts.map +1 -1
  26. package/dist/api/resources/opportunities.js +1 -0
  27. package/dist/api/resources/opportunities.js.map +1 -1
  28. package/dist/api/resources/sampleData.d.ts.map +1 -1
  29. package/dist/api/resources/sampleData.js +1 -0
  30. package/dist/api/resources/sampleData.js.map +1 -1
  31. package/dist/app/KelpieApp.d.ts.map +1 -1
  32. package/dist/app/KelpieApp.js +7 -1
  33. package/dist/app/KelpieApp.js.map +1 -1
  34. package/dist/components/ActivitiesPanel.d.ts.map +1 -1
  35. package/dist/components/ActivitiesPanel.js +1 -0
  36. package/dist/components/ActivitiesPanel.js.map +1 -1
  37. package/dist/components/CustomFieldsPanel.d.ts +23 -0
  38. package/dist/components/CustomFieldsPanel.d.ts.map +1 -0
  39. package/dist/components/CustomFieldsPanel.js +116 -0
  40. package/dist/components/CustomFieldsPanel.js.map +1 -0
  41. package/dist/components/FormsPanel.d.ts +18 -0
  42. package/dist/components/FormsPanel.d.ts.map +1 -0
  43. package/dist/components/FormsPanel.js +37 -0
  44. package/dist/components/FormsPanel.js.map +1 -0
  45. package/dist/components/PlanAttention.d.ts +3 -2
  46. package/dist/components/PlanAttention.d.ts.map +1 -1
  47. package/dist/components/PlanAttention.js +7 -3
  48. package/dist/components/PlanAttention.js.map +1 -1
  49. package/dist/components/Shell.d.ts.map +1 -1
  50. package/dist/components/Shell.js +3 -0
  51. package/dist/components/Shell.js.map +1 -1
  52. package/dist/components/useHasCustomFields.d.ts +13 -0
  53. package/dist/components/useHasCustomFields.d.ts.map +1 -0
  54. package/dist/components/useHasCustomFields.js +16 -0
  55. package/dist/components/useHasCustomFields.js.map +1 -0
  56. package/dist/pages/CompanyDetail.d.ts.map +1 -1
  57. package/dist/pages/CompanyDetail.js +24 -2
  58. package/dist/pages/CompanyDetail.js.map +1 -1
  59. package/dist/pages/DealDetail.d.ts.map +1 -1
  60. package/dist/pages/DealDetail.js +18 -1
  61. package/dist/pages/DealDetail.js.map +1 -1
  62. package/dist/pages/DecisionsPage.d.ts.map +1 -1
  63. package/dist/pages/DecisionsPage.js +2 -0
  64. package/dist/pages/DecisionsPage.js.map +1 -1
  65. package/dist/pages/EnquiriesPage.d.ts +2 -0
  66. package/dist/pages/EnquiriesPage.d.ts.map +1 -0
  67. package/dist/pages/EnquiriesPage.js +251 -0
  68. package/dist/pages/EnquiriesPage.js.map +1 -0
  69. package/dist/pages/EnquiryDetail.d.ts +2 -0
  70. package/dist/pages/EnquiryDetail.d.ts.map +1 -0
  71. package/dist/pages/EnquiryDetail.js +207 -0
  72. package/dist/pages/EnquiryDetail.js.map +1 -0
  73. package/dist/pages/EnquiryStageSettingsPage.d.ts +3 -0
  74. package/dist/pages/EnquiryStageSettingsPage.d.ts.map +1 -0
  75. package/dist/pages/EnquiryStageSettingsPage.js +34 -0
  76. package/dist/pages/EnquiryStageSettingsPage.js.map +1 -0
  77. package/dist/pages/FormDetail.d.ts.map +1 -1
  78. package/dist/pages/FormDetail.js +19 -1
  79. package/dist/pages/FormDetail.js.map +1 -1
  80. package/dist/pages/ListDetail.d.ts.map +1 -1
  81. package/dist/pages/ListDetail.js +27 -1
  82. package/dist/pages/ListDetail.js.map +1 -1
  83. package/dist/pages/OpportunityDetail.d.ts.map +1 -1
  84. package/dist/pages/OpportunityDetail.js +62 -3
  85. package/dist/pages/OpportunityDetail.js.map +1 -1
  86. package/dist/pages/PartnershipDetail.d.ts.map +1 -1
  87. package/dist/pages/PartnershipDetail.js +17 -1
  88. package/dist/pages/PartnershipDetail.js.map +1 -1
  89. package/dist/pages/PeoplePage.d.ts.map +1 -1
  90. package/dist/pages/PeoplePage.js +17 -0
  91. package/dist/pages/PeoplePage.js.map +1 -1
  92. package/dist/pages/PersonDetail.d.ts.map +1 -1
  93. package/dist/pages/PersonDetail.js +63 -3
  94. package/dist/pages/PersonDetail.js.map +1 -1
  95. package/dist/pages/PlanningPage.d.ts.map +1 -1
  96. package/dist/pages/PlanningPage.js +3 -0
  97. package/dist/pages/PlanningPage.js.map +1 -1
  98. package/dist/pages/RaiseDetail.d.ts.map +1 -1
  99. package/dist/pages/RaiseDetail.js +11 -1
  100. package/dist/pages/RaiseDetail.js.map +1 -1
  101. package/dist/pages/RoleDetail.js +1 -1
  102. package/dist/pages/RoleDetail.js.map +1 -1
  103. package/dist/pages/SearchPage.d.ts.map +1 -1
  104. package/dist/pages/SearchPage.js +1 -0
  105. package/dist/pages/SearchPage.js.map +1 -1
  106. package/dist/pages/admin/DataPage.d.ts.map +1 -1
  107. package/dist/pages/admin/DataPage.js +18 -3
  108. package/dist/pages/admin/DataPage.js.map +1 -1
  109. package/dist/pages/admin/FieldsPage.d.ts +2 -0
  110. package/dist/pages/admin/FieldsPage.d.ts.map +1 -0
  111. package/dist/pages/admin/FieldsPage.js +164 -0
  112. package/dist/pages/admin/FieldsPage.js.map +1 -0
  113. package/dist/pages/admin/PrivacyPage.d.ts +9 -0
  114. package/dist/pages/admin/PrivacyPage.d.ts.map +1 -0
  115. package/dist/pages/admin/PrivacyPage.js +170 -0
  116. package/dist/pages/admin/PrivacyPage.js.map +1 -0
  117. package/dist/pages/dashboard/attention.d.ts.map +1 -1
  118. package/dist/pages/dashboard/attention.js +3 -0
  119. package/dist/pages/dashboard/attention.js.map +1 -1
  120. package/dist/pages/forms/AddFieldMenu.d.ts +17 -0
  121. package/dist/pages/forms/AddFieldMenu.d.ts.map +1 -0
  122. package/dist/pages/forms/AddFieldMenu.js +43 -0
  123. package/dist/pages/forms/AddFieldMenu.js.map +1 -0
  124. package/dist/pages/forms/EmbedPanel.d.ts +4 -0
  125. package/dist/pages/forms/EmbedPanel.d.ts.map +1 -1
  126. package/dist/pages/forms/EmbedPanel.js +62 -3
  127. package/dist/pages/forms/EmbedPanel.js.map +1 -1
  128. package/dist/pages/forms/FieldsEditor.d.ts.map +1 -1
  129. package/dist/pages/forms/FieldsEditor.js +179 -36
  130. package/dist/pages/forms/FieldsEditor.js.map +1 -1
  131. package/dist/pages/forms/FormActions.d.ts +6 -0
  132. package/dist/pages/forms/FormActions.d.ts.map +1 -0
  133. package/dist/pages/forms/FormActions.js +149 -0
  134. package/dist/pages/forms/FormActions.js.map +1 -0
  135. package/dist/pages/forms/FormSettings.d.ts.map +1 -1
  136. package/dist/pages/forms/FormSettings.js +15 -19
  137. package/dist/pages/forms/FormSettings.js.map +1 -1
  138. package/dist/pages/forms/SubmissionDetail.d.ts +2 -0
  139. package/dist/pages/forms/SubmissionDetail.d.ts.map +1 -0
  140. package/dist/pages/forms/SubmissionDetail.js +76 -0
  141. package/dist/pages/forms/SubmissionDetail.js.map +1 -0
  142. package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -1
  143. package/dist/pages/forms/SubmissionsTable.js +56 -8
  144. package/dist/pages/forms/SubmissionsTable.js.map +1 -1
  145. package/dist/pages/forms/fieldList.d.ts +11 -5
  146. package/dist/pages/forms/fieldList.d.ts.map +1 -1
  147. package/dist/pages/forms/fieldList.js +66 -6
  148. package/dist/pages/forms/fieldList.js.map +1 -1
  149. package/dist/pages/forms/template.d.ts +17 -0
  150. package/dist/pages/forms/template.d.ts.map +1 -1
  151. package/dist/pages/forms/template.js +93 -0
  152. package/dist/pages/forms/template.js.map +1 -1
  153. package/dist/pages/onboarding/WorkspaceStepPage.js +1 -1
  154. package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -1
  155. package/package.json +2 -2
  156. package/src/api/resource.ts +6 -1
  157. package/src/api/resources/consentPurposes.ts +83 -0
  158. package/src/api/resources/customFields.ts +88 -0
  159. package/src/api/resources/enquiries.ts +118 -0
  160. package/src/api/resources/forms.ts +58 -0
  161. package/src/api/resources/importJobs.ts +9 -0
  162. package/src/api/resources/opportunities.ts +3 -0
  163. package/src/api/resources/sampleData.ts +1 -0
  164. package/src/app/KelpieApp.tsx +12 -0
  165. package/src/components/ActivitiesPanel.tsx +1 -0
  166. package/src/components/CustomFieldsPanel.tsx +330 -0
  167. package/src/components/FormsPanel.tsx +86 -0
  168. package/src/components/PlanAttention.tsx +20 -3
  169. package/src/components/Shell.tsx +3 -0
  170. package/src/components/useHasCustomFields.ts +18 -0
  171. package/src/pages/CompanyDetail.tsx +36 -1
  172. package/src/pages/DealDetail.tsx +31 -0
  173. package/src/pages/DecisionsPage.tsx +2 -0
  174. package/src/pages/EnquiriesPage.tsx +434 -0
  175. package/src/pages/EnquiryDetail.tsx +554 -0
  176. package/src/pages/EnquiryStageSettingsPage.tsx +63 -0
  177. package/src/pages/FormDetail.tsx +23 -1
  178. package/src/pages/ListDetail.tsx +62 -0
  179. package/src/pages/OpportunityDetail.tsx +165 -2
  180. package/src/pages/PartnershipDetail.tsx +32 -0
  181. package/src/pages/PeoplePage.tsx +20 -0
  182. package/src/pages/PersonDetail.tsx +152 -3
  183. package/src/pages/PlanningPage.tsx +3 -0
  184. package/src/pages/RaiseDetail.tsx +21 -0
  185. package/src/pages/RoleDetail.tsx +1 -1
  186. package/src/pages/SearchPage.tsx +1 -0
  187. package/src/pages/admin/DataPage.tsx +51 -3
  188. package/src/pages/admin/FieldsPage.tsx +455 -0
  189. package/src/pages/admin/PrivacyPage.tsx +461 -0
  190. package/src/pages/dashboard/attention.ts +3 -0
  191. package/src/pages/forms/AddFieldMenu.tsx +121 -0
  192. package/src/pages/forms/EmbedPanel.tsx +163 -2
  193. package/src/pages/forms/FieldsEditor.tsx +539 -165
  194. package/src/pages/forms/FormActions.tsx +552 -0
  195. package/src/pages/forms/FormSettings.tsx +29 -70
  196. package/src/pages/forms/SubmissionDetail.tsx +249 -0
  197. package/src/pages/forms/SubmissionsTable.tsx +109 -16
  198. package/src/pages/forms/fieldList.ts +68 -5
  199. package/src/pages/forms/template.ts +103 -0
  200. package/src/pages/onboarding/WorkspaceStepPage.tsx +1 -1
@@ -1,5 +1,5 @@
1
- import { FORM_FIELD_MAP_TARGETS, FORM_FIELD_TYPES, PERSON_EMAIL_TARGET, } from '@kelpie/schemas';
2
- import { NEW_SELECT_OPTIONS } from './template.js';
1
+ import { FORM_FIELD_MAP_TARGETS, FORM_FIELD_TYPES, PERSON_CONSENT_TARGET, PERSON_EMAIL_TARGET, } from '@kelpie/schemas';
2
+ import { CRM_FIELD_PRESETS, NEW_SELECT_OPTIONS } from './template.js';
3
3
  export const FIELD_TYPE_OPTIONS = FORM_FIELD_TYPES.map((type) => ({ value: type, label: type }));
4
4
  export const MAP_TARGET_OPTIONS = FORM_FIELD_MAP_TARGETS.map((target) => ({
5
5
  value: target,
@@ -15,6 +15,9 @@ export function toEditableFields(form) {
15
15
  mapTo: field.mapTo,
16
16
  options: field.options.map((option) => ({ ...option })),
17
17
  placeholder: field.placeholder,
18
+ statement: field.statement,
19
+ consentPurposeIds: [...field.consentPurposeIds],
20
+ consentPurposeLabels: { ...field.consentPurposeLabels },
18
21
  }));
19
22
  }
20
23
  /** Strips the local ids back off. Ids are assigned server-side on every write. */
@@ -48,14 +51,29 @@ export function editField(fields, id, change) {
48
51
  return fields.map((field) => {
49
52
  if (field.id !== id) {
50
53
  // Only one field may carry a CRM target, so taking one releases it
51
- // wherever it was. `submission` is the target that may repeat.
54
+ // wherever it was. `submission` and `person.consent` are the targets
55
+ // that may repeat — consent's uniqueness is per purpose, not per
56
+ // target, and is enforced when the purpose is picked.
52
57
  return change.mapTo !== undefined &&
53
58
  change.mapTo !== 'submission' &&
59
+ change.mapTo !== PERSON_CONSENT_TARGET &&
54
60
  field.mapTo === change.mapTo
55
61
  ? { ...field, mapTo: 'submission' }
56
62
  : field;
57
63
  }
58
64
  const next = { ...field, ...change };
65
+ // A consent or notice field must map to person.consent; anything else
66
+ // clears any lingering purpose list.
67
+ const isConsentLike = next.type === 'consent' || next.type === 'notice';
68
+ if (isConsentLike && next.mapTo !== PERSON_CONSENT_TARGET) {
69
+ return { ...withoutOptions(next), mapTo: PERSON_CONSENT_TARGET };
70
+ }
71
+ if (next.mapTo === PERSON_CONSENT_TARGET && !isConsentLike) {
72
+ return { ...withoutOptions(next), type: 'consent' };
73
+ }
74
+ if (!isConsentLike && (next.consentPurposeIds ?? []).length > 0) {
75
+ return withoutOptions({ ...next, consentPurposeIds: [] });
76
+ }
59
77
  if (next.type !== 'select') {
60
78
  return withoutOptions(next);
61
79
  }
@@ -92,6 +110,7 @@ export function findProblems(fields, createsDeal) {
92
110
  const list = [];
93
111
  const byField = new Map();
94
112
  const seen = new Set();
113
+ const usedConsentPurposes = new Set();
95
114
  if (!fields.some((field) => field.mapTo === PERSON_EMAIL_TARGET)) {
96
115
  list.push(`One field must map to ${PERSON_EMAIL_TARGET}, or no submission can be processed.`);
97
116
  }
@@ -99,7 +118,34 @@ export function findProblems(fields, createsDeal) {
99
118
  list.push('A form that creates deals needs a company field for the deal to belong to.');
100
119
  }
101
120
  for (const field of fields) {
102
- if (field.mapTo !== 'submission') {
121
+ if (field.mapTo === PERSON_CONSENT_TARGET) {
122
+ const purposes = field.consentPurposeIds ?? [];
123
+ if (field.type === 'notice' && (field.statement ?? '').trim().length === 0) {
124
+ byField.set(field.id, 'A notice field needs a statement.');
125
+ }
126
+ if (purposes.length === 0) {
127
+ byField.set(field.id, field.type === 'notice'
128
+ ? 'Pick at least one purpose this notice grants implicitly.'
129
+ : 'Pick at least one consent purpose this field offers.');
130
+ }
131
+ else {
132
+ const localSeen = new Set();
133
+ for (const purposeId of purposes) {
134
+ if (localSeen.has(purposeId)) {
135
+ byField.set(field.id, 'This field lists a purpose twice.');
136
+ break;
137
+ }
138
+ localSeen.add(purposeId);
139
+ if (usedConsentPurposes.has(purposeId)) {
140
+ byField.set(field.id, 'Another consent field already offers this purpose.');
141
+ }
142
+ else {
143
+ usedConsentPurposes.add(purposeId);
144
+ }
145
+ }
146
+ }
147
+ }
148
+ else if (field.mapTo !== 'submission') {
103
149
  if (seen.has(field.mapTo)) {
104
150
  byField.set(field.id, `Another field already maps to ${field.mapTo}.`);
105
151
  }
@@ -119,8 +165,22 @@ export function findProblems(fields, createsDeal) {
119
165
  export function isUsable(problems) {
120
166
  return problems.list.length === 0 && problems.byField.size === 0;
121
167
  }
122
- /** The types a mapping can sensibly render as. Choosing `person.email` implies an email input. */
168
+ /** The types a mapping can sensibly render as. */
123
169
  export function typeForTarget(target, current) {
124
- return target === PERSON_EMAIL_TARGET ? 'email' : current;
170
+ if (target === PERSON_EMAIL_TARGET)
171
+ return 'email';
172
+ if (target === PERSON_CONSENT_TARGET) {
173
+ return current === 'notice' ? 'notice' : 'consent';
174
+ }
175
+ return current === 'consent' || current === 'notice' ? 'text' : current;
176
+ }
177
+ /**
178
+ * The CRM presets whose mapping no current field carries: what "Add field" may
179
+ * still offer. A CRM target may appear once, so a preset leaves the menu the
180
+ * moment a field takes its target and returns when that field releases it.
181
+ */
182
+ export function unusedCrmPresets(fields) {
183
+ const used = new Set(fields.map((field) => field.mapTo));
184
+ return CRM_FIELD_PRESETS.filter((preset) => !used.has(preset.mapTo));
125
185
  }
126
186
  //# sourceMappingURL=fieldList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fieldList.js","sourceRoot":"","sources":["../../../src/pages/forms/fieldList.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fieldList.js","sourceRoot":"","sources":["../../../src/pages/forms/fieldList.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,21 @@ export declare const NEW_SELECT_OPTIONS: {
15
15
  value: string;
16
16
  valueType: 'string';
17
17
  }[];
18
+ /**
19
+ * One ready-made field per CRM mapping target, in the target enum's order.
20
+ *
21
+ * "Add field" offers these so adding the company field is one click, not
22
+ * add-then-configure. Only one field may carry a CRM target, so the menu shows
23
+ * each preset only while its target is free — `unusedCrmPresets` in
24
+ * `fieldList.ts` does that filtering.
25
+ */
26
+ export declare const CRM_FIELD_PRESETS: readonly FormFieldInput[];
27
+ /** A submission-only entry in the "Add field" menu: shown by control, not by mapping. */
28
+ export interface SubmissionFieldPreset {
29
+ /** What the menu shows. The field itself starts with its own label. */
30
+ readonly menuLabel: string;
31
+ readonly field: FormFieldInput;
32
+ }
33
+ /** The submission-only fields "Add field" always offers; they may repeat freely. */
34
+ export declare const SUBMISSION_FIELD_PRESETS: readonly SubmissionFieldPreset[];
18
35
  //# sourceMappingURL=template.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/pages/forms/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,cAAc,EAYxD,CAAA;AAED,kGAAkG;AAClG,eAAO,MAAM,SAAS,EAAE,cAMvB,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB;;;eACoB,QAAQ;GAE1D,CAAA"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/pages/forms/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,cAAc,EAYxD,CAAA;AAED,kGAAkG;AAClG,eAAO,MAAM,SAAS,EAAE,cAMvB,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB;;;eACoB,QAAQ;GAE1D,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EAuCtD,CAAA;AAED,yFAAyF;AACzF,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAC/B;AAED,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EA4CpE,CAAA"}
@@ -31,4 +31,97 @@ export const NEW_SELECT_OPTIONS = [
31
31
  { key: 'option_a', value: 'Option A', valueType: 'string' },
32
32
  { key: 'option_b', value: 'Option B', valueType: 'string' },
33
33
  ];
34
+ /**
35
+ * One ready-made field per CRM mapping target, in the target enum's order.
36
+ *
37
+ * "Add field" offers these so adding the company field is one click, not
38
+ * add-then-configure. Only one field may carry a CRM target, so the menu shows
39
+ * each preset only while its target is free — `unusedCrmPresets` in
40
+ * `fieldList.ts` does that filtering.
41
+ */
42
+ export const CRM_FIELD_PRESETS = [
43
+ { label: 'Name', type: 'text', required: false, mapTo: 'person.name', placeholder: 'Your name' },
44
+ // The other way to ask for a name. A form takes one box or this pair; the
45
+ // menu hides whichever is already mapped, so both are offered and neither
46
+ // ends up used twice.
47
+ {
48
+ label: 'First name',
49
+ type: 'text',
50
+ required: false,
51
+ mapTo: 'person.first_name',
52
+ placeholder: 'First name',
53
+ },
54
+ {
55
+ label: 'Last name',
56
+ type: 'text',
57
+ required: false,
58
+ mapTo: 'person.last_name',
59
+ placeholder: 'Last name',
60
+ },
61
+ {
62
+ label: 'Email',
63
+ type: 'email',
64
+ required: true,
65
+ mapTo: 'person.email',
66
+ placeholder: 'you@company.com',
67
+ },
68
+ { label: 'Company', type: 'text', required: false, mapTo: 'company.name', placeholder: 'Company name' },
69
+ {
70
+ label: 'Company website',
71
+ type: 'text',
72
+ required: false,
73
+ mapTo: 'company.domain',
74
+ placeholder: 'company.com',
75
+ },
76
+ { label: 'Job title', type: 'text', required: false, mapTo: 'position.title', placeholder: 'Your role' },
77
+ { label: 'Enquiry name', type: 'text', required: false, mapTo: 'enquiry.name', placeholder: null },
78
+ { label: 'Deal name', type: 'text', required: false, mapTo: 'deal.name', placeholder: null },
79
+ { label: 'Opportunity name', type: 'text', required: false, mapTo: 'opportunity.name', placeholder: null },
80
+ { label: 'Partnership name', type: 'text', required: false, mapTo: 'partnership.name', placeholder: null },
81
+ ];
82
+ /** The submission-only fields "Add field" always offers; they may repeat freely. */
83
+ export const SUBMISSION_FIELD_PRESETS = [
84
+ { menuLabel: 'Text', field: NEW_FIELD },
85
+ {
86
+ menuLabel: 'Text area',
87
+ field: { label: 'Message', type: 'textarea', required: false, mapTo: 'submission', placeholder: null },
88
+ },
89
+ {
90
+ menuLabel: 'Select',
91
+ field: {
92
+ label: 'New select',
93
+ type: 'select',
94
+ required: false,
95
+ mapTo: 'submission',
96
+ placeholder: null,
97
+ options: NEW_SELECT_OPTIONS,
98
+ },
99
+ },
100
+ {
101
+ menuLabel: 'Consent',
102
+ field: {
103
+ label: 'Consent',
104
+ type: 'consent',
105
+ required: false,
106
+ mapTo: 'person.consent',
107
+ placeholder: null,
108
+ statement: 'Please tell us how we can contact you.',
109
+ consentPurposeIds: [],
110
+ consentPurposeLabels: {},
111
+ },
112
+ },
113
+ {
114
+ menuLabel: 'Notice',
115
+ field: {
116
+ label: 'Privacy notice',
117
+ type: 'notice',
118
+ required: false,
119
+ mapTo: 'person.consent',
120
+ placeholder: null,
121
+ statement: 'By submitting this form you agree to us storing your information and using it to contact you about your enquiry.',
122
+ consentPurposeIds: [],
123
+ consentPurposeLabels: {},
124
+ },
125
+ },
126
+ ];
34
127
  //# sourceMappingURL=template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/pages/forms/template.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA8B;IAC5D,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE;IAC/F;QACE,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,iBAAiB;KAC/B;IACD,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE;IACtF,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE;IACvF,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE;CAC7F,CAAA;AAED,kGAAkG;AAClG,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,IAAI;CAClB,CAAA;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAiB,EAAE;IACpE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAiB,EAAE;CACrE,CAAA"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/pages/forms/template.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,6 @@ export function WorkspaceStepPage() {
80
80
  if (isSignedOut) {
81
81
  return _jsx(Navigate, { to: "/login", replace: true });
82
82
  }
83
- return (_jsx(AuthLayout, { step: 1, title: "Create your workspace", description: "A workspace is your company brain \u2014 CRM records, handbook, and team.", footer: _jsx(Link, { to: "/login", className: "font-medium text-accent hover:underline", children: "Sign in as somebody else" }), children: _jsxs("form", { onSubmit: submit, className: "mt-5 space-y-3", children: [_jsx(TextField, { label: "Workspace name", value: name, onChange: changeName, placeholder: "Acme Labs", autoComplete: "organization", required: true }), _jsx(TextField, { label: "Slug", value: slug, onChange: changeSlug, hint: "Lowercase letters, digits, and hyphens. It appears in URLs.", mono: true, required: true }), _jsxs("p", { className: "text-[11px] text-ink-faint", children: ["Timezone: ", timezone, ". Change it later in Admin \u2192 Workspace."] }), _jsxs("label", { className: "flex items-start gap-2 text-[12px] text-ink", children: [_jsx("input", { type: "checkbox", checked: seedSample, onChange: (event) => setSeedSample(event.target.checked), className: "mt-0.5 h-4 w-4 rounded border-border text-accent focus:ring-accent" }), _jsx("span", { children: "Install sample data \u2014 a small set of companies, people, deals, opportunities, fundraising, partnerships, and hiring so the workspace has something to look at. You can delete it later." })] }), createWorkspace.error !== null && _jsx(ErrorPanel, { error: createWorkspace.error }), installSampleData.error !== null && _jsx(ErrorPanel, { error: installSampleData.error }), _jsx(SubmitButton, { label: "Continue", pendingLabel: installSampleData.isPending ? 'Installing sample data…' : 'Creating…', isPending: createWorkspace.isPending || installSampleData.isPending })] }) }));
83
+ return (_jsx(AuthLayout, { step: 1, title: "Create your workspace", description: "A workspace is your company brain \u2014 CRM records, handbook, and team.", footer: _jsx(Link, { to: "/login", className: "font-medium text-accent hover:underline", children: "Sign in as somebody else" }), children: _jsxs("form", { onSubmit: submit, className: "mt-5 space-y-3", children: [_jsx(TextField, { label: "Workspace name", value: name, onChange: changeName, placeholder: "Acme Labs", autoComplete: "organization", required: true }), _jsx(TextField, { label: "Slug", value: slug, onChange: changeSlug, hint: "Lowercase letters, digits, and hyphens. It appears in URLs.", mono: true, required: true }), _jsxs("p", { className: "text-[11px] text-ink-faint", children: ["Timezone: ", timezone, ". Change it later in Admin \u2192 Workspace."] }), _jsxs("label", { className: "flex items-start gap-2 text-[12px] text-ink", children: [_jsx("input", { type: "checkbox", checked: seedSample, onChange: (event) => setSeedSample(event.target.checked), className: "mt-0.5 h-4 w-4 rounded border-border text-accent focus:ring-accent" }), _jsx("span", { children: "Install sample data \u2014 a small set of companies, people, deals, enquiries, opportunities, fundraising, partnerships, and hiring so the workspace has something to look at. You can delete it later." })] }), createWorkspace.error !== null && _jsx(ErrorPanel, { error: createWorkspace.error }), installSampleData.error !== null && _jsx(ErrorPanel, { error: installSampleData.error }), _jsx(SubmitButton, { label: "Continue", pendingLabel: installSampleData.isPending ? 'Installing sample data…' : 'Creating…', isPending: createWorkspace.isPending || installSampleData.isPending })] }) }));
84
84
  }
85
85
  //# sourceMappingURL=WorkspaceStepPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceStepPage.js","sourceRoot":"","sources":["../../../src/pages/onboarding/WorkspaceStepPage.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkspaceStepPage.js","sourceRoot":"","sources":["../../../src/pages/onboarding/WorkspaceStepPage.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kelpie/ui",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "React UI for Kelpie: components, pages, API client, and the extension registry an assembly composes modules through.",
5
5
  "keywords": [
6
6
  "kelpie",
@@ -48,7 +48,7 @@
48
48
  "@dnd-kit/core": "^6.3.1",
49
49
  "@dnd-kit/sortable": "^10.0.0",
50
50
  "@dnd-kit/utilities": "^3.2.2",
51
- "@kelpie/schemas": "^0.8.0",
51
+ "@kelpie/schemas": "^0.9.0",
52
52
  "@tanstack/react-query": "^5.101.4",
53
53
  "react-markdown": "^10.1.0",
54
54
  "react-router": "^8.3.0",
@@ -367,7 +367,12 @@ export function createReadOnlyResourceHooks<TRecord>(
367
367
  export function createResourceHooks<
368
368
  TRecord extends { readonly id: string },
369
369
  TCreateInput,
370
- TUpdateInput extends Partial<TRecord>,
370
+ // The constraint is deliberately looser than `Partial<TRecord>`. A merge-patch
371
+ // field (a record whose value type includes `null` to clear a key) does not
372
+ // fit `Partial<TRecord>` when the record's own value type is non-null, and
373
+ // that shape reaches the record for real (custom-fields, and any later
374
+ // module that carries one). `mergeDefined` needs no more than an object here.
375
+ TUpdateInput extends object,
371
376
  >(
372
377
  definition: ResourceDefinition<TRecord, TCreateInput, TUpdateInput>,
373
378
  ): ResourceHooks<TRecord, TCreateInput, TUpdateInput> {
@@ -0,0 +1,83 @@
1
+ import {
2
+ consentPurposeBody,
3
+ consentPurposeSchema,
4
+ createConsentPurposeBody,
5
+ } from '@kelpie/schemas'
6
+ import type {
7
+ ConsentPurpose,
8
+ ConsentPurposeInput,
9
+ CreateConsentPurposeInput,
10
+ } from '@kelpie/schemas'
11
+
12
+ import type { QueryParameters } from '../client.ts'
13
+ import { createResourceHooks } from '../resource.ts'
14
+ import type {
15
+ ListOptions,
16
+ MutationResult,
17
+ RecordListResult,
18
+ RecordResult,
19
+ UpdateArguments,
20
+ } from '../resource.ts'
21
+
22
+ /**
23
+ * `/v1/consent_purposes`. Workspace-defined consent purposes.
24
+ *
25
+ * Every capture site — form consent fields, lists, imports, the manual
26
+ * override on a Person — names one of these. Reads are open to any member;
27
+ * writes need the admin role, enforced server-side.
28
+ */
29
+
30
+ const consentPurposes = createResourceHooks<
31
+ ConsentPurpose,
32
+ CreateConsentPurposeInput,
33
+ ConsentPurposeInput
34
+ >({
35
+ name: 'consent_purposes',
36
+ path: '/consent_purposes',
37
+ decode: consentPurposeSchema.parse,
38
+ createBody: createConsentPurposeBody,
39
+ updateBody: consentPurposeBody,
40
+ })
41
+
42
+ export interface ConsentPurposeFilters {
43
+ readonly term?: string | undefined
44
+ readonly limit?: number | undefined
45
+ readonly sort?: string | undefined
46
+ }
47
+
48
+ function consentPurposeQuery(filters: ConsentPurposeFilters): QueryParameters {
49
+ return {
50
+ q: filters.term,
51
+ limit: filters.limit,
52
+ sort: filters.sort,
53
+ }
54
+ }
55
+
56
+ export function useConsentPurposes(
57
+ filters: ConsentPurposeFilters = {},
58
+ options: ListOptions = {},
59
+ ): RecordListResult<ConsentPurpose> {
60
+ return consentPurposes.useList(consentPurposeQuery(filters), options)
61
+ }
62
+
63
+ export function useConsentPurpose(id: string | undefined): RecordResult<ConsentPurpose> {
64
+ return consentPurposes.useRecord(id)
65
+ }
66
+
67
+ export function useCreateConsentPurpose(): MutationResult<
68
+ CreateConsentPurposeInput,
69
+ ConsentPurpose
70
+ > {
71
+ return consentPurposes.useCreate()
72
+ }
73
+
74
+ export function useUpdateConsentPurpose(): MutationResult<
75
+ UpdateArguments<ConsentPurposeInput>,
76
+ ConsentPurpose
77
+ > {
78
+ return consentPurposes.useUpdate()
79
+ }
80
+
81
+ export function useDeleteConsentPurpose(): MutationResult<string, void> {
82
+ return consentPurposes.useRemove()
83
+ }
@@ -0,0 +1,88 @@
1
+ import {
2
+ createCustomFieldDefinitionBody,
3
+ customFieldDefinitionBody,
4
+ customFieldDefinitionSchema,
5
+ } from '@kelpie/schemas'
6
+ import type {
7
+ CreateCustomFieldDefinitionInput,
8
+ CustomFieldDefinition,
9
+ CustomFieldDefinitionInput,
10
+ CustomFieldObjectType,
11
+ } from '@kelpie/schemas'
12
+
13
+ import type { QueryParameters } from '../client.ts'
14
+ import { createResourceHooks } from '../resource.ts'
15
+ import type {
16
+ ListOptions,
17
+ MutationResult,
18
+ RecordListResult,
19
+ RecordResult,
20
+ UpdateArguments,
21
+ } from '../resource.ts'
22
+
23
+ /**
24
+ * `/v1/custom_fields`. Workspace-defined field definitions.
25
+ *
26
+ * A record's `custom_fields` values live on that record's own resource — this
27
+ * hook family manages only the definitions. `alsoInvalidates` wakes every
28
+ * pipeline record list because a new definition changes what shows up on their
29
+ * detail pages.
30
+ */
31
+
32
+ const customFields = createResourceHooks<
33
+ CustomFieldDefinition,
34
+ CreateCustomFieldDefinitionInput,
35
+ CustomFieldDefinitionInput
36
+ >({
37
+ name: 'custom_fields',
38
+ path: '/custom_fields',
39
+ decode: customFieldDefinitionSchema.parse,
40
+ createBody: createCustomFieldDefinitionBody,
41
+ updateBody: customFieldDefinitionBody,
42
+ })
43
+
44
+ /** The documented filters on `GET /v1/custom_fields`. */
45
+ export interface CustomFieldFilters {
46
+ readonly term?: string | undefined
47
+ readonly objectType?: CustomFieldObjectType | undefined
48
+ readonly limit?: number | undefined
49
+ readonly sort?: string | undefined
50
+ }
51
+
52
+ function customFieldQuery(filters: CustomFieldFilters): QueryParameters {
53
+ return {
54
+ q: filters.term,
55
+ object_type: filters.objectType,
56
+ limit: filters.limit,
57
+ sort: filters.sort,
58
+ }
59
+ }
60
+
61
+ export function useCustomFields(
62
+ filters: CustomFieldFilters = {},
63
+ options: ListOptions = {},
64
+ ): RecordListResult<CustomFieldDefinition> {
65
+ return customFields.useList(customFieldQuery(filters), options)
66
+ }
67
+
68
+ export function useCustomField(id: string | undefined): RecordResult<CustomFieldDefinition> {
69
+ return customFields.useRecord(id)
70
+ }
71
+
72
+ export function useCreateCustomField(): MutationResult<
73
+ CreateCustomFieldDefinitionInput,
74
+ CustomFieldDefinition
75
+ > {
76
+ return customFields.useCreate()
77
+ }
78
+
79
+ export function useUpdateCustomField(): MutationResult<
80
+ UpdateArguments<CustomFieldDefinitionInput>,
81
+ CustomFieldDefinition
82
+ > {
83
+ return customFields.useUpdate()
84
+ }
85
+
86
+ export function useDeleteCustomField(): MutationResult<string, void> {
87
+ return customFields.useRemove()
88
+ }
@@ -0,0 +1,118 @@
1
+ import { dealSchema, enquiryBody, enquirySchema } from '@kelpie/schemas'
2
+ import type { Deal, Enquiry, EnquiryInput } from '@kelpie/schemas'
3
+ import { useMutation, useQueryClient } from '@tanstack/react-query'
4
+
5
+ import type { QueryParameters } from '../client.ts'
6
+ import { useApiClient } from '../context.ts'
7
+ import { toError } from '../errors.ts'
8
+ import { createResourceHooks } from '../resource.ts'
9
+ import type {
10
+ ListOptions,
11
+ MutationResult,
12
+ RecordListResult,
13
+ RecordResult,
14
+ UpdateArguments,
15
+ } from '../resource.ts'
16
+
17
+ /**
18
+ * `/v1/enquiries`. Top-of-funnel: what a website form or an email drops onto
19
+ * the pipeline before it becomes a deal. Create needs only a name; the API
20
+ * lands the enquiry in the pipeline's first open stage and hands it to the
21
+ * caller as owner.
22
+ */
23
+
24
+ export interface CreateEnquiryInput extends EnquiryInput {
25
+ readonly name: string
26
+ }
27
+
28
+ const enquiries = createResourceHooks<Enquiry, CreateEnquiryInput, EnquiryInput>({
29
+ name: 'enquiries',
30
+ path: '/enquiries',
31
+ decode: enquirySchema.parse,
32
+ createBody: enquiryBody,
33
+ updateBody: enquiryBody,
34
+ // Every write here emits an activity server-side, in the same transaction,
35
+ // so a timeline rendered on this record is stale the moment the write lands.
36
+ alsoInvalidates: ['activities'],
37
+ })
38
+
39
+ /** The documented filters on `GET /v1/enquiries`. */
40
+ export interface EnquiryFilters {
41
+ /** Matches the enquiry's name, source, summary, tags, and its company's name. */
42
+ readonly term?: string | undefined
43
+ /** Exact sources ("Website", "Email", …). Repeats on the wire. */
44
+ readonly sources?: readonly string[] | undefined
45
+ /** Enquiries at any of these companies. Repeats on the wire. */
46
+ readonly companyIds?: readonly string[] | undefined
47
+ /** Enquiries sitting in any of these stages. Repeats on the wire. */
48
+ readonly stageIds?: readonly string[] | undefined
49
+ /** Enquiries any of these people are on. Repeats on the wire. */
50
+ readonly personIds?: readonly string[] | undefined
51
+ readonly limit?: number | undefined
52
+ /** `field` ascending, `-field` descending. Only `name`, `created_at`, `updated_at` are sortable. */
53
+ readonly sort?: string | undefined
54
+ }
55
+
56
+ function enquiryQuery(filters: EnquiryFilters): QueryParameters {
57
+ return {
58
+ q: filters.term,
59
+ source: filters.sources,
60
+ company_id: filters.companyIds,
61
+ stage_id: filters.stageIds,
62
+ person_id: filters.personIds,
63
+ limit: filters.limit,
64
+ sort: filters.sort,
65
+ }
66
+ }
67
+
68
+ export function useEnquiries(
69
+ filters: EnquiryFilters = {},
70
+ options: ListOptions = {},
71
+ ): RecordListResult<Enquiry> {
72
+ return enquiries.useList(enquiryQuery(filters), options)
73
+ }
74
+
75
+ export function useEnquiry(id: string | undefined): RecordResult<Enquiry> {
76
+ return enquiries.useRecord(id)
77
+ }
78
+
79
+ export function useCreateEnquiry(): MutationResult<CreateEnquiryInput, Enquiry> {
80
+ return enquiries.useCreate()
81
+ }
82
+
83
+ export function useUpdateEnquiry(): MutationResult<UpdateArguments<EnquiryInput>, Enquiry> {
84
+ return enquiries.useUpdate()
85
+ }
86
+
87
+ export function useDeleteEnquiry(): MutationResult<string, void> {
88
+ return enquiries.useRemove()
89
+ }
90
+
91
+ /**
92
+ * `POST /v1/enquiries/:id/convert`. Returns the freshly created deal, so the
93
+ * caller can navigate straight to it. 409 if the enquiry has already been
94
+ * converted; 422 if it has no linked company yet.
95
+ */
96
+ export function useConvertEnquiry(): MutationResult<string, Deal> {
97
+ const client = useApiClient()
98
+ const queryClient = useQueryClient()
99
+ const mutation = useMutation({
100
+ mutationFn: (id: string) =>
101
+ client.post(`/enquiries/${id}/convert`, {}, dealSchema.parse),
102
+ onSuccess: () => {
103
+ // The enquiry, deals list, activities on both sides are all stale.
104
+ void queryClient.invalidateQueries({ queryKey: ['enquiries'] })
105
+ void queryClient.invalidateQueries({ queryKey: ['deals'] })
106
+ void queryClient.invalidateQueries({ queryKey: ['activities'] })
107
+ },
108
+ })
109
+
110
+ return {
111
+ run: (input) => {
112
+ mutation.mutate(input)
113
+ },
114
+ runAsync: (input) => mutation.mutateAsync(input),
115
+ isPending: mutation.isPending,
116
+ error: toError(mutation.error),
117
+ }
118
+ }