Files
backend-mm/public/web/shella/scripts/module.sticky-sidebar.js
2025-09-25 03:03:31 +05:00

112 lines
4.1 KiB
JavaScript

theme.StickySidebar = function() {
function StickySidebar() {
this.selectors = {
elements: '.js-sticky-sidebar'
};
};
StickySidebar.prototype = $.extend({}, StickySidebar.prototype, {
init: function ($container, is_parent) {
if(edge || ie) {
return;
}
var $sticky = $container[is_parent ? 'parents' : 'find'](this.selectors.elements);
if($sticky.length) {
if(moz && $sticky[0].hasAttribute('data-disable-moz')) {
return;
}
function calculate($sticky) {
$sticky.each(function () {
var $this = $(this),
$inner = $this.find('[data-sticky-sidebar-inner]');
if(theme.current.is_desktop) {
if(!$this.hasClass('initialize')) {
var $parent = $this.parents('[data-sticky-sidebar-parent]'),
topSpacing = theme.StickyHeader && theme.StickyHeader.$sticky ? theme.StickyHeader.$sticky.stickyHeader('getStickyHeight') : 0,
bottomSpacing = 0,
own_topSpacing = $this.attr('data-top-spacing'),
own_bottomSpacing = $this.attr('data-bottom-spacing');
if(own_topSpacing !== undefined) {
topSpacing += +own_topSpacing;
}
if(own_bottomSpacing !== undefined) {
bottomSpacing += +own_bottomSpacing;
}
$this.stickySidebar({
containerSelector: $parent,
innerWrapperSelector: $inner,
topSpacing: topSpacing,
bottomSpacing: bottomSpacing
}).addClass('initialize active');
} else if(!$this.hasClass('active')) {
$this.stickySidebar('updateSticky');
$this.addClass('active');
}
} else {
if($this.hasClass('initialize active')) {
$this.stickySidebar('destroy');
$this.removeClass('initialize active');
$this.removeAttr('style');
$inner.removeAttr('style');
}
}
});
};
$window.on('theme.changed.breakpoint.sticky-sidebar', function () {
calculate($sticky);
});
calculate($sticky);
}
},
update: function ($sticky) {
if(edge || ie) {
return;
}
if($sticky.length && theme.current.is_desktop) {
if(moz && $sticky[0].hasAttribute('data-disable-moz')) {
return;
}
$sticky.each(function() {
var $this = $(this);
if($this.hasClass('initialize active')) {
$this.stickySidebar('updateSticky');
}
});
}
},
destroy: function ($container, is_parent) {
if(edge || ie) {
return;
}
var $sticky = $container[is_parent ? 'parents' : 'find'](this.selectors.elements);
if($sticky.length && $sticky.hasClass('initialize')) {
if(moz && $sticky[0].hasAttribute('data-disable-moz')) {
return;
}
$window.unbind('theme.changed.breakpoint.sticky-sidebar');
$sticky.stickySidebar('destroy');
}
}
});
theme.StickySidebar = new StickySidebar;
};
$(function() {
theme.StickySidebar();
});