* fix: migrate remaining eslint-config-edx * refactor: updated eslint rules according to eslint-config-edx-es5 * refactor: add custom rules to suppress unnecessary eslint issues * refactor: add custom rules to internal eslint configs * fix: fix all indentation issues * chore: update lock file
110 lines
4.7 KiB
JavaScript
110 lines
4.7 KiB
JavaScript
var setupFullScreenModal = function() {
|
|
// Setup full screen image modal.
|
|
// Executed from HTMLModule in display.js.
|
|
$('a.modal-content').each(function() {
|
|
var smallImageObject = $(this).children();
|
|
var largeImageSRC = $(this).attr('href');
|
|
|
|
// if contents of zoomable link is image and large image link exists: setup modal
|
|
if (smallImageObject.is('img') && largeImageSRC) {
|
|
var data = {
|
|
smallHTML: $(this).html(),
|
|
largeALT: smallImageObject.attr('alt'),
|
|
largeSRC: largeImageSRC
|
|
};
|
|
var html = _.template($('#image-modal-tpl').text())(data);
|
|
// xss-lint: disable=javascript-jquery-insertion
|
|
$(this).replaceWith(html);
|
|
}
|
|
});
|
|
$('.wrapper-modal-image .image-wrapper img').each(function() {
|
|
var draggie = new Draggabilly(this, {containment: true});
|
|
draggie.disable();
|
|
$(this).closest('.image-modal').data('draggie', draggie);
|
|
});
|
|
|
|
// Opening and closing image modal on clicks
|
|
$('.wrapper-modal-image .image-link').click(function() {
|
|
$(this).siblings('.image-modal').addClass('image-is-fit-to-screen');
|
|
$('body').css('overflow', 'hidden');
|
|
});
|
|
|
|
// variable to detect when modal is being "hovered".
|
|
// Done this way as jquery doesn't support the :hover psudo-selector as expected.
|
|
var imageModalImageHover = false;
|
|
$('.wrapper-modal-image .image-content img, .wrapper-modal-image .image-content .image-controls').hover(function() {
|
|
imageModalImageHover = true;
|
|
}, function() {
|
|
imageModalImageHover = false;
|
|
});
|
|
|
|
// prevent image control button links from scrolling
|
|
$('.modal-ui-icon').click(function(event) {
|
|
event.preventDefault();
|
|
});
|
|
|
|
// Define function to close modal
|
|
function closeModal(imageModal) {
|
|
imageModal.removeClass('image-is-fit-to-screen').removeClass('image-is-zoomed');
|
|
$('.wrapper-modal-image .image-content .image-controls .modal-ui-icon.action-zoom-in').removeClass('is-disabled').attr('aria-disabled', false);
|
|
$('.wrapper-modal-image .image-content .image-controls .modal-ui-icon.action-zoom-out').addClass('is-disabled').attr('aria-disabled', true);
|
|
var currentDraggie = imageModal.data('draggie');
|
|
currentDraggie.disable();
|
|
$('body').css('overflow', 'auto');
|
|
}
|
|
|
|
// Click outside of modal to close it.
|
|
$('.wrapper-modal-image .image-modal').click(function() {
|
|
if (!imageModalImageHover) {
|
|
closeModal($(this));
|
|
}
|
|
});
|
|
|
|
// Click close icon to close modal.
|
|
$('.wrapper-modal-image .image-content .action-remove').click(function() {
|
|
closeModal($(this).closest('.image-modal'));
|
|
});
|
|
|
|
// zooming image in modal and allow it to be dragged
|
|
// Make sure it always starts zero position for below calcs to work
|
|
$('.wrapper-modal-image .image-content .image-controls .modal-ui-icon').click(function() {
|
|
if (!$(this).hasClass('is-disabled')) {
|
|
var mask = $(this).closest('.image-content');
|
|
|
|
var imageModal = $(this).closest('.image-modal');
|
|
var img = imageModal.find('img');
|
|
var currentDraggie = imageModal.data('draggie');
|
|
|
|
if ($(this).hasClass('action-zoom-in')) {
|
|
imageModal.removeClass('image-is-fit-to-screen').addClass('image-is-zoomed');
|
|
|
|
var imgWidth = img.width();
|
|
var imgHeight = img.height();
|
|
|
|
var imgContainerOffsetLeft = imgWidth - mask.width();
|
|
var imgContainerOffsetTop = imgHeight - mask.height();
|
|
var imgContainerWidth = imgWidth + imgContainerOffsetLeft;
|
|
var imgContainerHeight = imgHeight + imgContainerOffsetTop;
|
|
|
|
// Set the width and height of the image's container so that the dimensions are equal to the image dimensions + view area dimensions to limit dragging
|
|
// Set image container top and left to center image at load.
|
|
img.parent().css({
|
|
left: -imgContainerOffsetLeft,
|
|
top: -imgContainerOffsetTop,
|
|
width: imgContainerWidth,
|
|
height: imgContainerHeight
|
|
});
|
|
img.css({top: imgContainerOffsetTop / 2, left: imgContainerOffsetLeft / 2});
|
|
|
|
currentDraggie.enable();
|
|
} else if ($(this).hasClass('action-zoom-out')) {
|
|
imageModal.removeClass('image-is-zoomed').addClass('image-is-fit-to-screen');
|
|
|
|
currentDraggie.disable();
|
|
}
|
|
|
|
$('.wrapper-modal-image .image-content .image-controls .modal-ui-icon').toggleClass('is-disabled').attr('aria-disabled', $(this).hasClass('is-disabled'));
|
|
}
|
|
});
|
|
};
|