mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 02:57:57 +00:00 
			
		
		
		
	# Pull Request Template ## Description This PR fixes an issue where the copilot displayed irrelevant prompts on the Contacts and Article pages. Previously, conversation-specific prompts like "Summarize", "Suggest answer", and "Rate the conversation" were shown even outside conversations. With this update, users navigating to the Contacts or Articles routes will now see appropriate dashboard prompts such as "High priority conversation" and "List contacts". ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Screenshots **Contacts Page** <img width="1401" alt="image" src="https://github.com/user-attachments/assets/242f42a1-d9a5-4369-bd00-5c22e977970d" /> **Articles page** <img width="1401" alt="image" src="https://github.com/user-attachments/assets/12c5575d-9c50-4530-a0c9-2f02fbf4c732" /> ## 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
		
			
				
	
	
		
			107 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup>
 | |
| import { computed } from 'vue';
 | |
| import { useI18n } from 'vue-i18n';
 | |
| import { useRoute } from 'vue-router';
 | |
| import Icon from '../icon/Icon.vue';
 | |
| 
 | |
| defineProps({
 | |
|   hasAssistants: {
 | |
|     type: Boolean,
 | |
|     default: false,
 | |
|   },
 | |
| });
 | |
| 
 | |
| const emit = defineEmits(['useSuggestion']);
 | |
| const { t } = useI18n();
 | |
| const route = useRoute();
 | |
| 
 | |
| const routePromptMap = {
 | |
|   conversations: [
 | |
|     {
 | |
|       label: 'CAPTAIN.COPILOT.PROMPTS.SUMMARIZE.LABEL',
 | |
|       prompt: 'CAPTAIN.COPILOT.PROMPTS.SUMMARIZE.CONTENT',
 | |
|     },
 | |
|     {
 | |
|       label: 'CAPTAIN.COPILOT.PROMPTS.SUGGEST.LABEL',
 | |
|       prompt: 'CAPTAIN.COPILOT.PROMPTS.SUGGEST.CONTENT',
 | |
|     },
 | |
|     {
 | |
|       label: 'CAPTAIN.COPILOT.PROMPTS.RATE.LABEL',
 | |
|       prompt: 'CAPTAIN.COPILOT.PROMPTS.RATE.CONTENT',
 | |
|     },
 | |
|   ],
 | |
|   dashboard: [
 | |
|     {
 | |
|       label: 'CAPTAIN.COPILOT.PROMPTS.HIGH_PRIORITY.LABEL',
 | |
|       prompt: 'CAPTAIN.COPILOT.PROMPTS.HIGH_PRIORITY.CONTENT',
 | |
|     },
 | |
|     {
 | |
|       label: 'CAPTAIN.COPILOT.PROMPTS.LIST_CONTACTS.LABEL',
 | |
|       prompt: 'CAPTAIN.COPILOT.PROMPTS.LIST_CONTACTS.CONTENT',
 | |
|     },
 | |
|   ],
 | |
| };
 | |
| 
 | |
| const getCurrentRoute = () => {
 | |
|   const path = route.path;
 | |
|   if (path.includes('/conversations')) return 'conversations';
 | |
|   if (path.includes('/dashboard')) return 'dashboard';
 | |
|   return 'dashboard';
 | |
| };
 | |
| 
 | |
| const promptOptions = computed(() => {
 | |
|   const currentRoute = getCurrentRoute();
 | |
|   return routePromptMap[currentRoute] || routePromptMap.conversations;
 | |
| });
 | |
| 
 | |
| const handleSuggestion = opt => {
 | |
|   emit('useSuggestion', t(opt.prompt));
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <div class="flex-1 flex flex-col gap-6 px-2">
 | |
|     <div class="flex flex-col space-y-4 py-4">
 | |
|       <Icon icon="i-woot-captain" class="text-n-slate-9 text-4xl" />
 | |
|       <div class="space-y-1">
 | |
|         <h3 class="text-base font-medium text-n-slate-12 leading-8">
 | |
|           {{ $t('CAPTAIN.COPILOT.PANEL_TITLE') }}
 | |
|         </h3>
 | |
|         <p class="text-sm text-n-slate-11 leading-6">
 | |
|           {{ $t('CAPTAIN.COPILOT.KICK_OFF_MESSAGE') }}
 | |
|         </p>
 | |
|       </div>
 | |
|     </div>
 | |
|     <div v-if="!hasAssistants" class="w-full space-y-2">
 | |
|       <p class="text-sm text-n-slate-11 leading-6">
 | |
|         {{ $t('CAPTAIN.ASSISTANTS.NO_ASSISTANTS_AVAILABLE') }}
 | |
|       </p>
 | |
|       <router-link
 | |
|         :to="{
 | |
|           name: 'captain_assistants_index',
 | |
|           params: { accountId: route.params.accountId },
 | |
|         }"
 | |
|         class="text-n-slate-11 underline hover:text-n-slate-12"
 | |
|       >
 | |
|         {{ $t('CAPTAIN.ASSISTANTS.ADD_NEW') }}
 | |
|       </router-link>
 | |
|     </div>
 | |
|     <div v-else class="w-full space-y-2">
 | |
|       <span class="text-xs text-n-slate-10 block">
 | |
|         {{ $t('CAPTAIN.COPILOT.TRY_THESE_PROMPTS') }}
 | |
|       </span>
 | |
|       <div class="space-y-1">
 | |
|         <button
 | |
|           v-for="prompt in promptOptions"
 | |
|           :key="prompt.label"
 | |
|           class="w-full px-3 py-2 rounded-md border border-n-weak bg-n-slate-2 text-n-slate-11 flex items-center justify-between hover:bg-n-slate-3 transition-colors"
 | |
|           @click="handleSuggestion(prompt)"
 | |
|         >
 | |
|           <span>{{ t(prompt.label) }}</span>
 | |
|           <Icon icon="i-lucide-chevron-right" />
 | |
|         </button>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 |