index.html 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  5. <link type="text/css" rel="stylesheet" href="css/material-icons.css" />
  6. <link type="text/css" rel="stylesheet" href="css/materialize.min.css" media="screen,projection"/>
  7. <link type="text/css" rel="stylesheet" href="css/style.min.css" media="screen,projection"/>
  8. <link rel="stylesheet" type="text/css" href="css/google-code-prettify/desert.css">
  9. <title>Titre</title>
  10. </head>
  11. <body class="grey lighten-4">
  12. <!-- Navbar -->
  13. <div id="navbar" class="navbar-fixed hide">
  14. <nav>
  15. <div class="nav-wrapper">
  16. <span class="brand-logo mleft-1">Note de <span data-bind="username"></span></span>
  17. <ul class="right hide-on-med-and-down">
  18. <li><a href="https://www.electronjs.org" target="_blank">Electron JS</a></li>
  19. <li><a href="https://gitlab.univ-artois.fr/arthur_brandao/conf-electron" target="_blank">Git Repository</a></li>
  20. </ul>
  21. </div>
  22. </nav>
  23. </div>
  24. <!-- Main content -->
  25. <main>
  26. <div class="container">
  27. <div class="row">
  28. <div class="col s12 center-align">
  29. Bonjour
  30. <div class="input-field inline">
  31. <input type="text" data-model="username" onblur="saveUserName(this)">
  32. </div>
  33. </div>
  34. </div>
  35. <div class="row" data-loop="card">
  36. <div class="col s12 m6 l4">
  37. <div class="card">
  38. <div class="card-content zoom-in selectable" onclick="selectCard(this)">
  39. <span class="hide" data-val="id"></span>
  40. <span class="card-title" data-val="title"></span>
  41. </div>
  42. <div class="card-action">
  43. <a href="#">Modifier</a>
  44. <a href="#" onclick="deleteCard(this, true)">Supprimer</a>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. </main>
  51. <!-- Modal Structure -->
  52. <div class="modal">
  53. <div class="modal-content">
  54. <h4 id="modal-title"></h4>
  55. <div id="modal-content"></div>
  56. </div>
  57. <div class="modal-footer">
  58. <a href="#!" class="waves-effect waves-green btn-flat">Modifier</a>
  59. <span id="modal-delete" class="modal-close waves-effect waves-green btn-flat" onclick="deleteCard(this, false)">Supprimer</span>
  60. <span class="modal-close waves-effect waves-green btn-flat">Fermer</span>
  61. </div>
  62. </div>
  63. <!-- Add button -->
  64. <div class="fixed-action-btn">
  65. <a id="float-add-btn" class="btn-floating btn-large waves-effect waves-light red hide">
  66. <i class="large material-icons">add</i>
  67. </a>
  68. </div>
  69. <!-- Discovery -->
  70. <div class="tap-target" data-target="float-add-btn">
  71. <div class="tap-target-content">
  72. <h5>Ajouter une note</h5>
  73. <p>Pour ajouter une note il suffit de cliquer sur ce bouton<br>(cliquez pour faire disparaitre)</p>
  74. </div>
  75. </div>
  76. <!-- Loader -->
  77. <div id="page-loader" class="bg-loader grey darken-4">
  78. <div class="loader progress">
  79. <div class="indeterminate"></div>
  80. </div>
  81. </div>
  82. <script type="text/javascript" src="../node_modules/jquery/dist/jquery.min.js"></script>
  83. <script type="text/javascript" src="../node_modules/marked/marked.min.js"></script>
  84. <script type="text/javascript" src="../node_modules/dompurify/dist/purify.min.js"></script>
  85. <script type="text/javascript" src="js/materialize.min.js"></script>
  86. <script type="text/javascript" src="js/google-code-prettify/prettify.js"></script>
  87. <script type="text/javascript" src="js/script.js"></script>
  88. <script type="text/javascript" src="js/binder.js"></script>
  89. <script type="text/javascript">
  90. var scope;
  91. var modal;
  92. //When wep page is ready
  93. $(document).ready(() => {
  94. // Load data from server
  95. loadData(true).then((data) => {
  96. // Get username
  97. const username = getCookie('username');
  98. // Set up data and print
  99. scope = binder({
  100. card: data
  101. });
  102. scope.username = username ? username : 'Utilisateur';
  103. printContent(scope);
  104. // Show page
  105. setTimeout(() => {
  106. pageLoader(false);
  107. //Show discovery the first time
  108. if (!getCookie('discovery')) {
  109. // Load discovery
  110. const discovery = M.TapTarget.init(document.querySelectorAll('.tap-target'), {onClose: () => {
  111. document.cookie = "discovery=closed";
  112. }})[0];
  113. setTimeout(() => {discovery.open();}, 500);
  114. }
  115. }, 500);
  116. });
  117. // Load floating button
  118. const floatingButton = M.FloatingActionButton.init(document.querySelectorAll('.fixed-action-btn'))[0];
  119. // Load modal
  120. modal = M.Modal.init(document.querySelectorAll('.modal'))[0];
  121. });
  122. /**
  123. * Load all card
  124. * @param boolean toArray (optionnal) send result in array and not in object (default: false)
  125. */
  126. function loadData(toArray) {
  127. toArray = toArray ? toArray : false;
  128. const data = toArray ? [] : {};
  129. return new Promise(resolve => {
  130. // Load from local storage
  131. if (localStorage.list) {
  132. const list = JSON.parse(localStorage.list)
  133. for (element of list) {
  134. toArray ? data.push(localStorage[element]) : data[element] = localStorage[element];
  135. }
  136. } else {
  137. localStorage.setItem('list', JSON.stringify([]));
  138. }
  139. // Load from disk
  140. $.getJSON('data/list.json', (list) => {
  141. const total = list.length;
  142. let count = 0;
  143. list.forEach(element => {
  144. $.getJSON(`data/${element}.json`, (result) => {
  145. toArray ? data.push(result) : data[result.id] = result;
  146. if (++count === total) {
  147. resolve(data);
  148. }
  149. });
  150. });
  151. });
  152. });
  153. }
  154. function printContent(scope) {
  155. for(element of scope.card) {
  156. element.content = element.content.toHTML();
  157. }
  158. looper(scope);
  159. PR.prettyPrint();
  160. }
  161. function saveUserName(input) {
  162. if (input.value.trim() === '') {
  163. document.cookie = 'username=Utilisateur';
  164. } else {
  165. document.cookie = `username=${input.value}`;
  166. }
  167. }
  168. function selectCard(card) {
  169. const promise = loadData();
  170. const idElement = card.querySelector('[data-val=id]');
  171. const id = idElement.innerHTML;
  172. promise.then(data => {
  173. $('#modal-title').html(data[id].title);
  174. $('#modal-content').html(data[id].content.toHTML())
  175. $('#modal-delete').attr('data-id', id);
  176. PR.prettyPrint();
  177. modal.open();
  178. });
  179. }
  180. function deleteCard(span, fromCard) {
  181. let card;
  182. let id;
  183. // Get id and card element to remove
  184. if (fromCard) {
  185. card = $(span).parents();
  186. id = $($(card[1]).children()[0]).children()[0].innerHTML;
  187. } else {
  188. id = $(span).attr('data-id');
  189. idElements = document.querySelectorAll('[data-val=id]');
  190. for (idElement of idElements) {
  191. if (idElement.innerHTML === id) {
  192. card = $(idElement).parents();
  193. }
  194. }
  195. }
  196. // If card in local storage remove
  197. if (localStorage[id]) {
  198. localStorage.removeItem(id);
  199. let list = JSON.parse(localStorage.list);
  200. list.removeItem(id);
  201. localStorage.setItem('list', JSON.stringify(list));
  202. }
  203. // Remove card on the DOM
  204. card[2].remove();
  205. }
  206. function pageLoader(active) {
  207. if (active) {
  208. $('#page-loader').removeClass('hide');
  209. $('#navbar').addClass('hide');
  210. $('#float-add-btn').addClass('hide');
  211. } else {
  212. $('#float-add-btn').removeClass('hide');
  213. $('#navbar').removeClass('hide');
  214. $('#page-loader').addClass('hide');
  215. }
  216. }
  217. </script>
  218. </body>
  219. </html>