From ef7bf66476173588d7dff64c88aba4ac5bf40c81 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 24 Jan 2025 22:51:09 +0530 Subject: [PATCH] feat: Add frontend changes for Captain limits (#10749) This PR introduces several improvements to the Captain AI dashboard section: - New billing page, with new colors, layout and meters for Captain usage - Updated the base paywall component to use new colors - Updated PageLayout.vue, it's more generic and can be used for other pages as well - Use flags to toggle empty state and loading state - Add prop for `featureFlag` to show the paywall slot based on feature enabled on account - Update `useAccount` to add a `isCloudFeatureEnabled` - **Removed feature flag checks from captain route definitions**, so the captain entry will always be visible on the sidebar - Add banner to Captain pages for the following cases - Responses usage is over 80% - Documents limit is fully exhausted ### Screenshots
Free plan

![CleanShot 2025-01-22 at 18 37 11@2x](https://github.com/user-attachments/assets/17d3ddba-9095-4e81-9b6f-45b5f69e6a3f) ![CleanShot 2025-01-22 at 18 37 04@2x](https://github.com/user-attachments/assets/df9bb0a6-085f-45da-97d4-74cbcc33fc7e)

Paid plan

![CleanShot 2025-01-22 at 18 36 45@2x](https://github.com/user-attachments/assets/a7ccf9d4-143b-49e4-8149-83c7a7985023) ![CleanShot 2025-01-22 at 20 23 57@2x](https://github.com/user-attachments/assets/c6ce35ba-e537-486d-85c8-4cc2d4e76438)

--------- Co-authored-by: Sojan Jose Co-authored-by: Pranav Co-authored-by: Muhsin Keloth --- .../components-next/EmptyStateLayout.vue | 12 +- .../components-next/banner/Banner.vue | 73 +++++ .../components-next/captain/PageLayout.vue | 60 +++- .../captain/assistant/AssistantCard.vue | 51 ++-- .../captain/assistant/DocumentCard.vue | 37 ++- .../captain/assistant/InboxCard.vue | 6 +- .../captain/assistant/ResponseCard.vue | 6 +- .../captain/pageComponents/Paywall.vue | 41 +++ .../pageComponents/document/LimitBanner.vue | 40 +++ .../emptyStates/AssistantPageEmptyState.vue | 1 + .../emptyStates/DocumentPageEmptyState.vue | 1 + .../emptyStates/InboxPageEmptyState.vue | 1 + .../emptyStates/ResponsePageEmptyState.vue | 1 + .../pageComponents/response/LimitBanner.vue | 42 +++ .../components-next/sidebar/Sidebar.vue | 5 + .../components-next/sidebar/SidebarGroup.vue | 2 + .../sidebar/SidebarGroupLeaf.vue | 12 +- .../sidebar/SidebarSubGroup.vue | 7 +- .../components-next/sidebar/provider.js | 4 + .../dashboard/composables/useAccount.js | 12 +- .../dashboard/composables/useCaptain.js | 46 +++ .../dashboard/helper/featureHelper.js | 1 + .../i18n/locale/en/integrations.json | 28 +- .../dashboard/i18n/locale/en/settings.json | 16 +- .../dashboard/captain/assistants/Index.vue | 50 +-- .../captain/assistants/inboxes/Index.vue | 46 ++- .../dashboard/captain/captain.routes.js | 6 +- .../dashboard/captain/documents/Index.vue | 65 ++-- .../dashboard/captain/responses/Index.vue | 106 ++++--- .../dashboard/settings/SettingsLayout.vue | 2 +- .../dashboard/settings/billing/Index.vue | 288 +++++++++++------- .../settings/billing/billing.routes.js | 4 +- .../billing/components/BillingCard.vue | 25 ++ .../billing/components/BillingHeader.vue | 26 ++ .../billing/components/BillingItem.vue | 40 --- .../billing/components/BillingMeter.vue | 45 +++ .../billing/components/DetailItem.vue | 23 ++ .../settings/components/BasePaywallModal.vue | 41 +-- .../enterprise/api/v1/accounts_controller.rb | 3 +- .../billing/handle_stripe_event_service.rb | 2 +- .../api/v1/accounts_controller_spec.rb | 12 + 41 files changed, 920 insertions(+), 369 deletions(-) create mode 100644 app/javascript/dashboard/components-next/banner/Banner.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/Paywall.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/document/LimitBanner.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/response/LimitBanner.vue create mode 100644 app/javascript/dashboard/composables/useCaptain.js create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingCard.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingHeader.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingItem.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/BillingMeter.vue create mode 100644 app/javascript/dashboard/routes/dashboard/settings/billing/components/DetailItem.vue diff --git a/app/javascript/dashboard/components-next/EmptyStateLayout.vue b/app/javascript/dashboard/components-next/EmptyStateLayout.vue index 04c478ba6..686d4b8a4 100644 --- a/app/javascript/dashboard/components-next/EmptyStateLayout.vue +++ b/app/javascript/dashboard/components-next/EmptyStateLayout.vue @@ -1,4 +1,6 @@ @@ -16,7 +22,7 @@ defineProps({ class="relative flex flex-col items-center justify-center w-full h-full overflow-hidden" >
- + + +
diff --git a/app/javascript/dashboard/components-next/banner/Banner.vue b/app/javascript/dashboard/components-next/banner/Banner.vue new file mode 100644 index 000000000..cc5af3272 --- /dev/null +++ b/app/javascript/dashboard/components-next/banner/Banner.vue @@ -0,0 +1,73 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/PageLayout.vue b/app/javascript/dashboard/components-next/captain/PageLayout.vue index b0d10b889..1ce03cec5 100644 --- a/app/javascript/dashboard/components-next/captain/PageLayout.vue +++ b/app/javascript/dashboard/components-next/captain/PageLayout.vue @@ -1,8 +1,12 @@ + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/document/LimitBanner.vue b/app/javascript/dashboard/components-next/captain/pageComponents/document/LimitBanner.vue new file mode 100644 index 000000000..d4f512f39 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/document/LimitBanner.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/AssistantPageEmptyState.vue b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/AssistantPageEmptyState.vue index 0ae292eb4..a12fcce74 100644 --- a/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/AssistantPageEmptyState.vue +++ b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/AssistantPageEmptyState.vue @@ -15,6 +15,7 @@ const onClick = () => {