ws-menu.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. "use strict";
  2. (function($) {
  3. $(document).ready(function() {
  4. console.log('ws: init menu');
  5. /**
  6. * Main menu
  7. */
  8. var $mainMenu = $('#nav-menus');
  9. /**
  10. * Main menu toggle button
  11. */
  12. var $menuBtn = $('#menu-btn');
  13. $menuBtn.click(toggleMainMenu);
  14. /**
  15. * Navigation state
  16. */
  17. var navState = parsePath();
  18. /**
  19. * Previous navigation state
  20. */
  21. var prevNavState;
  22. /**
  23. * Toggle main menu
  24. */
  25. function toggleMainMenu() {
  26. $mainMenu.toggleClass('in');
  27. };
  28. /**
  29. * Extract bits (repo&example slugs) from requested url path
  30. */
  31. function parsePath() {
  32. const path = window.location.pathname.substr(1);
  33. const bits = path.split('/');
  34. return {
  35. repo: bits[0],
  36. example: bits.length === 1 ? '' : bits[1]
  37. };
  38. }
  39. /**
  40. * Handle navigation
  41. */
  42. _ws.navigateTo = function(path) {
  43. $('#server-alert').remove();
  44. history.pushState({}, 'New path', path);
  45. prevNavState = navState;
  46. navState = parsePath();
  47. console.log('previous&new nav states', prevNavState, navState);
  48. if(navState.repo !== prevNavState.repo) {
  49. if(navState.repo === '') {
  50. console.log('nav: back to root');
  51. _ws.events.emit('navToRoot');
  52. _ws.ui.addExample.$btn.removeClass('in');
  53. _ws.ui.addExample.hide();
  54. _ws.ui.menuExample.render({ examples: [] });
  55. _ws.ui.shortcutRepo.render({ repos: _ws.repos, _: _ws._ });
  56. _ws.ui.shortcutExample.hide();
  57. }
  58. else {
  59. console.log('nav: repo changed');
  60. rp.get('/parts/' + navState.repo, 'json')
  61. .then(function(parts) {
  62. // renderMenuExample(parts.menuExample);
  63. console.log('render with parts', parts);
  64. _ws.repo = parts.repo;
  65. _ws.ui.addExample.$btn.addClass('in');
  66. _ws.ui.addExample.show();
  67. _ws.ui.detailsRepo.render(parts);
  68. _ws.ui.menuExample.render(parts);
  69. _ws.ui.shortcutExample.render(parts);
  70. _ws.ui.shortcutRepo.hide();
  71. _ws.events.emit('navToRepo', navState.repo);
  72. });
  73. }
  74. }
  75. else if(navState.example !== prevNavState.example) {
  76. rp.get('/parts/' + navState.repo + '/' + navState.example, 'json')
  77. .then(function(parts) {
  78. console.log('nav: example changed', parts);
  79. _ws.example = parts.example;
  80. _ws.files = parts.files;
  81. console.log(_ws.ui);
  82. // renderDetailsExample(parts);
  83. _ws.ui.detailsExample.render(parts);
  84. _ws.ui.editor.render(parts);
  85. _ws.ui.tabs.render(parts);
  86. _ws.ui.sandboxIframe.render(navState);
  87. });
  88. }
  89. }
  90. function menuItemClicked(e) {
  91. e.preventDefault();
  92. var $link = $(e.target);
  93. console.log($link.prop('href'));
  94. var originalColor = $link.css('backgroundColor');
  95. toggleMainMenu();
  96. $link.animate({
  97. backgroundColor: '#aaa',
  98. }, 70);
  99. $link.animate({
  100. backgroundColor: originalColor,
  101. }, 70);
  102. _ws.navigateTo($link.prop('href'));
  103. }
  104. function shortcutItemClicked(e) {
  105. e.preventDefault();
  106. var $link = $(e.target);
  107. _ws.navigateTo($link.prop('href'));
  108. }
  109. /**
  110. * Initialize menu-example view
  111. */
  112. _ws.makeView('menu-example', {
  113. events: {
  114. 'click a': menuItemClicked
  115. }
  116. });
  117. _ws.makeView('shortcut-repo', {
  118. events: {
  119. 'click a': shortcutItemClicked
  120. }
  121. });
  122. _ws.makeView('shortcut-example', {
  123. events: {
  124. 'click a': shortcutItemClicked
  125. }
  126. });
  127. /**
  128. * Initialize menu-example view
  129. */
  130. // _ws.makeView('menu-repo', {
  131. // events: {
  132. // 'click a': menuItemClicked
  133. // }
  134. // });
  135. /**
  136. * Handle click on links outside #menu-example
  137. */
  138. $('#menu-repo a').click(menuItemClicked);
  139. $('#nav-back-home').click(function(e) {
  140. e.preventDefault();
  141. $mainMenu.removeClass('in');
  142. _ws.navigateTo('/');
  143. });
  144. /**
  145. * Initialize details-example view
  146. */
  147. _ws.makeView('details-example');
  148. /**
  149. * Initialize details-repo view
  150. */
  151. _ws.makeView('details-repo');
  152. // window._ws.navigator = new SandboxNavigator();
  153. // console.log('navigator init', _ws);
  154. // var $exMenuItem = $('<li><a href="/' + repoSlug + '/' + example.slug + '">' + example.title + '</a></li>')
  155. // .appendTo( $('#cat-' + example.category) );
  156. // notify('success', "Exemple créé !");
  157. // _ws.navigateTo('/'+ repoSlug + '/' + example.slug);
  158. // })
  159. // .catch(errText => notify('error', 'Erreur: ' + errText));
  160. // }
  161. // function clearAndCloseEditor() {
  162. // $exampleFormIn.val('');
  163. // toggleEditor();
  164. // }
  165. });
  166. })(jQuery);