blob: c89f1bdee9ffd3141ee7a320349cf7354c018fcb [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
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +02005import credits from './credits.json5';
6import i18nCredits from './i18n-credits.json5';
7
Adrià Vilanova Martíneza197d862022-05-27 17:33:20 +02008let sortable;
9
avm999634a2a5d52016-06-04 16:17:29 +020010function $(selector) {
avm999635a57c412020-12-27 00:26:45 +010011 return document.querySelector(selector);
avm999634a2a5d52016-06-04 16:17:29 +020012}
13
14function $all(selector) {
avm999635a57c412020-12-27 00:26:45 +010015 return document.querySelectorAll(selector);
avm999634a2a5d52016-06-04 16:17:29 +020016}
17
18function isEmpty(obj) {
avm999635a57c412020-12-27 00:26:45 +010019 return Object.keys(obj).length === 0;
avm999634a2a5d52016-06-04 16:17:29 +020020}
21
22function i18n() {
avm999635a57c412020-12-27 00:26:45 +010023 $all('[data-i18n]').forEach(el => {
24 el.innerHTML =
25 chrome.i18n.getMessage('options_' + el.getAttribute('data-i18n'));
26 });
avm999634a2a5d52016-06-04 16:17:29 +020027}
28
avm99963ce257a92020-12-27 00:07:13 +010029function printListModal() {
avm999635a57c412020-12-27 00:26:45 +010030 $('#select_language').textContent = '';
31 var heysortable = sortable.toArray();
avm999630f961162020-12-27 13:12:27 +010032 var languages = [];
33 for (var langCode of Object.keys(isoLangs)) {
34 var l = isoLangs[langCode];
35 l['code'] = langCode;
36 languages.push(l);
37 }
38
39 languages.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
40 languages.forEach(language => {
41 if (!inArray(language['code'], heysortable)) {
avm999635a57c412020-12-27 00:26:45 +010042 var el = document.createElement('option');
avm999630f961162020-12-27 13:12:27 +010043 el.setAttribute('value', language['code']);
44 el.textContent = language['name'] + ' (' + language['nativeName'] + ')';
avm999635a57c412020-12-27 00:26:45 +010045 $('#select_language').appendChild(el);
avm999634a2a5d52016-06-04 16:17:29 +020046 }
avm999630f961162020-12-27 13:12:27 +010047 });
avm999634a2a5d52016-06-04 16:17:29 +020048}
49
50function init() {
avm999635a57c412020-12-27 00:26:45 +010051 i18n();
52 chrome.storage.sync.get(null, items => {
53 // If no settings are set
54 if (isEmpty(items)) {
55 items = {
56 translateinto: {},
avm999638824b8a2021-01-10 18:25:12 +010057 uniquetab: 'popup',
avm999635a57c412020-12-27 00:26:45 +010058 };
59 chrome.storage.sync.set(items);
60 }
avm999634a2a5d52016-06-04 16:17:29 +020061
avm999635a57c412020-12-27 00:26:45 +010062 // Check the checkbox of the window opening
63 if (items.uniquetab === 'yep') $('#uniquetab').checked = true;
64 if (items.uniquetab === '') $('#varioustabs').checked = true;
avm999638824b8a2021-01-10 18:25:12 +010065 if (items.uniquetab === 'panel' || items.uniquetab === 'popup')
66 $('#popup').checked = true;
avm999634a2a5d52016-06-04 16:17:29 +020067
avm999635a57c412020-12-27 00:26:45 +010068 // Add event listeners for certain buttons and links
avm999635a57c412020-12-27 00:26:45 +010069 $('#save').addEventListener('click', _ => {
avm99963a0036412020-12-29 13:39:05 +010070 saveOptions(true);
71 });
72
73 // Save automatically
74 $all('input[type="radio"]').forEach(radio => {
75 radio.addEventListener('change', _ => {
76 saveOptions();
77 });
avm999635a57c412020-12-27 00:26:45 +010078 });
79
80 // Print selected language list
81 var languages = items.translateinto;
82
83 if (languages) {
84 for (var language_id of Object.keys(languages)) {
85 var language = languages[language_id];
86 var el = document.createElement('li');
87 el.setAttribute('data-language', language);
88 el.setAttribute('data-id', language);
89 el.innerHTML = isoLangs[language]['name'] + ' (' +
90 isoLangs[language]['nativeName'] + ')' +
91 '<span data-language=\'' + language +
92 '\' class=\'delete\'>x</span>';
93 $('#languages').appendChild(el);
94 $('#languages li[data-language=' + language + '] .delete')
95 .addEventListener('click', function() {
96 $('#languages')
97 .removeChild($(
98 'li[data-language=' + this.getAttribute('data-language') +
99 ']'));
100 printListModal();
avm99963a0036412020-12-29 13:39:05 +0100101 // Save automatically
102 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100103 });
104 }
105 }
106
107 // Initiate Sortable
108 sortable = new Sortable($('#languages'), {animation: 150});
109
110 // Handling The Dialog
111 $('#languages_add').addEventListener('click', _ => {
112 $('dialog#languages_add_dialog').showModal();
113 $('#select_language').focus();
114 });
115
116 $('#languages_add_cancel').addEventListener('click', _ => {
117 $('dialog#languages_add_dialog').close();
118 });
119
120 $('#languages_add_ok').addEventListener('click', _ => {
121 var el = document.createElement('li');
122 var language = $('#select_language').value;
123 if (inArray(language, sortable.toArray())) {
124 return;
125 }
126 el.setAttribute('data-language', language);
127 el.setAttribute('data-id', language);
128 el.innerHTML = isoLangs[language]['name'] + ' (' +
129 isoLangs[language]['nativeName'] + ')' +
130 '<span data-language=\'' + language + '\' class=\'delete\'>x</span>';
131 $('#languages').appendChild(el);
132 var selection = $('#select_language option[value=' + language + ']');
133 selection.parentNode.removeChild(selection);
134 $('#languages li[data-id=' + language + '] .delete')
135 .addEventListener('click', function() {
136 $('#languages')
137 .removeChild(
138 $('li[data-language=' + this.getAttribute('data-language') +
139 ']'));
140 printListModal();
avm99963a0036412020-12-29 13:39:05 +0100141 // Save automatically
142 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100143 });
144 $('dialog').close();
avm99963a0036412020-12-29 13:39:05 +0100145
146 // Save automatically
147 saveOptions();
avm999635a57c412020-12-27 00:26:45 +0100148 });
149
150 // About credits...
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200151 var content = $('dialog#credits_dialog .content_area');
152 credits.forEach(item => {
153 var div = document.createElement('div');
154 div.classList.add('entry');
155 if (item.url) {
156 var a = document.createElement('a');
157 a.classList.add('homepage');
158 a.href = item.url;
159 a.target = '_blank';
160 a.textContent = chrome.i18n.getMessage('options_credits_homepage');
161 div.append(a);
162 }
avm999639bbb3a42020-12-29 03:29:44 +0100163
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200164 var h4 = document.createElement('h4');
165 h4.textContent = item.name;
166 div.append(h4);
avm999635a57c412020-12-27 00:26:45 +0100167
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200168 if (item.author) {
169 var p = document.createElement('p');
170 p.classList.add('author');
171 p.textContent = chrome.i18n.getMessage('options_credits_by') + ' ' +
172 item.author + (item.license ? ' - ' + item.license : '');
173 div.append(p);
174 }
175 content.append(div);
176 });
avm999635a57c412020-12-27 00:26:45 +0100177
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200178 var cList = document.getElementById('translators');
179 i18nCredits.forEach(contributor => {
180 var li = document.createElement('li');
181 var languages = [];
182 if (contributor.languages) {
183 contributor.languages.forEach(lang => {
184 languages.push(lang.name || 'undefined');
185 });
186 }
avm999635a57c412020-12-27 00:26:45 +0100187
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200188 var name = document.createElement('span');
189 name.classList.add('name');
190 name.textContent = contributor.name || 'undefined';
191 li.append(name);
avm999639bbb3a42020-12-29 03:29:44 +0100192
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200193 if (languages.length > 0) {
194 var languages = document.createTextNode(': ' + languages.join(', '));
195 li.append(languages);
196 }
avm999639bbb3a42020-12-29 03:29:44 +0100197
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200198 cList.append(li);
199 });
avm999639bbb3a42020-12-29 03:29:44 +0100200
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200201 window.onhashchange = function() {
202 if (location.hash == '#credits') {
203 var credits = document.getElementById('credits_dialog');
204 credits.showModal();
205 credits.querySelector('.scrollable').scrollTo(0, 0);
206 $('#credits_ok').focus();
207 }
208 };
avm999639bbb3a42020-12-29 03:29:44 +0100209
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200210 if (location.hash == '#credits') {
211 $('dialog#credits_dialog').showModal();
212 $('#credits_ok').focus();
213 }
avm999635a57c412020-12-27 00:26:45 +0100214
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200215 $('#credits_ok').addEventListener('click', _ => {
216 $('dialog#credits_dialog').close();
217 });
218 $('dialog#credits_dialog').addEventListener('close', _ => {
219 history.pushState(
220 '', document.title,
221 window.location.pathname + window.location.search);
222 });
avm999635a57c412020-12-27 00:26:45 +0100223
Adrià Vilanova Martínez915e15a2022-05-27 19:14:25 +0200224 // Print language list in the modal dialog
225 printListModal();
avm999635a57c412020-12-27 00:26:45 +0100226 });
avm999634a2a5d52016-06-04 16:17:29 +0200227}
228
avm99963a0036412020-12-29 13:39:05 +0100229function saveOptions(close = false) {
avm999635a57c412020-12-27 00:26:45 +0100230 var languages = document.getElementById('languages');
231 var options = {
232 uniquetab: '',
233 translateinto: {},
234 };
avm999634a2a5d52016-06-04 16:17:29 +0200235
avm999635a57c412020-12-27 00:26:45 +0100236 options.uniquetab = radioSelected('uniquetab');
avm999634a2a5d52016-06-04 16:17:29 +0200237
avm999635a57c412020-12-27 00:26:45 +0100238 var selected_languages = sortable.toArray();
avm999634a2a5d52016-06-04 16:17:29 +0200239
avm999635a57c412020-12-27 00:26:45 +0100240 var i = 0;
241 for (var language_id in selected_languages) {
242 var language = selected_languages[language_id];
243 options.translateinto[i] = language;
244 i++;
245 }
avm999634a2a5d52016-06-04 16:17:29 +0200246
avm999635a57c412020-12-27 00:26:45 +0100247 chrome.storage.sync.set(options, function() {
248 var background = chrome.extension.getBackgroundPage();
avm999634a2a5d52016-06-04 16:17:29 +0200249
avm999635a57c412020-12-27 00:26:45 +0100250 background.translator_tab = false;
251 background.translator_window = false;
avm99963a0036412020-12-29 13:39:05 +0100252 if (close) window.close();
avm999635a57c412020-12-27 00:26:45 +0100253 });
avm999634a2a5d52016-06-04 16:17:29 +0200254}
255
avm99963ce257a92020-12-27 00:07:13 +0100256function radioSelected(a) {
avm999635a57c412020-12-27 00:26:45 +0100257 var elements = document.getElementsByName(a);
avm999634a2a5d52016-06-04 16:17:29 +0200258
avm999635a57c412020-12-27 00:26:45 +0100259 for (var i = 0; i < elements.length; i++)
260 if (elements[i].checked) return elements[i].value;
avm999634a2a5d52016-06-04 16:17:29 +0200261}
262
263function inArray(needle, haystack) {
avm999635a57c412020-12-27 00:26:45 +0100264 var length = haystack.length;
265 for (var i = 0; i < length; i++) {
266 if (haystack[i] == needle) return true;
267 }
268 return false;
avm999634a2a5d52016-06-04 16:17:29 +0200269}
270
271window.addEventListener('load', init);