app.js

9.19 KB
07/11/2025 11:18
JS
app.js
// Main Application Logic

// Modal Functions
function openModal(modalId) {
  const modal = document.getElementById(modalId);
  if (modal) {
    modal.classList.add('active');
  }
}

function closeModal(modalId) {
  const modal = document.getElementById(modalId);
  if (modal) {
    modal.classList.remove('active');
  }
}

// Navigation
function navigateToPage(pageName) {
  // Hide all pages
  document.querySelectorAll('.page').forEach(page => {
    page.classList.remove('active');
  });

  // Show selected page
  const targetPage = document.getElementById(`${pageName}-page`);
  if (targetPage) {
    targetPage.classList.add('active');
  }

  // Update sidebar active state
  document.querySelectorAll('.sidebar-nav li').forEach(li => {
    li.classList.remove('active');
  });

  const activeLink = document.querySelector(`[data-page="${pageName}"]`);
  if (activeLink) {
    activeLink.parentElement.classList.add('active');
  }

  // Load page-specific data
  switch (pageName) {
    case 'dashboard':
      initDashboard();
      break;
    case 'users':
      initUserManagement();
      break;
    case 'products':
      loadProducts();
      break;
    case 'orders':
      loadOrders();
      break;
    case 'analytics':
      initCharts();
      break;
  }
}

// Initialize Application
document.addEventListener('DOMContentLoaded', () => {
  // Skip initialization on login page
  if (window.location.pathname.includes('login.html')) {
    return;
  }

  // Sidebar toggle
  const sidebarToggle = document.getElementById('sidebarToggle');
  const sidebar = document.getElementById('sidebar');

  if (sidebarToggle && sidebar) {
    sidebarToggle.addEventListener('click', () => {
      sidebar.classList.toggle('collapsed');
    });
  }

  // Mobile toggle
  const mobileToggle = document.getElementById('mobileToggle');
  if (mobileToggle && sidebar) {
    mobileToggle.addEventListener('click', () => {
      sidebar.classList.toggle('active');
    });
  }

  // Theme toggle
  const themeToggle = document.getElementById('themeToggle');
  if (themeToggle) {
    themeToggle.addEventListener('click', () => {
      const currentTheme = document.documentElement.getAttribute('data-theme');
      const newTheme = currentTheme === 'dark' ? 'light' : 'dark';

      document.documentElement.setAttribute('data-theme', newTheme);
      storage.set('theme', newTheme);

      const icon = themeToggle.querySelector('i');
      if (newTheme === 'dark') {
        icon.classList.remove('fa-moon');
        icon.classList.add('fa-sun');
      } else {
        icon.classList.remove('fa-sun');
        icon.classList.add('fa-moon');
      }
    });

    // Load saved theme
    const savedTheme = storage.get('theme');
    if (savedTheme) {
      document.documentElement.setAttribute('data-theme', savedTheme);
      const icon = themeToggle.querySelector('i');
      if (savedTheme === 'dark') {
        icon.classList.remove('fa-moon');
        icon.classList.add('fa-sun');
      }
    }
  }

  // Notification button
  const notificationBtn = document.getElementById('notificationBtn');
  if (notificationBtn) {
    notificationBtn.addEventListener('click', () => {
      showToast('You have 3 new notifications', 'info', 'Notifications');
    });
  }

  // User dropdown
  const userMenu = document.querySelector('.user-menu img');
  const userDropdown = document.getElementById('userDropdown');
  const userMenuContainer = document.querySelector('.user-menu');

  if (userMenu && userDropdown) {
    userMenu.addEventListener('click', (e) => {
      e.stopPropagation();
      userDropdown.classList.toggle('active');
    });

    // Prevent dropdown from closing when clicking inside it
    if (userMenuContainer) {
      userMenuContainer.addEventListener('click', (e) => {
        e.stopPropagation();
      });
    }

    // Close dropdown when clicking outside
    document.addEventListener('click', (e) => {
      if (!userMenuContainer.contains(e.target)) {
        userDropdown.classList.remove('active');
      }
    });
  }

  // Navigation links
  document.querySelectorAll('[data-page]').forEach(link => {
    link.addEventListener('click', (e) => {
      e.preventDefault();
      const pageName = link.getAttribute('data-page');
      navigateToPage(pageName);
    });
  });

  // Modal close buttons
  document.querySelectorAll('[data-modal]').forEach(btn => {
    btn.addEventListener('click', () => {
      const modalId = btn.getAttribute('data-modal');
      closeModal(modalId);
    });
  });

  // Close modal on outside click
  document.querySelectorAll('.modal').forEach(modal => {
    modal.addEventListener('click', (e) => {
      if (e.target === modal) {
        modal.classList.remove('active');
      }
    });
  });

  // Add product button
  const addProductBtn = document.getElementById('addProductBtn');
  if (addProductBtn) {
    addProductBtn.addEventListener('click', () => {
      // Reset form to add mode
      const productForm = document.getElementById('productForm');
      const modalTitle = document.querySelector('#productModal .modal-header h2');

      if (productForm) {
        productForm.reset();
        delete productForm.dataset.editProductId;
        delete productForm.dataset.editMode;
      }

      if (modalTitle) {
        modalTitle.textContent = 'Add Product';
      }

      openModal('productModal');
    });
  }

  // Product form
  const productForm = document.getElementById('productForm');
  if (productForm) {
    productForm.addEventListener('submit', async (e) => {
      e.preventDefault();

      if (!validateForm(productForm)) {
        showToast('Please fill in all required fields', 'error');
        return;
      }

      const formData = new FormData(productForm);
      const isEditMode = productForm.dataset.editMode === 'true';
      const productId = productForm.dataset.editProductId;

      const productData = {
        name: formData.get('name'),
        category: formData.get('category'),
        price: formData.get('price'),
        stock: formData.get('stock'),
        description: formData.get('description')
      };

      try {
        showLoading();

        let response;
        if (isEditMode && productId) {
          response = await mockApi.updateProduct(productId, productData);
          if (response.success) {
            showToast('Product updated successfully', 'success');
          }
        } else {
          response = await mockApi.createProduct(productData);
          if (response.success) {
            showToast('Product added successfully', 'success');
          }
        }

        if (response.success) {
          closeModal('productModal');
          loadProducts();
          productForm.reset();
          delete productForm.dataset.editProductId;
          delete productForm.dataset.editMode;

          // Reset modal title
          const modalTitle = document.querySelector('#productModal .modal-header h2');
          if (modalTitle) {
            modalTitle.textContent = 'Add Product';
          }
        }
      } catch (error) {
        showToast(isEditMode ? 'Failed to update product' : 'Failed to add product', 'error');
      } finally {
        hideLoading();
      }
    });
  }

  // Order form
  const orderForm = document.getElementById('orderForm');
  if (orderForm) {
    orderForm.addEventListener('submit', async (e) => {
      e.preventDefault();

      if (!validateForm(orderForm)) {
        showToast('Please fill in all required fields', 'error');
        return;
      }

      const formData = new FormData(orderForm);
      const orderId = orderForm.dataset.editOrderId;

      const orderData = {
        customer: formData.get('customer'),
        products: parseInt(formData.get('products')),
        total: parseFloat(formData.get('total')),
        status: formData.get('status')
      };

      try {
        showLoading();

        const response = await mockApi.updateOrder(orderId, orderData);

        if (response.success) {
          showToast('Order updated successfully', 'success');
          closeModal('orderModal');
          loadOrders();
          orderForm.reset();
          delete orderForm.dataset.editOrderId;
          delete orderForm.dataset.editMode;
        }
      } catch (error) {
        showToast('Failed to update order', 'error');
      } finally {
        hideLoading();
      }
    });
  }

  // Settings form
  const profileForm = document.getElementById('profileForm');
  if (profileForm) {
    profileForm.addEventListener('submit', (e) => {
      e.preventDefault();
      showToast('Profile updated successfully', 'success');
    });
  }

  // Theme select in settings
  const themeSelect = document.getElementById('themeSelect');
  if (themeSelect) {
    themeSelect.value = storage.get('theme') || 'light';

    themeSelect.addEventListener('change', (e) => {
      const theme = e.target.value;
      document.documentElement.setAttribute('data-theme', theme);
      storage.set('theme', theme);
      showToast('Theme updated', 'success');
    });
  }

  // Initialize dashboard on load
  initDashboard();

  // Close sidebar on mobile when clicking outside
  document.addEventListener('click', (e) => {
    if (window.innerWidth <= 768) {
      if (!sidebar.contains(e.target) && !mobileToggle.contains(e.target)) {
        sidebar.classList.remove('active');
      }
    }
  });
});