mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 02:57:57 +00:00 
			
		
		
		
	 d0611cb7f2
			
		
	
	d0611cb7f2
	
	
	
		
			
			# Pull Request Template ## Description This PR introduces basic customization options for the CSAT survey: * **Display Type**: Option to use star ratings instead of emojis. * **Message Text**: Customize the survey message (up to 200 characters). * **Survey Rules**: Send surveys based on labels — trigger when a conversation has or doesn't have a specific label. Fixes https://linear.app/chatwoot/document/improve-csat-responses-a61cf30e054e ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? ### Loom videos **Website Channel (Widget)** https://www.loom.com/share/7f47836cde7940ae9d17b7997d060a18?sid=aad2ad0a-140a-4a09-8829-e01fa2e102c5 **Email Channel (Survey link)** https://www.loom.com/share/e92f4c4c0f73417ba300a25885e093ce?sid=4bb006f0-1c2a-4352-a232-8bf684e3d757 ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] 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 - [x] 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 --------- Co-authored-by: Pranav <pranavrajs@gmail.com>
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup>
 | |
| import { computed } from 'vue';
 | |
| import BaseBubble from './Base.vue';
 | |
| import { useI18n } from 'vue-i18n';
 | |
| import { CSAT_RATINGS, CSAT_DISPLAY_TYPES } from 'shared/constants/messages';
 | |
| import { useMessageContext } from '../provider.js';
 | |
| 
 | |
| const { contentAttributes, content } = useMessageContext();
 | |
| const { t } = useI18n();
 | |
| 
 | |
| const response = computed(() => {
 | |
|   return contentAttributes.value?.submittedValues?.csatSurveyResponse ?? {};
 | |
| });
 | |
| 
 | |
| const isRatingSubmitted = computed(() => {
 | |
|   return !!response.value.rating;
 | |
| });
 | |
| 
 | |
| const displayType = computed(() => {
 | |
|   return contentAttributes.value?.displayType || CSAT_DISPLAY_TYPES.EMOJI;
 | |
| });
 | |
| 
 | |
| const isStarRating = computed(() => {
 | |
|   return displayType.value === CSAT_DISPLAY_TYPES.STAR;
 | |
| });
 | |
| 
 | |
| const rating = computed(() => {
 | |
|   if (isRatingSubmitted.value) {
 | |
|     return CSAT_RATINGS.find(
 | |
|       csatOption => csatOption.value === response.value.rating
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   return null;
 | |
| });
 | |
| 
 | |
| const starRatingValue = computed(() => {
 | |
|   return response.value.rating || 0;
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <BaseBubble class="px-4 py-3" data-bubble-name="csat">
 | |
|     <h4>{{ content || t('CONVERSATION.CSAT_REPLY_MESSAGE') }}</h4>
 | |
|     <dl v-if="isRatingSubmitted" class="mt-4">
 | |
|       <dt class="text-n-slate-11 italic">
 | |
|         {{ t('CONVERSATION.RATING_TITLE') }}
 | |
|       </dt>
 | |
|       <dd v-if="!isStarRating">
 | |
|         {{ t(rating.translationKey) }}
 | |
|       </dd>
 | |
|       <dd v-else class="flex mt-1">
 | |
|         <span v-for="n in 5" :key="n" class="text-2xl mr-1">
 | |
|           <i
 | |
|             :class="[
 | |
|               n <= starRatingValue
 | |
|                 ? 'i-ri-star-fill text-n-amber-9'
 | |
|                 : 'i-ri-star-line text-n-slate-10',
 | |
|             ]"
 | |
|           />
 | |
|         </span>
 | |
|       </dd>
 | |
| 
 | |
|       <dt v-if="response.feedbackMessage" class="text-n-slate-11 italic mt-2">
 | |
|         {{ t('CONVERSATION.FEEDBACK_TITLE') }}
 | |
|       </dt>
 | |
|       <dd>{{ response.feedbackMessage }}</dd>
 | |
|     </dl>
 | |
|   </BaseBubble>
 | |
| </template>
 |