@acdh-oeaw/universalviewer
Version:
The Universal Viewer is a community-developed open source project on a mission to help you share your 📚📜📰📽️📻🗿 with the 🌎
429 lines • 16.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = jqueryPlugins;
var utils_1 = require("@edsilv/utils");
function jqueryPlugins($) {
$.fn.checkboxButton = function (onClick) {
return this.each(function () {
var $this = $(this);
$this.on("click", function (e) {
var tagName = e.target.tagName;
var $checkbox = $(this).find(":checkbox");
if (tagName !== "INPUT") {
e.preventDefault();
$checkbox.prop("checked", !$checkbox.prop("checked"));
}
var checked = $checkbox.is(":checked");
onClick.call(this, checked);
}, 0);
});
};
$.fn.disable = function () {
return this.each(function () {
var $this = $(this);
$this.addClass("disabled");
$this.data("tabindex", $this.attr("tabindex"));
$this.removeAttr("tabindex");
});
};
$.fn.ellipsis = function (chars) {
return this.each(function () {
var $self = $(this);
var text = $self.text();
if (text.length > chars) {
var trimmedText = text.substr(0, chars);
trimmedText = trimmedText.substr(0, Math.min(trimmedText.length, trimmedText.lastIndexOf(" ")));
$self.empty().html(trimmedText + "…");
}
});
};
$.fn.ellipsisFill = function (text) {
var textPassed = true;
if (!text)
textPassed = false;
return this.each(function () {
var $self = $(this);
if (!textPassed)
text = $self.text();
$self.empty();
var $spanElem = $('<span title="' + text + '"></span>');
$self.append($spanElem);
$self.css("overflow", "hidden");
$spanElem.css("white-space", "nowrap");
$spanElem.html(text);
// get the width of the span.
// if it's wider than the container, remove a word until it's not.
if ($spanElem.width() > $self.width()) {
var lastText = null;
while ($spanElem.width() > $self.width()) {
var t = $spanElem.html();
t = t.substring(0, t.lastIndexOf(" ")) + "…";
if (t === lastText)
break;
$spanElem.html(t);
lastText = t;
}
}
});
};
// Truncates to a certain number of letters, while ignoring and preserving HTML
$.fn.ellipsisHtmlFixed = function (chars, cb) {
return this.each(function () {
var $self = $(this);
var expandedText = $self.html();
var $trunc = $("<span></span>");
$trunc.html($self
.html()
.replace(/\s[\s]*/g, " ")
.trim());
if ($trunc.text().trim().length <= chars) {
return; // do nothing if we're under the limit!
}
while ($trunc.text().trim().length > chars) {
$trunc.removeLastWord(chars);
}
var collapsedText = $trunc.html();
// Toggle function
var expanded = false;
$self.toggle = function () {
$self.empty();
var $toggleButton = $('<a href="#" class="toggle"></a>');
if (expanded) {
$self.html(expandedText + " ");
$toggleButton.text("less");
$toggleButton.switchClass("less", "more");
}
else {
$self.html(collapsedText + "… ");
$toggleButton.text("more");
$toggleButton.switchClass("more", "less");
}
$toggleButton.one("click", function (e) {
e.preventDefault();
$self.toggle();
});
expanded = !expanded;
$self.append($toggleButton);
if (cb)
cb();
};
$self.toggle();
});
};
$.fn.enable = function () {
return this.each(function () {
var $self = $(this);
$self.removeClass("disabled");
$self.attr("tabindex", $self.data("tabindex"));
});
};
$.fn.equaliseHeight = function (reset, average) {
var maxHeight = -1;
var minHeight = Number.MAX_VALUE;
var heights = [];
// reset all heights to auto first so they can be re-measured.
if (reset) {
this.each(function () {
$(this).height("auto");
});
}
this.each(function () {
var currentHeight = $(this).height();
heights.push(currentHeight);
maxHeight = maxHeight > currentHeight ? maxHeight : currentHeight;
minHeight = minHeight < currentHeight ? minHeight : currentHeight;
});
var finalHeight = maxHeight;
if (average) {
heights.sort(function (a, b) {
return a - b;
});
var half = Math.floor(heights.length / 2);
if (heights.length % 2) {
finalHeight = heights[half];
}
else {
finalHeight = (heights[half - 1] + heights[half]) / 2.0;
}
}
this.each(function () {
$(this).height(finalHeight);
});
return this;
};
$.fn.getVisibleElementWithGreatestTabIndex = function () {
var $self = $(this);
var maxTabIndex = 0;
var $elementWithGreatestTabIndex = null;
$self
.find("*:visible[tabindex]")
.each(function (index, el) {
var $el = $(el);
var tabIndex = parseInt($el.attr("tabindex"));
if (tabIndex > maxTabIndex) {
maxTabIndex = tabIndex;
$elementWithGreatestTabIndex = $el;
}
});
return $elementWithGreatestTabIndex;
};
$.fn.horizontalMargins = function () {
var $self = $(this);
return (parseInt($self.css("marginLeft")) + parseInt($self.css("marginRight")));
};
$.fn.leftMargin = function () {
var $self = $(this);
return parseInt($self.css("marginLeft"));
};
$.fn.rightMargin = function () {
var $self = $(this);
return parseInt($self.css("marginRight"));
};
$.fn.horizontalPadding = function () {
var $self = $(this);
return (parseInt($self.css("paddingLeft")) + parseInt($self.css("paddingRight")));
};
$.fn.leftPadding = function () {
var $self = $(this);
return parseInt($self.css("paddingLeft"));
};
$.fn.rightPadding = function () {
var $self = $(this);
return parseInt($self.css("paddingRight"));
};
$.mlp = { x: 0, y: 0 }; // Mouse Last Position
function documentHandler() {
var $current = this === document ? $(this) : $(this).contents();
$current.mousemove(function (e) {
$.mlp = { x: e.pageX, y: e.pageY };
});
$current.find("iframe").on("load", documentHandler);
}
$(documentHandler);
$.fn.ismouseover = function () {
var result = false;
this.eq(0).each(function () {
var $current = $(this).is("iframe")
? $(this).contents().find("body")
: $(this);
var offset = $current.offset();
result =
offset.left <= $.mlp.x &&
offset.left + $current.outerWidth() > $.mlp.x &&
offset.top <= $.mlp.y &&
offset.top + $current.outerHeight() > $.mlp.y;
});
return result;
};
var on = $.fn.on;
var timer;
$.fn.on = function () {
var args = Array.apply(null, arguments);
var last = args[args.length - 1];
if (isNaN(last) || (last === 1 && args.pop()))
return on.apply(this, args);
var delay = args.pop();
var fn = args.pop();
args.push(function () {
var self = this;
var params = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(self, params);
}, delay);
});
return on.apply(this, args);
};
$.fn.onEnter = function (cb) {
return this.each(function () {
var $this = $(this);
$this.on("keyup", function (e) {
if (e.keyCode === 13) {
e.preventDefault();
cb();
}
}, 0);
});
};
$.fn.onPressed = function (cb) {
return this.each(function () {
var $this = $(this);
$this.on("click", function (e) {
e.preventDefault();
cb(e);
}, 0);
$this.on("keydown", function (e) {
if (e.keyCode === 13) {
e.preventDefault();
cb(e);
}
}, 0);
});
};
// Recursively removes the last empty element (img, audio, etc) or word in an element
$.fn.removeLastWord = function (chars, depth) {
if (chars === void 0) { chars = 8; }
if (depth === void 0) { depth = 0; }
return this.each(function () {
var $self = $(this);
if ($self.contents().length > 0) {
var $lastElement = $self.contents().last();
if ($lastElement[0].nodeType === 3) {
var words = $lastElement.text().trim().split(" ");
if (words.length > 1) {
words.splice(words.length - 1, 1);
$lastElement[0].data = words.join(" "); // textnode.data
return;
}
else if ("undefined" !== typeof chars &&
words.length === 1 &&
words[0].length > chars) {
$lastElement[0].data = words.join(" ").substring(0, chars);
return;
}
}
$lastElement.removeLastWord(chars, depth + 1); // Element
}
else if (depth > 0) {
// Empty element
$self.remove();
}
});
};
$.fn.switchClass = function (class1, class2) {
return this.each(function () {
$(this).removeClass(class1).addClass(class2);
});
};
$.fn.targetBlank = function () {
return this.each(function () {
$(this).find("a").prop("target", "_blank");
});
};
$.fn.toggleExpandText = function (chars, lessText, moreText, cb) {
return this.each(function () {
var $self = $(this);
var expandedText = $self.html();
if (chars > expandedText.length)
return;
var expanded = false;
var collapsedText = expandedText.substr(0, chars);
collapsedText = collapsedText.substr(0, Math.min(collapsedText.length, collapsedText.lastIndexOf(" ")));
$self.toggle = function () {
$self.empty();
var $toggleButton = $('<a href="#" class="toggle"></a>');
if (expanded) {
$self.html(expandedText + " ");
$toggleButton.text(lessText);
$toggleButton.switchClass("less", "more");
}
else {
$self.html(collapsedText + " ");
$toggleButton.text(moreText);
$toggleButton.switchClass("more", "less");
}
$toggleButton.one("click", function (e) {
e.preventDefault();
$self.toggle();
});
expanded = !expanded;
$self.append($toggleButton);
if (cb)
cb();
};
$self.toggle();
});
};
// Toggle expansion by number of lines
$.fn.toggleExpandTextByLines = function (lines, lessText, moreText, cb, lessAriaLabelTemplate, moreAriaLabelTemplate) {
if (lessAriaLabelTemplate === void 0) { lessAriaLabelTemplate = "Less information: Hide {0}"; }
if (moreAriaLabelTemplate === void 0) { moreAriaLabelTemplate = "More information: Reveal {0}"; }
return this.each(function () {
var $self = $(this);
var $label = $self.find(".label");
var $value = $self.find(".value");
var expandedText = $value.html();
var labelText = $label.html();
// add 'pad' to account for the right margin in the sidebar
var $buttonPad = $('<span>… <a href="#" class="toggle more">morepad</a></span>');
// when height changes, store string, then pick from line counts
var stringsByLine = [expandedText];
var lastHeight = $self.height();
// Until empty
while ($value.text().length > 0) {
$value.removeLastWord();
var html = $value.html();
$value.append($buttonPad);
if (lastHeight > $value.height()) {
stringsByLine.unshift(html);
lastHeight = $value.height();
}
$buttonPad.remove();
}
if (stringsByLine.length <= lines) {
$value.html(expandedText);
return;
}
var collapsedText = stringsByLine[lines - 1];
// Toggle function
var expanded = false;
$value.toggle = function () {
$value.empty();
var $toggleButton = $('<a href="#" class="toggle"></a>');
if (expanded) {
var lessAriaLabel = utils_1.Strings.format(lessAriaLabelTemplate, labelText);
$value.html(expandedText + " ");
$toggleButton.text(lessText);
$toggleButton.switchClass("less", "more");
$toggleButton.attr("aria-label", lessAriaLabel);
}
else {
var moreAriaLabel = utils_1.Strings.format(moreAriaLabelTemplate, labelText);
$value.html(collapsedText + "… ");
$toggleButton.text(moreText);
$toggleButton.switchClass("more", "less");
$toggleButton.attr("aria-label", moreAriaLabel);
}
$toggleButton.one("click", function (e) {
e.preventDefault();
$value.toggle();
});
expanded = !expanded;
$value.append($toggleButton);
if (cb)
cb();
};
$value.toggle();
});
};
$.fn.toggleText = function (text1, text2) {
return this.each(function () {
var $self = $(this);
if ($self.text() === text1) {
$(this).text(text2);
}
else {
$(this).text(text1);
}
});
};
$.fn.updateAttr = function (attrName, oldVal, newVal) {
return this.each(function () {
var $self = $(this);
var attr = $self.attr(attrName);
if (attr && attr.indexOf(oldVal) === 0) {
attr = attr.replace(oldVal, newVal);
$self.attr(attrName, attr);
}
});
};
$.fn.verticalMargins = function () {
var $self = $(this);
return (parseInt($self.css("marginTop")) + parseInt($self.css("marginBottom")));
};
$.fn.verticalPadding = function () {
var $self = $(this);
return (parseInt($self.css("paddingTop")) + parseInt($self.css("paddingBottom")));
};
}
//# sourceMappingURL=JQueryPlugins.js.map