diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb index 011faaf28..61d16b2ca 100644 --- a/app/controllers/api/v1/accounts/inboxes_controller.rb +++ b/app/controllers/api/v1/accounts/inboxes_controller.rb @@ -42,7 +42,9 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController end def update - @inbox.update!(permitted_params.except(:channel)) + inbox_params = permitted_params.except(:channel, :csat_config) + inbox_params[:csat_config] = format_csat_config(permitted_params[:csat_config]) if permitted_params[:csat_config].present? + @inbox.update!(inbox_params) update_inbox_working_hours update_channel if channel_update_required? end @@ -121,10 +123,22 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController @inbox.channel.save! end + def format_csat_config(config) + { + display_type: config['display_type'] || 'emoji', + message: config['message'] || '', + survey_rules: { + operator: config.dig('survey_rules', 'operator') || 'contains', + values: config.dig('survey_rules', 'values') || [] + } + } + end + def inbox_attributes [:name, :avatar, :greeting_enabled, :greeting_message, :enable_email_collect, :csat_survey_enabled, :enable_auto_assignment, :working_hours_enabled, :out_of_office_message, :timezone, :allow_messages_after_resolved, - :lock_to_single_conversation, :portal_id, :sender_name_type, :business_name] + :lock_to_single_conversation, :portal_id, :sender_name_type, :business_name, + { csat_config: [:display_type, :message, { survey_rules: [:operator, { values: [] }] }] }] end def permitted_params(channel_attributes = []) diff --git a/app/javascript/dashboard/components-next/filter/inputs/FilterSelect.vue b/app/javascript/dashboard/components-next/filter/inputs/FilterSelect.vue index db420920b..56bce8f9d 100644 --- a/app/javascript/dashboard/components-next/filter/inputs/FilterSelect.vue +++ b/app/javascript/dashboard/components-next/filter/inputs/FilterSelect.vue @@ -25,6 +25,10 @@ const props = defineProps({ type: String, default: 'faded', }, + label: { + type: String, + default: null, + }, }); const selected = defineModel({ @@ -56,7 +60,7 @@ const updateSelected = newValue => { :variant :icon="iconToRender" :trailing-icon="selectedOption.icon ? false : true" - :label="hideLabel ? null : selectedOption.label" + :label="label || (hideLabel ? null : selectedOption.label)" @click="toggle" /> diff --git a/app/javascript/dashboard/components-next/message/bubbles/CSAT.vue b/app/javascript/dashboard/components-next/message/bubbles/CSAT.vue index 211840944..6f86bd868 100644 --- a/app/javascript/dashboard/components-next/message/bubbles/CSAT.vue +++ b/app/javascript/dashboard/components-next/message/bubbles/CSAT.vue @@ -2,10 +2,10 @@ import { computed } from 'vue'; import BaseBubble from './Base.vue'; import { useI18n } from 'vue-i18n'; -import { CSAT_RATINGS } from 'shared/constants/messages'; +import { CSAT_RATINGS, CSAT_DISPLAY_TYPES } from 'shared/constants/messages'; import { useMessageContext } from '../provider.js'; -const { contentAttributes } = useMessageContext(); +const { contentAttributes, content } = useMessageContext(); const { t } = useI18n(); const response = computed(() => { @@ -16,6 +16,14 @@ 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( @@ -25,16 +33,33 @@ const rating = computed(() => { return null; }); + +const starRatingValue = computed(() => { + return response.value.rating || 0; +});