@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,327 @@
|
|
|
1
|
+
import { MAX_HANDBOOK_DEPTH } from '@kelpie/schemas'
|
|
2
|
+
import type { HandbookPage } from '@kelpie/schemas'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The sidebar tree: how a flat list of pages becomes an indented list, and where
|
|
6
|
+
* a drag would put the page being dragged.
|
|
7
|
+
*
|
|
8
|
+
* Ported from the mockup's `HandbookPage.tsx`, extracted into its own module
|
|
9
|
+
* because the projection is the only genuinely intricate part of the page and it
|
|
10
|
+
* is pure: flat list in, landing spot out. The page turns that landing spot into
|
|
11
|
+
* one PATCH and lets the server renumber the siblings.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Pixels of indent per level. The drag reads horizontal movement in these units. */
|
|
15
|
+
export const INDENT = 14
|
|
16
|
+
|
|
17
|
+
export interface FlatItem {
|
|
18
|
+
readonly id: string
|
|
19
|
+
readonly page: HandbookPage
|
|
20
|
+
readonly depth: number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Where a dragged page would land: a new parent, and a position among that parent's children. */
|
|
24
|
+
export interface Projection {
|
|
25
|
+
readonly parentId: string | null
|
|
26
|
+
readonly depth: number
|
|
27
|
+
readonly insertIndex: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* One parent's children, in sidebar order.
|
|
32
|
+
*
|
|
33
|
+
* Title breaks a tie, which the mockup did and the API makes unnecessary: the
|
|
34
|
+
* server keeps a sibling set contiguous from 0. It stays because the tie is
|
|
35
|
+
* real for the moment an optimistic update holds two pages at one position.
|
|
36
|
+
*/
|
|
37
|
+
export function childrenOf(
|
|
38
|
+
pages: readonly HandbookPage[],
|
|
39
|
+
parentId: string | null,
|
|
40
|
+
): HandbookPage[] {
|
|
41
|
+
return pages
|
|
42
|
+
.filter((page) => page.parentId === parentId)
|
|
43
|
+
.sort(
|
|
44
|
+
(left, right) => left.sortOrder - right.sortOrder || left.title.localeCompare(right.title),
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The tree as the list of rows the sidebar renders, parents before their children.
|
|
50
|
+
*
|
|
51
|
+
* A page whose parent is missing is left out. That happens for the moment
|
|
52
|
+
* between deleting a page and the list refetching, and floating its orphaned
|
|
53
|
+
* subpages to the top level would read as though somebody had moved them there.
|
|
54
|
+
*/
|
|
55
|
+
export function flattenTree(pages: readonly HandbookPage[]): FlatItem[] {
|
|
56
|
+
const rows: FlatItem[] = []
|
|
57
|
+
|
|
58
|
+
function walk(parentId: string | null, depth: number): void {
|
|
59
|
+
for (const page of childrenOf(pages, parentId)) {
|
|
60
|
+
rows.push({ id: page.id, page, depth })
|
|
61
|
+
walk(page.id, depth + 1)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
walk(null, 0)
|
|
66
|
+
|
|
67
|
+
return rows
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Every page under this one, at any depth: the subtree a delete takes and a drag may not enter. */
|
|
71
|
+
export function descendantIds(pages: readonly HandbookPage[], rootId: string): Set<string> {
|
|
72
|
+
const found = new Set<string>()
|
|
73
|
+
|
|
74
|
+
function walk(parentId: string): void {
|
|
75
|
+
for (const child of childrenOf(pages, parentId)) {
|
|
76
|
+
found.add(child.id)
|
|
77
|
+
walk(child.id)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
walk(rootId)
|
|
82
|
+
|
|
83
|
+
return found
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The nearest row above and below the drop target, skipping the page being
|
|
88
|
+
* dragged and everything under it.
|
|
89
|
+
*
|
|
90
|
+
* Those rows are what bound the depth: a page can be at most one level deeper
|
|
91
|
+
* than the row above it, and no shallower than the row below, or it would adopt
|
|
92
|
+
* that row's subtree by sitting above it at a lower indent.
|
|
93
|
+
*/
|
|
94
|
+
function neighbours(
|
|
95
|
+
flat: readonly FlatItem[],
|
|
96
|
+
activeIndex: number,
|
|
97
|
+
overIndex: number,
|
|
98
|
+
skip: ReadonlySet<string>,
|
|
99
|
+
): { previous: FlatItem | undefined; next: FlatItem | undefined } {
|
|
100
|
+
const passes = (item: FlatItem): boolean => !skip.has(item.id)
|
|
101
|
+
const movingDown = activeIndex < overIndex
|
|
102
|
+
|
|
103
|
+
let previous: FlatItem | undefined
|
|
104
|
+
let next: FlatItem | undefined
|
|
105
|
+
|
|
106
|
+
for (let index = overIndex - (movingDown ? 0 : 1); index >= 0; index -= 1) {
|
|
107
|
+
const item = flat[index]
|
|
108
|
+
|
|
109
|
+
if (item !== undefined && passes(item)) {
|
|
110
|
+
previous = item
|
|
111
|
+
break
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
for (let index = overIndex + (movingDown ? 1 : 0); index < flat.length; index += 1) {
|
|
116
|
+
const item = flat[index]
|
|
117
|
+
|
|
118
|
+
if (item !== undefined && passes(item)) {
|
|
119
|
+
next = item
|
|
120
|
+
break
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return { previous, next }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The parent a page sits under at `depth`, given the row above it. */
|
|
128
|
+
function parentAtDepth(
|
|
129
|
+
flat: readonly FlatItem[],
|
|
130
|
+
pages: readonly HandbookPage[],
|
|
131
|
+
previous: FlatItem,
|
|
132
|
+
depth: number,
|
|
133
|
+
): string | null {
|
|
134
|
+
if (depth === previous.depth) {
|
|
135
|
+
return previous.page.parentId
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (depth > previous.depth) {
|
|
139
|
+
return previous.id
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Shallower than the row above: walk up its ancestors to the one that sits at
|
|
143
|
+
// the level being dropped into.
|
|
144
|
+
let cursor: HandbookPage | undefined = previous.page
|
|
145
|
+
|
|
146
|
+
while (cursor !== undefined) {
|
|
147
|
+
const row = flat.find((item) => item.id === cursor?.id)
|
|
148
|
+
|
|
149
|
+
if (row !== undefined && row.depth === depth - 1) {
|
|
150
|
+
return cursor.id
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (row !== undefined && row.depth < depth) {
|
|
154
|
+
return cursor.parentId
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
cursor =
|
|
158
|
+
cursor.parentId === null
|
|
159
|
+
? undefined
|
|
160
|
+
: pages.find((page) => page.id === cursor?.parentId)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return null
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Where a drag would land the page.
|
|
168
|
+
*
|
|
169
|
+
* @param offsetX How far the pointer has moved horizontally. Divided by `INDENT`
|
|
170
|
+
* it is the change in nesting depth, which is how one gesture reorders and
|
|
171
|
+
* re-nests at once.
|
|
172
|
+
* @returns The landing spot, clamped to a legal one. A drop onto the page's own
|
|
173
|
+
* subtree, or past the depth cap, resolves to where the page already is rather
|
|
174
|
+
* than to a request the server would refuse.
|
|
175
|
+
*/
|
|
176
|
+
export function projectDrop(
|
|
177
|
+
flat: readonly FlatItem[],
|
|
178
|
+
pages: readonly HandbookPage[],
|
|
179
|
+
activeId: string,
|
|
180
|
+
overId: string,
|
|
181
|
+
offsetX: number,
|
|
182
|
+
): Projection {
|
|
183
|
+
const active = flat.find((item) => item.id === activeId)
|
|
184
|
+
const over = flat.find((item) => item.id === overId)
|
|
185
|
+
|
|
186
|
+
if (active === undefined || over === undefined) {
|
|
187
|
+
return { parentId: null, depth: 0, insertIndex: 0 }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const doomed = descendantIds(pages, activeId)
|
|
191
|
+
const skip = new Set([activeId, ...doomed])
|
|
192
|
+
const activeIndex = flat.findIndex((item) => item.id === activeId)
|
|
193
|
+
const overIndex = flat.findIndex((item) => item.id === overId)
|
|
194
|
+
const { previous, next } = neighbours(flat, activeIndex, overIndex, skip)
|
|
195
|
+
|
|
196
|
+
const requested = Math.round((active.depth * INDENT + offsetX) / INDENT)
|
|
197
|
+
const ceiling = previous === undefined ? 0 : Math.min(MAX_HANDBOOK_DEPTH, previous.depth + 1)
|
|
198
|
+
const floor = next?.depth ?? 0
|
|
199
|
+
const depth = Math.max(floor, Math.min(ceiling, Math.max(0, requested)))
|
|
200
|
+
|
|
201
|
+
const proposed =
|
|
202
|
+
depth === 0 || previous === undefined ? null : parentAtDepth(flat, pages, previous, depth)
|
|
203
|
+
// A projection can still name the page itself or one of its own subpages.
|
|
204
|
+
// Leaving it where it is beats sending a move the API would answer 422 to.
|
|
205
|
+
const refused = proposed === activeId || (proposed !== null && doomed.has(proposed))
|
|
206
|
+
const parentId = refused ? active.page.parentId : proposed
|
|
207
|
+
|
|
208
|
+
const siblings = childrenOf(pages, parentId).filter((page) => page.id !== activeId)
|
|
209
|
+
|
|
210
|
+
return {
|
|
211
|
+
parentId,
|
|
212
|
+
depth: refused ? active.depth : depth,
|
|
213
|
+
insertIndex: insertionFor(siblings, {
|
|
214
|
+
pages,
|
|
215
|
+
activeId,
|
|
216
|
+
over,
|
|
217
|
+
previous,
|
|
218
|
+
parentId,
|
|
219
|
+
activeIndex,
|
|
220
|
+
overIndex,
|
|
221
|
+
}),
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
interface InsertionContext {
|
|
226
|
+
readonly pages: readonly HandbookPage[]
|
|
227
|
+
readonly activeId: string
|
|
228
|
+
readonly over: FlatItem
|
|
229
|
+
readonly previous: FlatItem | undefined
|
|
230
|
+
readonly parentId: string | null
|
|
231
|
+
readonly activeIndex: number
|
|
232
|
+
readonly overIndex: number
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* The row above the drop, or whichever of its ancestors is a child of `parentId`.
|
|
237
|
+
*
|
|
238
|
+
* The row immediately above is often deeper than where the page is landing: drop
|
|
239
|
+
* a top-level page below a nested one and the nearest row is a grandchild of the
|
|
240
|
+
* sibling it should follow. Walking up finds the sibling it can actually be
|
|
241
|
+
* measured against.
|
|
242
|
+
*/
|
|
243
|
+
function landmarkUnder(
|
|
244
|
+
pages: readonly HandbookPage[],
|
|
245
|
+
from: HandbookPage,
|
|
246
|
+
parentId: string | null,
|
|
247
|
+
): string | undefined {
|
|
248
|
+
let cursor: HandbookPage | undefined = from
|
|
249
|
+
|
|
250
|
+
while (cursor !== undefined) {
|
|
251
|
+
if (cursor.parentId === parentId) {
|
|
252
|
+
return cursor.id
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const above: string | null = cursor.parentId
|
|
256
|
+
|
|
257
|
+
cursor = above === null ? undefined : pages.find((page) => page.id === above)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return undefined
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** The position among the new siblings, 0-based, which is what `sort_order` means to the API. */
|
|
264
|
+
function insertionFor(siblings: readonly HandbookPage[], context: InsertionContext): number {
|
|
265
|
+
const { pages, activeId, over, previous, parentId, activeIndex, overIndex } = context
|
|
266
|
+
|
|
267
|
+
// Dropped onto the page that is becoming the parent, or dropped straight below
|
|
268
|
+
// it: either way the page lands as its first child.
|
|
269
|
+
if (over.id === parentId || previous?.id === parentId) {
|
|
270
|
+
return 0
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// A drop onto the dragged row itself is an indent in place. The row dropped on
|
|
274
|
+
// is the one moving, so it cannot also be the landmark; `siblings` has it
|
|
275
|
+
// filtered out and asking it for a position would answer "the end".
|
|
276
|
+
if (over.id !== activeId && over.page.parentId === parentId) {
|
|
277
|
+
const index = siblings.findIndex((page) => page.id === over.id)
|
|
278
|
+
|
|
279
|
+
if (index < 0) {
|
|
280
|
+
return siblings.length
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Dragging down lands after the row dropped on; dragging up lands before it.
|
|
284
|
+
return activeIndex < overIndex ? index + 1 : index
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (previous === undefined) {
|
|
288
|
+
// Nothing above it in the list, so there is nowhere to land but the top.
|
|
289
|
+
return 0
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const landmark = landmarkUnder(pages, previous.page, parentId)
|
|
293
|
+
const index = landmark === undefined ? -1 : siblings.findIndex((page) => page.id === landmark)
|
|
294
|
+
|
|
295
|
+
return index < 0 ? siblings.length : index + 1
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Whether a landing actually moves the page.
|
|
300
|
+
*
|
|
301
|
+
* Every activated drag ends somewhere, including one that ended where it
|
|
302
|
+
* started. Without this a nudge past the 6px activation distance would send a
|
|
303
|
+
* PATCH, and the optimistic cache write behind it would make the sidebar jump
|
|
304
|
+
* for a gesture that asked for nothing.
|
|
305
|
+
*/
|
|
306
|
+
export function landingMoves(
|
|
307
|
+
pages: readonly HandbookPage[],
|
|
308
|
+
pageId: string,
|
|
309
|
+
landing: Projection,
|
|
310
|
+
): boolean {
|
|
311
|
+
const page = pages.find((candidate) => candidate.id === pageId)
|
|
312
|
+
|
|
313
|
+
if (page === undefined) {
|
|
314
|
+
return false
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (page.parentId !== landing.parentId) {
|
|
318
|
+
return true
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// `insertIndex` counts a sibling set the page has been lifted out of, so the
|
|
322
|
+
// page's own current index is the position that means "put it back".
|
|
323
|
+
return (
|
|
324
|
+
childrenOf(pages, page.parentId).findIndex((sibling) => sibling.id === pageId) !==
|
|
325
|
+
landing.insertIndex
|
|
326
|
+
)
|
|
327
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { Note } from '@kelpie/schemas'
|
|
2
|
+
import { useMemo } from 'react'
|
|
3
|
+
|
|
4
|
+
import { useCandidates } from '../api/resources/candidates.ts'
|
|
5
|
+
import { useNotes } from '../api/resources/notes.ts'
|
|
6
|
+
import { usePeople } from '../api/resources/people.ts'
|
|
7
|
+
import { useRoles } from '../api/resources/roles.ts'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The counts and names the hiring pages need beside their own records.
|
|
11
|
+
*
|
|
12
|
+
* A candidacy carries two ids and no words, so every page showing one needs a
|
|
13
|
+
* second resource to render it. `api.md` has no include-expansion; it has
|
|
14
|
+
* repeatable id filters, so each of these asks about exactly the rows on screen:
|
|
15
|
+
* one extra request for the page rather than one per row.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** `api.md`: `?limit=` and an id filter both max out at 200. */
|
|
19
|
+
const MAX_PAGE = 200
|
|
20
|
+
|
|
21
|
+
export interface RoleCandidateCounts {
|
|
22
|
+
countFor(roleId: string): number
|
|
23
|
+
readonly isLoading: boolean
|
|
24
|
+
/**
|
|
25
|
+
* False when these roles hold more candidacies than one page could return, so
|
|
26
|
+
* the counts are floors rather than totals. The page says so instead of
|
|
27
|
+
* printing a number it cannot stand behind.
|
|
28
|
+
*/
|
|
29
|
+
readonly isComplete: boolean
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function useRoleCandidateCounts(roleIds: readonly string[]): RoleCandidateCounts {
|
|
33
|
+
const candidates = useCandidates({ roleIds, limit: MAX_PAGE }, { enabled: roleIds.length > 0 })
|
|
34
|
+
|
|
35
|
+
const countByRole = useMemo(() => {
|
|
36
|
+
const counts = new Map<string, number>()
|
|
37
|
+
|
|
38
|
+
for (const candidate of candidates.records) {
|
|
39
|
+
counts.set(candidate.roleId, (counts.get(candidate.roleId) ?? 0) + 1)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return counts
|
|
43
|
+
}, [candidates.records])
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
countFor: (roleId) => countByRole.get(roleId) ?? 0,
|
|
47
|
+
isLoading: candidates.isLoading,
|
|
48
|
+
isComplete: !candidates.hasMore,
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface CandidateNotes {
|
|
53
|
+
/** The candidate's most recent note, or undefined when they have none. */
|
|
54
|
+
noteFor(candidateId: string): Note | undefined
|
|
55
|
+
readonly isLoading: boolean
|
|
56
|
+
/**
|
|
57
|
+
* False when these candidates hold more notes than one page could return.
|
|
58
|
+
*
|
|
59
|
+
* A candidate whose note is in the answer is showing their newest one: the
|
|
60
|
+
* list arrives newest first across the whole set, so a truncated page cannot
|
|
61
|
+
* hold an older note of theirs without the newer one. Only an *absent*
|
|
62
|
+
* candidate is ambiguous, and the caller says so rather than offering to
|
|
63
|
+
* write a second note over the one it did not fetch.
|
|
64
|
+
*/
|
|
65
|
+
readonly isComplete: boolean
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The most recent note on each candidate in a pipeline.
|
|
70
|
+
*
|
|
71
|
+
* One request for the whole list rather than one per row. `?target_id=` on notes
|
|
72
|
+
* repeats to name a set, so a page rendering a note per candidate resolves them
|
|
73
|
+
* the way every other related column here does.
|
|
74
|
+
*/
|
|
75
|
+
export function useCandidateNotes(candidateIds: readonly string[]): CandidateNotes {
|
|
76
|
+
const notes = useNotes(
|
|
77
|
+
{ targetType: 'candidate', targetIds: candidateIds, limit: MAX_PAGE },
|
|
78
|
+
{ enabled: candidateIds.length > 0 },
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
const newestByCandidate = useMemo(() => {
|
|
82
|
+
const newest = new Map<string, Note>()
|
|
83
|
+
|
|
84
|
+
// `-created_at` is the default sort, so the first note seen for a candidate
|
|
85
|
+
// is theirs to show and anything later is older.
|
|
86
|
+
for (const note of notes.records) {
|
|
87
|
+
if (!newest.has(note.targetId)) {
|
|
88
|
+
newest.set(note.targetId, note)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return newest
|
|
93
|
+
}, [notes.records])
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
noteFor: (candidateId) => newestByCandidate.get(candidateId),
|
|
97
|
+
isLoading: notes.isLoading,
|
|
98
|
+
isComplete: !notes.hasMore,
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface RoleTitles {
|
|
103
|
+
titleFor(roleId: string): string | undefined
|
|
104
|
+
readonly isLoading: boolean
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Titles for the roles a person is up for.
|
|
109
|
+
*
|
|
110
|
+
* The whole first page rather than an id filter, because `/v1/roles` has no
|
|
111
|
+
* `?id=` and a workspace's open roles are few. A title missing past that page
|
|
112
|
+
* falls back to the id, which is wrong-looking rather than silently blank.
|
|
113
|
+
*/
|
|
114
|
+
export function useRoleTitles(): RoleTitles {
|
|
115
|
+
const roles = useRoles({ limit: MAX_PAGE })
|
|
116
|
+
|
|
117
|
+
const titleById = useMemo(
|
|
118
|
+
() => new Map(roles.records.map((role) => [role.id, role.title])),
|
|
119
|
+
[roles.records],
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return { titleFor: (roleId) => titleById.get(roleId), isLoading: roles.isLoading }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface PersonNames {
|
|
126
|
+
nameFor(personId: string): string | undefined
|
|
127
|
+
readonly isLoading: boolean
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Names for a set of people, from the directory's first page.
|
|
132
|
+
*
|
|
133
|
+
* `/v1/people` has no `?id=` filter, so this is the same compromise
|
|
134
|
+
* `RaiseKeyPeople` makes: past the first page a name is missing rather than
|
|
135
|
+
* wrong, and the caller falls back to the id instead of rendering a blank.
|
|
136
|
+
*/
|
|
137
|
+
export function usePersonNames(): PersonNames {
|
|
138
|
+
const people = usePeople({ limit: MAX_PAGE })
|
|
139
|
+
|
|
140
|
+
const nameById = useMemo(
|
|
141
|
+
() => new Map(people.records.map((person) => [person.id, person.name])),
|
|
142
|
+
[people.records],
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return { nameFor: (personId) => nameById.get(personId), isLoading: people.isLoading }
|
|
146
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { useNavigate } from 'react-router'
|
|
2
|
+
|
|
3
|
+
import { useHandbookPages } from '../../api/resources/handbookPages.ts'
|
|
4
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.tsx'
|
|
5
|
+
import { PrimaryButton } from '../auth/AuthForm.tsx'
|
|
6
|
+
import { AuthLayout } from '../auth/AuthLayout.tsx'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Onboarding step 3: the starter handbook.
|
|
10
|
+
*
|
|
11
|
+
* The mockup's button created these pages. Against the real API they already
|
|
12
|
+
* exist: `POST /v1/workspaces` seeded them in the same transaction that created
|
|
13
|
+
* the workspace, two steps ago. So this reads them back and shows what is there.
|
|
14
|
+
*
|
|
15
|
+
* That is the deviation, and it is the honest one. A button labelled "create"
|
|
16
|
+
* that creates nothing teaches a reader something false about the product, and
|
|
17
|
+
* the alternative — deleting the step — would drop the one screen that tells a
|
|
18
|
+
* new workspace its handbook is what agents read.
|
|
19
|
+
*/
|
|
20
|
+
export function HandbookStepPage(): React.JSX.Element {
|
|
21
|
+
const navigate = useNavigate()
|
|
22
|
+
const { records: pages, isLoading, error } = useHandbookPages()
|
|
23
|
+
|
|
24
|
+
function finish(): void {
|
|
25
|
+
// The wizard ends on the dashboard, per `onboarding.md`. It is empty for a
|
|
26
|
+
// brand new workspace, which is the point: it says what there is to fill in.
|
|
27
|
+
navigate('/dashboard', { replace: true })
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<AuthLayout
|
|
32
|
+
step={3}
|
|
33
|
+
title="Your starter handbook"
|
|
34
|
+
description="These markdown pages are ready. Agents read them to learn what your company is."
|
|
35
|
+
>
|
|
36
|
+
<div className="mt-5 space-y-4">
|
|
37
|
+
{error !== null && <ErrorPanel error={error} />}
|
|
38
|
+
{error === null && isLoading && <LoadingPanel label="Loading your handbook…" />}
|
|
39
|
+
|
|
40
|
+
{error === null && !isLoading && pages.length > 0 && (
|
|
41
|
+
<ul className="max-h-56 overflow-y-auto rounded-md border border-border bg-surface">
|
|
42
|
+
{pages.map((page) => (
|
|
43
|
+
<li
|
|
44
|
+
key={page.id}
|
|
45
|
+
className="border-b border-border px-3 py-2 text-[13px] text-ink last:border-0"
|
|
46
|
+
>
|
|
47
|
+
{page.title}
|
|
48
|
+
</li>
|
|
49
|
+
))}
|
|
50
|
+
</ul>
|
|
51
|
+
)}
|
|
52
|
+
|
|
53
|
+
{/* An empty box under a heading that says the pages are ready would
|
|
54
|
+
assert one thing and show another. The handbook is seeded with the
|
|
55
|
+
workspace, so nothing here is the seeding having not happened. */}
|
|
56
|
+
{error === null && !isLoading && pages.length === 0 && (
|
|
57
|
+
<p className="rounded-md border border-border bg-surface px-3 py-2 text-[13px] text-ink-muted">
|
|
58
|
+
This workspace has no handbook pages. That is not what a new workspace should look
|
|
59
|
+
like — the Handbook tab is where to add them.
|
|
60
|
+
</p>
|
|
61
|
+
)}
|
|
62
|
+
|
|
63
|
+
{pages.length > 0 && (
|
|
64
|
+
<p className="text-[12px] text-ink-muted">
|
|
65
|
+
Every page starts as a stub. Write them from the Handbook tab whenever you are ready.
|
|
66
|
+
</p>
|
|
67
|
+
)}
|
|
68
|
+
|
|
69
|
+
{/* Not a submit: the work behind this step already happened, so the
|
|
70
|
+
button only moves the reader on. */}
|
|
71
|
+
<PrimaryButton label="Go to Kelpie" onClick={finish} />
|
|
72
|
+
</div>
|
|
73
|
+
</AuthLayout>
|
|
74
|
+
)
|
|
75
|
+
}
|