skbkontur / react-props2attrs

MIT License
2 stars 0 forks source link

Прокидывать data-tid на noscript элементы #14

Open mshatikhin opened 2 years ago

mshatikhin commented 2 years ago

привет, есть разница в поведении,

в старой либе (которая скриптик react-selenium-testing.js) на всякие SidePage проставлялись атрибуты в noscript элемент,

<noscript data-render-container-id="9402" data-comp-name="Portal RenderInnerContainer RenderContainer SidePage CashboxViewerSidePage" data-tid="CashboxSidePage"></noscript>

а в props2attrs вот так <noscript data-render-container-id="e3b5" data-comp-name="Portal" data-key="portal-ref"></noscript>

из за этого у нас в проекте попадали все тесты где есть порталы, потому что поиск элемента в портале через data-tid на noscript элементе,

верните пожалуйста это поведение.

lossir commented 2 years ago

Привет. Всё-таки думаю, что это не является багом. Поэтому не должно исправляться из коробки. Это специфичная реализация порталов в контролах Контура. И она отличается в различный мажорных версиях.

Эту проблему стоит решать с помощью хелпера setFilter().

Подготовил универсальный код, который повторяет старое поведение для различный версий контролов Контура:

setFilter((fiber) => {
  if (fiber.key === "portal-ref") {
    const id = fiber.memoizedProps?.rt_rootID;
    const noscript = document.querySelector(`[data-render-container-id="${id}"]`);
    const portal = document.querySelector(`[data-prop-rootid="${id}"]`);
    if (portal instanceof HTMLElement && noscript instanceof HTMLElement) {
      let tid = fiber.memoizedProps?.["data-tid"];
      findAmongParents(fiber, (f) => {
        if (findAssociatedNode(f) === portal && f.memoizedProps?.["data-tid"]) {
          tid = f.memoizedProps["data-tid"];
        }
        return false;
      });
      if (tid) {
        noscript.dataset.tid = tid;
      }
      noscript.dataset.compName = "Portal " + portal.dataset.compName;
    }
  }
  // Пропускаем только контролы из пакета @skbkontur/react-ui
  if (typeof fiber.type?.__KONTUR_REACT_UI__ === "string") {
    return null;
  }
  return [];
});

Можно потрогать в этом примере: codesandbox.io/s/props2attrs-kontur-portal.

Фрагмент кода с поиском data-tid у родителя будет необязателен после исправления этого #7 бага. После релиза приложу пример.