Files
zulip/static/js/stream_ui_updates.js
Anders Kaseorg 141088586b Completely replace perfect-scrollbar with SimpleBar.
perfect-scrollbar replaces both the appearance and the behavior of the
scrollbar, and its emulated behavior will never feel native on most
platforms.  SimpleBar customizes the appearance while preserving the
native behavior.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
2019-05-17 12:06:51 -07:00

218 lines
8.0 KiB
JavaScript

var stream_ui_updates = (function () {
var exports = {};
exports.update_check_button_for_sub = function (sub) {
var button = subs.check_button_for_sub(sub);
if (sub.subscribed) {
button.addClass("checked");
} else {
button.removeClass("checked");
}
if (sub.should_display_subscription_button) {
button.removeClass("disabled");
} else {
button.addClass("disabled");
}
};
exports.initialize_disable_btn_hint_popover = function (btn_wrapper, popover_btn,
disabled_btn, hint_text) {
// Disabled button blocks mouse events(hover) from reaching
// to it's parent div element, so popover don't get triggered.
// Add css to prevent this.
disabled_btn.css("pointer-events", "none");
popover_btn.popover({
placement: "bottom",
content: "<div class='sub_disable_btn_hint'>%s</div>".replace(
'%s', hint_text),
trigger: "manual",
html: true,
animation: false,
});
btn_wrapper.on('mouseover', function (e) {
popover_btn.popover('show');
e.stopPropagation();
});
btn_wrapper.on('mouseout', function (e) {
popover_btn.popover('hide');
e.stopPropagation();
});
};
exports.initialize_cant_subscribe_popover = function (sub) {
var button_wrapper = stream_edit.settings_for_sub(sub).find('.sub_unsub_button_wrapper');
var settings_button = subs.settings_button_for_sub(sub);
exports.initialize_disable_btn_hint_popover(button_wrapper, settings_button, settings_button,
i18n.t("Only stream members can add users to a private stream"));
};
exports.update_settings_button_for_sub = function (sub) {
var settings_button = subs.settings_button_for_sub(sub);
if (sub.subscribed) {
settings_button.text(i18n.t("Unsubscribe")).removeClass("unsubscribed");
} else {
settings_button.text(i18n.t("Subscribe")).addClass("unsubscribed");
}
if (sub.should_display_subscription_button) {
settings_button.prop("disabled", false);
settings_button.popover('destroy');
settings_button.css("pointer-events", "");
} else {
settings_button.attr("title", "");
exports.initialize_cant_subscribe_popover(sub);
settings_button.attr("disabled", "disabled");
}
};
exports.update_regular_sub_settings = function (sub) {
if (!stream_edit.is_sub_settings_active(sub)) {
return;
}
var $settings = $(".subscription_settings[data-stream-id='" + sub.stream_id + "']");
if (sub.subscribed) {
if ($settings.find(".email-address").val().length === 0) {
// Rerender stream email address, if not.
$settings.find(".email-address").text(sub.email_address);
$settings.find(".stream-email-box").show();
}
$settings.find(".regular_subscription_settings").addClass('in');
} else {
$settings.find(".regular_subscription_settings").removeClass('in');
// Clear email address widget
$settings.find(".email-address").html("");
}
};
exports.update_change_stream_privacy_settings = function (sub) {
var stream_privacy_btn = $(".change-stream-privacy");
if (sub.can_change_stream_permissions) {
stream_privacy_btn.show();
} else {
stream_privacy_btn.hide();
}
};
exports.update_stream_row_in_settings_tab = function (sub) {
// This function display/hide stream row in stream settings tab,
// used to display immediate effect of add/removal subscription event.
// If user is subscribed to stream, it will show sub row under
// "Subscribed" tab, otherwise if stream is not public hide
// stream row under tab.
if (subs.is_subscribed_stream_tab_active()) {
var sub_row = subs.row_for_stream_id(sub.stream_id);
if (sub.subscribed) {
sub_row.removeClass("notdisplayed");
} else if (sub.invite_only || page_params.is_guest) {
sub_row.addClass("notdisplayed");
}
}
};
exports.update_stream_privacy_type_icon = function (sub) {
var stream_settings = stream_edit.settings_for_sub(sub);
var sub_row = subs.row_for_stream_id(sub.stream_id);
var html = templates.render('subscription_setting_icon', sub);
if (overlays.streams_open()) {
sub_row.find('.icon').expectOne().replaceWith($(html));
}
if (stream_edit.is_sub_settings_active(sub)) {
var large_icon = stream_settings.find('.large-icon').expectOne();
if (sub.invite_only) {
large_icon.removeClass("hash").addClass("lock")
.html("<i class='fa fa-lock' aria-hidden='true'></i>");
} else {
large_icon.addClass("hash").removeClass("lock").html("");
}
}
};
exports.update_stream_privacy_type_text = function (sub) {
var stream_settings = stream_edit.settings_for_sub(sub);
var html = templates.render('subscription_type', sub);
if (stream_edit.is_sub_settings_active(sub)) {
stream_settings.find('.subscription-type-text').expectOne().html(html);
}
};
exports.update_subscribers_count = function (sub, just_subscribed) {
if (!overlays.streams_open()) {
// If the streams overlay isn't open, we don't need to rerender anything.
return;
}
var stream_row = subs.row_for_stream_id(sub.stream_id);
if (!sub.can_access_subscribers || just_subscribed && sub.invite_only || page_params.is_guest) {
var rendered_sub_count = templates.render("subscription_count", sub);
stream_row.find('.subscriber-count').expectOne().html(rendered_sub_count);
} else {
stream_row.find(".subscriber-count-text").expectOne().text(sub.subscriber_count);
}
};
exports.update_subscribers_list = function (sub) {
// Render subscriptions only if stream settings is open
if (!stream_edit.is_sub_settings_active(sub)) {
return;
}
if (!sub.can_access_subscribers) {
$(".subscriber_list_settings_container").hide();
} else {
var emails = stream_edit.get_email_of_subscribers(sub.subscribers);
var subscribers_list = list_render.get("stream_subscribers/" + sub.stream_id);
// Changing the data clears the rendered list and the list needs to be re-rendered.
// Perform re-rendering only when the stream settings form of the corresponding
// stream is open.
if (subscribers_list) {
stream_edit.sort_but_pin_current_user_on_top(emails);
subscribers_list.data(emails);
subscribers_list.render();
}
$(".subscriber_list_settings_container").show();
}
};
exports.update_add_subscriptions_elements = function (sub) {
if (!stream_edit.is_sub_settings_active(sub)) {
return;
}
if (page_params.is_guest) {
// For guest users, we just hide the add_subscribers feature.
$('.add_subscribers_container').hide();
return;
}
// Otherwise, we adjust whether the widgets are disabled based on
// whether this user is authorized to add subscribers.
var input_element = $('.add_subscribers_container').find('input[name="principal"]').expectOne();
var button_element = $('.add_subscribers_container').find('button[name="add_subscriber"]').expectOne();
var allow_user_to_add_subs = sub.can_add_subscribers;
if (allow_user_to_add_subs) {
input_element.removeAttr("disabled");
button_element.removeAttr("disabled");
button_element.css('pointer-events', "");
$('.add_subscribers_container input').popover('destroy');
} else {
input_element.attr("disabled", "disabled");
button_element.attr("disabled", "disabled");
exports.initialize_disable_btn_hint_popover($('.add_subscribers_container'), input_element, button_element,
i18n.t("Only stream members can add users to a private stream"));
}
};
return exports;
}());
if (typeof module !== 'undefined') {
module.exports = stream_ui_updates;
}
window.stream_ui_updates = stream_ui_updates;