-import { mapGetters } from 'vuex';
-import Avatar from 'next/avatar/Avatar.vue';
-import Spinner from 'shared/components/Spinner.vue';
-import NextButton from 'dashboard/components-next/button/Button.vue';
-
-export default {
- components: {
- Avatar,
- Spinner,
- NextButton,
- },
- props: {
- selectedInboxes: {
- type: Array,
- default: () => [],
- },
- conversationCount: {
- type: Number,
- default: 0,
- },
- },
- emits: ['select', 'close'],
- data() {
- return {
- query: '',
- selectedAgent: null,
- goBackToAgentList: false,
- };
- },
- computed: {
- ...mapGetters({
- uiFlags: 'bulkActions/getUIFlags',
- assignableAgentsUiFlags: 'inboxAssignableAgents/getUIFlags',
- }),
- filteredAgents() {
- if (this.query) {
- return this.assignableAgents.filter(agent =>
- agent.name.toLowerCase().includes(this.query.toLowerCase())
- );
- }
- return [
- {
- confirmed: true,
- name: 'None',
- id: null,
- role: 'agent',
- account_id: 0,
- email: 'None',
- },
- ...this.assignableAgents,
- ];
- },
- assignableAgents() {
- return this.$store.getters['inboxAssignableAgents/getAssignableAgents'](
- this.selectedInboxes.join(',')
- );
- },
- conversationLabel() {
- return this.conversationCount > 1 ? 'conversations' : 'conversation';
- },
- },
- mounted() {
- this.$store.dispatch('inboxAssignableAgents/fetch', this.selectedInboxes);
- },
- methods: {
- submit() {
- this.$emit('select', this.selectedAgent);
- },
- goBack() {
- this.goBackToAgentList = true;
- this.selectedAgent = null;
- },
- assignAgent(agent) {
- this.selectedAgent = agent;
- },
- onClose() {
- this.$emit('close');
- },
- onCloseAgentList() {
- if (this.selectedAgent === null && !this.goBackToAgentList) {
- this.onClose();
- }
- this.goBackToAgentList = false;
- },
- },
-};
-
-
-
-
-
-
-
-
-
-
{{ $t('BULK_ACTION.AGENT_LIST_LOADING') }}
-
-
-
- -
-
-
-
-
-
- -
-
-
-
- {{ agent.name }}
-
-
-
-
-
-
- {{
- $t('BULK_ACTION.ASSIGN_CONFIRMATION_LABEL', {
- conversationCount,
- conversationLabel,
- })
- }}
-
- {{ selectedAgent.name }}
-
- ?
-
-
- {{
- $t('BULK_ACTION.UNASSIGN_CONFIRMATION_LABEL', {
- conversationCount,
- conversationLabel,
- })
- }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkAgentActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkAgentActions.vue
new file mode 100644
index 000000000..519a77d76
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkAgentActions.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.conversationCount }}
+
+
+
+
+ {{ selectedAgent.name }}
+
+
+
+
+
+
+ {{ props.conversationCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkLabelActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkLabelActions.vue
new file mode 100644
index 000000000..afbf1c82e
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkLabelActions.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+ toggleLabelSelection(item.value)"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkTeamActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkTeamActions.vue
new file mode 100644
index 000000000..511706f1b
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkTeamActions.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.conversationCount }}
+
+
+
+
+ {{ selectedTeam.name }}
+
+
+
+
+
+
+ {{ props.conversationCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkUpdateActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkUpdateActions.vue
new file mode 100644
index 000000000..042a304df
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/BulkUpdateActions.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/Index.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/Index.vue
index 9a245ec8c..1a4ccde0f 100644
--- a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/Index.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/Index.vue
@@ -1,7 +1,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('BULK_ACTION.ALL_CONVERSATIONS_SELECTED_ALERT') }}
-
-
+
-
-
-
+
+ {{ $t('BULK_ACTION.ALL_CONVERSATIONS_SELECTED_ALERT') }}
+
+
+
+
+
+
+
-
-
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue
deleted file mode 100644
index f76cdb190..000000000
--- a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/LabelActions.vue
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
-
-
-
-
- {{
- t('BULK_ACTION.LABELS.ASSIGN_LABELS')
- }}
-
-
-
-
-
-
- {{
- t('CONTACTS_BULK_ACTIONS.NO_LABELS_FOUND')
- }}
-
-
-
-
-
-
-
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/TeamActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/TeamActions.vue
deleted file mode 100644
index 2bb6bd893..000000000
--- a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/TeamActions.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/UpdateActions.vue b/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/UpdateActions.vue
deleted file mode 100644
index e3280c5af..000000000
--- a/app/javascript/dashboard/components/widgets/conversation/conversationBulkActions/UpdateActions.vue
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
-
-
-
-
- {{ $t('BULK_ACTION.UPDATE.CHANGE_STATUS') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/javascript/dashboard/composables/chatlist/useBulkActions.js b/app/javascript/dashboard/composables/chatlist/useBulkActions.js
index 45421b978..090632e9d 100644
--- a/app/javascript/dashboard/composables/chatlist/useBulkActions.js
+++ b/app/javascript/dashboard/composables/chatlist/useBulkActions.js
@@ -23,9 +23,15 @@ export function useBulkActions() {
function deSelectConversation(conversationId, inboxId) {
store.dispatch('bulkActions/removeSelectedConversationIds', conversationId);
- selectedInboxes.value = selectedInboxes.value.filter(
- item => item !== inboxId
- );
+ // Only remove one instance of the inboxId, not all
+ // This handles the case where multiple conversations from the same inbox are selected
+ const index = selectedInboxes.value.indexOf(inboxId);
+ if (index > -1) {
+ selectedInboxes.value = [
+ ...selectedInboxes.value.slice(0, index),
+ ...selectedInboxes.value.slice(index + 1),
+ ];
+ }
}
function resetBulkActions() {
diff --git a/app/javascript/dashboard/constants/globals.js b/app/javascript/dashboard/constants/globals.js
index eb42a270f..b57ee5df0 100644
--- a/app/javascript/dashboard/constants/globals.js
+++ b/app/javascript/dashboard/constants/globals.js
@@ -39,6 +39,7 @@ export default {
WHATSAPP_EMBEDDED_SIGNUP_DOCS_URL:
'https://developers.facebook.com/docs/whatsapp/embedded-signup/custom-flows/onboarding-business-app-users#limitations',
SMALL_SCREEN_BREAKPOINT: 768,
+ LARGE_SCREEN_BREAKPOINT: 1024,
AVAILABILITY_STATUS_KEYS: ['online', 'busy', 'offline'],
SNOOZE_OPTIONS: {
UNTIL_NEXT_REPLY: 'until_next_reply',
diff --git a/app/javascript/dashboard/i18n/locale/en/advancedFilters.json b/app/javascript/dashboard/i18n/locale/en/advancedFilters.json
index a991cb25b..0273ea3b4 100644
--- a/app/javascript/dashboard/i18n/locale/en/advancedFilters.json
+++ b/app/javascript/dashboard/i18n/locale/en/advancedFilters.json
@@ -75,6 +75,11 @@
"ADDITIONAL_FILTERS": "Additional filters",
"CUSTOM_ATTRIBUTES": "Custom attributes"
},
+ "ACTIVE_FILTERS": {
+ "MORE_FILTERS": "+ {count} more filters",
+ "CLEAR_FILTERS": "Clear filters",
+ "EDIT_BUTTON": "Edit"
+ },
"CUSTOM_VIEWS": {
"ADD": {
"TITLE": "Do you want to save this filter?",
@@ -95,8 +100,9 @@
"EDIT": {
"EDIT_BUTTON": "Edit folder"
},
+ "SAVE_VIEW": "Save View",
"DELETE": {
- "DELETE_BUTTON": "Delete filter",
+ "DELETE_BUTTON": "Delete",
"MODAL": {
"CONFIRM": {
"TITLE": "Confirm deletion",
diff --git a/app/javascript/dashboard/i18n/locale/en/bulkActions.json b/app/javascript/dashboard/i18n/locale/en/bulkActions.json
index d736201de..40d6a60fb 100644
--- a/app/javascript/dashboard/i18n/locale/en/bulkActions.json
+++ b/app/javascript/dashboard/i18n/locale/en/bulkActions.json
@@ -1,12 +1,14 @@
{
"BULK_ACTION": {
- "CONVERSATIONS_SELECTED": "{conversationCount} conversations selected",
+ "CONVERSATIONS_SELECTED": "{conversationCount} selected",
"AGENT_SELECT_LABEL": "Select agent",
- "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {conversationCount} {conversationLabel} to",
- "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {conversationCount} {conversationLabel}?",
+ "CLEAR_SELECTION": "Clear",
+ "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {n} conversation to {agentName}? | Are you sure to assign {n} conversations to {agentName}?",
+ "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {n} conversation? | Are you sure to unassign {n} conversations?",
"GO_BACK_LABEL": "Go back",
"ASSIGN_LABEL": "Assign",
"YES": "Yes",
+ "CANCEL": "Cancel",
"SEARCH_INPUT_PLACEHOLDER": "Search",
"ASSIGN_AGENT_TOOLTIP": "Assign agent",
"ASSIGN_TEAM_TOOLTIP": "Assign team",
@@ -38,6 +40,8 @@
"NONE": "None",
"NO_TEAMS_AVAILABLE": "There are no teams added to this account yet.",
"ASSIGN_SELECTED_TEAMS": "Assign selected team.",
+ "ASSIGN_CONFIRMATION_LABEL": "Are you sure to assign {n} conversation to {teamName}? | Are you sure to assign {n} conversations to {teamName}?",
+ "UNASSIGN_CONFIRMATION_LABEL": "Are you sure to unassign {n} conversation? | Are you sure to unassign {n} conversations?",
"ASSIGN_SUCCESFUL": "Teams assigned successfully.",
"ASSIGN_FAILED": "Failed to assign team. Please try again."
}
diff --git a/app/javascript/dashboard/i18n/locale/en/chatlist.json b/app/javascript/dashboard/i18n/locale/en/chatlist.json
index 92e67635b..996d86e46 100644
--- a/app/javascript/dashboard/i18n/locale/en/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/en/chatlist.json
@@ -2,7 +2,7 @@
"CHAT_LIST": {
"LOADING": "Fetching conversations",
"LOAD_MORE_CONVERSATIONS": "Load more conversations",
- "EOF": "All conversations loaded 🎉",
+ "EOF": "All conversations loaded",
"LIST": {
"404": "There are no active conversations in this group."
},
diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json
index 951a46993..e19c22c6b 100644
--- a/app/javascript/dashboard/i18n/locale/en/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/en/conversation.json
@@ -71,7 +71,8 @@
"REPLY_MESSAGE_NOT_FOUND": "Message not available",
"CARD": {
"SHOW_LABELS": "Show labels",
- "HIDE_LABELS": "Hide labels"
+ "HIDE_LABELS": "Hide labels",
+ "LABELS_COUNT": "{count} labels"
},
"VOICE_CALL": {
"INCOMING_CALL": "Incoming call",
diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsBulkActionBar.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsBulkActionBar.vue
index e56a2dda7..077fa5f23 100644
--- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsBulkActionBar.vue
+++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsBulkActionBar.vue
@@ -1,11 +1,10 @@
@@ -107,56 +94,33 @@ const handleAssignLabels = labels => {
-
-
-
-
-
-
+
+
diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ConversationView.vue b/app/javascript/dashboard/routes/dashboard/conversation/ConversationView.vue
index a1534a772..b9ca030e8 100644
--- a/app/javascript/dashboard/routes/dashboard/conversation/ConversationView.vue
+++ b/app/javascript/dashboard/routes/dashboard/conversation/ConversationView.vue
@@ -1,9 +1,12 @@
-
diff --git a/app/javascript/dashboard/routes/dashboard/conversation/search/SwitchLayout.vue b/app/javascript/dashboard/routes/dashboard/conversation/search/SwitchLayout.vue
index 96238c296..30ac53d04 100644
--- a/app/javascript/dashboard/routes/dashboard/conversation/search/SwitchLayout.vue
+++ b/app/javascript/dashboard/routes/dashboard/conversation/search/SwitchLayout.vue
@@ -23,15 +23,15 @@ export default {
diff --git a/app/javascript/shared/composables/specs/useNumberFormatter.spec.js b/app/javascript/shared/composables/specs/useNumberFormatter.spec.js
index 3a9b8d41b..da91124d8 100644
--- a/app/javascript/shared/composables/specs/useNumberFormatter.spec.js
+++ b/app/javascript/shared/composables/specs/useNumberFormatter.spec.js
@@ -361,4 +361,77 @@ describe('useNumberFormatter', () => {
expect(result).toMatch(/1[.,\s]000[.,\s]000/);
});
});
+
+ describe('formatCompactWithDecimal', () => {
+ it('should return exact numbers for values under 1,000', () => {
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(0)).toBe('0');
+ expect(formatCompactWithDecimal(1)).toBe('1');
+ expect(formatCompactWithDecimal(42)).toBe('42');
+ expect(formatCompactWithDecimal(999)).toBe('999');
+ });
+
+ it('should return compact format with decimals for thousands', () => {
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(1000)).toBe('1K');
+ expect(formatCompactWithDecimal(1500)).toBe('1.5K');
+ expect(formatCompactWithDecimal(29400)).toBe('29.4K');
+ expect(formatCompactWithDecimal(15000)).toBe('15K');
+ expect(formatCompactWithDecimal(15500)).toBe('15.5K');
+ });
+
+ it('should return compact format with decimals for millions', () => {
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(1000000)).toBe('1M');
+ expect(formatCompactWithDecimal(1200000)).toBe('1.2M');
+ expect(formatCompactWithDecimal(1234000)).toBe('1.2M');
+ expect(formatCompactWithDecimal(2500000)).toBe('2.5M');
+ expect(formatCompactWithDecimal(10000000)).toBe('10M');
+ });
+
+ it('should handle edge cases gracefully', () => {
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(null)).toBe('0');
+ expect(formatCompactWithDecimal(undefined)).toBe('0');
+ expect(formatCompactWithDecimal(NaN)).toBe('0');
+ expect(formatCompactWithDecimal('string')).toBe('0');
+ });
+
+ it('should handle negative numbers', () => {
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(-500)).toBe('-500');
+ expect(formatCompactWithDecimal(-1500)).toBe('-1.5K');
+ expect(formatCompactWithDecimal(-29400)).toBe('-29.4K');
+ expect(formatCompactWithDecimal(-1200000)).toBe('-1.2M');
+ });
+
+ it('should respect custom decimal places', () => {
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(1234, 2)).toBe('1.23K');
+ expect(formatCompactWithDecimal(1234567, 2)).toBe('1.23M');
+ });
+
+ it('should format with de-DE locale', () => {
+ const mockLocale = ref('de-DE');
+ vi.mocked(useI18n).mockReturnValue({ locale: mockLocale });
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ // German uses different compact notation
+ const result = formatCompactWithDecimal(29400);
+ expect(result).toMatch(/29[,.]?4/);
+ });
+
+ it('should handle underscore-based locale tags', () => {
+ const mockLocale = ref('en_US');
+ vi.mocked(useI18n).mockReturnValue({ locale: mockLocale });
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(29400)).toBe('29.4K');
+ });
+
+ it('should handle null/undefined locale gracefully', () => {
+ const mockLocale = ref(null);
+ vi.mocked(useI18n).mockReturnValue({ locale: mockLocale });
+ const { formatCompactWithDecimal } = useNumberFormatter();
+ expect(formatCompactWithDecimal(29400)).toBe('29.4K');
+ });
+ });
});
diff --git a/app/javascript/shared/composables/useNumberFormatter.js b/app/javascript/shared/composables/useNumberFormatter.js
index 54ded0e93..dde0b2987 100644
--- a/app/javascript/shared/composables/useNumberFormatter.js
+++ b/app/javascript/shared/composables/useNumberFormatter.js
@@ -60,8 +60,37 @@ export function useNumberFormatter() {
return new Intl.NumberFormat(resolvedLocale.value).format(num);
};
+ /**
+ * Format a number with decimal precision using compact notation (standard Intl approach)
+ * - Up to 1,000: show exact number (e.g., 999)
+ * - 1,000+: show compact with decimals (e.g., 29400 → "29.4K", 1500 → "1.5K")
+ * - 1,000,000+: show as "X.XM" (e.g., 1,234,000 → "1.2M")
+ *
+ * Uses browser-native Intl.NumberFormat for proper localization
+ *
+ * @param {number} num - The number to format
+ * @param {number} [decimals=1] - Maximum decimal places to show
+ * @returns {string} Formatted number string with decimal precision
+ */
+ const formatCompactWithDecimal = (num, decimals = 1) => {
+ if (typeof num !== 'number' || Number.isNaN(num)) {
+ return '0';
+ }
+
+ if (Math.abs(num) < 1000) {
+ return new Intl.NumberFormat(resolvedLocale.value).format(num);
+ }
+
+ return new Intl.NumberFormat(resolvedLocale.value, {
+ notation: 'compact',
+ compactDisplay: 'short',
+ maximumFractionDigits: decimals,
+ }).format(num);
+ };
+
return {
formatCompactNumber,
formatFullNumber,
+ formatCompactWithDecimal,
};
}
diff --git a/package.json b/package.json
index e36b2f53f..7457a8fef 100644
--- a/package.json
+++ b/package.json
@@ -95,6 +95,7 @@
"video.js": "7.18.1",
"videojs-record": "4.5.0",
"videojs-wavesurfer": "3.8.0",
+ "virtua": "^0.48.6",
"vue": "^3.5.12",
"vue-chartjs": "5.3.1",
"vue-datepicker-next": "^1.0.3",
@@ -103,7 +104,6 @@
"vue-letter": "^0.2.1",
"vue-router": "~4.4.5",
"vue-upload-component": "^3.1.17",
- "vue-virtual-scroller": "^2.0.0-beta.8",
"vue3-click-away": "^1.2.4",
"vuedraggable": "^4.1.0",
"vuex": "~4.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e880b4aaf..ca97c6ae7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -205,6 +205,9 @@ importers:
videojs-wavesurfer:
specifier: 3.8.0
version: 3.8.0
+ virtua:
+ specifier: ^0.48.6
+ version: 0.48.6(vue@3.5.12(typescript@5.6.2))
vue:
specifier: ^3.5.12
version: 3.5.12(typescript@5.6.2)
@@ -229,9 +232,6 @@ importers:
vue-upload-component:
specifier: ^3.1.17
version: 3.1.17
- vue-virtual-scroller:
- specifier: ^2.0.0-beta.8
- version: 2.0.0-beta.8(vue@3.5.12(typescript@5.6.2))
vue3-click-away:
specifier: ^1.2.4
version: 1.2.4
@@ -3305,9 +3305,6 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- mitt@2.1.0:
- resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==}
-
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
@@ -4511,6 +4508,26 @@ packages:
videojs-wavesurfer@3.8.0:
resolution: {integrity: sha512-qHucCBiEW+4dZ0Zp1k4R1elprUOV+QDw87UDA9QRXtO7GK/MrSdoe/TMFxP9SLnJCiX9xnYdf4OQgrmvJ9UVVw==}
+ virtua@0.48.6:
+ resolution: {integrity: sha512-Cl4uMvMV5c9RuOy9zhkFMYwx/V4YLBMYLRSWkO8J46opQZ3P7KMq0CqCVOOAKUckjl/r//D2jWTBGYWzmgtzrQ==}
+ peerDependencies:
+ react: '>=16.14.0'
+ react-dom: '>=16.14.0'
+ solid-js: '>=1.0'
+ svelte: '>=5.0'
+ vue: '>=3.2'
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ solid-js:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+
vite-node@2.0.1:
resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -4625,11 +4642,6 @@ packages:
vue-letter@0.2.1:
resolution: {integrity: sha512-IYWp47XUikjKfEniWYlFxeJFKABZwAE5IEjz866qCBytBr2dzqVDdjoMDpBP//krxkzN/QZYyHe6C09y/IODYg==}
- vue-observe-visibility@2.0.0-alpha.1:
- resolution: {integrity: sha512-flFbp/gs9pZniXR6fans8smv1kDScJ8RS7rEpMjhVabiKeq7Qz3D9+eGsypncjfIyyU84saU88XZ0zjbD6Gq/g==}
- peerDependencies:
- vue: ^3.0.0
-
vue-resize@2.0.0-alpha.1:
resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==}
peerDependencies:
@@ -4643,11 +4655,6 @@ packages:
vue-upload-component@3.1.17:
resolution: {integrity: sha512-1orTC5apoFzBz4ku2HAydpviaAOck+ABc83rGypIK/Bgl+TqhtoWsQOhXqbb7vDv7pKlvRVWwml9PM224HyhkA==}
- vue-virtual-scroller@2.0.0-beta.8:
- resolution: {integrity: sha512-b8/f5NQ5nIEBRTNi6GcPItE4s7kxNHw2AIHLtDp+2QvqdTjVN0FgONwX9cr53jWRgnu+HRLPaWDOR2JPI5MTfQ==}
- peerDependencies:
- vue: ^3.2.0
-
vue3-click-away@1.2.4:
resolution: {integrity: sha512-O9Z2KlvIhJT8OxaFy04eiZE9rc1Mk/bp+70dLok68ko3Kr8AW5dU+j8avSk4GDQu94FllSr4m5ul4BpzlKOw1A==}
@@ -8226,8 +8233,6 @@ snapshots:
minipass@7.1.2: {}
- mitt@2.1.0: {}
-
mitt@3.0.1: {}
mlly@1.8.0:
@@ -9574,6 +9579,10 @@ snapshots:
video.js: 7.18.1
wavesurfer.js: 7.8.6
+ virtua@0.48.6(vue@3.5.12(typescript@5.6.2)):
+ optionalDependencies:
+ vue: 3.5.12(typescript@5.6.2)
+
vite-node@2.0.1(@types/node@22.7.0)(sass@1.79.3)(terser@5.33.0):
dependencies:
cac: 6.7.14
@@ -9692,10 +9701,6 @@ snapshots:
dependencies:
lettersanitizer: 1.0.6
- vue-observe-visibility@2.0.0-alpha.1(vue@3.5.12(typescript@5.6.2)):
- dependencies:
- vue: 3.5.12(typescript@5.6.2)
-
vue-resize@2.0.0-alpha.1(vue@3.5.12(typescript@5.6.2)):
dependencies:
vue: 3.5.12(typescript@5.6.2)
@@ -9707,13 +9712,6 @@ snapshots:
vue-upload-component@3.1.17: {}
- vue-virtual-scroller@2.0.0-beta.8(vue@3.5.12(typescript@5.6.2)):
- dependencies:
- mitt: 2.1.0
- vue: 3.5.12(typescript@5.6.2)
- vue-observe-visibility: 2.0.0-alpha.1(vue@3.5.12(typescript@5.6.2))
- vue-resize: 2.0.0-alpha.1(vue@3.5.12(typescript@5.6.2))
-
vue3-click-away@1.2.4: {}
vue@3.5.12(typescript@5.6.2):
diff --git a/theme/icons.js b/theme/icons.js
index 2931caf41..e72f3d8ba 100644
--- a/theme/icons.js
+++ b/theme/icons.js
@@ -148,6 +148,83 @@ export const icons = {
width: 7,
height: 11,
},
+ 'empty-assignee': {
+ body: `
+ `,
+ width: 24,
+ height: 24,
+ },
+ party: {
+ body: ``,
+ width: 16,
+ height: 16,
+ },
+ 'expand-list': {
+ body: ``,
+ width: 16,
+ height: 16,
+ },
+ hash: {
+ body: ``,
+ width: 14,
+ height: 14,
+ },
+
+ /** Conversation Status Starts */
+ 'status-empty': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'status-pending': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'status-open': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'status-snoozed': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'status-resolved': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ /** Ends */
+
+ /** Conversation Priority Starts */
+ 'priority-empty': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'priority-low': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'priority-medium': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'priority-high': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ 'priority-urgent': {
+ body: ``,
+ width: 24,
+ height: 24,
+ },
+ /** Ends */
/** Channels Starts */
website: {