isomorphic-search
Version:
A configurable search interface.
181 lines (149 loc) • 5.32 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['exports'], factory);
} else if (typeof exports !== "undefined") {
factory(exports);
} else {
var mod = {
exports: {}
};
factory(mod.exports);
global.presentation = mod.exports;
}
})(this, function (exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
/**
* Client-side
*/
var presentation = {
insertAt: function insertAt($container, action, index, content) {
var siblings = $container.children();
if (siblings.length) {
return siblings.eq(index).after(content);
}
return $container[action](content);
},
render: function render($container, content, _ref) {
var _ref$action = _ref.action,
action = _ref$action === undefined ? 'append' : _ref$action,
_ref$index = _ref.index,
index = _ref$index === undefined ? false : _ref$index;
if (!index && index !== 0) {
$container[action](content);
} else {
this.insertAt($container, content, { action: action, index: index });
}
return;
},
renderSearchResults: function renderSearchResults(results, abstraction) {
// Reset view.
abstraction.$el.noResults.remove();
// Get elements.
var $el = abstraction.$el,
el = abstraction.el,
attr = abstraction.attr,
identifier = abstraction.identifier,
template = abstraction.template,
hiddenClass = attr.hidden,
$results = $el.results,
$resultsList = $el.resultsList,
$li = $el.result,
li = el.result;
// Empty view before rendering results only.
$li.addClass(hiddenClass);
if (!results || !results.length) {
$resultsList.prepend(template.noResults(abstraction));
return results;
}
results.forEach(function (result) {
// Display matching search result.
$results.find(li + '[data-' + identifier + '="' + result[identifier] + '"]').removeClass(hiddenClass);
});
return results;
},
search: {
// Cancel search.
cancel: function cancel(event, _ref2) {
var attr = _ref2.attr,
$el = _ref2.$el,
icon = _ref2.icon,
metadata = _ref2.metadata;
var cancelClass = icon.cancel,
hiddenClass = attr.hidden,
iconClasses = cancelClass + ' ' + icon.search,
input = metadata.input,
search = $el.input.val();
// Reset value of search field.
$el.input.val('');
// Remove no results view.
$el.noResults.remove();
// Hide results from view.
$el.results.addClass(hiddenClass);
// Reveal individual results so they'll be exposed with container.
$el.result.removeClass(hiddenClass);
// Toggle from cancel button to search button.
$el.container.find('.' + cancelClass).toggleClass(iconClasses);
// Execute callback.
if (input && input.cancel && input.cancel.callback) {
input.cancel.callback(event, search);
}
},
// Update input.
// @TODO Review change method.
change: function change(event, abstraction, data, engine, searchCallback) {
var input = abstraction.metadata.input;
// Execute search.
var search = searchCallback(abstraction, data, engine);
// Execute callback on change.
if (input && input.change && input.change.callback) {
input.change.callback(event, search);
}
},
// Focus on input.
focus: function focus(event, abstraction) {
var $el = abstraction.$el,
attr = abstraction.attr,
icon = abstraction.icon,
template = abstraction.template,
metadata = abstraction.metadata,
input = metadata.input,
hiddenClass = attr.hidden,
search = $el.input.val();
// Replace the search icon with the cancel icon.
$el.submit.removeClass(icon.search).addClass(icon.cancel);
// Display all potential results.
$el.results.removeClass(hiddenClass);
// Execute callback.
if (input && input.focus && input.focus.callback) {
input.focus.callback(event, search);
}
return true;
}
},
bind: function bind(abstraction, data, engine, onChangeCallback) {
var _this = this;
var attr = abstraction.attr,
$el = abstraction.$el,
icon = abstraction.icon;
// Set events on search input.
$el.input.off().on('focus', function (event) {
_this.search.focus(event, abstraction);
}).on('keyup, paste, input', function (event) {
_this.search.change(event, abstraction, data, engine, onChangeCallback);
});
$el.menu.off().
// Set events on search icon.
on('click', '.' + icon.search, function (event) {
_this.search.focus(event, abstraction);
}).
// Set events on cancel icon.
on('click', '.' + icon.cancel, function (event) {
_this.search.cancel(event, abstraction);
});
}
};
exports.default = presentation;
});