UNPKG

rizzo-next

Version:

The next generation of Lonely Planet's style guide and pattern library.

286 lines (217 loc) 8.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _bane = require("../../core/bane"); var _overlay = require("../overlay"); var _overlay2 = _interopRequireDefault(_overlay); var _waitForTransition = require("../../core/utils/waitForTransition"); var _waitForTransition2 = _interopRequireDefault(_waitForTransition); var _search_state = require("./search_state"); var _search_state2 = _interopRequireDefault(_search_state); var _search = require("./search.hbs"); var _search2 = _interopRequireDefault(_search); var _search_item = require("./search_item"); var _search_item2 = _interopRequireDefault(_search_item); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // import SearchActions from "./search_actions"; var SearchComponent = function (_Component) { _inherits(SearchComponent, _Component); function SearchComponent() { _classCallCheck(this, SearchComponent); return _possibleConstructorReturn(this, (SearchComponent.__proto__ || Object.getPrototypeOf(SearchComponent)).apply(this, arguments)); } _createClass(SearchComponent, [{ key: "initialize", value: function initialize() { var _this2 = this; this.build(); this.events = { "click .js-lp-search-close": function clickJsLpSearchClose(e) { e.preventDefault(); _this2.hide(); }, "keydown .lp-search__input": "onKeyup" }; this.collection = []; this.overlay = new _overlay2.default({ preventScroll: true }); this.listenTo(this.overlay, "click", this.hide); _search_state2.default.on("change:results", this.searchComplete.bind(this)); } }, { key: "build", value: function build() { this.$el = $((0, _search2.default)()); this.$input = this.$el.find(".js-lp-search-input"); this.$searchResults = this.$el.find(".js-lp-search-results"); this.$list = this.$searchResults.find(".js-lp-search-results-list"); this.$resultsLink = this.$searchResults.find(".js-lp-search-results-more"); } }, { key: "show", value: function show() { var _this3 = this; if (this.isOpen) { return Promise.all([]); } this.isOpen = true; this.$el.appendTo(document.body); this.overlay.show(); setTimeout(function () { _this3.$el.addClass(SearchComponent.className + "--visible"); }, 10); this.$input.focus(); } }, { key: "hide", value: function hide() { var _this4 = this; if (!this.isOpen) { return Promise.all([]); } this.isOpen = false; this.$el.removeClass(SearchComponent.className + "--visible"); this.overlay.hide(); return (0, _waitForTransition2.default)(this.$el, { fallbackTime: 100 }).then(function () { _this4.$el.detach(); }); } }, { key: "searchComplete", value: function searchComplete(data) { var _this5 = this; var collection = []; this.$list.empty(); this.currentPosition = -1; this.$resultsLink.attr("href", "https://www.lonelyplanet.com/search?q=" + this.$input.val()); data.results.forEach(function (model) { collection.push(_this5.addOne(model)); }); this.collection = collection; return this.$input.val(); } }, { key: "onKeyup", value: function onKeyup(e) { if (!this.isOpen) { return; } switch (e.keyCode) { case 13: // enter if (this.currentPosition !== -1 && this.collection[this.currentPosition]) { this.collection[this.currentPosition].navigate(); break; } window.location.href = "https://www.lonelyplanet.com/search?q=" + this.$input.val(); break; case 27: // esc this.hide(); break; case 38: //up if (!this.collection.length) { return; } e.preventDefault(); this.goUp(); break; case 40: //down if (!this.collection.length) { return; } e.preventDefault(); this.goDown(); break; default: // TODO: Uncomment to re-enable autosuggest // clearTimeout(this.searchTimer); // this.searchTimer = window.setTimeout(() => { // SearchActions.typing({ // query: this.$input.val() // }); // }, 200); break; } } }, { key: "goUp", value: function goUp() { this.currentPosition--; if (this.currentPosition < 0) { this.currentPosition = 0; return; } var currentItem = this.collection[this.currentPosition]; this.collection.forEach(function (itemComponent) { itemComponent.unselect(); }); currentItem.select(); } }, { key: "goDown", value: function goDown() { this.currentPosition++; if (this.currentPosition >= this.collection.length) { this.currentPosition = this.collection.length - 1; } var currentItem = this.collection[this.currentPosition]; this.collection.forEach(function (itemComponent) { itemComponent.unselect(); }); currentItem.select(); } }, { key: "addOne", value: function addOne(model) { var itemComponent = new _search_item2.default({ model: model, searchString: this.$input.val() }); itemComponent.render().$el.appendTo(this.$list); return itemComponent; } }, { key: "isOpen", get: function get() { if (this._isOpen === undefined) { this._isOpen = false; } return this._isOpen; }, set: function set(val) { this._isOpen = val || false; } }, { key: "collection", get: function get() { if (this._collection === undefined) { this._collection = []; } return this._collection; }, set: function set(arr) { this._collection = arr; if (this._collection.length > 0) { this.$searchResults.addClass("lp-search-results--visible"); } else { this.$searchResults.removeClass("lp-search-results--visible"); } } }], [{ key: "className", get: function get() { return "lp-search"; } }]); return SearchComponent; }(_bane.Component); exports.default = SearchComponent;