-
Notifications
You must be signed in to change notification settings - Fork 73
Expand file tree
/
Copy pathselect-all.model.ts
More file actions
115 lines (93 loc) · 3.32 KB
/
select-all.model.ts
File metadata and controls
115 lines (93 loc) · 3.32 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { ComputedAtom, createEmitter, disposeBatch, Emitter } from "@mendix/widget-plugin-mobx-kit/main";
import { reaction } from "mobx";
export type ServiceEvents = {
loadstart: ProgressEvent;
progress: ProgressEvent;
done: { success: boolean };
loadend: undefined;
};
export type UIEvents = {
visibility: { visible: boolean };
startSelecting: undefined;
clear: undefined;
abort: undefined;
};
type Handler<T, K extends keyof T> = (event: T[K]) => void;
type PrettyType<T> = { [K in keyof T]: T[K] };
export type SelectAllEvents = PrettyType<ServiceEvents & UIEvents>;
/** @injectable */
export function selectAllEmitter(): Emitter<SelectAllEvents> {
return createEmitter<SelectAllEvents>();
}
export interface BarStore {
pending: boolean;
visible: boolean;
clearBtnVisible: boolean;
setClearBtnVisible(value: boolean): void;
setPending(value: boolean): void;
hideBar(): void;
showBar(): void;
}
export interface SelectService {
selectAllPages(): void;
clearSelection(): void;
abort(): void;
}
export function setupBarStore(store: BarStore, emitter: Emitter<SelectAllEvents>): () => void {
const [add, disposeAll] = disposeBatch();
const handleVisibility: Handler<UIEvents, "visibility"> = (event): void => {
if (event.visible) {
store.showBar();
} else {
store.hideBar();
}
};
const handleLoadStart = (): void => store.setPending(true);
const handleLoadEnd = (): void => store.setPending(false);
const handleDone: Handler<ServiceEvents, "done"> = (event): void => {
store.setClearBtnVisible(event.success);
};
add(emitter.on("visibility", handleVisibility));
add(emitter.on("loadstart", handleLoadStart));
add(emitter.on("loadend", handleLoadEnd));
add(emitter.on("done", handleDone));
return disposeAll;
}
export function setupSelectService(service: SelectService, emitter: Emitter<SelectAllEvents>): () => void {
const [add, disposeAll] = disposeBatch();
add(emitter.on("startSelecting", () => service.selectAllPages()));
add(emitter.on("clear", () => service.clearSelection()));
add(emitter.on("abort", () => service.abort()));
add(() => service.abort());
return disposeAll;
}
export function setupProgressService(
service: {
onloadstart: (event: ProgressEvent) => void;
onprogress: (event: ProgressEvent) => void;
onloadend: () => void;
},
emitter: Emitter<SelectAllEvents>
): () => void {
const [add, disposeAll] = disposeBatch();
add(emitter.on("loadstart", event => service.onloadstart(event)));
add(emitter.on("progress", event => service.onprogress(event)));
add(emitter.on("loadend", () => service.onloadend()));
return disposeAll;
}
export function setupVisibilityEvents(
isPageSelected: ComputedAtom<boolean>,
isAllSelected: ComputedAtom<boolean>,
emitter: Emitter<SelectAllEvents>
): () => void {
return reaction(
() => [isPageSelected.get(), isAllSelected.get()] as const,
([isPageSelected, isAllSelected]) => {
if (isPageSelected === false) {
emitter.emit("visibility", { visible: false });
} else if (isAllSelected === false) {
emitter.emit("visibility", { visible: true });
}
}
);
}