index.html 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="apple-mobile-web-app-capable" content="yes" />
  5. <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
  6. <meta charset="UTF-8">
  7. <meta name="theme-color" content="#4b75ff">
  8. <link rel="stylesheet" href="./script/lightpick/css/lightpick.css">
  9. <link rel="stylesheet" href="./script/bulma/bulma.css">
  10. <script src="../script/jquery.min.js"></script>
  11. <script src="../script/ao_module.js"></script>
  12. <script src="script/lightpick/moment.min.js"></script>
  13. <script src="script/lightpick/lightpick.js"></script>
  14. <link rel="icon" type="image/png" href="img/small_icon.png"/>
  15. <title>Memo</title>
  16. <style>
  17. body{
  18. background-color:white;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <nav class="navbar" role="navigation" aria-label="main navigation">
  24. <div class="navbar-brand">
  25. <a class="navbar-item" href="">
  26. <img src="img/logo.png" width="112" height="28">
  27. </a>
  28. </div>
  29. </nav>
  30. <div class="box">
  31. <button class="button is-warning" onclick="openMemoBox();">New Memo</button>
  32. <button class="button is-link is-light" onclick="listAllMemo();">Refresh</button>
  33. </div>
  34. <div id="memobox" class="box" style="display:none;">
  35. <h2 class="title is-4">New Memo</h2>
  36. <h4 class="subtitle is-6">Create a new Memo and try not to forget about it</h4>
  37. <hr>
  38. <div class="field">
  39. <label class="label">Title</label>
  40. <div class="control">
  41. <input class="input" id="title" type="text" placeholder="Title">
  42. </div>
  43. </div>
  44. <div class="field">
  45. <label class="label">Message</label>
  46. <div class="control">
  47. <textarea class="textarea" id="message" placeholder="Write some notes here!"></textarea>
  48. </div>
  49. </div>
  50. <div class="field">
  51. <label class="label">Deadline (Optional)</label>
  52. <div class="control">
  53. <input class="input" id="deadline" type="text" placeholder="Deadline">
  54. </div>
  55. </div>
  56. <div class="field is-grouped">
  57. <div class="control">
  58. <button class="button is-link" onclick="createNewMemo();">Submit</button>
  59. </div>
  60. <div class="control">
  61. <button class="button is-link is-light" onclick="cancelNewMemo();">Cancel</button>
  62. </div>
  63. </div>
  64. </div>
  65. <div id="memolist">
  66. </div>
  67. <script>
  68. let deadline = 0;
  69. let memoBuf = {};
  70. let removeMemoAfterSubmit = false;
  71. let currentEditingMemoID = 0;
  72. function openMemoBox(){
  73. deadline = 0;
  74. removeMemoAfterSubmit = false;
  75. $("#title").val("");
  76. $("#message").val("");
  77. $("#deadline").val("");
  78. $("#memobox").slideToggle("fast");
  79. }
  80. function cancelNewMemo(){
  81. $("#memobox").slideUp("fast");
  82. }
  83. var picker = new Lightpick({
  84. field: document.getElementById('deadline'),
  85. onSelect: function(date){
  86. console.log(date.unix());
  87. deadline = date.unix();
  88. }
  89. });
  90. function timestampToDateString(key){
  91. return new Date(parseInt(key)).toLocaleString(undefined, {year: 'numeric', month: '2-digit', day: '2-digit', weekday:"long", hour: '2-digit', hour12: false, minute:'2-digit', second:'2-digit'})
  92. }
  93. function listAllMemo(){
  94. $("#memolist").html("");
  95. memoBuf = {};
  96. ao_module_agirun("Memo/backend/listmemo.js", {}, function(data){
  97. let memos = [];
  98. for (var [key, value] of Object.entries(data)) {
  99. let content = JSON.parse(value);
  100. console.log(key, content);
  101. memoBuf[key] = content;
  102. memos.push([key, content]);
  103. }
  104. memos.reverse();
  105. memos.forEach(function(memo){
  106. let key = memo[0];
  107. let content = memo[1];
  108. let deadline = timestampToDateString(content.deadline * 1000);
  109. if (content.deadline == 0){
  110. deadline = "No Deadline";
  111. }
  112. $("#memolist").append(`<div class="card">
  113. <div class="card-content">
  114. <div class="media">
  115. <div class="media-left">
  116. <figure class="image is-48x48">
  117. <img src="img/small_icon.png">
  118. </figure>
  119. </div>
  120. <div class="media-content">
  121. <p class="title is-4">${content.title}</p>
  122. <p class="subtitle is-6">${deadline}</p>
  123. </div>
  124. </div>
  125. <div class="content">
  126. ${content.message}
  127. <br>
  128. <time>Creation Date: ${timestampToDateString(key)}</time>
  129. </div>
  130. </div>
  131. <footer class="card-footer">
  132. <a href="#" class="card-footer-item" memo="${key}" onclick="moveToTop(this)">Move to Top</a>
  133. <a href="#" class="card-footer-item" memo="${key}" onclick="editMemo(this);">Edit</a>
  134. <a href="#" class="card-footer-item" memo="${key}" onclick="removeMemoByButton(this);">Delete</a>
  135. </footer>
  136. </div><br>`);
  137. });
  138. })
  139. }
  140. listAllMemo();
  141. function editMemo(btn){
  142. let memoID = $(btn).attr("memo");
  143. loadMemoContentIntoNewMemoField(memoBuf[memoID]);
  144. $("#memobox").slideDown("fast");
  145. removeMemoAfterSubmit = true;
  146. currentEditingMemoID = memoID;
  147. }
  148. function loadMemoContentIntoNewMemoField(content){
  149. $("#title").val(content.title);
  150. $("#message").val(content.message);
  151. if (content.deadline > 0){
  152. $("#deadline").val(new Date(content.deadline * 1000).toLocaleDateString('en-US', {year: 'numeric', month: '2-digit', day: '2-digit'}));
  153. }
  154. deadline = content.deadline;
  155. }
  156. function moveToTop(btn){
  157. let memoID = $(btn).attr("memo");
  158. loadMemoContentIntoNewMemoField(memoBuf[memoID]);
  159. createNewMemo(function(){
  160. removeMemo(memoID);
  161. });
  162. }
  163. function removeMemoByButton(btn){
  164. let memoID = $(btn).attr("memo");
  165. removeMemo(memoID);
  166. }
  167. function removeMemo(memoID, callback){
  168. ao_module_agirun("Memo/backend/removeMemo.js", {
  169. "memoid": memoID
  170. }, function(data){
  171. console.log(data);
  172. listAllMemo();
  173. if (callback){
  174. callback();
  175. }
  176. });
  177. }
  178. function createNewMemo(callback=undefined){
  179. //Create AJAX request
  180. let payload = {
  181. "title": $("#title").val().replace(/<[^>]*>?/gm, ''),
  182. "message":$("#message").val().replace(/<[^>]*>?/gm, ''),
  183. "deadline": deadline
  184. }
  185. console.log(payload);
  186. ao_module_agirun("Memo/backend/addMemo.js", {
  187. "memo": JSON.stringify(payload)
  188. }, function(data){
  189. if (data.error == undefined){
  190. $("#memobox").slideUp("fast");
  191. }
  192. if (removeMemoAfterSubmit){
  193. removeMemoAfterSubmit = false;
  194. removeMemo(currentEditingMemoID, callback);
  195. currentEditingMemoID = 0;
  196. }else{
  197. if (callback){
  198. callback();
  199. }else{
  200. listAllMemo();
  201. }
  202. }
  203. })
  204. }
  205. </script>
  206. </body>
  207. </html>