in packages/ketcher-react/src/script/ui/views/components/ContextMenu/ContextMenuTrigger.utils.ts [42:157]
export function getMenuPropsForClosestItem(
editor: Editor,
closestItem: ClosestItemWithMap,
): ContextMenuProps | null {
const struct = editor.struct();
switch (closestItem.map) {
case 'bonds': {
const functionalGroup = FunctionalGroup.findFunctionalGroupByBond(
struct,
struct.functionalGroups,
closestItem.id,
true,
);
const noFunctionalGroup =
functionalGroup === null ||
functionalGroup?.relatedSGroup.isSuperatomWithoutLabel;
const isMonomer =
functionalGroup?.relatedSGroup instanceof MonomerMicromolecule;
if (noFunctionalGroup) {
return {
id: CONTEXT_MENU_ID.FOR_BONDS,
bondIds: [closestItem.id],
};
} else if (isMonomer) {
return {
id: CONTEXT_MENU_ID.FOR_MACROMOLECULE,
functionalGroups: [functionalGroup],
};
} else {
return {
id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
functionalGroups: [functionalGroup],
};
}
}
case 'atoms': {
const functionalGroup = FunctionalGroup.findFunctionalGroupByAtom(
struct.functionalGroups,
closestItem.id,
true,
);
const noFunctionalGroup =
functionalGroup === null ||
functionalGroup?.relatedSGroup.isSuperatomWithoutLabel;
const isMonomer =
functionalGroup?.relatedSGroup instanceof MonomerMicromolecule;
if (noFunctionalGroup) {
return {
id: CONTEXT_MENU_ID.FOR_ATOMS,
atomIds: [closestItem.id],
};
} else if (isMonomer) {
return {
id: CONTEXT_MENU_ID.FOR_MACROMOLECULE,
functionalGroups: [functionalGroup],
};
} else {
return {
id: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
functionalGroups: [functionalGroup],
};
}
}
case 'sgroups':
case 'functionalGroups': {
const sGroup = struct.sgroups.get(closestItem.id);
const functionalGroup = FunctionalGroup.findFunctionalGroupBySGroup(
struct.functionalGroups,
sGroup,
);
return functionalGroup
? {
id:
sGroup instanceof MonomerMicromolecule
? CONTEXT_MENU_ID.FOR_MACROMOLECULE
: CONTEXT_MENU_ID.FOR_FUNCTIONAL_GROUPS,
functionalGroups: [functionalGroup],
}
: null;
}
case 'rgroupAttachmentPoints': {
const atomId = struct.rgroupAttachmentPoints.get(closestItem.id)?.atomId;
return {
id: CONTEXT_MENU_ID.FOR_R_GROUP_ATTACHMENT_POINT,
rgroupAttachmentPoints: [closestItem.id],
atomIds: typeof atomId === 'number' ? [atomId] : undefined,
};
}
case MULTITAIL_ARROW_KEY: {
const closestItemTyped = closestItem as unknown as ReturnType<
ReMultitailArrow['calculateDistanceToPoint']
>;
const tailId = closestItemTyped?.ref?.tailId;
return {
id: CONTEXT_MENU_ID.FOR_MULTITAIL_ARROW,
itemId: closestItem.id,
tailId: typeof tailId === 'number' ? tailId : null,
};
}
default:
return null;
}
}