@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,78 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { MINIMUM_PASSWORD_LENGTH } from '@kelpie/schemas';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useAccountSessions, useChangePassword, useRevokeAccountSession, } from '../../api/resources/account.js';
|
|
5
|
+
import { PageHeader } from '../../components/PageHeader.js';
|
|
6
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
|
|
7
|
+
import { formatDateTime } from '../../lib/dates.js';
|
|
8
|
+
/**
|
|
9
|
+
* Password and signed-in devices.
|
|
10
|
+
*
|
|
11
|
+
* Ported from the mockup's Security page against the endpoints that already
|
|
12
|
+
* existed. Two things the mockup could not show: changing the password really
|
|
13
|
+
* does end every other session, so the list below refetches, and the caller's
|
|
14
|
+
* own row cannot be revoked because signing yourself out from here is what the
|
|
15
|
+
* account menu is for.
|
|
16
|
+
*/
|
|
17
|
+
export function SecurityPage() {
|
|
18
|
+
return (_jsxs("div", { className: "animate-slide-in space-y-8", children: [_jsx(PageHeader, { title: "Security", description: "Your password and where you are signed in." }), _jsx(ChangePasswordForm, {}), _jsx(SessionList, {})] }));
|
|
19
|
+
}
|
|
20
|
+
const inputClass = 'w-full rounded-md border border-border bg-surface-raised px-3 py-2 text-[13px] outline-none focus:border-accent focus:ring-2 focus:ring-accent/20';
|
|
21
|
+
function ChangePasswordForm() {
|
|
22
|
+
const change = useChangePassword();
|
|
23
|
+
const [currentPassword, setCurrentPassword] = useState('');
|
|
24
|
+
const [newPassword, setNewPassword] = useState('');
|
|
25
|
+
const [confirmation, setConfirmation] = useState('');
|
|
26
|
+
const [localError, setLocalError] = useState(null);
|
|
27
|
+
const [changed, setChanged] = useState(false);
|
|
28
|
+
/**
|
|
29
|
+
* The two rules the browser can decide on its own. Length is checked here as
|
|
30
|
+
* well as by the service so the reader learns it before submitting; the
|
|
31
|
+
* confirmation never reaches the API, which has nothing to compare it to.
|
|
32
|
+
*/
|
|
33
|
+
function localProblem() {
|
|
34
|
+
if (currentPassword.length === 0 || newPassword.length === 0) {
|
|
35
|
+
return 'Enter your current and new password.';
|
|
36
|
+
}
|
|
37
|
+
if (newPassword.length < MINIMUM_PASSWORD_LENGTH) {
|
|
38
|
+
return `New password must be at least ${String(MINIMUM_PASSWORD_LENGTH)} characters.`;
|
|
39
|
+
}
|
|
40
|
+
return newPassword === confirmation ? null : 'New password and confirmation do not match.';
|
|
41
|
+
}
|
|
42
|
+
function submit(event) {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
setChanged(false);
|
|
45
|
+
const problem = localProblem();
|
|
46
|
+
setLocalError(problem);
|
|
47
|
+
if (problem !== null) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
change
|
|
51
|
+
.runAsync({ currentPassword, newPassword })
|
|
52
|
+
.then(() => {
|
|
53
|
+
setCurrentPassword('');
|
|
54
|
+
setNewPassword('');
|
|
55
|
+
setConfirmation('');
|
|
56
|
+
setChanged(true);
|
|
57
|
+
})
|
|
58
|
+
.catch(() => undefined);
|
|
59
|
+
}
|
|
60
|
+
return (_jsxs("form", { onSubmit: submit, className: "space-y-3", children: [_jsx("h2", { className: "text-[14px] font-semibold text-ink", children: "Change password" }), _jsx("p", { className: "max-w-md text-[12px] text-ink-muted", children: "Changing your password signs you out everywhere except this browser." }), _jsxs("label", { className: "block max-w-md", children: [_jsx("span", { className: "mb-1.5 block text-[12px] font-medium text-ink", children: "Current password" }), _jsx("input", { type: "password", value: currentPassword, onChange: (event) => {
|
|
61
|
+
setCurrentPassword(event.target.value);
|
|
62
|
+
}, autoComplete: "current-password", className: inputClass })] }), _jsxs("label", { className: "block max-w-md", children: [_jsx("span", { className: "mb-1.5 block text-[12px] font-medium text-ink", children: "New password" }), _jsx("input", { type: "password", value: newPassword, onChange: (event) => {
|
|
63
|
+
setNewPassword(event.target.value);
|
|
64
|
+
}, autoComplete: "new-password", className: inputClass }), _jsxs("span", { className: "mt-1 block text-[11px] text-ink-faint", children: ["At least ", MINIMUM_PASSWORD_LENGTH, " characters."] })] }), _jsxs("label", { className: "block max-w-md", children: [_jsx("span", { className: "mb-1.5 block text-[12px] font-medium text-ink", children: "Confirm new password" }), _jsx("input", { type: "password", value: confirmation, onChange: (event) => {
|
|
65
|
+
setConfirmation(event.target.value);
|
|
66
|
+
}, autoComplete: "new-password", className: inputClass })] }), localError !== null && _jsx("p", { className: "text-[12px] text-danger", children: localError }), change.error !== null && (_jsx("div", { className: "max-w-md", children: _jsx(ErrorPanel, { error: change.error }) })), _jsx("button", { type: "submit", disabled: change.isPending, className: "rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: change.isPending ? 'Updating…' : changed ? 'Password updated' : 'Update password' })] }));
|
|
67
|
+
}
|
|
68
|
+
function SessionList() {
|
|
69
|
+
const { sessions, isLoading, error } = useAccountSessions();
|
|
70
|
+
const revoke = useRevokeAccountSession();
|
|
71
|
+
return (_jsxs("section", { children: [_jsx("h2", { className: "mb-3 text-[14px] font-semibold text-ink", children: "Sessions" }), error !== null && _jsx(ErrorPanel, { error: error }), error === null && isLoading && _jsx(LoadingPanel, { label: "Loading sessions\u2026" }), error === null && !isLoading && (_jsx("div", { className: "overflow-x-auto rounded-md border border-border", children: _jsxs("table", { className: "w-full text-left text-[13px]", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-border bg-surface text-[11px] font-semibold tracking-wide text-ink-muted uppercase", children: [_jsx("th", { className: "px-4 py-2.5", children: "Device" }), _jsx("th", { className: "px-4 py-2.5", children: "Location" }), _jsx("th", { className: "px-4 py-2.5", children: "Last active" }), _jsx("th", { className: "px-4 py-2.5 text-right", children: "Actions" })] }) }), _jsx("tbody", { children: sessions.map((session) => (_jsx(SessionRow, { session: session, onRevoke: () => {
|
|
72
|
+
revoke.run(session.id);
|
|
73
|
+
}, isRevoking: revoke.isPending }, session.id))) })] }) })), revoke.error !== null && (_jsx("div", { className: "mt-3 max-w-xl", children: _jsx(ErrorPanel, { error: revoke.error }) }))] }));
|
|
74
|
+
}
|
|
75
|
+
function SessionRow({ session, onRevoke, isRevoking, }) {
|
|
76
|
+
return (_jsxs("tr", { className: "border-b border-border last:border-0", children: [_jsxs("td", { className: "px-4 py-3", children: [_jsx("div", { className: "font-medium break-all text-ink", children: session.device ?? 'Unknown device' }), session.current && _jsx("span", { className: "text-[11px] font-medium text-success", children: "This device" })] }), _jsx("td", { className: "px-4 py-3 text-ink-muted", children: session.location ?? 'Unknown' }), _jsx("td", { className: "px-4 py-3 text-ink-muted", children: formatDateTime(session.lastActiveAt) }), _jsx("td", { className: "px-4 py-3 text-right", children: !session.current && (_jsx("button", { type: "button", onClick: onRevoke, disabled: isRevoking, className: "text-[12px] font-medium text-danger hover:underline disabled:opacity-50", children: "Revoke" })) })] }));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=SecurityPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityPage.js","sourceRoot":"","sources":["../../../src/pages/account/SecurityPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataPage.d.ts","sourceRoot":"","sources":["../../../src/pages/admin/DataPage.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAA0B,SAAS,EAAE,MAAM,OAAO,CAAA;AAkC9D,wBAAgB,QAAQ,IAAI,SAAS,CAyVpC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CONFLICT_MODE_LABELS, IMPORT_OBJECTS, IMPORT_SOURCES, MATCH_KEYS, OBJECT_COLUMNS, OBJECT_LABELS, SOURCE_LABELS, defaultMatchKeyId, findMatchKey, isImportJobSettled, requiredColumns, } from '@kelpie/schemas';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { saveCsv, useCommitImportJob, useCreateImportJob, useDeleteImportJob, useExportCsv, useImportJob, } from '../../api/resources/importJobs.js';
|
|
5
|
+
import { PageHeader } from '../../components/PageHeader.js';
|
|
6
|
+
const STEPS = [
|
|
7
|
+
{ id: 'source', label: 'Source' },
|
|
8
|
+
{ id: 'upload', label: 'Upload' },
|
|
9
|
+
{ id: 'map', label: 'Map' },
|
|
10
|
+
{ id: 'result', label: 'Dry-run' },
|
|
11
|
+
];
|
|
12
|
+
export function DataPage() {
|
|
13
|
+
const [exportObject, setExportObject] = useState('companies');
|
|
14
|
+
const [step, setStep] = useState('source');
|
|
15
|
+
const [source, setSource] = useState('custom');
|
|
16
|
+
const [object, setObject] = useState('companies');
|
|
17
|
+
const [file, setFile] = useState(null);
|
|
18
|
+
const [columnMap, setColumnMap] = useState({});
|
|
19
|
+
const [conflictMode, setConflictMode] = useState('skip');
|
|
20
|
+
const [matchKeyId, setMatchKeyId] = useState(() => defaultMatchKeyId('companies'));
|
|
21
|
+
const [jobId, setJobId] = useState(undefined);
|
|
22
|
+
const [problem, setProblem] = useState(null);
|
|
23
|
+
const exportCsv = useExportCsv();
|
|
24
|
+
const createJob = useCreateImportJob();
|
|
25
|
+
const commitJob = useCommitImportJob();
|
|
26
|
+
const deleteJob = useDeleteImportJob();
|
|
27
|
+
const watched = useImportJob(jobId);
|
|
28
|
+
const job = watched.record;
|
|
29
|
+
const failure = problem ?? messageOf(exportCsv.error ?? createJob.error ?? commitJob.error ?? watched.error);
|
|
30
|
+
/**
|
|
31
|
+
* Drops a job the wizard is walking away from, so the file stored against it
|
|
32
|
+
* goes too.
|
|
33
|
+
*
|
|
34
|
+
* Every path out of a job leads here, because each one is the same thing: a
|
|
35
|
+
* correction that uploads the file again, a step back, or starting over. None
|
|
36
|
+
* of them can reach the old job afterwards.
|
|
37
|
+
*
|
|
38
|
+
* Fire and forget, and `deleteJob.error` is deliberately left out of `failure`
|
|
39
|
+
* above. The caller has already got what they asked for, and tidying up is not
|
|
40
|
+
* theirs to fix. The one refusal the server makes is a job still committing,
|
|
41
|
+
* and that one settles on its own.
|
|
42
|
+
*/
|
|
43
|
+
function discardJob(id) {
|
|
44
|
+
if (id !== undefined) {
|
|
45
|
+
deleteJob.run(id);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Starts a step that talks to the API and drops its rejection.
|
|
50
|
+
*
|
|
51
|
+
* These steps use `runAsync` because they chain: a refused mapping must not
|
|
52
|
+
* advance the wizard, and only a rejection stops the lines after the await.
|
|
53
|
+
* The failure is already on screen through `failure` above, so the rejection
|
|
54
|
+
* has nothing left to say, and discarding it with a bare `void` would leave an
|
|
55
|
+
* unhandled rejection behind every refused upload.
|
|
56
|
+
*/
|
|
57
|
+
function runStep(work) {
|
|
58
|
+
void work.catch(() => undefined);
|
|
59
|
+
}
|
|
60
|
+
function resetWizard() {
|
|
61
|
+
discardJob(jobId);
|
|
62
|
+
setStep('source');
|
|
63
|
+
setFile(null);
|
|
64
|
+
setColumnMap({});
|
|
65
|
+
setConflictMode('skip');
|
|
66
|
+
setMatchKeyId(defaultMatchKeyId(object));
|
|
67
|
+
setJobId(undefined);
|
|
68
|
+
setProblem(null);
|
|
69
|
+
}
|
|
70
|
+
async function onDownload(target, template) {
|
|
71
|
+
setProblem(null);
|
|
72
|
+
saveCsv(await exportCsv.runAsync({ object: target, template }));
|
|
73
|
+
}
|
|
74
|
+
/** Uploads the file and reads back the headers, the derived map, and the forecast. */
|
|
75
|
+
async function runDryRun(next, map) {
|
|
76
|
+
const superseded = jobId;
|
|
77
|
+
const created = await createJob.runAsync({
|
|
78
|
+
file: next,
|
|
79
|
+
source,
|
|
80
|
+
object,
|
|
81
|
+
conflictMode,
|
|
82
|
+
matchKeyId,
|
|
83
|
+
...(map === undefined ? {} : { columnMap: map }),
|
|
84
|
+
});
|
|
85
|
+
setJobId(created.id);
|
|
86
|
+
// After the create rather than before it. A map the server rejects throws
|
|
87
|
+
// out of `runAsync`, and the caller is still reading the old job's headers
|
|
88
|
+
// in the mapping table it has to correct.
|
|
89
|
+
discardJob(superseded);
|
|
90
|
+
return created;
|
|
91
|
+
}
|
|
92
|
+
async function onFileChange(event) {
|
|
93
|
+
const chosen = event.target.files?.[0];
|
|
94
|
+
// Cleared so choosing the same file twice fires the event again, which is
|
|
95
|
+
// what a caller who fixed the file on disk expects.
|
|
96
|
+
event.target.value = '';
|
|
97
|
+
if (chosen === undefined) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
setProblem(null);
|
|
101
|
+
setFile(chosen);
|
|
102
|
+
const created = await runDryRun(chosen, undefined);
|
|
103
|
+
// The first upload takes the server's own reading of the file, which is what
|
|
104
|
+
// the mapping table is then built from.
|
|
105
|
+
setColumnMap(created.columnMap);
|
|
106
|
+
setMatchKeyId(created.matchKey);
|
|
107
|
+
setStep('map');
|
|
108
|
+
}
|
|
109
|
+
async function onRerun(event) {
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
if (file === null) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const matchKey = findMatchKey(object, matchKeyId);
|
|
115
|
+
const missing = matchKey === undefined
|
|
116
|
+
? []
|
|
117
|
+
: requiredColumns(object, matchKey).filter((column) => (columnMap[column] ?? null) === null);
|
|
118
|
+
if (missing.length > 0) {
|
|
119
|
+
setProblem(`Map these columns first: ${missing.join(', ')}`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
setProblem(null);
|
|
123
|
+
await runDryRun(file, columnMap);
|
|
124
|
+
setStep('result');
|
|
125
|
+
}
|
|
126
|
+
function onCommit() {
|
|
127
|
+
// The file goes back with the commit: the server kept its digest, not its
|
|
128
|
+
// bytes. This is the same `File` every dry run was run against.
|
|
129
|
+
if (jobId === undefined || file === null) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
setProblem(null);
|
|
133
|
+
commitJob.run({ id: jobId, file });
|
|
134
|
+
}
|
|
135
|
+
return (_jsxs("div", { className: "animate-slide-in space-y-10", children: [_jsx(PageHeader, { title: "Import & export", description: "CSV for People, Companies, Positions, and Deals. Custom files or HubSpot / Salesforce packs." }), failure === null ? null : (_jsx("p", { role: "alert", className: "text-[12px] font-medium text-danger", children: failure })), _jsxs("section", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-[15px] font-semibold text-ink", children: "Export" }), _jsx("p", { className: "mt-1 text-[13px] text-ink-muted", children: "Download this workspace as CSV. A Kelpie export reads straight back in with no column mapping." })] }), _jsxs("div", { className: "flex flex-wrap items-end gap-3", children: [_jsx(Field, { label: "Object", children: _jsx("select", { value: exportObject, onChange: (event) => setExportObject(event.target.value), className: "w-48 rounded-md border border-border bg-surface-raised px-3 py-2 text-[13px] outline-none focus:border-accent", children: IMPORT_OBJECTS.map((item) => (_jsx("option", { value: item, children: OBJECT_LABELS[item] }, item))) }) }), _jsx("button", { type: "button", onClick: () => runStep(onDownload(exportObject, false)), disabled: exportCsv.isPending, className: "rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: exportCsv.isPending ? 'Preparing…' : 'Download CSV' })] })] }), _jsxs("section", { className: "space-y-4 border-t border-border pt-8", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-[15px] font-semibold text-ink", children: "Import" }), _jsx("p", { className: "mt-1 text-[13px] text-ink-muted", children: "Custom CSV or HubSpot / Salesforce export packs. Every job is dry-run first; nothing is written until you commit." })] }), step === 'source' ? null : (_jsx("button", { type: "button", onClick: resetWizard, className: "shrink-0 text-[12px] font-medium text-ink-muted hover:text-ink", children: "Start over" }))] }), _jsx(StepIndicator, { step: step }), step === 'source' ? (_jsxs("form", { className: "space-y-4", onSubmit: (event) => {
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
setStep('upload');
|
|
138
|
+
}, children: [_jsx(Field, { label: "Source", children: _jsx("select", { value: source, onChange: (event) => setSource(event.target.value), className: "w-full max-w-md rounded-md border border-border bg-surface-raised px-3 py-2 text-[13px] outline-none focus:border-accent", children: IMPORT_SOURCES.map((item) => (_jsx("option", { value: item, children: SOURCE_LABELS[item] }, item))) }) }), _jsx(Field, { label: "Object", children: _jsx("select", { value: object, onChange: (event) => {
|
|
139
|
+
const next = event.target.value;
|
|
140
|
+
setObject(next);
|
|
141
|
+
setMatchKeyId(defaultMatchKeyId(next));
|
|
142
|
+
}, className: "w-full max-w-md rounded-md border border-border bg-surface-raised px-3 py-2 text-[13px] outline-none focus:border-accent", children: IMPORT_OBJECTS.map((item) => (_jsx("option", { value: item, children: OBJECT_LABELS[item] }, item))) }) }), _jsxs("div", { className: "rounded-md border border-border px-4 py-3", children: [_jsx("div", { className: "text-[13px] font-medium text-ink", children: "Need a blank file?" }), _jsxs("p", { className: "mt-0.5 text-[12px] text-ink-muted", children: ["Download a Kelpie CSV template for ", OBJECT_LABELS[object].toLowerCase(), ", fill it in, then continue."] }), _jsx("button", { type: "button", onClick: () => runStep(onDownload(object, true)), className: "mt-3 rounded-md border border-border bg-surface px-3.5 py-2 text-[12px] font-semibold text-ink transition hover:border-accent", children: "Download template" })] }), _jsx("p", { className: "text-[12px] text-ink-muted", children: "Import order for linked data: Companies \u2192 People \u2192 Positions \u2192 Deals." }), _jsx("button", { type: "submit", className: "rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover", children: "Continue" })] })) : null, step === 'upload' ? (_jsxs("div", { className: "space-y-4", children: [_jsxs("p", { className: "text-[13px] text-ink-muted", children: [SOURCE_LABELS[source], " \u2192 ", OBJECT_LABELS[object]] }), _jsxs("label", { className: "flex cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed border-border bg-surface-raised px-6 py-10 transition hover:border-accent", children: [_jsx("span", { className: "text-[13px] font-medium text-ink", children: createJob.isPending ? 'Reading the file…' : 'Drop a CSV here or click to browse' }), _jsx("span", { className: "mt-1 text-[12px] text-ink-muted", children: "UTF-8 CSV \u00B7 max 10 MB \u00B7 max 10,000 rows" }), _jsx("input", { type: "file", accept: ".csv,text/csv", className: "sr-only", disabled: createJob.isPending, onChange: (event) => runStep(onFileChange(event)) })] }), _jsx("button", { type: "button", onClick: () => setStep('source'), className: "rounded-md px-3 py-2 text-[12px] font-medium text-ink-muted hover:text-ink", children: "Back" })] })) : null, step === 'map' && job !== undefined ? (_jsx(MappingForm, { job: job, object: object, columnMap: columnMap, conflictMode: conflictMode, matchKeyId: matchKeyId, isPending: createJob.isPending, onColumnMapChange: setColumnMap, onConflictModeChange: setConflictMode, onMatchKeyChange: setMatchKeyId, onSubmit: (event) => runStep(onRerun(event)), onBack: () => {
|
|
143
|
+
discardJob(jobId);
|
|
144
|
+
setFile(null);
|
|
145
|
+
setJobId(undefined);
|
|
146
|
+
setStep('upload');
|
|
147
|
+
} })) : null, step === 'result' && job !== undefined ? (_jsx(ResultPanel, { job: job, object: object, isCommitting: commitJob.isPending, onCommit: onCommit, onBack: () => setStep('map') })) : null] })] }));
|
|
148
|
+
}
|
|
149
|
+
function MappingForm(props) {
|
|
150
|
+
const matchKey = findMatchKey(props.object, props.matchKeyId);
|
|
151
|
+
const keyColumns = new Set(matchKey?.columns ?? []);
|
|
152
|
+
return (_jsxs("form", { className: "space-y-4", onSubmit: props.onSubmit, children: [_jsxs("p", { className: "text-[13px] text-ink-muted", children: ["Mapping ", _jsx("span", { className: "font-medium text-ink", children: props.job.fileName ?? 'the file' }), " (", props.job.counts.total, " rows). Match Kelpie fields to CSV columns."] }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-2", children: [_jsx(Field, { label: "On match", children: _jsx("select", { value: props.conflictMode, onChange: (event) => props.onConflictModeChange(event.target.value), className: "w-full rounded-md border border-border bg-surface-raised px-3 py-2 text-[13px] outline-none focus:border-accent", children: Object.entries(CONFLICT_MODE_LABELS).map(([mode, label]) => (_jsx("option", { value: mode, children: label }, mode))) }) }), _jsx(Field, { label: "Key column", children: _jsx("select", { value: props.matchKeyId, onChange: (event) => props.onMatchKeyChange(event.target.value), className: "w-full rounded-md border border-border bg-surface-raised px-3 py-2 text-[13px] outline-none focus:border-accent", children: MATCH_KEYS[props.object].map((key) => (_jsx("option", { value: key.id, children: key.label }, key.id))) }) })] }), _jsxs("p", { className: "text-[12px] text-ink-muted", children: [props.conflictMode === 'update'
|
|
153
|
+
? 'Rows matching an existing record on the key column overwrite the fields you map below. A blank cell changes nothing.'
|
|
154
|
+
: 'Rows matching an existing record on the key column are skipped.', ' ', "Key columns must be mapped."] }), _jsx("div", { className: "overflow-hidden rounded-md border border-border", children: _jsxs("table", { className: "w-full text-left text-[13px]", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-border bg-surface text-[11px] font-semibold tracking-wide text-ink-muted uppercase", children: [_jsx("th", { className: "px-4 py-2.5", children: "Kelpie field" }), _jsx("th", { className: "px-4 py-2.5", children: "CSV column" })] }) }), _jsx("tbody", { children: OBJECT_COLUMNS[props.object].map((column) => {
|
|
155
|
+
const isKey = keyColumns.has(column.key);
|
|
156
|
+
return (_jsxs("tr", { className: "border-b border-border last:border-0", children: [_jsxs("td", { className: "px-4 py-2.5", children: [_jsx("span", { className: "font-medium", children: column.label }), _jsx("span", { className: "ml-2 font-mono text-[11px] text-ink-faint", children: column.key }), column.required || isKey ? (_jsx("span", { className: "ml-2 text-[11px] text-danger", children: isKey ? 'key' : 'required' })) : null] }), _jsx("td", { className: "px-4 py-2.5", children: _jsxs("select", { value: props.columnMap[column.key] ?? '', onChange: (event) => props.onColumnMapChange({
|
|
157
|
+
...props.columnMap,
|
|
158
|
+
[column.key]: event.target.value === '' ? null : event.target.value,
|
|
159
|
+
}), className: "w-full max-w-xs rounded-md border border-border bg-surface px-2 py-1.5 text-[13px] outline-none focus:border-accent", children: [_jsx("option", { value: "", children: "\u2014 ignore \u2014" }), props.job.sourceHeaders.map((header) => (_jsx("option", { value: header, children: header }, header)))] }) })] }, column.key));
|
|
160
|
+
}) })] }) }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx("button", { type: "submit", disabled: props.isPending, className: "rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:opacity-50", children: props.isPending ? 'Running…' : 'Run dry-run' }), _jsx("button", { type: "button", onClick: props.onBack, className: "rounded-md px-3 py-2 text-[12px] font-medium text-ink-muted hover:text-ink", children: "Back" })] })] }));
|
|
161
|
+
}
|
|
162
|
+
function ResultPanel({ job, object, isCommitting, onCommit, onBack }) {
|
|
163
|
+
const working = !isImportJobSettled(job.status);
|
|
164
|
+
const done = job.status === 'completed';
|
|
165
|
+
const nothingToDo = job.counts.create === 0 && job.counts.update === 0;
|
|
166
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsxs("p", { className: "text-[13px] text-ink-muted", children: ["Job ", _jsx("span", { className: "font-mono text-[12px] text-ink", children: job.id }), " \u00B7 status ", job.status, working ? ' · working…' : null] }), _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-5", children: [_jsx(Stat, { label: "Total", value: job.counts.total }), _jsx(Stat, { label: "Create", value: job.counts.create }), _jsx(Stat, { label: "Update", value: job.counts.update }), _jsx(Stat, { label: "Skip", value: job.counts.skip }), _jsx(Stat, { label: "Error", value: job.counts.error, danger: true })] }), _jsxs("p", { className: "text-[12px] text-ink-muted", children: ["On match: ", CONFLICT_MODE_LABELS[job.conflictMode].toLowerCase(), ". Key column:", ' ', _jsx("span", { className: "font-mono text-[11px] text-ink", children: findMatchKey(object, job.matchKey)?.label ?? job.matchKey })] }), job.preview.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-[13px] font-semibold text-ink", children: "Mapping preview" }), _jsxs("p", { className: "mt-0.5 text-[12px] text-ink-muted", children: ["The first ", job.preview.length, " row", job.preview.length === 1 ? '' : 's', " as Kelpie read them. Go back to mapping if a column looks wrong."] })] }), _jsx(PreviewTable, { object: object, rows: job.preview })] })) : null, job.errors.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "overflow-hidden rounded-md border border-border", children: _jsxs("table", { className: "w-full text-left text-[13px]", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-border bg-surface text-[11px] font-semibold tracking-wide text-ink-muted uppercase", children: [_jsx("th", { className: "px-4 py-2.5", children: "Row" }), _jsx("th", { className: "px-4 py-2.5", children: "Field" }), _jsx("th", { className: "px-4 py-2.5", children: "Message" })] }) }), _jsx("tbody", { children: job.errors.map((error, index) => (_jsxs("tr", { className: "border-b border-border last:border-0", children: [_jsx("td", { className: "px-4 py-2.5 font-mono text-[12px]", children: error.row }), _jsx("td", { className: "px-4 py-2.5 font-mono text-[12px]", children: error.field }), _jsx("td", { className: "px-4 py-2.5 text-ink-muted", children: error.message })] }, `${String(error.row)}-${error.field}-${String(index)}`))) })] }) }), job.counts.error > job.errors.length ? (_jsxs("p", { className: "text-[12px] text-ink-muted", children: ["Showing ", job.errors.length, " of ", job.counts.error, " failing rows."] })) : null] })) : (_jsx("p", { className: "text-[13px] text-ink-muted", children: "No row errors." })), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx("button", { type: "button", onClick: onCommit, disabled: done || working || isCommitting || nothingToDo, className: "rounded-md bg-accent px-3.5 py-2 text-[12px] font-semibold text-accent-fg transition hover:bg-accent-hover disabled:cursor-not-allowed disabled:opacity-50", children: done ? 'Committed' : isCommitting || working ? 'Working…' : 'Commit import' }), _jsx("button", { type: "button", onClick: onBack, className: "rounded-md px-3 py-2 text-[12px] font-medium text-ink-muted hover:text-ink", children: "Back to mapping" })] })] }));
|
|
167
|
+
}
|
|
168
|
+
function PreviewTable({ object, rows, }) {
|
|
169
|
+
const keys = OBJECT_COLUMNS[object]
|
|
170
|
+
.map((column) => column.key)
|
|
171
|
+
.filter((key) => rows.some((row) => key in row.values));
|
|
172
|
+
return (_jsx("div", { className: "overflow-x-auto rounded-md border border-border", children: _jsxs("table", { className: "w-full min-w-[36rem] text-left text-[13px]", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-border bg-surface text-[11px] font-semibold tracking-wide text-ink-muted uppercase", children: [_jsx("th", { className: "px-3 py-2.5", children: "Row" }), _jsx("th", { className: "px-3 py-2.5", children: "Action" }), keys.map((key) => (_jsx("th", { className: "px-3 py-2.5 font-mono normal-case", children: key }, key)))] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { className: "border-b border-border last:border-0", children: [_jsx("td", { className: "px-3 py-2.5 font-mono text-[12px] text-ink-muted", children: row.row }), _jsx("td", { className: "px-3 py-2.5", children: _jsx(ActionChip, { action: row.action }) }), keys.map((key) => (_jsx("td", { className: "max-w-[12rem] truncate px-3 py-2.5 text-ink", title: row.values[key] ?? '', children: row.values[key] === undefined || row.values[key] === '' ? (_jsx("span", { className: "text-ink-faint", children: "\u2014" })) : (row.values[key]) }, key)))] }, row.row))) })] }) }));
|
|
173
|
+
}
|
|
174
|
+
const ACTION_STYLES = {
|
|
175
|
+
pending: 'bg-surface text-ink-faint',
|
|
176
|
+
create: 'bg-accent/15 text-accent-hover',
|
|
177
|
+
update: 'bg-warning-soft text-warning',
|
|
178
|
+
skip: 'bg-surface text-ink-muted',
|
|
179
|
+
error: 'bg-danger-soft text-danger',
|
|
180
|
+
};
|
|
181
|
+
function ActionChip({ action }) {
|
|
182
|
+
return (_jsx("span", { className: [
|
|
183
|
+
'inline-block rounded px-1.5 py-0.5 text-[11px] font-semibold uppercase',
|
|
184
|
+
ACTION_STYLES[action],
|
|
185
|
+
].join(' '), children: action }));
|
|
186
|
+
}
|
|
187
|
+
function StepIndicator({ step }) {
|
|
188
|
+
const active = STEPS.findIndex((item) => item.id === step);
|
|
189
|
+
return (_jsx("ol", { className: "flex flex-wrap gap-2 text-[12px]", children: STEPS.map((item, index) => (_jsxs("li", { className: [
|
|
190
|
+
'rounded-md px-2.5 py-1 font-medium',
|
|
191
|
+
index === active
|
|
192
|
+
? 'bg-accent/15 text-accent-hover'
|
|
193
|
+
: index < active
|
|
194
|
+
? 'text-ink'
|
|
195
|
+
: 'text-ink-faint',
|
|
196
|
+
].join(' '), children: [index + 1, ". ", item.label] }, item.id))) }));
|
|
197
|
+
}
|
|
198
|
+
function Stat({ label, value, danger, }) {
|
|
199
|
+
return (_jsxs("div", { className: "rounded-md border border-border px-3 py-2.5", children: [_jsx("div", { className: "text-[11px] font-semibold tracking-wide text-ink-muted uppercase", children: label }), _jsx("div", { className: [
|
|
200
|
+
'mt-1 text-[20px] font-semibold tabular-nums',
|
|
201
|
+
danger === true && value > 0 ? 'text-danger' : 'text-ink',
|
|
202
|
+
].join(' '), children: value })] }));
|
|
203
|
+
}
|
|
204
|
+
function Field({ label, children, }) {
|
|
205
|
+
return (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-[12px] font-medium text-ink", children: label }), children] }));
|
|
206
|
+
}
|
|
207
|
+
function messageOf(error) {
|
|
208
|
+
return error === null || error === undefined ? null : error.message;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=DataPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataPage.js","sourceRoot":"","sources":["../../../src/pages/admin/DataPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpPage.d.ts","sourceRoot":"","sources":["../../../src/pages/admin/McpPage.tsx"],"names":[],"mappings":"AAkDA,wBAAgB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA0E3C"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AGENT_RUN_STATUS_LABELS } from '@kelpie/schemas';
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
import { Link } from 'react-router';
|
|
5
|
+
import { useAgentRuns, useAgents, useAllAgentTasks, useCreateAgent, useDeleteAgent, } from '../../api/resources/agentTasks.js';
|
|
6
|
+
import { useMcpTools } from '../../api/resources/mcpTools.js';
|
|
7
|
+
import { PageHeader } from '../../components/PageHeader.js';
|
|
8
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
|
|
9
|
+
import { CopyButton } from '../../components/CopyButton.js';
|
|
10
|
+
import { formatRelativeTime } from '../../lib/dates.js';
|
|
11
|
+
/**
|
|
12
|
+
* How an agent connects to this workspace.
|
|
13
|
+
*
|
|
14
|
+
* Everything on the page is derived rather than written down. The endpoint comes
|
|
15
|
+
* from the origin the browser reached the app on, the same way a form's embed URL
|
|
16
|
+
* does, so it is right for a self-hosted install on any hostname. The tool list
|
|
17
|
+
* comes from `/v1/mcp/tools`, which reads the registry the endpoint itself
|
|
18
|
+
* dispatches against: a module that adds a resource shows up here without anyone
|
|
19
|
+
* editing this file.
|
|
20
|
+
*
|
|
21
|
+
* Registered agents and their run log live here too, under the connection
|
|
22
|
+
* details, where the mockup put them: an agent is something you connect, and
|
|
23
|
+
* this is the connections page.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Matches a tool on its name or its description, so "csv" finds the import and
|
|
27
|
+
* export tools and "pinned" finds the note list that filters on it.
|
|
28
|
+
*/
|
|
29
|
+
function matches(tool, term) {
|
|
30
|
+
const needle = term.trim().toLowerCase();
|
|
31
|
+
if (needle.length === 0) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return (tool.name.toLowerCase().includes(needle) ||
|
|
35
|
+
tool.description.toLowerCase().includes(needle));
|
|
36
|
+
}
|
|
37
|
+
export function McpPage() {
|
|
38
|
+
const endpoint = new URL('/mcp', window.location.origin).toString();
|
|
39
|
+
const config = `{
|
|
40
|
+
"mcpServers": {
|
|
41
|
+
"kelpie": {
|
|
42
|
+
"url": "${endpoint}",
|
|
43
|
+
"headers": {
|
|
44
|
+
"Authorization": "Bearer kp_live_…"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}`;
|
|
49
|
+
return (_jsxs("div", { className: "animate-slide-in mx-auto max-w-4xl space-y-6", children: [_jsx(PageHeader, { title: "MCP", description: "Connect agents to this workspace over Streamable HTTP." }), _jsxs("section", { className: "rounded-md border border-border p-5", children: [_jsx("h2", { className: "text-[15px] font-semibold text-ink", children: "How agents use Kelpie" }), _jsx("p", { className: "mt-2 max-w-2xl text-[13px] leading-relaxed text-ink-muted", children: "Kelpie is a CRM and a company brain. Every REST operation is also an MCP tool over Streamable HTTP, so an agent reads and writes the same records the app does, through the same API. Point Claude, Cursor, or any MCP client at this workspace. There is no bundled AI: bring your own agent." }), _jsxs("ul", { className: "mt-4 space-y-2 text-[13px] text-ink", children: [_jsxs("li", { className: "flex gap-2", children: [_jsx("span", { className: "text-accent", children: "\u2192" }), "An API key is bound to one workspace, so a client sees that workspace and no other."] }), _jsxs("li", { className: "flex gap-2", children: [_jsx("span", { className: "text-accent", children: "\u2192" }), "A tool refuses exactly what the endpoint behind it refuses, with the same message."] }), _jsxs("li", { className: "flex gap-2", children: [_jsx("span", { className: "text-accent", children: "\u2192" }), "Signing in with a browser session does not work here. The endpoint takes bearer keys only."] })] })] }), _jsxs("section", { className: "rounded-md border border-border p-5", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("h2", { className: "text-[13px] font-semibold text-ink", children: "Streamable HTTP endpoint" }), _jsx(CopyButton, { value: endpoint, label: "Copy the endpoint URL" })] }), _jsx("code", { className: "mt-3 block rounded-md border border-border bg-surface px-3 py-2.5 font-mono text-[13px] break-all text-ink", children: endpoint })] }), _jsxs("section", { className: "rounded-md border border-border p-5", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("h2", { className: "text-[13px] font-semibold text-ink", children: "Claude / Cursor config" }), _jsx(CopyButton, { value: config, label: "Copy the client config" })] }), _jsxs("p", { className: "mt-1 text-[12px] text-ink-muted", children: ["Paste into your MCP client config, and replace the bearer token with a workspace key from", ' ', _jsx(Link, { to: "/admin/workspace", className: "text-accent hover:underline", children: "workspace settings" }), "."] }), _jsx("pre", { className: "bg-code-bg text-code-fg mt-3 overflow-x-auto rounded-md border border-border p-4 font-mono text-[12px] leading-relaxed", children: config })] }), _jsx(RegisteredAgents, {}), _jsx(RecentRuns, {}), _jsx(ToolCatalog, {})] }));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Bring-your-own agents that Run dispatches to. Any member reads this list —
|
|
53
|
+
* the Run dialog on every record page is built from it — and the API holds
|
|
54
|
+
* writes to admins, so a member's Add answers `403` and the form shows it.
|
|
55
|
+
*/
|
|
56
|
+
function RegisteredAgents() {
|
|
57
|
+
const { records, isLoading, error } = useAgents();
|
|
58
|
+
const createAgent = useCreateAgent();
|
|
59
|
+
const deleteAgent = useDeleteAgent();
|
|
60
|
+
const [adding, setAdding] = useState(false);
|
|
61
|
+
const [name, setName] = useState('');
|
|
62
|
+
const [endpoint, setEndpoint] = useState('');
|
|
63
|
+
const [authHeader, setAuthHeader] = useState('');
|
|
64
|
+
function submit(event) {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
createAgent
|
|
67
|
+
.runAsync({
|
|
68
|
+
name,
|
|
69
|
+
endpoint,
|
|
70
|
+
...(authHeader.trim().length === 0 ? {} : { authHeader }),
|
|
71
|
+
})
|
|
72
|
+
.then(() => {
|
|
73
|
+
setAdding(false);
|
|
74
|
+
setName('');
|
|
75
|
+
setEndpoint('');
|
|
76
|
+
setAuthHeader('');
|
|
77
|
+
})
|
|
78
|
+
.catch(() => {
|
|
79
|
+
// The form stays open and renders `createAgent.error`.
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return (_jsxs("section", { className: "rounded-md border border-border p-5", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("h2", { className: "text-[13px] font-semibold text-ink", children: "Registered agents" }), _jsx("button", { type: "button", onClick: () => {
|
|
83
|
+
setAdding((open) => !open);
|
|
84
|
+
}, className: "rounded-md border border-border px-2.5 py-1 text-[12px] font-medium text-ink transition hover:border-accent hover:text-accent", children: adding ? 'Cancel' : 'Add agent' })] }), _jsx("p", { className: "mt-1 max-w-2xl text-[12px] text-ink-muted", children: "Run on any record dispatches the resolved task to one of these endpoints as JSON. The agent still reads and writes through the API above. The auth header is stored encrypted and never shown again." }), adding && (_jsxs("form", { onSubmit: submit, className: "mt-4 space-y-2 rounded-md border border-border p-3", children: [_jsxs("label", { className: "block text-[12px] text-ink-muted", children: ["Name", _jsx("input", { value: name, onChange: (event) => {
|
|
85
|
+
setName(event.target.value);
|
|
86
|
+
}, required: true, placeholder: "Local Claude", className: "mt-1 w-full rounded-md border border-border bg-surface px-2.5 py-1.5 text-[12px] text-ink outline-none focus:border-accent" })] }), _jsxs("label", { className: "block text-[12px] text-ink-muted", children: ["Endpoint URL", _jsx("input", { value: endpoint, onChange: (event) => {
|
|
87
|
+
setEndpoint(event.target.value);
|
|
88
|
+
}, required: true, placeholder: "https://agents.example.com/kelpie/run", className: "mt-1 w-full rounded-md border border-border bg-surface px-2.5 py-1.5 font-mono text-[12px] text-ink outline-none focus:border-accent" })] }), _jsxs("label", { className: "block text-[12px] text-ink-muted", children: ["Auth header (optional, sent as Authorization)", _jsx("input", { value: authHeader, onChange: (event) => {
|
|
89
|
+
setAuthHeader(event.target.value);
|
|
90
|
+
}, placeholder: "Bearer \u2026", className: "mt-1 w-full rounded-md border border-border bg-surface px-2.5 py-1.5 font-mono text-[12px] text-ink outline-none focus:border-accent" })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("button", { type: "submit", disabled: createAgent.isPending, className: "rounded-md bg-accent px-3 py-1.5 text-[12px] font-semibold text-accent-fg hover:bg-accent-hover disabled:opacity-50", children: "Register agent" }), createAgent.error !== null && (_jsx("span", { className: "text-[12px] text-danger", children: createAgent.error.message }))] })] })), error !== null && _jsx("div", { className: "mt-4", children: _jsx(ErrorPanel, { error: error }) }), isLoading && _jsx(LoadingPanel, { label: "Loading agents\u2026" }), !isLoading && error === null && records.length === 0 && (_jsx("p", { className: "mt-4 text-[12px] text-ink-faint", children: "No agents registered. Copy prompt works without one; Run needs somewhere to send the task." })), records.length > 0 && (_jsx("ul", { className: "mt-4 divide-y divide-border rounded-md border border-border", children: records.map((agent) => (_jsxs("li", { className: "flex flex-wrap items-center justify-between gap-3 px-3 py-2.5", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-[13px] font-medium text-ink", children: agent.name }), _jsx("code", { className: "font-mono text-[11px] break-all text-ink-muted", children: agent.endpoint })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-3 text-[11px] text-ink-faint", children: [agent.hasAuthHeader && _jsx("span", { children: "Auth header set" }), _jsx("span", { children: agent.lastRunAt === null
|
|
91
|
+
? 'Never run'
|
|
92
|
+
: `Last run ${formatRelativeTime(agent.lastRunAt)}` }), _jsx("button", { type: "button", onClick: () => {
|
|
93
|
+
deleteAgent.run(agent.id);
|
|
94
|
+
}, className: "font-medium text-danger hover:underline", children: "Remove" })] })] }, agent.id))) })), deleteAgent.error !== null && (_jsx("p", { className: "mt-2 text-[12px] text-danger", children: deleteAgent.error.message }))] }));
|
|
95
|
+
}
|
|
96
|
+
const RUN_LOG_ROWS = 8;
|
|
97
|
+
/** The newest dispatches, labelled from the catalog the tasks came from. */
|
|
98
|
+
function RecentRuns() {
|
|
99
|
+
const { records: runs, isLoading, error } = useAgentRuns();
|
|
100
|
+
const catalog = useAllAgentTasks();
|
|
101
|
+
const agents = useAgents();
|
|
102
|
+
const taskLabels = useMemo(() => new Map(catalog.records.map((task) => [task.id, task.label])), [catalog.records]);
|
|
103
|
+
const agentNames = useMemo(() => new Map(agents.records.map((agent) => [agent.id, agent.name])), [agents.records]);
|
|
104
|
+
function describeRun(run) {
|
|
105
|
+
const agentName = agentNames.get(run.agentId) ?? 'a removed agent';
|
|
106
|
+
return `${run.targetType}/${run.targetId} → ${agentName}`;
|
|
107
|
+
}
|
|
108
|
+
return (_jsxs("section", { className: "rounded-md border border-border p-5", children: [_jsx("h2", { className: "text-[13px] font-semibold text-ink", children: "Recent runs" }), _jsx("p", { className: "mt-1 text-[12px] text-ink-muted", children: "Each run records the dispatch: queued, then succeeded or failed with the reason. What the agent did afterwards is on the records themselves." }), error !== null && _jsx("div", { className: "mt-4", children: _jsx(ErrorPanel, { error: error }) }), isLoading && _jsx(LoadingPanel, { label: "Loading runs\u2026" }), !isLoading && error === null && runs.length === 0 && (_jsx("p", { className: "mt-4 text-[12px] text-ink-faint", children: "No runs yet. Run an agent task from any record page." })), runs.length > 0 && (_jsx("ul", { className: "mt-4 divide-y divide-border rounded-md border border-border", children: runs.slice(0, RUN_LOG_ROWS).map((run) => (_jsxs("li", { className: "flex flex-wrap items-center justify-between gap-3 px-3 py-2.5", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-[13px] font-medium text-ink", children: taskLabels.get(run.taskId) ?? run.taskId }), _jsx("div", { className: "text-[11px] text-ink-muted", children: describeRun(run) }), run.failureReason !== null && (_jsx("div", { className: "text-[11px] text-danger", children: run.failureReason }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-3 text-[11px]", children: [_jsx("span", { className: run.status === 'failed' ? 'font-medium text-danger' : 'text-ink-muted', children: AGENT_RUN_STATUS_LABELS[run.status] }), _jsx("span", { className: "text-ink-faint", children: formatRelativeTime(run.updatedAt) })] })] }, run.id))) }))] }));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* What this deployment actually registered, read from the endpoint's own registry.
|
|
112
|
+
*
|
|
113
|
+
* A flat list rather than a grouped one. Tool names are resource-then-verb, so
|
|
114
|
+
* sorting by name already puts a resource's five together, and every rule for
|
|
115
|
+
* grouping them turned out to be a lexical guess that read `webhooks_rotate_secret`
|
|
116
|
+
* as a resource called `webhooks_rotate`.
|
|
117
|
+
*/
|
|
118
|
+
function ToolCatalog() {
|
|
119
|
+
const { records, isLoading, error } = useMcpTools();
|
|
120
|
+
const [term, setTerm] = useState('');
|
|
121
|
+
const shown = useMemo(() => [...records].filter((tool) => matches(tool, term)).sort((left, right) => left.name.localeCompare(right.name)), [records, term]);
|
|
122
|
+
return (_jsxs("section", { className: "rounded-md border border-border p-5", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("h2", { className: "text-[13px] font-semibold text-ink", children: "Tools" }), records.length > 0 && (_jsx("input", { type: "search", value: term, onChange: (event) => {
|
|
123
|
+
setTerm(event.target.value);
|
|
124
|
+
}, placeholder: "Filter tools", "aria-label": "Filter tools", className: "rounded-md border border-border bg-surface px-2.5 py-1 text-[12px] text-ink outline-none focus:border-border-strong" }))] }), _jsx("p", { className: "mt-1 max-w-2xl text-[12px] text-ink-muted", children: isLoading
|
|
125
|
+
? 'Reading what this deployment exposes.'
|
|
126
|
+
: `${String(records.length)} tools, mirroring the REST API one for one. Arguments and results are snake_case JSON.` }), error !== null && _jsx("div", { className: "mt-4", children: _jsx(ErrorPanel, { error: error }) }), isLoading && _jsx(LoadingPanel, { label: "Loading tools\u2026" }), records.length > 0 && shown.length === 0 && (_jsxs("p", { className: "mt-4 text-[12px] text-ink-faint", children: ["No tool matches \u201C", term, "\u201D."] })), shown.length > 0 && (_jsx("ul", { className: "mt-4 divide-y divide-border rounded-md border border-border", children: shown.map((tool) => (_jsxs("li", { className: "px-3 py-2.5", children: [_jsx("code", { className: "font-mono text-[12px] text-accent", children: tool.name }), _jsx("p", { className: "mt-0.5 text-[12px] leading-relaxed text-ink-muted", children: tool.description })] }, tool.name))) }))] }));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=McpPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpPage.js","sourceRoot":"","sources":["../../../src/pages/admin/McpPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModulesPage.d.ts","sourceRoot":"","sources":["../../../src/pages/admin/ModulesPage.tsx"],"names":[],"mappings":"AA2CA,wBAAgB,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA6B/C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useSetModuleEnabled, useModuleSettings } from '../../api/resources/moduleSettings.js';
|
|
3
|
+
import { useSession } from '../../api/resources/session.js';
|
|
4
|
+
import { PageHeader } from '../../components/PageHeader.js';
|
|
5
|
+
import { ErrorPanel, LoadingPanel } from '../../components/QueryState.js';
|
|
6
|
+
/**
|
|
7
|
+
* Turns optional modules on or off for this workspace.
|
|
8
|
+
*
|
|
9
|
+
* A module a deploy-time config file locks (`modules.md`) shows as disabled
|
|
10
|
+
* with a note rather than being left out of the list: a workspace admin should
|
|
11
|
+
* see that the choice exists and is not theirs, not wonder why a module they
|
|
12
|
+
* expect is simply missing from the page.
|
|
13
|
+
*
|
|
14
|
+
* Known ids get a friendlier label; an id this page has never heard of still
|
|
15
|
+
* renders, title-cased, because the module catalog is meant to grow without
|
|
16
|
+
* this file changing every time it does.
|
|
17
|
+
*/
|
|
18
|
+
const MODULE_LABELS = {
|
|
19
|
+
positions: 'Positions',
|
|
20
|
+
deals: 'Deals',
|
|
21
|
+
opportunities: 'Opportunities',
|
|
22
|
+
partnerships: 'Partnerships',
|
|
23
|
+
raises: 'Fundraising',
|
|
24
|
+
hiring: 'Hiring',
|
|
25
|
+
handbook: 'Handbook',
|
|
26
|
+
forms: 'Forms',
|
|
27
|
+
'import-export': 'Import / export',
|
|
28
|
+
'agent-tasks': 'Agent tasks',
|
|
29
|
+
webhooks: 'Webhooks',
|
|
30
|
+
};
|
|
31
|
+
function labelFor(moduleId) {
|
|
32
|
+
return (MODULE_LABELS[moduleId] ??
|
|
33
|
+
moduleId
|
|
34
|
+
.split('-')
|
|
35
|
+
.map((word) => (word.length === 0 ? word : word[0]?.toUpperCase() + word.slice(1)))
|
|
36
|
+
.join(' '));
|
|
37
|
+
}
|
|
38
|
+
export function ModulesPage() {
|
|
39
|
+
const { session } = useSession();
|
|
40
|
+
const { settings, isLoading, error } = useModuleSettings();
|
|
41
|
+
const isAdmin = session?.role === 'owner' || session?.role === 'admin';
|
|
42
|
+
return (_jsxs("div", { className: "animate-slide-in mx-auto max-w-4xl space-y-6", children: [_jsx(PageHeader, { title: "Modules", description: "Turn optional parts of Kelpie on or off for this workspace." }), error !== null && _jsx(ErrorPanel, { error: error }), isLoading ? (_jsx(LoadingPanel, { label: "Loading modules\u2026" })) : settings.length === 0 ? (_jsx("p", { className: "text-[13px] text-ink-muted", children: "Nothing here yet." })) : (_jsx("ul", { className: "divide-y divide-border rounded-md border border-border", children: settings
|
|
43
|
+
.toSorted((a, b) => labelFor(a.moduleId).localeCompare(labelFor(b.moduleId)))
|
|
44
|
+
.map((setting) => (_jsx(ModuleRow, { setting: setting, canEdit: isAdmin }, setting.moduleId))) }))] }));
|
|
45
|
+
}
|
|
46
|
+
function ModuleRow({ setting, canEdit, }) {
|
|
47
|
+
const setEnabled = useSetModuleEnabled();
|
|
48
|
+
const disabled = !canEdit || setting.locked || setEnabled.isPending;
|
|
49
|
+
return (_jsx("li", { className: "flex items-start justify-between gap-4 px-4 py-3", children: _jsxs("div", { children: [_jsxs("label", { className: "flex cursor-pointer items-center gap-2.5", children: [_jsx("input", { type: "checkbox", checked: setting.enabled, disabled: disabled, onChange: (event) => {
|
|
50
|
+
setEnabled.run({ moduleId: setting.moduleId, enabled: event.target.checked });
|
|
51
|
+
}, className: "disabled:opacity-50" }), _jsx("span", { className: "text-[13px] font-medium text-ink", children: labelFor(setting.moduleId) })] }), setting.locked && (_jsx("p", { className: "mt-1 pl-6 text-[11px] text-ink-faint", children: "Locked by this deployment's configuration." })), setEnabled.error !== null && (_jsx("div", { className: "mt-2 pl-6", children: _jsx(ErrorPanel, { error: setEnabled.error }) }))] }) }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ModulesPage.js.map
|