prompt.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. const fs = require('fs');
  2. const {ipcRenderer} = require('electron');
  3. let promptId = null;
  4. let promptOptions = null;
  5. function promptError(error) {
  6. if (error instanceof Error) {
  7. error = error.message;
  8. }
  9. ipcRenderer.sendSync('prompt-error:' + promptId, error);
  10. }
  11. function promptCancel() {
  12. ipcRenderer.sendSync('prompt-post-data:' + promptId, null);
  13. }
  14. function promptSubmit() {
  15. const dataElement = document.querySelector('#data');
  16. let data = null;
  17. if (promptOptions.type === 'input') {
  18. data = dataElement.value;
  19. } else if (promptOptions.type === 'select') {
  20. if (promptOptions.selectMultiple) {
  21. data = dataElement.querySelectorAll('option[selected]').map(o => o.getAttribute('value'));
  22. } else {
  23. data = dataElement.value;
  24. }
  25. }
  26. ipcRenderer.sendSync('prompt-post-data:' + promptId, data);
  27. }
  28. function promptCreateInput() {
  29. const dataElement = document.createElement('input');
  30. dataElement.setAttribute('type', 'text');
  31. if (promptOptions.value) {
  32. dataElement.value = promptOptions.value;
  33. } else {
  34. dataElement.value = '';
  35. }
  36. if (promptOptions.inputAttrs && typeof (promptOptions.inputAttrs) === 'object') {
  37. for (const k in promptOptions.inputAttrs) {
  38. if (!Object.prototype.hasOwnProperty.call(promptOptions.inputAttrs, k)) {
  39. continue;
  40. }
  41. dataElement.setAttribute(k, promptOptions.inputAttrs[k]);
  42. }
  43. }
  44. dataElement.addEventListener('keyup', event => {
  45. if (event.key === 'Escape') {
  46. promptCancel();
  47. }
  48. });
  49. dataElement.addEventListener('keypress', event => {
  50. if (event.key === 'Enter') {
  51. event.preventDefault();
  52. document.querySelector('#ok').click();
  53. }
  54. });
  55. return dataElement;
  56. }
  57. function promptCreateSelect() {
  58. const dataElement = document.createElement('select');
  59. let optionElement;
  60. for (const k in promptOptions.selectOptions) {
  61. if (!Object.prototype.hasOwnProperty.call(promptOptions.selectOptions, k)) {
  62. continue;
  63. }
  64. optionElement = document.createElement('option');
  65. optionElement.setAttribute('value', k);
  66. optionElement.textContent = promptOptions.selectOptions[k];
  67. if (k === promptOptions.value) {
  68. optionElement.setAttribute('selected', 'selected');
  69. }
  70. dataElement.append(optionElement);
  71. }
  72. return dataElement;
  73. }
  74. function promptRegister() {
  75. promptId = document.location.hash.replace('#', '');
  76. try {
  77. promptOptions = JSON.parse(ipcRenderer.sendSync('prompt-get-options:' + promptId));
  78. } catch (error) {
  79. return promptError(error);
  80. }
  81. if (promptOptions.useHtmlLabel) {
  82. document.querySelector('#label').innerHTML = promptOptions.label;
  83. } else {
  84. document.querySelector('#label').textContent = promptOptions.label;
  85. }
  86. if (promptOptions.buttonLabels && promptOptions.buttonLabels.ok) {
  87. document.querySelector('#ok').textContent = promptOptions.buttonLabels.ok;
  88. }
  89. if (promptOptions.buttonLabels && promptOptions.buttonLabels.cancel) {
  90. document.querySelector('#cancel').textContent = promptOptions.buttonLabels.cancel;
  91. }
  92. try {
  93. if (promptOptions.customStylesheet) {
  94. const customStyleContent = fs.readFileSync(promptOptions.customStylesheet);
  95. if (customStyleContent) {
  96. const customStyle = document.createElement('style');
  97. customStyle.setAttribute('rel', 'stylesheet');
  98. customStyle.append(document.createTextNode(customStyleContent));
  99. document.head.append(customStyle);
  100. }
  101. }
  102. } catch (error) {
  103. return promptError(error);
  104. }
  105. document.querySelector('#form').addEventListener('submit', promptSubmit);
  106. document.querySelector('#cancel').addEventListener('click', promptCancel);
  107. const dataContainerElement = document.querySelector('#data-container');
  108. let dataElement;
  109. if (promptOptions.type === 'input') {
  110. dataElement = promptCreateInput();
  111. } else if (promptOptions.type === 'select') {
  112. dataElement = promptCreateSelect();
  113. } else {
  114. return promptError(`Unhandled input type '${promptOptions.type}'`);
  115. }
  116. dataContainerElement.append(dataElement);
  117. dataElement.setAttribute('id', 'data');
  118. dataElement.focus();
  119. if (promptOptions.type === 'input') {
  120. dataElement.select();
  121. }
  122. }
  123. window.addEventListener('error', error => {
  124. if (promptId) {
  125. promptError('An error has occured on the prompt window: \n' + error);
  126. }
  127. });
  128. document.addEventListener('DOMContentLoaded', promptRegister);