Full-featured Seating Chart Plugin With jQuery - Seat Charts
| File Size: | 26.9 KB | 
|---|---|
| Views Total: | 46239 | 
| Last Update: | |
| Publish Date: | |
| Official Website: | Go to website | 
| License: | MIT | 
Seat Charts is a powerful jQuery plugin which helps you render an fully accessible and configurable seating chart / seat map in the webpage.
Features:
- WAI-ARIA compliant.
 - Custom seats, maps and legends.
 - Booking details.
 - Lots of API.
 
How to use it:
1. Add the jQuery Seat Charts plugin's JavaScript and stylesheet into your jQuery page.
<link rel="stylesheet" href="jquery.seat-charts.css"> <script src="//code.jquery.com/jquery.min.js"></script> <script src="jquery.seat-charts.js"></script>
2. Create the placeholder elements for the seat map.
<div id="seat-map"> <div class="front-indicator">Front</div> </div>
3. Create the placeholder elements for the booking details.
<div class="booking-details"> <h2>Booking Details</h2> <h3> Selected Seats (<span id="counter">0</span>):</h3> <ul id="selected-seats"> </ul> Total: <b>$<span id="total">0</span></b> <button class="checkout-button">Checkout »</button> <div id="legend"></div> </div>
4. Setup the plugin as follows:
var firstSeatLabel = 1;
  $(document).ready(function() {
    var $cart = $('#selected-seats'),
      $counter = $('#counter'),
      $total = $('#total'),
      sc = $('#seat-map').seatCharts({
      map: [
        'ff_ff',
        'ff_ff',
        'ee_ee',
        'ee_ee',
        'ee___',
        'ee_ee',
        'ee_ee',
        'ee_ee',
        'eeeee',
      ],
      seats: {
        f: {
          price   : 100,
          classes : 'first-class', //your custom CSS class
          category: 'First Class'
        },
        e: {
          price   : 40,
          classes : 'economy-class', //your custom CSS class
          category: 'Economy Class'
        }         
      
      },
      naming : {
        top : false,
        getLabel : function (character, row, column) {
          return firstSeatLabel++;
        },
      },
      legend : {
        node : $('#legend'),
          items : [
          [ 'f', 'available',   'First Class' ],
          [ 'e', 'available',   'Economy Class'],
          [ 'f', 'unavailable', 'Already Booked']
          ]         
      },
      click: function () {
        if (this.status() == 'available') {
          //let's create a new <li> which we'll add to the cart items
          $('<li>'+this.data().category+' Seat # '+this.settings.label+': <b>$'+this.data().price+'</b> <a href="#" class="cancel-cart-item">[cancel]</a></li>')
            .attr('id', 'cart-item-'+this.settings.id)
            .data('seatId', this.settings.id)
            .appendTo($cart);
          
          /*
           * Lets update the counter and total
           *
           * .find function will not find the current seat, because it will change its stauts only after return
           * 'selected'. This is why we have to add 1 to the length and the current seat price to the total.
           */
          $counter.text(sc.find('selected').length+1);
          $total.text(recalculateTotal(sc)+this.data().price);
          
          return 'selected';
        } else if (this.status() == 'selected') {
          //update the counter
          $counter.text(sc.find('selected').length-1);
          //and total
          $total.text(recalculateTotal(sc)-this.data().price);
        
          //remove the item from our cart
          $('#cart-item-'+this.settings.id).remove();
        
          //seat has been vacated
          return 'available';
        } else if (this.status() == 'unavailable') {
          //seat has been already booked
          return 'unavailable';
        } else {
          return this.style();
        }
      }
    });
    //this will handle "[cancel]" link clicks
    $('#selected-seats').on('click', '.cancel-cart-item', function () {
      //let's just trigger Click event on the appropriate seat, so we don't have to repeat the logic here
      sc.get($(this).parents('li:first').data('seatId')).click();
    });
    //let's pretend some seats have already been booked
    sc.get(['1_2', '4_1', '7_1', '7_2']).status('unavailable');
});
function recalculateTotal(sc) {
  var total = 0;
  //basically find every selected seat and sum its price
  sc.find('selected').each(function () {
    total += this.data().price;
  });
  
  return total;
}
4. All default options.
// requires jQuery UI animate : false, // specify your own column and row labels as well as functions for generating seat ids and labels naming : { top : true, left : true, getId : function(character, row, column) { return row + '_' + column; }, getLabel : function (character, row, column) { return column; } }, // custom legend legend : { node : null, items : [] }, // click function click : function() { if (this.status() == 'available') { return 'selected'; } else if (this.status() == 'selected') { return 'available'; } else { return this.style(); } }, // focus function focus : function() { if (this.status() == 'available') { return 'focused'; } else { return this.style(); } }, // blur function blur : function() { return this.status(); }, // seat map definition seats : {}
5. API methods.
var sc = $('#sc-container').seatCharts({
    //... 
});
//get 2_3 seat
sc.get('2_3'); 
//get 2_3 and 2_4 seats
sc.get(['2_3', '2_4']); 
//find all a seats
sc.find('a'); 
//find all unavailable seats
sc.find('unavailable'); 
//find all available a seats
sc.find('a.available'); 
//find all seats in the first row
sc.find(/^1_[0-9]+/); 
//find available seats within specified seat ids
sc.get(['1_2', '1_3', '1_4']).find('available'); 
//set status for one seat
sc.status('2_15', 'unvailable'); 
//set status for two seats
sc.status(['2_15', '2_10'], 'unvailable'); 
//make all unvailable seats available
sc.find('unavailable').status('available'); 
//make all unavailable seats disappear
sc.find('unavailable').node().fadeOut('fast'); 
//with callback
sc.find('a.unavailable').each(function(seatId) {
    console.log(this.data()); //display seat data
}); 
//If status argument is set, it will be used as a new seat status, otherwise current status will be returned.
sc.status( [status] )
//Returns a reference to jQuery element.
sc.node( )
//Returns a reference to seat data.
sc.data( )
//Returns seat character.
sc.char( )
Change log:
2016-12-29
- JS update
 
This awesome jQuery plugin is developed by mateuszmarkowski. For more Advanced Usages, please check the demo page or visit the official website.






