2021-03-11 05:43:45 +01:00
|
|
|
import $ from "jquery";
|
|
|
|
|
2021-02-28 00:36:14 +01:00
|
|
|
import render_loader from "../templates/loader.hbs";
|
2020-08-01 03:43:15 +02:00
|
|
|
|
2021-06-17 19:39:35 +02:00
|
|
|
export function make_indicator(
|
|
|
|
outer_container: JQuery,
|
|
|
|
{abs_positioned = false, text}: {abs_positioned?: boolean; text?: string} = {},
|
|
|
|
): void {
|
2019-11-02 00:06:25 +01:00
|
|
|
let container = outer_container;
|
2017-04-06 02:18:00 +02:00
|
|
|
|
|
|
|
// TODO: We set white-space to 'nowrap' because under some
|
|
|
|
// unknown circumstances (it happens on Keegan's laptop) the text
|
|
|
|
// width calculation, above, returns a result that's a few pixels
|
|
|
|
// too small. The container's div will be slightly too small,
|
|
|
|
// but that's probably OK for our purposes.
|
2020-07-15 01:29:15 +02:00
|
|
|
outer_container.css({"white-space": "nowrap"});
|
2017-04-06 02:18:00 +02:00
|
|
|
|
2014-03-13 15:03:01 +01:00
|
|
|
container.empty();
|
|
|
|
|
2021-06-25 22:08:05 +02:00
|
|
|
if (abs_positioned) {
|
2014-03-13 15:03:01 +01:00
|
|
|
// Create some additional containers to facilitate absolutely
|
|
|
|
// positioned spinners.
|
2021-09-23 00:25:31 +02:00
|
|
|
const container_id = container.attr("id")!;
|
2021-02-03 20:42:23 +01:00
|
|
|
let inner_container = $("<div>", {id: `${container_id}_box_container`});
|
2014-03-13 15:03:01 +01:00
|
|
|
container.append(inner_container);
|
|
|
|
container = inner_container;
|
2021-02-03 20:42:23 +01:00
|
|
|
inner_container = $("<div>", {id: `${container_id}_box`});
|
2014-03-13 15:03:01 +01:00
|
|
|
container.append(inner_container);
|
|
|
|
container = inner_container;
|
|
|
|
}
|
|
|
|
|
2020-08-10 01:47:56 +02:00
|
|
|
const spinner_elem = $('<div class="loading_indicator_spinner" aria-hidden="true"></div>');
|
2020-07-16 22:40:18 +02:00
|
|
|
spinner_elem.html(render_loader({container_id: outer_container.attr("id")}));
|
2014-03-13 15:03:01 +01:00
|
|
|
container.append(spinner_elem);
|
2019-11-02 00:06:25 +01:00
|
|
|
let text_width = 0;
|
2014-03-13 15:03:01 +01:00
|
|
|
|
2021-06-25 22:08:05 +02:00
|
|
|
if (text !== undefined) {
|
2019-11-02 00:06:25 +01:00
|
|
|
const text_elem = $('<span class="loading_indicator_text"></span>');
|
2021-06-25 22:08:05 +02:00
|
|
|
text_elem.text(text);
|
2014-03-13 15:03:01 +01:00
|
|
|
container.append(text_elem);
|
|
|
|
// See note, below
|
2021-06-25 22:08:05 +02:00
|
|
|
if (!abs_positioned) {
|
2021-06-17 19:39:35 +02:00
|
|
|
text_width = 20 + (text_elem.width() ?? 0);
|
2017-04-05 03:55:28 +02:00
|
|
|
}
|
2014-03-13 15:03:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// These width calculations are tied to the spinner width and
|
|
|
|
// margins defined via CSS
|
2020-07-15 00:34:28 +02:00
|
|
|
container.css({width: 38 + text_width, height: 0});
|
2014-03-13 15:03:01 +01:00
|
|
|
|
2017-01-05 01:03:14 +01:00
|
|
|
outer_container.data("destroying", false);
|
2021-02-28 00:36:14 +01:00
|
|
|
}
|
2014-03-13 15:03:01 +01:00
|
|
|
|
2021-06-17 19:39:35 +02:00
|
|
|
export function destroy_indicator(container: JQuery): void {
|
2014-03-13 15:03:01 +01:00
|
|
|
if (container.data("destroying")) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
container.data("destroying", true);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const spinner = container.data("spinner_obj");
|
2014-03-13 15:03:01 +01:00
|
|
|
if (spinner !== undefined) {
|
|
|
|
spinner.stop();
|
|
|
|
}
|
|
|
|
container.removeData("spinner_obj");
|
|
|
|
container.empty();
|
2020-07-19 07:22:40 +02:00
|
|
|
container.css({width: 0, height: 0});
|
2021-02-28 00:36:14 +01:00
|
|
|
}
|
2021-07-16 08:45:23 +02:00
|
|
|
|
|
|
|
export function show_button_spinner(elt: JQuery, using_dark_theme: boolean): void {
|
|
|
|
if (!using_dark_theme) {
|
|
|
|
elt.attr("src", "/static/images/loader-black.svg");
|
|
|
|
} else {
|
2021-07-16 19:30:20 +02:00
|
|
|
elt.attr("src", "/static/images/loader-white.svg");
|
2021-07-16 08:45:23 +02:00
|
|
|
}
|
|
|
|
elt.css("display", "inline-block");
|
|
|
|
}
|