Files
edx-platform/xmodule/js/src/html/imageModal.js
Syed Ali Abbas Zaidi 5549db4d80 fix: migrate remaining eslint-config-edx (#31760)
* 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
2023-03-02 16:16:50 +05:00

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'));
}
});
};