Files
zulip/static/js/common.js
Priyank Patel 43da43701b refactor: Use variables to get TypeScript type narrowing.
We also add an explicit undefined check for the these return value
of the Map.get calls. This makes the TypeScript conversion diff
cleaner.
2021-06-22 09:09:36 -07:00

133 lines
4.0 KiB
JavaScript

import $ from "jquery";
import tippy from "tippy.js";
import {$t} from "./i18n";
export const status_classes = "alert-error alert-success alert-info alert-warning";
// TODO: Move this to the portico codebase.
export function autofocus(selector) {
$(() => {
$(selector).trigger("focus");
});
}
export function phrase_match(query, phrase) {
// match "tes" to "test" and "stream test" but not "hostess"
let i;
query = query.toLowerCase();
phrase = phrase.toLowerCase();
if (phrase.startsWith(query)) {
return true;
}
const parts = phrase.split(" ");
for (i = 0; i < parts.length; i += 1) {
if (parts[i].startsWith(query)) {
return true;
}
}
return false;
}
export function copy_data_attribute_value(elem, key) {
// function to copy the value of data-key
// attribute of the element to clipboard
const temp = $(document.createElement("input"));
$("body").append(temp);
temp.val(elem.data(key)).trigger("select");
document.execCommand("copy");
temp.remove();
elem.fadeOut(250);
elem.fadeIn(1000);
}
export function has_mac_keyboard() {
return /mac/i.test(navigator.platform);
}
export function adjust_mac_shortcuts(key_elem_class, require_cmd_style) {
if (!has_mac_keyboard()) {
return;
}
const keys_map = new Map([
["Backspace", "Delete"],
["Enter", "Return"],
["Home", "Fn + ←"],
["End", "Fn + →"],
["PgUp", "Fn + ↑"],
["PgDn", "Fn + ↓"],
["Ctrl", "⌘"],
]);
$(key_elem_class).each(function () {
let key_text = $(this).text();
const keys = key_text.match(/[^\s+]+/g) || [];
if (key_text.includes("Ctrl") && require_cmd_style) {
$(this).addClass("mac-cmd-key");
}
for (const key of keys) {
const replace_key = keys_map.get(key);
if (replace_key !== undefined) {
key_text = key_text.replace(key, replace_key);
}
}
$(this).text(key_text);
});
}
// See https://zulip.readthedocs.io/en/latest/development/authentication.html#password-form-implementation
// for design details on this feature.
function set_password_toggle_label(password_selector, label, tippy_tooltips) {
$(password_selector).attr("aria-label", label);
if (tippy_tooltips) {
const element = $(password_selector)[0];
const tippy_instance = element._tippy ?? tippy(element);
tippy_instance.setContent(label);
} else {
$(password_selector).attr("title", label);
}
}
function toggle_password_visibility(password_field_id, password_selector, tippy_tooltips) {
let label;
const password_field = $(password_field_id);
if (password_field.attr("type") === "password") {
password_field.attr("type", "text");
$(password_selector).removeClass("fa-eye-slash").addClass("fa-eye");
label = $t({defaultMessage: "Hide password"});
} else {
password_field.attr("type", "password");
$(password_selector).removeClass("fa-eye").addClass("fa-eye-slash");
label = $t({defaultMessage: "Show password"});
}
set_password_toggle_label(password_selector, label, tippy_tooltips);
}
export function reset_password_toggle_icons(password_field, password_selector) {
$(password_field).attr("type", "password");
$(password_selector).removeClass("fa-eye").addClass("fa-eye-slash");
const label = $t({defaultMessage: "Show password"});
set_password_toggle_label(password_selector, label, true);
}
export function setup_password_visibility_toggle(
password_field_id,
password_selector,
{tippy_tooltips = false} = {},
) {
const label = $t({defaultMessage: "Show password"});
set_password_toggle_label(password_selector, label, tippy_tooltips);
$(password_selector).on("click", (e) => {
e.preventDefault();
e.stopPropagation();
toggle_password_visibility(password_field_id, password_selector, tippy_tooltips);
});
}