Chris@0: /** Chris@0: * DO NOT EDIT THIS FILE. Chris@0: * See the following change record for more information, Chris@0: * https://www.drupal.org/node/2815083 Chris@0: * @preserve Chris@0: **/ Chris@0: Chris@0: (function ($, Backbone, Drupal, document) { Chris@0: var queryString = decodeURI(window.location.search); Chris@0: Chris@0: Drupal.behaviors.tour = { Chris@0: attach: function attach(context) { Chris@0: $('body').once('tour').each(function () { Chris@0: var model = new Drupal.tour.models.StateModel(); Chris@0: new Drupal.tour.views.ToggleTourView({ Chris@0: el: $(context).find('#toolbar-tab-tour'), Chris@0: model: model Chris@0: }); Chris@0: Chris@0: model.on('change:isActive', function (model, isActive) { Chris@0: $(document).trigger(isActive ? 'drupalTourStarted' : 'drupalTourStopped'); Chris@0: }).set('tour', $(context).find('ol#tour')); Chris@0: Chris@0: if (/tour=?/i.test(queryString)) { Chris@0: model.set('isActive', true); Chris@0: } Chris@0: }); Chris@0: } Chris@0: }; Chris@0: Chris@0: Drupal.tour = Drupal.tour || { Chris@0: models: {}, Chris@0: Chris@0: views: {} Chris@0: }; Chris@0: Chris@0: Drupal.tour.models.StateModel = Backbone.Model.extend({ Chris@0: defaults: { Chris@0: tour: [], Chris@0: Chris@0: isActive: false, Chris@0: Chris@0: activeTour: [] Chris@0: } Chris@0: }); Chris@0: Chris@0: Drupal.tour.views.ToggleTourView = Backbone.View.extend({ Chris@0: events: { click: 'onClick' }, Chris@0: Chris@0: initialize: function initialize() { Chris@0: this.listenTo(this.model, 'change:tour change:isActive', this.render); Chris@0: this.listenTo(this.model, 'change:isActive', this.toggleTour); Chris@0: }, Chris@0: render: function render() { Chris@0: this.$el.toggleClass('hidden', this._getTour().length === 0); Chris@0: Chris@0: var isActive = this.model.get('isActive'); Chris@0: this.$el.find('button').toggleClass('is-active', isActive).prop('aria-pressed', isActive); Chris@0: return this; Chris@0: }, Chris@0: toggleTour: function toggleTour() { Chris@0: if (this.model.get('isActive')) { Chris@0: var $tour = this._getTour(); Chris@0: this._removeIrrelevantTourItems($tour, this._getDocument()); Chris@0: var that = this; Chris@14: var close = Drupal.t('Close'); Chris@0: if ($tour.find('li').length) { Chris@0: $tour.joyride({ Chris@0: autoStart: true, Chris@0: postRideCallback: function postRideCallback() { Chris@0: that.model.set('isActive', false); Chris@0: }, Chris@0: Chris@0: template: { Chris@14: link: '×', Chris@14: button: '' Chris@0: } Chris@0: }); Chris@0: this.model.set({ isActive: true, activeTour: $tour }); Chris@0: } Chris@0: } else { Chris@0: this.model.get('activeTour').joyride('destroy'); Chris@0: this.model.set({ isActive: false, activeTour: [] }); Chris@0: } Chris@0: }, Chris@0: onClick: function onClick(event) { Chris@0: this.model.set('isActive', !this.model.get('isActive')); Chris@0: event.preventDefault(); Chris@0: event.stopPropagation(); Chris@0: }, Chris@0: _getTour: function _getTour() { Chris@0: return this.model.get('tour'); Chris@0: }, Chris@0: _getDocument: function _getDocument() { Chris@0: return $(document); Chris@0: }, Chris@0: _removeIrrelevantTourItems: function _removeIrrelevantTourItems($tour, $document) { Chris@0: var removals = false; Chris@0: var tips = /tips=([^&]+)/.exec(queryString); Chris@0: $tour.find('li').each(function () { Chris@0: var $this = $(this); Chris@0: var itemId = $this.attr('data-id'); Chris@0: var itemClass = $this.attr('data-class'); Chris@0: Chris@0: if (tips && !$(this).hasClass(tips[1])) { Chris@0: removals = true; Chris@0: $this.remove(); Chris@0: return; Chris@0: } Chris@0: Chris@0: if (!itemId && !itemClass || itemId && $document.find('#' + itemId).length || itemClass && $document.find('.' + itemClass).length) { Chris@0: return; Chris@0: } Chris@0: removals = true; Chris@0: $this.remove(); Chris@0: }); Chris@0: Chris@0: if (removals) { Chris@0: var total = $tour.find('li').length; Chris@0: if (!total) { Chris@0: this.model.set({ tour: [] }); Chris@0: } Chris@0: Chris@0: $tour.find('li').each(function (index) { Chris@17: var progress = Drupal.t('!tour_item of !total', { Chris@17: '!tour_item': index + 1, Chris@17: '!total': total Chris@17: }); Chris@0: $(this).find('.tour-progress').text(progress); Chris@0: }).eq(-1).attr('data-text', Drupal.t('End tour')); Chris@0: } Chris@0: } Chris@0: }); Chris@0: })(jQuery, Backbone, Drupal, document);