From 42548dc24c9de8c72950b993142e9984185cfafc Mon Sep 17 00:00:00 2001
From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Date: Fri, 16 May 2025 15:22:18 +0530
Subject: [PATCH] fix: Issues with custom attributes in conversation sidebar
(#11476)
# Pull Request Template
## Description
This PR fixes,
1. Fix display issue where the attribute value `0` was not shown for
attributes of type "number" and instead displayed as `"---"`
2. Fix issue where the copy and delete buttons were not visible when the
attribute value was `0`
3. Fix an issue with updating contact custom attributes in the
conversation sidebar (caused by the camelCase param key mismatch in
`contacts/update`; only reproducible for attributes type "date")
4. Ensure the delete button is shown for checkbox-type attributes, even
when the value is `true` or `false` (previously hidden when the value
was `false`, despite the key being present)
Fixes
[CW-4326](https://linear.app/chatwoot/issue/CW-4326/custom-attribute-with-value-0-not-displayed-correctly-in-chatwoot)
https://github.com/chatwoot/chatwoot/issues/11459
## Type of change
- [x] Bug fix (non-breaking change which fixes an issue)
## How Has This Been Tested?
### Loom video
https://www.loom.com/share/77257dc09a37452bab7876d1554b8a03?sid=dc5635eb-4fe0-4f39-8da2-036d71649ffc
## 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
- [ ] 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: Muhsin Keloth
---
.../dashboard/components/CustomAttribute.vue | 13 ++++++++-----
.../customAttributes/CustomAttributes.vue | 10 +++-------
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/app/javascript/dashboard/components/CustomAttribute.vue b/app/javascript/dashboard/components/CustomAttribute.vue
index a6bbbcf18..8f70a9fa2 100644
--- a/app/javascript/dashboard/components/CustomAttribute.vue
+++ b/app/javascript/dashboard/components/CustomAttribute.vue
@@ -49,12 +49,12 @@ export default {
if (this.isAttributeTypeDate) {
return this.value
? new Date(this.value || new Date()).toLocaleDateString()
- : '';
+ : '---';
}
if (this.isAttributeTypeCheckbox) {
return this.value === 'false' ? false : this.value;
}
- return this.value;
+ return this.hasValue ? this.value : '---';
},
formattedValue() {
return this.isAttributeTypeDate
@@ -83,6 +83,9 @@ export default {
isAttributeTypeDate() {
return this.attributeType === 'date';
},
+ hasValue() {
+ return this.value !== null && this.value !== '';
+ },
urlValue() {
return isValidURL(this.value) ? this.value : '---';
},
@@ -223,7 +226,7 @@ export default {
/>
- {{ displayValue || '---' }}
+ {{ displayValue }}
customAttributes.value,
attribute.attribute_key
);
- const isCheckbox = attribute.attribute_display_type === 'checkbox';
- const defaultValue = isCheckbox ? false : '';
return {
...attribute,
type: 'custom_attribute',
key: attribute.attribute_key,
- // Set value from customAttributes if it exists, otherwise use default value
- value: hasValue
- ? customAttributes.value[attribute.attribute_key]
- : defaultValue,
+ // Set value from customAttributes if it exists, otherwise use ''
+ value: hasValue ? customAttributes.value[attribute.attribute_key] : '',
};
})
);
@@ -215,7 +211,7 @@ const onUpdate = async (key, value) => {
} else {
store.dispatch('contacts/update', {
id: props.contactId,
- custom_attributes: updatedAttributes,
+ customAttributes: updatedAttributes,
});
}
useAlert(t('CUSTOM_ATTRIBUTES.FORM.UPDATE.SUCCESS'));