Files
zulip/static/js/settings_emoji.js
Anders Kaseorg 6ec808b8df js: Add "use strict" directive to CommonJS files.
ES and TypeScript modules are strict by default and don’t need this
directive.  ESLint will remind us to add it to new CommonJS files and
remove it from ES and TypeScript modules.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2020-07-31 22:09:46 -07:00

212 lines
6.5 KiB
JavaScript

"use strict";
const emoji = require("../shared/js/emoji");
const render_admin_emoji_list = require("../templates/admin_emoji_list.hbs");
const render_settings_emoji_settings_tip = require("../templates/settings/emoji_settings_tip.hbs");
const meta = {
loaded: false,
};
exports.can_add_emoji = function () {
if (page_params.is_guest) {
return false;
}
if (page_params.is_admin) {
return true;
}
// for normal users, we depend on the setting
return !page_params.realm_add_emoji_by_admins_only;
};
function can_admin_emoji(emoji) {
if (page_params.is_admin) {
return true;
}
if (emoji.author_id === null) {
// If we don't have the author information then only admin is allowed to disable that emoji.
return false;
}
if (!page_params.realm_add_emoji_by_admins_only && people.is_my_user_id(emoji.author_id)) {
return true;
}
return false;
}
exports.update_custom_emoji_ui = function () {
const rendered_tip = render_settings_emoji_settings_tip({
realm_add_emoji_by_admins_only: page_params.realm_add_emoji_by_admins_only,
});
$("#emoji-settings").find(".emoji-settings-tip-container").html(rendered_tip);
if (page_params.realm_add_emoji_by_admins_only && !page_params.is_admin) {
$(".add-emoji-text").hide();
$(".admin-emoji-form").hide();
} else {
$(".add-emoji-text").show();
$(".admin-emoji-form").show();
}
exports.populate_emoji();
};
exports.reset = function () {
meta.loaded = false;
};
function sort_author_full_name(a, b) {
if (a.author.full_name > b.author.full_name) {
return 1;
} else if (a.author.full_name === b.author.full_name) {
return 0;
}
return -1;
}
exports.populate_emoji = function () {
if (!meta.loaded) {
return;
}
const emoji_data = emoji.get_server_realm_emoji_data();
for (const emoji of Object.values(emoji_data)) {
// Add people.js data for the user here.
if (emoji.author_id !== null) {
emoji.author = people.get_by_user_id(emoji.author_id);
} else {
emoji.author = null;
}
}
const emoji_table = $("#admin_emoji_table").expectOne();
list_render.create(emoji_table, Object.values(emoji_data), {
name: "emoji_list",
modifier(item) {
if (item.deactivated !== true) {
return render_admin_emoji_list({
emoji: {
name: item.name,
display_name: item.name.replace(/_/g, " "),
source_url: item.source_url,
author: item.author || "",
can_admin_emoji: can_admin_emoji(item),
},
});
}
return "";
},
filter: {
element: emoji_table.closest(".settings-section").find(".search"),
predicate(item, value) {
return item.name.toLowerCase().includes(value);
},
onupdate() {
ui.reset_scrollbar(emoji_table);
},
},
parent_container: $("#emoji-settings").expectOne(),
sort_fields: {
author_full_name: sort_author_full_name,
},
init_sort: ["alphabetic", "name"],
simplebar_container: $("#emoji-settings .progressive-table-wrapper"),
});
loading.destroy_indicator($("#admin_page_emoji_loading_indicator"));
};
exports.build_emoji_upload_widget = function () {
const get_file_input = function () {
return $("#emoji_file_input");
};
const file_name_field = $("#emoji-file-name");
const input_error = $("#emoji_file_input_error");
const clear_button = $("#emoji_image_clear_button");
const upload_button = $("#emoji_upload_button");
const preview_text = $("#emoji_preview_text");
const preview_image = $("#emoji_preview_image");
return upload_widget.build_widget(
get_file_input,
file_name_field,
input_error,
clear_button,
upload_button,
preview_text,
preview_image,
);
};
exports.set_up = function () {
meta.loaded = true;
loading.make_indicator($("#admin_page_emoji_loading_indicator"));
// Populate emoji table
exports.populate_emoji();
$(".admin_emoji_table").on("click", ".delete", function (e) {
e.preventDefault();
e.stopPropagation();
const btn = $(this);
channel.del({
url: "/json/realm/emoji/" + encodeURIComponent(btn.attr("data-emoji-name")),
error(xhr) {
ui_report.generic_row_button_error(xhr, btn);
},
success() {
const row = btn.parents("tr");
row.remove();
},
});
});
const emoji_widget = exports.build_emoji_upload_widget();
$(".organization form.admin-emoji-form")
.off("submit")
.on("submit", function (e) {
e.preventDefault();
e.stopPropagation();
const emoji_status = $("#admin-emoji-status");
$("#admin_emoji_submit").prop("disabled", true);
const emoji = {};
const formData = new FormData();
for (const obj of $(this).serializeArray()) {
emoji[obj.name] = obj.value;
}
for (const [i, file] of Array.prototype.entries.call($("#emoji_file_input")[0].files)) {
formData.append("file-" + i, file);
}
channel.post({
url: "/json/realm/emoji/" + encodeURIComponent(emoji.name),
data: formData,
cache: false,
processData: false,
contentType: false,
success() {
$("#admin-emoji-status").hide();
ui_report.success(i18n.t("Custom emoji added!"), emoji_status);
$("form.admin-emoji-form input[type='text']").val("");
$("#admin_emoji_submit").prop("disabled", false);
emoji_widget.clear();
},
error(xhr) {
$("#admin-emoji-status").hide();
const errors = JSON.parse(xhr.responseText).msg;
xhr.responseText = JSON.stringify({msg: errors});
ui_report.error(i18n.t("Failed"), xhr, emoji_status);
$("#admin_emoji_submit").prop("disabled", false);
},
});
});
};
window.settings_emoji = exports;