blob: 1d47da641127673ce1f285a23d4818266e3fbd9c [file] [log] [blame]
Adrià Vilanova Martíneza197d862022-05-27 17:33:20 +02001import Sortable from 'sortablejs/modular/sortable.core.esm.js';
2
3import {isoLangs} from '../common/consts.js';
4
5let sortable;
6
avm999634a2a5d52016-06-04 16:17:29 +02007function $(selector) {
avm999635a57c412020-12-27 00:26:45 +01008 return document.querySelector(selector);
avm999634a2a5d52016-06-04 16:17:29 +02009}
10
11function $all(selector) {
avm999635a57c412020-12-27 00:26:45 +010012 return document.querySelectorAll(selector);
avm999634a2a5d52016-06-04 16:17:29 +020013}
14
15function isEmpty(obj) {
avm999635a57c412020-12-27 00:26:45 +010016 return Object.keys(obj).length === 0;
avm999634a2a5d52016-06-04 16:17:29 +020017}
18
19function i18n() {
avm999635a57c412020-12-27 00:26:45 +010020 $all('[data-i18n]').forEach(el => {
21 el.innerHTML =
22 chrome.i18n.getMessage('options_' + el.getAttribute('data-i18n'));
23 });
avm999634a2a5d52016-06-04 16:17:29 +020024}
25
avm99963ce257a92020-12-27 00:07:13 +010026function printListModal() {
avm999635a57c412020-12-27 00:26:45 +010027 $('#select_language').textContent = '';
28 var heysortable = sortable.toArray();
avm999630f961162020-12-27 13:12:27 +010029 var languages = [];
30 for (var langCode of Object.keys(isoLangs)) {
31 var l = isoLangs[langCode];
32 l['code'] = langCode;
33 languages.push(l);
34 }
35
36 languages.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
37 languages.forEach(language => {
38 if (!inArray(language['code'], heysortable)) {
avm999635a57c412020-12-27 00:26:45 +010039 var el = document.createElement('option');
avm999630f961162020-12-27 13:12:27 +010040 el.setAttribute('value', language['code']);
41 el.textContent = language['name'] + ' (' + language['nativeName'] + ')';
avm999635a57c412020-12-27 00:26:45 +010042 $('#select_language').appendChild(el);
avm999634a2a5d52016-06-04 16:17:29 +020043 }
avm999630f961162020-12-27 13:12:27 +010044 });
avm999634a2a5d52016-06-04 16:17:29 +020045}
46
47function init() {
avm999635a57c412020-12-27 00:26:45 +010048 i18n();
49 chrome.storage.sync.get(null, items => {
50 // If no settings are set
51 if (isEmpty(items)) {
52 items = {
53 translateinto: {},
avm999638824b8a2021-01-10 18:25:12 +010054 uniquetab: 'popup',
avm999635a57c412020-12-27 00:26:45 +010055 };
56 chrome.storage.sync.set(items);
57 }
avm999634a2a5d52016-06-04 16:17:29 +020058
avm999635a57c412020-12-27 00:26:45 +010059 // Check the checkbox of the window opening
60 if (items.uniquetab === 'yep') $('#uniquetab').checked = true;
61 if (items.uniquetab === '') $('#varioustabs').checked = true;
avm999638824b8a2021-01-10 18:25:12 +010062 if (items.uniquetab === 'panel' || items.uniquetab === 'popup')
63 $('#popup').checked = true;
avm999634a2a5d52016-06-04 16:17:29 +020064
avm999635a57c412020-12-27 00:26:45 +010065 // Add event listeners for certain buttons and links
avm999635a57c412020-12-27 00:26:45 +010066 $('#save').addEventListener('click', _ => {
avm99963a0036412020-12-29 13:39:05 +010067 saveOptions(true);
68 });
69
70 // Save automatically
71 $all('input[type="radio"]').forEach(radio => {
72 radio.addEventListener('change', _ => {
73 saveOptions();
74 });
avm999635a57c412020-12-27 00:26:45 +010075 });
76
77 // Print selected language list
78 var languages = items.translateinto;
79
80 if (languages) {
81 for (var language_id of Object.keys(languages)) {
82 var language = languages[language_id];
83 var el = document.createElement('li');
84 el.setAttribute('data-language', language);
85 el.setAttribute('data-id', language);
86 el.innerHTML = isoLangs[language]['name'] + ' (' +
87 isoLangs[language]['nativeName'] + ')' +
88 '<span data-language=\'' + language +
89 '\' class=\'delete\'>x</span>';
90 $('#languages').appendChild(el);
91 $('#languages li[data-language=' + language + '] .delete')
92 .addEventListener('click', function() {
93 $('#languages')
94 .removeChild($(
95 'li[data-language=' + this.getAttribute('data-language') +
96 ']'));
97 printListModal();
avm99963a0036412020-12-29 13:39:05 +010098 // Save automatically
99 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100100 });
101 }
102 }
103
104 // Initiate Sortable
105 sortable = new Sortable($('#languages'), {animation: 150});
106
107 // Handling The Dialog
108 $('#languages_add').addEventListener('click', _ => {
109 $('dialog#languages_add_dialog').showModal();
110 $('#select_language').focus();
111 });
112
113 $('#languages_add_cancel').addEventListener('click', _ => {
114 $('dialog#languages_add_dialog').close();
115 });
116
117 $('#languages_add_ok').addEventListener('click', _ => {
118 var el = document.createElement('li');
119 var language = $('#select_language').value;
120 if (inArray(language, sortable.toArray())) {
121 return;
122 }
123 el.setAttribute('data-language', language);
124 el.setAttribute('data-id', language);
125 el.innerHTML = isoLangs[language]['name'] + ' (' +
126 isoLangs[language]['nativeName'] + ')' +
127 '<span data-language=\'' + language + '\' class=\'delete\'>x</span>';
128 $('#languages').appendChild(el);
129 var selection = $('#select_language option[value=' + language + ']');
130 selection.parentNode.removeChild(selection);
131 $('#languages li[data-id=' + language + '] .delete')
132 .addEventListener('click', function() {
133 $('#languages')
134 .removeChild(
135 $('li[data-language=' + this.getAttribute('data-language') +
136 ']'));
137 printListModal();
avm99963a0036412020-12-29 13:39:05 +0100138 // Save automatically
139 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100140 });
141 $('dialog').close();
avm99963a0036412020-12-29 13:39:05 +0100142
143 // Save automatically
144 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100145 });
146
147 // About credits...
avm999639bbb3a42020-12-29 03:29:44 +0100148 var normalCredits = fetch('json/credits.json').then(res => res.json());
149 var i18nCredits = fetch('json/i18n-credits.json').then(res => res.json());
150
151 Promise.all([normalCredits, i18nCredits])
152 .then(values => {
153 var credits = values[0];
154 var i18nCredits = values[1];
avm999635a57c412020-12-27 00:26:45 +0100155 var content = $('dialog#credits_dialog .content_area');
avm999639bbb3a42020-12-29 03:29:44 +0100156 credits.forEach(item => {
avm999635a57c412020-12-27 00:26:45 +0100157 var div = document.createElement('div');
avm999639bbb3a42020-12-29 03:29:44 +0100158 div.classList.add('entry');
avm999635a57c412020-12-27 00:26:45 +0100159 if (item.url) {
160 var a = document.createElement('a');
161 a.classList.add('homepage');
162 a.href = item.url;
163 a.target = '_blank';
164 a.textContent =
165 chrome.i18n.getMessage('options_credits_homepage');
166 div.append(a);
167 }
168
169 var h4 = document.createElement('h4');
170 h4.textContent = item.name;
171 div.append(h4);
172
173 if (item.author) {
174 var p = document.createElement('p');
175 p.classList.add('author');
176 p.textContent = chrome.i18n.getMessage('options_credits_by') +
177 ' ' + item.author +
178 (item.license ? ' - ' + item.license : '');
179 div.append(p);
180 }
181 content.append(div);
182 });
183
avm999639bbb3a42020-12-29 03:29:44 +0100184 var cList = document.getElementById('translators');
185 i18nCredits.forEach(contributor => {
186 var li = document.createElement('li');
187 var languages = [];
188 if (contributor.languages) {
189 contributor.languages.forEach(lang => {
190 languages.push(lang.name || 'undefined');
191 });
192 }
193
194 var name = document.createElement('span');
195 name.classList.add('name');
196 name.textContent = contributor.name || 'undefined';
197 li.append(name);
198
199 if (languages.length > 0) {
200 var languages =
201 document.createTextNode(': ' + languages.join(', '));
202 li.append(languages);
203 }
204
205 cList.append(li);
206 });
207
avm999635a57c412020-12-27 00:26:45 +0100208 window.onhashchange = function() {
209 if (location.hash == '#credits') {
avm999639bbb3a42020-12-29 03:29:44 +0100210 var credits = document.getElementById('credits_dialog');
211 credits.showModal();
212 credits.querySelector('.scrollable').scrollTo(0, 0);
avm999635a57c412020-12-27 00:26:45 +0100213 $('#credits_ok').focus();
214 }
215 };
216
217 if (location.hash == '#credits') {
218 $('dialog#credits_dialog').showModal();
219 $('#credits_ok').focus();
220 }
221
222 $('#credits_ok').addEventListener('click', _ => {
223 $('dialog#credits_dialog').close();
224 });
225 $('dialog#credits_dialog').addEventListener('close', _ => {
226 history.pushState(
227 '', document.title,
228 window.location.pathname + window.location.search);
229 });
230
231 // Print language list in the modal dialog
232 printListModal();
233 })
234 .catch(err => console.log(err));
235 });
avm999634a2a5d52016-06-04 16:17:29 +0200236}
237
avm99963a0036412020-12-29 13:39:05 +0100238function saveOptions(close = false) {
avm999635a57c412020-12-27 00:26:45 +0100239 var languages = document.getElementById('languages');
240 var options = {
241 uniquetab: '',
242 translateinto: {},
243 };
avm999634a2a5d52016-06-04 16:17:29 +0200244
avm999635a57c412020-12-27 00:26:45 +0100245 options.uniquetab = radioSelected('uniquetab');
avm999634a2a5d52016-06-04 16:17:29 +0200246
avm999635a57c412020-12-27 00:26:45 +0100247 var selected_languages = sortable.toArray();
avm999634a2a5d52016-06-04 16:17:29 +0200248
avm999635a57c412020-12-27 00:26:45 +0100249 var i = 0;
250 for (var language_id in selected_languages) {
251 var language = selected_languages[language_id];
252 options.translateinto[i] = language;
253 i++;
254 }
avm999634a2a5d52016-06-04 16:17:29 +0200255
avm999635a57c412020-12-27 00:26:45 +0100256 chrome.storage.sync.set(options, function() {
257 var background = chrome.extension.getBackgroundPage();
avm999634a2a5d52016-06-04 16:17:29 +0200258
avm999635a57c412020-12-27 00:26:45 +0100259 background.translator_tab = false;
260 background.translator_window = false;
avm99963a0036412020-12-29 13:39:05 +0100261 if (close) window.close();
avm999635a57c412020-12-27 00:26:45 +0100262 });
avm999634a2a5d52016-06-04 16:17:29 +0200263}
264
avm99963ce257a92020-12-27 00:07:13 +0100265function radioSelected(a) {
avm999635a57c412020-12-27 00:26:45 +0100266 var elements = document.getElementsByName(a);
avm999634a2a5d52016-06-04 16:17:29 +0200267
avm999635a57c412020-12-27 00:26:45 +0100268 for (var i = 0; i < elements.length; i++)
269 if (elements[i].checked) return elements[i].value;
avm999634a2a5d52016-06-04 16:17:29 +0200270}
271
272function inArray(needle, haystack) {
avm999635a57c412020-12-27 00:26:45 +0100273 var length = haystack.length;
274 for (var i = 0; i < length; i++) {
275 if (haystack[i] == needle) return true;
276 }
277 return false;
avm999634a2a5d52016-06-04 16:17:29 +0200278}
279
280window.addEventListener('load', init);