diff --git a/src/components/AppNavigation/GroupNavigationItem.vue b/src/components/AppNavigation/GroupNavigationItem.vue index 162728691b..9eaf91c300 100644 --- a/src/components/AppNavigation/GroupNavigationItem.vue +++ b/src/components/AppNavigation/GroupNavigationItem.vue @@ -163,19 +163,22 @@ export default { async onDrop(event, group) { try { const contactFromDropData = JSON.parse(event.dataTransfer.getData('item')) - const contactFromStore = this.$store.getters.getContact(Buffer.from(`${contactFromDropData.uid}~${contactFromDropData.addressbookId}`, 'utf-8').toString('base64')) - if (contactFromStore && !this.isInGroup(contactFromStore.groups, group.id)) { - const contact = this.$store.getters.getContact(Buffer.from(`${contactFromDropData.uid}~${contactFromDropData.addressbookId}`, 'utf-8').toString('base64')) + const contactId = Buffer.from(`${contactFromDropData.uid}~${contactFromDropData.addressbookId}`, 'utf-8').toString('base64') + let contact = this.$store.getters.getContact(contactId) + if (!contact) { + return + } + + await this.$store.dispatch('fetchFullContact', { contact }) + contact = this.$store.getters.getContact(contactId) + + if (!this.isInGroup(contact.groups, group.id)) { + contact.groups = [...contact.groups, group.name] await this.$store.dispatch('updateContactGroups', { - groupNames: [...contactFromStore.groups, group.name], + groupNames: contact.groups, contact, }) - const localContact = Object.assign( - Object.create(Object.getPrototypeOf(contact)), - contact, - ) - localContact.groups = [...contactFromStore.groups, group.name] - await this.$store.dispatch('updateContact', localContact) + await this.$store.dispatch('updateContact', contact) } } catch (e) { console.error(e) diff --git a/tests/javascript/models/contact.test.js b/tests/javascript/models/contact.test.js index c4c429e46a..53c26b13b4 100644 --- a/tests/javascript/models/contact.test.js +++ b/tests/javascript/models/contact.test.js @@ -60,3 +60,37 @@ describe('Test stripping quotes from TYPE', () => { }) }) + +describe('Test groups setter', () => { + + let contact + + beforeEach(() => { + contact = new Contact( + 'BEGIN:VCARD\nVERSION:3.0\nUID:123456789-123465-123456-123456789\nFN:Test contact\nEND:VCARD', + ) + }) + + test('groups setter updates jCal so the group is included in serialization', () => { + contact.groups = ['Friends'] + + expect(contact.groups).toEqual(['Friends']) + expect(contact.vCard.toString()).toContain('CATEGORIES:Friends') + }) + + test('groups setter replaces existing groups', () => { + contact.groups = ['OldGroup'] + contact.groups = ['NewGroup'] + + expect(contact.groups).toEqual(['NewGroup']) + }) + + test('groups setter with empty array removes categories property', () => { + contact.groups = ['SomeGroup'] + contact.groups = [] + + expect(contact.groups).toEqual([]) + expect(contact.vCard.hasProperty('categories')).toBe(false) + }) + +}) \ No newline at end of file