Skip to content

Commit

Permalink
Merge pull request #276 from jetstreamapp/feat/257
Browse files Browse the repository at this point in the history
Allow mapping to related field for self-lookup fields
  • Loading branch information
paustint authored Apr 5, 2023
2 parents b41522f + 0461b36 commit 6dbb9ac
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import classNames from 'classnames';
import isNil from 'lodash/isNil';
import { Fragment, FunctionComponent, useEffect, useState } from 'react';
import { FieldMappingItem, FieldRelatedEntity, FieldWithRelatedEntities } from '../load-records-types';
import { SELF_LOOKUP_KEY } from '../utils/load-records-utils';
import LoadRecordsFieldMappingRowLookupOption from './LoadRecordsFieldMappingRowLookupOption';

function getPreviewData(csvRowData: string | Date | boolean | number | null): string {
Expand Down Expand Up @@ -288,7 +289,9 @@ export const LoadRecordsFieldMappingRow: FunctionComponent<LoadRecordsFieldMappi
<LoadRecordsFieldMappingRowLookupOption
csvField={csvField}
fieldMappingItem={fieldMappingItem}
disabled={!!fieldMappingItem.relatedFieldMetadata?.isExternalId}
disabled={
!!fieldMappingItem.relatedFieldMetadata?.isExternalId && fieldMappingItem.relationshipName !== SELF_LOOKUP_KEY
}
onSelectionChanged={onSelectionChanged}
/>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
PrepareDataResponse,
} from '../load-records-types';

export const SELF_LOOKUP_KEY = '~SELF_LOOKUP~';
const DEFAULT_NON_EXT_ID_MAPPING_OPT: NonExtIdLookupOption = 'ERROR_IF_MULTIPLE';
const DEFAULT_NULL_IF_NO_MATCH_MAPPING_OPT = false;

Expand Down Expand Up @@ -56,6 +57,15 @@ export async function getFieldMetadata(org: SalesforceOrgUi, sobject: string): P
if (Array.isArray(referenceTo) && referenceTo.length === 2 && referenceTo[1] === 'User') {
referenceTo = referenceTo.reverse();
}

let relationshipName = field.relationshipName || undefined;

// Fake lookup field for self-relationship (e.x. use Email as Id for base record)
if (field.name === 'Id') {
referenceTo = [sobject];
relationshipName = SELF_LOOKUP_KEY;
}

return {
label: field.label,
name: field.name,
Expand All @@ -64,7 +74,7 @@ export async function getFieldMetadata(org: SalesforceOrgUi, sobject: string): P
externalId: field.externalId,
typeLabel: field.typeLabel,
referenceTo,
relationshipName: field.relationshipName || undefined,
relationshipName,
};
});

Expand Down Expand Up @@ -297,7 +307,12 @@ export function getFieldHeaderFromMapping(fieldMapping: FieldMapping): string[]
.map((item) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
let output = item.targetField!;
if (item.mappedToLookup && item.targetLookupField && item.relatedFieldMetadata?.isExternalId) {
if (
item.mappedToLookup &&
item.targetLookupField &&
item.relatedFieldMetadata?.isExternalId &&
item.relationshipName !== SELF_LOOKUP_KEY
) {
output = `${item.relationshipName}.${item.targetLookupField}`;
}
return output;
Expand Down Expand Up @@ -337,6 +352,7 @@ export function transformData({ data, fieldMapping, sObject, insertNulls, dateFo
apiMode === 'BATCH' &&
fieldMappingItem.mappedToLookup &&
fieldMappingItem.relatedFieldMetadata?.isExternalId &&
fieldMappingItem.relationshipName !== SELF_LOOKUP_KEY &&
fieldMappingItem.relationshipName &&
fieldMappingItem.targetLookupField
) {
Expand All @@ -351,6 +367,7 @@ export function transformData({ data, fieldMapping, sObject, insertNulls, dateFo
} else if (
fieldMappingItem.mappedToLookup &&
fieldMappingItem.relatedFieldMetadata?.isExternalId &&
fieldMappingItem.relationshipName !== SELF_LOOKUP_KEY &&
fieldMappingItem.targetLookupField
) {
if ((fieldMappingItem.fieldMetadata?.referenceTo?.length || 0) > 1) {
Expand Down Expand Up @@ -385,7 +402,10 @@ export async function fetchMappedRelatedRecords(
onProgress: (progress: number) => void
): Promise<PrepareDataResponse> {
const nonExternalIdFieldMappings = Object.values(fieldMapping).filter(
(item) => item.mappedToLookup && item.relatedFieldMetadata && !item.relatedFieldMetadata.isExternalId
(item) =>
item.mappedToLookup &&
item.relatedFieldMetadata &&
(!item.relatedFieldMetadata.isExternalId || item.relationshipName === SELF_LOOKUP_KEY)
);

const queryErrors: string[] = [];
Expand Down Expand Up @@ -414,7 +434,12 @@ export async function fetchMappedRelatedRecords(
targetLookupField,
} of nonExternalIdFieldMappings) {
onProgress(Math.min(current / total, 100));
const fieldRelationshipName = `${relationshipName}.${targetLookupField}`;
// only used for error messaging
let fieldRelationshipName = `${relationshipName}.${targetLookupField}`;
if (relationshipName === SELF_LOOKUP_KEY) {
// Don't show user ~SELF_LOOKUP~
fieldRelationshipName = `${targetLookupField}`;
}
// remove any falsy values, related fields cannot be booleans or numbers, so this should not cause issues
const relatedValues = new Set<string>(data.map((row) => row[targetField || '']).filter(Boolean));

Expand Down

0 comments on commit 6dbb9ac

Please sign in to comment.