You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

notes_app.js 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. $(document).ready(function(){
  2. $("#addNoteDiv").on('click', function() {
  3. // Listener für den Plus Button zum hinzufügen von Note Forms.
  4. console.log("Add")
  5. createForm();
  6. })
  7. $('#allNotesDiv').on('click', 'button', async function() {
  8. // Listener für den Save Button zum speichern von Note Forms.
  9. console.log("Save")
  10. let buttonId = (this.id).split("_")[1];
  11. let type = (this.id).split("_")[0];
  12. try {
  13. if (type == 'saveNoteButton'){
  14. // Speichern einer neuen Note.
  15. await saveNoteObject(buttonId);
  16. } else if (type == 'editNoteButton'){
  17. // Editieren einer gespeicherten Note.
  18. await saveNoteObject(buttonId, true);
  19. }
  20. } catch(err){
  21. alert(err);
  22. }
  23. })
  24. $('#noteStorage').on('click', 'button', async function() {
  25. // Listener für den Delete Button zum Löschen einer Note aus dem Note Browser und Local Storage.
  26. console.log("Delete")
  27. let buttonId = (this.id).split("_")[1];
  28. try {
  29. await removeBrowserItem(buttonId);
  30. } catch(err) {
  31. alert(err);
  32. }
  33. })
  34. $("#refreshButton").on('click', async function() {
  35. // Listener für den Refresh Button zum aktualisieren der gespeicherten Notes.
  36. console.log("Refresh")
  37. createLoadingSign(id="", append="noteStorage");
  38. enableLoadingSign(id="");
  39. await sleep(2000);
  40. disableLoadingSign(id="");
  41. try {
  42. await refreshBrowser();
  43. } catch(err){
  44. alert(err);
  45. }
  46. })
  47. })
  48. let id=1;
  49. function createForm(){
  50. // DOM-Schnittstelle zur Erstellung einer NoteForm mit ID-Kennung.
  51. // Initialisiert die OnClick-Listener auf den Buttons der Form.
  52. id++;
  53. console.log("createForm() "+id)
  54. let wrapper = document.createElement("div");
  55. wrapper.setAttribute('id', "note"+id);
  56. wrapper.style.margin = '2.5px';
  57. let inputsWrapper = document.createElement("div");
  58. inputsWrapper.setAttribute('class', "noteDiv");
  59. let inputDiv = document.createElement("div");
  60. let input = document.createElement("input");
  61. let deleteButton = document.createElement('button');
  62. input.setAttribute('type', "text");
  63. input.setAttribute('name',"noteTitle");
  64. input.setAttribute('id', "inputTitle"+id);
  65. input.setAttribute('placeholder', "Enter title...");
  66. input.style.marginBottom='5px';
  67. deleteButton.style.marginLeft = '2px';
  68. deleteButton.innerHTML = "X";
  69. deleteButton.setAttribute('id', "deleteForm_" + id);
  70. deleteButton.setAttribute('onClick', "deleteForm(this.id)");
  71. deleteButton.setAttribute('class', "right");
  72. inputDiv.appendChild(input);
  73. inputDiv.appendChild(deleteButton);
  74. let textAreaDiv = document.createElement("div");
  75. let textarea = document.createElement("textarea");
  76. textarea.setAttribute('name',"noteText");
  77. textarea.setAttribute('id', "noteText"+id);
  78. textarea.setAttribute('placeholder', "Enter notes...");
  79. textarea.style.width='300px';
  80. textarea.style.height='150px';
  81. textarea.style.boxSizing='border-box';
  82. textAreaDiv.appendChild(textarea);
  83. let saveNoteButton = document.createElement("button");
  84. saveNoteButton.setAttribute('type',"button");
  85. saveNoteButton.setAttribute('id',"saveNoteButton_"+id);
  86. saveNoteButton.innerHTML = 'Save';
  87. inputsWrapper.appendChild(inputDiv);
  88. inputsWrapper.appendChild(textAreaDiv);
  89. inputsWrapper.appendChild(saveNoteButton);
  90. wrapper.appendChild(inputsWrapper);
  91. document.getElementById('allNotesDiv').appendChild(wrapper);
  92. }
  93. function deleteForm(idName){
  94. // Aktiviert durch OnClickListener auf dem X-Button innerhalb der Form zum Schließen/Löschen einer Form mit ID-Kennung.
  95. console.log("deleteForm() " + id);
  96. id = idName.split("_")[1];
  97. document.getElementById("note"+id).remove();
  98. }
  99. function createFormWithSavedContent(item, id){
  100. // DOM-Schnittstelle.
  101. // Holt eine gespeicherte Form aus dem Speicher und erstellt erneut eine Note Form mit alter ID-Kennung und initialisiert die OnClick-Listener auf den Buttons.
  102. console.log("createFormWithSavedContent() "+ id)
  103. let wrapper = document.createElement("div")
  104. wrapper.setAttribute('id', "note"+id)
  105. let inputsWrapper = document.createElement("div")
  106. inputsWrapper.setAttribute('class', "noteDiv");
  107. let inputDiv = document.createElement("div");
  108. let input = document.createElement("input");
  109. let deleteButton = document.createElement('button');
  110. input.setAttribute('type', "text");
  111. input.setAttribute('name',"noteTitle");
  112. input.setAttribute('id', "inputTitle"+id);
  113. input.setAttribute('value', item.title);
  114. input.style.marginBottom='5px';
  115. deleteButton.style.marginLeft = '2px';
  116. deleteButton.innerHTML = "X";
  117. deleteButton.setAttribute('id', "deleteForm_" + id);
  118. deleteButton.setAttribute('onClick', "deleteForm(this.id)");
  119. inputDiv.appendChild(input);
  120. inputDiv.appendChild(deleteButton);
  121. let textAreaDiv = document.createElement("div");
  122. let textarea = document.createElement("textarea");
  123. textarea.setAttribute('name',"noteText");
  124. textarea.setAttribute('id', "noteText"+id);
  125. textarea.setAttribute('value', item.text);
  126. textarea.innerHTML = item.text;
  127. textarea.style.width='300px';
  128. textarea.style.height='150px';
  129. textarea.style.boxSizing='border-box';
  130. textAreaDiv.appendChild(textarea);
  131. let editNoteButton = document.createElement("button");
  132. editNoteButton.setAttribute('type',"button");
  133. editNoteButton.setAttribute('id',"editNoteButton_"+id);
  134. editNoteButton.innerHTML = 'Save';
  135. inputsWrapper.appendChild(inputDiv);
  136. inputsWrapper.appendChild(textAreaDiv);
  137. inputsWrapper.appendChild(editNoteButton);
  138. wrapper.appendChild(inputsWrapper);
  139. document.getElementById('allNotesDiv').appendChild(wrapper);
  140. }
  141. let ctr;
  142. async function sleep(ms) {
  143. // Best Practice Variante zum pausieren von Code.
  144. // Soll hier Prozesse simulieren die bei synchronem Code zu I/O-Blocking führen würden.
  145. console.log("sleep() " + ms);
  146. try {
  147. return new Promise(resolve => setTimeout(resolve, ms));
  148. }
  149. catch (alert) {
  150. return alert(alert);
  151. }
  152. }
  153. async function saveNote(id){
  154. // Holt den Inhalt aus der gebindeten Note und speichert diesen als Objekt mit ID-Kennung im Local Storage.
  155. console.log("saveNote() " + id);
  156. return new Promise((resolve, reject) => {
  157. try {
  158. let noteTitle = document.getElementById('inputTitle' + id).value;
  159. let noteText = document.getElementById('noteText' + id).value;
  160. let noteObj = {
  161. idK: id,
  162. title: noteTitle,
  163. text: noteText
  164. };
  165. let noteObj_serialized = JSON.stringify(noteObj); // Stringify noteObj damit es im LocalStorage lesbar ist.
  166. localStorage.setItem("noteObj" + id, noteObj_serialized);
  167. resolve(noteObj);
  168. } catch(err) {
  169. reject(err);
  170. }
  171. });
  172. }
  173. async function refreshBrowser(){
  174. // Aktualisiert den Browserinhalt nach drücken des Refreshbuttons.
  175. // Holt sich zuerst ein Abbild des Local Storage und erstellt dann für jedes Element ein Item im Browser.
  176. console.log("refreshBrowser()");
  177. return new Promise((resolve, reject) => {
  178. try {
  179. let noteStorage = [];
  180. let keys = Object.keys(localStorage);
  181. let i = keys.length;
  182. while (i--) {
  183. noteStorage.push(localStorage.getItem(keys[i]));
  184. }
  185. let parentNode = document.getElementById('noteStorage');
  186. parentNode.innerHTML = '';
  187. noteStorage.forEach(element => {
  188. createBrowserItem(JSON.parse(element));
  189. });
  190. resolve();
  191. } catch(err) {
  192. reject(err);
  193. }
  194. });
  195. }
  196. async function saveNoteObject(id, overwrite=false){
  197. // Wird vom Save Button zum Speichern einer Note und Erstellung eines entsprechenden Browseritems aufgerufen.
  198. console.log("saveNoteObject() " + id + " " + overwrite);
  199. createLoadingSign(id, append="note")
  200. enableLoadingSign(id);
  201. await sleep(10000)
  202. disableLoadingSign(id);
  203. try {
  204. if (overwrite == true){
  205. await removeBrowserItem(id);
  206. }
  207. let obj = await saveNote(id);
  208. createBrowserItem(obj);
  209. } catch(err){
  210. alert(err)
  211. }
  212. document.getElementById("note"+id).remove();
  213. }
  214. function enableLoadingSign(id){
  215. console.log("enableLoadingSign() " + id);
  216. let target = 'loadSign'+id;
  217. document.getElementById(target).style.display = "block";
  218. }
  219. function disableLoadingSign(id){
  220. console.log("disableLoadingSign() " + id);
  221. let target = 'loadSign'+id;
  222. let sign = document.getElementById(target);
  223. sign.style.display = "none";
  224. sign.parentNode.removeChild(sign);
  225. }
  226. function createLoadingSign(id, append){
  227. console.log("createLoadingSign() " + id);
  228. let target = 'loadSign'+id;
  229. let appendTo = append+id;
  230. let loadingSign = document.createElement('div');
  231. let loadingSignWrapper = document.createElement('div');
  232. loadingSign.setAttribute('class', 'loader')
  233. loadingSign.setAttribute('id', target);
  234. loadingSignWrapper.appendChild(loadingSign);
  235. document.getElementById(appendTo).appendChild(loadingSignWrapper);
  236. }
  237. function createBrowserItem(item){
  238. // DOM-Schnittstelle zur Erstellung eines Browseritems.
  239. console.log("createBrowserItem() " + item);
  240. let wrapperDiv = document.createElement('div');
  241. let browserItem = document.createElement('div');
  242. let deleteButton = document.createElement('button');
  243. wrapperDiv.setAttribute('class', 'browserElement');
  244. browserItem.innerHTML = item.title;
  245. deleteButton.style.marginLeft = '2px';
  246. deleteButton.innerHTML = "X";
  247. browserItem.setAttribute('id', "browserItem_"+item.idK);
  248. browserItem.setAttribute('onClick', "getSavedNote(this.id)");
  249. deleteButton.setAttribute('id', "deleteItem_" + item.idK);
  250. wrapperDiv.appendChild(browserItem);
  251. wrapperDiv.appendChild(deleteButton);
  252. document.getElementById('noteStorage').appendChild(wrapperDiv);
  253. }
  254. async function removeBrowserItem(id){
  255. // DOM-Schnittstelle zum Löschen eines Browseritems.
  256. console.log("removeBrowserItem() " + id);
  257. return new Promise((resolve, reject) => {
  258. try {
  259. localStorage.removeItem('noteObj' + id);
  260. document.getElementById("browserItem_" + id).remove();
  261. document.getElementById("deleteItem_" + id).remove();
  262. resolve();
  263. } catch(err) {
  264. reject(err);
  265. }
  266. });
  267. }
  268. async function getItemFromStorage(idTmp){
  269. // Holt ein Note Objekt aus dem Local Storage.
  270. console.log("getItemFromStorage() " + idTmp);
  271. return new Promise((resolve, reject) => {
  272. try {
  273. let item = JSON.parse(localStorage.getItem('noteObj'+idTmp));
  274. resolve(item);
  275. } catch (err) {
  276. reject(err);
  277. }
  278. });
  279. }
  280. async function getSavedNote(id){
  281. // Wird durch den OnClick-Listener auf dem Browseritem aufgerufen.
  282. console.log("getSavedNote() "+ id);
  283. createLoadingSign("", "allNotesDiv");
  284. enableLoadingSign("");
  285. await sleep(5000);
  286. disableLoadingSign("");
  287. let idTmp = id.split("_")[1];
  288. try {
  289. let item = await getItemFromStorage(idTmp);
  290. createFormWithSavedContent(item, idTmp);
  291. } catch(err) {
  292. alert(err)
  293. }
  294. }