Files
zulip/static/js/overlays.js
Steve Howell 9eb3bdaf6c page load: Make initializations more explicit.
We now initialize most modules in ui_init.js, which
isn't the perfect place to do it, but at least now
we have a mostly consolidated entry point.

All the new foo.initialize() methods introduced in
this module run the same order relative to each
other as before this commit. (I did some console
logging with a hacked version of the program to
get the order right.)  They happen a bit later than
before, though.

A couple modules still have the `$(function() {`
idiom for miscellaneous reasons:

       archive - is a different bundle
       common - used elsewhere
       list_render - non-standard code style
       scroll_bar - no exports
       setup - probably special?
       socket - $(function () is nested!
       transmit - coupled to socket
       translations - i18n is a bigger problem
       ui_init - this bootstraps everything
2018-05-15 15:46:04 -07:00

221 lines
5.6 KiB
JavaScript

var overlays = (function () {
var exports = {};
var active_overlay;
var close_handler;
var open_overlay_name;
function reset_state() {
active_overlay = undefined;
close_handler = undefined;
open_overlay_name = undefined;
}
exports.is_active = function () {
return !!open_overlay_name;
};
exports.is_modal_open = function () {
return $(".modal").hasClass("in");
};
exports.info_overlay_open = function () {
return open_overlay_name === 'informationalOverlays';
};
exports.settings_open = function () {
return open_overlay_name === 'settings';
};
exports.streams_open = function () {
return open_overlay_name === 'subscriptions';
};
exports.lightbox_open = function () {
return open_overlay_name === 'lightbox';
};
exports.drafts_open = function () {
return open_overlay_name === 'drafts';
};
exports.active_modal = function () {
if (!exports.is_modal_open()) {
blueslip.error("Programming error — Called active_modal when there is no modal open");
return;
}
return $(".modal.in").attr("id");
};
exports.open_overlay = function (opts) {
popovers.hide_all();
if (!opts.name || !opts.overlay || !opts.on_close) {
blueslip.error('Programming error in open_overlay');
return;
}
if (active_overlay || open_overlay_name || close_handler) {
blueslip.error('Programming error — trying to open ' + opts.name +
' before closing ' + open_overlay_name);
return;
}
blueslip.debug('open overlay: ' + opts.name);
// Our overlays are kind of crufty...we have an HTML id
// attribute for them and then a data-overlay attribute for
// them. Make sure they match.
if (opts.overlay.attr('data-overlay') !== opts.name) {
blueslip.error('Bad overlay setup for ' + opts.name);
return;
}
open_overlay_name = opts.name;
active_overlay = opts.overlay;
opts.overlay.addClass('show');
opts.overlay.attr("aria-hidden", "false");
$('.app').attr("aria-hidden", "true");
$('.fixed-app').attr("aria-hidden", "true");
$('.header').attr("aria-hidden", "true");
close_handler = function () {
opts.on_close();
reset_state();
};
};
exports.open_modal = function (name) {
if (name === undefined) {
blueslip.error('Undefined name was passed into open_modal');
return;
}
if (exports.is_modal_open()) {
blueslip.error('open_modal() was called while ' + exports.active_modal() +
' modal was open.');
return;
}
blueslip.debug('open modal: ' + name);
$("#" + name).modal("show").attr("aria-hidden", false);
// Remove previous alert messsages from modal, if exists.
$("#" + name).find(".alert").hide();
};
exports.close_overlay = function (name) {
if (name !== open_overlay_name) {
blueslip.error("Trying to close " + name + " when " + open_overlay_name + " is open.");
return;
}
if (name === undefined) {
blueslip.error('Undefined name was passed into close_overlay');
return;
}
blueslip.debug('close overlay: ' + name);
active_overlay.removeClass("show");
active_overlay.attr("aria-hidden", "true");
$('.app').attr("aria-hidden", "false");
$('.fixed-app').attr("aria-hidden", "false");
$('.header').attr("aria-hidden", "false");
if (!close_handler) {
blueslip.error("Overlay close handler for " + name + " not properly setup.");
return;
}
close_handler();
};
exports.close_active = function () {
if (!open_overlay_name) {
blueslip.warn('close_active() called without checking is_active()');
return;
}
exports.close_overlay(open_overlay_name);
};
exports.close_modal = function (name) {
if (name === undefined) {
blueslip.error('Undefined name was passed into close_modal');
return;
}
if (!exports.is_modal_open()) {
blueslip.warn('close_active_modal() called without checking is_modal_open()');
return;
}
if (exports.active_modal() !== name) {
blueslip.error("Trying to close " + name +
" modal when " + exports.active_modal() + " is open.");
return;
}
blueslip.debug('close modal: ' + name);
$("#" + name).modal("hide").attr("aria-hidden", true);
};
exports.close_active_modal = function () {
if (!exports.is_modal_open()) {
blueslip.warn('close_active_modal() called without checking is_modal_open()');
return;
}
$(".modal.in").modal("hide").attr("aria-hidden", true);
};
exports.close_for_hash_change = function () {
$(".overlay.show").removeClass("show");
reset_state();
};
exports.open_settings = function () {
overlays.open_overlay({
name: 'settings',
overlay: $("#settings_overlay_container"),
on_close: function () {
hashchange.exit_overlay();
},
});
};
exports.initialize = function () {
$("body").on("click", ".overlay, .overlay .exit", function (e) {
var $target = $(e.target);
// if the target is not the .overlay element, search up the node tree
// until it is found.
if ($target.is(".exit, .exit-sign, .overlay-content, .exit span")) {
$target = $target.closest("[data-overlay]");
} else if (!$target.is(".overlay")) {
// not a valid click target then.
return;
}
var target_name = $target.attr("data-overlay");
exports.close_overlay(target_name);
e.preventDefault();
e.stopPropagation();
});
};
return exports;
}());
if (typeof module !== 'undefined') {
module.exports = overlays;
}