diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/overview/CreditUsageCard.vue b/app/javascript/dashboard/components-next/captain/pageComponents/overview/CreditUsageCard.vue new file mode 100644 index 000000000..7a990bb9d --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/overview/CreditUsageCard.vue @@ -0,0 +1,79 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/overview/KnowledgeCard.vue b/app/javascript/dashboard/components-next/captain/pageComponents/overview/KnowledgeCard.vue new file mode 100644 index 000000000..4136d0c14 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/overview/KnowledgeCard.vue @@ -0,0 +1,62 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/overview/MetricCard.vue b/app/javascript/dashboard/components-next/captain/pageComponents/overview/MetricCard.vue new file mode 100644 index 000000000..6f366f66d --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/overview/MetricCard.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/overview/ResponseQualityCard.vue b/app/javascript/dashboard/components-next/captain/pageComponents/overview/ResponseQualityCard.vue new file mode 100644 index 000000000..35095e6ab --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/overview/ResponseQualityCard.vue @@ -0,0 +1,71 @@ + + + diff --git a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue index 15a007a74..0e6b3468b 100644 --- a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue +++ b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue @@ -440,6 +440,14 @@ const menuItems = computed(() => { label: t('SIDEBAR.CAPTAIN'), activeOn: ['captain_assistants_create_index'], children: [ + { + name: 'Overview', + label: t('SIDEBAR.CAPTAIN_OVERVIEW'), + activeOn: ['captain_assistants_overview_index'], + to: accountScopedRoute('captain_assistants_index', { + navigationPath: 'captain_assistants_overview_index', + }), + }, { name: 'FAQs', label: t('SIDEBAR.CAPTAIN_RESPONSES'), diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index 79f881b84..1206fb33c 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -392,6 +392,64 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "OVERVIEW": { + "HEADER": "Overview", + "SAMPLE_NOTICE": "Showing sample data. Live analytics are coming soon.", + "RANGES": { + "DAYS": "{count}d" + }, + "METRICS": { + "HANDLED": { + "LABEL": "Conversations handled", + "HINT": "Distinct conversations this assistant replied in." + }, + "AUTO_RESOLUTION": { + "LABEL": "Auto-resolution rate", + "HINT": "Share of handled conversations closed without a human reply." + }, + "HANDOFF": { + "LABEL": "Handoff rate", + "HINT": "Share of handled conversations escalated to a human agent." + }, + "FLAGGED": { + "LABEL": "Flagged response rate", + "HINT": "Assistant replies agents reported as low quality." + }, + "REOPEN": { + "LABEL": "Reopen rate", + "HINT": "Auto-resolved conversations that were reopened afterwards." + }, + "DEPTH": { + "LABEL": "Messages / conversation", + "HINT": "Average replies the assistant sends per conversation." + } + }, + "KNOWLEDGE": { + "TITLE": "Knowledge coverage", + "COVERAGE": "{pct}% approved", + "APPROVED": "Approved FAQs", + "PENDING": "Pending FAQs", + "DOCUMENTS": "Documents" + }, + "FLAGGED": { + "TITLE": "Response quality", + "TOTAL": "{count} flagged" + }, + "CREDITS": { + "TITLE": "Credit usage", + "UNIT": "credits", + "LEGEND": "Daily credits used", + "AXIS_START": "{count}d ago", + "AXIS_END": "Today" + }, + "FLAG_REASONS": { + "INCORRECT": "Incorrect info", + "INCOMPLETE": "Incomplete", + "OUTDATED": "Outdated", + "INAPPROPRIATE": "Inappropriate", + "OTHER": "Other" + } + }, "ASSISTANT_SWITCHER": { "ASSISTANTS": "Assistants", "SWITCH_ASSISTANT": "Switch between assistants", diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index 640b9c506..f0ca86180 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -324,6 +324,7 @@ "ALL_COMPANIES": "All Companies", "CAPTAIN": "Captain", "CAPTAIN_ASSISTANTS": "Assistants", + "CAPTAIN_OVERVIEW": "Overview", "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", diff --git a/app/javascript/dashboard/routes/dashboard/captain/assistants/overview/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/assistants/overview/Index.vue new file mode 100644 index 000000000..1722a47f3 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/captain/assistants/overview/Index.vue @@ -0,0 +1,130 @@ + + + diff --git a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js index 1ab4fa501..1f4c9fa73 100644 --- a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js +++ b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js @@ -6,6 +6,7 @@ import CaptainPageRouteView from './pages/CaptainPageRouteView.vue'; import AssistantsIndexPage from './pages/AssistantsIndexPage.vue'; import AssistantEmptyStateIndex from './assistants/Index.vue'; +import AssistantOverviewIndex from './assistants/overview/Index.vue'; import AssistantSettingsIndex from './assistants/settings/Settings.vue'; import AssistantInboxesIndex from './assistants/inboxes/Index.vue'; import AssistantPlaygroundIndex from './assistants/playground/Index.vue'; @@ -36,6 +37,12 @@ const metaV2 = { }; const assistantRoutes = [ + { + path: frontendURL('accounts/:accountId/captain/:assistantId/overview'), + component: AssistantOverviewIndex, + name: 'captain_assistants_overview_index', + meta, + }, { path: frontendURL('accounts/:accountId/captain/:assistantId/faqs'), component: ResponsesIndex, diff --git a/app/javascript/dashboard/routes/dashboard/captain/pages/AssistantsIndexPage.vue b/app/javascript/dashboard/routes/dashboard/captain/pages/AssistantsIndexPage.vue index 01ec64618..70f93f441 100644 --- a/app/javascript/dashboard/routes/dashboard/captain/pages/AssistantsIndexPage.vue +++ b/app/javascript/dashboard/routes/dashboard/captain/pages/AssistantsIndexPage.vue @@ -53,6 +53,7 @@ const routeToLastActiveAssistant = () => { const { navigationPath } = route.params; const isAValidRoute = [ + 'captain_assistants_overview_index', // Overview page 'captain_assistants_responses_index', // Faq page 'captain_assistants_documents_index', // Document page 'captain_assistants_scenarios_index', // Scenario page