Jump to content

MediaWiki:Common.js: Difference between revisions

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


     /* ================= TAB SYSTEM (FIXED + SCOPED) ================= */
     /* ================= ORIGINAL DROPDOWN SYSTEM (RESTORED) ================= */


     document.querySelectorAll('.mw-tab-buttons').forEach(tabGroup => {
     document.querySelectorAll('.mw-dropdown-ui').forEach(container => {
      const select = container.querySelector('select');
      const sections = container.querySelectorAll('.dropdown-section');


       const buttons = tabGroup.querySelectorAll('.mw-tab-btn');
      if (!select) return;
 
      select.addEventListener('change', function () {
        sections.forEach(s => s.style.display = 'none');
 
        const target = container.querySelector('#' + this.value);
        if (target) target.style.display = 'block';
      });
    });
 
 
    /* ================= TAB SYSTEM (SAFE VERSION) ================= */
 
    document.querySelectorAll('.mw-tab-buttons').forEach(group => {
 
       const buttons = group.querySelectorAll('.mw-tab-btn');


       buttons.forEach(btn => {
       buttons.forEach(btn => {
Line 17: Line 34:
           this.classList.add('active');
           this.classList.add('active');


          // find nearest container
           const container = group.parentElement;
           const container = tabGroup.parentElement;


           // hide ONLY tabs in this container
           // hide ONLY direct tab contents
           container.querySelectorAll(':scope > .mw-tab-content').forEach(c => {
           container.querySelectorAll(':scope > .mw-tab-content').forEach(c => {
             c.classList.remove('active');
             c.classList.remove('active');
           });
           });


          // show selected
           const target = container.querySelector('#' + tabId);
           const target = container.querySelector('#' + tabId);
           if (target) {
           if (target) {
             target.classList.add('active');
             target.classList.add('active');


             // 🔥 initialize mod system ONLY when visible
             // 🔥 init mod system safely
             initModSystems(target);
             initModSystems(target);
           }
           }
Line 40: Line 55:




     /* ================= MOD SYSTEM ================= */
     /* ================= MOD SYSTEM (ADDED SAFELY) ================= */


     function initModSystems(scope) {
     function initModSystems(scope) {
Line 53: Line 68:
         if (!db) return;
         if (!db) return;


         const leftData = JSON.parse(db.querySelector('[data-left]').dataset.left);
         const left = db.querySelector('[data-left]');
         const rightData = JSON.parse(db.querySelector('[data-right]').dataset.right);
        const right = db.querySelector('[data-right]');
        if (!left || !right) return;
 
        const leftData = JSON.parse(left.dataset.left);
         const rightData = JSON.parse(right.dataset.right);


         const wrapper = document.createElement('div');
         const wrapper = document.createElement('div');
         wrapper.className = 'mw-dropdown-ui';
         wrapper.className = 'mw-dropdown-ui';
         wrapper.setAttribute('data-label', 'Select Mod');
         wrapper.setAttribute('data-label', 'Select Mod');
        const dropdown1 = createDropdown(Object.entries(leftData), 'Select Mod');
        const dropdown2 = createDropdown(Object.entries(rightData), 'Select Type');


         const output = document.createElement('div');
         const output = document.createElement('div');
         output.className = 'mw-dropdown-output';
         output.className = 'mw-dropdown-output';
         output.textContent = 'Select options to see details';
         output.textContent = 'Select options to see details';
        wrapper.appendChild(dropdown1);
        wrapper.appendChild(dropdown2);
        wrapper.appendChild(output);
        container.appendChild(wrapper);


         let selectedLeft = null;
         let selectedLeft = null;
Line 81: Line 91:
           const key = `${selectedLeft}__${selectedRight}`;
           const key = `${selectedLeft}__${selectedRight}`;
           const content = db.querySelector(`[data-key="${key}"]`);
           const content = db.querySelector(`[data-key="${key}"]`);
           output.innerHTML = content ? content.innerHTML : "No data found";
           output.innerHTML = content ? content.innerHTML : "No data found";
         }
         }


         function createDropdown(items, label) {
         function createDropdown(data, label, isLeft) {
           const div = document.createElement('div');
           const div = document.createElement('div');
           div.className = 'mod-dropdown';
           div.className = 'mod-dropdown';
Line 96: Line 105:
           list.className = 'mod-dropdown-list';
           list.className = 'mod-dropdown-list';


           items.forEach(([key, text]) => {
           Object.entries(data).forEach(([key, val]) => {
             const item = document.createElement('div');
             const item = document.createElement('div');
             item.className = 'mod-dropdown-item';
             item.className = 'mod-dropdown-item';
             item.textContent = text;
             item.textContent = val;


             item.onclick = () => {
             item.onclick = () => {
               btn.textContent = text;
               btn.textContent = val;
               list.style.display = 'none';
               list.style.display = 'none';


               if (label === 'Select Mod') selectedLeft = key;
               if (isLeft) selectedLeft = key;
               else selectedRight = key;
               else selectedRight = key;


Line 123: Line 132:
           return div;
           return div;
         }
         }
        wrapper.appendChild(createDropdown(leftData, 'Select Mod', true));
        wrapper.appendChild(createDropdown(rightData, 'Select Type', false));
        wrapper.appendChild(output);
        container.appendChild(wrapper);


       });
       });
Line 131: Line 146:
     /* ================= INITIAL LOAD ================= */
     /* ================= INITIAL LOAD ================= */


    // activate ONLY top-level first tabs
     document.querySelectorAll('.mw-tab-buttons').forEach(group => {
     document.querySelectorAll('.mw-tab-buttons').forEach(group => {
       const first = group.querySelector('.mw-tab-btn');
       const first = group.querySelector('.mw-tab-btn');

Revision as of 21:43, 21 April 2026

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

    /* ================= ORIGINAL DROPDOWN SYSTEM (RESTORED) ================= */

    document.querySelectorAll('.mw-dropdown-ui').forEach(container => {
      const select = container.querySelector('select');
      const sections = container.querySelectorAll('.dropdown-section');

      if (!select) return;

      select.addEventListener('change', function () {
        sections.forEach(s => s.style.display = 'none');

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


    /* ================= TAB SYSTEM (SAFE VERSION) ================= */

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

      const buttons = group.querySelectorAll('.mw-tab-btn');

      buttons.forEach(btn => {
        btn.addEventListener('click', function () {

          const tabId = this.getAttribute('data-tab');

          // deactivate ONLY this group
          buttons.forEach(b => b.classList.remove('active'));
          this.classList.add('active');

          const container = group.parentElement;

          // hide ONLY direct tab contents
          container.querySelectorAll(':scope > .mw-tab-content').forEach(c => {
            c.classList.remove('active');
          });

          const target = container.querySelector('#' + tabId);
          if (target) {
            target.classList.add('active');

            // 🔥 init mod system safely
            initModSystems(target);
          }

        });
      });

    });


    /* ================= MOD SYSTEM (ADDED SAFELY) ================= */

    function initModSystems(scope) {

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

        if (container.dataset.loaded) return;
        container.dataset.loaded = "true";

        const modType = container.dataset.mod;
        const db = document.querySelector(`#mod-database [data-mod="${modType}"]`);
        if (!db) return;

        const left = db.querySelector('[data-left]');
        const right = db.querySelector('[data-right]');
        if (!left || !right) return;

        const leftData = JSON.parse(left.dataset.left);
        const rightData = JSON.parse(right.dataset.right);

        const wrapper = document.createElement('div');
        wrapper.className = 'mw-dropdown-ui';
        wrapper.setAttribute('data-label', 'Select Mod');

        const output = document.createElement('div');
        output.className = 'mw-dropdown-output';
        output.textContent = 'Select options to see details';

        let selectedLeft = null;
        let selectedRight = null;

        function updateOutput() {
          if (!selectedLeft || !selectedRight) return;

          const key = `${selectedLeft}__${selectedRight}`;
          const content = db.querySelector(`[data-key="${key}"]`);
          output.innerHTML = content ? content.innerHTML : "No data found";
        }

        function createDropdown(data, label, isLeft) {
          const div = document.createElement('div');
          div.className = 'mod-dropdown';

          const btn = document.createElement('div');
          btn.className = 'mod-dropdown-btn';
          btn.textContent = label;

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

          Object.entries(data).forEach(([key, val]) => {
            const item = document.createElement('div');
            item.className = 'mod-dropdown-item';
            item.textContent = val;

            item.onclick = () => {
              btn.textContent = val;
              list.style.display = 'none';

              if (isLeft) selectedLeft = key;
              else selectedRight = key;

              updateOutput();
            };

            list.appendChild(item);
          });

          btn.onclick = () => {
            list.style.display = list.style.display === 'block' ? 'none' : 'block';
          };

          div.appendChild(btn);
          div.appendChild(list);

          return div;
        }

        wrapper.appendChild(createDropdown(leftData, 'Select Mod', true));
        wrapper.appendChild(createDropdown(rightData, 'Select Type', false));
        wrapper.appendChild(output);

        container.appendChild(wrapper);

      });

    }


    /* ================= INITIAL LOAD ================= */

    document.querySelectorAll('.mw-tab-buttons').forEach(group => {
      const first = group.querySelector('.mw-tab-btn');
      if (first) first.click();
    });

  });
});