diff --git a/frontend/src/modules/member/components/list/member-list-bulk-update-tags.vue b/frontend/src/modules/member/components/list/member-list-bulk-update-tags.vue
deleted file mode 100644
index 59b3dd0516..0000000000
--- a/frontend/src/modules/member/components/list/member-list-bulk-update-tags.vue
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
-
-
-
diff --git a/frontend/src/modules/member/components/list/member-list-table.vue b/frontend/src/modules/member/components/list/member-list-table.vue
index 0fd152ded4..8ce14c9382 100644
--- a/frontend/src/modules/member/components/list/member-list-table.vue
+++ b/frontend/src/modules/member/components/list/member-list-table.vue
@@ -354,7 +354,7 @@
}"
class="block"
>
-
+
@@ -391,7 +391,7 @@
-
+
@@ -431,7 +431,8 @@ const isTableHovered = ref(false);
const isCursorDown = ref(false);
const isMergeDialogOpen = ref(null);
-const isEditTagsDialogOpen = ref(null);
+const isEditTagsDialogOpen = ref(false);
+const editTagMember = ref(null);
const props = defineProps({
hasIntegrations: {
@@ -518,6 +519,11 @@ document.onmouseup = () => {
isCursorDown.value = false;
};
+function handleEditTagsDialog(member) {
+ isEditTagsDialogOpen.value = true;
+ editTagMember.value = member;
+}
+
function doChangeSort(sorter) {
filters.value.order = {
prop: sorter.prop,
diff --git a/frontend/src/modules/member/components/list/member-list-toolbar.vue b/frontend/src/modules/member/components/list/member-list-toolbar.vue
index 9137f08fe0..9d2777cc3b 100644
--- a/frontend/src/modules/member/components/list/member-list-toolbar.vue
+++ b/frontend/src/modules/member/components/list/member-list-toolbar.vue
@@ -95,10 +95,9 @@
-
+
+
@@ -120,7 +119,7 @@ import {
getEnrichmentMax,
showEnrichmentLoadingMessage,
} from '@/modules/member/member-enrichment';
-import AppMemberListBulkUpdateTags from '@/modules/member/components/list/member-list-bulk-update-tags.vue';
+import AppTagPopover from '@/modules/tag/components/tag-popover.vue';
import AppSvg from '@/shared/svg/svg.vue';
const { currentUser, currentTenant } = mapGetters('auth');
diff --git a/frontend/src/modules/member/components/view/member-view-header.vue b/frontend/src/modules/member/components/view/member-view-header.vue
index 4ab0576904..8e46f42c82 100644
--- a/frontend/src/modules/member/components/view/member-view-header.vue
+++ b/frontend/src/modules/member/components/view/member-view-header.vue
@@ -71,8 +71,8 @@
@@ -100,7 +100,7 @@ defineProps({
},
});
-const isEditTagsDialogOpen = ref(null);
+const isEditTagsDialogOpen = ref(false);
const formattedInformation = (value, type) => {
// Show dash for empty information
diff --git a/frontend/src/modules/member/store/actions.js b/frontend/src/modules/member/store/actions.js
index dc447e4d24..afd713fe12 100644
--- a/frontend/src/modules/member/store/actions.js
+++ b/frontend/src/modules/member/store/actions.js
@@ -109,9 +109,11 @@ export default {
return acc;
}, []);
const updatedMembers = await MemberService.updateBulk(payload);
+ Message.success('Tags updated successfully');
commit('BULK_UPDATE_MEMBERS_TAGS_SUCCESS', updatedMembers);
} catch (error) {
Errors.handle(error);
+ Message.error('There was an error updating tags');
}
},
diff --git a/frontend/src/modules/tag/components/tag-popover.vue b/frontend/src/modules/tag/components/tag-popover.vue
index f6fc2076b7..24f7f2545e 100644
--- a/frontend/src/modules/tag/components/tag-popover.vue
+++ b/frontend/src/modules/tag/components/tag-popover.vue
@@ -1,36 +1,18 @@
-
+
-
-
+
+
Cancel
-
+
Submit
@@ -42,9 +24,17 @@
import { MemberModel } from '@/modules/member/member-model';
import AppDialog from '@/shared/dialog/dialog.vue';
import AppTagAutocompleteInput from '@/modules/tag/components/tag-autocomplete-input.vue';
+import { FormSchema } from '@/shared/form/form-schema';
import { mapActions } from 'vuex';
+import { storeToRefs } from 'pinia';
+import { useMemberStore } from '@/modules/member/store/pinia';
+
+const memberStore = useMemberStore();
+const { selectedMembers } = storeToRefs(memberStore);
const { fields } = MemberModel;
+const formSchema = new FormSchema([fields.tags]);
+
export default {
name: 'AppTagPopover',
@@ -52,6 +42,10 @@ export default {
props: {
modelValue: {
+ type: Boolean,
+ default: () => false,
+ },
+ member: {
type: Object,
default: () => null,
},
@@ -60,9 +54,9 @@ export default {
data() {
return {
- changed: false,
loading: false,
- form: [],
+ editTagsModel: [],
+ editTagsInCommon: [],
};
},
@@ -72,20 +66,22 @@ export default {
},
computedVisible: {
get() {
- return this.modelValue !== null;
+ return this.modelValue;
},
set() {
- this.$emit('update:modelValue', null);
+ this.$emit('update:modelValue', false);
},
},
+ membersToUpdate() {
+ return this.member ? [this.member]: selectedMembers.value;
+ },
},
watch: {
modelValue: {
- immediate: true,
- handler(member) {
- if (member) {
- this.form = member.tags;
+ async handler(newValue) {
+ if (newValue) {
+ await this.prepareUpdateTags();
}
},
},
@@ -93,20 +89,51 @@ export default {
methods: {
...mapActions({
- doUpdate: 'member/doUpdate',
+ doBulkUpdateMembersTags:
+ 'member/doBulkUpdateMembersTags',
}),
+
+ prepareUpdateTags() {
+ this.editTagsModel = this.membersToUpdate.reduce(
+ (acc, item, index) => {
+ let { tags } = formSchema.initialValues({
+ tags: item.tags,
+ });
+ if (index > 0) {
+ tags = tags.filter(
+ (tag) => acc.filter((t) => t.id === tag.id).length
+ > 0,
+ );
+ }
+ return tags;
+ },
+ [],
+ );
+ this.editTagsInCommon = [
+ ...this.editTagsModel,
+ ];
+ },
+
async handleSubmit() {
this.loading = true;
- await this.doUpdate({
- id: this.modelValue.id,
- values: {
- tags: this.form.map((tag) => tag.id),
- },
+
+ await this.doBulkUpdateMembersTags({
+ members: [...this.membersToUpdate],
+ tagsInCommon: this.editTagsInCommon,
+ tagsToSave: this.editTagsModel,
});
+
this.loading = false;
this.computedVisible = false;
- this.$emit('reload');
+ this.$emit('reload', true);
+ return null;
},
+
+ handleCancel() {
+ this.editTagsModel = [];
+ this.editTagsInCommon = [];
+ this.computedVisible = false;
+ }
},
};