ss.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. var fb_btn = document.getElementById('feedback_btn_cont');
  2. var fb_active = fb_btn != undefined;
  3. // URL parameters
  4. var qd = {};
  5. if (location.search) location.search.substr(1).split("&").forEach(function(item) {
  6. var s = item.split("="),
  7. k = s[0],
  8. v = s[1] && decodeURIComponent(s[1]);
  9. (qd[k] = qd[k] || []).push(v)
  10. })
  11. document.getElementById('lang').addEventListener('change',(event)=>{
  12. let lang = document.getElementById("lang").value;
  13. fetch('/options/' + lang)
  14. .then(response=>response.json())
  15. .then((data) => {
  16. document.getElementById("options").replaceChildren();
  17. if (data.length > 0) {
  18. let hdr = document.createElement("h3");
  19. hdr.innerText = "Language options";
  20. document.getElementById("options").append(hdr);
  21. }
  22. data.forEach((opt)=>{
  23. let fset = document.createElement("fieldset");
  24. fset.setAttribute("class", "float-left");
  25. let label = document.createElement("label");
  26. label.setAttribute("for", opt.id);
  27. label.append(opt.label);
  28. var input;
  29. if (opt.type == "list") {
  30. input = document.createElement("select");
  31. opt.options.forEach((sel) => {
  32. let option = document.createElement("option");
  33. option.append(sel.label);
  34. option.value = sel.id;
  35. if (option.value == opt.default) {
  36. option.selected = true;
  37. };
  38. input.append(option);
  39. })
  40. } else if (opt.type == "boolean") {
  41. // Use checkbox for boolean type.
  42. input = document.createElement("input");
  43. input.setAttribute("type", "checkbox");
  44. if (opt.default) {
  45. input.setAttribute("checked", 1);
  46. }
  47. } else {
  48. // Use text for all other types.
  49. input = document.createElement("input");
  50. input.value = opt.default;
  51. }
  52. input.setAttribute("id", opt.id);
  53. input.setAttribute("name", opt.id);
  54. input.classList.add("option_i");
  55. let descr = document.createElement("p");
  56. descr.setAttribute("class", "input_descr");
  57. descr.append(opt.description);
  58. fset.append(label, descr, input);
  59. document.getElementById("options").append(fset);
  60. });
  61. });
  62. event.preventDefault();
  63. return false;
  64. })
  65. // Change language select menu based on query string
  66. var nav_lang = qd["lang"]
  67. if (nav_lang != undefined) {
  68. var lang_sel = document.getElementById("lang");
  69. Array.from(lang_sel.options).every(item => {
  70. if (item.value == nav_lang) {
  71. lang_sel.value = nav_lang;
  72. return false;
  73. }
  74. return true;
  75. })
  76. }
  77. // Trigger the change event to process lang options.
  78. document.getElementById('lang').dispatchEvent(new Event('change'));
  79. // Change transliteration direction option based on query string.
  80. const t_dir = qd["dir"];
  81. const opt_s2r = document.getElementById("opt_s2r");
  82. const opt_r2s = document.getElementById("opt_r2s");
  83. if (t_dir == "r2s") {
  84. opt_r2s.setAttribute("checked", "");
  85. opt_s2r.removeAttribute("checked");
  86. } else if (t_dir != undefined) {
  87. opt_s2r.setAttribute("checked", "");
  88. opt_r2s.removeAttribute("checked");
  89. }
  90. document.getElementById('transliterate').addEventListener('submit',(event)=>{
  91. if (fb_active) {
  92. document.getElementById('feedback_cont').classList.add("hidden");
  93. }
  94. document.getElementById('loader_results').classList.remove("hidden");
  95. let t_dir = Array.from(document.getElementsByName("t_dir")).find(r => r.checked).value;
  96. let capitalize = Array.from(document.getElementsByName("capitalize")).find(r => r.checked).value;
  97. const data = {
  98. 'text': document.getElementById('text').value,
  99. 'lang': document.getElementById('lang').value,
  100. 't_dir': t_dir,
  101. 'capitalize': capitalize,
  102. 'options': {}
  103. }
  104. let option_inputs = document.getElementsByClassName("option_i");
  105. for (i = 0; i < option_inputs.length; i++) {
  106. let el = option_inputs[i];
  107. if (el.type == "checkbox") {
  108. data['options'][el.id] = el.checked;
  109. } else {
  110. data['options'][el.id] = el.value;
  111. }
  112. };
  113. fetch('/trans', {
  114. method: 'post',
  115. body: JSON.stringify(data),
  116. headers: {"Content-Type": "application/json"}
  117. })
  118. .then(response=>response.json())
  119. .then((results)=>{
  120. document.getElementById('warnings-toggle').classList.add("hidden");
  121. document.getElementById('loader_results').classList.add("hidden");
  122. document.getElementById('results').innerText = results.output
  123. if (fb_active) {
  124. fb_btn.classList.remove("hidden");
  125. }
  126. if (results.warnings && results.warnings.length>0){
  127. document.getElementById('warnings-toggle').classList.remove("hidden");
  128. document.getElementById('warnings').innerText = "WARNING:\n" + results.warnings.join("\n")
  129. }
  130. }).catch((error) => {
  131. alert("Error:\n" + error)
  132. });
  133. event.preventDefault()
  134. return false
  135. })
  136. if (fb_active) {
  137. document.getElementById('feedback_btn').addEventListener('click',(event)=>{
  138. document.getElementById('lang_fb_input').value = document.getElementById('lang').value;
  139. document.getElementById('src_fb_input').value = document.getElementById('text').value;
  140. document.getElementById('t_dir_fb_input').value = Array.from(
  141. document.getElementsByName("t_dir")
  142. ).find(r => r.checked).value;
  143. document.getElementById('result_fb_input').value = document.getElementById('results').innerText;
  144. document.getElementById('expected_fb_input').value = "";
  145. document.getElementById('notes_fb_input').value = "";
  146. document.getElementById('options_fb_input').value = ""; // TODO
  147. document.getElementById('feedback_cont').classList.remove("hidden");
  148. location.href = "#";
  149. location.href = "#feedback_cont";
  150. })
  151. document.getElementById('feedback_form').addEventListener('submit',(event)=>{
  152. const data = {
  153. 'lang': document.getElementById('lang_fb_input').value,
  154. 'src': document.getElementById('src_fb_input').value,
  155. 't_dir': document.getElementById('t_dir_fb_input').value,
  156. 'result': document.getElementById('result_fb_input').value,
  157. 'expected': document.getElementById('expected_fb_input').value,
  158. 'contact': document.getElementById('contact_fb_input').value,
  159. 'notes': document.getElementById('notes_fb_input').value,
  160. 'options': {}
  161. };
  162. let option_inputs = document.getElementsByClassName("option_i");
  163. for (i = 0; i < option_inputs.length; i++) {
  164. let el = option_inputs[i];
  165. data['options'][el.getAttribute('id')] = el.value;
  166. };
  167. fetch('/feedback', {
  168. method: 'post',
  169. body: JSON.stringify(data),
  170. headers: {"Content-Type": "application/json"}
  171. })
  172. .then(response=>response.json())
  173. .then((results)=>{
  174. alert(
  175. "Thanks for your feedback. You should receive an email with "
  176. + "a copy of your submission."
  177. );
  178. document.getElementById('feedback_cont').classList.add("hidden");
  179. document.getElementById('feedback_form').reset();
  180. location.href = "#";
  181. })
  182. event.preventDefault();
  183. return false;
  184. })
  185. document.getElementById('cancel_fb_btn').addEventListener('click',(event)=>{
  186. document.getElementById('feedback_cont').classList.add("hidden");
  187. document.getElementById('feedback_form').reset();
  188. location.href = "#";
  189. event.preventDefault();
  190. return false;
  191. })
  192. }