Not longer needed.
This commit is contained in:
parent
cb13aeadda
commit
1f3f5f6849
3 changed files with 0 additions and 314 deletions
|
@ -1,276 +0,0 @@
|
||||||
/**
|
|
||||||
* jQuery plugin for getting position of cursor in textarea
|
|
||||||
* @license under dfyw (do the fuck you want)
|
|
||||||
* @author leChantaux (@leChantaux)
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function ($, window, undefined) {
|
|
||||||
// Create the defaults once
|
|
||||||
var elementFactory = function (element, value) {
|
|
||||||
element.text(value.val);
|
|
||||||
};
|
|
||||||
|
|
||||||
var pluginName = 'sew',
|
|
||||||
document = window.document,
|
|
||||||
defaults = {
|
|
||||||
token: '@',
|
|
||||||
elementFactory: elementFactory,
|
|
||||||
values: [],
|
|
||||||
unique: false,
|
|
||||||
repeat: true
|
|
||||||
};
|
|
||||||
|
|
||||||
function Plugin(element, options) {
|
|
||||||
this.element = element;
|
|
||||||
this.$element = $(element);
|
|
||||||
this.$itemList = $(Plugin.MENU_TEMPLATE);
|
|
||||||
|
|
||||||
this.options = $.extend({}, defaults, options);
|
|
||||||
this.reset();
|
|
||||||
|
|
||||||
this._defaults = defaults;
|
|
||||||
this._name = pluginName;
|
|
||||||
|
|
||||||
// this.expression = new RegExp('(?:^|\\b|\\s)' + this.options.token + '([\\w.]*)$');
|
|
||||||
this.expression = new RegExp('' + this.options.token + '([\\w.]*)$');
|
|
||||||
this.cleanupHandle = null;
|
|
||||||
|
|
||||||
this.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
Plugin.MENU_TEMPLATE = "<div class='-sew-list-container' style='display: none; position: absolute;'><ul class='-sew-list'></ul></div>";
|
|
||||||
|
|
||||||
Plugin.ITEM_TEMPLATE = '<li class="-sew-list-item"></li>';
|
|
||||||
|
|
||||||
Plugin.KEYS = [40, 38, 13, 27, 9];
|
|
||||||
|
|
||||||
Plugin.prototype.init = function () {
|
|
||||||
if(this.options.values.length < 1) return;
|
|
||||||
|
|
||||||
this.$element
|
|
||||||
.bind('keyup', $.proxy(this.onKeyUp, this))
|
|
||||||
.bind('keydown', $.proxy(this.onKeyDown, this))
|
|
||||||
.bind('focus', $.proxy(this.renderElements, this, this.options.values))
|
|
||||||
.bind('blur', $.proxy(this.remove, this));
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.reset = function () {
|
|
||||||
if(this.options.unique) {
|
|
||||||
this.options.values = Plugin.getUniqueElements(this.options.values);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.index = 0;
|
|
||||||
this.matched = false;
|
|
||||||
this.dontFilter = false;
|
|
||||||
this.lastFilter = undefined;
|
|
||||||
this.filtered = this.options.values.slice(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.next = function () {
|
|
||||||
this.index = (this.index + 1) % this.filtered.length;
|
|
||||||
this.hightlightItem();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.prev = function () {
|
|
||||||
this.index = (this.index + this.filtered.length - 1) % this.filtered.length;
|
|
||||||
this.hightlightItem();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.select = function () {
|
|
||||||
this.replace(this.filtered[this.index].val);
|
|
||||||
this.hideList();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.remove = function () {
|
|
||||||
this.$itemList.fadeOut('slow');
|
|
||||||
|
|
||||||
this.cleanupHandle = window.setTimeout($.proxy(function () {
|
|
||||||
this.$itemList.remove();
|
|
||||||
}, this), 1000);
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.replace = function (replacement) {
|
|
||||||
var startpos = this.$element.getCursorPosition();
|
|
||||||
// var separator = startpos === 1 ? '' : ' ';
|
|
||||||
var separator = startpos === 1 ? '' : '';
|
|
||||||
|
|
||||||
var fullStuff = this.getText();
|
|
||||||
var val = fullStuff.substring(0, startpos);
|
|
||||||
// val = val.replace(this.expression, separator + this.options.token + replacement);
|
|
||||||
val = val.replace(this.expression, separator + replacement);
|
|
||||||
|
|
||||||
var posfix = fullStuff.substring(startpos, fullStuff.length);
|
|
||||||
var separator2 = posfix.match(/^\s/) ? '' : ' ';
|
|
||||||
|
|
||||||
var finalFight = val + separator2 + posfix;
|
|
||||||
this.setText(finalFight);
|
|
||||||
this.$element.setCursorPosition(val.length + 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.hightlightItem = function () {
|
|
||||||
this.$itemList.find(".-sew-list-item").removeClass("selected");
|
|
||||||
|
|
||||||
var container = this.$itemList.find(".-sew-list-item").parent();
|
|
||||||
var element = this.filtered[this.index].element.addClass("selected");
|
|
||||||
|
|
||||||
var scrollPosition = element.position().top;
|
|
||||||
container.scrollTop(container.scrollTop() + scrollPosition);
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.renderElements = function (values) {
|
|
||||||
$("body").append(this.$itemList);
|
|
||||||
|
|
||||||
var container = this.$itemList.find('ul').empty();
|
|
||||||
values.forEach($.proxy(function (e, i) {
|
|
||||||
var $item = $(Plugin.ITEM_TEMPLATE);
|
|
||||||
|
|
||||||
this.options.elementFactory($item, e);
|
|
||||||
|
|
||||||
e.element = $item.appendTo(container).bind('click', $.proxy(this.onItemClick, this, e)).bind('mouseover', $.proxy(this.onItemHover, this, i));
|
|
||||||
}, this));
|
|
||||||
|
|
||||||
this.index = 0;
|
|
||||||
this.hightlightItem();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.displayList = function () {
|
|
||||||
if(!this.filtered.length) return;
|
|
||||||
|
|
||||||
this.$itemList.show();
|
|
||||||
var element = this.$element;
|
|
||||||
var offset = this.$element.offset();
|
|
||||||
var pos = element.getCaretPosition();
|
|
||||||
|
|
||||||
this.$itemList.css({
|
|
||||||
left: offset.left + pos.left,
|
|
||||||
top: offset.top + pos.top
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.hideList = function () {
|
|
||||||
this.$itemList.hide();
|
|
||||||
this.reset();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.filterList = function (val) {
|
|
||||||
if(val == this.lastFilter) return;
|
|
||||||
|
|
||||||
this.lastFilter = val;
|
|
||||||
this.$itemList.find(".-sew-list-item").remove();
|
|
||||||
var values = this.options.values;
|
|
||||||
|
|
||||||
|
|
||||||
var vals = this.filtered = values.filter($.proxy(function (e) {
|
|
||||||
// var exp = new RegExp('\\W*' + this.options.token + e.val + '(\\W|$)');
|
|
||||||
var exp = new RegExp('\\W*' + this.options.token + escapeRegExp(e.val) + '(\\W|$)');
|
|
||||||
if(!this.options.repeat && this.getText().match(exp)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return val === "" ||
|
|
||||||
e.val.toLowerCase().indexOf(val.toLowerCase()) >= 0 ||
|
|
||||||
(e.keywords || "").toLowerCase().indexOf(val.toLowerCase()) >= 0;
|
|
||||||
// (e.meta || "").toLowerCase().indexOf(val.toLowerCase()) >= 0;
|
|
||||||
}, this));
|
|
||||||
|
|
||||||
if(vals.length) {
|
|
||||||
this.renderElements(vals);
|
|
||||||
this.$itemList.show();
|
|
||||||
} else {
|
|
||||||
this.hideList();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.getUniqueElements = function (elements) {
|
|
||||||
var target = [];
|
|
||||||
|
|
||||||
elements.forEach(function (e) {
|
|
||||||
var hasElement = target.map(function (j) { return j.val; }).indexOf(e.val) >= 0;
|
|
||||||
if(hasElement) return;
|
|
||||||
target.push(e);
|
|
||||||
});
|
|
||||||
|
|
||||||
return target;
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.getText = function () {
|
|
||||||
return(this.$element.val() || this.$element.text());
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.setText = function (text) {
|
|
||||||
if(this.$element.prop('tagName').match(/input|textarea/i)) {
|
|
||||||
this.$element.val(text);
|
|
||||||
} else {
|
|
||||||
// poors man sanitization
|
|
||||||
text = $("<span>").text(text).html().replace(/\s/g, ' ');
|
|
||||||
this.$element.html(text);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.onKeyUp = function (e) {
|
|
||||||
var startpos = this.$element.getCursorPosition();
|
|
||||||
var val = this.getText().substring(0, startpos);
|
|
||||||
var matches = val.match(this.expression);
|
|
||||||
|
|
||||||
if(!matches && this.matched) {
|
|
||||||
this.matched = false;
|
|
||||||
this.dontFilter = false;
|
|
||||||
this.hideList();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(matches && !this.matched) {
|
|
||||||
this.displayList();
|
|
||||||
this.lastFilter = "\n";
|
|
||||||
this.matched = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(matches && !this.dontFilter) {
|
|
||||||
this.filterList(matches[1]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.onKeyDown = function (e) {
|
|
||||||
var listVisible = this.$itemList.is(":visible");
|
|
||||||
if(!listVisible || (Plugin.KEYS.indexOf(e.keyCode) < 0)) return;
|
|
||||||
|
|
||||||
switch(e.keyCode) {
|
|
||||||
case 9:
|
|
||||||
case 13:
|
|
||||||
this.select();
|
|
||||||
break;
|
|
||||||
case 40:
|
|
||||||
this.next();
|
|
||||||
break;
|
|
||||||
case 38:
|
|
||||||
this.prev();
|
|
||||||
break;
|
|
||||||
case 27:
|
|
||||||
this.$itemList.hide();
|
|
||||||
this.dontFilter = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.preventDefault();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.onItemClick = function (element, e) {
|
|
||||||
if(this.cleanupHandle) window.clearTimeout(this.cleanupHandle);
|
|
||||||
|
|
||||||
this.replace(element.val);
|
|
||||||
this.hideList();
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugin.prototype.onItemHover = function (index, e) {
|
|
||||||
this.index = index;
|
|
||||||
this.hightlightItem();
|
|
||||||
};
|
|
||||||
|
|
||||||
$.fn[pluginName] = function (options) {
|
|
||||||
return this.each(function () {
|
|
||||||
if(!$.data(this, 'plugin_' + pluginName)) {
|
|
||||||
$.data(this, 'plugin_' + pluginName, new Plugin(this, options));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}(jQuery, window));
|
|
|
@ -8,7 +8,6 @@
|
||||||
*= require ./fineuploader.css
|
*= require ./fineuploader.css
|
||||||
*= require ./ui-lightness/jquery-ui-1.11.2.css
|
*= require ./ui-lightness/jquery-ui-1.11.2.css
|
||||||
*= require ./bootstrap-tokenfield.css
|
*= require ./bootstrap-tokenfield.css
|
||||||
*= require ./sew.css
|
|
||||||
*= require ./font.css
|
*= require ./font.css
|
||||||
*= require ./svg-dimensions.css
|
*= require ./svg-dimensions.css
|
||||||
*= require ./highlighter-github.css
|
*= require ./highlighter-github.css
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
.-sew-list-container {
|
|
||||||
background: white;
|
|
||||||
border: 1px solid #DDD;
|
|
||||||
border-radius: 3px;
|
|
||||||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
|
||||||
min-width: 180px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.-sew-list {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
max-height: 180px;
|
|
||||||
overflow: scroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
.-sew-list-item {
|
|
||||||
display: block;
|
|
||||||
padding: 5px 10px;
|
|
||||||
border-bottom: 1px solid #DDD;
|
|
||||||
cursor: pointer;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
max-width: 400px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.-sew-list-item small {
|
|
||||||
color: #afafaf;
|
|
||||||
}
|
|
||||||
|
|
||||||
.-sew-list-item.selected {
|
|
||||||
color: white;
|
|
||||||
background: #4183C4;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
Loading…
Reference in a new issue