From 8f532f45ff77382bc65672f85e10f73878f5150c Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Wed, 6 May 2026 15:13:51 +0530
Subject: [PATCH] feat: add attachments section to conversation sidebar
(#14371)
---
.../conversation/components/GalleryView.vue | 6 +
.../dashboard/composables/useUISettings.js | 1 +
.../i18n/locale/en/conversation.json | 14 +-
.../dashboard/conversation/ContactPanel.vue | 13 +
.../dashboard/conversation/SharedFiles.vue | 421 ++++++++++++++++++
.../store/modules/conversations/getters.js | 2 +
.../specs/conversations/getters.spec.js | 25 ++
.../conversations/attachments.json.jbuilder | 1 +
.../accounts/conversations_controller_spec.rb | 2 +
9 files changed, 484 insertions(+), 1 deletion(-)
create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/SharedFiles.vue
diff --git a/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue b/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue
index aa17dabf9..6b356f4d3 100644
--- a/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/components/GalleryView.vue
@@ -22,6 +22,10 @@ const props = defineProps({
type: Array,
required: true,
},
+ autoPlay: {
+ type: Boolean,
+ default: false,
+ },
});
const emit = defineEmits(['close']);
@@ -309,6 +313,7 @@ onMounted(() => {
:src="activeAttachment.data_url"
controls
playsInline
+ :autoplay="autoPlay"
class="max-h-full max-w-full object-contain"
@click.stop
/>
@@ -317,6 +322,7 @@ onMounted(() => {
v-if="isAudio"
:key="activeAttachment.message_id"
controls
+ :autoplay="autoPlay"
class="w-full max-w-md"
@click.stop
>
diff --git a/app/javascript/dashboard/composables/useUISettings.js b/app/javascript/dashboard/composables/useUISettings.js
index 9f1943414..4f015e1d8 100644
--- a/app/javascript/dashboard/composables/useUISettings.js
+++ b/app/javascript/dashboard/composables/useUISettings.js
@@ -7,6 +7,7 @@ export const DEFAULT_CONVERSATION_SIDEBAR_ITEMS_ORDER = Object.freeze([
{ name: 'conversation_info' },
{ name: 'contact_attributes' },
{ name: 'contact_notes' },
+ { name: 'shared_files' },
{ name: 'previous_conversation' },
{ name: 'conversation_participants' },
{ name: 'linear_issues' },
diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json
index 88e66ebe3..2dc3ed70e 100644
--- a/app/javascript/dashboard/i18n/locale/en/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/en/conversation.json
@@ -365,7 +365,19 @@
"PREVIOUS_CONVERSATION": "Previous Conversations",
"MACROS": "Macros",
"LINEAR_ISSUES": "Linked Linear Issues",
- "SHOPIFY_ORDERS": "Shopify Orders"
+ "SHOPIFY_ORDERS": "Shopify Orders",
+ "SHARED_FILES": "Attachments"
+ },
+ "SHARED_FILES": {
+ "EMPTY": "No attachments yet",
+ "DOWNLOAD": "Download file",
+ "DOWNLOAD_ERROR": "Could not download the file. Please try again.",
+ "MEDIA_HEADING": "Media",
+ "FILES_HEADING": "Files",
+ "VIEW_ALL": "View all",
+ "SHOW_LESS": "Show less",
+ "MORE_COUNT": "+{count}",
+ "UNTITLED_FILE": "Untitled file"
},
"SHOPIFY": {
"ORDER_ID": "Order #{id}",
diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
index 653b43840..fe95f9e99 100644
--- a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
+++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
@@ -17,6 +17,7 @@ import ContactInfo from './contact/ContactInfo.vue';
import ContactNotes from './contact/ContactNotes.vue';
import ConversationInfo from './ConversationInfo.vue';
import CustomAttributes from './customAttributes/CustomAttributes.vue';
+import SharedFiles from './SharedFiles.vue';
import Draggable from 'vuedraggable';
import MacrosList from './Macros/List.vue';
import ShopifyOrdersList from 'dashboard/components/widgets/conversation/ShopifyOrdersList.vue';
@@ -297,6 +298,18 @@ onMounted(() => {
+ {{ t('CONVERSATION_SIDEBAR.SHARED_FILES.EMPTY') }} +
+ +