diff --git a/.gitmodules b/.gitmodules index 5d6f25d3b3..d0d9ca48c5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "public/vendor/BrowserQuest"] path = public/vendor/BrowserQuest url = https://github.com/mozilla/BrowserQuest.git +[submodule "public/vendor/bootstrap-tour"] + path = public/vendor/bootstrap-tour + url = git://github.com/sorich87/bootstrap-tour.git diff --git a/public/vendor/bootstrap-tour b/public/vendor/bootstrap-tour new file mode 160000 index 0000000000..4f94fa056c --- /dev/null +++ b/public/vendor/bootstrap-tour @@ -0,0 +1 @@ +Subproject commit 4f94fa056c88c6099dea135b644d8f95d38ac9e1 diff --git a/public/vendor/bootstrap-tour.js b/public/vendor/bootstrap-tour.js deleted file mode 100644 index 3ed1b2bbf9..0000000000 --- a/public/vendor/bootstrap-tour.js +++ /dev/null @@ -1,271 +0,0 @@ - -/* ============================================================ - # bootstrap-tour.js v0.1 - # http://pushly.github.com/bootstrap-tour/ - # ============================================================== - # Copyright 2012 Push.ly - # - # Licensed under the Apache License, Version 2.0 (the "License"); - # you may not use this file except in compliance with the License. - # You may obtain a copy of the License at - # - # http://www.apache.org/licenses/LICENSE-2.0 - # - # Unless required by applicable law or agreed to in writing, software - # distributed under the License is distributed on an "AS IS" BASIS, - # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - # See the License for the specific language governing permissions and - # limitations under the License. - */ - -(function() { - - (function($, window) { - var Tour, document; - document = window.document; - Tour = (function() { - - function Tour(options) { - var _this = this; - this._options = $.extend({ - name: 'tour', - labels: { - end: 'End tour', - next: 'Next »', - prev: '« Prev' - }, - keyboard: true, - afterSetState: function(key, value) {}, - afterGetState: function(key, value) {}, - onShow: function(tour) {}, - onHide: function(tour) {}, - onShown: function(tour) {} - }, options); - this._steps = []; - this.setCurrentStep(); - this._onresize(function() { - if (!_this.ended) return _this.showStep(_this._current); - }); - } - - Tour.prototype.setState = function(key, value) { - $.cookie("" + this._options.name + "_" + key, value, { - expires: 36500, - path: '/' - }); - return this._options.afterSetState(key, value); - }; - - Tour.prototype.getState = function(key) { - var value; - value = $.cookie("" + this._options.name + "_" + key); - this._options.afterGetState(key, value); - return value; - }; - - Tour.prototype.addStep = function(step) { - return this._steps.push(step); - }; - - Tour.prototype.getStep = function(i) { - if (this._steps[i] != null) { - return $.extend({ - path: "", - placement: "right", - title: "", - content: "", - next: i === this._steps.length - 1 ? -1 : i + 1, - prev: i - 1, - animation: true, - onShow: this._options.onShow, - onHide: this._options.onHide, - onShown: this._options.onShown - }, this._steps[i]); - } - }; - - Tour.prototype.start = function(force) { - var _this = this; - if (force == null) force = false; - if (this.ended() && !force) return; - $(document).off("click.bootstrap-tour", ".popover .next").on("click.bootstrap-tour", ".popover .next", function(e) { - e.preventDefault(); - return _this.next(); - }); - $(document).off("click.bootstrap-tour", ".popover .prev").on("click.bootstrap-tour", ".popover .prev", function(e) { - e.preventDefault(); - return _this.prev(); - }); - $(document).off("click.bootstrap-tour", ".popover .end").on("click.bootstrap-tour", ".popover .end", function(e) { - e.preventDefault(); - return _this.end(); - }); - this._setupKeyboardNavigation(); - return this.showStep(this._current); - }; - - Tour.prototype.next = function() { - this.hideStep(this._current); - return this.showNextStep(); - }; - - Tour.prototype.prev = function() { - this.hideStep(this._current); - return this.showPrevStep(); - }; - - Tour.prototype.end = function() { - this.hideStep(this._current); - $(document).off(".bootstrap-tour"); - return this.setState("end", "yes"); - }; - - Tour.prototype.ended = function() { - return !!this.getState("end"); - }; - - Tour.prototype.restart = function() { - this.setState("current_step", null); - this.setState("end", null); - this.setCurrentStep(0); - return this.start(); - }; - - Tour.prototype.hideStep = function(i) { - var step; - step = this.getStep(i); - if (step.onHide != null) step.onHide(this); - return $(step.element).popover("hide"); - }; - - Tour.prototype.showStep = function(i) { - var step; - step = this.getStep(i); - if (!step) return; - this.setCurrentStep(i); - if (step.path !== "" && document.location.pathname !== step.path && document.location.pathname.replace(/^.*[\\\/]/, '') !== step.path) { - document.location.href = step.path; - return; - } - if (step.onShow != null) step.onShow(this); - if (!((step.element != null) && $(step.element).length !== 0 && $(step.element).is(":visible"))) { - this.showNextStep(); - return; - } - this._showPopover(step, i); - if (step.onShown != null) return step.onShown(this); - }; - - Tour.prototype.setCurrentStep = function(value) { - if (value != null) { - this._current = value; - return this.setState("current_step", value); - } else { - this._current = this.getState("current_step"); - if (this._current === null || this._current === "null") { - return this._current = 0; - } else { - return this._current = parseInt(this._current); - } - } - }; - - Tour.prototype.showNextStep = function() { - var step; - step = this.getStep(this._current); - return this.showStep(step.next); - }; - - Tour.prototype.showPrevStep = function() { - var step; - step = this.getStep(this._current); - return this.showStep(step.prev); - }; - - Tour.prototype._showPopover = function(step, i) { - var content, nav, options, tip, - _this = this; - content = "" + step.content + "

"; - options = $.extend({}, this._options); - if (step.options) $.extend(options, step.options); - if (step.reflex) { - $(step.element).css("cursor", "pointer"); - $(step.element).on("click", function(e) { - $(step.element).css("cursor", "auto"); - return _this.next(); - }); - } - nav = []; - if (step.prev >= 0) { - nav.push(""); - } - if (step.next >= 0) { - nav.push(""); - } - content += nav.join(" | "); - content += "" + options.labels.end + ""; - $(step.element).popover({ - placement: step.placement, - trigger: "manual", - title: step.title, - content: content, - html: true, - animation: step.animation - }).popover("show"); - tip = $(step.element).data("popover").tip(); - this._reposition(tip); - return this._scrollIntoView(tip); - }; - - Tour.prototype._reposition = function(tip) { - var offsetBottom, offsetRight, tipOffset; - tipOffset = tip.offset(); - offsetBottom = $(document).outerHeight() - tipOffset.top - $(tip).outerHeight(); - if (offsetBottom < 0) tipOffset.top = tipOffset.top + offsetBottom; - offsetRight = $(document).outerWidth() - tipOffset.left - $(tip).outerWidth(); - if (offsetRight < 0) tipOffset.left = tipOffset.left + offsetRight; - if (tipOffset.top < 0) tipOffset.top = 0; - if (tipOffset.left < 0) tipOffset.left = 0; - return tip.offset(tipOffset); - }; - - Tour.prototype._scrollIntoView = function(tip) { - var tipRect; - tipRect = tip.get(0).getBoundingClientRect(); - if (!(tipRect.top > 0 && tipRect.bottom < $(window).height() && tipRect.left > 0 && tipRect.right < $(window).width())) { - return tip.get(0).scrollIntoView(true); - } - }; - - Tour.prototype._onresize = function(cb, timeout) { - return $(window).resize(function() { - clearTimeout(timeout); - return timeout = setTimeout(cb, 100); - }); - }; - - Tour.prototype._setupKeyboardNavigation = function() { - var _this = this; - if (this._options.keyboard) { - return $(document).on("keyup.bootstrap-tour", function(e) { - if (!e.which) return; - switch (e.which) { - case 39: - e.preventDefault(); - if (_this._current < _this._steps.length - 1) return _this.next(); - break; - case 37: - e.preventDefault(); - if (_this._current > 0) return _this.prev(); - } - }); - } - }; - - return Tour; - - })(); - return window.Tour = Tour; - })(jQuery, window); - -}).call(this); \ No newline at end of file diff --git a/src/app/browser.coffee b/src/app/browser.coffee index 7c5e47f59f..ef6ff8d9ec 100644 --- a/src/app/browser.coffee +++ b/src/app/browser.coffee @@ -39,7 +39,7 @@ loadJavaScripts = (model) -> require '../../public/vendor/jquery-cookie/jquery.cookie' - require '../../public/vendor/bootstrap-tour' #https://raw.github.com/pushly/bootstrap-tour/master/bootstrap-tour.js + require '../../public/vendor/bootstrap-tour/bootstrap-tour' require '../../public/vendor/bootstrap-datepicker/js/bootstrap-datepicker' require '../../public/vendor/bootstrap-growl/jquery.bootstrap-growl.min' @@ -133,12 +133,8 @@ setupTour = (model) -> $('.main-avatar').popover('destroy') #remove previous popovers tour = new Tour() _.each tourSteps, (step) -> - tour.addStep - html: true - element: step.element - title: step.title - content: step.content - placement: step.placement + tour.addStep _.defaults step, {html:true} + tour._current = 0 if isNaN(tour._current) #bootstrap-tour bug tour.start() ###