testrun.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /* document.addEventListener('DOMContentLoaded', () => {
  2. // set links
  3. document.querySelectorAll('.dropdown-item').forEach(link => {
  4. link.onclick = () => {
  5. // load item data to main
  6. load_item(link.dataset.type, link.dataset.id);
  7. return false;
  8. };
  9. });
  10. document.querySelectorAll('.collapse>.btn').forEach(link => {
  11. link.onclick = () => {
  12. // create item
  13. new_item(link.dataset.type)
  14. //document.querySelector('main').innerHTML = "Done!"
  15. };
  16. });
  17. });
  18. */
  19. // get item
  20. function load_item(item_type, item_id) {
  21. const request = new XMLHttpRequest();
  22. request.open('GET', `/${item_type}/${item_id}`);
  23. request.onload = () => {
  24. const response = request.responseText;
  25. document.querySelector('main').innerHTML = response;
  26. };
  27. request.send();
  28. }
  29. // create new item
  30. function new_item(item_type) {
  31. const request = new XMLHttpRequest();
  32. request.open('GET', `/${item_type}/new`);
  33. request.onload = () => {
  34. const response = request.responseText;
  35. document.querySelector('main').innerHTML = response;
  36. };
  37. request.send();
  38. }
  39. // edit item
  40. function edit_item(item_type, item_id) {
  41. const request = new XMLHttpRequest();
  42. request.open('GET', `/${item_type}/${item_id}/edit`);
  43. request.onload = () => {
  44. const response = request.responseText;
  45. document.querySelector('main').innerHTML = response;
  46. };
  47. request.send();
  48. }
  49. // delete item
  50. function set_delete_item(type_name, type, item_id) {
  51. /* set data in delete modal */
  52. document.querySelector('#deleteLabel').innerHTML = `Delete ${type_name} ID #${item_id}`;
  53. const btns = document.querySelector('#deleteButtons');
  54. btns.setAttribute('data-type', type);
  55. btns.setAttribute('data-id', item_id);
  56. }
  57. function delete_item(e, cascade) {
  58. /* delete item */
  59. const request = new XMLHttpRequest();
  60. if (cascade) {
  61. // cascade delete: POST request
  62. request.open('POST', `/${e.dataset['type']}/${e.dataset['id']}/delete`);
  63. } else {
  64. // single item delete: DELETE request
  65. request.open('DELETE', `/${e.dataset['type']}/${e.dataset['id']}/delete`);
  66. }
  67. request.onload = () => {
  68. window.location.reload(true);
  69. }
  70. request.send();
  71. }
  72. // select multiple with chips
  73. function add_chip(e, name) {
  74. // check if option exists
  75. const text = e.value;
  76. for (var i = 0; i < e.list.childElementCount; i++) {
  77. const opt_text = e.list.children[i].text.toUpperCase();
  78. if (text === e.list.children[i].text) {
  79. // create chip
  80. var chip_area = document.getElementById(`chips_${name}`);
  81. var new_chip = document.createElement('div');
  82. new_chip.setAttribute('class', 'chip mr-1');
  83. new_chip.setAttribute('data-id', i);
  84. new_chip.innerHTML = `
  85. <small>${e.list.children[i].text}</small>
  86. <span class="closebtn" onclick="delete_chip(this.parentElement, '${name}')">&times;</span>
  87. `;
  88. chip_area.appendChild(new_chip);
  89. // remove selected option from list
  90. e.value = null;
  91. e.list.children[i].disabled = true;
  92. }
  93. }
  94. }
  95. function delete_chip(e, name) {
  96. var list = document.getElementById(`${name}Opt`);
  97. list.children[e.dataset['id']].disabled = false;
  98. e.parentElement.removeChild(e);
  99. }
  100. function get_chips() {
  101. document.querySelectorAll('datalist').forEach(list => {
  102. // create multyselect field
  103. const name = list.id.substring(0, list.id.length - 3);
  104. const selector = document.getElementById(name);
  105. const chips_area = document.getElementById(`chips_${name}`);
  106. chips_area.querySelectorAll('div').forEach(chip => {
  107. value = chip.dataset['id'];
  108. selector.options[value].selected = true;
  109. });
  110. });
  111. return false;
  112. }
  113. function filter_options(e) {
  114. const text = e.value.toUpperCase();
  115. for (var i = 0; i < e.list.childElementCount; i++) {
  116. const opt_text = e.list.children[i].text.toUpperCase();
  117. if (!opt_text.includes(text)) {
  118. e.list.children[i].style.display = opt_text ? 'list-item' : 'none';
  119. }
  120. }
  121. }
  122. function filter_items(e) {
  123. const text = e.value.toUpperCase();
  124. document.querySelectorAll('.testrun-item').forEach(item => {
  125. var display = false;
  126. item.querySelectorAll('.filtered').forEach(property => {
  127. const value = property.innerHTML.toUpperCase();
  128. if (value.includes(text)) {
  129. display = true;
  130. }
  131. });
  132. item.style.display = display ? '' : 'none';
  133. });
  134. }
  135. function get_file(e) {
  136. // get filename
  137. const filename = e.files[0].name;
  138. const label = e.parentElement.querySelector('label');
  139. label.innerText = filename;
  140. }
  141. function set_export_id(item_id) {
  142. // set item_id in modal
  143. const btn = document.querySelector('#exportButton')
  144. btn.setAttribute('data-id', item_id);
  145. btn.style.display = '';
  146. // set modal body
  147. document.querySelector('#exportRequest').style.display = '';
  148. document.querySelector('#exportResponse').style.display = 'none';
  149. }
  150. function exportTestrun(e) {
  151. const request = new XMLHttpRequest();
  152. request.open('GET', `/testrun/xlsx/${e.dataset['id']}`);
  153. request.onload = () => {
  154. // get request
  155. const response = request.responseText;
  156. // set export modal body
  157. const exportResponse = document.querySelector('#exportResponse');
  158. exportResponse.innerHTML = response;
  159. exportResponse.style.display = '';
  160. document.querySelector('#exportRequest').style.display = 'none';
  161. document.querySelector('#exportButton').style.display = 'none';
  162. };
  163. request.send();
  164. }
  165. function set_update_item(item_id) {
  166. document.querySelector('#updateLabel').innerHTML = `Update Testrun ID #${item_id}`;
  167. document.querySelector('#updateForm').setAttribute('action', `/testrun/${item_id}/import`);
  168. }