From c31d693addb6e663fb13368a21ce1e79f59fa38c Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Thu, 30 Oct 2025 03:04:28 +0530 Subject: [PATCH] chore: Improvements in pending FAQs (#12755) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request Template ## Description **This PR includes:** 1. Added URL-based filter persistence for the responses pages, including page and search parameters. 2. Introduced a new empty state variant for pending FAQs — without a backdrop and with a “Clear Filters” option. 3. Made the actions, filter, and search row remain fixed at the top while scrolling. Fixes https://linear.app/chatwoot/issue/CW-5852/improvements-in-pending-faqs ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Loom video https://www.loom.com/share/1d9eee68c0684f0ab05e08b4ca1e0ce9 ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../components-next/EmptyStateLayout.vue | 19 +++++- .../components-next/captain/PageLayout.vue | 1 + .../emptyStates/ResponsePageEmptyState.vue | 56 +++++++++++++--- .../i18n/locale/en/integrations.json | 2 + .../dashboard/captain/responses/Index.vue | 55 +++++++++++----- .../dashboard/captain/responses/Pending.vue | 65 +++++++++++++++---- 6 files changed, 159 insertions(+), 39 deletions(-) diff --git a/app/javascript/dashboard/components-next/EmptyStateLayout.vue b/app/javascript/dashboard/components-next/EmptyStateLayout.vue index f2744dde5..39eda2d85 100644 --- a/app/javascript/dashboard/components-next/EmptyStateLayout.vue +++ b/app/javascript/dashboard/components-next/EmptyStateLayout.vue @@ -14,6 +14,10 @@ defineProps({ type: Array, default: () => [], }, + showBackdrop: { + type: Boolean, + default: true, + }, }); @@ -25,14 +29,24 @@ defineProps({ class="relative w-full max-w-[60rem] mx-auto overflow-hidden h-full max-h-[28rem]" >
-
+

{{ subtitle }} diff --git a/app/javascript/dashboard/components-next/captain/PageLayout.vue b/app/javascript/dashboard/components-next/captain/PageLayout.vue index 495db1838..c394f1b6b 100644 --- a/app/javascript/dashboard/components-next/captain/PageLayout.vue +++ b/app/javascript/dashboard/components-next/captain/PageLayout.vue @@ -114,6 +114,7 @@ const handlePageChange = event => {

+
diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/ResponsePageEmptyState.vue b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/ResponsePageEmptyState.vue index a1c91b2a3..d2ed12b0a 100644 --- a/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/ResponsePageEmptyState.vue +++ b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/ResponsePageEmptyState.vue @@ -6,16 +6,39 @@ import ResponseCard from 'dashboard/components-next/captain/assistant/ResponseCa import FeatureSpotlight from 'dashboard/components-next/feature-spotlight/FeatureSpotlight.vue'; import { responsesList } from 'dashboard/components-next/captain/pageComponents/emptyStates/captainEmptyStateContent.js'; -const emit = defineEmits(['click']); +import { computed } from 'vue'; + +const props = defineProps({ + variant: { + type: String, + default: 'approved', + validator: value => ['approved', 'pending'].includes(value), + }, + hasActiveFilters: { + type: Boolean, + default: false, + }, +}); + +const emit = defineEmits(['click', 'clearFilters']); + +const isApproved = computed(() => props.variant === 'approved'); +const isPending = computed(() => props.variant === 'pending'); + const { isOnChatwootCloud } = useAccount(); const onClick = () => { emit('click'); }; + +const onClearFilters = () => { + emit('clearFilters'); +}; - - - - -