Files
zulip/static/js/alert_words_ui.js
jai2201 5e49ddf4e1 settings: Add sorting feature for list of alert words.
This changes the method of rendering list of alert words in DOM,
earlier it was rendered using 'for' loop over the array of alert_words
which is now changed to render using ListWidget, which gets a array
of objects from get_word_list() in alert_words.js.

The use of ListWidget helps to define a parent_container and $container
in table-body of alert-words-table using which we can now apply sorting over
alert words with the help of handle_sort() function in list_widget.js

Changed the method of adding alert_word_settings_item row in table body
through {{#with}} loop because of rendering through ListWidget, which was done
earlier using for loop over each alert-word in while rendering the list.

this commit also mocks template of render_alert_word_item
while mocking ListWidget.create() function in render_alert_words_ui().
and checks that ListWidget.create() is not called when variable `loaded`
is set as false.

Fixes #21142.
2022-02-25 17:33:11 -08:00

124 lines
3.9 KiB
JavaScript

import $ from "jquery";
import render_alert_word_settings_item from "../templates/settings/alert_word_settings_item.hbs";
import * as alert_words from "./alert_words";
import * as channel from "./channel";
import {$t} from "./i18n";
import * as ListWidget from "./list_widget";
export let loaded = false;
export function render_alert_words_ui() {
if (!loaded) {
return;
}
const words = alert_words.get_word_list();
words.sort();
const word_list = $("#alert-words-table");
ListWidget.create(word_list, words, {
name: "alert-words-list",
modifier(alert_word) {
return render_alert_word_settings_item({alert_word});
},
parent_container: $("#alert-word-settings"),
simplebar_container: $("#alert-word-settings .progressive-table-wrapper"),
});
// Focus new alert word name text box.
$("#create_alert_word_name").trigger("focus");
}
function update_alert_word_status(status_text, is_error) {
const alert_word_status = $("#alert_word_status");
if (is_error) {
alert_word_status.removeClass("alert-success").addClass("alert-danger");
} else {
alert_word_status.removeClass("alert-danger").addClass("alert-success");
}
alert_word_status.find(".alert_word_status_text").text(status_text);
alert_word_status.show();
}
function add_alert_word(alert_word) {
alert_word = alert_word.trim();
if (alert_word === "") {
update_alert_word_status($t({defaultMessage: "Alert word can't be empty!"}), true);
return;
} else if (alert_words.has_alert_word(alert_word)) {
update_alert_word_status($t({defaultMessage: "Alert word already exists!"}), true);
return;
}
const words_to_be_added = [alert_word];
channel.post({
url: "/json/users/me/alert_words",
data: {alert_words: JSON.stringify(words_to_be_added)},
success() {
const message = $t(
{defaultMessage: 'Alert word "{word}" added successfully!'},
{word: words_to_be_added[0]},
);
update_alert_word_status(message, false);
$("#create_alert_word_name").val("");
},
error() {
update_alert_word_status($t({defaultMessage: "Error adding alert word!"}), true);
},
});
}
function remove_alert_word(alert_word) {
const words_to_be_removed = [alert_word];
channel.del({
url: "/json/users/me/alert_words",
data: {alert_words: JSON.stringify(words_to_be_removed)},
success() {
update_alert_word_status(
$t({defaultMessage: "Alert word removed successfully!"}),
false,
);
},
error() {
update_alert_word_status($t({defaultMessage: "Error removing alert word!"}), true);
},
});
}
export function set_up_alert_words() {
// The settings page must be rendered before this function gets called.
loaded = true;
render_alert_words_ui();
$("#create_alert_word_form").on("click", "#create_alert_word_button", () => {
const word = $("#create_alert_word_name").val();
add_alert_word(word);
});
$("#alert-words-table").on("click", ".remove-alert-word", (event) => {
const word = $(event.currentTarget).parents("tr").find(".value").text().trim();
remove_alert_word(word);
});
$("#create_alert_word_form").on("keypress", "#create_alert_word_name", (event) => {
// Handle Enter as "add".
if (event.key === "Enter") {
event.preventDefault();
const word = $(event.target).val();
add_alert_word(word);
}
});
$("#alert-word-settings").on("click", ".close-alert-word-status", (event) => {
event.preventDefault();
const alert = $(event.currentTarget).parents(".alert");
alert.hide();
});
}
export function reset() {
loaded = false;
}