feat(captain): allow agents to act on FAQ suggestions

This commit is contained in:
aakashb95
2026-07-22 23:36:22 +05:30
parent 2ec33da5cd
commit 8c28fb74ec
3 changed files with 77 additions and 51 deletions
@@ -5,7 +5,6 @@ import { dynamicTime } from 'shared/helpers/timeHelper';
import Button from 'dashboard/components-next/button/Button.vue';
import Icon from 'dashboard/components-next/icon/Icon.vue';
import Policy from 'dashboard/components/policy.vue';
const props = defineProps({
suggestion: {
@@ -93,27 +92,25 @@ const language = computed(() =>
</span>
</div>
<Policy :permissions="['administrator']">
<div class="flex items-center gap-2">
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.DISMISS')"
icon="i-lucide-x"
size="sm"
variant="ghost"
color="slate"
:disabled="isLoading"
@click="emit('dismiss', suggestion)"
/>
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.APPROVE')"
icon="i-lucide-circle-check-big"
size="sm"
:is-loading="isLoading"
:disabled="isLoading"
@click="emit('approve', suggestion)"
/>
</div>
</Policy>
<div class="flex items-center gap-2">
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.DISMISS')"
icon="i-lucide-x"
size="sm"
variant="ghost"
color="slate"
:disabled="isLoading"
@click="emit('dismiss', suggestion)"
/>
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.APPROVE')"
icon="i-lucide-circle-check-big"
size="sm"
:is-loading="isLoading"
:disabled="isLoading"
@click="emit('approve', suggestion)"
/>
</div>
</div>
</article>
</template>
@@ -1,4 +1,5 @@
import { flushPromises, shallowMount } from '@vue/test-utils';
import Button from 'dashboard/components-next/button/Button.vue';
import FaqSuggestionReviewDialog from './FaqSuggestionReviewDialog.vue';
const { dispatch, push, uiFlags } = vi.hoisted(() => ({
@@ -111,4 +112,37 @@ describe('FaqSuggestionReviewDialog', () => {
params: { conversation_id: 42 },
});
});
it('shows the review actions to users who can open the page', async () => {
dispatch.mockResolvedValueOnce({ observations: [] });
const wrapper = shallowMount(FaqSuggestionReviewDialog, {
props: {
suggestion: {
id: 1,
question: 'How do I enable the feature?',
answer: 'Turn it on in settings.',
source_count: 1,
assistant: { name: 'Support assistant' },
language: 'en',
},
},
global: {
mocks: { $t: key => key },
stubs: { Dialog: DialogStub },
},
});
await flushPromises();
expect(
wrapper.findAllComponents(Button).map(button => button.props('label'))
).toEqual(
expect.arrayContaining([
'CAPTAIN.FAQ_SUGGESTIONS.DISMISS',
'CAPTAIN.FAQ_SUGGESTIONS.SAVE',
'CAPTAIN.FAQ_SUGGESTIONS.APPROVE_FAQ',
])
);
});
});
@@ -10,7 +10,6 @@ import Button from 'dashboard/components-next/button/Button.vue';
import Dialog from 'dashboard/components-next/dialog/Dialog.vue';
import Icon from 'dashboard/components-next/icon/Icon.vue';
import Input from 'dashboard/components-next/input/Input.vue';
import Policy from 'dashboard/components/policy.vue';
import Spinner from 'dashboard/components-next/spinner/Spinner.vue';
import TextArea from 'dashboard/components-next/textarea/TextArea.vue';
@@ -250,17 +249,15 @@ defineExpose({ dialogRef });
<div
class="flex w-full flex-col-reverse gap-3 sm:flex-row sm:items-center sm:justify-between"
>
<Policy :permissions="['administrator']">
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.DISMISS')"
icon="i-lucide-x"
variant="ghost"
color="ruby"
:is-loading="isDismissing"
:disabled="isSaving || isDismissing"
@click="handleDismiss"
/>
</Policy>
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.DISMISS')"
icon="i-lucide-x"
variant="ghost"
color="ruby"
:is-loading="isDismissing"
:disabled="isSaving || isDismissing"
@click="handleDismiss"
/>
<div class="flex items-center justify-end gap-2">
<Button
:label="$t('DIALOG.BUTTONS.CANCEL')"
@@ -269,23 +266,21 @@ defineExpose({ dialogRef });
:disabled="isSaving || isDismissing"
@click="close"
/>
<Policy :permissions="['administrator']">
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.SAVE')"
variant="faded"
color="slate"
:is-loading="isSaving"
:disabled="isInvalid || isSaving || isDismissing"
@click="handleSave"
/>
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.APPROVE_FAQ')"
icon="i-lucide-circle-check-big"
:is-loading="isSaving"
:disabled="isInvalid || isSaving || isDismissing"
@click="handleApprove"
/>
</Policy>
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.SAVE')"
variant="faded"
color="slate"
:is-loading="isSaving"
:disabled="isInvalid || isSaving || isDismissing"
@click="handleSave"
/>
<Button
:label="$t('CAPTAIN.FAQ_SUGGESTIONS.APPROVE_FAQ')"
icon="i-lucide-circle-check-big"
:is-loading="isSaving"
:disabled="isInvalid || isSaving || isDismissing"
@click="handleApprove"
/>
</div>
</div>
</template>