dev-mailbox.html 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vendure Development Inbox</title>
  6. <style>
  7. body {
  8. display: flex;
  9. flex-direction: column;
  10. height: 100vh;
  11. margin: 0;
  12. font-family: Helvetica, Arial, sans-serif;
  13. }
  14. .top-bar {
  15. padding: 12px;
  16. display: flex;
  17. align-items: center;
  18. background-color: #2a2929;
  19. color: #efefef;
  20. height: 60px;
  21. }
  22. .heading {
  23. margin: 0;
  24. font-size: 22px;
  25. }
  26. button#refresh {
  27. margin-left: 12px;
  28. border-radius: 3px;
  29. display: flex;
  30. align-items: center;
  31. }
  32. button#refresh .label {
  33. margin-left: 6px;
  34. }
  35. .generate-controls {
  36. flex: 1;
  37. display: flex;
  38. justify-content: flex-end;
  39. }
  40. input, select, button {
  41. padding: 6px;
  42. border-radius: 3px;
  43. border: 1px solid #0b384b;
  44. margin-left: 3px;
  45. }
  46. button {
  47. text-transform: uppercase;
  48. font-size: 12px;
  49. transition: background-color 0.2s;
  50. padding: 0 12px;
  51. height: 32px;
  52. }
  53. button:hover {
  54. background-color: #efefef;
  55. }
  56. #language-code {
  57. width: 32px;
  58. }
  59. .content {
  60. display: flex;
  61. flex: 1;
  62. height: calc(100% - 60px);
  63. }
  64. .list {
  65. width: 40vw;
  66. min-width: 300px;
  67. padding: 6px;
  68. overflow: auto;
  69. }
  70. .row {
  71. border-bottom: 1px dashed #ddd;
  72. padding: 12px 6px;
  73. cursor: pointer;
  74. transition: background-color 0.2s;
  75. }
  76. .row:hover {
  77. background-color: #efefef;
  78. }
  79. .meta {
  80. display: flex;
  81. justify-content: space-between;
  82. color: #666;
  83. }
  84. .detail {
  85. flex: 1;
  86. border: 1px solid #999;
  87. display: flex;
  88. flex-direction: column;
  89. }
  90. .detail iframe {
  91. height: 100%;
  92. border: 1px solid #eee;
  93. overflow: auto;
  94. }
  95. .metadata {
  96. margin: 6px;
  97. }
  98. </style>
  99. </head>
  100. <body>
  101. <div class="top-bar">
  102. <h1 class="heading">Vendure Dev Mailbox</h1>
  103. <div>
  104. <button id="refresh">
  105. <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 36 36" preserveAspectRatio="xMidYMid meet" focusable="false" aria-hidden="true" role="img" width="16" height="16" fill="currentColor"><path class="clr-i-outline clr-i-outline-path-1" d="M32.84,15.72a1,1,0,1,0-2,.29A13.15,13.15,0,0,1,31,17.94,13,13,0,0,1,8.7,27h5.36a1,1,0,0,0,0-2h-9v9a1,1,0,1,0,2,0V28.2A15,15,0,0,0,32.84,15.72Z"/><path class="clr-i-outline clr-i-outline-path-2" d="M30.06,1A1.05,1.05,0,0,0,29,2V7.83A14.94,14.94,0,0,0,3,17.94a15.16,15.16,0,0,0,.2,2.48,1,1,0,0,0,1,.84h.16a1,1,0,0,0,.82-1.15A13.23,13.23,0,0,1,5,17.94a13,13,0,0,1,13-13A12.87,12.87,0,0,1,27.44,9H22.06a1,1,0,0,0,0,2H31V2A1,1,0,0,0,30.06,1Z"/></svg>
  106. <span class="label">Refresh</span>
  107. </button>
  108. </div>
  109. <div class="generate-controls">
  110. <select id="type-selector"></select>
  111. <input id="language-code" value="en" type="text">
  112. <button id="generate-test">Generate test</button>
  113. </div>
  114. </div>
  115. <div class="content">
  116. <div class="list">
  117. </div>
  118. <div class="detail">
  119. </div>
  120. </div>
  121. <script>
  122. const refreshButton = document.querySelector('button#refresh');
  123. refreshButton.addEventListener('click', refreshInbox);
  124. const typeSelect = document.querySelector('#type-selector');
  125. fetch('./types')
  126. .then(res => res.json())
  127. .then(res => {
  128. res.forEach(type => {
  129. const option = document.createElement('option');
  130. option.value = type;
  131. option.text = type;
  132. typeSelect.appendChild(option);
  133. });
  134. });
  135. const languageCodeInput = document.querySelector('#language-code');
  136. const generateTestButton = document.querySelector('#generate-test');
  137. generateTestButton.addEventListener('click', e => {
  138. fetch(`./generate/${typeSelect.value}/${languageCodeInput.value}`)
  139. .then(() => new Promise(resolve => setTimeout(resolve, 500)))
  140. .then(() => refreshInbox());
  141. });
  142. const list = document.querySelector('.list');
  143. refreshInbox();
  144. function refreshInbox() {
  145. fetch('./list')
  146. .then(res => res.json())
  147. .then(res => renderList(res));
  148. }
  149. function renderList(items) {
  150. const list = document.querySelector('.list');
  151. list.innerHTML = '';
  152. const rows = items.forEach(item => {
  153. const row = document.createElement('div');
  154. row.classList.add('row');
  155. row.innerHTML = `
  156. <div class="meta">
  157. <div class="date">${item.date}</div>
  158. <div class="recipient">${item.recipient}</div>
  159. </div>
  160. <div class="subject">${item.subject}</div>`;
  161. row.addEventListener('click', (e) => {
  162. fetch('./item/' + item.fileName)
  163. .then(res => res.json())
  164. .then(res => renderEmail(res));
  165. });
  166. list.appendChild(row);
  167. });
  168. }
  169. function renderEmail(email) {
  170. const content = `
  171. <div class="metadata">
  172. <table>
  173. <tr>
  174. <td>Recipient:</td>
  175. <td>${email.recipient}</td>
  176. </tr>
  177. <tr>
  178. <td>Subject:</td>
  179. <td>${email.subject}</td>
  180. </tr>
  181. <tr>
  182. <td>Date:</td>
  183. <td>${new Date().toLocaleString()}</td>
  184. </tr>
  185. </table>
  186. </div>
  187. <iframe srcdoc="${email.body.replace(/"/g, '&quot;')}"></iframe>
  188. `;
  189. document.querySelector('.detail').innerHTML = content;
  190. }
  191. </script>
  192. </body>
  193. </html>