@kelpie/ui 0.1.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/LICENSE +661 -0
- package/README.md +44 -0
- package/dist/ServiceStatus.d.ts +6 -0
- package/dist/ServiceStatus.d.ts.map +1 -0
- package/dist/ServiceStatus.js +35 -0
- package/dist/ServiceStatus.js.map +1 -0
- package/dist/api/ApiProvider.d.ts +19 -0
- package/dist/api/ApiProvider.d.ts.map +1 -0
- package/dist/api/ApiProvider.js +18 -0
- package/dist/api/ApiProvider.js.map +1 -0
- package/dist/api/client.d.ts +83 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +162 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/context.d.ts +14 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +20 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +14 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/health.d.ts +15 -0
- package/dist/api/health.d.ts.map +1 -0
- package/dist/api/health.js +22 -0
- package/dist/api/health.js.map +1 -0
- package/dist/api/json.d.ts +3 -0
- package/dist/api/json.d.ts.map +1 -0
- package/dist/api/json.js +5 -0
- package/dist/api/json.js.map +1 -0
- package/dist/api/queryClient.d.ts +17 -0
- package/dist/api/queryClient.d.ts.map +1 -0
- package/dist/api/queryClient.js +33 -0
- package/dist/api/queryClient.js.map +1 -0
- package/dist/api/resource.d.ts +110 -0
- package/dist/api/resource.d.ts.map +1 -0
- package/dist/api/resource.js +238 -0
- package/dist/api/resource.js.map +1 -0
- package/dist/api/resources/account.d.ts +49 -0
- package/dist/api/resources/account.d.ts.map +1 -0
- package/dist/api/resources/account.js +146 -0
- package/dist/api/resources/account.js.map +1 -0
- package/dist/api/resources/activities.d.ts +8 -0
- package/dist/api/resources/activities.d.ts.map +1 -0
- package/dist/api/resources/activities.js +21 -0
- package/dist/api/resources/activities.js.map +1 -0
- package/dist/api/resources/agentTasks.d.ts +31 -0
- package/dist/api/resources/agentTasks.d.ts.map +1 -0
- package/dist/api/resources/agentTasks.js +103 -0
- package/dist/api/resources/agentTasks.js.map +1 -0
- package/dist/api/resources/candidates.d.ts +17 -0
- package/dist/api/resources/candidates.d.ts.map +1 -0
- package/dist/api/resources/candidates.js +40 -0
- package/dist/api/resources/candidates.js.map +1 -0
- package/dist/api/resources/companies.d.ts +22 -0
- package/dist/api/resources/companies.d.ts.map +1 -0
- package/dist/api/resources/companies.js +36 -0
- package/dist/api/resources/companies.js.map +1 -0
- package/dist/api/resources/dashboard.d.ts +8 -0
- package/dist/api/resources/dashboard.d.ts.map +1 -0
- package/dist/api/resources/dashboard.js +27 -0
- package/dist/api/resources/dashboard.js.map +1 -0
- package/dist/api/resources/deals.d.ts +30 -0
- package/dist/api/resources/deals.d.ts.map +1 -0
- package/dist/api/resources/deals.js +38 -0
- package/dist/api/resources/deals.js.map +1 -0
- package/dist/api/resources/decisions.d.ts +13 -0
- package/dist/api/resources/decisions.d.ts.map +1 -0
- package/dist/api/resources/decisions.js +38 -0
- package/dist/api/resources/decisions.js.map +1 -0
- package/dist/api/resources/forms.d.ts +82 -0
- package/dist/api/resources/forms.d.ts.map +1 -0
- package/dist/api/resources/forms.js +129 -0
- package/dist/api/resources/forms.js.map +1 -0
- package/dist/api/resources/handbookPages.d.ts +33 -0
- package/dist/api/resources/handbookPages.d.ts.map +1 -0
- package/dist/api/resources/handbookPages.js +49 -0
- package/dist/api/resources/handbookPages.js.map +1 -0
- package/dist/api/resources/importJobs.d.ts +72 -0
- package/dist/api/resources/importJobs.d.ts.map +1 -0
- package/dist/api/resources/importJobs.js +145 -0
- package/dist/api/resources/importJobs.js.map +1 -0
- package/dist/api/resources/invites.d.ts +19 -0
- package/dist/api/resources/invites.d.ts.map +1 -0
- package/dist/api/resources/invites.js +78 -0
- package/dist/api/resources/invites.js.map +1 -0
- package/dist/api/resources/mcpTools.d.ts +8 -0
- package/dist/api/resources/mcpTools.d.ts.map +1 -0
- package/dist/api/resources/mcpTools.js +23 -0
- package/dist/api/resources/mcpTools.js.map +1 -0
- package/dist/api/resources/members.d.ts +40 -0
- package/dist/api/resources/members.d.ts.map +1 -0
- package/dist/api/resources/members.js +67 -0
- package/dist/api/resources/members.js.map +1 -0
- package/dist/api/resources/moduleSettings.d.ts +14 -0
- package/dist/api/resources/moduleSettings.d.ts.map +1 -0
- package/dist/api/resources/moduleSettings.js +43 -0
- package/dist/api/resources/moduleSettings.js.map +1 -0
- package/dist/api/resources/mutation.d.ts +18 -0
- package/dist/api/resources/mutation.d.ts.map +1 -0
- package/dist/api/resources/mutation.js +12 -0
- package/dist/api/resources/mutation.js.map +1 -0
- package/dist/api/resources/notes.d.ts +14 -0
- package/dist/api/resources/notes.d.ts.map +1 -0
- package/dist/api/resources/notes.js +39 -0
- package/dist/api/resources/notes.js.map +1 -0
- package/dist/api/resources/opportunities.d.ts +29 -0
- package/dist/api/resources/opportunities.d.ts.map +1 -0
- package/dist/api/resources/opportunities.js +38 -0
- package/dist/api/resources/opportunities.js.map +1 -0
- package/dist/api/resources/partnerships.d.ts +33 -0
- package/dist/api/resources/partnerships.d.ts.map +1 -0
- package/dist/api/resources/partnerships.js +39 -0
- package/dist/api/resources/partnerships.js.map +1 -0
- package/dist/api/resources/people.d.ts +22 -0
- package/dist/api/resources/people.d.ts.map +1 -0
- package/dist/api/resources/people.js +36 -0
- package/dist/api/resources/people.js.map +1 -0
- package/dist/api/resources/pipelineStages.d.ts +22 -0
- package/dist/api/resources/pipelineStages.d.ts.map +1 -0
- package/dist/api/resources/pipelineStages.js +61 -0
- package/dist/api/resources/pipelineStages.js.map +1 -0
- package/dist/api/resources/planItems.d.ts +31 -0
- package/dist/api/resources/planItems.d.ts.map +1 -0
- package/dist/api/resources/planItems.js +60 -0
- package/dist/api/resources/planItems.js.map +1 -0
- package/dist/api/resources/positions.d.ts +23 -0
- package/dist/api/resources/positions.d.ts.map +1 -0
- package/dist/api/resources/positions.js +31 -0
- package/dist/api/resources/positions.js.map +1 -0
- package/dist/api/resources/raises.d.ts +30 -0
- package/dist/api/resources/raises.d.ts.map +1 -0
- package/dist/api/resources/raises.js +38 -0
- package/dist/api/resources/raises.js.map +1 -0
- package/dist/api/resources/roles.d.ts +20 -0
- package/dist/api/resources/roles.d.ts.map +1 -0
- package/dist/api/resources/roles.js +31 -0
- package/dist/api/resources/roles.js.map +1 -0
- package/dist/api/resources/search.d.ts +12 -0
- package/dist/api/resources/search.d.ts.map +1 -0
- package/dist/api/resources/search.js +37 -0
- package/dist/api/resources/search.js.map +1 -0
- package/dist/api/resources/session.d.ts +58 -0
- package/dist/api/resources/session.d.ts.map +1 -0
- package/dist/api/resources/session.js +157 -0
- package/dist/api/resources/session.js.map +1 -0
- package/dist/api/resources/webhooks.d.ts +45 -0
- package/dist/api/resources/webhooks.d.ts.map +1 -0
- package/dist/api/resources/webhooks.js +106 -0
- package/dist/api/resources/webhooks.js.map +1 -0
- package/dist/api/resources/workspace.d.ts +20 -0
- package/dist/api/resources/workspace.d.ts.map +1 -0
- package/dist/api/resources/workspace.js +63 -0
- package/dist/api/resources/workspace.js.map +1 -0
- package/dist/app/KelpieApp.d.ts +18 -0
- package/dist/app/KelpieApp.d.ts.map +1 -0
- package/dist/app/KelpieApp.js +59 -0
- package/dist/app/KelpieApp.js.map +1 -0
- package/dist/app/SessionGate.d.ts +14 -0
- package/dist/app/SessionGate.d.ts.map +1 -0
- package/dist/app/SessionGate.js +33 -0
- package/dist/app/SessionGate.js.map +1 -0
- package/dist/components/ActivitiesPanel.d.ts +28 -0
- package/dist/components/ActivitiesPanel.d.ts.map +1 -0
- package/dist/components/ActivitiesPanel.js +75 -0
- package/dist/components/ActivitiesPanel.js.map +1 -0
- package/dist/components/AgentTasks.d.ts +16 -0
- package/dist/components/AgentTasks.d.ts.map +1 -0
- package/dist/components/AgentTasks.js +166 -0
- package/dist/components/AgentTasks.js.map +1 -0
- package/dist/components/Chip.d.ts +10 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +21 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/CopyButton.d.ts +7 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +30 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/DataTable.d.ts +36 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable.js +43 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/DecisionsPanel.d.ts +14 -0
- package/dist/components/DecisionsPanel.d.ts.map +1 -0
- package/dist/components/DecisionsPanel.js +73 -0
- package/dist/components/DecisionsPanel.js.map +1 -0
- package/dist/components/DeleteRecord.d.ts +19 -0
- package/dist/components/DeleteRecord.d.ts.map +1 -0
- package/dist/components/DeleteRecord.js +22 -0
- package/dist/components/DeleteRecord.js.map +1 -0
- package/dist/components/EntitySearch.d.ts +33 -0
- package/dist/components/EntitySearch.d.ts.map +1 -0
- package/dist/components/EntitySearch.js +111 -0
- package/dist/components/EntitySearch.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +21 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +26 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/InlineEdit.d.ts +37 -0
- package/dist/components/InlineEdit.d.ts.map +1 -0
- package/dist/components/InlineEdit.js +77 -0
- package/dist/components/InlineEdit.js.map +1 -0
- package/dist/components/KanbanBoard.d.ts +24 -0
- package/dist/components/KanbanBoard.d.ts.map +1 -0
- package/dist/components/KanbanBoard.js +92 -0
- package/dist/components/KanbanBoard.js.map +1 -0
- package/dist/components/MarkdownView.d.ts +4 -0
- package/dist/components/MarkdownView.d.ts.map +1 -0
- package/dist/components/MarkdownView.js +45 -0
- package/dist/components/MarkdownView.js.map +1 -0
- package/dist/components/NotesPanel.d.ts +17 -0
- package/dist/components/NotesPanel.d.ts.map +1 -0
- package/dist/components/NotesPanel.js +53 -0
- package/dist/components/NotesPanel.js.map +1 -0
- package/dist/components/PageHeader.d.ts +20 -0
- package/dist/components/PageHeader.d.ts.map +1 -0
- package/dist/components/PageHeader.js +15 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/PhonesField.d.ts +7 -0
- package/dist/components/PhonesField.d.ts.map +1 -0
- package/dist/components/PhonesField.js +92 -0
- package/dist/components/PhonesField.js.map +1 -0
- package/dist/components/PlanAttention.d.ts +40 -0
- package/dist/components/PlanAttention.d.ts.map +1 -0
- package/dist/components/PlanAttention.js +86 -0
- package/dist/components/PlanAttention.js.map +1 -0
- package/dist/components/PlanPanel.d.ts +18 -0
- package/dist/components/PlanPanel.d.ts.map +1 -0
- package/dist/components/PlanPanel.js +102 -0
- package/dist/components/PlanPanel.js.map +1 -0
- package/dist/components/QueryState.d.ts +24 -0
- package/dist/components/QueryState.d.ts.map +1 -0
- package/dist/components/QueryState.js +34 -0
- package/dist/components/QueryState.js.map +1 -0
- package/dist/components/RecordTabs.d.ts +16 -0
- package/dist/components/RecordTabs.d.ts.map +1 -0
- package/dist/components/RecordTabs.js +15 -0
- package/dist/components/RecordTabs.js.map +1 -0
- package/dist/components/SectionHeader.d.ts +15 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader.js +14 -0
- package/dist/components/SectionHeader.js.map +1 -0
- package/dist/components/SegmentedControl.d.ts +13 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +14 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/Shell.d.ts +2 -0
- package/dist/components/Shell.d.ts.map +1 -0
- package/dist/components/Shell.js +143 -0
- package/dist/components/Shell.js.map +1 -0
- package/dist/components/SidebarField.d.ts +8 -0
- package/dist/components/SidebarField.d.ts.map +1 -0
- package/dist/components/SidebarField.js +6 -0
- package/dist/components/SidebarField.js.map +1 -0
- package/dist/components/SocialProfilesField.d.ts +8 -0
- package/dist/components/SocialProfilesField.d.ts.map +1 -0
- package/dist/components/SocialProfilesField.js +176 -0
- package/dist/components/SocialProfilesField.js.map +1 -0
- package/dist/components/StageSettings.d.ts +16 -0
- package/dist/components/StageSettings.d.ts.map +1 -0
- package/dist/components/StageSettings.js +107 -0
- package/dist/components/StageSettings.js.map +1 -0
- package/dist/components/SummaryBlock.d.ts +12 -0
- package/dist/components/SummaryBlock.d.ts.map +1 -0
- package/dist/components/SummaryBlock.js +12 -0
- package/dist/components/SummaryBlock.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/dates.d.ts +26 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +71 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/money.d.ts +7 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +13 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/names.d.ts +9 -0
- package/dist/lib/names.d.ts.map +1 -0
- package/dist/lib/names.js +13 -0
- package/dist/lib/names.js.map +1 -0
- package/dist/lib/plan.d.ts +67 -0
- package/dist/lib/plan.d.ts.map +1 -0
- package/dist/lib/plan.js +96 -0
- package/dist/lib/plan.js.map +1 -0
- package/dist/lib/theme.d.ts +19 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +30 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/pages/CompaniesPage.d.ts +2 -0
- package/dist/pages/CompaniesPage.d.ts.map +1 -0
- package/dist/pages/CompaniesPage.js +77 -0
- package/dist/pages/CompaniesPage.js.map +1 -0
- package/dist/pages/CompanyDetail.d.ts +2 -0
- package/dist/pages/CompanyDetail.d.ts.map +1 -0
- package/dist/pages/CompanyDetail.js +177 -0
- package/dist/pages/CompanyDetail.js.map +1 -0
- package/dist/pages/DealDetail.d.ts +2 -0
- package/dist/pages/DealDetail.d.ts.map +1 -0
- package/dist/pages/DealDetail.js +192 -0
- package/dist/pages/DealDetail.js.map +1 -0
- package/dist/pages/DealStageSettingsPage.d.ts +7 -0
- package/dist/pages/DealStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/DealStageSettingsPage.js +38 -0
- package/dist/pages/DealStageSettingsPage.js.map +1 -0
- package/dist/pages/DealsPage.d.ts +2 -0
- package/dist/pages/DealsPage.d.ts.map +1 -0
- package/dist/pages/DealsPage.js +177 -0
- package/dist/pages/DealsPage.js.map +1 -0
- package/dist/pages/DecisionsPage.d.ts +2 -0
- package/dist/pages/DecisionsPage.d.ts.map +1 -0
- package/dist/pages/DecisionsPage.js +121 -0
- package/dist/pages/DecisionsPage.js.map +1 -0
- package/dist/pages/FormDetail.d.ts +2 -0
- package/dist/pages/FormDetail.d.ts.map +1 -0
- package/dist/pages/FormDetail.js +56 -0
- package/dist/pages/FormDetail.js.map +1 -0
- package/dist/pages/FormsPage.d.ts +2 -0
- package/dist/pages/FormsPage.d.ts.map +1 -0
- package/dist/pages/FormsPage.js +67 -0
- package/dist/pages/FormsPage.js.map +1 -0
- package/dist/pages/FundraisingPage.d.ts +2 -0
- package/dist/pages/FundraisingPage.d.ts.map +1 -0
- package/dist/pages/FundraisingPage.js +187 -0
- package/dist/pages/FundraisingPage.js.map +1 -0
- package/dist/pages/HiringPage.d.ts +9 -0
- package/dist/pages/HiringPage.d.ts.map +1 -0
- package/dist/pages/HiringPage.js +73 -0
- package/dist/pages/HiringPage.js.map +1 -0
- package/dist/pages/NotFoundPage.d.ts +10 -0
- package/dist/pages/NotFoundPage.d.ts.map +1 -0
- package/dist/pages/NotFoundPage.js +14 -0
- package/dist/pages/NotFoundPage.js.map +1 -0
- package/dist/pages/OpportunitiesPage.d.ts +2 -0
- package/dist/pages/OpportunitiesPage.d.ts.map +1 -0
- package/dist/pages/OpportunitiesPage.js +184 -0
- package/dist/pages/OpportunitiesPage.js.map +1 -0
- package/dist/pages/OpportunityDetail.d.ts +2 -0
- package/dist/pages/OpportunityDetail.d.ts.map +1 -0
- package/dist/pages/OpportunityDetail.js +132 -0
- package/dist/pages/OpportunityDetail.js.map +1 -0
- package/dist/pages/OpportunityStageSettingsPage.d.ts +3 -0
- package/dist/pages/OpportunityStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/OpportunityStageSettingsPage.js +34 -0
- package/dist/pages/OpportunityStageSettingsPage.js.map +1 -0
- package/dist/pages/PartnershipDetail.d.ts +2 -0
- package/dist/pages/PartnershipDetail.d.ts.map +1 -0
- package/dist/pages/PartnershipDetail.js +179 -0
- package/dist/pages/PartnershipDetail.js.map +1 -0
- package/dist/pages/PartnershipStageSettingsPage.d.ts +3 -0
- package/dist/pages/PartnershipStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/PartnershipStageSettingsPage.js +34 -0
- package/dist/pages/PartnershipStageSettingsPage.js.map +1 -0
- package/dist/pages/PartnershipsPage.d.ts +2 -0
- package/dist/pages/PartnershipsPage.d.ts.map +1 -0
- package/dist/pages/PartnershipsPage.js +182 -0
- package/dist/pages/PartnershipsPage.js.map +1 -0
- package/dist/pages/PeoplePage.d.ts +10 -0
- package/dist/pages/PeoplePage.d.ts.map +1 -0
- package/dist/pages/PeoplePage.js +71 -0
- package/dist/pages/PeoplePage.js.map +1 -0
- package/dist/pages/PersonDetail.d.ts +2 -0
- package/dist/pages/PersonDetail.d.ts.map +1 -0
- package/dist/pages/PersonDetail.js +193 -0
- package/dist/pages/PersonDetail.js.map +1 -0
- package/dist/pages/PlanningPage.d.ts +2 -0
- package/dist/pages/PlanningPage.d.ts.map +1 -0
- package/dist/pages/PlanningPage.js +112 -0
- package/dist/pages/PlanningPage.js.map +1 -0
- package/dist/pages/RaiseDetail.d.ts +2 -0
- package/dist/pages/RaiseDetail.d.ts.map +1 -0
- package/dist/pages/RaiseDetail.js +198 -0
- package/dist/pages/RaiseDetail.js.map +1 -0
- package/dist/pages/RaiseStageSettingsPage.d.ts +3 -0
- package/dist/pages/RaiseStageSettingsPage.d.ts.map +1 -0
- package/dist/pages/RaiseStageSettingsPage.js +34 -0
- package/dist/pages/RaiseStageSettingsPage.js.map +1 -0
- package/dist/pages/RoleDetail.d.ts +2 -0
- package/dist/pages/RoleDetail.d.ts.map +1 -0
- package/dist/pages/RoleDetail.js +177 -0
- package/dist/pages/RoleDetail.js.map +1 -0
- package/dist/pages/SearchPage.d.ts +2 -0
- package/dist/pages/SearchPage.d.ts.map +1 -0
- package/dist/pages/SearchPage.js +51 -0
- package/dist/pages/SearchPage.js.map +1 -0
- package/dist/pages/account/AccountLayout.d.ts +2 -0
- package/dist/pages/account/AccountLayout.d.ts.map +1 -0
- package/dist/pages/account/AccountLayout.js +25 -0
- package/dist/pages/account/AccountLayout.js.map +1 -0
- package/dist/pages/account/Field.d.ts +8 -0
- package/dist/pages/account/Field.d.ts.map +1 -0
- package/dist/pages/account/Field.js +6 -0
- package/dist/pages/account/Field.js.map +1 -0
- package/dist/pages/account/PreferencesPage.d.ts +2 -0
- package/dist/pages/account/PreferencesPage.d.ts.map +1 -0
- package/dist/pages/account/PreferencesPage.js +92 -0
- package/dist/pages/account/PreferencesPage.js.map +1 -0
- package/dist/pages/account/ProfilePage.d.ts +14 -0
- package/dist/pages/account/ProfilePage.d.ts.map +1 -0
- package/dist/pages/account/ProfilePage.js +71 -0
- package/dist/pages/account/ProfilePage.js.map +1 -0
- package/dist/pages/account/SecurityPage.d.ts +11 -0
- package/dist/pages/account/SecurityPage.d.ts.map +1 -0
- package/dist/pages/account/SecurityPage.js +78 -0
- package/dist/pages/account/SecurityPage.js.map +1 -0
- package/dist/pages/admin/DataPage.d.ts +3 -0
- package/dist/pages/admin/DataPage.d.ts.map +1 -0
- package/dist/pages/admin/DataPage.js +210 -0
- package/dist/pages/admin/DataPage.js.map +1 -0
- package/dist/pages/admin/McpPage.d.ts +2 -0
- package/dist/pages/admin/McpPage.d.ts.map +1 -0
- package/dist/pages/admin/McpPage.js +128 -0
- package/dist/pages/admin/McpPage.js.map +1 -0
- package/dist/pages/admin/ModulesPage.d.ts +2 -0
- package/dist/pages/admin/ModulesPage.d.ts.map +1 -0
- package/dist/pages/admin/ModulesPage.js +53 -0
- package/dist/pages/admin/ModulesPage.js.map +1 -0
- package/dist/pages/admin/TeamPage.d.ts +2 -0
- package/dist/pages/admin/TeamPage.d.ts.map +1 -0
- package/dist/pages/admin/TeamPage.js +99 -0
- package/dist/pages/admin/TeamPage.js.map +1 -0
- package/dist/pages/admin/WebhookDeliveries.d.ts +4 -0
- package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -0
- package/dist/pages/admin/WebhookDeliveries.js +88 -0
- package/dist/pages/admin/WebhookDeliveries.js.map +1 -0
- package/dist/pages/admin/WebhooksPage.d.ts +2 -0
- package/dist/pages/admin/WebhooksPage.d.ts.map +1 -0
- package/dist/pages/admin/WebhooksPage.js +152 -0
- package/dist/pages/admin/WebhooksPage.js.map +1 -0
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts +2 -0
- package/dist/pages/admin/WorkspaceSettingsPage.d.ts.map +1 -0
- package/dist/pages/admin/WorkspaceSettingsPage.js +117 -0
- package/dist/pages/admin/WorkspaceSettingsPage.js.map +1 -0
- package/dist/pages/auth/AuthForm.d.ts +46 -0
- package/dist/pages/auth/AuthForm.d.ts.map +1 -0
- package/dist/pages/auth/AuthForm.js +32 -0
- package/dist/pages/auth/AuthForm.js.map +1 -0
- package/dist/pages/auth/AuthLayout.d.ts +24 -0
- package/dist/pages/auth/AuthLayout.d.ts.map +1 -0
- package/dist/pages/auth/AuthLayout.js +19 -0
- package/dist/pages/auth/AuthLayout.js.map +1 -0
- package/dist/pages/auth/ForgotPasswordPage.d.ts +13 -0
- package/dist/pages/auth/ForgotPasswordPage.d.ts.map +1 -0
- package/dist/pages/auth/ForgotPasswordPage.js +39 -0
- package/dist/pages/auth/ForgotPasswordPage.js.map +1 -0
- package/dist/pages/auth/JoinPage.d.ts +12 -0
- package/dist/pages/auth/JoinPage.d.ts.map +1 -0
- package/dist/pages/auth/JoinPage.js +43 -0
- package/dist/pages/auth/JoinPage.js.map +1 -0
- package/dist/pages/auth/ResetPasswordPage.d.ts +13 -0
- package/dist/pages/auth/ResetPasswordPage.d.ts.map +1 -0
- package/dist/pages/auth/ResetPasswordPage.js +58 -0
- package/dist/pages/auth/ResetPasswordPage.js.map +1 -0
- package/dist/pages/auth/SignInPage.d.ts +2 -0
- package/dist/pages/auth/SignInPage.d.ts.map +1 -0
- package/dist/pages/auth/SignInPage.js +38 -0
- package/dist/pages/auth/SignInPage.js.map +1 -0
- package/dist/pages/auth/SignUpPage.d.ts +13 -0
- package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
- package/dist/pages/auth/SignUpPage.js +43 -0
- package/dist/pages/auth/SignUpPage.js.map +1 -0
- package/dist/pages/candidateFields.d.ts +22 -0
- package/dist/pages/candidateFields.d.ts.map +1 -0
- package/dist/pages/candidateFields.js +82 -0
- package/dist/pages/candidateFields.js.map +1 -0
- package/dist/pages/dashboard/DashboardPage.d.ts +2 -0
- package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardPage.js +40 -0
- package/dist/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/pages/dashboard/attention.d.ts +41 -0
- package/dist/pages/dashboard/attention.d.ts.map +1 -0
- package/dist/pages/dashboard/attention.js +146 -0
- package/dist/pages/dashboard/attention.js.map +1 -0
- package/dist/pages/dashboard/sections.d.ts +20 -0
- package/dist/pages/dashboard/sections.d.ts.map +1 -0
- package/dist/pages/dashboard/sections.js +60 -0
- package/dist/pages/dashboard/sections.js.map +1 -0
- package/dist/pages/fields.d.ts +11 -0
- package/dist/pages/fields.d.ts.map +1 -0
- package/dist/pages/fields.js +17 -0
- package/dist/pages/fields.js.map +1 -0
- package/dist/pages/forms/EmbedPanel.d.ts +14 -0
- package/dist/pages/forms/EmbedPanel.d.ts.map +1 -0
- package/dist/pages/forms/EmbedPanel.js +19 -0
- package/dist/pages/forms/EmbedPanel.js.map +1 -0
- package/dist/pages/forms/FieldsEditor.d.ts +6 -0
- package/dist/pages/forms/FieldsEditor.d.ts.map +1 -0
- package/dist/pages/forms/FieldsEditor.js +115 -0
- package/dist/pages/forms/FieldsEditor.js.map +1 -0
- package/dist/pages/forms/FormSettings.d.ts +6 -0
- package/dist/pages/forms/FormSettings.d.ts.map +1 -0
- package/dist/pages/forms/FormSettings.js +47 -0
- package/dist/pages/forms/FormSettings.js.map +1 -0
- package/dist/pages/forms/SubmissionsTable.d.ts +8 -0
- package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -0
- package/dist/pages/forms/SubmissionsTable.js +91 -0
- package/dist/pages/forms/SubmissionsTable.js.map +1 -0
- package/dist/pages/forms/fieldList.d.ts +70 -0
- package/dist/pages/forms/fieldList.d.ts.map +1 -0
- package/dist/pages/forms/fieldList.js +126 -0
- package/dist/pages/forms/fieldList.js.map +1 -0
- package/dist/pages/forms/template.d.ts +18 -0
- package/dist/pages/forms/template.d.ts.map +1 -0
- package/dist/pages/forms/template.js +34 -0
- package/dist/pages/forms/template.js.map +1 -0
- package/dist/pages/handbook/HandbookPage.d.ts +2 -0
- package/dist/pages/handbook/HandbookPage.d.ts.map +1 -0
- package/dist/pages/handbook/HandbookPage.js +197 -0
- package/dist/pages/handbook/HandbookPage.js.map +1 -0
- package/dist/pages/handbook/tree.d.ts +62 -0
- package/dist/pages/handbook/tree.d.ts.map +1 -0
- package/dist/pages/handbook/tree.js +222 -0
- package/dist/pages/handbook/tree.js.map +1 -0
- package/dist/pages/hiringDirectory.d.ts +60 -0
- package/dist/pages/hiringDirectory.d.ts.map +1 -0
- package/dist/pages/hiringDirectory.js +81 -0
- package/dist/pages/hiringDirectory.js.map +1 -0
- package/dist/pages/onboarding/HandbookStepPage.d.ts +14 -0
- package/dist/pages/onboarding/HandbookStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/HandbookStepPage.js +29 -0
- package/dist/pages/onboarding/HandbookStepPage.js.map +1 -0
- package/dist/pages/onboarding/InvitesStepPage.d.ts +2 -0
- package/dist/pages/onboarding/InvitesStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/InvitesStepPage.js +77 -0
- package/dist/pages/onboarding/InvitesStepPage.js.map +1 -0
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts +2 -0
- package/dist/pages/onboarding/WorkspaceStepPage.d.ts.map +1 -0
- package/dist/pages/onboarding/WorkspaceStepPage.js +72 -0
- package/dist/pages/onboarding/WorkspaceStepPage.js.map +1 -0
- package/dist/pages/positionDirectory.d.ts +20 -0
- package/dist/pages/positionDirectory.d.ts.map +1 -0
- package/dist/pages/positionDirectory.js +58 -0
- package/dist/pages/positionDirectory.js.map +1 -0
- package/dist/registry/UiExtensionProvider.d.ts +12 -0
- package/dist/registry/UiExtensionProvider.d.ts.map +1 -0
- package/dist/registry/UiExtensionProvider.js +10 -0
- package/dist/registry/UiExtensionProvider.js.map +1 -0
- package/dist/registry/context.d.ts +31 -0
- package/dist/registry/context.d.ts.map +1 -0
- package/dist/registry/context.js +45 -0
- package/dist/registry/context.js.map +1 -0
- package/dist/registry/contributions.d.ts +71 -0
- package/dist/registry/contributions.d.ts.map +1 -0
- package/dist/registry/contributions.js +25 -0
- package/dist/registry/contributions.js.map +1 -0
- package/dist/registry/overridable.d.ts +27 -0
- package/dist/registry/overridable.d.ts.map +1 -0
- package/dist/registry/overridable.js +29 -0
- package/dist/registry/overridable.js.map +1 -0
- package/dist/registry/registry.d.ts +68 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +112 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/testing/inputs.d.ts +13 -0
- package/dist/testing/inputs.d.ts.map +1 -0
- package/dist/testing/inputs.js +16 -0
- package/dist/testing/inputs.js.map +1 -0
- package/dist/testing/stubClient.d.ts +42 -0
- package/dist/testing/stubClient.d.ts.map +1 -0
- package/dist/testing/stubClient.js +29 -0
- package/dist/testing/stubClient.js.map +1 -0
- package/package.json +73 -0
- package/src/ServiceStatus.tsx +61 -0
- package/src/api/ApiProvider.tsx +40 -0
- package/src/api/client.ts +267 -0
- package/src/api/context.ts +25 -0
- package/src/api/errors.ts +14 -0
- package/src/api/health.ts +38 -0
- package/src/api/json.ts +4 -0
- package/src/api/queryClient.ts +35 -0
- package/src/api/resource.ts +412 -0
- package/src/api/resources/account.ts +220 -0
- package/src/api/resources/activities.ts +31 -0
- package/src/api/resources/agentTasks.ts +172 -0
- package/src/api/resources/candidates.ts +69 -0
- package/src/api/resources/companies.ts +72 -0
- package/src/api/resources/dashboard.ts +39 -0
- package/src/api/resources/deals.ts +82 -0
- package/src/api/resources/decisions.ts +60 -0
- package/src/api/resources/forms.ts +218 -0
- package/src/api/resources/handbookPages.ts +77 -0
- package/src/api/resources/importJobs.ts +229 -0
- package/src/api/resources/invites.ts +112 -0
- package/src/api/resources/mcpTools.ts +28 -0
- package/src/api/resources/members.ts +105 -0
- package/src/api/resources/moduleSettings.ts +67 -0
- package/src/api/resources/mutation.ts +31 -0
- package/src/api/resources/notes.ts +62 -0
- package/src/api/resources/opportunities.ts +84 -0
- package/src/api/resources/partnerships.ts +89 -0
- package/src/api/resources/people.ts +72 -0
- package/src/api/resources/pipelineStages.ts +93 -0
- package/src/api/resources/planItems.ts +103 -0
- package/src/api/resources/positions.ts +70 -0
- package/src/api/resources/raises.ts +82 -0
- package/src/api/resources/roles.ts +65 -0
- package/src/api/resources/search.ts +49 -0
- package/src/api/resources/session.ts +220 -0
- package/src/api/resources/webhooks.ts +157 -0
- package/src/api/resources/workspace.ts +81 -0
- package/src/app/KelpieApp.tsx +162 -0
- package/src/app/SessionGate.tsx +42 -0
- package/src/components/ActivitiesPanel.tsx +235 -0
- package/src/components/AgentTasks.tsx +473 -0
- package/src/components/Chip.tsx +36 -0
- package/src/components/CopyButton.tsx +48 -0
- package/src/components/DataTable.tsx +209 -0
- package/src/components/DecisionsPanel.tsx +233 -0
- package/src/components/DeleteRecord.tsx +73 -0
- package/src/components/EntitySearch.tsx +268 -0
- package/src/components/ErrorBoundary.tsx +58 -0
- package/src/components/InlineEdit.tsx +179 -0
- package/src/components/KanbanBoard.tsx +234 -0
- package/src/components/MarkdownView.tsx +73 -0
- package/src/components/NotesPanel.tsx +169 -0
- package/src/components/PageHeader.tsx +61 -0
- package/src/components/PhonesField.tsx +204 -0
- package/src/components/PlanAttention.tsx +249 -0
- package/src/components/PlanPanel.tsx +317 -0
- package/src/components/QueryState.tsx +83 -0
- package/src/components/RecordTabs.tsx +69 -0
- package/src/components/SectionHeader.tsx +63 -0
- package/src/components/SegmentedControl.tsx +48 -0
- package/src/components/Shell.tsx +300 -0
- package/src/components/SidebarField.tsx +18 -0
- package/src/components/SocialProfilesField.tsx +356 -0
- package/src/components/StageSettings.tsx +319 -0
- package/src/components/SummaryBlock.tsx +27 -0
- package/src/index.ts +190 -0
- package/src/lib/dates.ts +90 -0
- package/src/lib/money.ts +12 -0
- package/src/lib/names.ts +13 -0
- package/src/lib/plan.ts +147 -0
- package/src/lib/theme.ts +53 -0
- package/src/pages/CompaniesPage.tsx +143 -0
- package/src/pages/CompanyDetail.tsx +502 -0
- package/src/pages/DealDetail.tsx +512 -0
- package/src/pages/DealStageSettingsPage.tsx +67 -0
- package/src/pages/DealsPage.tsx +342 -0
- package/src/pages/DecisionsPage.tsx +211 -0
- package/src/pages/FormDetail.tsx +130 -0
- package/src/pages/FormsPage.tsx +151 -0
- package/src/pages/FundraisingPage.tsx +354 -0
- package/src/pages/HiringPage.tsx +169 -0
- package/src/pages/NotFoundPage.tsx +27 -0
- package/src/pages/OpportunitiesPage.tsx +349 -0
- package/src/pages/OpportunityDetail.tsx +337 -0
- package/src/pages/OpportunityStageSettingsPage.tsx +63 -0
- package/src/pages/PartnershipDetail.tsx +490 -0
- package/src/pages/PartnershipStageSettingsPage.tsx +63 -0
- package/src/pages/PartnershipsPage.tsx +353 -0
- package/src/pages/PeoplePage.tsx +145 -0
- package/src/pages/PersonDetail.tsx +526 -0
- package/src/pages/PlanningPage.tsx +318 -0
- package/src/pages/RaiseDetail.tsx +498 -0
- package/src/pages/RaiseStageSettingsPage.tsx +63 -0
- package/src/pages/RoleDetail.tsx +455 -0
- package/src/pages/SearchPage.tsx +135 -0
- package/src/pages/account/AccountLayout.tsx +38 -0
- package/src/pages/account/Field.tsx +20 -0
- package/src/pages/account/PreferencesPage.tsx +224 -0
- package/src/pages/account/ProfilePage.tsx +147 -0
- package/src/pages/account/SecurityPage.tsx +237 -0
- package/src/pages/admin/DataPage.tsx +772 -0
- package/src/pages/admin/McpPage.tsx +404 -0
- package/src/pages/admin/ModulesPage.tsx +113 -0
- package/src/pages/admin/TeamPage.tsx +386 -0
- package/src/pages/admin/WebhookDeliveries.tsx +184 -0
- package/src/pages/admin/WebhooksPage.tsx +443 -0
- package/src/pages/admin/WorkspaceSettingsPage.tsx +274 -0
- package/src/pages/auth/AuthForm.tsx +118 -0
- package/src/pages/auth/AuthLayout.tsx +74 -0
- package/src/pages/auth/ForgotPasswordPage.tsx +80 -0
- package/src/pages/auth/JoinPage.tsx +85 -0
- package/src/pages/auth/ResetPasswordPage.tsx +124 -0
- package/src/pages/auth/SignInPage.tsx +83 -0
- package/src/pages/auth/SignUpPage.tsx +93 -0
- package/src/pages/candidateFields.tsx +175 -0
- package/src/pages/dashboard/DashboardPage.tsx +108 -0
- package/src/pages/dashboard/attention.ts +206 -0
- package/src/pages/dashboard/sections.tsx +269 -0
- package/src/pages/fields.ts +21 -0
- package/src/pages/forms/EmbedPanel.tsx +95 -0
- package/src/pages/forms/FieldsEditor.tsx +412 -0
- package/src/pages/forms/FormSettings.tsx +159 -0
- package/src/pages/forms/SubmissionsTable.tsx +171 -0
- package/src/pages/forms/fieldList.ts +209 -0
- package/src/pages/forms/template.ts +37 -0
- package/src/pages/handbook/HandbookPage.tsx +500 -0
- package/src/pages/handbook/tree.ts +327 -0
- package/src/pages/hiringDirectory.ts +146 -0
- package/src/pages/onboarding/HandbookStepPage.tsx +75 -0
- package/src/pages/onboarding/InvitesStepPage.tsx +180 -0
- package/src/pages/onboarding/WorkspaceStepPage.tsx +122 -0
- package/src/pages/positionDirectory.ts +98 -0
- package/src/registry/UiExtensionProvider.tsx +20 -0
- package/src/registry/context.ts +67 -0
- package/src/registry/contributions.ts +89 -0
- package/src/registry/overridable.ts +62 -0
- package/src/registry/registry.ts +204 -0
- package/src/styles.css +175 -0
- package/src/testing/inputs.ts +18 -0
- package/src/testing/stubClient.ts +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidateFields.js","sourceRoot":"","sources":["../../src/pages/candidateFields.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/DashboardPage.tsx"],"names":[],"mappings":"AA8BA,wBAAgB,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAsBjD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useDashboard } from '../../api/resources/dashboard.js';
|
|
3
|
+
import { useMembers } from '../../api/resources/members.js';
|
|
4
|
+
import { useWorkspace } from '../../api/resources/workspace.js';
|
|
5
|
+
import { AgentTasks } from '../../components/AgentTasks.js';
|
|
6
|
+
import { PageHeader } from '../../components/PageHeader.js';
|
|
7
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
|
|
8
|
+
import { attentionRows, briefLines } from './attention.js';
|
|
9
|
+
import { ActivityFeed, AttentionList, DecisionsList, NotesList } from './sections.js';
|
|
10
|
+
/**
|
|
11
|
+
* The workspace home: what is open, what is late, and what happened lately.
|
|
12
|
+
*
|
|
13
|
+
* One request, not seven. `GET /v1/dashboard` answers the whole page, with the
|
|
14
|
+
* name of every record it points at already resolved, so this file holds no
|
|
15
|
+
* fetching beyond the two directories the shell needs anyway — the workspace,
|
|
16
|
+
* for its name, and the team, to turn an author id into a person.
|
|
17
|
+
*/
|
|
18
|
+
/** The heading date, written in the workspace's own day rather than the browser's. */
|
|
19
|
+
function briefHeading(dashboard) {
|
|
20
|
+
return new Intl.DateTimeFormat('en-AU', {
|
|
21
|
+
weekday: 'long',
|
|
22
|
+
month: 'short',
|
|
23
|
+
day: 'numeric',
|
|
24
|
+
timeZone: dashboard.timezone,
|
|
25
|
+
}).format(dashboard.generatedAt);
|
|
26
|
+
}
|
|
27
|
+
export function DashboardPage() {
|
|
28
|
+
const { dashboard, isLoading, error } = useDashboard();
|
|
29
|
+
const { workspace } = useWorkspace();
|
|
30
|
+
const { nameById } = useMembers();
|
|
31
|
+
return (_jsxs("div", { className: "animate-fade-in", children: [_jsx(PageHeader, { title: "Dashboard", description: "What needs attention across this workspace." }), error !== null && _jsx(ErrorPanel, { error: error }), isLoading && _jsx(LoadingPanel, { label: "Loading the workspace\u2026" }), dashboard !== undefined && (_jsx(DashboardBody, { dashboard: dashboard, workspaceId: workspace?.id, workspaceName: workspace?.name ?? 'This workspace', nameById: nameById }))] }));
|
|
32
|
+
}
|
|
33
|
+
function DashboardBody({ dashboard, workspaceId, workspaceName, nameById, }) {
|
|
34
|
+
// `generatedAt` rather than a fresh `new Date()`: every relative time on the
|
|
35
|
+
// page is then measured from the same instant the counts were, so a tab left
|
|
36
|
+
// open does not creep towards "2 hours ago" on rows that never moved.
|
|
37
|
+
const now = dashboard.generatedAt;
|
|
38
|
+
return (_jsxs("div", { children: [_jsxs("section", { className: "mb-8 border-b border-border pb-6", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-[11px] text-ink-faint", children: "Daily brief" }), _jsxs("h2", { className: "mt-0.5 text-[15px] font-semibold tracking-tight text-ink", children: [workspaceName, " \u00B7 ", briefHeading(dashboard)] }), _jsx("p", { className: "mt-1 text-[12px] text-ink-muted", children: "Assembled from overdue Plans, partnership touchpoints, and contacts going cold." })] }), workspaceId !== undefined && (_jsx(AgentTasks, { targetType: "workspace", targetId: workspaceId, targetLabel: workspaceName }))] }), _jsx("ul", { className: "mt-4 space-y-1.5", children: briefLines(dashboard).map((line) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-relaxed text-ink", children: [_jsx("span", { className: "mt-[9px] h-1 w-1 shrink-0 rounded-full bg-accent" }), _jsx("span", { children: line })] }, line))) })] }), _jsxs("div", { className: "mb-8 grid gap-8 lg:grid-cols-2", children: [_jsx(AttentionList, { rows: attentionRows(dashboard) }), _jsx(ActivityFeed, { activities: dashboard.recentActivity, nameById: nameById, now: now })] }), _jsxs("div", { className: "grid gap-8 lg:grid-cols-2", children: [_jsx(NotesList, { notes: dashboard.recentNotes, nameById: nameById, now: now }), _jsx(DecisionsList, { decisions: dashboard.recentDecisions, nameById: nameById })] })] }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=DashboardPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","sourceRoot":"","sources":["../../../src/pages/dashboard/DashboardPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Dashboard, RecordTargetType } from '@kelpie/schemas';
|
|
2
|
+
import type { ChipTone } from '../../components/Chip.tsx';
|
|
3
|
+
export declare function targetTypeLabel(targetType: RecordTargetType): string;
|
|
4
|
+
/**
|
|
5
|
+
* @returns The record's page, or undefined when it has none. A row without a
|
|
6
|
+
* link renders as plain text rather than as a link to nowhere.
|
|
7
|
+
*/
|
|
8
|
+
export declare function targetHref(targetType: RecordTargetType, targetId: string): string | undefined;
|
|
9
|
+
/** How a target reads when it is named on another record's row. */
|
|
10
|
+
export declare function targetDescription(item: {
|
|
11
|
+
readonly targetType: RecordTargetType;
|
|
12
|
+
readonly targetName: string | null;
|
|
13
|
+
}): string;
|
|
14
|
+
export interface AttentionRow {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
/** What kind of signal this is, shown as a chip. */
|
|
17
|
+
readonly label: string;
|
|
18
|
+
readonly tone: ChipTone;
|
|
19
|
+
/** The date or interval that makes it urgent. */
|
|
20
|
+
readonly meta: string;
|
|
21
|
+
readonly title: string;
|
|
22
|
+
readonly detail: string;
|
|
23
|
+
readonly href: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The signals behind the brief, most urgent first.
|
|
27
|
+
*
|
|
28
|
+
* The groups are concatenated rather than sorted: each arrives from the API in
|
|
29
|
+
* its own order — plan items soonest first, contacts coldest first — and a
|
|
30
|
+
* re-sort across the three would throw that away for a single column that means
|
|
31
|
+
* a different thing in each.
|
|
32
|
+
*/
|
|
33
|
+
export declare function attentionRows(dashboard: Dashboard): readonly AttentionRow[];
|
|
34
|
+
/**
|
|
35
|
+
* The brief, built from the totals rather than from the rows.
|
|
36
|
+
*
|
|
37
|
+
* A list is capped by the request's limit and a total is not, so counting the
|
|
38
|
+
* rows on screen would understate every workspace with more than a page of them.
|
|
39
|
+
*/
|
|
40
|
+
export declare function briefLines(dashboard: Dashboard): readonly string[];
|
|
41
|
+
//# sourceMappingURL=attention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/attention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAKT,gBAAgB,EACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAkCzD,wBAAgB,eAAe,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7F;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC,GAAG,MAAM,CAIT;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC;AAsCD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,YAAY,EAAE,CAU3E;AAsBD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,MAAM,EAAE,CA4ClE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { formatDay } from '../../lib/dates.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reading the workspace snapshot as a page: one attention list, and the brief
|
|
4
|
+
* above it.
|
|
5
|
+
*
|
|
6
|
+
* Pure functions over the decoded response, so the page renders and these are
|
|
7
|
+
* tested separately. Nothing here recomputes a signal: the service already
|
|
8
|
+
* decided what is overdue, against the workspace's own day, and a browser that
|
|
9
|
+
* re-derived it from its own clock would disagree with the totals beside it.
|
|
10
|
+
*/
|
|
11
|
+
/** Where each kind of record lives. A Candidate has no page of its own: it is reached through its Role. */
|
|
12
|
+
const ROUTES = {
|
|
13
|
+
person: '/people',
|
|
14
|
+
company: '/companies',
|
|
15
|
+
deal: '/deals',
|
|
16
|
+
opportunity: '/opportunities',
|
|
17
|
+
partnership: '/partnerships',
|
|
18
|
+
raise: '/fundraising',
|
|
19
|
+
candidate: undefined,
|
|
20
|
+
};
|
|
21
|
+
const TARGET_TYPE_LABELS = {
|
|
22
|
+
person: 'Person',
|
|
23
|
+
company: 'Company',
|
|
24
|
+
deal: 'Deal',
|
|
25
|
+
opportunity: 'Opportunity',
|
|
26
|
+
partnership: 'Partnership',
|
|
27
|
+
raise: 'Fundraising',
|
|
28
|
+
candidate: 'Candidate',
|
|
29
|
+
};
|
|
30
|
+
export function targetTypeLabel(targetType) {
|
|
31
|
+
return TARGET_TYPE_LABELS[targetType];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* @returns The record's page, or undefined when it has none. A row without a
|
|
35
|
+
* link renders as plain text rather than as a link to nowhere.
|
|
36
|
+
*/
|
|
37
|
+
export function targetHref(targetType, targetId) {
|
|
38
|
+
const route = ROUTES[targetType];
|
|
39
|
+
return route === undefined ? undefined : `${route}/${targetId}`;
|
|
40
|
+
}
|
|
41
|
+
/** How a target reads when it is named on another record's row. */
|
|
42
|
+
export function targetDescription(item) {
|
|
43
|
+
const label = targetTypeLabel(item.targetType);
|
|
44
|
+
return item.targetName === null ? label : `${label} · ${item.targetName}`;
|
|
45
|
+
}
|
|
46
|
+
function planItemRow(item, overdue) {
|
|
47
|
+
return {
|
|
48
|
+
id: `plan-${item.id}`,
|
|
49
|
+
label: overdue ? 'Plan item overdue' : 'Plan item due soon',
|
|
50
|
+
tone: overdue ? 'danger' : 'warning',
|
|
51
|
+
meta: formatDay(item.date),
|
|
52
|
+
title: item.title,
|
|
53
|
+
detail: targetDescription(item),
|
|
54
|
+
href: targetHref(item.targetType, item.targetId),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function touchpointRow(touchpoint) {
|
|
58
|
+
return {
|
|
59
|
+
id: `touchpoint-${touchpoint.id}`,
|
|
60
|
+
label: touchpoint.overdue ? 'Touchpoint overdue' : 'Touchpoint soon',
|
|
61
|
+
tone: touchpoint.overdue ? 'danger' : 'warning',
|
|
62
|
+
meta: `Touchpoint ${formatDay(touchpoint.nextTouchpoint)}`,
|
|
63
|
+
title: touchpoint.name,
|
|
64
|
+
detail: touchpoint.summary,
|
|
65
|
+
href: `/partnerships/${touchpoint.id}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function staleContactRow(contact) {
|
|
69
|
+
return {
|
|
70
|
+
id: `stale-${contact.id}`,
|
|
71
|
+
label: 'Stale contact',
|
|
72
|
+
tone: 'neutral',
|
|
73
|
+
meta: `${String(contact.daysSinceContact)} days since contact`,
|
|
74
|
+
title: contact.name,
|
|
75
|
+
detail: contact.summary,
|
|
76
|
+
href: `/people/${contact.id}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The signals behind the brief, most urgent first.
|
|
81
|
+
*
|
|
82
|
+
* The groups are concatenated rather than sorted: each arrives from the API in
|
|
83
|
+
* its own order — plan items soonest first, contacts coldest first — and a
|
|
84
|
+
* re-sort across the three would throw that away for a single column that means
|
|
85
|
+
* a different thing in each.
|
|
86
|
+
*/
|
|
87
|
+
export function attentionRows(dashboard) {
|
|
88
|
+
const touchpoints = dashboard.partnershipTouchpoints.items;
|
|
89
|
+
return [
|
|
90
|
+
...dashboard.overduePlanItems.items.map((item) => planItemRow(item, true)),
|
|
91
|
+
...touchpoints.filter((touchpoint) => touchpoint.overdue).map(touchpointRow),
|
|
92
|
+
...dashboard.dueSoonPlanItems.items.map((item) => planItemRow(item, false)),
|
|
93
|
+
...touchpoints.filter((touchpoint) => !touchpoint.overdue).map(touchpointRow),
|
|
94
|
+
...dashboard.staleContacts.items.map(staleContactRow),
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
function plural(count, singular, pluralForm = `${singular}s`) {
|
|
98
|
+
return `${String(count)} ${count === 1 ? singular : pluralForm}`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* How a count of open records reads mid-sentence.
|
|
102
|
+
*
|
|
103
|
+
* Not `PIPELINE_KIND_LABELS`: that one is nav wording, where a Raise is filed
|
|
104
|
+
* under "Fundraising", and "3 fundraisings" is not a sentence. Written out
|
|
105
|
+
* rather than suffixed, because "opportunitys" is not one either.
|
|
106
|
+
*/
|
|
107
|
+
const OPEN_PIPELINE_NOUNS = {
|
|
108
|
+
deal: { one: 'deal', many: 'deals' },
|
|
109
|
+
opportunity: { one: 'opportunity', many: 'opportunities' },
|
|
110
|
+
raise: { one: 'raise', many: 'raises' },
|
|
111
|
+
partnership: { one: 'partnership', many: 'partnerships' },
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* The brief, built from the totals rather than from the rows.
|
|
115
|
+
*
|
|
116
|
+
* A list is capped by the request's limit and a total is not, so counting the
|
|
117
|
+
* rows on screen would understate every workspace with more than a page of them.
|
|
118
|
+
*/
|
|
119
|
+
export function briefLines(dashboard) {
|
|
120
|
+
const lines = [];
|
|
121
|
+
if (dashboard.overduePlanItems.total > 0) {
|
|
122
|
+
lines.push(`${plural(dashboard.overduePlanItems.total, 'plan item')} overdue — triage Planning first.`);
|
|
123
|
+
}
|
|
124
|
+
if (dashboard.dueSoonPlanItems.total > 0) {
|
|
125
|
+
lines.push(`${plural(dashboard.dueSoonPlanItems.total, 'plan item')} due in the next ${plural(dashboard.upcomingDays, 'day')}.`);
|
|
126
|
+
}
|
|
127
|
+
if (dashboard.partnershipTouchpoints.total > 0) {
|
|
128
|
+
lines.push(`${plural(dashboard.partnershipTouchpoints.total, 'partnership touchpoint')} at hand.`);
|
|
129
|
+
}
|
|
130
|
+
if (dashboard.staleContacts.total > 0) {
|
|
131
|
+
lines.push(`${plural(dashboard.staleContacts.total, 'contact')} past the ${String(dashboard.staleContactDays)}-day touch threshold.`);
|
|
132
|
+
}
|
|
133
|
+
const open = dashboard.pipelines.filter((pipeline) => pipeline.open > 0);
|
|
134
|
+
if (open.length > 0) {
|
|
135
|
+
lines.push(`Open: ${open
|
|
136
|
+
.map((pipeline) => {
|
|
137
|
+
const noun = OPEN_PIPELINE_NOUNS[pipeline.kind];
|
|
138
|
+
return plural(pipeline.open, noun.one, noun.many);
|
|
139
|
+
})
|
|
140
|
+
.join(', ')}.`);
|
|
141
|
+
}
|
|
142
|
+
return lines.length === 0
|
|
143
|
+
? ['Nothing urgent. Pipeline and relationships look quiet today.']
|
|
144
|
+
: lines;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=attention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention.js","sourceRoot":"","sources":["../../../src/pages/dashboard/attention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DashboardActivity, DashboardDecision, DashboardNote } from '@kelpie/schemas';
|
|
2
|
+
import type { AttentionRow } from './attention.ts';
|
|
3
|
+
export declare function AttentionList({ rows }: {
|
|
4
|
+
readonly rows: readonly AttentionRow[];
|
|
5
|
+
}): React.JSX.Element;
|
|
6
|
+
export declare function ActivityFeed({ activities, nameById, now, }: {
|
|
7
|
+
readonly activities: readonly DashboardActivity[];
|
|
8
|
+
readonly nameById: ReadonlyMap<string, string>;
|
|
9
|
+
readonly now: Date;
|
|
10
|
+
}): React.JSX.Element;
|
|
11
|
+
export declare function NotesList({ notes, nameById, now, }: {
|
|
12
|
+
readonly notes: readonly DashboardNote[];
|
|
13
|
+
readonly nameById: ReadonlyMap<string, string>;
|
|
14
|
+
readonly now: Date;
|
|
15
|
+
}): React.JSX.Element;
|
|
16
|
+
export declare function DecisionsList({ decisions, nameById, }: {
|
|
17
|
+
readonly decisions: readonly DashboardDecision[];
|
|
18
|
+
readonly nameById: ReadonlyMap<string, string>;
|
|
19
|
+
}): React.JSX.Element;
|
|
20
|
+
//# sourceMappingURL=sections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/sections.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EAEd,MAAM,iBAAiB,CAAA;AAQxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAyDlD,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+BrG;AAED,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,QAAQ,EACR,GAAG,GACJ,EAAE;IACD,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACjD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;CACnB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAqDpB;AAiBD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,GAAG,GACJ,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;CACnB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+BpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAChD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/C,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAuCpB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Link } from 'react-router';
|
|
3
|
+
import { Chip } from '../../components/Chip.js';
|
|
4
|
+
import { SectionHeader } from '../../components/SectionHeader.js';
|
|
5
|
+
import { formatDate, formatRelativeTime } from '../../lib/dates.js';
|
|
6
|
+
import { targetHref, targetTypeLabel } from './attention.js';
|
|
7
|
+
/**
|
|
8
|
+
* The four lists the workspace home is made of.
|
|
9
|
+
*
|
|
10
|
+
* Every row here points at a record other than the one being looked at, which is
|
|
11
|
+
* what makes the dashboard different from a record's own panels: the response
|
|
12
|
+
* carries `targetName` already resolved, so nothing below fetches anything.
|
|
13
|
+
*/
|
|
14
|
+
/** Two letters per kind, as the mockup's timeline gutter shows them. */
|
|
15
|
+
const KIND_GLYPHS = {
|
|
16
|
+
created: 'Cr',
|
|
17
|
+
updated: 'Up',
|
|
18
|
+
stage_changed: 'St',
|
|
19
|
+
note_added: 'Nt',
|
|
20
|
+
email: 'Em',
|
|
21
|
+
call: 'Ca',
|
|
22
|
+
meeting: 'Mt',
|
|
23
|
+
linked: 'Ln',
|
|
24
|
+
unlinked: 'Un',
|
|
25
|
+
};
|
|
26
|
+
/** A record's name, as a link when it has a page and as text when it does not. */
|
|
27
|
+
function TargetLink({ target, className = 'text-ink-muted hover:text-accent hover:underline', }) {
|
|
28
|
+
const href = targetHref(target.targetType, target.targetId);
|
|
29
|
+
const label = target.targetName ?? targetTypeLabel(target.targetType);
|
|
30
|
+
if (href === undefined) {
|
|
31
|
+
return _jsx("span", { className: className, children: label });
|
|
32
|
+
}
|
|
33
|
+
return (_jsx(Link, { to: href, className: className, children: label }));
|
|
34
|
+
}
|
|
35
|
+
function EmptyOr({ isEmpty, empty, children, }) {
|
|
36
|
+
return isEmpty ? _jsx("p", { className: "text-[13px] text-ink-faint", children: empty }) : _jsx(_Fragment, { children: children });
|
|
37
|
+
}
|
|
38
|
+
export function AttentionList({ rows }) {
|
|
39
|
+
return (_jsxs("section", { children: [_jsx(SectionHeader, { title: "Needs attention", description: "The signals behind the brief." }), _jsx(EmptyOr, { isEmpty: rows.length === 0, empty: "Nothing urgent right now.", children: _jsx("ul", { className: "divide-y divide-border border-y border-border", children: rows.map((row) => (_jsxs("li", { className: "py-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Chip, { tone: row.tone, children: row.label }), _jsx("span", { className: "text-[11px] text-ink-faint", children: row.meta })] }), row.href === undefined ? (_jsx("p", { className: "mt-1.5 text-[13px] font-medium text-ink", children: row.title })) : (_jsx(Link, { to: row.href, className: "mt-1.5 block text-[13px] font-medium text-ink hover:text-accent", children: row.title })), row.detail !== '' && (_jsx("p", { className: "mt-0.5 line-clamp-2 text-[12px] text-ink-muted", children: row.detail }))] }, row.id))) }) })] }));
|
|
40
|
+
}
|
|
41
|
+
export function ActivityFeed({ activities, nameById, now, }) {
|
|
42
|
+
return (_jsxs("section", { children: [_jsx(SectionHeader, { title: "Recent activity", description: "The latest events across people, companies, and pipelines." }), _jsx(EmptyOr, { isEmpty: activities.length === 0, empty: "No activity yet.", children: _jsx("ol", { className: "divide-y divide-border border-y border-border", children: activities.map((activity, index) => (_jsxs("li", { className: "flex gap-2 py-3", children: [_jsxs("div", { className: "relative flex w-5 shrink-0 justify-center", children: [index < activities.length - 1 && (_jsx("span", { "aria-hidden": true, className: "absolute top-5 bottom-[-12px] left-1/2 w-px -translate-x-1/2 bg-border" })), _jsx("div", { className: "relative z-10 flex h-5 w-5 items-center justify-center rounded border border-border bg-surface text-[9px] font-medium tracking-wide text-ink-muted uppercase", title: activity.kind, children: KIND_GLYPHS[activity.kind] })] }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [_jsxs("p", { className: "min-w-0 text-[12px] leading-snug text-ink", children: [_jsx("span", { className: "font-semibold", children: actorNameFor(activity, nameById) }), ' ', _jsx("span", { className: "text-ink-muted", children: activity.action })] }), _jsx("time", { dateTime: activity.createdAt.toISOString(), className: "shrink-0 text-[11px] text-ink-faint", children: formatRelativeTime(activity.createdAt, now) })] }), _jsxs("p", { className: "text-[11px] leading-snug text-ink-faint", children: ["on ", _jsx("span", { className: "text-ink-muted", children: targetTypeLabel(activity.targetType) }), ' · ', _jsx(TargetLink, { target: activity })] }), activity.detail !== null && (_jsx("p", { className: "text-[11px] leading-snug text-ink-faint", children: activity.detail }))] })] }, activity.id))) }) })] }));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Exactly one of the two actor columns is set. `actorLabel` carries the display
|
|
46
|
+
* name when nothing on the team did this: "Form", "Gmail", "API key".
|
|
47
|
+
*/
|
|
48
|
+
function actorNameFor(activity, nameById) {
|
|
49
|
+
if (activity.actorMemberId === null) {
|
|
50
|
+
return activity.actorLabel ?? 'System';
|
|
51
|
+
}
|
|
52
|
+
return nameById.get(activity.actorMemberId) ?? 'Unknown';
|
|
53
|
+
}
|
|
54
|
+
export function NotesList({ notes, nameById, now, }) {
|
|
55
|
+
return (_jsxs("section", { children: [_jsx(SectionHeader, { title: "Recent notes", description: "Pinned notes surface first." }), _jsx(EmptyOr, { isEmpty: notes.length === 0, empty: "No notes yet.", children: _jsx("ul", { className: "divide-y divide-border border-y border-border", children: notes.map((note) => (_jsxs("li", { className: "py-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsx("p", { className: "line-clamp-3 text-[13px] leading-relaxed text-ink", children: note.body }), note.pinned && (_jsx("span", { className: "shrink-0 text-[10px] font-medium tracking-wide text-accent uppercase", children: "Pinned" }))] }), _jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-2 text-[11px] text-ink-faint", children: [_jsx(TargetLink, { target: note }), _jsx("span", { children: "\u00B7" }), _jsx("span", { children: targetTypeLabel(note.targetType) }), _jsx("span", { children: "\u00B7" }), _jsx("span", { children: note.authorId === null ? 'System' : (nameById.get(note.authorId) ?? 'Unknown') }), _jsx("span", { children: "\u00B7" }), _jsx("span", { children: formatRelativeTime(note.createdAt, now) })] })] }, note.id))) }) })] }));
|
|
56
|
+
}
|
|
57
|
+
export function DecisionsList({ decisions, nameById, }) {
|
|
58
|
+
return (_jsxs("section", { children: [_jsxs("div", { className: "mb-3 flex items-start justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-[13px] font-semibold text-ink", children: "Recent decisions" }), _jsx("p", { className: "mt-0.5 text-[11px] text-ink-faint", children: "Commitments agents should not contradict." })] }), _jsx(Link, { to: "/decisions", className: "shrink-0 text-[12px] font-medium text-accent hover:underline", children: "View all" })] }), _jsx(EmptyOr, { isEmpty: decisions.length === 0, empty: "No decisions yet.", children: _jsx("ul", { className: "divide-y divide-border border-y border-border", children: decisions.map((decision) => (_jsxs("li", { className: "py-3", children: [_jsx("p", { className: "text-[13px] font-medium text-ink", children: decision.body }), decision.rationale !== null && (_jsx("p", { className: "mt-0.5 line-clamp-2 text-[12px] text-ink-muted", children: decision.rationale })), _jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-2 text-[11px] text-ink-faint", children: [_jsx(TargetLink, { target: decision }), _jsx("span", { children: "\u00B7" }), _jsx("span", { children: formatDate(decision.decidedAt) }), _jsx("span", { children: "\u00B7" }), _jsx("span", { children: decision.ownerId === null ? '—' : (nameById.get(decision.ownerId) ?? 'Unknown') })] })] }, decision.id))) }) })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../src/pages/dashboard/sections.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Small conversions the detail pages share, kept out of their markup. */
|
|
2
|
+
/** `decision_maker` reads as `decision maker` in a label. The stored value never changes. */
|
|
3
|
+
export declare function labelize(value: string): string;
|
|
4
|
+
/** A fixed value set as `InlineEdit` select options. */
|
|
5
|
+
export declare function toOptions(values: readonly string[]): readonly {
|
|
6
|
+
readonly value: string;
|
|
7
|
+
readonly label: string;
|
|
8
|
+
}[];
|
|
9
|
+
/** The comma-separated tag box, back into the array the API takes. */
|
|
10
|
+
export declare function toTags(value: string): readonly string[];
|
|
11
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/pages/fields.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wDAAwD;AACxD,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAE/D;AAED,sEAAsE;AACtE,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAKvD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Small conversions the detail pages share, kept out of their markup. */
|
|
2
|
+
/** `decision_maker` reads as `decision maker` in a label. The stored value never changes. */
|
|
3
|
+
export function labelize(value) {
|
|
4
|
+
return value.replace(/_/gu, ' ');
|
|
5
|
+
}
|
|
6
|
+
/** A fixed value set as `InlineEdit` select options. */
|
|
7
|
+
export function toOptions(values) {
|
|
8
|
+
return values.map((value) => ({ value, label: labelize(value) }));
|
|
9
|
+
}
|
|
10
|
+
/** The comma-separated tag box, back into the array the API takes. */
|
|
11
|
+
export function toTags(value) {
|
|
12
|
+
return value
|
|
13
|
+
.split(',')
|
|
14
|
+
.map((tag) => tag.trim())
|
|
15
|
+
.filter((tag) => tag.length > 0);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/pages/fields.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,6FAA6F;AAC7F,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAClC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,SAAS,CACvB,MAAyB;IAEzB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AACpC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Form } from '@kelpie/schemas';
|
|
2
|
+
/**
|
|
3
|
+
* What to paste into a website.
|
|
4
|
+
*
|
|
5
|
+
* The URL and both snippets come from the API rather than being built here. The
|
|
6
|
+
* embed page is served by the service, so its address depends on where the
|
|
7
|
+
* service is reached, which the server knows from the request and the browser
|
|
8
|
+
* only happens to share while the two are same-origin.
|
|
9
|
+
*/
|
|
10
|
+
export interface EmbedPanelProps {
|
|
11
|
+
readonly form: Form;
|
|
12
|
+
}
|
|
13
|
+
export declare function EmbedPanel({ form }: EmbedPanelProps): React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=EmbedPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbedPanel.d.ts","sourceRoot":"","sources":["../../../src/pages/forms/EmbedPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAO3C;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+CvE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useFormEmbed } from '../../api/resources/forms.js';
|
|
3
|
+
import { CopyButton } from '../../components/CopyButton.js';
|
|
4
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
|
|
5
|
+
import { SectionHeader } from '../../components/SectionHeader.js';
|
|
6
|
+
export function EmbedPanel({ form }) {
|
|
7
|
+
const { snippets, isLoading, error } = useFormEmbed(form.id);
|
|
8
|
+
if (error !== null) {
|
|
9
|
+
return _jsx(ErrorPanel, { error: error });
|
|
10
|
+
}
|
|
11
|
+
if (isLoading || snippets === undefined) {
|
|
12
|
+
return _jsx(LoadingPanel, { label: "Loading embed details\u2026" });
|
|
13
|
+
}
|
|
14
|
+
return (_jsxs("div", { className: "max-w-2xl space-y-5", children: [_jsx(SectionHeader, { title: "Embed", description: "The page below is served by Kelpie, so a site embedding it loads nothing else." }), _jsxs("div", { children: [_jsx("span", { className: "mb-1.5 block text-[12px] font-medium text-ink", children: "Hosted page" }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("code", { className: "flex-1 overflow-x-auto rounded-md border border-border bg-surface-raised px-3 py-2 font-mono text-[12px] text-ink", children: snippets.url }), _jsx("a", { href: snippets.url, target: "_blank", rel: "noreferrer", className: "rounded-md bg-accent px-3 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover", children: "Open" })] })] }), _jsx(Snippet, { label: "iframe", hint: "One tag, no JavaScript, fixed height.", value: snippets.iframeSnippet }), _jsx(Snippet, { label: "iframe with auto-resize", hint: "Adds a listener that follows the page as fields appear and as the thank-you replaces the form.", value: snippets.scriptSnippet })] }));
|
|
15
|
+
}
|
|
16
|
+
function Snippet({ label, hint, value, }) {
|
|
17
|
+
return (_jsxs("div", { children: [_jsxs("div", { className: "mb-1.5 flex items-center justify-between gap-2", children: [_jsx("span", { className: "text-[12px] font-medium text-ink", children: label }), _jsx(CopyButton, { value: value, label: `Copy the ${label} snippet` })] }), _jsx("textarea", { readOnly: true, value: value, rows: value.split('\n').length + 1, "aria-label": `${label} snippet`, className: "w-full resize-y rounded-md border border-border bg-surface-raised px-3 py-2 font-mono text-[11px] text-ink outline-none" }), _jsx("p", { className: "mt-1 text-[11px] text-ink-faint", children: hint })] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=EmbedPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbedPanel.js","sourceRoot":"","sources":["../../../src/pages/forms/EmbedPanel.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAiC,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gCAAiC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAoC,CAAA;AAelE,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAmB;IAClD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE5D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAA;IACrC,CAAC;IAED,IAAI,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,KAAC,YAAY,IAAC,KAAK,EAAC,6BAAwB,GAAG,CAAA;IACxD,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,aAAa,IACZ,KAAK,EAAC,OAAO,EACb,WAAW,EAAC,gFAAgF,GAC5F,EAEF,0BACE,eAAM,SAAS,EAAC,+CAA+C,4BAAmB,EAClF,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAM,SAAS,EAAC,mHAAmH,YAChI,QAAQ,CAAC,GAAG,GACR,EACP,YACE,IAAI,EAAE,QAAQ,CAAC,GAAG,EAClB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAC,0GAA0G,qBAGlH,IACA,IACF,EAEN,KAAC,OAAO,IACN,KAAK,EAAC,QAAQ,EACd,IAAI,EAAC,uCAAuC,EAC5C,KAAK,EAAE,QAAQ,CAAC,aAAa,GAC7B,EACF,KAAC,OAAO,IACN,KAAK,EAAC,yBAAyB,EAC/B,IAAI,EAAC,gGAAgG,EACrG,KAAK,EAAE,QAAQ,CAAC,aAAa,GAC7B,IACE,CACP,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,EACf,KAAK,EACL,IAAI,EACJ,KAAK,GAKN;IACC,OAAO,CACL,0BACE,eAAK,SAAS,EAAC,gDAAgD,aAC7D,eAAM,SAAS,EAAC,kCAAkC,YAAE,KAAK,GAAQ,EACjE,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,KAAK,UAAU,GAAI,IAC5D,EACN,mBACE,QAAQ,QACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,gBACtB,GAAG,KAAK,UAAU,EAC9B,SAAS,EAAC,yHAAyH,GACnI,EACF,YAAG,SAAS,EAAC,iCAAiC,YAAE,IAAI,GAAK,IACrD,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldsEditor.d.ts","sourceRoot":"","sources":["../../../src/pages/forms/FieldsEditor.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAA2D,MAAM,iBAAiB,CAAA;AAgDpG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA2G3E"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors, } from '@dnd-kit/core';
|
|
3
|
+
import { SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable';
|
|
4
|
+
import { CSS } from '@dnd-kit/utilities';
|
|
5
|
+
import { FORM_FIELD_MAP_TARGET_LABELS, FORM_OPTION_VALUE_TYPES } from '@kelpie/schemas';
|
|
6
|
+
import { useEffect, useState } from 'react';
|
|
7
|
+
import { useUpdateFormFields } from '../../api/resources/forms.js';
|
|
8
|
+
import { ErrorPanel } from '../../components/QueryState.js';
|
|
9
|
+
import { SectionHeader } from '../../components/SectionHeader.js';
|
|
10
|
+
import { FIELD_TYPE_OPTIONS, MAP_TARGET_OPTIONS, editField, fieldsChanged, findProblems, insertField, isUsable, removeField, reorderFields, toEditableFields, toFieldInputs, typeForTarget, } from './fieldList.js';
|
|
11
|
+
import { NEW_FIELD } from './template.js';
|
|
12
|
+
/**
|
|
13
|
+
* The field builder.
|
|
14
|
+
*
|
|
15
|
+
* Explicitly saved rather than saved per keystroke, unlike the inline editing
|
|
16
|
+
* everywhere else in the app. A write replaces the whole list, so an
|
|
17
|
+
* auto-committing builder would send one full rewrite per character typed into a
|
|
18
|
+
* label, and every one of them would reissue every field id. The draft lives
|
|
19
|
+
* here until somebody presses Save.
|
|
20
|
+
*
|
|
21
|
+
* A field id is a stored id for a saved field and a local one for a field just
|
|
22
|
+
* added; neither is sent. The server assigns ids and positions from the array's
|
|
23
|
+
* order on every write.
|
|
24
|
+
*/
|
|
25
|
+
let localFieldCount = 0;
|
|
26
|
+
function localFieldId() {
|
|
27
|
+
localFieldCount += 1;
|
|
28
|
+
return `new-${String(localFieldCount)}`;
|
|
29
|
+
}
|
|
30
|
+
const inputClass = 'w-full rounded-md border border-border bg-surface-raised px-2.5 py-1.5 text-[13px] outline-none focus:border-accent focus:ring-2 focus:ring-accent/20';
|
|
31
|
+
export function FieldsEditor({ form }) {
|
|
32
|
+
const [fields, setFields] = useState(() => toEditableFields(form));
|
|
33
|
+
const updateFields = useUpdateFormFields();
|
|
34
|
+
const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 6 } }), useSensor(KeyboardSensor));
|
|
35
|
+
// A save answers with the stored list, ids and all. Re-reading it here is what
|
|
36
|
+
// turns the local ids of newly added fields into the real ones.
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
setFields(toEditableFields(form));
|
|
39
|
+
}, [form]);
|
|
40
|
+
const problems = findProblems(fields, form.createDeal);
|
|
41
|
+
const changed = fieldsChanged(form, fields);
|
|
42
|
+
function onDragEnd(event) {
|
|
43
|
+
const overId = event.over?.id;
|
|
44
|
+
if (overId !== undefined) {
|
|
45
|
+
setFields((current) => reorderFields(current, String(event.active.id), String(overId)));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function save() {
|
|
49
|
+
updateFields.run({ id: form.id, fields: toFieldInputs(fields) });
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs("div", { className: "max-w-3xl", children: [_jsx(SectionHeader, { title: "Fields", description: "Drag to reorder. What a field maps to decides what a submission writes.", onAdd: () => {
|
|
52
|
+
setFields((current) => insertField(current, { ...NEW_FIELD, id: localFieldId() }, null));
|
|
53
|
+
}, addLabel: "Add field" }), problems.list.map((problem) => (_jsx("p", { className: "mb-2 text-[12px] text-danger", children: problem }, problem))), _jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: onDragEnd, children: _jsx(SortableContext, { items: fields.map((field) => field.id), strategy: verticalListSortingStrategy, children: _jsx("ul", { className: "flex flex-col gap-2", children: fields.map((field) => (_jsx(SortableField, { field: field, problem: problems.byField.get(field.id), onChange: (change) => {
|
|
54
|
+
setFields((current) => editField(current, field.id, change));
|
|
55
|
+
}, onRemove: () => {
|
|
56
|
+
setFields((current) => removeField(current, field.id));
|
|
57
|
+
}, onAddBelow: () => {
|
|
58
|
+
setFields((current) => insertField(current, { ...NEW_FIELD, id: localFieldId() }, field.id));
|
|
59
|
+
} }, field.id))) }) }) }), fields.length === 0 && (_jsx("p", { className: "rounded-md border border-dashed border-border px-6 py-10 text-center text-[13px] text-ink-muted", children: "No fields yet. A form needs at least an email field." })), updateFields.error !== null && (_jsx("div", { className: "mt-3", children: _jsx(ErrorPanel, { error: updateFields.error }) })), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: save, disabled: !changed || !isUsable(problems) || updateFields.isPending, className: "rounded-md bg-accent px-3 py-1.5 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: updateFields.isPending ? 'Saving…' : 'Save fields' }), changed && (_jsx("button", { type: "button", onClick: () => {
|
|
60
|
+
setFields(toEditableFields(form));
|
|
61
|
+
}, className: "text-[12px] font-medium text-ink-muted transition hover:text-ink", children: "Discard changes" })), !changed && _jsx("span", { className: "text-[12px] text-ink-faint", children: "Saved" })] })] }));
|
|
62
|
+
}
|
|
63
|
+
function SortableField({ field, problem, onChange, onRemove, onAddBelow, }) {
|
|
64
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
65
|
+
id: field.id,
|
|
66
|
+
});
|
|
67
|
+
return (_jsxs("li", { ref: setNodeRef, style: {
|
|
68
|
+
transform: CSS.Transform.toString(transform),
|
|
69
|
+
transition,
|
|
70
|
+
opacity: isDragging ? 0.35 : 1,
|
|
71
|
+
}, className: [
|
|
72
|
+
'rounded-md border bg-surface-raised p-3',
|
|
73
|
+
problem === undefined ? 'border-border' : 'border-danger/50',
|
|
74
|
+
].join(' '), children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("button", { type: "button", className: "cursor-grab touch-none px-1 py-2 text-[10px] text-ink-faint active:cursor-grabbing", "aria-label": `Drag ${field.label} to reorder`, ...attributes, ...listeners, children: "\u22EE\u22EE" }), _jsxs("div", { className: "grid flex-1 gap-2 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[11px] font-medium text-ink-faint", children: "Label" }), _jsx("input", { className: inputClass, value: field.label, onChange: (event) => {
|
|
75
|
+
onChange({ label: event.target.value });
|
|
76
|
+
} })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[11px] font-medium text-ink-faint", children: "Maps to" }), _jsx("select", { className: inputClass, value: field.mapTo, onChange: (event) => {
|
|
77
|
+
const mapTo = event.target.value;
|
|
78
|
+
onChange({ mapTo, type: typeForTarget(mapTo, field.type) });
|
|
79
|
+
}, children: MAP_TARGET_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: FORM_FIELD_MAP_TARGET_LABELS[option.value] }, option.value))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[11px] font-medium text-ink-faint", children: "Type" }), _jsx("select", { className: inputClass, value: field.type, onChange: (event) => {
|
|
80
|
+
onChange({ type: event.target.value });
|
|
81
|
+
}, children: FIELD_TYPE_OPTIONS.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1 block text-[11px] font-medium text-ink-faint", children: "Placeholder" }), _jsx("input", { className: inputClass, value: field.placeholder ?? '', onChange: (event) => {
|
|
82
|
+
onChange({ placeholder: event.target.value.length === 0 ? null : event.target.value });
|
|
83
|
+
} })] })] }), _jsxs("div", { className: "flex shrink-0 flex-col items-end gap-1", children: [_jsx("button", { type: "button", onClick: onRemove, "aria-label": `Remove ${field.label}`, className: "rounded-md px-1.5 py-1 text-[12px] text-ink-faint transition hover:text-danger", children: "\u2715" }), _jsx("button", { type: "button", onClick: onAddBelow, "aria-label": `Add a field below ${field.label}`, className: "rounded-md px-1.5 py-1 text-[12px] text-ink-faint transition hover:text-accent", children: "+" })] })] }), _jsxs("label", { className: "mt-2 flex items-center gap-2 pl-7 text-[12px] text-ink-muted", children: [_jsx("input", { type: "checkbox", checked: field.required ?? false, onChange: (event) => {
|
|
84
|
+
onChange({ required: event.target.checked });
|
|
85
|
+
} }), "Required"] }), field.type === 'select' && (_jsx(OptionsEditor, { options: field.options ?? [], onChange: (options) => {
|
|
86
|
+
onChange({ options });
|
|
87
|
+
} })), problem !== undefined && _jsx("p", { className: "mt-2 pl-7 text-[12px] text-danger", children: problem })] }));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A select's choices.
|
|
91
|
+
*
|
|
92
|
+
* `key` is what a stored answer holds, so it is editable and it is what the
|
|
93
|
+
* server validates a submit against. Changing a `value` renames the choice on
|
|
94
|
+
* screen without invalidating the answers already recorded under its key, which
|
|
95
|
+
* is the whole reason the two are separate.
|
|
96
|
+
*/
|
|
97
|
+
function OptionsEditor({ options, onChange, }) {
|
|
98
|
+
return (_jsxs("div", { className: "mt-3 space-y-2 pl-7", children: [_jsx("span", { className: "block text-[11px] font-medium text-ink-faint", children: "Options" }), options.map((option, index) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { className: `${inputClass} font-mono text-[12px]`, "aria-label": `Option ${String(index + 1)} key`, value: option.key, onChange: (event) => {
|
|
99
|
+
onChange(options.map((existing, at) => at === index ? { ...existing, key: event.target.value } : existing));
|
|
100
|
+
} }), _jsx("input", { className: inputClass, "aria-label": `Option ${String(index + 1)} label`, value: option.value, onChange: (event) => {
|
|
101
|
+
onChange(options.map((existing, at) => at === index ? { ...existing, value: event.target.value } : existing));
|
|
102
|
+
} }), _jsx("select", { className: `${inputClass} w-28`, "aria-label": `Option ${String(index + 1)} value type`, value: option.valueType ?? 'string', onChange: (event) => {
|
|
103
|
+
onChange(options.map((existing, at) => at === index
|
|
104
|
+
? { ...existing, valueType: event.target.value }
|
|
105
|
+
: existing));
|
|
106
|
+
}, children: FORM_OPTION_VALUE_TYPES.map((type) => (_jsx("option", { value: type, children: type }, type))) }), _jsx("button", { type: "button", onClick: () => {
|
|
107
|
+
onChange(options.filter((_option, at) => at !== index));
|
|
108
|
+
}, "aria-label": `Remove option ${option.value}`, className: "rounded-md px-1.5 py-1 text-[12px] text-ink-faint transition hover:text-danger", children: "\u2715" })] }, `${option.key}-${String(index)}`))), _jsx("button", { type: "button", onClick: () => {
|
|
109
|
+
onChange([
|
|
110
|
+
...options,
|
|
111
|
+
{ key: `option_${String(options.length + 1)}`, value: 'New option', valueType: 'string' },
|
|
112
|
+
]);
|
|
113
|
+
}, className: "text-[12px] font-medium text-ink-muted transition hover:text-accent", children: "+ Add option" })] }));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=FieldsEditor.js.map
|