Jump to content

MediaWiki:Common.js: Difference between revisions

From Once Human Guide
No edit summary
No edit summary
Line 2: Line 2:
   $(function () {
   $(function () {


     /* ================= TAB SYSTEM ================= */
     /* ================= UNIVERSAL TAB SYSTEM ================= */


     document.querySelectorAll('.mw-tabs').forEach(tabSystem => {
     document.querySelectorAll('.mw-tab-buttons').forEach(group => {
      const buttons = group.querySelectorAll('.mw-tab-btn');


       const buttons = tabSystem.querySelectorAll('.mw-tab-btn');
       buttons.forEach(btn => {
      const contents = tabSystem.querySelectorAll('.mw-tab-content');
        btn.onclick = function () {
          const tabId = this.dataset.tab;
 
          // 🔥 works for BOTH systems
          let container =
            this.closest('.mw-tabs') ||
            this.closest('.mw-tab-content') ||
            document;


      function activateTab(tabId, btn) {
          // hide all tabs in scope
        contents.forEach(c => c.style.display = 'none');
          container.querySelectorAll('.mw-tab-content').forEach(c => {
        buttons.forEach(b => b.classList.remove('active'));
            c.style.display = 'none';
          });


        const target = tabSystem.querySelector('#' + tabId);
          // reset buttons
        if (target) target.style.display = 'block';
          container.querySelectorAll('.mw-tab-btn').forEach(b => {
            b.classList.remove('active');
          });


        if (btn) btn.classList.add('active');
          // activate
      }
          this.classList.add('active');


      buttons.forEach(btn => {
          const target = container.querySelector('#' + tabId);
        btn.onclick = function () {
           if (target) target.style.display = 'block';
           activateTab(this.dataset.tab, this);
         };
         };
       });
       });


       if (buttons.length) {
      // auto open first tab
        activateTab(buttons[0].dataset.tab, buttons[0]);
       if (buttons.length) buttons[0].click();
      }
 
     });
     });


     /* ================= OLD DROPDOWN SYSTEM (RESTORED) ================= */
     /* ================= INGREDIENT DROPDOWNS (RESTORED) ================= */


     document.querySelectorAll('.mw-dropdown-ui').forEach(container => {
     document.querySelectorAll('.mw-dropdown-ui').forEach(container => {
Line 65: Line 73:
     });
     });


     /* ================= MOD SYSTEM (NEW) ================= */
     /* ================= MOD SYSTEM ================= */


     document.querySelectorAll('.mod-system').forEach(system => {
     document.querySelectorAll('.mod-system').forEach(system => {

Revision as of 19:54, 21 April 2026

mw.loader.using('mediawiki.util').then(function () {
  $(function () {

    /* ================= UNIVERSAL TAB SYSTEM ================= */

    document.querySelectorAll('.mw-tab-buttons').forEach(group => {
      const buttons = group.querySelectorAll('.mw-tab-btn');

      buttons.forEach(btn => {
        btn.onclick = function () {
          const tabId = this.dataset.tab;

          // 🔥 works for BOTH systems
          let container =
            this.closest('.mw-tabs') ||
            this.closest('.mw-tab-content') ||
            document;

          // hide all tabs in scope
          container.querySelectorAll('.mw-tab-content').forEach(c => {
            c.style.display = 'none';
          });

          // reset buttons
          container.querySelectorAll('.mw-tab-btn').forEach(b => {
            b.classList.remove('active');
          });

          // activate
          this.classList.add('active');

          const target = container.querySelector('#' + tabId);
          if (target) target.style.display = 'block';
        };
      });

      // auto open first tab
      if (buttons.length) buttons[0].click();
    });

    /* ================= INGREDIENT DROPDOWNS (RESTORED) ================= */

    document.querySelectorAll('.mw-dropdown-ui').forEach(container => {

      const label = container.dataset.label || "Select";
      const options = JSON.parse(container.dataset.options || "{}");

      const select = document.createElement('select');

      const defaultOption = document.createElement('option');
      defaultOption.textContent = label;
      defaultOption.value = "";
      select.appendChild(defaultOption);

      Object.keys(options).forEach(key => {
        const opt = document.createElement('option');
        opt.value = key;
        opt.textContent = options[key].label;
        select.appendChild(opt);
      });

      const output = document.createElement('div');
      output.className = 'mw-dropdown-output';

      select.onchange = function () {
        const selected = options[this.value];
        output.innerHTML = selected ? selected.content : "";
      };

      container.innerHTML = '';
      container.appendChild(select);
      container.appendChild(output);
    });

    /* ================= MOD SYSTEM ================= */

    document.querySelectorAll('.mod-system').forEach(system => {

      const modType = system.dataset.mod;
      const dataBlock = document.querySelector('#mod-database [data-mod="' + modType + '"]');
      if (!dataBlock) return;

      const leftData = JSON.parse(dataBlock.querySelector('[data-left]').dataset.left);
      const rightData = JSON.parse(dataBlock.querySelector('[data-right]').dataset.right);

      let selectedLeft = null;
      let selectedRight = null;

      const leftDiv = document.createElement('div');
      const rightDiv = document.createElement('div');
      const result = document.createElement('div');

      result.style.display = "none";
      result.style.border = "1px solid #444";
      result.style.padding = "10px";
      result.style.marginTop = "10px";

      function createDropdown(container, options, side) {
        const btn = document.createElement('button');
        btn.textContent = "Select";

        btn.onclick = function () {
          document.querySelectorAll('.dropdown-list').forEach(el => el.remove());

          const list = document.createElement('div');
          list.className = 'dropdown-list';

          Object.keys(options).forEach(key => {
            const item = document.createElement('div');
            item.textContent = options[key];

            item.onclick = function () {
              btn.textContent = options[key];

              if (side === "left") selectedLeft = key;
              if (side === "right") selectedRight = key;

              list.remove();
              update();
            };

            list.appendChild(item);
          });

          container.appendChild(list);
        };

        container.appendChild(btn);
      }

      function update() {
        if (!selectedLeft || !selectedRight) {
          result.style.display = "none";
          return;
        }

        const key = selectedLeft + "__" + selectedRight;
        const match = dataBlock.querySelector('[data-key="' + key + '"]');

        result.style.display = "block";
        result.innerHTML = match ? match.innerHTML : "No data";
      }

      createDropdown(leftDiv, leftData, "left");
      createDropdown(rightDiv, rightData, "right");

      system.appendChild(leftDiv);
      system.appendChild(rightDiv);
      system.appendChild(result);
    });

  });
});