-
Notifications
You must be signed in to change notification settings - Fork 1.9k
/
outputBinding.ts
64 lines (57 loc) · 1.77 KB
/
outputBinding.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import $ from "jquery";
import { asArray } from "../../utils";
import type { ErrorsMessageValue } from "../../shiny/shinyapp";
class OutputBinding {
name!: string;
// Returns a jQuery object or element array that contains the
// descendants of scope that match this binding
find(scope: HTMLElement | JQuery<HTMLElement>): JQuery<HTMLElement> {
throw "Not implemented";
scope;
}
renderValue(el: HTMLElement, data: unknown): Promise<void> | void {
throw "Not implemented";
el;
data;
}
getId(el: HTMLElement): string {
return el.getAttribute("data-input-id") || el.id;
}
async onValueChange(el: HTMLElement, data: unknown): Promise<void> {
this.clearError(el);
await this.renderValue(el, data);
}
onValueError(el: HTMLElement, err: ErrorsMessageValue): void {
this.renderError(el, err);
}
renderError(el: HTMLElement, err: ErrorsMessageValue): void {
this.clearError(el);
if (err.message === "") {
// not really error, but we just need to wait (e.g. action buttons)
$(el).empty();
return;
}
let errClass = "shiny-output-error";
if (err.type !== null) {
// use the classes of the error condition as CSS class names
errClass =
errClass +
" " +
$.map(asArray(err.type), function (type) {
return errClass + "-" + type;
}).join(" ");
}
$(el).addClass(errClass).text(err.message);
}
clearError(el: HTMLElement): void {
$(el).attr("class", function (i, c) {
return c.replace(/(^|\s)shiny-output-error\S*/g, "");
});
}
showProgress(el: HTMLElement, show: boolean): void {
const recalcClass = "recalculating";
if (show) $(el).addClass(recalcClass);
else $(el).removeClass(recalcClass);
}
}
export { OutputBinding };