192 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
/**
 | 
						|
* DO NOT EDIT THIS FILE.
 | 
						|
* See the following change record for more information,
 | 
						|
* https://www.drupal.org/node/2815083
 | 
						|
* @preserve
 | 
						|
**/
 | 
						|
 | 
						|
(function ($, Drupal, drupalSettings, Backbone) {
 | 
						|
  Drupal.toolbar.ToolbarVisualView = Backbone.View.extend({
 | 
						|
    events() {
 | 
						|
      const touchEndToClick = function (event) {
 | 
						|
        event.preventDefault();
 | 
						|
        event.target.click();
 | 
						|
      };
 | 
						|
 | 
						|
      return {
 | 
						|
        'click .toolbar-bar .toolbar-tab .trigger': 'onTabClick',
 | 
						|
        'click .toolbar-toggle-orientation button': 'onOrientationToggleClick',
 | 
						|
        'touchend .toolbar-bar .toolbar-tab .trigger': touchEndToClick,
 | 
						|
        'touchend .toolbar-toggle-orientation button': touchEndToClick
 | 
						|
      };
 | 
						|
    },
 | 
						|
 | 
						|
    initialize(options) {
 | 
						|
      this.strings = options.strings;
 | 
						|
      this.listenTo(this.model, 'change:activeTab change:orientation change:isOriented change:isTrayToggleVisible', this.render);
 | 
						|
      this.listenTo(this.model, 'change:mqMatches', this.onMediaQueryChange);
 | 
						|
      this.listenTo(this.model, 'change:offsets', this.adjustPlacement);
 | 
						|
      this.listenTo(this.model, 'change:activeTab change:orientation change:isOriented', this.updateToolbarHeight);
 | 
						|
      this.$el.find('.toolbar-tray .toolbar-lining').has('.toolbar-menu').append(Drupal.theme('toolbarOrientationToggle'));
 | 
						|
      this.model.trigger('change:activeTab');
 | 
						|
    },
 | 
						|
 | 
						|
    updateToolbarHeight() {
 | 
						|
      const toolbarTabOuterHeight = $('#toolbar-bar').find('.toolbar-tab').outerHeight() || 0;
 | 
						|
      const toolbarTrayHorizontalOuterHeight = $('.is-active.toolbar-tray-horizontal').outerHeight() || 0;
 | 
						|
      this.model.set('height', toolbarTabOuterHeight + toolbarTrayHorizontalOuterHeight);
 | 
						|
      $('body').css({
 | 
						|
        'padding-top': this.model.get('height')
 | 
						|
      });
 | 
						|
      $('html').css({
 | 
						|
        'scroll-padding-top': this.model.get('height')
 | 
						|
      });
 | 
						|
      this.triggerDisplace();
 | 
						|
    },
 | 
						|
 | 
						|
    triggerDisplace() {
 | 
						|
      _.defer(() => {
 | 
						|
        Drupal.displace(true);
 | 
						|
      });
 | 
						|
    },
 | 
						|
 | 
						|
    render() {
 | 
						|
      this.updateTabs();
 | 
						|
      this.updateTrayOrientation();
 | 
						|
      this.updateBarAttributes();
 | 
						|
      $('body').removeClass('toolbar-loading');
 | 
						|
 | 
						|
      if (this.model.changed.orientation === 'vertical' || this.model.changed.activeTab) {
 | 
						|
        this.loadSubtrees();
 | 
						|
      }
 | 
						|
 | 
						|
      return this;
 | 
						|
    },
 | 
						|
 | 
						|
    onTabClick(event) {
 | 
						|
      if (event.currentTarget.hasAttribute('data-toolbar-tray')) {
 | 
						|
        const activeTab = this.model.get('activeTab');
 | 
						|
        const clickedTab = event.currentTarget;
 | 
						|
        this.model.set('activeTab', !activeTab || clickedTab !== activeTab ? clickedTab : null);
 | 
						|
        event.preventDefault();
 | 
						|
        event.stopPropagation();
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    onOrientationToggleClick(event) {
 | 
						|
      const orientation = this.model.get('orientation');
 | 
						|
      const antiOrientation = orientation === 'vertical' ? 'horizontal' : 'vertical';
 | 
						|
      const locked = antiOrientation === 'vertical';
 | 
						|
 | 
						|
      if (locked) {
 | 
						|
        localStorage.setItem('Drupal.toolbar.trayVerticalLocked', 'true');
 | 
						|
      } else {
 | 
						|
        localStorage.removeItem('Drupal.toolbar.trayVerticalLocked');
 | 
						|
      }
 | 
						|
 | 
						|
      this.model.set({
 | 
						|
        locked,
 | 
						|
        orientation: antiOrientation
 | 
						|
      }, {
 | 
						|
        validate: true,
 | 
						|
        override: true
 | 
						|
      });
 | 
						|
      event.preventDefault();
 | 
						|
      event.stopPropagation();
 | 
						|
    },
 | 
						|
 | 
						|
    updateTabs() {
 | 
						|
      const $tab = $(this.model.get('activeTab'));
 | 
						|
      $(this.model.previous('activeTab')).removeClass('is-active').prop('aria-pressed', false);
 | 
						|
      $(this.model.previous('activeTray')).removeClass('is-active');
 | 
						|
 | 
						|
      if ($tab.length > 0) {
 | 
						|
        $tab.addClass('is-active').prop('aria-pressed', true);
 | 
						|
        const name = $tab.attr('data-toolbar-tray');
 | 
						|
        const id = $tab.get(0).id;
 | 
						|
 | 
						|
        if (id) {
 | 
						|
          localStorage.setItem('Drupal.toolbar.activeTabID', JSON.stringify(id));
 | 
						|
        }
 | 
						|
 | 
						|
        const $tray = this.$el.find(`[data-toolbar-tray="${name}"].toolbar-tray`);
 | 
						|
 | 
						|
        if ($tray.length) {
 | 
						|
          $tray.addClass('is-active');
 | 
						|
          this.model.set('activeTray', $tray.get(0));
 | 
						|
        } else {
 | 
						|
          this.model.set('activeTray', null);
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        this.model.set('activeTray', null);
 | 
						|
        localStorage.removeItem('Drupal.toolbar.activeTabID');
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    updateBarAttributes() {
 | 
						|
      const isOriented = this.model.get('isOriented');
 | 
						|
 | 
						|
      if (isOriented) {
 | 
						|
        this.$el.find('.toolbar-bar').attr('data-offset-top', '');
 | 
						|
      } else {
 | 
						|
        this.$el.find('.toolbar-bar').removeAttr('data-offset-top');
 | 
						|
      }
 | 
						|
 | 
						|
      this.$el.toggleClass('toolbar-oriented', isOriented);
 | 
						|
    },
 | 
						|
 | 
						|
    updateTrayOrientation() {
 | 
						|
      const orientation = this.model.get('orientation');
 | 
						|
      const antiOrientation = orientation === 'vertical' ? 'horizontal' : 'vertical';
 | 
						|
      $('body').toggleClass('toolbar-vertical', orientation === 'vertical').toggleClass('toolbar-horizontal', orientation === 'horizontal');
 | 
						|
      const removeClass = antiOrientation === 'horizontal' ? 'toolbar-tray-horizontal' : 'toolbar-tray-vertical';
 | 
						|
      const $trays = this.$el.find('.toolbar-tray').removeClass(removeClass).addClass(`toolbar-tray-${orientation}`);
 | 
						|
      const iconClass = `toolbar-icon-toggle-${orientation}`;
 | 
						|
      const iconAntiClass = `toolbar-icon-toggle-${antiOrientation}`;
 | 
						|
      const $orientationToggle = this.$el.find('.toolbar-toggle-orientation').toggle(this.model.get('isTrayToggleVisible'));
 | 
						|
      const $orientationToggleButton = $orientationToggle.find('button');
 | 
						|
      $orientationToggleButton[0].value = antiOrientation;
 | 
						|
      $orientationToggleButton.attr('title', this.strings[antiOrientation]).removeClass(iconClass).addClass(iconAntiClass);
 | 
						|
      $orientationToggleButton[0].textContent = this.strings[antiOrientation];
 | 
						|
      const dir = document.documentElement.dir;
 | 
						|
      const edge = dir === 'rtl' ? 'right' : 'left';
 | 
						|
      $trays.removeAttr('data-offset-left data-offset-right data-offset-top');
 | 
						|
      $trays.filter('.toolbar-tray-vertical.is-active').attr(`data-offset-${edge}`, '');
 | 
						|
      $trays.filter('.toolbar-tray-horizontal.is-active').attr('data-offset-top', '');
 | 
						|
    },
 | 
						|
 | 
						|
    adjustPlacement() {
 | 
						|
      const $trays = this.$el.find('.toolbar-tray');
 | 
						|
 | 
						|
      if (!this.model.get('isOriented')) {
 | 
						|
        $trays.removeClass('toolbar-tray-horizontal').addClass('toolbar-tray-vertical');
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    loadSubtrees() {
 | 
						|
      const $activeTab = $(this.model.get('activeTab'));
 | 
						|
      const orientation = this.model.get('orientation');
 | 
						|
 | 
						|
      if (!this.model.get('areSubtreesLoaded') && typeof $activeTab.data('drupal-subtrees') !== 'undefined' && orientation === 'vertical') {
 | 
						|
        const subtreesHash = drupalSettings.toolbar.subtreesHash;
 | 
						|
        const theme = drupalSettings.ajaxPageState.theme;
 | 
						|
        const endpoint = Drupal.url(`toolbar/subtrees/${subtreesHash}`);
 | 
						|
        const cachedSubtreesHash = localStorage.getItem(`Drupal.toolbar.subtreesHash.${theme}`);
 | 
						|
        const cachedSubtrees = JSON.parse(localStorage.getItem(`Drupal.toolbar.subtrees.${theme}`));
 | 
						|
        const isVertical = this.model.get('orientation') === 'vertical';
 | 
						|
 | 
						|
        if (isVertical && subtreesHash === cachedSubtreesHash && cachedSubtrees) {
 | 
						|
          Drupal.toolbar.setSubtrees.resolve(cachedSubtrees);
 | 
						|
        } else if (isVertical) {
 | 
						|
          localStorage.removeItem(`Drupal.toolbar.subtreesHash.${theme}`);
 | 
						|
          localStorage.removeItem(`Drupal.toolbar.subtrees.${theme}`);
 | 
						|
          Drupal.ajax({
 | 
						|
            url: endpoint
 | 
						|
          }).execute();
 | 
						|
          localStorage.setItem(`Drupal.toolbar.subtreesHash.${theme}`, subtreesHash);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
  });
 | 
						|
})(jQuery, Drupal, drupalSettings, Backbone); |