@manta-eu/react 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action-plan-changes/ActionPlanChangesTable.js +1 -1
- package/dist/action-plan-changes/build-change-tree.js.map +1 -1
- package/dist/ad-preview/AdPluralDisplay.js +1 -1
- package/dist/ad-preview/GoogleAdGroupAdSingularDisplay.js +1 -3
- package/dist/ad-preview/GoogleAdGroupAdSingularDisplay.js.map +1 -1
- package/dist/ad-preview/MetaAdPreview.js +1 -1
- package/dist/ad-preview/meta-ad-copy.d.ts.map +1 -1
- package/dist/ad-preview/meta-ad-model.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ad-preview/business-avatar.d.ts.map +1 -1
- package/dist/components/ad-preview/business-identity.d.ts.map +1 -1
- package/dist/components/ad-preview/business-info.d.ts.map +1 -1
- package/dist/components/ad-preview/facebook/carousel.d.ts.map +1 -1
- package/dist/components/ad-preview/facebook/constants.d.ts.map +1 -1
- package/dist/components/ad-preview/facebook/header.js +1 -1
- package/dist/components/ad-preview/facebook/instream-reels.d.ts.map +1 -1
- package/dist/components/ad-preview/facebook/marketplace.d.ts.map +1 -1
- package/dist/components/ad-preview/google/search.js +1 -1
- package/dist/components/ad-preview/instagram/feed.js +1 -1
- package/dist/components/ad-preview/instagram/search-result.d.ts.map +1 -1
- package/dist/components/ad-preview/use-scroll-navigation.d.ts.map +1 -1
- package/dist/components/ai-elements/conversation.js +1 -1
- package/dist/components/badge/index.d.ts.map +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/banner/index.d.ts.map +1 -1
- package/dist/components/branding/MantaGridAnimation.js +1 -1
- package/dist/components/breadcrumbs/index.js +1 -1
- package/dist/components/button/index.d.ts.map +1 -1
- package/dist/components/calendar/index.js +2 -2
- package/dist/components/card/index.d.ts.map +1 -1
- package/dist/components/chart/ForecastEventCard.js +1 -1
- package/dist/components/chart/ForecastHoverCard.js +1 -1
- package/dist/components/chart/ForecastLegend.d.ts.map +1 -1
- package/dist/components/chart/ForecastLegend.js +10 -2
- package/dist/components/chart/ForecastLegend.js.map +1 -1
- package/dist/components/chart/annotations.d.ts.map +1 -1
- package/dist/components/chart/chart-colors.d.ts.map +1 -1
- package/dist/components/chart/chart-schemas.d.ts +599 -599
- package/dist/components/chart/chart-schemas.d.ts.map +1 -1
- package/dist/components/chart/chart-schemas.js.map +1 -1
- package/dist/components/chart/chart.js +1 -1
- package/dist/components/chart/forecast-model.d.ts +1 -1
- package/dist/components/chart/forecast-model.d.ts.map +1 -1
- package/dist/components/chart/forecast-model.js.map +1 -1
- package/dist/components/chart/forecast.d.ts.map +1 -1
- package/dist/components/chat/chat-input/index.d.ts +1 -1
- package/dist/components/chat/chat-input/index.js +1 -1
- package/dist/components/chat/chat-input-footer/index.js +1 -1
- package/dist/components/chat/chat-reasoning/index.js +1 -1
- package/dist/components/chat-view/Chat.js +3 -3
- package/dist/components/chat-view/FileMessagePart.js +1 -1
- package/dist/components/chat-view/GraphContextPanel.js +1 -1
- package/dist/components/chat-view/MessageItem.js +1 -1
- package/dist/components/command/index.d.ts +15 -15
- package/dist/components/command/index.d.ts.map +1 -1
- package/dist/components/command/index.js +1 -1
- package/dist/components/dropdown/index.js +1 -1
- package/dist/components/file-dropzone/index.d.ts +25 -0
- package/dist/components/file-dropzone/index.d.ts.map +1 -0
- package/dist/components/file-dropzone/index.js +70 -0
- package/dist/components/file-dropzone/index.js.map +1 -0
- package/dist/components/graph/AgentsGraphListRow.js +1 -1
- package/dist/components/input/ai-action-buttons.js +1 -1
- package/dist/components/input/input-date-range.js +1 -1
- package/dist/components/input/input-field.d.ts.map +1 -1
- package/dist/components/input/input-field.js +1 -1
- package/dist/components/input/textarea.d.ts.map +1 -1
- package/dist/components/input/textarea.js +2 -2
- package/dist/components/input-otp/index.d.ts +6 -6
- package/dist/components/input-otp/index.d.ts.map +1 -1
- package/dist/components/layouts/InstallPrompt.js +1 -1
- package/dist/components/layouts/KnowledgeGraphStartupGate.d.ts +1 -1
- package/dist/components/layouts/RouteLayout.js +1 -1
- package/dist/components/layouts/page/PageHeaderActions.js +1 -1
- package/dist/components/loader/index.d.ts.map +1 -1
- package/dist/components/manta-logo/index.d.ts.map +1 -1
- package/dist/components/modal/index.d.ts.map +1 -1
- package/dist/components/onboarding/SidebarSpotlight.js +1 -1
- package/dist/components/pill/index.d.ts.map +1 -1
- package/dist/components/planning/ActionPlanDetailView.js +1 -1
- package/dist/components/planning/ManualActionList.d.ts +1 -1
- package/dist/components/planning/PlanDetailFooter.js +1 -1
- package/dist/components/planning/plan-detail-utils.d.ts.map +1 -1
- package/dist/components/planning/plan-detail-utils.js +2 -0
- package/dist/components/planning/plan-detail-utils.js.map +1 -1
- package/dist/components/progress/index.d.ts.map +1 -1
- package/dist/components/radio/index.d.ts.map +1 -1
- package/dist/components/rdf-insights/CampaignPerformanceSummary.js +1 -1
- package/dist/components/rdf-insights/InsightCard.js +1 -1
- package/dist/components/rdf-insights/ProductProfitability.js +1 -1
- package/dist/components/rdf-insights/ProductSalesRanking.js +1 -1
- package/dist/components/rdf-insights/ProductVariantsTable.js +1 -1
- package/dist/components/rdf-insights/RoasBenchmark.js +1 -1
- package/dist/components/select/index.d.ts.map +1 -1
- package/dist/components/sheet/index.d.ts.map +1 -1
- package/dist/components/sidebar/company-picker.js +1 -1
- package/dist/components/sidebar/nav-menu.js +1 -1
- package/dist/components/skeleton/index.d.ts +4 -4
- package/dist/components/skeleton/index.d.ts.map +1 -1
- package/dist/components/status/index.d.ts.map +1 -1
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js.map +1 -1
- package/dist/components/table/use-table-state.js.map +1 -1
- package/dist/components/table-skeleton/index.js +1 -1
- package/dist/components/tabs/index.d.ts.map +1 -1
- package/dist/components/thinking/index.d.ts.map +1 -1
- package/dist/components/toast/index.d.ts +1 -0
- package/dist/components/toast/index.d.ts.map +1 -1
- package/dist/components/toast/index.js +1 -0
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/tool-invocation-card/DefaultResultDisplay.js +1 -1
- package/dist/components/tool-invocation-card/ToolOutputRenderer.js +1 -1
- package/dist/components/tree-multi-select/tree-multi-select-rows.js.map +1 -1
- package/dist/datastore-picker/DatastoreRow.js +1 -1
- package/dist/easing.d.ts.map +1 -1
- package/dist/entity-tree/EntityRelationTree.js +1 -1
- package/dist/explain-fact/EntityChip.js +1 -1
- package/dist/explain-fact/conclusion/ConclusionSubtitle.js +1 -1
- package/dist/explain-fact/inspector/InspectorBindings.js +1 -1
- package/dist/explain-fact/inspector/SupportsSection.js +1 -1
- package/dist/explain-fact/proof-tree/ProofRowContent.js +1 -1
- package/dist/explain-fact/proof-tree/ProofRowValue.js +1 -1
- package/dist/globals.css +33 -0
- package/dist/graph/GraphContextPanel.js +1 -1
- package/dist/graph/GraphControls.d.ts +1 -1
- package/dist/graph/GraphControls.d.ts.map +1 -1
- package/dist/graph/GraphControls.js +1 -1
- package/dist/graph/GraphErrorBoundary.d.ts +1 -1
- package/dist/graph/GraphErrorBoundary.d.ts.map +1 -1
- package/dist/graph/NodeContextMenu.d.ts +1 -1
- package/dist/graph/NodeContextMenu.d.ts.map +1 -1
- package/dist/graph/NodeContextMenu.js +1 -1
- package/dist/graph/NodeDetailPanel/PropertyDiffView.js +1 -1
- package/dist/graph/NodeDetailPanel/TypeSummaryPanel.d.ts.map +1 -1
- package/dist/graph/NodeDetailPanel/TypeSummaryPanel.js.map +1 -1
- package/dist/graph/custom-nodes.d.ts +4 -4
- package/dist/graph/custom-nodes.d.ts.map +1 -1
- package/dist/graph/custom-nodes.js +1 -1
- package/dist/graph/graph-layout.js.map +1 -1
- package/dist/graph/graph-list-utils.js.map +1 -1
- package/dist/graph/graph-model.js.map +1 -1
- package/dist/graph/graph-store.js.map +1 -1
- package/dist/graph/nodes/AdsDailyReportTemplateView.d.ts +1 -1
- package/dist/graph/nodes/AdsDailyReportTemplateView.d.ts.map +1 -1
- package/dist/graph/nodes/AttioCallRecordingView.d.ts +1 -1
- package/dist/graph/nodes/AttioCallRecordingView.d.ts.map +1 -1
- package/dist/graph/nodes/AttioCompanyView.d.ts +1 -1
- package/dist/graph/nodes/AttioCompanyView.d.ts.map +1 -1
- package/dist/graph/nodes/AttioDealView.d.ts +1 -1
- package/dist/graph/nodes/AttioDealView.d.ts.map +1 -1
- package/dist/graph/nodes/AttioMeetingView.d.ts +1 -1
- package/dist/graph/nodes/AttioMeetingView.d.ts.map +1 -1
- package/dist/graph/nodes/AttioNoteView.d.ts +1 -1
- package/dist/graph/nodes/AttioNoteView.d.ts.map +1 -1
- package/dist/graph/nodes/AttioTaskView.d.ts +1 -1
- package/dist/graph/nodes/AttioTaskView.d.ts.map +1 -1
- package/dist/graph/nodes/BrandAssetAnalysisActionView.d.ts +1 -1
- package/dist/graph/nodes/BrandAssetAnalysisActionView.d.ts.map +1 -1
- package/dist/graph/nodes/BrandAssetAnalysisView.d.ts +1 -1
- package/dist/graph/nodes/BrandAssetAnalysisView.d.ts.map +1 -1
- package/dist/graph/nodes/BrandFontSuggestionView.d.ts +1 -1
- package/dist/graph/nodes/BrandFontSuggestionView.d.ts.map +1 -1
- package/dist/graph/nodes/BrandGuidelinesView.d.ts +1 -1
- package/dist/graph/nodes/BrandGuidelinesView.d.ts.map +1 -1
- package/dist/graph/nodes/ConnectedAccountCard.d.ts +1 -1
- package/dist/graph/nodes/ConnectedAccountCard.d.ts.map +1 -1
- package/dist/graph/nodes/CoresignalCompanyView.d.ts +1 -1
- package/dist/graph/nodes/CoresignalCompanyView.d.ts.map +1 -1
- package/dist/graph/nodes/CoresignalEmployeeView.d.ts +1 -1
- package/dist/graph/nodes/CoresignalEmployeeView.d.ts.map +1 -1
- package/dist/graph/nodes/CoresignalExperienceView.d.ts +1 -1
- package/dist/graph/nodes/CoresignalExperienceView.d.ts.map +1 -1
- package/dist/graph/nodes/CoresignalJobView.d.ts +1 -1
- package/dist/graph/nodes/CoresignalJobView.d.ts.map +1 -1
- package/dist/graph/nodes/CoresignalKeyExecutiveDepartureView.d.ts +1 -1
- package/dist/graph/nodes/CoresignalKeyExecutiveDepartureView.d.ts.map +1 -1
- package/dist/graph/nodes/EntityCardShell.d.ts +1 -1
- package/dist/graph/nodes/EntityCardShell.d.ts.map +1 -1
- package/dist/graph/nodes/Ga4DailyOverviewView.d.ts +1 -1
- package/dist/graph/nodes/Ga4DailyOverviewView.d.ts.map +1 -1
- package/dist/graph/nodes/Ga4FunnelEventCountView.d.ts +1 -1
- package/dist/graph/nodes/Ga4FunnelEventCountView.d.ts.map +1 -1
- package/dist/graph/nodes/Ga4TrafficSourceView.d.ts +1 -1
- package/dist/graph/nodes/Ga4TrafficSourceView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleAdGroupAdView.d.ts +1 -1
- package/dist/graph/nodes/GoogleAdGroupAdView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleAdGroupCriterionView.d.ts +1 -1
- package/dist/graph/nodes/GoogleAdGroupCriterionView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleAdGroupView.d.ts +1 -1
- package/dist/graph/nodes/GoogleAdGroupView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleCampaignBudgetView.d.ts +1 -1
- package/dist/graph/nodes/GoogleCampaignBudgetView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleCampaignCriterionView.d.ts +1 -1
- package/dist/graph/nodes/GoogleCampaignCriterionView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleCampaignInsightView.d.ts +1 -1
- package/dist/graph/nodes/GoogleCampaignInsightView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleCampaignView.d.ts +1 -1
- package/dist/graph/nodes/GoogleCampaignView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleCustomerClientView.d.ts +1 -1
- package/dist/graph/nodes/GoogleCustomerClientView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleCustomerView.d.ts +1 -1
- package/dist/graph/nodes/GoogleCustomerView.d.ts.map +1 -1
- package/dist/graph/nodes/GoogleSearchTermInsightView.d.ts +1 -1
- package/dist/graph/nodes/GoogleSearchTermInsightView.d.ts.map +1 -1
- package/dist/graph/nodes/LinkedinAdAccountView.d.ts +1 -1
- package/dist/graph/nodes/LinkedinAdAccountView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaAdAccountActivityView.d.ts +1 -1
- package/dist/graph/nodes/MetaAdAccountActivityView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaAdAccountView.d.ts +1 -1
- package/dist/graph/nodes/MetaAdAccountView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaAdImageView.d.ts +1 -1
- package/dist/graph/nodes/MetaAdImageView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaAdSetView.d.ts +1 -1
- package/dist/graph/nodes/MetaAdSetView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaAdView.d.ts +1 -1
- package/dist/graph/nodes/MetaAdView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaCampaignView.d.ts +1 -1
- package/dist/graph/nodes/MetaCampaignView.d.ts.map +1 -1
- package/dist/graph/nodes/MetaInsightView.d.ts +1 -1
- package/dist/graph/nodes/MetaInsightView.d.ts.map +1 -1
- package/dist/graph/nodes/RenderedTemplateView.d.ts +1 -1
- package/dist/graph/nodes/RenderedTemplateView.d.ts.map +1 -1
- package/dist/graph/nodes/SchemaActionView.d.ts +1 -1
- package/dist/graph/nodes/SchemaActionView.d.ts.map +1 -1
- package/dist/graph/nodes/ShopifyShopView.d.ts +1 -1
- package/dist/graph/nodes/ShopifyShopView.d.ts.map +1 -1
- package/dist/graph/nodes/SlackChannelView.d.ts +1 -1
- package/dist/graph/nodes/SlackChannelView.d.ts.map +1 -1
- package/dist/graph/nodes/SlackMessageView.d.ts +1 -1
- package/dist/graph/nodes/SlackMessageView.d.ts.map +1 -1
- package/dist/graph/nodes/SlackUserView.d.ts +1 -1
- package/dist/graph/nodes/SlackUserView.d.ts.map +1 -1
- package/dist/graph/nodes/SlackWorkspaceView.d.ts +1 -1
- package/dist/graph/nodes/SlackWorkspaceView.d.ts.map +1 -1
- package/dist/graph/nodes/attio-shared.d.ts +1 -1
- package/dist/graph/nodes/attio-shared.d.ts.map +1 -1
- package/dist/graph/nodes/attio-shared.js +1 -1
- package/dist/graph/nodes/brand-shared.d.ts.map +1 -1
- package/dist/graph/nodes/card-rows.js +1 -1
- package/dist/graph/nodes/google-campaign-utils.d.ts.map +1 -1
- package/dist/graph/nodes/insight-shared.d.ts +1 -1
- package/dist/graph/nodes/insight-shared.d.ts.map +1 -1
- package/dist/graph/special-nodes/BaseNode.d.ts +2 -2
- package/dist/graph/special-nodes/BaseNode.d.ts.map +1 -1
- package/dist/graph/special-nodes/BaseNode.js +1 -1
- package/dist/graph/special-nodes/DynamicNode.d.ts +1 -1
- package/dist/graph/special-nodes/DynamicNode.d.ts.map +1 -1
- package/dist/graph/special-nodes/EntityValueChip.js +1 -1
- package/dist/graph/special-nodes/GenericNode.d.ts +1 -1
- package/dist/graph/special-nodes/GenericNode.d.ts.map +1 -1
- package/dist/graph/special-nodes/GenericView.d.ts +1 -1
- package/dist/graph/special-nodes/GenericView.d.ts.map +1 -1
- package/dist/graph/special-nodes/NodeFrame.d.ts +1 -1
- package/dist/graph/special-nodes/NodeFrame.d.ts.map +1 -1
- package/dist/graph/special-nodes/NodeFrame.js +1 -1
- package/dist/graph/special-nodes/TypeSummaryNode.d.ts +1 -1
- package/dist/graph/special-nodes/TypeSummaryNode.d.ts.map +1 -1
- package/dist/graph/special-nodes/TypeSummaryNode.js +1 -1
- package/dist/graph/special-nodes/card-facts.js.map +1 -1
- package/dist/hooks/resolved-terms.d.ts +1 -0
- package/dist/hooks/resolved-terms.d.ts.map +1 -1
- package/dist/hooks/resolved-terms.js +2 -1
- package/dist/hooks/resolved-terms.js.map +1 -1
- package/dist/hooks/use-action-plans-list.d.ts.map +1 -1
- package/dist/hooks/use-action-plans-list.js.map +1 -1
- package/dist/hooks/use-activity-feed.js.map +1 -1
- package/dist/hooks/use-connection-problems.d.ts.map +1 -1
- package/dist/hooks/use-conversation-starters.d.ts +2 -2
- package/dist/hooks/use-entity-relations.d.ts.map +1 -1
- package/dist/hooks/use-entity.d.ts.map +1 -1
- package/dist/hooks/use-latest-rendered-template.d.ts.map +1 -1
- package/dist/hooks/use-manual-actions.d.ts.map +1 -1
- package/dist/hooks/use-manual-actions.js.map +1 -1
- package/dist/hooks/use-sparql-construct.d.ts +2 -0
- package/dist/hooks/use-sparql-construct.d.ts.map +1 -1
- package/dist/hooks/use-sparql-construct.js +2 -1
- package/dist/hooks/use-sparql-construct.js.map +1 -1
- package/dist/hooks/useActionGraph.d.ts.map +1 -1
- package/dist/hooks/useActionGraph.js.map +1 -1
- package/dist/hooks/useActionPlanDetail.d.ts +2 -2
- package/dist/hooks/useActionPlanDetail.d.ts.map +1 -1
- package/dist/hooks/useAuth.d.ts +1 -1
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +3 -1
- package/dist/hooks/useAuth.js.map +1 -1
- package/dist/hooks/useConversationGraphContext.js.map +1 -1
- package/dist/hooks/useConversations.js.map +1 -1
- package/dist/hooks/useDatastoreSelection.js.map +1 -1
- package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/build-config.js.map +1 -1
- package/dist/lib/datastore-route-table.d.ts +3 -0
- package/dist/lib/datastore-route-table.d.ts.map +1 -1
- package/dist/lib/datastore-route-table.js +3 -0
- package/dist/lib/datastore-route-table.js.map +1 -1
- package/dist/lib/default-map.d.ts.map +1 -1
- package/dist/lib/default-map.js.map +1 -1
- package/dist/lib/hooks/{useChatUpload.d.ts → useFileUpload.d.ts} +3 -3
- package/dist/lib/hooks/{useChatUpload.d.ts.map → useFileUpload.d.ts.map} +1 -1
- package/dist/lib/hooks/{useChatUpload.js → useFileUpload.js} +2 -2
- package/dist/lib/hooks/{useChatUpload.js.map → useFileUpload.js.map} +1 -1
- package/dist/lib/merge-refs.d.ts.map +1 -1
- package/dist/lib/rdf/insights.js.map +1 -1
- package/dist/lib/structured-data/schema-converter.d.ts +2 -2
- package/dist/lib/structured-data/schema-converter.d.ts.map +1 -1
- package/dist/lib/structured-data/schema-converter.js.map +1 -1
- package/dist/lib/tanstack-query.js +1 -1
- package/dist/lib/tanstack-query.js.map +1 -1
- package/dist/lib/term-batcher.d.ts +3 -1
- package/dist/lib/term-batcher.d.ts.map +1 -1
- package/dist/lib/term-batcher.js +2 -2
- package/dist/lib/term-batcher.js.map +1 -1
- package/dist/lib/use-can-scroll.d.ts.map +1 -1
- package/dist/lib/use-color-palette.d.ts.map +1 -1
- package/dist/lib/use-toggle-set.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/ontology/OntologyTermText.js +1 -1
- package/dist/providers/ActiveChatProvider.d.ts +1 -1
- package/dist/providers/ActiveDatastoreProvider.js.map +1 -1
- package/dist/providers/ChatManagerProvider.js.map +1 -1
- package/dist/providers/commands/CommandContext.js +1 -1
- package/dist/routes/activity/components/ActivityTable.js +1 -1
- package/dist/routes/activity/detail/ActivityDetail.d.ts.map +1 -1
- package/dist/routes/activity/detail/ActivityDetail.js +1 -1
- package/dist/routes/activity/detail/ActivityStepsRail.js +1 -1
- package/dist/routes/activity/detail/ActivityTimeline.js +1 -1
- package/dist/routes/data-collection/index.d.ts +3 -0
- package/dist/routes/data-collection/index.d.ts.map +1 -0
- package/dist/routes/data-collection/index.js +43 -0
- package/dist/routes/data-collection/index.js.map +1 -0
- package/dist/routes/data-explorer/class-properties.js.map +1 -1
- package/dist/routes/data-explorer/class-relations.d.ts +2 -2
- package/dist/routes/data-explorer/components/DataExplorerLayout.d.ts.map +1 -1
- package/dist/routes/data-explorer/components/DataExplorerLayout.js +5 -2
- package/dist/routes/data-explorer/components/DataExplorerLayout.js.map +1 -1
- package/dist/routes/data-explorer/components/DetailHeader.js +1 -1
- package/dist/routes/data-explorer/components/DetailHeader.js.map +1 -1
- package/dist/routes/data-explorer/components/Rail.d.ts.map +1 -1
- package/dist/routes/data-explorer/components/Rail.js +3 -3
- package/dist/routes/data-explorer/components/Rail.js.map +1 -1
- package/dist/routes/data-explorer/components/SegmentBuilder.js +1 -1
- package/dist/routes/data-explorer/components/class-detail/ClassDetail.js +1 -1
- package/dist/routes/data-explorer/components/class-detail/CreateRecordAction.js +1 -1
- package/dist/routes/data-explorer/components/class-detail/Overview.js +1 -1
- package/dist/routes/data-explorer/components/ontology-coverage/CoverageNamespaceRail.js +1 -1
- package/dist/routes/data-explorer/components/ontology-coverage/CoverageSkeleton.js +1 -1
- package/dist/routes/data-explorer/components/record-detail/CreateAction.js +1 -1
- package/dist/routes/data-explorer/components/record-detail/RecordActions.d.ts.map +1 -1
- package/dist/routes/data-explorer/components/record-detail/RecordActions.js +12 -9
- package/dist/routes/data-explorer/components/record-detail/RecordActions.js.map +1 -1
- package/dist/routes/data-explorer/components/record-detail/RecordDetail.js +1 -1
- package/dist/routes/data-explorer/components/record-detail/RecordRefresh.d.ts +7 -0
- package/dist/routes/data-explorer/components/record-detail/RecordRefresh.d.ts.map +1 -0
- package/dist/routes/data-explorer/components/record-detail/RecordRefresh.js +104 -0
- package/dist/routes/data-explorer/components/record-detail/RecordRefresh.js.map +1 -0
- package/dist/routes/data-explorer/components/uploads/IngestRunsList.d.ts +8 -0
- package/dist/routes/data-explorer/components/uploads/IngestRunsList.d.ts.map +1 -0
- package/dist/routes/data-explorer/components/uploads/IngestRunsList.js +18 -0
- package/dist/routes/data-explorer/components/uploads/IngestRunsList.js.map +1 -0
- package/dist/routes/data-explorer/components/uploads/IngestStateStatus.d.ts +14 -0
- package/dist/routes/data-explorer/components/uploads/IngestStateStatus.d.ts.map +1 -0
- package/dist/routes/data-explorer/components/uploads/IngestStateStatus.js +33 -0
- package/dist/routes/data-explorer/components/uploads/IngestStateStatus.js.map +1 -0
- package/dist/routes/data-explorer/components/uploads/UploadedFilesList.d.ts +8 -0
- package/dist/routes/data-explorer/components/uploads/UploadedFilesList.d.ts.map +1 -0
- package/dist/routes/data-explorer/components/uploads/UploadedFilesList.js +34 -0
- package/dist/routes/data-explorer/components/uploads/UploadedFilesList.js.map +1 -0
- package/dist/routes/data-explorer/components/uploads/UploadsPages.d.ts +7 -0
- package/dist/routes/data-explorer/components/uploads/UploadsPages.d.ts.map +1 -0
- package/dist/routes/data-explorer/components/uploads/UploadsPages.js +35 -0
- package/dist/routes/data-explorer/components/uploads/UploadsPages.js.map +1 -0
- package/dist/routes/data-explorer/coverage.d.ts.map +1 -1
- package/dist/routes/data-explorer/index.d.ts +1 -0
- package/dist/routes/data-explorer/index.d.ts.map +1 -1
- package/dist/routes/data-explorer/index.js +1 -0
- package/dist/routes/data-explorer/index.js.map +1 -1
- package/dist/routes/data-explorer/namespaces.d.ts +4 -0
- package/dist/routes/data-explorer/namespaces.d.ts.map +1 -1
- package/dist/routes/data-explorer/namespaces.js +6 -1
- package/dist/routes/data-explorer/namespaces.js.map +1 -1
- package/dist/routes/data-explorer/sparql-client.js.map +1 -1
- package/dist/routes/data-explorer/uploads.d.ts +56 -0
- package/dist/routes/data-explorer/uploads.d.ts.map +1 -0
- package/dist/routes/data-explorer/uploads.js +140 -0
- package/dist/routes/data-explorer/uploads.js.map +1 -0
- package/dist/routes/datastores/components/DatastoreTableSkeleton.js +1 -1
- package/dist/routes/datastores/components/DatastoresToolbar.js +1 -1
- package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.d.ts +1 -0
- package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.d.ts.map +1 -1
- package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.js +17 -10
- package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.js.map +1 -1
- package/dist/routes/datastores/components/StatusBadge.d.ts +7 -8
- package/dist/routes/datastores/components/StatusBadge.d.ts.map +1 -1
- package/dist/routes/datastores/components/StatusBadge.js +17 -1
- package/dist/routes/datastores/components/StatusBadge.js.map +1 -1
- package/dist/routes/datastores/components/UnlinkedDatastoresPanel.js +1 -1
- package/dist/routes/datastores/flatten.d.ts +6 -1
- package/dist/routes/datastores/flatten.d.ts.map +1 -1
- package/dist/routes/datastores/flatten.js +37 -2
- package/dist/routes/datastores/flatten.js.map +1 -1
- package/dist/routes/datastores/hooks/useDatastoreColumns.d.ts +4 -2
- package/dist/routes/datastores/hooks/useDatastoreColumns.d.ts.map +1 -1
- package/dist/routes/datastores/hooks/useDatastoreColumns.js +9 -7
- package/dist/routes/datastores/hooks/useDatastoreColumns.js.map +1 -1
- package/dist/routes/datastores/index.d.ts.map +1 -1
- package/dist/routes/datastores/index.js +54 -19
- package/dist/routes/datastores/index.js.map +1 -1
- package/dist/routes/integrations/catalog-shape.js.map +1 -1
- package/dist/routes/integrations/components/ConnectionRow.js +1 -1
- package/dist/routes/integrations/components/ProviderLogo.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/DashConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts +3 -0
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts.map +1 -0
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js +38 -0
- package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js.map +1 -0
- package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/google-ads-account-tree.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/google-analytics-property-tree.js.map +1 -1
- package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.d.ts +4 -0
- package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.d.ts.map +1 -0
- package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.js +32 -0
- package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.js.map +1 -0
- package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.d.ts.map +1 -1
- package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.js +1 -0
- package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.js.map +1 -1
- package/dist/routes/integrations/connect-forms.d.ts +1 -0
- package/dist/routes/integrations/connect-forms.d.ts.map +1 -1
- package/dist/routes/integrations/connect-forms.js +1 -0
- package/dist/routes/integrations/connect-forms.js.map +1 -1
- package/dist/routes/integrations/connection-view.d.ts.map +1 -1
- package/dist/routes/integrations/connection-view.js +1 -0
- package/dist/routes/integrations/connection-view.js.map +1 -1
- package/dist/routes/integrations/types.d.ts.map +1 -1
- package/dist/routes/memories/components/ChangeScopeDialog.js +1 -1
- package/dist/routes/memories/components/ConflictMemoryCard.js +1 -1
- package/dist/routes/memories/components/ConsolidationReviewDialog.js +1 -1
- package/dist/routes/memories/components/LoadingSkeleton.js +1 -1
- package/dist/routes/memories/components/MemoriesFilters.js +1 -1
- package/dist/routes/memories/components/MemoriesTabPanel.js +1 -1
- package/dist/routes/memories/components/MemoryActions.js +1 -1
- package/dist/routes/memories/components/MemoryFields.js +1 -1
- package/dist/routes/memories/components/MemoryFormDialog.js +1 -1
- package/dist/routes/memories/expiry-utils.js.map +1 -1
- package/dist/routes/memories/hooks/useDuplicateDetection.js.map +1 -1
- package/dist/routes/memories/hooks/useLiveContext.d.ts.map +1 -1
- package/dist/routes/memories/hooks/useMemoryColumns.d.ts.map +1 -1
- package/dist/routes/memories/hooks/useMemoryColumns.js +1 -1
- package/dist/routes/memories/hooks/useMemoryTable.js.map +1 -1
- package/dist/routes/plans/components/ActionPlanPage.js +1 -1
- package/dist/routes/plans/components/ActionPlansFilters.js +1 -1
- package/dist/routes/plans/components/ActionPlansPage.js +1 -1
- package/dist/routes/plans/components/ActionPlansTableBody.js +1 -1
- package/dist/routes/plans/components/actionPlansTableConfig.d.ts +7 -7
- package/dist/routes/plans/components/actionPlansTableConfig.d.ts.map +1 -1
- package/dist/routes/plans/index.js +1 -1
- package/dist/routes/rules/components/RuleAffectedActionPlansSection.js +1 -1
- package/dist/routes/rules/components/RuleDetailsPage.js +1 -1
- package/dist/routes/rules/components/RuleProducersSection.js +1 -1
- package/dist/routes/rules/components/RuleSetup.js +1 -1
- package/dist/routes/rules/components/RulesOverviewPage.js +1 -1
- package/dist/routes/rules/components/datalog-editor/FactsPreview.js +1 -1
- package/dist/routes/rules/components/datalog-editor/SparqlQueryPanel.js +1 -1
- package/dist/routes/rules/components/rule-actionability.js.map +1 -1
- package/dist/rules/RuleNarrativeSegments.js +1 -1
- package/dist/rules/datalog-ast/DatalogAtomComponent.js +1 -1
- package/dist/rules/datalog-ast/DatalogBodyFormulaComponent.js +1 -1
- package/dist/rules/datalog-ast/DatalogExpressionRenderer.js +1 -1
- package/dist/rules/datalog-ast/DatalogTermComponent.js +1 -1
- package/dist/rules/datalog-cache.js.map +1 -1
- package/dist/rules/rule-narrative-format.d.ts.map +1 -1
- package/dist/rules/rule-narrative-renderer.js.map +1 -1
- package/dist/shared/graph-derived-queries.d.ts.map +1 -1
- package/dist/shared/graph-derived-queries.js +2 -1
- package/dist/shared/graph-derived-queries.js.map +1 -1
- package/dist/style.js +1 -1
- package/dist/templates/slack-to-markdown.js +1 -1
- package/package.json +27 -14
- package/src/app-subpaths.json +1 -0
- package/src/components/badge/index.tsx +1 -1
- package/src/components/calendar/index.tsx +2 -2
- package/src/components/chart/ForecastLegend.tsx +15 -13
- package/src/components/chart/forecast-model.ts +6 -8
- package/src/components/chat-view/Chat.tsx +2 -2
- package/src/components/file-dropzone/index.tsx +165 -0
- package/src/components/input/input-field.tsx +1 -1
- package/src/components/input/textarea.tsx +1 -1
- package/src/components/planning/plan-detail-utils.tsx +2 -0
- package/src/components/table/index.tsx +0 -1
- package/src/components/toast/index.tsx +1 -0
- package/src/graph/NodeDetailPanel/TypeSummaryPanel.tsx +12 -14
- package/src/hooks/resolved-terms.ts +6 -1
- package/src/hooks/use-sparql-construct.ts +4 -2
- package/src/hooks/useAuth.ts +3 -1
- package/src/index.ts +1 -0
- package/src/lib/chat-types.ts +1 -1
- package/src/lib/datastore-route-table.ts +6 -0
- package/src/lib/hooks/{useChatUpload.ts → useFileUpload.ts} +2 -2
- package/src/lib/tanstack-query.ts +2 -2
- package/src/lib/term-batcher.ts +3 -3
- package/src/lib/utils.ts +1 -1
- package/src/routes/data-collection/index.tsx +82 -0
- package/src/routes/data-explorer/components/DataExplorerLayout.tsx +5 -2
- package/src/routes/data-explorer/components/DetailHeader.tsx +4 -4
- package/src/routes/data-explorer/components/Rail.tsx +13 -2
- package/src/routes/data-explorer/components/record-detail/RecordActions.tsx +22 -16
- package/src/routes/data-explorer/components/record-detail/RecordRefresh.tsx +150 -0
- package/src/routes/data-explorer/components/uploads/IngestRunsList.tsx +63 -0
- package/src/routes/data-explorer/components/uploads/IngestStateStatus.tsx +45 -0
- package/src/routes/data-explorer/components/uploads/UploadedFilesList.tsx +93 -0
- package/src/routes/data-explorer/components/uploads/UploadsPages.tsx +80 -0
- package/src/routes/data-explorer/index.tsx +6 -0
- package/src/routes/data-explorer/namespaces.ts +7 -1
- package/src/routes/data-explorer/uploads.ts +205 -0
- package/src/routes/datastores/components/LinkUnlinkedDatastoreDialog.tsx +49 -10
- package/src/routes/datastores/components/StatusBadge.tsx +22 -7
- package/src/routes/datastores/flatten.ts +50 -2
- package/src/routes/datastores/hooks/useDatastoreColumns.tsx +21 -1
- package/src/routes/datastores/index.tsx +64 -13
- package/src/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.tsx +61 -0
- package/src/routes/integrations/components/connect-forms/google-merchant-center-account-tree.ts +38 -0
- package/src/routes/integrations/components/connect-forms/setup-account-unavailable-reason.ts +1 -0
- package/src/routes/integrations/connect-forms.ts +1 -0
- package/src/routes/integrations/connection-view.ts +1 -0
- package/src/rules/datalog-ast/DatalogBodyFormulaComponent.tsx +1 -1
- package/src/rules/datalog-ast/DatalogTermComponent.tsx +1 -1
- package/src/shacl/shacl-form-types.ts +1 -1
- package/src/shared/graph-derived-queries.ts +2 -0
- package/src/style.ts +1 -1
- package/src/templates/slack-to-markdown.ts +1 -1
|
@@ -104,14 +104,12 @@ export function buildForecastModel(input: ModelInput) {
|
|
|
104
104
|
config: Object.fromEntries(
|
|
105
105
|
[...metrics, ...withPlans.map((entry) => entry.without)].map((line) => [line.key, { label: line.label }]),
|
|
106
106
|
) satisfies ChartConfig,
|
|
107
|
-
hoverMetrics: metrics.map(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}),
|
|
114
|
-
),
|
|
107
|
+
hoverMetrics: metrics.map((metric): ForecastHoverMetric => ({
|
|
108
|
+
key: metric.key,
|
|
109
|
+
label: metric.label,
|
|
110
|
+
lowerIsBetter: metric.lowerIsBetter === true,
|
|
111
|
+
...(isPresent(metric.withoutPlans) ? { withoutKey: metric.withoutPlans.key } : {}),
|
|
112
|
+
})),
|
|
115
113
|
legendItems: forecastLegendItems({
|
|
116
114
|
metrics: metrics.map((metric, index) => ({ label: metric.label, color: metricColor(metric, index) })),
|
|
117
115
|
withoutLabels: withPlans.map((entry) => entry.without.label),
|
|
@@ -50,7 +50,7 @@ import { useSelectedModel } from "#hooks/useSelectedModel";
|
|
|
50
50
|
import { isDevBuild } from "#lib/build-config";
|
|
51
51
|
import type { ChatDraft, CopilotMenuDefaults, Datastore, PageContext, User } from "#lib/chat-types";
|
|
52
52
|
import { findLatestShowcase } from "#lib/find-latest-showcase";
|
|
53
|
-
import {
|
|
53
|
+
import { useFileUpload } from "#lib/hooks/useFileUpload";
|
|
54
54
|
import { planStatusLabel } from "#lib/plan-status-label";
|
|
55
55
|
import { cn } from "#lib/utils";
|
|
56
56
|
import { ActiveChatProvider, useActiveChatConnection } from "#providers/ActiveChatProvider";
|
|
@@ -360,7 +360,7 @@ function ChatContent(props: ChatContentProps) {
|
|
|
360
360
|
|
|
361
361
|
const toolsUsedInSession = useRef(new Set<string>());
|
|
362
362
|
|
|
363
|
-
const { uploadFiles, isUploading, progress: uploadProgress } =
|
|
363
|
+
const { uploadFiles, isUploading, progress: uploadProgress } = useFileUpload();
|
|
364
364
|
|
|
365
365
|
const beginAssistantTurn = useCallback(() => {
|
|
366
366
|
turnKeyRef.current += 1;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { maxUploadBytes } from "@manta-eu/client/shared/upload";
|
|
2
|
+
import { fileIdentityKey } from "@manta-eu/lib/file";
|
|
3
|
+
import { humanBytes } from "@manta-eu/lib/humanize";
|
|
4
|
+
import { isPresent } from "@manta-eu/lib/present";
|
|
5
|
+
import { FileText, UploadCloud } from "lucide-react";
|
|
6
|
+
import { useRef, useState, type ChangeEvent, type DragEvent } from "react";
|
|
7
|
+
import { Progress } from "#components/progress/index";
|
|
8
|
+
import { cn } from "#style";
|
|
9
|
+
|
|
10
|
+
export type RejectedDrop = {
|
|
11
|
+
file: File;
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function partitionDroppedFiles(files: readonly File[], maxFileSize: number) {
|
|
16
|
+
const accepted: File[] = [];
|
|
17
|
+
const rejected: RejectedDrop[] = [];
|
|
18
|
+
|
|
19
|
+
for (const file of files) {
|
|
20
|
+
if (file.size === 0) rejected.push({ file, reason: "File is empty" });
|
|
21
|
+
else if (file.size > maxFileSize) rejected.push({ file, reason: `File exceeds ${humanBytes(maxFileSize)}` });
|
|
22
|
+
else accepted.push(file);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return { accepted, rejected };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function hasFiles(dataTransfer: DataTransfer | null) {
|
|
29
|
+
return dataTransfer?.types.includes("Files") ?? false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type FileDropzoneProps = {
|
|
33
|
+
onFiles: (files: File[]) => void;
|
|
34
|
+
onRejected?: (rejected: RejectedDrop[]) => void;
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
maxFileSize?: number;
|
|
37
|
+
title?: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
className?: string;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export function FileDropzone(props: FileDropzoneProps) {
|
|
43
|
+
const {
|
|
44
|
+
onFiles,
|
|
45
|
+
onRejected,
|
|
46
|
+
disabled = false,
|
|
47
|
+
maxFileSize = maxUploadBytes,
|
|
48
|
+
title = "Drop files here",
|
|
49
|
+
description,
|
|
50
|
+
className,
|
|
51
|
+
} = props;
|
|
52
|
+
|
|
53
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
|
54
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
55
|
+
|
|
56
|
+
function handleFiles(files: File[]) {
|
|
57
|
+
const { accepted, rejected } = partitionDroppedFiles(files, maxFileSize);
|
|
58
|
+
|
|
59
|
+
if (isPresent(rejected)) onRejected?.(rejected);
|
|
60
|
+
if (isPresent(accepted)) onFiles(accepted);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function handleDragOver(event: DragEvent<HTMLButtonElement>) {
|
|
64
|
+
if (disabled || !hasFiles(event.dataTransfer)) return;
|
|
65
|
+
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
setIsDragging(true);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function handleDragLeave(event: DragEvent<HTMLButtonElement>) {
|
|
71
|
+
if (event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget)) return;
|
|
72
|
+
|
|
73
|
+
setIsDragging(false);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function handleDrop(event: DragEvent<HTMLButtonElement>) {
|
|
77
|
+
event.preventDefault();
|
|
78
|
+
setIsDragging(false);
|
|
79
|
+
|
|
80
|
+
if (disabled) return;
|
|
81
|
+
|
|
82
|
+
handleFiles(Array.from(event.dataTransfer.files));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function handleChange(event: ChangeEvent<HTMLInputElement>) {
|
|
86
|
+
handleFiles(Array.from(event.target.files ?? []));
|
|
87
|
+
event.target.value = "";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return (
|
|
91
|
+
<>
|
|
92
|
+
<button
|
|
93
|
+
type="button"
|
|
94
|
+
disabled={disabled}
|
|
95
|
+
onClick={() => inputRef.current?.click()}
|
|
96
|
+
onDragEnter={handleDragOver}
|
|
97
|
+
onDragOver={handleDragOver}
|
|
98
|
+
onDragLeave={handleDragLeave}
|
|
99
|
+
onDrop={handleDrop}
|
|
100
|
+
data-dragging={isDragging}
|
|
101
|
+
className={cn(
|
|
102
|
+
"flex min-h-56 w-full flex-col items-center justify-center gap-3 rounded-3xl border-2 border-dashed px-6 py-10",
|
|
103
|
+
"border-muted-border bg-faint text-center outline-none transition-colors",
|
|
104
|
+
"hover:border-accent-foreground/60 focus-visible:ring-2 focus-visible:ring-active-border/50",
|
|
105
|
+
"disabled:cursor-not-allowed disabled:opacity-60",
|
|
106
|
+
isDragging && "border-accent-foreground/80 bg-accent-foreground/[0.04]",
|
|
107
|
+
className,
|
|
108
|
+
)}
|
|
109
|
+
>
|
|
110
|
+
<UploadCloud className="size-8 text-accent-foreground" />
|
|
111
|
+
<span className="typography-body-medium text-default-foreground">{title}</span>
|
|
112
|
+
<span className="typography-small text-muted-foreground">
|
|
113
|
+
or <span className="text-primary underline underline-offset-2">browse your computer</span>
|
|
114
|
+
</span>
|
|
115
|
+
<span className="typography-caption text-muted-foreground">
|
|
116
|
+
{description ?? `Any file type, up to ${humanBytes(maxFileSize)} each`}
|
|
117
|
+
</span>
|
|
118
|
+
</button>
|
|
119
|
+
|
|
120
|
+
<input
|
|
121
|
+
ref={inputRef}
|
|
122
|
+
type="file"
|
|
123
|
+
multiple
|
|
124
|
+
hidden
|
|
125
|
+
disabled={disabled}
|
|
126
|
+
onChange={handleChange}
|
|
127
|
+
data-testid="file-dropzone-input"
|
|
128
|
+
/>
|
|
129
|
+
</>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export type UploadProgressListProps = {
|
|
134
|
+
files: readonly File[];
|
|
135
|
+
progress: Record<string, number>;
|
|
136
|
+
className?: string;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export function UploadProgressList(props: UploadProgressListProps) {
|
|
140
|
+
const { files, progress, className } = props;
|
|
141
|
+
|
|
142
|
+
if (!isPresent(files)) return null;
|
|
143
|
+
|
|
144
|
+
return (
|
|
145
|
+
<ul className={cn("flex flex-col gap-2", className)} aria-label="Uploads in progress">
|
|
146
|
+
{files.map((file) => {
|
|
147
|
+
const percent = progress[fileIdentityKey(file)] ?? 0;
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
<li
|
|
151
|
+
key={fileIdentityKey(file)}
|
|
152
|
+
className="flex items-center gap-3 rounded-lg border border-muted-border px-3 py-2"
|
|
153
|
+
>
|
|
154
|
+
<FileText className="size-4 shrink-0 text-muted-foreground" />
|
|
155
|
+
<span className="typography-small min-w-0 flex-1 truncate text-default-foreground">{file.name}</span>
|
|
156
|
+
<Progress value={percent} size="sm" className="w-24 shrink-0 sm:w-40" aria-label={`${file.name} upload`} />
|
|
157
|
+
<span className="typography-caption w-10 shrink-0 text-right tabular-nums text-muted-foreground">
|
|
158
|
+
{percent}%
|
|
159
|
+
</span>
|
|
160
|
+
</li>
|
|
161
|
+
);
|
|
162
|
+
})}
|
|
163
|
+
</ul>
|
|
164
|
+
);
|
|
165
|
+
}
|
|
@@ -170,7 +170,7 @@ export const Input = React.forwardRef<HTMLInputElement, InputArgs>(function Inpu
|
|
|
170
170
|
inputRef.current.value = next;
|
|
171
171
|
setInternalCount(next.length);
|
|
172
172
|
onChange?.({ target: inputRef.current } as ChangeEvent<HTMLInputElement>);
|
|
173
|
-
//
|
|
173
|
+
// oxlint-disable-next-line no-useless-catch
|
|
174
174
|
} catch (error) {
|
|
175
175
|
throw error;
|
|
176
176
|
} finally {
|
|
@@ -178,7 +178,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaArgs>(func
|
|
|
178
178
|
textareaRef.current.value = next;
|
|
179
179
|
setInternalCount(next.length);
|
|
180
180
|
onChange?.({ target: textareaRef.current } as ChangeEvent<HTMLTextAreaElement>);
|
|
181
|
-
//
|
|
181
|
+
// oxlint-disable-next-line no-useless-catch
|
|
182
182
|
} catch (error) {
|
|
183
183
|
throw error;
|
|
184
184
|
} finally {
|
|
@@ -109,6 +109,7 @@ export function formatIntegration(integration: GQLIntegration | null): string {
|
|
|
109
109
|
.with(GQLIntegration.Meta, () => "Meta")
|
|
110
110
|
.with(GQLIntegration.Google, () => "Google")
|
|
111
111
|
.with(GQLIntegration.GoogleAnalytics, () => "Google Analytics")
|
|
112
|
+
.with(GQLIntegration.GoogleMerchantCenter, () => "Merchant Center")
|
|
112
113
|
.with(GQLIntegration.Linkedin, () => "LinkedIn")
|
|
113
114
|
.with(GQLIntegration.MicrosoftAds, () => "Microsoft Ads")
|
|
114
115
|
.with(GQLIntegration.Shopify, () => "Shopify")
|
|
@@ -126,6 +127,7 @@ export function integrationToChannel(integration: GQLIntegration): Channel | nul
|
|
|
126
127
|
[GQLIntegration.Meta]: "META",
|
|
127
128
|
[GQLIntegration.Google]: "GOOGLE_ADS",
|
|
128
129
|
[GQLIntegration.GoogleAnalytics]: null,
|
|
130
|
+
[GQLIntegration.GoogleMerchantCenter]: null,
|
|
129
131
|
[GQLIntegration.Linkedin]: null,
|
|
130
132
|
[GQLIntegration.MicrosoftAds]: null,
|
|
131
133
|
[GQLIntegration.Shopify]: "SHOPIFY",
|
|
@@ -120,7 +120,6 @@ export enum SortingHandlerPlacement {
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
declare module "@tanstack/react-table" {
|
|
123
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
124
123
|
interface ColumnMeta<TData, TValue> {
|
|
125
124
|
/**
|
|
126
125
|
* Placement of the sorting handler relative to the cell header
|
|
@@ -107,20 +107,18 @@ function buildInstanceColumns(args: BuildInstanceColumnsArgs): ColumnDef<SampleI
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
columns.push(
|
|
110
|
-
...previewKeys.map(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}),
|
|
123
|
-
),
|
|
110
|
+
...previewKeys.map((key): ColumnDef<SampleInstance> => ({
|
|
111
|
+
id: `preview:${key}`,
|
|
112
|
+
header: titleCase(key),
|
|
113
|
+
meta: denseCellMeta,
|
|
114
|
+
cell: ({ row }) => {
|
|
115
|
+
const value = propertyValue(row.original, key);
|
|
116
|
+
if (!isPresent(value)) return null;
|
|
117
|
+
return (
|
|
118
|
+
<span className="typography-tiny block truncate text-muted-foreground">{formatDisplayValue(value)}</span>
|
|
119
|
+
);
|
|
120
|
+
},
|
|
121
|
+
})),
|
|
124
122
|
);
|
|
125
123
|
|
|
126
124
|
return columns;
|
|
@@ -4,6 +4,7 @@ import { createTermBatcher, type TermBatcher } from "../lib/term-batcher";
|
|
|
4
4
|
export type ResolvedTerms<T> = {
|
|
5
5
|
values: Map<string, T>;
|
|
6
6
|
request: (iris: string[]) => void;
|
|
7
|
+
refresh?: (iris: string[]) => void;
|
|
7
8
|
// IRIs whose lookup has completed, found or not. Absent in static contexts
|
|
8
9
|
// (tests), which are treated as already settled.
|
|
9
10
|
settledIris?: ReadonlySet<string>;
|
|
@@ -137,6 +138,10 @@ export function useResolvedTermsState<T>(
|
|
|
137
138
|
}, [batcher]);
|
|
138
139
|
|
|
139
140
|
const request = useCallback((iris: string[]) => batcher.request(iris), [batcher]);
|
|
141
|
+
const refresh = useCallback((iris: string[]) => batcher.request(iris, { force: true }), [batcher]);
|
|
140
142
|
|
|
141
|
-
return useMemo(
|
|
143
|
+
return useMemo(
|
|
144
|
+
() => ({ values, request, refresh, settledIris, failedIris }),
|
|
145
|
+
[values, request, refresh, settledIris, failedIris],
|
|
146
|
+
);
|
|
142
147
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { keepPreviousData, useQuery } from "@tanstack/react-query";
|
|
1
|
+
import { keepPreviousData, useQuery, type Query } from "@tanstack/react-query";
|
|
2
2
|
import type { QueryContext } from "ldkit";
|
|
3
3
|
import type { RDF } from "ldkit/rdf";
|
|
4
4
|
import { withAbortSignal } from "../engine";
|
|
@@ -39,10 +39,11 @@ export type UseSparqlSelectOptions = {
|
|
|
39
39
|
queryKey: readonly unknown[];
|
|
40
40
|
enabled?: boolean;
|
|
41
41
|
staleTime?: number;
|
|
42
|
+
refetchInterval?: number | false | ((query: Query<RDF.Bindings[]>) => number | false | undefined);
|
|
42
43
|
};
|
|
43
44
|
|
|
44
45
|
export function useSparqlSelect(config: UseSparqlSelectOptions) {
|
|
45
|
-
const { query, queryKey, enabled = true, staleTime } = config;
|
|
46
|
+
const { query, queryKey, enabled = true, staleTime, refetchInterval } = config;
|
|
46
47
|
const engine = useSparqlEngine();
|
|
47
48
|
const options = useSparqlOptions();
|
|
48
49
|
|
|
@@ -54,5 +55,6 @@ export function useSparqlSelect(config: UseSparqlSelectOptions) {
|
|
|
54
55
|
},
|
|
55
56
|
enabled: enabled && !!query,
|
|
56
57
|
staleTime,
|
|
58
|
+
refetchInterval,
|
|
57
59
|
});
|
|
58
60
|
}
|
package/src/hooks/useAuth.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SessionContextDocument } from "@manta-eu/client";
|
|
2
|
+
import { loginStatusPollMs } from "@manta-eu/client/shared/constants";
|
|
2
3
|
import { datastoreHeader } from "@manta-eu/client/shared/datastore-path";
|
|
3
4
|
import { createHttpError, isHttpError } from "@manta-eu/client/shared/error-utils";
|
|
4
5
|
import { isValidModelId, type MantaModelId } from "@manta-eu/client/shared/model";
|
|
@@ -189,7 +190,8 @@ export function useAuth(): UseAuthResult {
|
|
|
189
190
|
// Keycloak's SSO session idle timeout (default 30 min) only resets when a request
|
|
190
191
|
// actually reaches processMiddleware. A long WS-only chat session with no other HTTP
|
|
191
192
|
// traffic would otherwise let the underlying session go idle and die silently.
|
|
192
|
-
|
|
193
|
+
// The poll also renews the access token before it expires, so it must run more often than the token lives.
|
|
194
|
+
refetchInterval: loginStatusPollMs,
|
|
193
195
|
refetchIntervalInBackground: true,
|
|
194
196
|
});
|
|
195
197
|
|
package/src/index.ts
CHANGED
|
@@ -23,6 +23,7 @@ export * from "./components/disabled-action-tooltip";
|
|
|
23
23
|
export * from "./components/dropdown";
|
|
24
24
|
export * from "./components/editable-text";
|
|
25
25
|
export * from "./components/empty-state";
|
|
26
|
+
export * from "./components/file-dropzone";
|
|
26
27
|
export * from "./components/filter-sheet";
|
|
27
28
|
export * from "./components/hover-media";
|
|
28
29
|
export * from "./components/input";
|
package/src/lib/chat-types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*
|
|
1
|
+
/* oxlint-disable import-js/order -- each type is imported beside the re-export it exists for, which is
|
|
2
2
|
how this file is organized; they are type-only, so the positions have no runtime meaning. */
|
|
3
3
|
import type { ConversationMode } from "@manta-eu/client/shared/chat-manager";
|
|
4
4
|
import type { MantaModelId } from "@manta-eu/client/shared/model";
|
|
@@ -24,6 +24,9 @@ export type RouteElements = {
|
|
|
24
24
|
DataExplorerIndex?: ReactNode;
|
|
25
25
|
DataExplorerRecent?: ReactNode;
|
|
26
26
|
DataExplorerCoverage?: ReactNode;
|
|
27
|
+
DataExplorerFiles?: ReactNode;
|
|
28
|
+
DataExplorerIngest?: ReactNode;
|
|
29
|
+
DataCollection?: ReactNode;
|
|
27
30
|
DataExplorerPrefix?: ReactNode;
|
|
28
31
|
DataExplorerType?: ReactNode;
|
|
29
32
|
DataEntity?: ReactNode;
|
|
@@ -72,12 +75,15 @@ export const datastoreRoutes: RouteDefinition[] = [
|
|
|
72
75
|
{ path: "/data", render: (e) => e.DataExplorerIndex || notFoundElement(e) },
|
|
73
76
|
{ path: "/data/recent", render: (e) => e.DataExplorerRecent || notFoundElement(e) },
|
|
74
77
|
{ path: "/data/coverage", render: (e) => e.DataExplorerCoverage || notFoundElement(e) },
|
|
78
|
+
{ path: "/data/files", render: (e) => e.DataExplorerFiles || notFoundElement(e) },
|
|
79
|
+
{ path: "/data/ingest-runs", render: (e) => e.DataExplorerIngest || notFoundElement(e) },
|
|
75
80
|
{ path: "/data/entity/:iri", render: (e) => e.DataEntity || notFoundElement(e) },
|
|
76
81
|
{ path: "/data/:prefix", render: (e) => e.DataExplorerPrefix || notFoundElement(e) },
|
|
77
82
|
{ path: "/data/:prefix/:type", render: (e) => e.DataExplorerType || notFoundElement(e) },
|
|
78
83
|
{ path: "/data/:prefix/:type/:id", render: (e) => e.DataDetail || notFoundElement(e) },
|
|
79
84
|
],
|
|
80
85
|
},
|
|
86
|
+
{ path: "/data-collection", render: (e) => e.DataCollection || notFoundElement(e) },
|
|
81
87
|
{ path: newChatPath, render: (e) => e.Chat },
|
|
82
88
|
{ path: "/chat/:chatId", render: (e) => e.Chat },
|
|
83
89
|
{ path: notFoundRoutePath, render: notFoundElement },
|
|
@@ -21,13 +21,13 @@ export type UploadProgress = Record<string, number>;
|
|
|
21
21
|
|
|
22
22
|
const uploadConcurrency = 6;
|
|
23
23
|
|
|
24
|
-
export type
|
|
24
|
+
export type UseFileUploadResult = {
|
|
25
25
|
uploadFiles: (files: File[]) => Promise<UploadFilesResult>;
|
|
26
26
|
isUploading: boolean;
|
|
27
27
|
progress: UploadProgress;
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
export function
|
|
30
|
+
export function useFileUpload(): UseFileUploadResult {
|
|
31
31
|
const { mantaClient, uploadRelay } = useMantaClient();
|
|
32
32
|
|
|
33
33
|
const { mutateAsync: initiateUpload } = useInitiateUploadMutation(mantaClient);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { QueryClient, QueryKey } from "@tanstack/react-query";
|
|
2
2
|
|
|
3
3
|
export type QueryWithGetKey = {
|
|
4
|
-
//
|
|
4
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
5
5
|
getKey: (variables?: any) => QueryKey;
|
|
6
6
|
};
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ function isQueryWithGetKey(keyLike: KeyLike): keyLike is QueryWithGetKey {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
function getTopQueryKey(query: QueryWithGetKey): QueryKey {
|
|
15
|
-
//
|
|
15
|
+
// oxlint-disable-next-line typescript/no-explicit-any
|
|
16
16
|
const keys = query.getKey({} as any);
|
|
17
17
|
return keys.slice(0, 1);
|
|
18
18
|
}
|
package/src/lib/term-batcher.ts
CHANGED
|
@@ -14,7 +14,7 @@ export type TermBatcherConfig<T> = {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
export type TermBatcher = {
|
|
17
|
-
request: (iris: IRI[]) => void;
|
|
17
|
+
request: (iris: IRI[], options?: { force: boolean }) => void;
|
|
18
18
|
cancel: () => void;
|
|
19
19
|
};
|
|
20
20
|
|
|
@@ -98,13 +98,13 @@ export function createTermBatcher<T>(config: TermBatcherConfig<T>): TermBatcher
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
return {
|
|
101
|
-
request(iris) {
|
|
101
|
+
request(iris, options) {
|
|
102
102
|
cancelled = false;
|
|
103
103
|
|
|
104
104
|
const unresolvable: IRI[] = [];
|
|
105
105
|
|
|
106
106
|
for (const iri of iris) {
|
|
107
|
-
if (requested.has(iri)) continue;
|
|
107
|
+
if (requested.has(iri) && !options?.force) continue;
|
|
108
108
|
|
|
109
109
|
requested.add(iri);
|
|
110
110
|
|
package/src/lib/utils.ts
CHANGED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { fileIdentityKey } from "@manta-eu/lib/file";
|
|
2
|
+
import { isPresent } from "@manta-eu/lib/present";
|
|
3
|
+
import { FolderUp } from "lucide-react";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { toast } from "sonner";
|
|
6
|
+
import { FileDropzone, UploadProgressList, type RejectedDrop } from "#components/file-dropzone/index";
|
|
7
|
+
import { PageBody, PageHeader } from "#components/layouts/page/index";
|
|
8
|
+
import { RouteLayout } from "#components/layouts/RouteLayout";
|
|
9
|
+
import { useFileUpload } from "#lib/hooks/useFileUpload";
|
|
10
|
+
import { useAuthContext } from "#providers/AuthContext";
|
|
11
|
+
import { UploadedFilesSection } from "#routes/data-explorer/components/uploads/UploadsPages";
|
|
12
|
+
import { useInvalidateUploads } from "#routes/data-explorer/uploads";
|
|
13
|
+
|
|
14
|
+
function showRejected(rejected: RejectedDrop[]) {
|
|
15
|
+
for (const { file, reason } of rejected) toast.error(`${file.name}: ${reason}`);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function DataCollectionUploader() {
|
|
19
|
+
const { uploadFiles, progress } = useFileUpload();
|
|
20
|
+
const invalidateUploads = useInvalidateUploads();
|
|
21
|
+
const [inFlight, setInFlight] = useState<File[]>([]);
|
|
22
|
+
|
|
23
|
+
async function handleFiles(files: File[]) {
|
|
24
|
+
setInFlight((current) => [...current, ...files]);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const { uploaded, failed } = await uploadFiles(files);
|
|
28
|
+
|
|
29
|
+
for (const { file } of failed) toast.error(`${file.name} could not be uploaded. Try again.`);
|
|
30
|
+
if (isPresent(uploaded)) toast.success(`Uploaded ${uploaded.length} of ${files.length} files`);
|
|
31
|
+
} finally {
|
|
32
|
+
const done = new Set(files.map(fileIdentityKey));
|
|
33
|
+
|
|
34
|
+
setInFlight((current) => current.filter((file) => !done.has(fileIdentityKey(file))));
|
|
35
|
+
await invalidateUploads();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div className="flex flex-col gap-3">
|
|
41
|
+
<FileDropzone onFiles={(files) => void handleFiles(files)} onRejected={showRejected} />
|
|
42
|
+
<UploadProgressList files={inFlight} progress={progress} />
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function DataCollectionRoute() {
|
|
48
|
+
const { datastore, datastores, user, logout, isOperator, canSwitchDatastore } = useAuthContext();
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<RouteLayout
|
|
52
|
+
user={user}
|
|
53
|
+
datastore={datastore}
|
|
54
|
+
datastores={datastores}
|
|
55
|
+
isOperator={isOperator}
|
|
56
|
+
canSwitchDatastore={canSwitchDatastore}
|
|
57
|
+
logout={logout}
|
|
58
|
+
>
|
|
59
|
+
<PageHeader title="Data collection" icon={FolderUp} />
|
|
60
|
+
<PageBody className="px-4 py-6 sm:px-6">
|
|
61
|
+
<div className="mx-auto flex max-w-4xl flex-col gap-8">
|
|
62
|
+
<div className="flex flex-col gap-2">
|
|
63
|
+
<h2 className="typography-header text-default-foreground">Upload your sample data</h2>
|
|
64
|
+
<p className="typography-small max-w-prose text-muted-foreground">
|
|
65
|
+
Add the sample files you want to share with us. They are stored in this datastore only. Remove personal
|
|
66
|
+
data before you upload.
|
|
67
|
+
</p>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<DataCollectionUploader />
|
|
71
|
+
|
|
72
|
+
<section className="flex flex-col gap-3" aria-labelledby="data-collection-files">
|
|
73
|
+
<h3 id="data-collection-files" className="typography-body-medium text-default-foreground">
|
|
74
|
+
Uploaded files
|
|
75
|
+
</h3>
|
|
76
|
+
<UploadedFilesSection emptyText="Nothing uploaded yet. Files you add appear here with their status." />
|
|
77
|
+
</section>
|
|
78
|
+
</div>
|
|
79
|
+
</PageBody>
|
|
80
|
+
</RouteLayout>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -4,7 +4,7 @@ import { useEffect } from "react";
|
|
|
4
4
|
import { Outlet, useMatch } from "react-router";
|
|
5
5
|
import { useDeclaredNamespaces } from "../declared-namespaces";
|
|
6
6
|
import { useRailState } from "../hooks/useRailState";
|
|
7
|
-
import { coveragePath, explorerPath } from "../namespaces";
|
|
7
|
+
import { coveragePath, explorerPath, filesPath, ingestRunsPath } from "../namespaces";
|
|
8
8
|
import { Rail } from "./Rail";
|
|
9
9
|
import { RailSheet } from "./RailSheet";
|
|
10
10
|
import { LoadingRows } from "./RawTriples";
|
|
@@ -31,7 +31,10 @@ export function DataExplorerLayout() {
|
|
|
31
31
|
const { datastore, datastores, user, logout, isOperator, canSwitchDatastore } = useAuthContext();
|
|
32
32
|
|
|
33
33
|
const isIndex = Boolean(useMatch(explorerPath));
|
|
34
|
-
const
|
|
34
|
+
const isCoverage = Boolean(useMatch(coveragePath));
|
|
35
|
+
const isFiles = Boolean(useMatch(filesPath));
|
|
36
|
+
const isIngest = Boolean(useMatch(ingestRunsPath));
|
|
37
|
+
const isFullPage = isCoverage || isFiles || isIngest;
|
|
35
38
|
const railState = useRailState();
|
|
36
39
|
const { isLoading: isLoadingNamespaces } = useDeclaredNamespaces();
|
|
37
40
|
|
|
@@ -42,14 +42,14 @@ export function DetailHeader(props: DetailHeaderProps) {
|
|
|
42
42
|
<div>
|
|
43
43
|
{badges && <div className="mb-3 flex items-center gap-2">{badges}</div>}
|
|
44
44
|
|
|
45
|
-
<div className="flex items-start justify-between gap-4">
|
|
46
|
-
<div className="flex items-center gap-3">
|
|
47
|
-
<h2 className="typography-header wrap-
|
|
45
|
+
<div className="flex flex-col items-start justify-between gap-4 sm:flex-row">
|
|
46
|
+
<div className="flex min-w-0 items-center gap-3">
|
|
47
|
+
<h2 className="typography-header wrap-anywhere text-default-foreground">{title}</h2>
|
|
48
48
|
|
|
49
49
|
{titleBadges}
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
|
-
{actions && <div className="flex
|
|
52
|
+
{actions && <div className="flex flex-wrap items-center gap-2 sm:shrink-0">{actions}</div>}
|
|
53
53
|
</div>
|
|
54
54
|
|
|
55
55
|
{iri &&
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import { isPresent } from "@manta-eu/lib/present";
|
|
2
|
-
import { Clock, Gauge } from "lucide-react";
|
|
2
|
+
import { Clock, FileUp, Gauge, Workflow } from "lucide-react";
|
|
3
3
|
import { useEffect, useMemo, useRef } from "react";
|
|
4
4
|
import { useMatch } from "react-router";
|
|
5
5
|
import { buildClassGroups, useExplorerClasses, useInstanceCounts, useSubclassEdges } from "../classes";
|
|
6
6
|
import { type RailState } from "../hooks/useRailState";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
coveragePath,
|
|
9
|
+
explorerPath,
|
|
10
|
+
filesPath,
|
|
11
|
+
groupKeyFor,
|
|
12
|
+
ingestRunsPath,
|
|
13
|
+
isNamespaceSegment,
|
|
14
|
+
prefixForIri,
|
|
15
|
+
recentPath,
|
|
16
|
+
} from "../namespaces";
|
|
8
17
|
import { ClassTreeNodes } from "./ClassTreeNodes";
|
|
9
18
|
import { NamespaceGroupRow } from "./NamespaceGroupRow";
|
|
10
19
|
import { RailLink } from "./RailLink";
|
|
@@ -63,6 +72,8 @@ export function Rail(props: RailProps) {
|
|
|
63
72
|
<SearchInput placeholder="Filter types…" value={filter} onChange={(e) => setFilter(e.target.value)} />
|
|
64
73
|
<RailLink to={recentPath} icon={Clock} label="Recently modified" />
|
|
65
74
|
<RailLink to={coveragePath} icon={Gauge} label="Ontology coverage" />
|
|
75
|
+
<RailLink to={filesPath} icon={FileUp} label="Files" />
|
|
76
|
+
<RailLink to={ingestRunsPath} icon={Workflow} label="Ingest runs" />
|
|
66
77
|
</div>
|
|
67
78
|
|
|
68
79
|
<div ref={listRef} className="min-h-0 flex-1 overflow-y-auto px-2 pb-4">
|