@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.
- package/dist/api/resource.d.ts +1 -1
- package/dist/api/resource.d.ts.map +1 -1
- package/dist/api/resource.js.map +1 -1
- package/dist/api/resources/consentPurposes.d.ts +13 -0
- package/dist/api/resources/consentPurposes.d.ts.map +1 -0
- package/dist/api/resources/consentPurposes.js +39 -0
- package/dist/api/resources/consentPurposes.js.map +1 -0
- package/dist/api/resources/customFields.d.ts +15 -0
- package/dist/api/resources/customFields.d.ts.map +1 -0
- package/dist/api/resources/customFields.js +41 -0
- package/dist/api/resources/customFields.js.map +1 -0
- package/dist/api/resources/enquiries.d.ts +39 -0
- package/dist/api/resources/enquiries.d.ts.map +1 -0
- package/dist/api/resources/enquiries.js +68 -0
- package/dist/api/resources/enquiries.js.map +1 -0
- package/dist/api/resources/forms.d.ts +21 -1
- package/dist/api/resources/forms.d.ts.map +1 -1
- package/dist/api/resources/forms.js +41 -0
- package/dist/api/resources/forms.js.map +1 -1
- package/dist/api/resources/importJobs.d.ts +5 -0
- package/dist/api/resources/importJobs.d.ts.map +1 -1
- package/dist/api/resources/importJobs.js +3 -0
- package/dist/api/resources/importJobs.js.map +1 -1
- package/dist/api/resources/opportunities.d.ts +2 -0
- package/dist/api/resources/opportunities.d.ts.map +1 -1
- package/dist/api/resources/opportunities.js +1 -0
- package/dist/api/resources/opportunities.js.map +1 -1
- package/dist/api/resources/sampleData.d.ts.map +1 -1
- package/dist/api/resources/sampleData.js +1 -0
- package/dist/api/resources/sampleData.js.map +1 -1
- package/dist/app/KelpieApp.d.ts.map +1 -1
- package/dist/app/KelpieApp.js +7 -1
- package/dist/app/KelpieApp.js.map +1 -1
- package/dist/components/ActivitiesPanel.d.ts.map +1 -1
- package/dist/components/ActivitiesPanel.js +1 -0
- package/dist/components/ActivitiesPanel.js.map +1 -1
- package/dist/components/CustomFieldsPanel.d.ts +23 -0
- package/dist/components/CustomFieldsPanel.d.ts.map +1 -0
- package/dist/components/CustomFieldsPanel.js +116 -0
- package/dist/components/CustomFieldsPanel.js.map +1 -0
- package/dist/components/FormsPanel.d.ts +18 -0
- package/dist/components/FormsPanel.d.ts.map +1 -0
- package/dist/components/FormsPanel.js +37 -0
- package/dist/components/FormsPanel.js.map +1 -0
- package/dist/components/PlanAttention.d.ts +3 -2
- package/dist/components/PlanAttention.d.ts.map +1 -1
- package/dist/components/PlanAttention.js +7 -3
- package/dist/components/PlanAttention.js.map +1 -1
- package/dist/components/Shell.d.ts.map +1 -1
- package/dist/components/Shell.js +3 -0
- package/dist/components/Shell.js.map +1 -1
- package/dist/components/useHasCustomFields.d.ts +13 -0
- package/dist/components/useHasCustomFields.d.ts.map +1 -0
- package/dist/components/useHasCustomFields.js +16 -0
- package/dist/components/useHasCustomFields.js.map +1 -0
- package/dist/pages/CompanyDetail.d.ts.map +1 -1
- package/dist/pages/CompanyDetail.js +24 -2
- package/dist/pages/CompanyDetail.js.map +1 -1
- package/dist/pages/DealDetail.d.ts.map +1 -1
- package/dist/pages/DealDetail.js +18 -1
- package/dist/pages/DealDetail.js.map +1 -1
- package/dist/pages/DecisionsPage.d.ts.map +1 -1
- package/dist/pages/DecisionsPage.js +2 -0
- package/dist/pages/DecisionsPage.js.map +1 -1
- package/dist/pages/EnquiriesPage.d.ts +2 -0
- package/dist/pages/EnquiriesPage.d.ts.map +1 -0
- package/dist/pages/EnquiriesPage.js +251 -0
- package/dist/pages/EnquiriesPage.js.map +1 -0
- package/dist/pages/EnquiryDetail.d.ts +2 -0
- package/dist/pages/EnquiryDetail.d.ts.map +1 -0
- package/dist/pages/EnquiryDetail.js +207 -0
- package/dist/pages/EnquiryDetail.js.map +1 -0
- package/dist/pages/EnquiryStageSettingsPage.d.ts +3 -0
- package/dist/pages/EnquiryStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/EnquiryStageSettingsPage.js +34 -0
- package/dist/pages/EnquiryStageSettingsPage.js.map +1 -0
- package/dist/pages/FormDetail.d.ts.map +1 -1
- package/dist/pages/FormDetail.js +19 -1
- package/dist/pages/FormDetail.js.map +1 -1
- package/dist/pages/ListDetail.d.ts.map +1 -1
- package/dist/pages/ListDetail.js +27 -1
- package/dist/pages/ListDetail.js.map +1 -1
- package/dist/pages/OpportunityDetail.d.ts.map +1 -1
- package/dist/pages/OpportunityDetail.js +62 -3
- package/dist/pages/OpportunityDetail.js.map +1 -1
- package/dist/pages/PartnershipDetail.d.ts.map +1 -1
- package/dist/pages/PartnershipDetail.js +17 -1
- package/dist/pages/PartnershipDetail.js.map +1 -1
- package/dist/pages/PeoplePage.d.ts.map +1 -1
- package/dist/pages/PeoplePage.js +17 -0
- package/dist/pages/PeoplePage.js.map +1 -1
- package/dist/pages/PersonDetail.d.ts.map +1 -1
- package/dist/pages/PersonDetail.js +63 -3
- package/dist/pages/PersonDetail.js.map +1 -1
- package/dist/pages/PlanningPage.d.ts.map +1 -1
- package/dist/pages/PlanningPage.js +3 -0
- package/dist/pages/PlanningPage.js.map +1 -1
- package/dist/pages/RaiseDetail.d.ts.map +1 -1
- package/dist/pages/RaiseDetail.js +11 -1
- package/dist/pages/RaiseDetail.js.map +1 -1
- package/dist/pages/RoleDetail.js +1 -1
- package/dist/pages/RoleDetail.js.map +1 -1
- package/dist/pages/SearchPage.d.ts.map +1 -1
- package/dist/pages/SearchPage.js +1 -0
- package/dist/pages/SearchPage.js.map +1 -1
- package/dist/pages/admin/DataPage.d.ts.map +1 -1
- package/dist/pages/admin/DataPage.js +18 -3
- package/dist/pages/admin/DataPage.js.map +1 -1
- package/dist/pages/admin/FieldsPage.d.ts +2 -0
- package/dist/pages/admin/FieldsPage.d.ts.map +1 -0
- package/dist/pages/admin/FieldsPage.js +164 -0
- package/dist/pages/admin/FieldsPage.js.map +1 -0
- package/dist/pages/admin/PrivacyPage.d.ts +9 -0
- package/dist/pages/admin/PrivacyPage.d.ts.map +1 -0
- package/dist/pages/admin/PrivacyPage.js +170 -0
- package/dist/pages/admin/PrivacyPage.js.map +1 -0
- package/dist/pages/dashboard/attention.d.ts.map +1 -1
- package/dist/pages/dashboard/attention.js +3 -0
- package/dist/pages/dashboard/attention.js.map +1 -1
- package/dist/pages/forms/AddFieldMenu.d.ts +17 -0
- package/dist/pages/forms/AddFieldMenu.d.ts.map +1 -0
- package/dist/pages/forms/AddFieldMenu.js +43 -0
- package/dist/pages/forms/AddFieldMenu.js.map +1 -0
- package/dist/pages/forms/EmbedPanel.d.ts +4 -0
- package/dist/pages/forms/EmbedPanel.d.ts.map +1 -1
- package/dist/pages/forms/EmbedPanel.js +62 -3
- package/dist/pages/forms/EmbedPanel.js.map +1 -1
- package/dist/pages/forms/FieldsEditor.d.ts.map +1 -1
- package/dist/pages/forms/FieldsEditor.js +179 -36
- package/dist/pages/forms/FieldsEditor.js.map +1 -1
- package/dist/pages/forms/FormActions.d.ts +6 -0
- package/dist/pages/forms/FormActions.d.ts.map +1 -0
- package/dist/pages/forms/FormActions.js +149 -0
- package/dist/pages/forms/FormActions.js.map +1 -0
- package/dist/pages/forms/FormSettings.d.ts.map +1 -1
- package/dist/pages/forms/FormSettings.js +15 -19
- package/dist/pages/forms/FormSettings.js.map +1 -1
- package/dist/pages/forms/SubmissionDetail.d.ts +2 -0
- package/dist/pages/forms/SubmissionDetail.d.ts.map +1 -0
- package/dist/pages/forms/SubmissionDetail.js +76 -0
- package/dist/pages/forms/SubmissionDetail.js.map +1 -0
- package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -1
- package/dist/pages/forms/SubmissionsTable.js +56 -8
- package/dist/pages/forms/SubmissionsTable.js.map +1 -1
- package/dist/pages/forms/fieldList.d.ts +11 -5
- package/dist/pages/forms/fieldList.d.ts.map +1 -1
- package/dist/pages/forms/fieldList.js +66 -6
- package/dist/pages/forms/fieldList.js.map +1 -1
- package/dist/pages/forms/template.d.ts +17 -0
- package/dist/pages/forms/template.d.ts.map +1 -1
- package/dist/pages/forms/template.js +93 -0
- package/dist/pages/forms/template.js.map +1 -1
- package/dist/pages/onboarding/WorkspaceStepPage.js +1 -1
- package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -1
- package/package.json +2 -2
- package/src/api/resource.ts +6 -1
- package/src/api/resources/consentPurposes.ts +83 -0
- package/src/api/resources/customFields.ts +88 -0
- package/src/api/resources/enquiries.ts +118 -0
- package/src/api/resources/forms.ts +58 -0
- package/src/api/resources/importJobs.ts +9 -0
- package/src/api/resources/opportunities.ts +3 -0
- package/src/api/resources/sampleData.ts +1 -0
- package/src/app/KelpieApp.tsx +12 -0
- package/src/components/ActivitiesPanel.tsx +1 -0
- package/src/components/CustomFieldsPanel.tsx +330 -0
- package/src/components/FormsPanel.tsx +86 -0
- package/src/components/PlanAttention.tsx +20 -3
- package/src/components/Shell.tsx +3 -0
- package/src/components/useHasCustomFields.ts +18 -0
- package/src/pages/CompanyDetail.tsx +36 -1
- package/src/pages/DealDetail.tsx +31 -0
- package/src/pages/DecisionsPage.tsx +2 -0
- package/src/pages/EnquiriesPage.tsx +434 -0
- package/src/pages/EnquiryDetail.tsx +554 -0
- package/src/pages/EnquiryStageSettingsPage.tsx +63 -0
- package/src/pages/FormDetail.tsx +23 -1
- package/src/pages/ListDetail.tsx +62 -0
- package/src/pages/OpportunityDetail.tsx +165 -2
- package/src/pages/PartnershipDetail.tsx +32 -0
- package/src/pages/PeoplePage.tsx +20 -0
- package/src/pages/PersonDetail.tsx +152 -3
- package/src/pages/PlanningPage.tsx +3 -0
- package/src/pages/RaiseDetail.tsx +21 -0
- package/src/pages/RoleDetail.tsx +1 -1
- package/src/pages/SearchPage.tsx +1 -0
- package/src/pages/admin/DataPage.tsx +51 -3
- package/src/pages/admin/FieldsPage.tsx +455 -0
- package/src/pages/admin/PrivacyPage.tsx +461 -0
- package/src/pages/dashboard/attention.ts +3 -0
- package/src/pages/forms/AddFieldMenu.tsx +121 -0
- package/src/pages/forms/EmbedPanel.tsx +163 -2
- package/src/pages/forms/FieldsEditor.tsx +539 -165
- package/src/pages/forms/FormActions.tsx +552 -0
- package/src/pages/forms/FormSettings.tsx +29 -70
- package/src/pages/forms/SubmissionDetail.tsx +249 -0
- package/src/pages/forms/SubmissionsTable.tsx +109 -16
- package/src/pages/forms/fieldList.ts +68 -5
- package/src/pages/forms/template.ts +103 -0
- 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`
|
|
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
|
|
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.
|
|
168
|
+
/** The types a mapping can sensibly render as. */
|
|
123
169
|
export function typeForTarget(target, current) {
|
|
124
|
-
|
|
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":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;
|
|
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.
|
|
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.
|
|
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",
|
package/src/api/resource.ts
CHANGED
|
@@ -367,7 +367,12 @@ export function createReadOnlyResourceHooks<TRecord>(
|
|
|
367
367
|
export function createResourceHooks<
|
|
368
368
|
TRecord extends { readonly id: string },
|
|
369
369
|
TCreateInput,
|
|
370
|
-
|
|
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
|
+
}
|