OCA/openupgradelib

View on GitHub
docs/_static/js/versions.js

Summary

Maintainability
A
1 hr
Test Coverage
const themeFlyoutDisplay = "hidden";
const themeVersionSelector = "True";
const themeLanguageSelector = "True";

if (themeFlyoutDisplay === "attached") {
  function renderLanguages(config) {
    if (!config.projects.translations.length) {
      return "";
    }

    const languagesHTML = `
      <dl>
        <dt>Languages</dt>
        ${config.projects.translations
          .map(
            (translation) => `
        <dd ${translation.slug == config.projects.current.slug ? 'class="rtd-current-item"' : ""}>
          <a href="${translation.urls.documentation}">${translation.language.code}</a>
        </dd>
        `,
          )
          .join("\n")}
      </dl>
    `;
    return languagesHTML;
  }

  function renderVersions(config) {
    if (!config.versions.active.length) {
      return "";
    }
    const versionsHTML = `
      <dl>
        <dt>Versions</dt>
        ${config.versions.active
          .map(
            (version) => `
        <dd ${version.slug === config.versions.current.slug ? 'class="rtd-current-item"' : ""}>
          <a href="${version.urls.documentation}">${version.slug}</a>
        </dd>
        `,
          )
          .join("\n")}
      </dl>
    `;
    return versionsHTML;
  }

  function renderDownloads(config) {
    if (!Object.keys(config.versions.current.downloads).length) {
      return "";
    }
    const downloadsNameDisplay = {
      pdf: "PDF",
      epub: "Epub",
      htmlzip: "HTML",
    };

    const downloadsHTML = `
      <dl>
        <dt>Downloads</dt>
        ${Object.entries(config.versions.current.downloads)
          .map(
            ([name, url]) => `
          <dd>
            <a href="${url}">${downloadsNameDisplay[name]}</a>
          </dd>
        `,
          )
          .join("\n")}
      </dl>
    `;
    return downloadsHTML;
  }

  document.addEventListener("readthedocs-addons-data-ready", function (event) {
    const config = event.detail.data();

    const flyout = `
      <div class="rst-versions" data-toggle="rst-versions" role="note">
        <span class="rst-current-version" data-toggle="rst-current-version">
          <span class="fa fa-book"> Read the Docs</span>
          v: ${config.versions.current.slug}
          <span class="fa fa-caret-down"></span>
        </span>
        <div class="rst-other-versions">
          <div class="injected">
            ${renderLanguages(config)}
            ${renderVersions(config)}
            ${renderDownloads(config)}
            <dl>
              <dt>On Read the Docs</dt>
              <dd>
                <a href="${config.projects.current.urls.home}">Project Home</a>
              </dd>
              <dd>
                <a href="${config.projects.current.urls.builds}">Builds</a>
              </dd>
              <dd>
                <a href="${config.projects.current.urls.downloads}">Downloads</a>
              </dd>
            </dl>
            <dl>
              <dt>Search</dt>
              <dd>
                <form id="flyout-search-form">
                  <input
                    class="wy-form"
                    type="text"
                    name="q"
                    aria-label="Search docs"
                    placeholder="Search docs"
                    />
                </form>
              </dd>
            </dl>
            <hr />
            <small>
              <span>Hosted by <a href="https://about.readthedocs.org/?utm_source=&utm_content=flyout">Read the Docs</a></span>
            </small>
          </div>
        </div>
    `;

    // Inject the generated flyout into the body HTML element.
    document.body.insertAdjacentHTML("beforeend", flyout);

    // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout.
    document
      .querySelector("#flyout-search-form")
      .addEventListener("focusin", () => {
        const event = new CustomEvent("readthedocs-search-show");
        document.dispatchEvent(event);
      });
  })
}

if (themeLanguageSelector || themeVersionSelector) {
  function onSelectorSwitch(event) {
    const option = event.target.selectedIndex;
    const item = event.target.options[option];
    window.location.href = item.dataset.url;
  }

  document.addEventListener("readthedocs-addons-data-ready", function (event) {
    const config = event.detail.data();

    const versionSwitch = document.querySelector(
      "div.switch-menus > div.version-switch",
    );
    if (themeVersionSelector) {
      let versions = config.versions.active;
      if (config.versions.current.hidden || config.versions.current.type === "external") {
        versions.unshift(config.versions.current);
      }
      const versionSelect = `
    <select>
      ${versions
        .map(
          (version) => `
        <option
  value="${version.slug}"
  ${config.versions.current.slug === version.slug ? 'selected="selected"' : ""}
              data-url="${version.urls.documentation}">
              ${version.slug}
          </option>`,
        )
        .join("\n")}
    </select>
  `;

      versionSwitch.innerHTML = versionSelect;
      versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
    }

    const languageSwitch = document.querySelector(
      "div.switch-menus > div.language-switch",
    );

    if (themeLanguageSelector) {
      if (config.projects.translations.length) {
        // Add the current language to the options on the selector
        let languages = config.projects.translations.concat(
          config.projects.current,
        );
        languages = languages.sort((a, b) =>
          a.language.name.localeCompare(b.language.name),
        );

        const languageSelect = `
      <select>
        ${languages
          .map(
            (language) => `
              <option
                  value="${language.language.code}"
                  ${config.projects.current.slug === language.slug ? 'selected="selected"' : ""}
                  data-url="${language.urls.documentation}">
                  ${language.language.name}
              </option>`,
          )
          .join("\n")}
       </select>
    `;

        languageSwitch.innerHTML = languageSelect;
        languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
      }
      else {
        languageSwitch.remove();
      }
    }
  });
}

document.addEventListener("readthedocs-addons-data-ready", function (event) {
  // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav.
  document
    .querySelector("[role='search'] input")
    .addEventListener("focusin", () => {
      const event = new CustomEvent("readthedocs-search-show");
      document.dispatchEvent(event);
    });
});