Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions libs/shared/ui-utils/src/lib/shared-ui-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1645,17 +1645,21 @@ export function getListItemsFromFieldWithRelatedItems(fields: Field[], parentId
const allowChildren = parentPath.split('.').length <= 5;
const relatedFields: ListItem[] = fields
.filter((field) => allowChildren && Array.isArray(field.referenceTo) && field.referenceTo.length > 0 && field.relationshipName)
.map((field) => ({
id: `${parentPath}${field.relationshipName}`,
value: `${parentPath}${field.relationshipName}`,
.flatMap((field) => {
// limit to first 5 references
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
label: field.relationshipName!,
secondaryLabel: field.referenceTo?.[0],
secondaryLabelOnNewLine: true,
isDrillInItem: true,
parentId,
meta: field,
}));
return field.referenceTo!.slice(0, 5).map((referenceTo) => ({
id: `${parentPath}${field.relationshipName}`,
value: `${parentPath}${field.relationshipName}`,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
label: field.relationshipName!,
secondaryLabel: referenceTo,
secondaryLabelOnNewLine: true,
isDrillInItem: true,
parentId,
meta: field,
}));
});

const coreFields: ListItem[] = fields.flatMap((field) => ({
id: `${parentPath}${field.name}`,
Expand Down
2 changes: 1 addition & 1 deletion libs/ui/src/lib/form/combobox/ComboboxWithItems.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ export const ComboboxWithItems = forwardRef<ComboboxWithItemsRef, ComboboxWithIt
{visibleItems.map((item, i) =>
!item.customRenderer ? (
<ComboboxListItem
key={item.id}
key={`item.id-${i}`}
ref={refs[i]}
id={item.id}
label={item.label}
Expand Down
10 changes: 9 additions & 1 deletion libs/ui/src/lib/form/combobox/useFieldListItemsWithDrillIn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,15 @@ export function useFieldListItemsWithDrillIn(selectedOrg: SalesforceOrgUi) {
if (!Array.isArray(field.referenceTo) || field.referenceTo.length <= 0) {
return [];
}
const { data } = await describeSObject(selectedOrg, field.referenceTo?.[0] || '');
// For polymorphic lookups, the object is stored in the secondary label
const referenceTo =
field.referenceTo.length > 1
? field.referenceTo.find((sobject) => sobject === item.secondaryLabel) || field.referenceTo?.[0]
: field.referenceTo[0];
if (!referenceTo) {
return [];
}
const { data } = await describeSObject(selectedOrg, referenceTo);
const allFieldMetadata = sortQueryFields(data.fields);
const childFields = getListItemsFromFieldWithRelatedItems(allFieldMetadata, item.id);

Expand Down
52 changes: 36 additions & 16 deletions libs/ui/src/lib/form/formGroupDropDown/FormGroupDropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ export const FormGroupDropdown: FunctionComponent<FormGroupDropdownProps> = ({
}
}

function handleKeyDown(event: KeyboardEvent<HTMLDivElement | HTMLLIElement>) {
function handleKeyDown(event: KeyboardEvent<HTMLDivElement | HTMLInputElement | HTMLLIElement>) {
try {
event.preventDefault();
event.stopPropagation();
Expand Down Expand Up @@ -173,21 +173,41 @@ export const FormGroupDropdown: FunctionComponent<FormGroupDropdownProps> = ({
className="slds-icon slds-icon slds-icon_x-small slds-icon-text-default"
/>
)}
<div
role="combobox"
tabIndex={0}
className={classNames('slds-input slds-combobox__input slds-has-focus slds-combobox__input-value', {
'slds-has-focus': isOpen,
})}
aria-labelledby={`${inputId}-label`}
id={`${inputId}-selected-value`}
aria-controls={id}
aria-expanded={isOpen}
aria-haspopup="listbox"
onKeyDown={handleKeyDown}
>
{selectedItem && <span className="slds-truncate">{selectedItem.label}</span>}
</div>
{iconOnly && (
<input
type="text"
className="slds-input slds-combobox__input slds-combobox__input-value"
id={`${inputId}-selected-value`}
aria-controls={id}
aria-expanded={isOpen}
aria-haspopup="listbox"
aria-labelledby={`${inputId}-label`}
autoComplete="off"
role="combobox"
value={selectedItem.label}
title={selectedItem.label}
readOnly
onKeyDown={handleKeyDown}
/>
)}
{!iconOnly && (
<div
role="combobox"
tabIndex={0}
className={classNames('slds-input_faux slds-combobox__input slds-combobox__input-value', {
'slds-has-focus': isOpen,
})}
id={`${inputId}-selected-value`}
aria-controls={id}
aria-expanded={isOpen}
aria-haspopup="listbox"
aria-labelledby={`${inputId}-label`}
title={selectedItem.label}
onKeyDown={handleKeyDown}
>
{selectedItem && <span className="slds-truncate">{selectedItem.label}</span>}
</div>
)}
<Icon
type="utility"
icon="down"
Expand Down