click()

in packages/ketcher-react/src/script/editor/tool/rgroupfragment.ts [45:151]


  click(event) {
    const struct = this.editor.render.ctab;
    const molecule = struct.molecule;
    const functionalGroups = molecule.functionalGroups;
    const editor = this.editor;
    const ci = editor.findItem(event, ['frags', 'rgroups']);
    const ce = editor.findItem(event, ['atoms', 'bonds']);
    const atomResult: Array<number> = [];
    const bondResult: Array<number> = [];
    const result: Array<number> = [];

    if (ce && functionalGroups && ce.map === 'atoms') {
      const atomId = FunctionalGroup.atomsInFunctionalGroup(
        functionalGroups,
        ce.id,
      );

      if (atomId !== null) {
        atomResult.push(atomId);
      }
    }

    if (ce && functionalGroups && ce.map === 'bonds') {
      const bondId = FunctionalGroup.bondsInFunctionalGroup(
        molecule,
        functionalGroups,
        ce.id,
      );

      if (bondId !== null) {
        bondResult.push(bondId);
      }
    }

    if (atomResult.length > 0) {
      for (const id of atomResult) {
        const fgId = FunctionalGroup.findFunctionalGroupByAtom(
          functionalGroups,
          id,
        );

        if (fgId !== null && !result.includes(fgId)) {
          result.push(fgId);
        }
      }
      if (result.length > 0) {
        this.editor.event.removeFG.dispatch({ fgIds: result });
        return;
      }
    } else if (bondResult.length > 0) {
      for (const id of bondResult) {
        const fgId = FunctionalGroup.findFunctionalGroupByBond(
          molecule,
          functionalGroups,
          id,
        );

        if (fgId !== null && !result.includes(fgId)) {
          result.push(fgId);
        }
      }
      this.editor.event.removeFG.dispatch({ fgIds: result });
      return;
    }

    if (!ci) {
      return true;
    }

    this.editor.hover(null);

    const label =
      ci.map === 'rgroups'
        ? ci.id
        : RGroup.findRGroupByFragment(molecule.rgroups, ci.id);

    const rg = Object.assign(
      { label },
      ci.map === 'frags' ? { fragId: ci.id } : molecule.rgroups.get(ci.id),
    );

    const res = editor.event.rgroupEdit.dispatch(rg);

    Promise.resolve(res)
      .then((newRg) => {
        let action;

        if (ci.map !== 'rgroups') {
          const rgidOld = RGroup.findRGroupByFragment(
            struct.molecule.rgroups,
            ci.id,
          );
          action = fromRGroupFragment(struct, newRg.label, ci.id).mergeWith(
            fromUpdateIfThen(struct, newRg.label, rgidOld),
          );
        } else {
          action = fromRGroupAttrs(struct, ci.id, newRg);
        }

        editor.update(action);
      })
      .catch((e) => {
        KetcherLogger.error('rgroupfragment.ts::RGroupFragmentTool::click', e);
      }); // w/o changes

    return true;
  }