Revision 4b59dced
Added by koszko about 2 years ago
html/import_frame.js | ||
---|---|---|
9 | 9 |
* IMPORTS_START |
10 | 10 |
* IMPORT get_remote_storage |
11 | 11 |
* IMPORT by_id |
12 |
* IMPORT get_template
|
|
12 |
* IMPORT clone_template
|
|
13 | 13 |
* IMPORT nice_name |
14 | 14 |
* IMPORT make_once |
15 | 15 |
* IMPORTS_END |
... | ... | |
17 | 17 |
|
18 | 18 |
let storage; |
19 | 19 |
|
20 |
const import_li_template = get_template("import_li"); |
|
21 |
import_li_template.removeAttribute("id"); |
|
22 |
|
|
23 |
function import_li_id(prefix, item) |
|
24 |
{ |
|
25 |
return `ili_${prefix}_${item}`; |
|
26 |
} |
|
27 |
|
|
28 |
let import_ul = by_id("import_ul"); |
|
20 |
let import_list = by_id("import_list"); |
|
29 | 21 |
let import_chbxs_colliding = undefined; |
22 |
let entry_objects = undefined; |
|
30 | 23 |
let settings_import_map = undefined; |
31 | 24 |
|
32 |
function add_import_li(prefix, name)
|
|
25 |
function add_import_entry(prefix, name)
|
|
33 | 26 |
{ |
34 |
let li = import_li_template.cloneNode(true); |
|
35 |
let name_span = li.firstElementChild; |
|
36 |
let chbx = name_span.nextElementSibling; |
|
37 |
let warning_span = chbx.nextElementSibling; |
|
27 |
const cloned_template = clone_template("import_entry"); |
|
28 |
Object.assign(cloned_template, {prefix, name}); |
|
38 | 29 |
|
39 |
li.setAttribute("data-prefix", prefix); |
|
40 |
li.setAttribute("data-name", name); |
|
41 |
li.id = import_li_id(prefix, name); |
|
42 |
name_span.textContent = nice_name(prefix, name); |
|
30 |
cloned_template.name_span.textContent = nice_name(prefix, name); |
|
43 | 31 |
|
44 | 32 |
if (storage.get(prefix, name) !== undefined) { |
45 |
import_chbxs_colliding.push(chbx); |
|
46 |
warning_span.textContent = "(will overwrite existing setting!)";
|
|
33 |
import_chbxs_colliding.push(cloned_template.chbx);
|
|
34 |
cloned_template.warning.textContent = "!";
|
|
47 | 35 |
} |
48 | 36 |
|
49 |
import_ul.appendChild(li); |
|
37 |
import_list.appendChild(cloned_template.entry); |
|
38 |
|
|
39 |
return cloned_template; |
|
50 | 40 |
} |
51 | 41 |
|
52 | 42 |
function check_all_imports() |
53 | 43 |
{ |
54 |
for (let li of import_ul.children)
|
|
55 |
li.firstElementChild.nextElementSibling.checked = true;
|
|
44 |
for (const entry_object of entry_objects)
|
|
45 |
entry_object.chbx.checked = true;
|
|
56 | 46 |
} |
57 | 47 |
|
58 | 48 |
function uncheck_all_imports() |
59 | 49 |
{ |
60 |
for (let li of import_ul.children)
|
|
61 |
li.firstElementChild.nextElementSibling.checked = false;
|
|
50 |
for (const entry_object of entry_objects)
|
|
51 |
entry_object.chbx.checked = false;
|
|
62 | 52 |
} |
63 | 53 |
|
64 | 54 |
function uncheck_colliding_imports() |
... | ... | |
69 | 59 |
|
70 | 60 |
function commit_import() |
71 | 61 |
{ |
72 |
for (let li of import_ul.children) { |
|
73 |
let chbx = li.firstElementChild.nextElementSibling; |
|
74 |
|
|
75 |
if (!chbx.checked) |
|
62 |
for (const entry_object of entry_objects) { |
|
63 |
if (!entry_object.chbx.checked) |
|
76 | 64 |
continue; |
77 | 65 |
|
78 |
let prefix = li.getAttribute("data-prefix"); |
|
79 |
let name = li.getAttribute("data-name"); |
|
80 |
let key = prefix + name; |
|
81 |
let value = settings_import_map.get(key); |
|
82 |
storage.set(prefix, name, value); |
|
66 |
const key = entry_object.prefix + entry_object.name; |
|
67 |
const value = settings_import_map.get(key); |
|
68 |
storage.set(entry_object.prefix, entry_object.name, value); |
|
83 | 69 |
} |
84 | 70 |
|
85 | 71 |
deactivate(); |
... | ... | |
106 | 92 |
} |
107 | 93 |
|
108 | 94 |
const import_selection_radio = by_id("import_selection_radio"); |
95 |
const existing_settings_note = by_id("existing_settings_note"); |
|
109 | 96 |
|
110 | 97 |
function show_selection(settings) |
111 | 98 |
{ |
112 | 99 |
import_selection_radio.checked = true; |
113 | 100 |
|
114 |
let old_children = import_ul.children;
|
|
101 |
let old_children = import_list.children;
|
|
115 | 102 |
while (old_children[0] !== undefined) |
116 |
import_ul.removeChild(old_children[0]);
|
|
103 |
import_list.removeChild(old_children[0]);
|
|
117 | 104 |
|
118 | 105 |
import_chbxs_colliding = []; |
106 |
entry_objects = []; |
|
119 | 107 |
settings_import_map = new Map(); |
120 | 108 |
|
121 | 109 |
for (let setting of settings) { |
122 | 110 |
let [key, value] = Object.entries(setting)[0]; |
123 | 111 |
let prefix = key[0]; |
124 | 112 |
let name = key.substring(1); |
125 |
add_import_li(prefix, name);
|
|
113 |
entry_objects.push(add_import_entry(prefix, name));
|
|
126 | 114 |
settings_import_map.set(key, value); |
127 | 115 |
} |
116 |
|
|
117 |
const op = import_chbxs_colliding.length > 0 ? "remove" : "add"; |
|
118 |
existing_settings_note.classList[op]("hide"); |
|
128 | 119 |
} |
129 | 120 |
|
130 | 121 |
function deactivate() |
131 | 122 |
{ |
132 | 123 |
/* Let GC free some memory */ |
133 | 124 |
import_chbxs_colliding = undefined; |
125 |
entry_objects = undefined; |
|
134 | 126 |
settings_import_map = undefined; |
135 | 127 |
|
136 | 128 |
if (exports.onclose) |
137 | 129 |
exports.onclose(); |
138 | 130 |
} |
139 | 131 |
|
140 |
const exports = {show_loading, show_error, show_selection, deactivate}; |
|
132 |
const wrapper = by_id("import_table_wrapper"); |
|
133 |
const style_table = (...cls) => cls.forEach(c => wrapper.classList.add(c)); |
|
134 |
|
|
135 |
const exports = |
|
136 |
{show_loading, show_error, show_selection, deactivate, style_table}; |
|
141 | 137 |
|
142 | 138 |
async function init() |
143 | 139 |
{ |
Also available in: Unified diff
add styling to settings install(import) dialog