index.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. ts = {
  2. selected: null,
  3. numItems: 0
  4. };
  5. window.onload = (event) => {
  6. const searchInput = document.getElementById('search');
  7. const length = searchInput.value.length;
  8. searchInput.setSelectionRange(length, length);
  9. searchInput.addEventListener('keyup', (e) => {
  10. console.log("Key", e.key);
  11. if (e.key.length == 1 || e.key === 'Backspace') {
  12. console.log(searchInput.value);
  13. const encodedValue = encodeURIComponent(searchInput.value);
  14. fetch('/search?s=' + encodedValue).then(response => {
  15. clearResults();
  16. console.log(response);
  17. response.json().then(content => {
  18. console.log(content);
  19. for (const [i, element] of content.entries()) {
  20. addResult(element.title, element.extract, element.url, i);
  21. };
  22. ts.selected = null;
  23. ts.numItems = content.length;
  24. });
  25. });
  26. }
  27. });
  28. // Handle moving the selected item up and down
  29. document.addEventListener('keydown', (e) => {
  30. console.log("Key press", e);
  31. if (e.key == 'ArrowDown') {
  32. selectNextItem();
  33. e.preventDefault();
  34. } else if (e.key == 'ArrowUp') {
  35. selectPreviousItem();
  36. e.preventDefault();
  37. } else if (e.key == 'Enter') {
  38. // const form = document.getElementById('search-form');
  39. // form.submit();
  40. // event.preventDefault();
  41. }
  42. });
  43. // Handle pressing enter
  44. const form = document.getElementById('search-form');
  45. form.addEventListener("submit", event => {
  46. event.preventDefault();
  47. clickSelected();
  48. });
  49. searchInput.focus();
  50. };
  51. function selectNextItem() {
  52. if (ts.selected === null) {
  53. ts.selected = 0;
  54. } else if (ts.selected < ts.numItems -1) {
  55. ts.selected++;
  56. }
  57. updateSelected();
  58. }
  59. function clickSelected() {
  60. if (ts.selected !== null) {
  61. const selectedResult = document.getElementById(ts.selected.toString());
  62. selectedResult.click();
  63. }
  64. }
  65. function selectPreviousItem() {
  66. if (ts.selected === null) {
  67. return;
  68. } else if (ts.selected > 0) {
  69. ts.selected--;
  70. } else if (ts.selected == 0) {
  71. ts.selected = null;
  72. }
  73. updateSelected();
  74. }
  75. function updateSelected() {
  76. const results = document.querySelectorAll('.result');
  77. results.forEach(child => {
  78. child.classList.remove('selected');
  79. });
  80. if (ts.selected !== null) {
  81. const selectedResult = document.getElementById(ts.selected.toString());
  82. selectedResult.classList.add('selected');
  83. }
  84. }
  85. function clearResults() {
  86. const results = document.getElementById('results');
  87. results.innerHTML = '';
  88. }
  89. function addResult(title, extract, url, id) {
  90. const par = document.createElement("p");
  91. const titleText = createBoldedSpan(title);
  92. titleText.classList.add('title');
  93. const extractText = createBoldedSpan(extract);
  94. extractText.classList.add('extract');
  95. par.appendChild(titleText);
  96. separator = document.createTextNode(' - ')
  97. par.appendChild(separator);
  98. par.appendChild(extractText);
  99. const div = document.createElement("div");
  100. div.classList.add('result');
  101. div.id = id.toString();
  102. const urlPar = document.createElement("p");
  103. const urlText = document.createTextNode(url);
  104. urlPar.appendChild(urlText);
  105. urlPar.classList.add('url');
  106. div.appendChild(urlPar);
  107. div.appendChild(par);
  108. const link = document.createElement("a");
  109. link.appendChild(div);
  110. link.href = url;
  111. const results = document.getElementById('results');
  112. results.appendChild(link);
  113. }
  114. function createBoldedSpan(title) {
  115. span = document.createElement('span');
  116. title.forEach(element => {
  117. text = document.createTextNode(element.value);
  118. if (element.is_bold) {
  119. b = document.createElement('span');
  120. b.classList.add('term');
  121. b.appendChild(text);
  122. span.appendChild(b);
  123. } else {
  124. span.appendChild(text);
  125. }
  126. });
  127. return span;
  128. }