๐Ÿ“ฆ shadcn / Tray

๐Ÿ“„ tray.js ยท 92 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92/* $Id$ */
(function ($) {
  Drupal.behaviors.tray = {
    attach: function(context, settings) {
      
      //fix for right items block position
      $('li.tray-item-position-right:not(.tray-item-processed)', context).each(function() {
        var handle = $(this).find('.tray-item-handle');
        var p = handle.offset();
        $(this).find('.tray-item-block').css({
          right : parseInt($('body').width()) - (p.left + parseInt(handle.parent('li').width()) + 1)
        });
      }).addClass('tray-item-processed');
      
      //on click event
      $('.tray-item-handle:not(.tray-item-processed)', context).click(function(e){
        e.preventDefault();
        var $item = $(this);
        //check if the item is ajax processed and fire the call if the event is open
        if($item.parent('li').hasClass('tray-item-ajax-processed') && !$item.parent('li').hasClass('tray-item-active')) {
          //add ajax classes
          $item.parent('li').addClass('tray-item-ajax-processing');
          var bid = parseInt($(this).parent('li').attr('id').replace('tray-item-', ''));

          $.ajax({
            method : 'GET',
            dataType: 'json',
            url: Drupal.settings.tray.trayPath + '/' + bid,
            success : function(data){
              $('#tray-item-' + bid).find('.tray-item-content').html(data.content);
              //remove ajax classes
              $item.parent('li').removeClass('tray-item-ajax-processing');
              showItem($item);
            },
            complete: function(xhr, error){
              //console.info('Complete');
              //console.log(error);
              //console.log(xhr);
            },
            error: function(xhr, error){
              console.info('Error');
              console.log(error);
              console.log(xhr);

              $('#tray-item-' + bid).find('.tray-item-content').html('Error:'+xhr.statusText);
              $item.parent('li').removeClass('tray-item-ajax-processing');
              showItem($item);
            }
          })


        } else {
          showItem($item);
        }
      }).addClass('tray-item-processed');
        
      //minimize tray item
      $('.tray-item-minimize:not(.tray-item-processed)').click(function(e){
        e.preventDefault();
        minimizeActiveItem();
      }).addClass('tray-item-processed');
        
      //close tray item
      $('.tray-item-close:not(.tray-item-processed)').click(function(e){
        e.preventDefault();
        closeActiveItem();
      }).addClass('tray-item-processed');
    }
  }
  
  function showItem($item) {
    $('.tray-item-active').removeClass('tray-item-active');
    $item.parent('li').toggleClass('tray-item-active');
    $('li.tray-item').each(function(){
      if(!$(this).hasClass('tray-item-active')){
        $(this).find('.tray-item-block').hide();
      }
    });
    $item.next('.tray-item-block').slideToggle(100);
  }
  
  function minimizeActiveItem() {
    $('.tray-item-active').find('.tray-item-block').slideToggle(100);
    $('.tray-item-active').removeClass('tray-item-active');
  }
  
  function closeActiveItem() {
    $('.tray-item-active').find('.tray-item-block').fadeOut(250);
    $('.tray-item-active').removeClass('tray-item-active');
  }
  
})(jQuery);