mirror of
https://github.com/zulip/zulip.git
synced 2025-11-14 10:57:58 +00:00
We've noticed that many production organizations don't set either an organization description or profile picture, even large open source organizations that could definitely take advantage of this feature. This adds a top-of-page banner that bugs organization administrators to add an organization description and profile picture, generally starting on the second login (as we only do it on page load after notifications are configured). Significantly tweaked by tabbott to get the right user experience. Fixes #14019.
106 lines
3.7 KiB
JavaScript
106 lines
3.7 KiB
JavaScript
const util = require("./util");
|
|
const resize_app = function () {
|
|
const panels_height = $("#panels").height();
|
|
$("body > .app").height("calc(100% - " + panels_height + "px)");
|
|
// the floating recipient bar is usually positioned 10px below the
|
|
// header, so add that to the panels height to get the new `top` value.
|
|
$("#floating_recipient_bar").css("top", panels_height + $(".header").height() + 10 + "px");
|
|
};
|
|
|
|
exports.resize_app = resize_app;
|
|
|
|
const show_step = function ($process, step) {
|
|
$process.find("[data-step]").hide().filter("[data-step=" + step + "]").show();
|
|
};
|
|
|
|
const get_step = function ($process) {
|
|
return $process.find("[data-step]").filter(":visible").data("step");
|
|
};
|
|
|
|
function should_show_notifications(ls) {
|
|
// if the user said to never show banner on this computer again, it will
|
|
// be stored as `true` so we want to negate that.
|
|
if (localstorage.supported()) {
|
|
if (ls.get("dontAskForNotifications") === true) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return (
|
|
// notifications *basically* don't work on any mobile platforms, so don't
|
|
// event show the banners. This prevents trying to access things that
|
|
// don't exist like `Notification.permission`.
|
|
!util.is_mobile() &&
|
|
// if permission has not been granted yet.
|
|
!notifications.granted_desktop_notifications_permission() &&
|
|
// if permission is allowed to be requested (e.g. not in "denied" state).
|
|
notifications.permission_state() !== "denied"
|
|
);
|
|
}
|
|
|
|
exports.check_profile_incomplete = function () {
|
|
if (!page_params.is_admin) {
|
|
return;
|
|
}
|
|
|
|
// Eventually, we might also check page_params.realm_icon_source,
|
|
// but it feels too aggressive to ask users to do change that
|
|
// since their organization might not have a logo yet.
|
|
if (page_params.realm_description === '' ||
|
|
page_params.realm_description.startsWith("Organization imported from")) {
|
|
$("[data-process='profile-incomplete']").show();
|
|
} else {
|
|
$("[data-process='profile-incomplete']").hide();
|
|
}
|
|
};
|
|
|
|
exports.initialize = function () {
|
|
const ls = localstorage();
|
|
if (page_params.insecure_desktop_app) {
|
|
exports.open($("[data-process='insecure-desktop-app']"));
|
|
} else if (page_params.warn_no_email === true && page_params.is_admin) {
|
|
// if email has not been set up and the user is the admin,
|
|
// display a warning to tell them to set up an email server.
|
|
exports.open($("[data-process='email-server']"));
|
|
} else if (should_show_notifications(ls)) {
|
|
exports.open($("[data-process='notifications']"));
|
|
} else {
|
|
// TODO: This should be restructured with separate check and
|
|
// show calls.
|
|
exports.check_profile_incomplete();
|
|
}
|
|
|
|
// Configure click handlers.
|
|
$(".request-desktop-notifications").on("click", function (e) {
|
|
e.preventDefault();
|
|
$(this).closest(".alert").hide();
|
|
notifications.request_desktop_notifications_permission();
|
|
resize_app();
|
|
});
|
|
|
|
$(".reject-notifications").on("click", function () {
|
|
$(this).closest(".alert").hide();
|
|
ls.set("dontAskForNotifications", true);
|
|
resize_app();
|
|
});
|
|
|
|
$("#panels").on("click", ".alert .close, .alert .exit", function (e) {
|
|
e.stopPropagation();
|
|
const $process = $(e.target).closest("[data-process]");
|
|
if (get_step($process) === 1 && $process.data("process") === "notifications") {
|
|
show_step($process, 2);
|
|
} else {
|
|
$(this).closest(".alert").hide();
|
|
}
|
|
resize_app();
|
|
});
|
|
};
|
|
|
|
exports.open = function ($process) {
|
|
$("[data-process]").hide();
|
|
$process.show();
|
|
resize_app();
|
|
};
|
|
|
|
window.panels = exports;
|