Jump to content

MediaWiki:Common.js: Difference between revisions

From Once Human Guide
No edit summary
No edit summary
Line 1: Line 1:
mw.loader.using('mediawiki.util').then(function () {
mw.loader.using(['mediawiki.util']).then(function () {
   $(function () {
   $(function () {


     const data = {
     console.log("FINAL SYSTEM LOADED");


      slot1: `<table class="wikitable">
    /* ================= TAB SYSTEM (SCOPED + SAFE) ================= */
      <tr><th>Trait</th><th>Effect</th></tr>
      <tr><td>Cheer Up</td><td>Max Mood +30–50%; Power recovery -5%</td></tr>
      <tr><td>Covert Energy</td><td>Max Power +10–35%</td></tr>
      <tr><td>Feeling Blue</td><td>Max Mood -5–10%</td></tr>
      <tr><td>Growing Pains</td><td>Max Power +30–50%; Mood recovery -5%</td></tr>
      <tr><td>Optimist</td><td>Max Mood +15–35%</td></tr>
      <tr><td>Power Rewind</td><td>Power recovery +5–10%</td></tr>
      <tr><td>Rise and Shine</td><td>Mood recovery +5–25%</td></tr>
      <tr><td>Stable Energy</td><td>Max Power +30</td></tr>
      <tr><td>Stable Vitality</td><td>Max Mood +30</td></tr>
      <tr><td>Upper Hand</td><td>Convert Mood → Power at 0</td></tr>
      <tr><td>Worn-out</td><td>Max Power -5–10%</td></tr>
      </table>`,


      slot1_dev: `<table class="wikitable">
    document.querySelectorAll('.mw-tab-buttons').forEach(group => {
      <tr><th>Trait</th><th>Effect</th><th>Deviant</th></tr>
      <tr><td>Pumpkin Lantern</td><td>+10% Power</td><td>Buzzy Bee</td></tr>
      <tr><td>Gold Lightning</td><td>+15% Power Recovery</td><td>Electric Eel</td></tr>
      <tr><td>Optimism – Good Fortune</td><td>+40% Mood</td><td>Extradimensional Cat</td></tr>
      <tr><td>Aquarius</td><td>+30% Mood Recovery</td><td>Fetch-A-Lot</td></tr>
      <tr><td>Golden Toad</td><td>+20% Mood Recovery</td><td>Flame Essence</td></tr>
      <tr><td>Shadow Shroom</td><td>+40% Energy</td><td>Growshroom</td></tr>
      <tr><td>Prototype</td><td>+10% Power Recovery</td><td>H37</td></tr>
      <tr><td>Evergreen</td><td>2% chance to bring Bait</td><td>Hydronaut Fish</td></tr>
      <tr><td>Feisty Vitality</td><td>+30% Mood Recovery</td><td>Nutcracker</td></tr>
      <tr><td>Witch's Beloved</td><td>+20% Mood Recovery</td><td>Paper Doll</td></tr>
      <tr><td>Childlike Whimsy</td><td>+30% Power Recovery</td><td>Rain Man</td></tr>
      <tr><td>Radiance</td><td>+40% Power</td><td>Tar Pudding</td></tr>
      <tr><td>Emerald</td><td>+10% Power Recovery</td><td>The Digby Boy</td></tr>
      </table>`,


       slot2: `<table class="wikitable">
       const buttons = group.querySelectorAll('.mw-tab-btn');
      <tr><th>Trait</th><th>Effect</th></tr>
      <tr><td>A World of Charm</td><td>10% give +20 Mood</td></tr>
      <tr><td>Anti-Burnout</td><td>20% give +5 Power</td></tr>
      <tr><td>Devoted Laborer</td><td>+20% duration</td></tr>
      <tr><td>Dream Wild</td><td>10% give +10 Power</td></tr>
      <tr><td>Hydrophilic</td><td>+30% recovery near water</td></tr>
      <tr><td>Lazy Bones</td><td>-5% speed</td></tr>
      <tr><td>Living Map</td><td>-5% interval</td></tr>
      <tr><td>OnePlus</td><td>Rare crystals chance</td></tr>
      <tr><td>Panovision</td><td>-10% speed</td></tr>
      <tr><td>Slacking Off</td><td>+5% consumption</td></tr>
      <tr><td>Stardust Affinity</td><td>20% no Mood cost</td></tr>
      <tr><td>Sweet Talk</td><td>20% give Mood</td></tr>
      <tr><td>Voluntary Overtime</td><td>10% no Mood cost</td></tr>
      <tr><td>Workaholic</td><td>+10% duration</td></tr>
      </table>`,


       slot2_dev: `<table class="wikitable">
       buttons.forEach(btn => {
      <tr><th>Trait</th><th>Effect</th><th>Deviant</th></tr>
        btn.addEventListener('click', function () {
      <tr><td>Lunar Oracle</td><td>+20% duration</td><td>Electric Eel</td></tr>
      <tr><td>Daydreaming</td><td>Restore Power</td><td>Extradimensional Cat</td></tr>
      <tr><td>Toxicologist – Green Touch</td><td>25% no Power cost</td><td>Growshroom</td></tr>
      <tr><td>Admiral</td><td>3% no Power cost</td><td>Nutcracker</td></tr>
      <tr><td>Diamond Duke</td><td>5% no cost</td><td>Nutcracker</td></tr>
      <tr><td>Workaholic – Lights</td><td>+20% duration</td><td>Nutcracker</td></tr>
      <tr><td>Gold Speaker</td><td>Extra ores</td><td>The Digby Boy</td></tr>
      </table>`,


      slot3: `<table class="wikitable">
          const tabId = this.getAttribute('data-tab');
      <tr><th>Trait</th><th>Effect</th></tr>
      <tr><td>Brute Force Rules</td><td>10% double output</td></tr>
      <tr><td>Clean and Hygienic</td><td>Sanity floor 20%</td></tr>
      <tr><td>Extra Load</td><td>+15% storage</td></tr>
      <tr><td>Feline Creatures</td><td>Extra item chance</td></tr>
      <tr><td>Moonlight Assault</td><td>+15% recovery at night</td></tr>
      <tr><td>Top Grunt</td><td>Mood → Energy conversion</td></tr>
      </table>`
    };


    $(document).on("change", "#traitDropdown", function () {
          // deactivate only this group
       const value = $(this).val();
          buttons.forEach(b => b.classList.remove('active'));
      $("#traitContent").html(data[value] || "<b>Provide Trait information here</b>");
          this.classList.add('active');
 
          const container = group.parentElement;
 
          // hide only direct children tabs
          container.querySelectorAll(':scope > .mw-tab-content').forEach(c => {
            c.classList.remove('active');
          });
 
          const target = container.querySelector('#' + tabId);
          if (target) {
            target.classList.add('active');
 
            // render dropdowns inside visible tab
            initDropdowns(target);
          }
 
        });
      });
 
    });
 
 
    /* ================= DROPDOWN SYSTEM (DATA-OPTIONS ONLY) ================= */
 
    function initDropdowns(scope) {
 
       scope.querySelectorAll('.mw-dropdown-ui[data-options]').forEach(container => {
 
        if (container.dataset.rendered) return;
 
        let data;
        try {
          data = JSON.parse(container.dataset.options);
        } catch (e) {
          console.error("Bad dropdown JSON:", e);
          return;
        }
 
        // CLEAR ONLY ONCE (safe)
        container.innerHTML = '';
 
        // BUTTON
        const btn = document.createElement('div');
        btn.className = 'mod-dropdown-btn';
        btn.textContent = 'Select One';
 
        // LIST
        const list = document.createElement('div');
        list.className = 'mod-dropdown-list';
 
        // OUTPUT
        const output = document.createElement('div');
        output.className = 'mw-dropdown-output';
        output.textContent = 'Select something to see details';
 
        // SORT ALPHABETICALLY
        Object.values(data)
          .sort((a, b) => a.label.localeCompare(b.label))
          .forEach(item => {
 
            const option = document.createElement('div');
            option.className = 'mod-dropdown-item';
            option.textContent = item.label;
 
            option.onclick = () => {
              btn.textContent = item.label;
              list.style.display = 'none';
              output.innerHTML = item.content;
            };
 
            list.appendChild(option);
          });
 
        // TOGGLE
        btn.onclick = () => {
          list.style.display = list.style.display === 'block' ? 'none' : 'block';
        };
 
        // BUILD
        container.appendChild(btn);
        container.appendChild(list);
        container.appendChild(output);
 
        container.dataset.rendered = "true";
 
      });
 
    }
 
 
    /* ================= INITIAL LOAD ================= */
 
    document.querySelectorAll('.mw-tab-buttons').forEach(group => {
      const first = group.querySelector('.mw-tab-btn');
      if (first) first.click();
     });
     });


   });
   });
});
});

Revision as of 22:01, 21 April 2026

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

    console.log("FINAL SYSTEM LOADED");

    /* ================= TAB SYSTEM (SCOPED + SAFE) ================= */

    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 children tabs
          container.querySelectorAll(':scope > .mw-tab-content').forEach(c => {
            c.classList.remove('active');
          });

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

            // render dropdowns inside visible tab
            initDropdowns(target);
          }

        });
      });

    });


    /* ================= DROPDOWN SYSTEM (DATA-OPTIONS ONLY) ================= */

    function initDropdowns(scope) {

      scope.querySelectorAll('.mw-dropdown-ui[data-options]').forEach(container => {

        if (container.dataset.rendered) return;

        let data;
        try {
          data = JSON.parse(container.dataset.options);
        } catch (e) {
          console.error("Bad dropdown JSON:", e);
          return;
        }

        // CLEAR ONLY ONCE (safe)
        container.innerHTML = '';

        // BUTTON
        const btn = document.createElement('div');
        btn.className = 'mod-dropdown-btn';
        btn.textContent = 'Select One';

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

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

        // SORT ALPHABETICALLY
        Object.values(data)
          .sort((a, b) => a.label.localeCompare(b.label))
          .forEach(item => {

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

            option.onclick = () => {
              btn.textContent = item.label;
              list.style.display = 'none';
              output.innerHTML = item.content;
            };

            list.appendChild(option);
          });

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

        // BUILD
        container.appendChild(btn);
        container.appendChild(list);
        container.appendChild(output);

        container.dataset.rendered = "true";

      });

    }


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

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

  });
});