Actions

MediaWiki

Common.js: Difference between revisions

From Dune Awakening DB

mNo edit summary
mNo edit summary
Line 1: Line 1:
const dataTag = document.getElementById('radialMenuData');
// ✅ Replace static menuItems with dynamic data
const menuItems = dataTag ? JSON.parse(dataTag.textContent) : [];
$(document).ready(function() {
  const dataTag = document.getElementById('radialMenuData');
  const menuItems = dataTag ? JSON.parse(dataTag.textContent) : [];


const isMobile = () => window.innerWidth <= 768;
  const isMobile = () => window.innerWidth <= 768;


let radialItemsHTML = '';
  let radialItemsHTML = '';
menuItems.forEach((item, index) => {
  menuItems.forEach((item, index) => {
  const id = item.category.toLowerCase().replace(/\s+/g, '-');
    const id = item.category.toLowerCase().replace(/\s+/g, '-');
  item.id = id; // inject ID so submenu logic works
    item.id = id;


  radialItemsHTML += `
    radialItemsHTML += `
    <div class="dune-radial-item-container ${item.position}">
      <div class="dune-radial-item-container ${item.position}">
      <a data-id="${id}" class="dune-radial-item">
        <a data-id="${id}" class="dune-radial-item">
        <img src="${item.icon}" alt="${item.name}" class="dune-radial-icon">
          <img src="${item.icon}" alt="${item.name}" class="dune-radial-icon">
        <span class="dune-radial-tooltip">${item.name}</span>
          <span class="dune-radial-tooltip">${item.name}</span>
       </a>
        </a>
       </div>
    `;
  });
 
  const centerButtonHTML = `
    <a href="https://dunedb.com/Main_Page" class="dune-radial-center">
      <img src="https://dunedb.com/images/9/99/HomeNavIcon.png" alt="Home" class="dune-radial-icon">
      <span class="dune-radial-tooltip">Main Page</span>
    </a>
  `;
 
  const radialMenuHTML = `
    <div id="duneRadialMenu" class="dune-radial-menu">
      <div class="dune-radial-background">
        <div class="dune-radial-circle outer"></div>
        <div class="dune-radial-circle middle"></div>
        <div class="dune-radial-circle inner"></div>
      </div>
      ${centerButtonHTML}
      ${radialItemsHTML}
     </div>
     </div>
    <div id="duneRadialOverlay" class="dune-radial-overlay"></div>
   `;
   `;
});


const centerButtonHTML = `
  const subcategoryContainerHTML = `<div id="duneSubcategoryContainer" class="dune-subcategory-container"></div>`;
  <a href="https://dunedb.com/Main_Page" class="dune-radial-center">
  $('body').append(radialMenuHTML);
    <img src="https://dunedb.com/images/9/99/HomeNavIcon.png" alt="Home" class="dune-radial-icon">
   $('body').append(subcategoryContainerHTML);
    <span class="dune-radial-tooltip">Main Page</span>
   </a>
`;


const radialMenuHTML = `
   if (isMobile()) {
   <div id="duneRadialMenu" class="dune-radial-menu">
     $('#duneRadialMenu').addClass('mobile-grid');
    <div class="dune-radial-background">
   }
      <div class="dune-radial-circle outer"></div>
      <div class="dune-radial-circle middle"></div>
      <div class="dune-radial-circle inner"></div>
    </div>
    ${centerButtonHTML}
     ${radialItemsHTML}
   </div>
  <div id="duneRadialOverlay" class="dune-radial-overlay"></div>
`;


const subcategoryContainerHTML = `<div id="duneSubcategoryContainer" class="dune-subcategory-container"></div>`;
  const showSubcategories = (itemId, event) => {
$('body').append(radialMenuHTML);
    const item = menuItems.find(i => i.id === itemId);
$('body').append(subcategoryContainerHTML);
    if (!item || !item.subcategories) return;


if (isMobile()) {
    $('.dune-radial-item').removeClass('selected');
  $('#duneRadialMenu').addClass('mobile-grid');
    $(`.dune-radial-item[data-id="${itemId}"]`).addClass('selected');
}


const showSubcategories = (itemId, event) => {
    let subcategoryHTML = `
  const item = menuItems.find(i => i.id === itemId);
      <div class="dune-subcategory-header">
  if (!item || !item.subcategories) return;
        <img src="${item.icon}" alt="${item.name}" class="dune-subcategory-icon">
 
        <span>${item.name}</span>
  $('.dune-radial-item').removeClass('selected');
      </div>
  $(`.dune-radial-item[data-id="${itemId}"]`).addClass('selected');
      <div class="dune-subcategory-items">
    `;


  let subcategoryHTML = `
    item.subcategories.forEach((sub, index) => {
    <div class="dune-subcategory-header">
      subcategoryHTML += `
      <img src="${item.icon}" alt="${item.name}" class="dune-subcategory-icon">
        <a href="${sub.url}" class="dune-subcategory-item" style="--item-index: ${index}">
      <span>${item.name}</span>
          <span class="dune-subcategory-name">${sub.name}</span>
    </div>
        </a>
     <div class="dune-subcategory-items">
      `;
  `;
     });


  item.subcategories.forEach((sub, index) => {
     subcategoryHTML += `
     subcategoryHTML += `
       <a href="${sub.url}" class="dune-subcategory-item" style="--item-index: ${index}">
       </div>
        <span class="dune-subcategory-name">${sub.name}</span>
      <div class="dune-subcategory-footer">
       </a>
        <a href="${item.url}" class="dune-subcategory-all">View All ${item.name}</a>
       </div>
     `;
     `;
    const $subcategoryContainer = $('#duneSubcategoryContainer');
    $subcategoryContainer.html(subcategoryHTML);
    $subcategoryContainer.removeClass((index, className) => {
      return (className.match(/from-\S+/g) || []).join(' ');
    });
    $subcategoryContainer.addClass(`from-${item.position}`);
    $subcategoryContainer.addClass('active');
    event.stopPropagation();
  };
  const hideSubcategories = () => {
    $('#duneSubcategoryContainer').removeClass('active');
    $('.dune-radial-item').removeClass('selected');
  };
  $(document).on('click', '#duneLogoBtn', function(e) {
    e.preventDefault();
    e.stopPropagation();
    if ($('#duneRadialMenu').hasClass('active')) {
      hideSubcategories();
      $('#duneRadialMenu').removeClass('active');
      $('#duneRadialOverlay').removeClass('active');
    } else {
      $('#duneRadialMenu').addClass('active');
      $('#duneRadialOverlay').addClass('active');
      $('.dune-radial-item-container').each(function(index) {
        const $item = $(this);
        setTimeout(() => {
          $item.addClass('animated');
        }, index * 50);
      });
      setTimeout(() => {
        $('.dune-radial-center').addClass('animated');
      }, menuItems.length * 50);
    }
   });
   });


   subcategoryHTML += `
   $(document).on('click', '.dune-radial-item', function(e) {
     </div>
     e.preventDefault();
     <div class="dune-subcategory-footer">
     e.stopPropagation();
      <a href="${item.url}" class="dune-subcategory-all">View All ${item.name}</a>
    const itemId = $(this).data('id');
     </div>
    if ($(this).hasClass('selected')) {
   `;
      hideSubcategories();
    } else {
      showSubcategories(itemId, e);
     }
   });


   const $subcategoryContainer = $('#duneSubcategoryContainer');
   $(document).on('click', '#duneRadialOverlay', function() {
  $subcategoryContainer.html(subcategoryHTML);
    hideSubcategories();
    $('#duneRadialMenu').removeClass('active');
    $('#duneRadialOverlay').removeClass('active');
  });


   $subcategoryContainer.removeClass((index, className) => {
   $(document).on('keydown', function(e) {
    return (className.match(/from-\S+/g) || []).join(' ');
    if (e.key === 'Escape') {
      if ($('#duneSubcategoryContainer').hasClass('active')) {
        hideSubcategories();
      } else if ($('#duneRadialMenu').hasClass('active')) {
        $('#duneRadialMenu').removeClass('active');
        $('#duneRadialOverlay').removeClass('active');
      }
    }
   });
   });
  $subcategoryContainer.addClass(`from-${item.position}`);
  $subcategoryContainer.addClass('active');


   event.stopPropagation();
   $(window).on('resize', function() {
};
    if (isMobile()) {
      $('#duneRadialMenu').addClass('mobile-grid');
    } else {
      $('#duneRadialMenu').removeClass('mobile-grid');
    }
  });
});

Revision as of 22:53, 7 April 2025

// ✅ Replace static menuItems with dynamic data
$(document).ready(function() {
  const dataTag = document.getElementById('radialMenuData');
  const menuItems = dataTag ? JSON.parse(dataTag.textContent) : [];

  const isMobile = () => window.innerWidth <= 768;

  let radialItemsHTML = '';
  menuItems.forEach((item, index) => {
    const id = item.category.toLowerCase().replace(/\s+/g, '-');
    item.id = id;

    radialItemsHTML += `
      <div class="dune-radial-item-container ${item.position}">
        <a data-id="${id}" class="dune-radial-item">
          <img src="${item.icon}" alt="${item.name}" class="dune-radial-icon">
          <span class="dune-radial-tooltip">${item.name}</span>
        </a>
      </div>
    `;
  });

  const centerButtonHTML = `
    <a href="https://dunedb.com/Main_Page" class="dune-radial-center">
      <img src="https://dunedb.com/images/9/99/HomeNavIcon.png" alt="Home" class="dune-radial-icon">
      <span class="dune-radial-tooltip">Main Page</span>
    </a>
  `;

  const radialMenuHTML = `
    <div id="duneRadialMenu" class="dune-radial-menu">
      <div class="dune-radial-background">
        <div class="dune-radial-circle outer"></div>
        <div class="dune-radial-circle middle"></div>
        <div class="dune-radial-circle inner"></div>
      </div>
      ${centerButtonHTML}
      ${radialItemsHTML}
    </div>
    <div id="duneRadialOverlay" class="dune-radial-overlay"></div>
  `;

  const subcategoryContainerHTML = `<div id="duneSubcategoryContainer" class="dune-subcategory-container"></div>`;
  $('body').append(radialMenuHTML);
  $('body').append(subcategoryContainerHTML);

  if (isMobile()) {
    $('#duneRadialMenu').addClass('mobile-grid');
  }

  const showSubcategories = (itemId, event) => {
    const item = menuItems.find(i => i.id === itemId);
    if (!item || !item.subcategories) return;

    $('.dune-radial-item').removeClass('selected');
    $(`.dune-radial-item[data-id="${itemId}"]`).addClass('selected');

    let subcategoryHTML = `
      <div class="dune-subcategory-header">
        <img src="${item.icon}" alt="${item.name}" class="dune-subcategory-icon">
        <span>${item.name}</span>
      </div>
      <div class="dune-subcategory-items">
    `;

    item.subcategories.forEach((sub, index) => {
      subcategoryHTML += `
        <a href="${sub.url}" class="dune-subcategory-item" style="--item-index: ${index}">
          <span class="dune-subcategory-name">${sub.name}</span>
        </a>
      `;
    });

    subcategoryHTML += `
      </div>
      <div class="dune-subcategory-footer">
        <a href="${item.url}" class="dune-subcategory-all">View All ${item.name}</a>
      </div>
    `;

    const $subcategoryContainer = $('#duneSubcategoryContainer');
    $subcategoryContainer.html(subcategoryHTML);

    $subcategoryContainer.removeClass((index, className) => {
      return (className.match(/from-\S+/g) || []).join(' ');
    });
    $subcategoryContainer.addClass(`from-${item.position}`);
    $subcategoryContainer.addClass('active');

    event.stopPropagation();
  };

  const hideSubcategories = () => {
    $('#duneSubcategoryContainer').removeClass('active');
    $('.dune-radial-item').removeClass('selected');
  };

  $(document).on('click', '#duneLogoBtn', function(e) {
    e.preventDefault();
    e.stopPropagation();
    if ($('#duneRadialMenu').hasClass('active')) {
      hideSubcategories();
      $('#duneRadialMenu').removeClass('active');
      $('#duneRadialOverlay').removeClass('active');
    } else {
      $('#duneRadialMenu').addClass('active');
      $('#duneRadialOverlay').addClass('active');
      $('.dune-radial-item-container').each(function(index) {
        const $item = $(this);
        setTimeout(() => {
          $item.addClass('animated');
        }, index * 50);
      });
      setTimeout(() => {
        $('.dune-radial-center').addClass('animated');
      }, menuItems.length * 50);
    }
  });

  $(document).on('click', '.dune-radial-item', function(e) {
    e.preventDefault();
    e.stopPropagation();
    const itemId = $(this).data('id');
    if ($(this).hasClass('selected')) {
      hideSubcategories();
    } else {
      showSubcategories(itemId, e);
    }
  });

  $(document).on('click', '#duneRadialOverlay', function() {
    hideSubcategories();
    $('#duneRadialMenu').removeClass('active');
    $('#duneRadialOverlay').removeClass('active');
  });

  $(document).on('keydown', function(e) {
    if (e.key === 'Escape') {
      if ($('#duneSubcategoryContainer').hasClass('active')) {
        hideSubcategories();
      } else if ($('#duneRadialMenu').hasClass('active')) {
        $('#duneRadialMenu').removeClass('active');
        $('#duneRadialOverlay').removeClass('active');
      }
    }
  });

  $(window).on('resize', function() {
    if (isMobile()) {
      $('#duneRadialMenu').addClass('mobile-grid');
    } else {
      $('#duneRadialMenu').removeClass('mobile-grid');
    }
  });
});