fwtoolkit 0.1.0-alpha.3 → 0.1.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -8
- package/css/add_remove_dialog.css +18 -0
- package/css/alerts.css +69 -0
- package/css/buttons.css +373 -0
- package/css/colors.css +118 -0
- package/css/common.css +183 -0
- package/css/content_menu.css +105 -0
- package/css/data_table.css +191 -0
- package/css/dialog.css +151 -0
- package/css/dialog_table.css +125 -0
- package/css/faq_dialog.css +16 -0
- package/css/file_selector.css +25 -0
- package/css/forms.css +112 -0
- package/css/loader.css +38 -0
- package/css/overview_menu.css +187 -0
- package/css/pulldown.css +114 -0
- package/css/ui_dialogs.css +144 -0
- package/css/ui_tabs.css +61 -0
- package/dist/basic.d.ts +70 -0
- package/dist/basic.d.ts.map +1 -0
- package/dist/basic.js +447 -0
- package/dist/basic.js.map +1 -0
- package/dist/blob.d.ts +2 -0
- package/dist/blob.d.ts.map +1 -0
- package/dist/blob.js +12 -0
- package/dist/blob.js.map +1 -0
- package/dist/content_menu.d.ts +31 -0
- package/dist/content_menu.d.ts.map +1 -0
- package/dist/content_menu.js +360 -0
- package/dist/content_menu.js.map +1 -0
- package/dist/datatable_bulk.d.ts +14 -0
- package/dist/datatable_bulk.d.ts.map +1 -0
- package/dist/datatable_bulk.js +176 -0
- package/dist/datatable_bulk.js.map +1 -0
- package/dist/dialog.d.ts +18 -0
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +395 -0
- package/dist/dialog.js.map +1 -0
- package/dist/events.d.ts +2 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +11 -0
- package/dist/events.js.map +1 -0
- package/dist/faq_dialog.d.ts +8 -0
- package/dist/faq_dialog.d.ts.map +1 -0
- package/dist/faq_dialog.js +63 -0
- package/dist/faq_dialog.js.map +1 -0
- package/dist/file/dialog.d.ts +27 -0
- package/dist/file/dialog.d.ts.map +1 -0
- package/dist/file/dialog.js +125 -0
- package/dist/file/dialog.js.map +1 -0
- package/dist/file/index.d.ts +5 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +6 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/new_folder_dialog.d.ts +5 -0
- package/dist/file/new_folder_dialog.d.ts.map +1 -0
- package/dist/file/new_folder_dialog.js +34 -0
- package/dist/file/new_folder_dialog.js.map +1 -0
- package/dist/file/selector.d.ts +22 -0
- package/dist/file/selector.d.ts.map +1 -0
- package/dist/file/selector.js +239 -0
- package/dist/file/selector.js.map +1 -0
- package/dist/file/templates.d.ts +5 -0
- package/dist/file/templates.d.ts.map +1 -0
- package/dist/file/templates.js +9 -0
- package/dist/file/templates.js.map +1 -0
- package/dist/file/tools.d.ts +5 -0
- package/dist/file/tools.d.ts.map +1 -0
- package/dist/file/tools.js +51 -0
- package/dist/file/tools.js.map +1 -0
- package/dist/focus.d.ts +3 -0
- package/dist/focus.d.ts.map +1 -0
- package/dist/focus.js +12 -0
- package/dist/focus.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/network.d.ts +11 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +113 -0
- package/dist/network.js.map +1 -0
- package/dist/overview_menu.d.ts +27 -0
- package/dist/overview_menu.d.ts.map +1 -0
- package/dist/overview_menu.js +536 -0
- package/dist/overview_menu.js.map +1 -0
- package/dist/settings.d.ts +3 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +16 -0
- package/dist/settings.js.map +1 -0
- package/dist/templates.d.ts +7 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +43 -0
- package/dist/templates.js.map +1 -0
- package/dist/user.d.ts +6 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +45 -0
- package/dist/user.js.map +1 -0
- package/dist/user_util.d.ts +7 -0
- package/dist/user_util.d.ts.map +1 -0
- package/dist/user_util.js +19 -0
- package/dist/user_util.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +12 -0
- package/dist/worker.js.map +1 -0
- package/dist/ws.d.ts +46 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +329 -0
- package/dist/ws.js.map +1 -0
- package/package.json +26 -4
- package/src/{basic.js → basic.ts} +1 -0
- package/src/{blob.js → blob.ts} +1 -0
- package/src/{content_menu.js → content_menu.ts} +1 -0
- package/src/{datatable_bulk.js → datatable_bulk.ts} +1 -0
- package/src/{dialog.js → dialog.ts} +1 -0
- package/src/{events.js → events.ts} +1 -0
- package/src/{faq_dialog.js → faq_dialog.ts} +1 -0
- package/src/file/{dialog.js → dialog.ts} +1 -0
- package/src/file/{index.js → index.ts} +1 -0
- package/src/file/{new_folder_dialog.js → new_folder_dialog.ts} +1 -0
- package/src/file/{selector.js → selector.ts} +1 -0
- package/src/file/{templates.js → templates.ts} +1 -0
- package/src/file/{tools.js → tools.ts} +1 -0
- package/src/{focus.js → focus.ts} +1 -0
- package/src/global.d.ts +11 -0
- package/src/{index.js → index.ts} +1 -0
- package/src/{network.js → network.ts} +1 -0
- package/src/{overview_menu.js → overview_menu.ts} +1 -0
- package/src/{settings.js → settings.ts} +1 -0
- package/src/{templates.js → templates.ts} +1 -0
- package/src/{user.js → user.ts} +1 -0
- package/src/{user_util.js → user_util.ts} +1 -0
- package/src/{worker.js → worker.ts} +1 -0
- package/src/{ws.js → ws.ts} +1 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { DiffDOM } from "diff-dom";
|
|
3
|
+
import { keyName } from "w3c-keyname";
|
|
4
|
+
import { escapeText, whenReady } from "./basic.js";
|
|
5
|
+
export class OverviewMenuView {
|
|
6
|
+
constructor(overview, model) {
|
|
7
|
+
this.overview = overview;
|
|
8
|
+
this.model = model();
|
|
9
|
+
this.dd = new DiffDOM({
|
|
10
|
+
valueDiffing: false
|
|
11
|
+
});
|
|
12
|
+
this.openedMenu = false;
|
|
13
|
+
this.listeners = {};
|
|
14
|
+
this.keyboardShortcuts = new Map();
|
|
15
|
+
}
|
|
16
|
+
init() {
|
|
17
|
+
whenReady().then(() => {
|
|
18
|
+
this.addMissingIds(this.model);
|
|
19
|
+
this.bindEvents();
|
|
20
|
+
this.setupKeyboardShortcuts();
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
addMissingIds(menu) {
|
|
24
|
+
// Add missing ids to menu items that don't have an ID.
|
|
25
|
+
menu.content.forEach(item => {
|
|
26
|
+
if (!item.id) {
|
|
27
|
+
item.id = Math.random().toString(36).substring(2);
|
|
28
|
+
}
|
|
29
|
+
if (item.type === "dropdown") {
|
|
30
|
+
this.addMissingIds(item);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
bindEvents() {
|
|
35
|
+
this.menuEl = document.getElementById("fw-overview-menu");
|
|
36
|
+
this.listeners.onclick = event => this.onclick(event);
|
|
37
|
+
document.body.addEventListener("click", this.listeners.onclick);
|
|
38
|
+
this.listeners.oninput = event => this.oninput(event);
|
|
39
|
+
document.body.addEventListener("input", this.listeners.oninput);
|
|
40
|
+
this.listeners.onKeydown = event => this.onKeydown(event);
|
|
41
|
+
document.body.addEventListener("keydown", this.listeners.onKeydown);
|
|
42
|
+
this.listeners.onFocus = event => this.onFocus(event);
|
|
43
|
+
document.body.addEventListener("focus", this.listeners.onFocus, true);
|
|
44
|
+
this.update();
|
|
45
|
+
}
|
|
46
|
+
setupKeyboardShortcuts() {
|
|
47
|
+
// Map all keyboard shortcuts from the menu model
|
|
48
|
+
this.model.content.forEach(menuItem => {
|
|
49
|
+
if (menuItem.keys) {
|
|
50
|
+
this.keyboardShortcuts.set(menuItem.keys.toLowerCase(), menuItem);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
onKeydown(event) {
|
|
55
|
+
let name = keyName(event);
|
|
56
|
+
if (event.altKey) {
|
|
57
|
+
name = "alt-" + name.toLowerCase();
|
|
58
|
+
const menuItem = this.keyboardShortcuts.get(name);
|
|
59
|
+
if (menuItem) {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
event.stopPropagation();
|
|
62
|
+
event.stopImmediatePropagation();
|
|
63
|
+
if (menuItem.type === "search") {
|
|
64
|
+
const inputEl = document.getElementById(`${menuItem.id}-input`);
|
|
65
|
+
if (inputEl) {
|
|
66
|
+
inputEl.focus();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (menuItem.type === "dropdown") {
|
|
70
|
+
// Toggle dropdown menu
|
|
71
|
+
// If the menu is already open, close it
|
|
72
|
+
if (this.openedMenu === this.model.content.indexOf(menuItem)) {
|
|
73
|
+
menuItem.open = false;
|
|
74
|
+
this.openedMenu = false;
|
|
75
|
+
this.update();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (this.openedMenu !== false) {
|
|
79
|
+
this.model.content[this.openedMenu].open = false;
|
|
80
|
+
}
|
|
81
|
+
menuItem.open = true;
|
|
82
|
+
this.openedMenu = this.model.content.indexOf(menuItem);
|
|
83
|
+
this.update();
|
|
84
|
+
const firstDropdownItem = this.menuEl.querySelector(`.fw-pulldown-item.selected`);
|
|
85
|
+
if (firstDropdownItem) {
|
|
86
|
+
firstDropdownItem.focus();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (menuItem.action) {
|
|
91
|
+
menuItem.action(this.overview);
|
|
92
|
+
}
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Handle horizontal navigation between menu items
|
|
97
|
+
if (name === "ArrowLeft" || name === "ArrowRight") {
|
|
98
|
+
const menuItems = Array.from(this.menuEl.querySelectorAll("#fw-overview-menu > li"));
|
|
99
|
+
const focusedElement = document.activeElement;
|
|
100
|
+
const currentMenuItem = focusedElement.closest("li");
|
|
101
|
+
if (currentMenuItem) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
const currentIndex = menuItems.indexOf(currentMenuItem);
|
|
104
|
+
let newIndex;
|
|
105
|
+
if (name === "ArrowLeft") {
|
|
106
|
+
newIndex =
|
|
107
|
+
currentIndex > 0
|
|
108
|
+
? currentIndex - 1
|
|
109
|
+
: menuItems.length - 1;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
newIndex =
|
|
113
|
+
currentIndex < menuItems.length - 1
|
|
114
|
+
? currentIndex + 1
|
|
115
|
+
: 0;
|
|
116
|
+
}
|
|
117
|
+
const nextMenuItem = menuItems[newIndex].querySelector(".fw-dropdown-menu, .fw-text-menu, button, input");
|
|
118
|
+
if (nextMenuItem) {
|
|
119
|
+
nextMenuItem.focus();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Handle Enter and Space to open dropdown menus
|
|
125
|
+
if (name === "Enter" || name === " ") {
|
|
126
|
+
const focusedElement = document.activeElement;
|
|
127
|
+
if (focusedElement.matches(".fw-dropdown-menu")) {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
const menuItem = this.findMenuItemFromElement(focusedElement);
|
|
130
|
+
if (menuItem && menuItem.type === "dropdown") {
|
|
131
|
+
if (this.openedMenu !== false) {
|
|
132
|
+
this.model.content[this.openedMenu].open = false;
|
|
133
|
+
}
|
|
134
|
+
menuItem.open = true;
|
|
135
|
+
this.openedMenu = this.model.content.indexOf(menuItem);
|
|
136
|
+
menuItem.selectedIndex = 0;
|
|
137
|
+
this.update();
|
|
138
|
+
const firstDropdownItem = this.menuEl.querySelector(`.fw-pulldown-item.selected`);
|
|
139
|
+
if (firstDropdownItem) {
|
|
140
|
+
firstDropdownItem.focus();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (this.openedMenu !== false) {
|
|
147
|
+
const menuItem = this.model.content[this.openedMenu];
|
|
148
|
+
if (menuItem.type === "dropdown") {
|
|
149
|
+
if (name === "ArrowDown" || name === "ArrowUp") {
|
|
150
|
+
event.preventDefault();
|
|
151
|
+
event.stopPropagation();
|
|
152
|
+
// Find currently selected item
|
|
153
|
+
let selectedIndex = -1;
|
|
154
|
+
if (menuItem.selectedIndex !== undefined) {
|
|
155
|
+
selectedIndex = menuItem.selectedIndex;
|
|
156
|
+
}
|
|
157
|
+
// Calculate new index
|
|
158
|
+
if (name === "ArrowDown") {
|
|
159
|
+
selectedIndex =
|
|
160
|
+
selectedIndex < menuItem.content.length - 1
|
|
161
|
+
? selectedIndex + 1
|
|
162
|
+
: 0;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
selectedIndex -= 1;
|
|
166
|
+
if (selectedIndex < 0) {
|
|
167
|
+
// Close menu
|
|
168
|
+
menuItem.open = false;
|
|
169
|
+
this.openedMenu = false;
|
|
170
|
+
delete menuItem.selectedIndex;
|
|
171
|
+
this.update();
|
|
172
|
+
const dropdownButton = this.menuEl.querySelector(`#${menuItem.id}-button`);
|
|
173
|
+
if (dropdownButton) {
|
|
174
|
+
dropdownButton.focus();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
menuItem.selectedIndex = selectedIndex;
|
|
179
|
+
this.update();
|
|
180
|
+
const selectedEl = this.menuEl.querySelector(`.fw-pulldown-item.selected`);
|
|
181
|
+
if (selectedEl) {
|
|
182
|
+
selectedEl.focus();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else if (name === "Enter" || name === " ") {
|
|
186
|
+
event.preventDefault();
|
|
187
|
+
event.stopPropagation();
|
|
188
|
+
if (menuItem.selectedIndex !== undefined &&
|
|
189
|
+
menuItem.content[menuItem.selectedIndex]) {
|
|
190
|
+
const selectedItem = menuItem.content[menuItem.selectedIndex];
|
|
191
|
+
if (selectedItem.action) {
|
|
192
|
+
selectedItem.action(this.overview);
|
|
193
|
+
menuItem.open = false;
|
|
194
|
+
this.openedMenu = false;
|
|
195
|
+
delete menuItem.selectedIndex;
|
|
196
|
+
this.update();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else if (name === "Escape") {
|
|
201
|
+
event.preventDefault();
|
|
202
|
+
event.stopPropagation();
|
|
203
|
+
menuItem.open = false;
|
|
204
|
+
this.openedMenu = false;
|
|
205
|
+
delete menuItem.selectedIndex;
|
|
206
|
+
this.update();
|
|
207
|
+
const dropdownButton = document.getElementById(`${menuItem.id}-button`);
|
|
208
|
+
if (dropdownButton) {
|
|
209
|
+
dropdownButton.focus();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
onFocus(event) {
|
|
216
|
+
// Ignore if the focus event is triggered by JavaScript
|
|
217
|
+
if (event.isTrusted === false) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const target = event.target;
|
|
221
|
+
if (this.openedMenu !== false) {
|
|
222
|
+
if (target.matches("#fw-overview-menu li .fw-pulldown-item")) {
|
|
223
|
+
const menuItem = this.model.content[this.openedMenu];
|
|
224
|
+
if (menuItem) {
|
|
225
|
+
const itemNumber = Array.from(target.parentElement.parentElement.children).indexOf(target.parentElement);
|
|
226
|
+
menuItem.selectedIndex = itemNumber;
|
|
227
|
+
this.update();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Close dropdown menu if focus is outside of the dropdown
|
|
232
|
+
const menuItem = this.model.content[this.openedMenu];
|
|
233
|
+
if (menuItem) {
|
|
234
|
+
menuItem.open = false;
|
|
235
|
+
delete menuItem.selectedIndex;
|
|
236
|
+
this.openedMenu = false;
|
|
237
|
+
this.update();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
findMenuItemFromElement(element) {
|
|
243
|
+
const menuItem = element.closest("li");
|
|
244
|
+
if (!menuItem) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
let menuNumber = 0;
|
|
248
|
+
let seekItem = menuItem;
|
|
249
|
+
while (seekItem.previousElementSibling) {
|
|
250
|
+
menuNumber++;
|
|
251
|
+
seekItem = seekItem.previousElementSibling;
|
|
252
|
+
}
|
|
253
|
+
return this.model.content[menuNumber];
|
|
254
|
+
}
|
|
255
|
+
focusMenuItem(menuItem) {
|
|
256
|
+
const menuEl = this.menuEl.querySelector(`#${menuItem.id}`);
|
|
257
|
+
if (menuEl) {
|
|
258
|
+
menuEl.focus();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
oninput(event) {
|
|
262
|
+
const target = event.target;
|
|
263
|
+
if (target.matches("#fw-overview-menu > li > .fw-button > input")) {
|
|
264
|
+
// A text was entered in a top entry. we find which one.
|
|
265
|
+
let menuNumber = 0;
|
|
266
|
+
let seekItem = target.closest("li");
|
|
267
|
+
while (seekItem.previousElementSibling) {
|
|
268
|
+
menuNumber++;
|
|
269
|
+
seekItem = seekItem.previousElementSibling;
|
|
270
|
+
}
|
|
271
|
+
const menuItem = this.model.content[menuNumber];
|
|
272
|
+
if (menuItem.input) {
|
|
273
|
+
menuItem.input(this.overview, target.value);
|
|
274
|
+
target.focus();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
onclick(event) {
|
|
279
|
+
const target = event.target;
|
|
280
|
+
if (target.matches("#fw-overview-menu li li, #fw-overview-menu li li *")) {
|
|
281
|
+
event.preventDefault();
|
|
282
|
+
let itemNumber = 0;
|
|
283
|
+
let seekItem = target.closest("li");
|
|
284
|
+
while (seekItem.previousElementSibling) {
|
|
285
|
+
itemNumber++;
|
|
286
|
+
seekItem = seekItem.previousElementSibling;
|
|
287
|
+
}
|
|
288
|
+
let menuNumber = 0;
|
|
289
|
+
seekItem = seekItem.parentElement.parentElement.parentElement;
|
|
290
|
+
while (seekItem.previousElementSibling) {
|
|
291
|
+
menuNumber++;
|
|
292
|
+
seekItem = seekItem.previousElementSibling;
|
|
293
|
+
}
|
|
294
|
+
this.model.content[menuNumber].content[itemNumber].action(this.overview);
|
|
295
|
+
this.model.content[menuNumber].open = false;
|
|
296
|
+
if (this.model.content[menuNumber].type === "dropdown") {
|
|
297
|
+
this.model.content[menuNumber].title =
|
|
298
|
+
this.model.content[menuNumber].content[itemNumber].title;
|
|
299
|
+
this.openedMenu = false;
|
|
300
|
+
this.update();
|
|
301
|
+
}
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
else if (target.matches("#fw-overview-menu li .select-action input[type=checkbox]")) {
|
|
305
|
+
event.preventDefault();
|
|
306
|
+
event.stopImmediatePropagation();
|
|
307
|
+
event.stopPropagation();
|
|
308
|
+
// A toolbar dropdown menu item was clicked. We just need to
|
|
309
|
+
// find out which one
|
|
310
|
+
let menuNumber = 0;
|
|
311
|
+
let seekItem = target.closest("li");
|
|
312
|
+
while (seekItem.previousElementSibling) {
|
|
313
|
+
menuNumber++;
|
|
314
|
+
seekItem = seekItem.previousElementSibling;
|
|
315
|
+
}
|
|
316
|
+
const menuItem = this.model.content[menuNumber];
|
|
317
|
+
if (menuItem.checked === true) {
|
|
318
|
+
menuItem.checked = false;
|
|
319
|
+
menuItem.uncheckAction(this.overview);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
menuItem.checked = true;
|
|
323
|
+
menuItem.checkAction(this.overview);
|
|
324
|
+
}
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
else if (target.matches("#fw-overview-menu li, #fw-overview-menu li *")) {
|
|
328
|
+
// A toolbar dropdown menu item was clicked. We just need to
|
|
329
|
+
// find out which one
|
|
330
|
+
let menuNumber = 0;
|
|
331
|
+
let seekItem = target.closest("li");
|
|
332
|
+
while (seekItem.previousElementSibling) {
|
|
333
|
+
menuNumber++;
|
|
334
|
+
seekItem = seekItem.previousElementSibling;
|
|
335
|
+
}
|
|
336
|
+
const menuItem = this.model.content[menuNumber];
|
|
337
|
+
// if it is a dropdown menu, open it. Otherwise execute an
|
|
338
|
+
// associated action.
|
|
339
|
+
if (["dropdown", "select-action-dropdown"].includes(menuItem.type)) {
|
|
340
|
+
event.preventDefault();
|
|
341
|
+
if (this.openedMenu === menuNumber) {
|
|
342
|
+
this.model.content[this.openedMenu].open = false;
|
|
343
|
+
this.openedMenu = false;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
if (this.openedMenu !== false) {
|
|
347
|
+
this.model.content[this.openedMenu].open = false;
|
|
348
|
+
}
|
|
349
|
+
menuItem.open = true;
|
|
350
|
+
this.openedMenu = menuNumber;
|
|
351
|
+
}
|
|
352
|
+
this.update();
|
|
353
|
+
}
|
|
354
|
+
else if (menuItem.action) {
|
|
355
|
+
event.preventDefault();
|
|
356
|
+
menuItem.action(this.overview);
|
|
357
|
+
this.announceForScreenReader(gettext("Action completed"));
|
|
358
|
+
if (this.openedMenu !== false) {
|
|
359
|
+
this.model.content[this.openedMenu].open = false;
|
|
360
|
+
this.openedMenu = false;
|
|
361
|
+
}
|
|
362
|
+
this.update();
|
|
363
|
+
}
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
else if (this.openedMenu !== false) {
|
|
367
|
+
this.model.content[this.openedMenu].open = false;
|
|
368
|
+
this.openedMenu = false;
|
|
369
|
+
this.update();
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
update() {
|
|
373
|
+
if (!this.menuEl) {
|
|
374
|
+
// page has not yet been loaded. abort
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
const diff = this.dd.diff(this.menuEl, this.getMenuHTML());
|
|
378
|
+
this.dd.apply(this.menuEl, diff);
|
|
379
|
+
}
|
|
380
|
+
getMenuHTML() {
|
|
381
|
+
return `<ul id="fw-overview-menu">${this.model.content
|
|
382
|
+
.map(menuItem => `<li class="fw-overview-menu-item${menuItem.id ? ` ${menuItem.id}` : ""} ${menuItem.type}">${this.getMenuItemHTML(menuItem)}</li>`)
|
|
383
|
+
.join("")}</ul>`;
|
|
384
|
+
}
|
|
385
|
+
// Underline access keys
|
|
386
|
+
getAccessKeyHTML(title, accessKey) {
|
|
387
|
+
if (!accessKey) {
|
|
388
|
+
return escapeText(title);
|
|
389
|
+
}
|
|
390
|
+
const index = title.toLowerCase().indexOf(accessKey.toLowerCase());
|
|
391
|
+
if (index === -1) {
|
|
392
|
+
return escapeText(title);
|
|
393
|
+
}
|
|
394
|
+
return `${escapeText(title.substring(0, index))}<span class="access-key">${escapeText(title.charAt(index))}</span>${escapeText(title.substring(index + 1))}`;
|
|
395
|
+
}
|
|
396
|
+
getMenuItemHTML(menuItem) {
|
|
397
|
+
let returnValue;
|
|
398
|
+
switch (menuItem.type) {
|
|
399
|
+
case "dropdown":
|
|
400
|
+
returnValue = this.getDropdownHTML(menuItem);
|
|
401
|
+
break;
|
|
402
|
+
case "select-action-dropdown":
|
|
403
|
+
returnValue = this.getSelectionActionDropdownHTML(menuItem);
|
|
404
|
+
break;
|
|
405
|
+
case "text":
|
|
406
|
+
returnValue = this.getTextHTML(menuItem);
|
|
407
|
+
break;
|
|
408
|
+
case "button":
|
|
409
|
+
returnValue = this.getButtonHTML(menuItem);
|
|
410
|
+
break;
|
|
411
|
+
case "search":
|
|
412
|
+
returnValue = this.getSearchHTML(menuItem);
|
|
413
|
+
break;
|
|
414
|
+
default:
|
|
415
|
+
returnValue = "";
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
return returnValue;
|
|
419
|
+
}
|
|
420
|
+
getSelectionActionDropdownHTML(menuItem) {
|
|
421
|
+
return `
|
|
422
|
+
<div class="select-action fw-button fw-light fw-large">
|
|
423
|
+
<input type="checkbox" ${menuItem.checked ? "checked" : ""}>
|
|
424
|
+
<span class="select-action-dropdown"><i class="fa-solid fa-caret-down"></i></span>
|
|
425
|
+
</div>
|
|
426
|
+
${this.getDropdownListHTML(menuItem)}
|
|
427
|
+
`;
|
|
428
|
+
}
|
|
429
|
+
getDropdownHTML(menuItem) {
|
|
430
|
+
const accessKey = menuItem.keys?.split("-")[1];
|
|
431
|
+
return `
|
|
432
|
+
<div class="dropdown fw-dropdown-menu"
|
|
433
|
+
role="button"
|
|
434
|
+
aria-haspopup="true"
|
|
435
|
+
aria-expanded="${menuItem.open ? "true" : "false"}"
|
|
436
|
+
tabindex="0"
|
|
437
|
+
id="${menuItem.id}-button">
|
|
438
|
+
<label id="${menuItem.id}-label">
|
|
439
|
+
${this.getAccessKeyHTML(menuItem.title
|
|
440
|
+
? menuItem.title
|
|
441
|
+
: menuItem.content.length
|
|
442
|
+
? menuItem.content[0].title
|
|
443
|
+
: "", accessKey)}
|
|
444
|
+
</label>
|
|
445
|
+
<span class="dropdown" aria-hidden="true">
|
|
446
|
+
<i class="fa-solid fa-caret-down"></i>
|
|
447
|
+
</span>
|
|
448
|
+
</div>
|
|
449
|
+
${this.getDropdownListHTML(menuItem)}
|
|
450
|
+
`;
|
|
451
|
+
}
|
|
452
|
+
getDropdownListHTML(menuItem) {
|
|
453
|
+
if (menuItem.open) {
|
|
454
|
+
return `<div class="fw-pulldown fw-left"
|
|
455
|
+
role="menu"
|
|
456
|
+
style="display: block;"
|
|
457
|
+
aria-labelledby="${menuItem.id}-button"
|
|
458
|
+
>
|
|
459
|
+
<ul role="presentation">${menuItem.content
|
|
460
|
+
.map((menuOption, index) => this.getDropdownOptionHTML(menuOption, index))
|
|
461
|
+
.join("")}</ul></div>`;
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
return "";
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
getDropdownOptionHTML(menuOption, index) {
|
|
468
|
+
const menuItem = this.model.content[this.openedMenu];
|
|
469
|
+
const isSelected = menuItem.selectedIndex === index;
|
|
470
|
+
return `
|
|
471
|
+
<li role="none">
|
|
472
|
+
<span class="fw-pulldown-item${isSelected ? " selected" : ""}"
|
|
473
|
+
role="menuitem" tabindex="0">
|
|
474
|
+
${escapeText(menuOption.title)}
|
|
475
|
+
</span>
|
|
476
|
+
</li>
|
|
477
|
+
`;
|
|
478
|
+
}
|
|
479
|
+
getButtonHTML(menuItem) {
|
|
480
|
+
return `
|
|
481
|
+
<button class="fw-button fw-light fw-large"
|
|
482
|
+
title="${menuItem.title}"
|
|
483
|
+
tabindex="0"
|
|
484
|
+
role="menuitem">
|
|
485
|
+
${menuItem.title}
|
|
486
|
+
${menuItem.icon ? `<i class="fa-solid fa-${menuItem.icon}" aria-hidden="true"></i>` : ""}
|
|
487
|
+
</button>`;
|
|
488
|
+
}
|
|
489
|
+
announceForScreenReader(message) {
|
|
490
|
+
const announcement = document.createElement("div");
|
|
491
|
+
announcement.setAttribute("aria-live", "polite");
|
|
492
|
+
announcement.classList.add("sr-only"); // CSS to visually hide but keep available to screen readers
|
|
493
|
+
announcement.textContent = message;
|
|
494
|
+
document.body.appendChild(announcement);
|
|
495
|
+
setTimeout(() => announcement.remove(), 1000);
|
|
496
|
+
}
|
|
497
|
+
getTextHTML(menuItem) {
|
|
498
|
+
const accessKey = menuItem.keys?.split("-")[1];
|
|
499
|
+
return `
|
|
500
|
+
<button class="fw-text-menu"
|
|
501
|
+
title="${menuItem.title}${menuItem.keys ? ` (${menuItem.keys})` : ""}"
|
|
502
|
+
>
|
|
503
|
+
${this.getAccessKeyHTML(menuItem.title, accessKey)}
|
|
504
|
+
</button>`;
|
|
505
|
+
}
|
|
506
|
+
getSearchHTML(menuItem) {
|
|
507
|
+
const accessKey = menuItem.keys?.split("-")[1];
|
|
508
|
+
return `
|
|
509
|
+
<div class="fw-button fw-light fw-large disabled fw-search-field-container">
|
|
510
|
+
<label for="${menuItem.id}-input" class="fw-search-label">
|
|
511
|
+
${this.getAccessKeyHTML(menuItem.title, accessKey)}
|
|
512
|
+
</label>
|
|
513
|
+
<input type="search"
|
|
514
|
+
class="fw-search-field"
|
|
515
|
+
id="${menuItem.id}-input"
|
|
516
|
+
aria-description="${gettext("Type to search")}"
|
|
517
|
+
placeholder="${menuItem.title}"
|
|
518
|
+
aria-label="${menuItem.title}"
|
|
519
|
+
>
|
|
520
|
+
${menuItem.icon ? `<i class="fa-solid fa-${menuItem.icon}" aria-hidden="true"></i>` : ""}
|
|
521
|
+
</div>`;
|
|
522
|
+
}
|
|
523
|
+
destroy() {
|
|
524
|
+
// Remove all event listeners
|
|
525
|
+
document.body.removeEventListener("click", this.listeners.onclick);
|
|
526
|
+
document.body.removeEventListener("input", this.listeners.oninput);
|
|
527
|
+
document.body.removeEventListener("keydown", this.listeners.onKeydown);
|
|
528
|
+
document.body.removeEventListener("focus", this.listeners.onFocus);
|
|
529
|
+
// Clear references
|
|
530
|
+
this.listeners = {};
|
|
531
|
+
this.keyboardShortcuts.clear();
|
|
532
|
+
this.menuEl = null;
|
|
533
|
+
this.openedMenu = false;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=overview_menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview_menu.js","sourceRoot":"","sources":["../src/overview_menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,WAAW,KAAA,QAMvC;AAED,wBAAgB,WAAW,QAO1B"}
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
let _settings = null;
|
|
3
|
+
export function initSettings(rawSettings) {
|
|
4
|
+
if (_settings) {
|
|
5
|
+
throw new Error("Settings already initialized");
|
|
6
|
+
}
|
|
7
|
+
// Freeze to prevent accidental mutation at runtime
|
|
8
|
+
_settings = Object.freeze({ ...rawSettings });
|
|
9
|
+
}
|
|
10
|
+
export function getSettings() {
|
|
11
|
+
if (!_settings) {
|
|
12
|
+
throw new Error("App settings not initialized. Call initSettings() first.");
|
|
13
|
+
}
|
|
14
|
+
return _settings;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,IAAI,SAAS,GAAG,IAAI,CAAA;AAEpB,MAAM,UAAU,YAAY,CAAC,WAAW;IACpC,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACnD,CAAC;IACD,mDAAmD;IACnD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAC,GAAG,WAAW,EAAC,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW;IACvB,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACX,0DAA0D,CAC7D,CAAA;IACL,CAAC;IACD,OAAO,SAAS,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,GAAI;;;;;CAAkC,WAsC5D,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { avatarTemplate } from "./user.js";
|
|
3
|
+
import { filterPrimaryEmail } from "./user_util.js";
|
|
4
|
+
export const baseBodyTemplate = ({ user, contents, hasOverview, app }) => `
|
|
5
|
+
<div id="wait">
|
|
6
|
+
<i class="fa fa-spinner fa-pulse"></i>
|
|
7
|
+
</div>
|
|
8
|
+
<header class="fw-header" role="banner">
|
|
9
|
+
<div class="fw-container">
|
|
10
|
+
<a href="${app && app.routes[""].app === "document" ? "/" : "/documents/"}">
|
|
11
|
+
<h1 class="fw-logo">
|
|
12
|
+
<span class="fw-logo-text"></span>
|
|
13
|
+
<img src="${staticUrl("svg/icon.svg")}" alt="Logo" />
|
|
14
|
+
</h1>
|
|
15
|
+
</a>
|
|
16
|
+
<nav id="header-nav" role="navigation" aria-label="${gettext("Site navigation")}"></nav>
|
|
17
|
+
<div id="user-preferences" class="fw-user-preferences fw-header-text">
|
|
18
|
+
<div id="preferences-btn" class="fw-button">
|
|
19
|
+
${avatarTemplate({ user })}
|
|
20
|
+
</div>
|
|
21
|
+
<div id="user-preferences-pulldown" class="fw-pulldown fw-right">
|
|
22
|
+
<div data-value="profile">
|
|
23
|
+
<span class='fw-avatar-card'>
|
|
24
|
+
<span class='fw-avatar-card-avatar'>${avatarTemplate({ user })}</span>
|
|
25
|
+
<span class='fw-avatar-card-name'>
|
|
26
|
+
${user.username}
|
|
27
|
+
<span class='fw-avatar-card-email'>${filterPrimaryEmail(user.emails)}</span>
|
|
28
|
+
</span>
|
|
29
|
+
</span>
|
|
30
|
+
</div>
|
|
31
|
+
<div data-value="contacts">${gettext("Contacts")}</div>
|
|
32
|
+
<div data-value="logout">${gettext("Log out")}</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div><!-- end user preference -->
|
|
35
|
+
</div><!-- end container -->
|
|
36
|
+
</header>
|
|
37
|
+
<div class="fw-contents-outer">
|
|
38
|
+
${hasOverview ? '<div class="fw-overview-menu-wrapper"><ul id="fw-overview-menu"></ul></div>' : ""}
|
|
39
|
+
<div class="fw-contents">
|
|
40
|
+
${contents}
|
|
41
|
+
</div>
|
|
42
|
+
</div>`;
|
|
43
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAC,cAAc,EAAC,MAAM,WAAW,CAAA;AACxC,OAAO,EAAC,kBAAkB,EAAC,MAAM,gBAAgB,CAAA;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAC,EAAE,EAAE,CAAC;;;;;;mBAMrD,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa;;;4BAGrD,SAAS,CAAC,cAAc,CAAC;;;6DAGQ,OAAO,CAAC,iBAAiB,CAAC;;;kBAGrE,cAAc,CAAC,EAAC,IAAI,EAAC,CAAC;;;;;8DAKsB,cAAc,CAAC,EAAC,IAAI,EAAC,CAAC;;8BAEtD,IAAI,CAAC,QAAQ;iEACsB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;;;;6CAInD,OAAO,CAAC,UAAU,CAAC;2CACrB,OAAO,CAAC,SAAS,CAAC;;;;;;MAMvD,WAAW,CAAC,CAAC,CAAC,6EAA6E,CAAC,CAAC,CAAC,EAAE;;UAE5F,QAAQ;;OAEX,CAAA"}
|
package/dist/user.d.ts
ADDED