mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-21 15:32:14 +00:00
Reimpl custom css - Open Sans is back!
This commit is contained in:
@@ -1,390 +1 @@
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
(global = global || self, global.autocomplete = factory());
|
||||
}(this, function () { 'use strict';
|
||||
|
||||
/*
|
||||
* https://github.com/kraaden/autocomplete
|
||||
* Copyright (c) 2016 Denys Krasnoshchok
|
||||
* MIT License
|
||||
*/
|
||||
function autocomplete(settings) {
|
||||
// just an alias to minimize JS file size
|
||||
var doc = document;
|
||||
var container = doc.createElement("div");
|
||||
var containerStyle = container.style;
|
||||
var userAgent = navigator.userAgent;
|
||||
var mobileFirefox = userAgent.indexOf("Firefox") !== -1 && userAgent.indexOf("Mobile") !== -1;
|
||||
var debounceWaitMs = settings.debounceWaitMs || 0;
|
||||
var preventSubmit = settings.preventSubmit || false;
|
||||
// 'keyup' event will not be fired on Mobile Firefox, so we have to use 'input' event instead
|
||||
var keyUpEventName = mobileFirefox ? "input" : "keyup";
|
||||
var items = [];
|
||||
var inputValue = "";
|
||||
var minLen = 2;
|
||||
var showOnFocus = settings.showOnFocus;
|
||||
var selected;
|
||||
var keypressCounter = 0;
|
||||
var debounceTimer;
|
||||
if (settings.minLength !== undefined) {
|
||||
minLen = settings.minLength;
|
||||
}
|
||||
if (!settings.input) {
|
||||
throw new Error("input undefined");
|
||||
}
|
||||
var input = settings.input;
|
||||
container.className = "autocomplete " + (settings.className || "");
|
||||
// IOS implementation for fixed positioning has many bugs, so we will use absolute positioning
|
||||
containerStyle.position = "absolute";
|
||||
/**
|
||||
* Detach the container from DOM
|
||||
*/
|
||||
function detach() {
|
||||
var parent = container.parentNode;
|
||||
if (parent) {
|
||||
parent.removeChild(container);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Clear debouncing timer if assigned
|
||||
*/
|
||||
function clearDebounceTimer() {
|
||||
if (debounceTimer) {
|
||||
window.clearTimeout(debounceTimer);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Attach the container to DOM
|
||||
*/
|
||||
function attach() {
|
||||
if (!container.parentNode) {
|
||||
doc.body.appendChild(container);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Check if container for autocomplete is displayed
|
||||
*/
|
||||
function containerDisplayed() {
|
||||
return !!container.parentNode;
|
||||
}
|
||||
/**
|
||||
* Clear autocomplete state and hide container
|
||||
*/
|
||||
function clear() {
|
||||
keypressCounter++;
|
||||
items = [];
|
||||
inputValue = "";
|
||||
selected = undefined;
|
||||
detach();
|
||||
}
|
||||
/**
|
||||
* Update autocomplete position
|
||||
*/
|
||||
function updatePosition() {
|
||||
if (!containerDisplayed()) {
|
||||
return;
|
||||
}
|
||||
containerStyle.height = "auto";
|
||||
containerStyle.width = input.offsetWidth + "px";
|
||||
var maxHeight = 0;
|
||||
var inputRect;
|
||||
function calc() {
|
||||
var docEl = doc.documentElement;
|
||||
var clientTop = docEl.clientTop || doc.body.clientTop || 0;
|
||||
var clientLeft = docEl.clientLeft || doc.body.clientLeft || 0;
|
||||
var scrollTop = window.pageYOffset || docEl.scrollTop;
|
||||
var scrollLeft = window.pageXOffset || docEl.scrollLeft;
|
||||
inputRect = input.getBoundingClientRect();
|
||||
var top = inputRect.top + input.offsetHeight + scrollTop - clientTop;
|
||||
var left = inputRect.left + scrollLeft - clientLeft;
|
||||
containerStyle.top = top + "px";
|
||||
containerStyle.left = left + "px";
|
||||
maxHeight = window.innerHeight - (inputRect.top + input.offsetHeight);
|
||||
if (maxHeight < 0) {
|
||||
maxHeight = 0;
|
||||
}
|
||||
containerStyle.top = top + "px";
|
||||
containerStyle.bottom = "";
|
||||
containerStyle.left = left + "px";
|
||||
containerStyle.maxHeight = maxHeight + "px";
|
||||
}
|
||||
// the calc method must be called twice, otherwise the calculation may be wrong on resize event (chrome browser)
|
||||
calc();
|
||||
calc();
|
||||
if (settings.customize && inputRect) {
|
||||
settings.customize(input, inputRect, container, maxHeight);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Redraw the autocomplete div element with suggestions
|
||||
*/
|
||||
function update() {
|
||||
// delete all children from autocomplete DOM container
|
||||
while (container.firstChild) {
|
||||
container.removeChild(container.firstChild);
|
||||
}
|
||||
// function for rendering autocomplete suggestions
|
||||
var render = function (item, currentValue) {
|
||||
var itemElement = doc.createElement("div");
|
||||
itemElement.textContent = item.label || "";
|
||||
return itemElement;
|
||||
};
|
||||
if (settings.render) {
|
||||
render = settings.render;
|
||||
}
|
||||
// function to render autocomplete groups
|
||||
var renderGroup = function (groupName, currentValue) {
|
||||
var groupDiv = doc.createElement("div");
|
||||
groupDiv.textContent = groupName;
|
||||
return groupDiv;
|
||||
};
|
||||
if (settings.renderGroup) {
|
||||
renderGroup = settings.renderGroup;
|
||||
}
|
||||
var fragment = doc.createDocumentFragment();
|
||||
var prevGroup = "#9?$";
|
||||
items.forEach(function (item) {
|
||||
if (item.group && item.group !== prevGroup) {
|
||||
prevGroup = item.group;
|
||||
var groupDiv = renderGroup(item.group, inputValue);
|
||||
if (groupDiv) {
|
||||
groupDiv.className += " group";
|
||||
fragment.appendChild(groupDiv);
|
||||
}
|
||||
}
|
||||
var div = render(item, inputValue);
|
||||
if (div) {
|
||||
div.addEventListener("click", function (ev) {
|
||||
settings.onSelect(item, input);
|
||||
clear();
|
||||
ev.preventDefault();
|
||||
ev.stopPropagation();
|
||||
});
|
||||
if (item === selected) {
|
||||
div.className += " selected";
|
||||
}
|
||||
fragment.appendChild(div);
|
||||
}
|
||||
});
|
||||
container.appendChild(fragment);
|
||||
if (items.length < 1) {
|
||||
if (settings.emptyMsg) {
|
||||
var empty = doc.createElement("div");
|
||||
empty.className = "empty";
|
||||
empty.textContent = settings.emptyMsg;
|
||||
container.appendChild(empty);
|
||||
}
|
||||
else {
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
attach();
|
||||
updatePosition();
|
||||
updateScroll();
|
||||
}
|
||||
function updateIfDisplayed() {
|
||||
if (containerDisplayed()) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
function resizeEventHandler() {
|
||||
updateIfDisplayed();
|
||||
}
|
||||
function scrollEventHandler(e) {
|
||||
if (e.target !== container) {
|
||||
updateIfDisplayed();
|
||||
}
|
||||
else {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
function keyupEventHandler(ev) {
|
||||
var keyCode = ev.which || ev.keyCode || 0;
|
||||
var ignore = [38 /* Up */, 13 /* Enter */, 27 /* Esc */, 39 /* Right */, 37 /* Left */, 16 /* Shift */, 17 /* Ctrl */, 18 /* Alt */, 20 /* CapsLock */, 91 /* WindowsKey */, 9 /* Tab */];
|
||||
for (var _i = 0, ignore_1 = ignore; _i < ignore_1.length; _i++) {
|
||||
var key = ignore_1[_i];
|
||||
if (keyCode === key) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (keyCode >= 112 /* F1 */ && keyCode <= 123 /* F12 */) {
|
||||
return;
|
||||
}
|
||||
// the down key is used to open autocomplete
|
||||
if (keyCode === 40 /* Down */ && containerDisplayed()) {
|
||||
return;
|
||||
}
|
||||
startFetch(0 /* Keyboard */);
|
||||
}
|
||||
/**
|
||||
* Automatically move scroll bar if selected item is not visible
|
||||
*/
|
||||
function updateScroll() {
|
||||
var elements = container.getElementsByClassName("selected");
|
||||
if (elements.length > 0) {
|
||||
var element = elements[0];
|
||||
// make group visible
|
||||
var previous = element.previousElementSibling;
|
||||
if (previous && previous.className.indexOf("group") !== -1 && !previous.previousElementSibling) {
|
||||
element = previous;
|
||||
}
|
||||
if (element.offsetTop < container.scrollTop) {
|
||||
container.scrollTop = element.offsetTop;
|
||||
}
|
||||
else {
|
||||
var selectBottom = element.offsetTop + element.offsetHeight;
|
||||
var containerBottom = container.scrollTop + container.offsetHeight;
|
||||
if (selectBottom > containerBottom) {
|
||||
container.scrollTop += selectBottom - containerBottom;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Select the previous item in suggestions
|
||||
*/
|
||||
function selectPrev() {
|
||||
if (items.length < 1) {
|
||||
selected = undefined;
|
||||
}
|
||||
else {
|
||||
if (selected === items[0]) {
|
||||
selected = items[items.length - 1];
|
||||
}
|
||||
else {
|
||||
for (var i = items.length - 1; i > 0; i--) {
|
||||
if (selected === items[i] || i === 1) {
|
||||
selected = items[i - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Select the next item in suggestions
|
||||
*/
|
||||
function selectNext() {
|
||||
if (items.length < 1) {
|
||||
selected = undefined;
|
||||
}
|
||||
if (!selected || selected === items[items.length - 1]) {
|
||||
selected = items[0];
|
||||
return;
|
||||
}
|
||||
for (var i = 0; i < (items.length - 1); i++) {
|
||||
if (selected === items[i]) {
|
||||
selected = items[i + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
function keydownEventHandler(ev) {
|
||||
var keyCode = ev.which || ev.keyCode || 0;
|
||||
if (keyCode === 38 /* Up */ || keyCode === 40 /* Down */ || keyCode === 27 /* Esc */) {
|
||||
var containerIsDisplayed = containerDisplayed();
|
||||
if (keyCode === 27 /* Esc */) {
|
||||
clear();
|
||||
}
|
||||
else {
|
||||
if (!containerDisplayed || items.length < 1) {
|
||||
return;
|
||||
}
|
||||
keyCode === 38 /* Up */
|
||||
? selectPrev()
|
||||
: selectNext();
|
||||
update();
|
||||
}
|
||||
ev.preventDefault();
|
||||
if (containerIsDisplayed) {
|
||||
ev.stopPropagation();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (keyCode === 13 /* Enter */) {
|
||||
if (selected) {
|
||||
settings.onSelect(selected, input);
|
||||
clear();
|
||||
}
|
||||
if (preventSubmit) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
function focusEventHandler() {
|
||||
if (showOnFocus) {
|
||||
startFetch(1 /* Focus */);
|
||||
}
|
||||
}
|
||||
function startFetch(trigger) {
|
||||
// if multiple keys were pressed, before we get update from server,
|
||||
// this may cause redrawing our autocomplete multiple times after the last key press.
|
||||
// to avoid this, the number of times keyboard was pressed will be
|
||||
// saved and checked before redraw our autocomplete box.
|
||||
var savedKeypressCounter = ++keypressCounter;
|
||||
var val = input.value;
|
||||
if (val.length >= minLen || trigger === 1 /* Focus */) {
|
||||
clearDebounceTimer();
|
||||
debounceTimer = window.setTimeout(function () {
|
||||
settings.fetch(val, function (elements) {
|
||||
if (keypressCounter === savedKeypressCounter && elements) {
|
||||
items = elements;
|
||||
inputValue = val;
|
||||
selected = items.length > 0 ? items[0] : undefined;
|
||||
update();
|
||||
}
|
||||
}, 0 /* Keyboard */);
|
||||
}, trigger === 0 /* Keyboard */ ? debounceWaitMs : 0);
|
||||
}
|
||||
else {
|
||||
clear();
|
||||
}
|
||||
}
|
||||
function blurEventHandler() {
|
||||
// we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM
|
||||
setTimeout(function () {
|
||||
if (doc.activeElement !== input) {
|
||||
clear();
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
/**
|
||||
* Fixes #26: on long clicks focus will be lost and onSelect method will not be called
|
||||
*/
|
||||
container.addEventListener("mousedown", function (evt) {
|
||||
evt.stopPropagation();
|
||||
evt.preventDefault();
|
||||
});
|
||||
/**
|
||||
* This function will remove DOM elements and clear event handlers
|
||||
*/
|
||||
function destroy() {
|
||||
input.removeEventListener("focus", focusEventHandler);
|
||||
input.removeEventListener("keydown", keydownEventHandler);
|
||||
input.removeEventListener(keyUpEventName, keyupEventHandler);
|
||||
input.removeEventListener("blur", blurEventHandler);
|
||||
window.removeEventListener("resize", resizeEventHandler);
|
||||
doc.removeEventListener("scroll", scrollEventHandler, true);
|
||||
clearDebounceTimer();
|
||||
clear();
|
||||
// prevent the update call if there are pending AJAX requests
|
||||
keypressCounter++;
|
||||
}
|
||||
// setup event handlers
|
||||
input.addEventListener("keydown", keydownEventHandler);
|
||||
input.addEventListener(keyUpEventName, keyupEventHandler);
|
||||
input.addEventListener("blur", blurEventHandler);
|
||||
input.addEventListener("focus", focusEventHandler);
|
||||
window.addEventListener("resize", resizeEventHandler);
|
||||
doc.addEventListener("scroll", scrollEventHandler, true);
|
||||
return {
|
||||
destroy: destroy
|
||||
};
|
||||
}
|
||||
|
||||
return autocomplete;
|
||||
|
||||
}));
|
||||
//# sourceMappingURL=autocomplete.js.map
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).autocomplete=t()}(this,(function(){"use strict";return function(e){var t,n,o=document,i=o.createElement("div"),r=i.style,f=navigator.userAgent,l=-1!==f.indexOf("Firefox")&&-1!==f.indexOf("Mobile"),a=e.debounceWaitMs||0,u=e.preventSubmit||!1,s=l?"input":"keyup",d=[],c="",p=2,v=e.showOnFocus,m=0;if(void 0!==e.minLength&&(p=e.minLength),!e.input)throw new Error("input undefined");var g=e.input;function h(){n&&window.clearTimeout(n)}function E(){return!!i.parentNode}function w(){var e;m++,d=[],c="",t=void 0,(e=i.parentNode)&&e.removeChild(i)}function L(){for(;i.firstChild;)i.removeChild(i.firstChild);var n=function(e,t){var n=o.createElement("div");return n.textContent=e.label||"",n};e.render&&(n=e.render);var f=function(e,t){var n=o.createElement("div");return n.textContent=e,n};e.renderGroup&&(f=e.renderGroup);var l=o.createDocumentFragment(),a="#9?$";if(d.forEach((function(o){if(o.group&&o.group!==a){a=o.group;var i=f(o.group,c);i&&(i.className+=" group",l.appendChild(i))}var r=n(o,c);r&&(r.addEventListener("click",(function(t){e.onSelect(o,g),w(),t.preventDefault(),t.stopPropagation()})),o===t&&(r.className+=" selected"),l.appendChild(r))})),i.appendChild(l),d.length<1){if(!e.emptyMsg)return void w();var u=o.createElement("div");u.className="empty",u.textContent=e.emptyMsg,i.appendChild(u)}i.parentNode||o.body.appendChild(i),function(){if(E()){r.height="auto",r.width=g.offsetWidth+"px";var t,n=0;f(),f(),e.customize&&t&&e.customize(g,t,i,n)}function f(){var e=o.documentElement,i=e.clientTop||o.body.clientTop||0,f=e.clientLeft||o.body.clientLeft||0,l=window.pageYOffset||e.scrollTop,a=window.pageXOffset||e.scrollLeft,u=(t=g.getBoundingClientRect()).top+g.offsetHeight+l-i,s=t.left+a-f;r.top=u+"px",r.left=s+"px",(n=window.innerHeight-(t.top+g.offsetHeight))<0&&(n=0),r.top=u+"px",r.bottom="",r.left=s+"px",r.maxHeight=n+"px"}}(),function(){var e=i.getElementsByClassName("selected");if(e.length>0){var t=e[0],n=t.previousElementSibling;if(n&&-1!==n.className.indexOf("group")&&!n.previousElementSibling&&(t=n),t.offsetTop<i.scrollTop)i.scrollTop=t.offsetTop;else{var o=t.offsetTop+t.offsetHeight,r=i.scrollTop+i.offsetHeight;o>r&&(i.scrollTop+=o-r)}}}()}function y(){E()&&L()}function b(){y()}function x(e){e.target!==i?y():e.preventDefault()}function C(e){for(var t=e.which||e.keyCode||0,n=0,o=[38,13,27,39,37,16,17,18,20,91,9];n<o.length;n++){if(t===o[n])return}t>=112&&t<=123||40===t&&E()||k(0)}function T(n){var o=n.which||n.keyCode||0;if(38===o||40===o||27===o){var i=E();if(27===o)w();else{if(!E||d.length<1)return;38===o?function(){if(d.length<1)t=void 0;else if(t===d[0])t=d[d.length-1];else for(var e=d.length-1;e>0;e--)if(t===d[e]||1===e){t=d[e-1];break}}():function(){if(d.length<1&&(t=void 0),t&&t!==d[d.length-1]){for(var e=0;e<d.length-1;e++)if(t===d[e]){t=d[e+1];break}}else t=d[0]}(),L()}return n.preventDefault(),void(i&&n.stopPropagation())}13===o&&(t&&(e.onSelect(t,g),w()),u&&n.preventDefault())}function N(){v&&k(1)}function k(o){var i=++m,r=g.value;r.length>=p||1===o?(h(),n=window.setTimeout((function(){e.fetch(r,(function(e){m===i&&e&&(c=r,t=(d=e).length>0?d[0]:void 0,L())}),0)}),0===o?a:0)):w()}function D(){setTimeout((function(){o.activeElement!==g&&w()}),200)}return i.className="autocomplete "+(e.className||""),r.position="absolute",i.addEventListener("mousedown",(function(e){e.stopPropagation(),e.preventDefault()})),g.addEventListener("keydown",T),g.addEventListener(s,C),g.addEventListener("blur",D),g.addEventListener("focus",N),window.addEventListener("resize",b),o.addEventListener("scroll",x,!0),{destroy:function(){g.removeEventListener("focus",N),g.removeEventListener("keydown",T),g.removeEventListener(s,C),g.removeEventListener("blur",D),window.removeEventListener("resize",b),o.removeEventListener("scroll",x,!0),h(),w(),m++}}}}));
|
||||
Reference in New Issue
Block a user