CMU529: Full-Stack Web Development
                Session 11: Modern JavaScript Libraries
                Duration: 3 hours
                Topics: Modern JavaScript libraries, AJAX, DOM manipulation, interactive features
            
            
            
                Session Timeline
                
                    10 min: Registration & waiting
                    20 min: Opening slides
                    45 min: Task 1
                    15 min: Break/Catch up
                    20 min: Secondary slides
                    45 min: Task 2
                    Remaining: Self-study
                 
            
            
            
                Modern JavaScript Overview
                
                    Key Areas:
                    
                        - ES6+ Features
 
                        - AJAX & Fetch API
 
                        - DOM Manipulation
 
                        - Event Handling
 
                        - Popular Libraries
 
                    
                 
            
            
            
                ES6+ Features
                
                    // Arrow Functions
                    const add = (a, b) => a + b;
                    
                    // Template Literals
                    const name = "John";
                    const greeting = `Hello, ${name}!`;
                    
                    // Destructuring
                    const user = { name: "John", age: 30 };
                    const { name, age } = user;
                    
                    // Spread Operator
                    const numbers = [1, 2, 3];
                    const newNumbers = [...numbers, 4, 5];
                    
                    // Classes
                    class User {
                      constructor(name) {
                        this.name = name;
                      }
                      greet() {
                        return `Hello, ${this.name}!`;
                      }
                    }
                
            
            
            
                AJAX & Fetch API
                
                    // Fetch API - GET request
                    fetch('/api/users')
                      .then(response => response.json())
                      .then(data => {
                        console.log(data);
                      })
                      .catch(error => {
                        console.error('Error:', error);
                      });
                    
                    // POST request
                    fetch('/api/users', {
                      method: 'POST',
                      headers: {
                        'Content-Type': 'application/json',
                      },
                      body: JSON.stringify({
                        name: 'John',
                        email: 'john@example.com'
                      })
                    })
                
            
            
            
                Async/Await
                
                    // Async function
                    async function fetchUserData() {
                      try {
                        const response = await fetch('/api/users/1');
                        const user = await response.json();
                        return user;
                      } catch (error) {
                        console.error('Error:', error);
                      }
                    }
                    
                    // Using the async function
                    fetchUserData().then(user => {
                      console.log(user);
                    });
                
            
            
            
                DOM Manipulation
                
                    // Selecting elements
                    const element = document.getElementById('myElement');
                    const elements = document.querySelectorAll('.myClass');
                    
                    // Creating elements
                    const newDiv = document.createElement('div');
                    newDiv.textContent = 'New Element';
                    newDiv.className = 'new-class';
                    
                    // Adding to DOM
                    document.body.appendChild(newDiv);
                    
                    // Modifying content
                    element.innerHTML = '<strong>Updated content</strong>';
                    element.setAttribute('data-id', '123');
                
            
            
            
                Event Handling
                
                    // Event listener
                    document.getElementById('myButton').addEventListener('click', function(e) {
                      e.preventDefault();
                      console.log('Button clicked!');
                    });
                    
                    // Form submission
                    document.getElementById('myForm').addEventListener('submit', async function(e) {
                      e.preventDefault();
                      const formData = new FormData(this);
                      const data = Object.fromEntries(formData);
                      console.log(data);
                    });
                    
                    // Keyboard events
                    document.addEventListener('keydown', function(e) {
                      if (e.key === 'Enter') {
                        console.log('Enter pressed');
                      }
                    });
                
            
            
            
                Popular JavaScript Libraries
                
                    Essential Libraries:
                    
                        - jQuery - DOM manipulation & AJAX
 
                        - Lodash - Utility functions
 
                        - Axios - HTTP client
 
                        - Chart.js - Data visualization
 
                        - SweetAlert2 - Beautiful alerts
 
                    
                 
            
            
            
                jQuery Basics
                
                    // Include jQuery
                    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
                    
                    // Document ready
                    $(document).ready(function() {
                      console.log('jQuery loaded!');
                    });
                    
                    // Selecting elements
                    $('#myElement').hide();
                    $('.myClass').show();
                    
                    // AJAX with jQuery
                    $.ajax({
                      url: '/api/data',
                      method: 'GET',
                      success: function(data) {
                        console.log(data);
                      }
                    });
                
            
            
            
                Axios HTTP Client
                
                    // Include Axios
                    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
                    
                    // GET request
                    axios.get('/api/users')
                      .then(response => {
                        console.log(response.data);
                      })
                      .catch(error => {
                        console.error(error);
                      });
                    
                    // POST request
                    axios.post('/api/users', {
                      name: 'John',
                      email: 'john@example.com'
                    })
                      .then(response => {
                        console.log(response.data);
                      });
                
            
            
            
                Chart.js
                
                    // Include Chart.js
                    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
                    
                    // Create chart
                    const ctx = document.getElementById('myChart').getContext('2d');
                    const myChart = new Chart(ctx, {
                      type: 'bar',
                      data: {
                        labels: ['Red', 'Blue', 'Yellow'],
                        datasets: [{
                          label: 'Sales',
                          data: [12, 19, 3],
                          backgroundColor: ['red', 'blue', 'yellow']
                        }]
                      }
                    });
                
            
            
            
                SweetAlert2
                
                    // Include SweetAlert2
                    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
                    
                    // Basic alert
                    Swal.fire('Hello world!');
                    
                    // Confirmation dialog
                    Swal.fire({
                      title: 'Are you sure?',
                      text: "You won't be able to revert this!",
                      icon: 'warning',
                      showCancelButton: true,
                      confirmButtonText: 'Yes, delete it!'
                    }).then((result) => {
                      if (result.isConfirmed) {
                        Swal.fire('Deleted!', 'Your file has been deleted.', 'success');
                      }
                    });
                
            
            
            
                Form Validation
                
                    // Client-side validation
                    function validateForm() {
                      const email = document.getElementById('email').value;
                      const password = document.getElementById('password').value;
                    
                      if (!email.includes('@')) {
                        alert('Please enter a valid email');
                        return false;
                      }
                    
                      if (password.length < 6) {
                        alert('Password must be at least 6 characters');
                        return false;
                      }
                    
                      return true;
                    }
                    
                    // Real-time validation
                    document.getElementById('email').addEventListener('blur', function() {
                      if (!this.value.includes('@')) {
                        this.style.borderColor = 'red';
                      } else {
                        this.style.borderColor = 'green';
                      }
                    });
                
            
            
            
                Local Storage
                
                    // Store data
                    localStorage.setItem('user', JSON.stringify({
                      name: 'John',
                      email: 'john@example.com'
                    }));
                    
                    // Retrieve data
                    const user = JSON.parse(localStorage.getItem('user'));
                    console.log(user.name); // John
                    
                    // Remove data
                    localStorage.removeItem('user');
                    
                    // Clear all data
                    localStorage.clear();
                    
                    // Session storage (temporary)
                    sessionStorage.setItem('temp', 'temporary data');
                
            
            
            
                Task 1: Interactive Form
                
                    Create an interactive contact form:
                    
                        - Build a responsive contact form with HTML/CSS
 
                        - Add real-time form validation using JavaScript
 
                        - Implement AJAX form submission using Fetch API
 
                        - Add loading states and success/error messages
 
                        - Use SweetAlert2 for beautiful notifications
 
                        - Store form data in localStorage as backup
 
                    
                    Time: 45 minutes
                 
            
            
            
                Advanced Features
                
                    Additional Advanced Topics:
                    
                        - Web APIs (Geolocation, Canvas, WebSocket)
 
                        - Progressive Web Apps (PWA)
 
                        - Service Workers
 
                        - Web Components
 
                    
                 
            
            
            
                Geolocation API
                
                    // Get user location
                    if (navigator.geolocation) {
                      navigator.geolocation.getCurrentPosition(
                        function(position) {
                          const latitude = position.coords.latitude;
                          const longitude = position.coords.longitude;
                          console.log(`Lat: ${latitude}, Lng: ${longitude}`);
                        },
                        function(error) {
                          console.error('Error getting location:', error);
                        }
                      );
                    } else {
                      console.log('Geolocation not supported');
                    }
                
            
            
            
                Canvas API
                
                    // Get canvas context
                    const canvas = document.getElementById('myCanvas');
                    const ctx = canvas.getContext('2d');
                    
                    // Draw shapes
                    ctx.fillStyle = 'red';
                    ctx.fillRect(10, 10, 100, 100);
                    
                    ctx.beginPath();
                    ctx.arc(200, 60, 50, 0, 2 * Math.PI);
                    ctx.fillStyle = 'blue';
                    ctx.fill();
                    
                    // Draw text
                    ctx.font = '20px Arial';
                    ctx.fillStyle = 'black';
                    ctx.fillText('Hello Canvas!', 10, 150);
                
            
            
            
                Service Workers
                
                    // Register service worker
                    if ('serviceWorker' in navigator) {
                      navigator.serviceWorker.register('/sw.js')
                        .then(registration => {
                          console.log('SW registered');
                        })
                        .catch(error => {
                          console.log('SW registration failed');
                        });
                    }
                    
                    // sw.js - Cache files
                    self.addEventListener('install', event => {
                      event.waitUntil(
                        caches.open('v1').then(cache => {
                          return cache.addAll([
                            '/',
                            '/styles.css',
                            '/script.js'
                          ]);
                        })
                      );
                    });
                
            
            
            
                Task 2: Interactive Dashboard
                
                    Create an interactive dashboard:
                    
                        - Build a responsive dashboard layout
 
                        - Integrate Chart.js for data visualization
 
                        - Add real-time data updates using AJAX
 
                        - Implement user preferences with localStorage
 
                        - Add interactive filters and search functionality
 
                        - Create smooth animations and transitions
 
                    
                    Time: 45 minutes
                 
            
            
            
                Session Summary
                
                    Key Takeaways:
                    
                        - Modern JavaScript provides powerful features for web development
 
                        - AJAX enables dynamic content without page reloads
 
                        - Popular libraries enhance functionality and user experience
 
                        - Client-side validation improves user interaction
 
                        - Local storage enables offline functionality
 
                    
                 
                Next Session: Final Project Development