@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.
- package/dist/api/resource.d.ts +59 -6
- package/dist/api/resource.d.ts.map +1 -1
- package/dist/api/resource.js +106 -24
- package/dist/api/resource.js.map +1 -1
- package/dist/api/resources/companies.d.ts +2 -0
- package/dist/api/resources/companies.d.ts.map +1 -1
- package/dist/api/resources/companies.js +5 -1
- package/dist/api/resources/companies.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/decisions.d.ts +2 -0
- package/dist/api/resources/decisions.d.ts.map +1 -1
- package/dist/api/resources/decisions.js +1 -0
- package/dist/api/resources/decisions.js.map +1 -1
- package/dist/api/resources/emailDomainLinker.d.ts +16 -0
- package/dist/api/resources/emailDomainLinker.d.ts.map +1 -0
- package/dist/api/resources/emailDomainLinker.js +16 -0
- package/dist/api/resources/emailDomainLinker.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 +44 -17
- package/dist/api/resources/forms.js.map +1 -1
- package/dist/api/resources/handbookPages.d.ts +1 -1
- package/dist/api/resources/handbookPages.js +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/listMembers.d.ts +27 -0
- package/dist/api/resources/listMembers.d.ts.map +1 -0
- package/dist/api/resources/listMembers.js +108 -0
- package/dist/api/resources/listMembers.js.map +1 -0
- package/dist/api/resources/lists.d.ts +14 -0
- package/dist/api/resources/lists.d.ts.map +1 -0
- package/dist/api/resources/lists.js +34 -0
- package/dist/api/resources/lists.js.map +1 -0
- 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/people.d.ts.map +1 -1
- package/dist/api/resources/people.js +4 -1
- package/dist/api/resources/people.js.map +1 -1
- package/dist/api/resources/roles.d.ts +2 -0
- package/dist/api/resources/roles.d.ts.map +1 -1
- package/dist/api/resources/roles.js +1 -1
- package/dist/api/resources/roles.js.map +1 -1
- package/dist/api/resources/sampleData.d.ts +17 -0
- package/dist/api/resources/sampleData.d.ts.map +1 -0
- package/dist/api/resources/sampleData.js +31 -0
- package/dist/api/resources/sampleData.js.map +1 -0
- package/dist/api/resources/webhooks.d.ts.map +1 -1
- package/dist/api/resources/webhooks.js +7 -22
- package/dist/api/resources/webhooks.js.map +1 -1
- package/dist/app/KelpieApp.d.ts.map +1 -1
- package/dist/app/KelpieApp.js +9 -1
- package/dist/app/KelpieApp.js.map +1 -1
- package/dist/components/ActivitiesPanel.d.ts.map +1 -1
- package/dist/components/ActivitiesPanel.js +3 -1
- package/dist/components/ActivitiesPanel.js.map +1 -1
- package/dist/components/ColumnPicker.d.ts +24 -0
- package/dist/components/ColumnPicker.d.ts.map +1 -0
- package/dist/components/ColumnPicker.js +56 -0
- package/dist/components/ColumnPicker.js.map +1 -0
- 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/DataTable.d.ts +16 -1
- package/dist/components/DataTable.d.ts.map +1 -1
- package/dist/components/DataTable.js +51 -10
- package/dist/components/DataTable.js.map +1 -1
- package/dist/components/DecisionsPanel.d.ts.map +1 -1
- package/dist/components/DecisionsPanel.js +4 -3
- package/dist/components/DecisionsPanel.js.map +1 -1
- package/dist/components/EntitySearch.d.ts.map +1 -1
- package/dist/components/EntitySearch.js +11 -5
- package/dist/components/EntitySearch.js.map +1 -1
- 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/ListsPanel.d.ts +14 -0
- package/dist/components/ListsPanel.d.ts.map +1 -0
- package/dist/components/ListsPanel.js +56 -0
- package/dist/components/ListsPanel.js.map +1 -0
- package/dist/components/NotesPanel.d.ts.map +1 -1
- package/dist/components/NotesPanel.js +6 -5
- package/dist/components/NotesPanel.js.map +1 -1
- package/dist/components/Paginator.d.ts +26 -0
- package/dist/components/Paginator.d.ts.map +1 -0
- package/dist/components/Paginator.js +16 -0
- package/dist/components/Paginator.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/PlanPanel.d.ts.map +1 -1
- package/dist/components/PlanPanel.js +2 -1
- package/dist/components/PlanPanel.js.map +1 -1
- package/dist/components/Shell.d.ts.map +1 -1
- package/dist/components/Shell.js +4 -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/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/listView.d.ts +15 -0
- package/dist/lib/listView.d.ts.map +1 -0
- package/dist/lib/listView.js +66 -0
- package/dist/lib/listView.js.map +1 -0
- package/dist/lib/sort.d.ts +43 -0
- package/dist/lib/sort.d.ts.map +1 -0
- package/dist/lib/sort.js +102 -0
- package/dist/lib/sort.js.map +1 -0
- package/dist/pages/CompaniesPage.d.ts.map +1 -1
- package/dist/pages/CompaniesPage.js +88 -3
- package/dist/pages/CompaniesPage.js.map +1 -1
- package/dist/pages/CompanyDetail.d.ts.map +1 -1
- package/dist/pages/CompanyDetail.js +40 -15
- package/dist/pages/CompanyDetail.js.map +1 -1
- package/dist/pages/DealDetail.d.ts.map +1 -1
- package/dist/pages/DealDetail.js +20 -1
- package/dist/pages/DealDetail.js.map +1 -1
- package/dist/pages/DealsPage.d.ts.map +1 -1
- package/dist/pages/DealsPage.js +134 -14
- package/dist/pages/DealsPage.js.map +1 -1
- package/dist/pages/DecisionsPage.d.ts.map +1 -1
- package/dist/pages/DecisionsPage.js +52 -8
- 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/FormsPage.d.ts.map +1 -1
- package/dist/pages/FormsPage.js +53 -2
- package/dist/pages/FormsPage.js.map +1 -1
- package/dist/pages/FundraisingPage.d.ts.map +1 -1
- package/dist/pages/FundraisingPage.js +116 -14
- package/dist/pages/FundraisingPage.js.map +1 -1
- package/dist/pages/HiringPage.d.ts.map +1 -1
- package/dist/pages/HiringPage.js +27 -4
- package/dist/pages/HiringPage.js.map +1 -1
- package/dist/pages/ListDetail.d.ts +11 -0
- package/dist/pages/ListDetail.d.ts.map +1 -0
- package/dist/pages/ListDetail.js +214 -0
- package/dist/pages/ListDetail.js.map +1 -0
- package/dist/pages/ListsPage.d.ts +9 -0
- package/dist/pages/ListsPage.d.ts.map +1 -0
- package/dist/pages/ListsPage.js +125 -0
- package/dist/pages/ListsPage.js.map +1 -0
- package/dist/pages/OpportunitiesPage.d.ts.map +1 -1
- package/dist/pages/OpportunitiesPage.js +97 -14
- package/dist/pages/OpportunitiesPage.js.map +1 -1
- package/dist/pages/OpportunityDetail.d.ts.map +1 -1
- package/dist/pages/OpportunityDetail.js +64 -3
- package/dist/pages/OpportunityDetail.js.map +1 -1
- package/dist/pages/PartnershipDetail.d.ts.map +1 -1
- package/dist/pages/PartnershipDetail.js +19 -1
- package/dist/pages/PartnershipDetail.js.map +1 -1
- package/dist/pages/PartnershipsPage.d.ts.map +1 -1
- package/dist/pages/PartnershipsPage.js +111 -14
- package/dist/pages/PartnershipsPage.js.map +1 -1
- package/dist/pages/PeoplePage.d.ts.map +1 -1
- package/dist/pages/PeoplePage.js +119 -3
- package/dist/pages/PeoplePage.js.map +1 -1
- package/dist/pages/PersonDetail.d.ts.map +1 -1
- package/dist/pages/PersonDetail.js +67 -5
- package/dist/pages/PersonDetail.js.map +1 -1
- package/dist/pages/PlanningPage.d.ts.map +1 -1
- package/dist/pages/PlanningPage.js +88 -17
- package/dist/pages/PlanningPage.js.map +1 -1
- package/dist/pages/RaiseDetail.d.ts.map +1 -1
- package/dist/pages/RaiseDetail.js +13 -1
- package/dist/pages/RaiseDetail.js.map +1 -1
- package/dist/pages/RoleDetail.d.ts.map +1 -1
- package/dist/pages/RoleDetail.js +5 -4
- 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 +126 -13
- 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/admin/WebhookDeliveries.d.ts.map +1 -1
- package/dist/pages/admin/WebhookDeliveries.js +3 -2
- package/dist/pages/admin/WebhookDeliveries.js.map +1 -1
- package/dist/pages/admin/WebhooksPage.d.ts.map +1 -1
- package/dist/pages/admin/WebhooksPage.js +3 -2
- package/dist/pages/admin/WebhooksPage.js.map +1 -1
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -1
- package/dist/pages/admin/WorkspaceSettingsPage.js +45 -2
- package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -1
- 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 +57 -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/handbook/HandbookPage.js +1 -1
- package/dist/pages/hiringDirectory.js +2 -2
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -1
- package/dist/pages/onboarding/WorkspaceStepPage.js +15 -2
- package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -1
- package/dist/pages/positionDirectory.js +2 -2
- package/package.json +2 -2
- package/src/api/resource.ts +155 -32
- package/src/api/resources/companies.ts +7 -1
- package/src/api/resources/consentPurposes.ts +83 -0
- package/src/api/resources/customFields.ts +88 -0
- package/src/api/resources/decisions.ts +3 -0
- package/src/api/resources/emailDomainLinker.ts +43 -0
- package/src/api/resources/enquiries.ts +118 -0
- package/src/api/resources/forms.ts +59 -19
- package/src/api/resources/handbookPages.ts +1 -1
- package/src/api/resources/importJobs.ts +9 -0
- package/src/api/resources/listMembers.ts +173 -0
- package/src/api/resources/lists.ts +61 -0
- package/src/api/resources/opportunities.ts +3 -0
- package/src/api/resources/people.ts +4 -1
- package/src/api/resources/roles.ts +3 -1
- package/src/api/resources/sampleData.ts +57 -0
- package/src/api/resources/webhooks.ts +8 -24
- package/src/app/KelpieApp.tsx +16 -0
- package/src/components/ActivitiesPanel.tsx +3 -10
- package/src/components/ColumnPicker.tsx +124 -0
- package/src/components/CustomFieldsPanel.tsx +330 -0
- package/src/components/DataTable.tsx +89 -10
- package/src/components/DecisionsPanel.tsx +4 -12
- package/src/components/EntitySearch.tsx +12 -5
- package/src/components/FormsPanel.tsx +86 -0
- package/src/components/ListsPanel.tsx +176 -0
- package/src/components/NotesPanel.tsx +6 -14
- package/src/components/Paginator.tsx +78 -0
- package/src/components/PlanAttention.tsx +20 -3
- package/src/components/PlanPanel.tsx +2 -10
- package/src/components/Shell.tsx +4 -0
- package/src/components/useHasCustomFields.ts +18 -0
- package/src/index.ts +10 -1
- package/src/lib/listView.ts +149 -0
- package/src/lib/sort.ts +143 -0
- package/src/pages/CompaniesPage.tsx +125 -11
- package/src/pages/CompanyDetail.tsx +98 -63
- package/src/pages/DealDetail.tsx +34 -0
- package/src/pages/DealsPage.tsx +178 -24
- package/src/pages/DecisionsPage.tsx +75 -18
- 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/FormsPage.tsx +81 -17
- package/src/pages/FundraisingPage.tsx +152 -24
- package/src/pages/HiringPage.tsx +39 -11
- package/src/pages/ListDetail.tsx +470 -0
- package/src/pages/ListsPage.tsx +281 -0
- package/src/pages/OpportunitiesPage.tsx +130 -24
- package/src/pages/OpportunityDetail.tsx +168 -2
- package/src/pages/PartnershipDetail.tsx +35 -0
- package/src/pages/PartnershipsPage.tsx +149 -24
- package/src/pages/PeoplePage.tsx +157 -11
- package/src/pages/PersonDetail.tsx +157 -6
- package/src/pages/PlanningPage.tsx +259 -29
- package/src/pages/RaiseDetail.tsx +24 -0
- package/src/pages/RoleDetail.tsx +21 -26
- package/src/pages/SearchPage.tsx +1 -0
- package/src/pages/admin/DataPage.tsx +324 -13
- package/src/pages/admin/FieldsPage.tsx +455 -0
- package/src/pages/admin/PrivacyPage.tsx +461 -0
- package/src/pages/admin/WebhookDeliveries.tsx +10 -15
- package/src/pages/admin/WebhooksPage.tsx +14 -19
- package/src/pages/admin/WorkspaceSettingsPage.tsx +134 -2
- 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 +112 -26
- package/src/pages/forms/fieldList.ts +68 -5
- package/src/pages/forms/template.ts +103 -0
- package/src/pages/handbook/HandbookPage.tsx +1 -1
- package/src/pages/hiringDirectory.ts +2 -2
- package/src/pages/onboarding/WorkspaceStepPage.tsx +31 -3
- package/src/pages/positionDirectory.ts +2 -2
- 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
|
|
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 ||
|
|
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
|
|
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
|
|
393
|
-
<
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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="
|
|
441
|
+
<div className="mb-3">
|
|
406
442
|
<ErrorPanel error={createPosition.error} />
|
|
407
443
|
</div>
|
|
408
444
|
)}
|
|
409
445
|
{deletePosition.error !== null && (
|
|
410
|
-
<div className="
|
|
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
|
|
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-[
|
|
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
|
}
|
package/src/pages/DealDetail.tsx
CHANGED
|
@@ -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()
|