From 31f906ec26d5af6e4855fec1e37a3d473c1061d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Grom?= Date: Mon, 8 Jan 2024 14:47:37 +0100 Subject: [PATCH 01/26] Merge suggestion preview (#2040) --- .../member-merge-suggestions-details.vue | 19 +++++++--- .../pages/member-merge-suggestions-page.vue | 35 +++++++++++++++++- ...organization-merge-suggestions-details.vue | 33 +++++++++++------ .../organization-merge-suggestions-page.vue | 36 ++++++++++++++++++- .../components/identities-vertical-list.vue | 4 +-- 5 files changed, 108 insertions(+), 19 deletions(-) diff --git a/frontend/src/modules/member/components/suggestions/member-merge-suggestions-details.vue b/frontend/src/modules/member/components/suggestions/member-merge-suggestions-details.vue index 12190832ae..5cf7d3dfb1 100644 --- a/frontend/src/modules/member/components/suggestions/member-merge-suggestions-details.vue +++ b/frontend/src/modules/member/components/suggestions/member-merge-suggestions-details.vue @@ -26,7 +26,13 @@
+ Preview +
+
Primary contact @@ -92,7 +98,7 @@

Location

-

+

{{ member.attributes.location?.default || '-' }}

@@ -117,7 +123,7 @@

Title

-

+

{{ member.attributes.jobTitle?.default || '-' }}

@@ -128,7 +134,7 @@

Contact since

-

+

{{ moment(member.joinedAt).format('YYYY-MM-DD') }}

@@ -189,6 +195,11 @@ const props = defineProps({ required: false, default: false, }, + isPreview: { + type: Boolean, + required: false, + default: false, + }, loading: { type: Boolean, required: false, diff --git a/frontend/src/modules/member/pages/member-merge-suggestions-page.vue b/frontend/src/modules/member/pages/member-merge-suggestions-page.vue index 9db1912980..71519822ee 100644 --- a/frontend/src/modules/member/pages/member-merge-suggestions-page.vue +++ b/frontend/src/modules/member/pages/member-merge-suggestions-page.vue @@ -99,7 +99,7 @@
+
+ +
@@ -139,6 +146,7 @@ import { mapGetters } from '@/shared/vuex/vuex.helpers'; import AppLoading from '@/shared/loading/loading-placeholder.vue'; import AppMemberMergeSuggestionsDetails from '@/modules/member/components/suggestions/member-merge-suggestions-details.vue'; import { useRoute } from 'vue-router'; +import { merge } from 'lodash'; import { MemberService } from '../member-service'; import { MemberPermissions } from '../member-permissions'; @@ -162,6 +170,31 @@ const isEditLockedForSampleData = computed( .editLockedForSampleData, ); +const clearMember = (member) => { + const cleanedMember = { ...member }; + // eslint-disable-next-line no-restricted-syntax + for (const key in cleanedMember.attributes) { + if (!cleanedMember.attributes[key].default) { + delete cleanedMember.attributes[key]; + } + } + return cleanedMember; +}; + +const preview = computed(() => { + const primaryMember = membersToMerge.value.members[primary.value]; + const secondaryMember = membersToMerge.value.members[(primary.value + 1) % 2]; + const mergedMembers = merge({}, clearMember(secondaryMember), clearMember(primaryMember)); + Object.keys(mergedMembers?.username || {}).forEach((key) => { + if (!primaryMember.username[key] || !secondaryMember.username[key]) { + return; + } + mergedMembers.username[key] = [...Object.values(primaryMember.username[key]), ...Object.values(secondaryMember.username[key])]; + }); + mergedMembers.score = Math.max(primaryMember.score, secondaryMember.score); + return mergedMembers; +}); + const confidence = computed(() => { if (membersToMerge.value.similarity >= 0.8) { return { diff --git a/frontend/src/modules/organization/components/suggestions/organization-merge-suggestions-details.vue b/frontend/src/modules/organization/components/suggestions/organization-merge-suggestions-details.vue index b23664e208..a663e1eba1 100644 --- a/frontend/src/modules/organization/components/suggestions/organization-merge-suggestions-details.vue +++ b/frontend/src/modules/organization/components/suggestions/organization-merge-suggestions-details.vue @@ -26,7 +26,13 @@
+ Preview +
+
Primary organization @@ -96,7 +102,7 @@ :href="withHttp(props.organization.website)" target="_blank" rel="noopener noreferrer" - class="text-xs text-gray-900 text-right" + class="text-xs text-gray-900 text-right whitespace-normal" >{{ props.organization.website || '-' }}
Location

-

+

{{ props.organization.location || '-' }}

@@ -123,7 +129,7 @@

Number of employees

-

+

{{ props.organization.employees || '-' }}

@@ -137,7 +143,7 @@

Annual Revenue

-

+

{{ revenueRange.displayValue( props.organization.revenueRange, ) || '-' }} @@ -153,7 +159,7 @@

Industry

-

+

{{ props.organization.industry || '-' }}

@@ -167,7 +173,7 @@

Type

-

+

{{ props.organization.type || '-' }}

@@ -181,7 +187,7 @@

Founded

-

+

{{ props.organization.founded || '-' }}

@@ -195,7 +201,7 @@

Joined date

-

+

{{ formatDateToTimeAgo(props.organization.joinedAt) || '-' }}

@@ -209,7 +215,7 @@

# of contacts

-

+

{{ props.organization.memberCount || '-' }}

@@ -223,7 +229,7 @@

# of Activities

-

+

{{ props.organization.activityCount || '-' }}

@@ -269,6 +275,11 @@ const props = defineProps({ required: false, default: false, }, + isPreview: { + type: Boolean, + required: false, + default: false, + }, loading: { type: Boolean, required: false, diff --git a/frontend/src/modules/organization/pages/organization-merge-suggestions-page.vue b/frontend/src/modules/organization/pages/organization-merge-suggestions-page.vue index 92d0deb431..13af3cf488 100644 --- a/frontend/src/modules/organization/pages/organization-merge-suggestions-page.vue +++ b/frontend/src/modules/organization/pages/organization-merge-suggestions-page.vue @@ -99,7 +99,7 @@
+
+ +
@@ -142,6 +149,7 @@ import AppOrganizationMergeSuggestionsDetails from '@/modules/organization/compo import { useOrganizationStore } from '@/modules/organization/store/pinia'; import { storeToRefs } from 'pinia'; import { useRoute } from 'vue-router'; +import { merge } from 'lodash'; import { OrganizationService } from '../organization-service'; import { OrganizationPermissions } from '../organization-permissions'; @@ -170,6 +178,32 @@ const isEditLockedForSampleData = computed( .editLockedForSampleData, ); +const clearOrganization = (organization) => { + const cleanedOrganization = { ...organization }; + // eslint-disable-next-line no-restricted-syntax + for (const key in cleanedOrganization) { + if (!cleanedOrganization[key]) { + delete cleanedOrganization[key]; + } + } + return cleanedOrganization; +}; + +const preview = computed(() => { + const primaryOrganization = organizationsToMerge.value.organizations[primary.value]; + const secondaryOrganization = organizationsToMerge.value.organizations[(primary.value + 1) % 2]; + const mergedOrganizations = merge({}, clearOrganization(secondaryOrganization), clearOrganization(primaryOrganization)); + if (!Array.isArray(primaryOrganization.identities)) { + primaryOrganization.identities = []; + } + if (!Array.isArray(secondaryOrganization.identities)) { + secondaryOrganization.identities = []; + } + + mergedOrganizations.identities = [...(primaryOrganization.identities || []), ...(secondaryOrganization.identities || [])]; + return mergedOrganizations; +}); + const confidence = computed(() => { if (organizationsToMerge.value.similarity >= 0.8) { return { diff --git a/frontend/src/shared/modules/identities/components/identities-vertical-list.vue b/frontend/src/shared/modules/identities/components/identities-vertical-list.vue index ba3e791500..b79e336ea9 100644 --- a/frontend/src/shared/modules/identities/components/identities-vertical-list.vue +++ b/frontend/src/shared/modules/identities/components/identities-vertical-list.vue @@ -18,8 +18,8 @@ :show-platform-tooltip="true" /> -
-
+
+