diff --git a/app/javascript/dashboard/mixins/attributeMixin.js b/app/javascript/dashboard/mixins/attributeMixin.js
deleted file mode 100644
index 5bc05a4ae..000000000
--- a/app/javascript/dashboard/mixins/attributeMixin.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { mapGetters } from 'vuex';
-import { isValidURL } from '../helper/URLHelper';
-export default {
- computed: {
- ...mapGetters({
- currentChat: 'getSelectedChat',
- accountId: 'getCurrentAccountId',
- }),
- attributes() {
- return this.$store.getters['attributes/getAttributesByModel'](
- this.attributeType
- );
- },
- customAttributes() {
- if (this.attributeType === 'conversation_attribute')
- return this.currentChat.custom_attributes || {};
- return this.contact.custom_attributes || {};
- },
- contactIdentifier() {
- return (
- this.currentChat.meta?.sender?.id ||
- this.$route.params.contactId ||
- this.contactId
- );
- },
- contact() {
- return this.$store.getters['contacts/getContact'](this.contactIdentifier);
- },
- conversationId() {
- return this.currentChat.id;
- },
- },
- methods: {
- isAttributeNumber(attributeValue) {
- return (
- Number.isInteger(Number(attributeValue)) && Number(attributeValue) > 0
- );
- },
- attributeDisplayType(attributeValue) {
- if (this.isAttributeNumber(attributeValue)) {
- return 'number';
- }
- if (isValidURL(attributeValue)) {
- return 'link';
- }
- return 'text';
- },
- },
-};
diff --git a/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js b/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js
deleted file mode 100644
index 2484cad4b..000000000
--- a/app/javascript/dashboard/mixins/specs/attributeMixin.spec.js
+++ /dev/null
@@ -1,145 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import attributeMixin from '../attributeMixin';
-import Vuex from 'vuex';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('attributeMixin', () => {
- let getters;
- let actions;
- let store;
-
- beforeEach(() => {
- actions = { updateUISettings: vi.fn(), toggleSidebarUIState: vi.fn() };
- getters = {
- getSelectedChat: () => ({
- id: 7165,
- custom_attributes: {
- product_id: 2021,
- },
- meta: {
- sender: {
- id: 1212,
- },
- },
- }),
- getCurrentAccountId: () => 1,
- attributeType: () => 'conversation_attribute',
- };
- store = new Vuex.Store({ actions, getters });
- });
-
- it('returns currently selected conversation id', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.conversationId).toEqual(7165);
- });
-
- it('return display type if attribute passed', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.attributeDisplayType('date')).toBe('text');
- expect(
- wrapper.vm.attributeDisplayType('https://www.chatwoot.com/pricing')
- ).toBe('link');
- expect(wrapper.vm.attributeDisplayType(9988)).toBe('number');
- });
-
- it('return true if number is passed', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.isAttributeNumber(9988)).toBe(true);
- });
-
- it('returns currently selected contact', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- computed: {
- contact() {
- return {
- id: 7165,
- custom_attributes: {
- product_id: 2021,
- },
- };
- },
- },
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.contact).toEqual({
- id: 7165,
- custom_attributes: {
- product_id: 2021,
- },
- });
- });
-
- it('returns currently selected contact id', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.contactIdentifier).toEqual(1212);
- });
-
- it('returns currently selected conversation custom attributes', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- computed: {
- contact() {
- return {
- id: 7165,
- custom_attributes: {
- product_id: 2021,
- },
- };
- },
- },
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.customAttributes).toEqual({
- product_id: 2021,
- });
- });
-
- it('returns currently selected contact custom attributes', () => {
- const Component = {
- render() {},
- title: 'TestComponent',
- mixins: [attributeMixin],
- computed: {
- contact() {
- return {
- id: 7165,
- custom_attributes: {
- cloudCustomer: true,
- },
- };
- },
- },
- };
- const wrapper = shallowMount(Component, { store, localVue });
- expect(wrapper.vm.customAttributes).toEqual({
- cloudCustomer: true,
- });
- });
-});
diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue
index 3b0133048..0c9a1ec5b 100644
--- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue
+++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactInfoPanel.vue
@@ -115,13 +115,11 @@ export default {
diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
index ff61d994d..8d82e5465 100644
--- a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
+++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue
@@ -218,8 +218,6 @@ export default {
>
-
-
+
- {{ referer }}
-
-
+
+ {{ referer }}
+
+
+
-
-
diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue
index 86ef0f91e..3c127b857 100644
--- a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue
+++ b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue
@@ -1,153 +1,187 @@
-
+
-