Guest User

Untitled

a guest
Jan 18th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1. let AppState = {
  2. results: [],
  3. prevMatchTarget: null,
  4. currentMatchIdx: null,
  5. currenTarget: {
  6. target: null,
  7. parent: null,
  8. firstChild: null,
  9. prevSib: null,
  10. nextSib: null
  11. },
  12. domNavigation: false
  13. };
  14.  
  15. function updateState(nextState) {
  16. AppState = Object.assign(AppState, nextState);
  17. }
  18.  
  19. // renderers
  20. function toggleHighlight({ on, target }) {
  21. if (on) {
  22. target.setAttribute(
  23. 'style',
  24. ' outline: solid red 5px; background-color: lightblue;'
  25. );
  26. } else {
  27. target.removeAttribute(
  28. 'style',
  29. ' outline: solid red 5px; background-color: lightblue;'
  30. );
  31. }
  32. }
  33.  
  34. function renderPage({ currenTarget, prevMatchTarget }) {
  35. if (prevMatchTarget instanceof HTMLElement) {
  36. toggleHighlight({
  37. on: false,
  38. target: prevMatchTarget
  39. });
  40. }
  41. if (currenTarget.target instanceof HTMLElement) {
  42. toggleHighlight({
  43. on: true,
  44. target: currenTarget.target
  45. });
  46. }
  47. }
  48.  
  49. function setActiveNavs({ currenTarget, buttons, panel }) {
  50. Object.keys(buttons).forEach(nav => {
  51. let btn = panel.querySelector(buttons[nav]);
  52. currenTarget[nav] instanceof HTMLElement
  53. ? btn.removeAttribute('disabled', 'disabled')
  54. : btn.setAttribute('disabled', 'disabled');
  55. });
  56. }
  57.  
  58. function renderPanel({
  59. panel,
  60. searchSelector,
  61. results,
  62. currentMatchIdx,
  63. currenTarget,
  64. domNavigation
  65. }) {
  66. const btnNext = panel.querySelector('.selector-next');
  67. const btnPrev = panel.querySelector('.selector-prev');
  68.  
  69. const btnTop = panel.querySelector('.nav-top');
  70. const btnBottom = panel.querySelector('.nav-bottom');
  71. const btnLeft = panel.querySelector('.nav-left');
  72. const btnRight = panel.querySelector('.nav-right');
  73.  
  74. if (results.length) {
  75. setActiveNavs({
  76. currenTarget,
  77. panel,
  78. buttons: {
  79. parent: '.nav-top',
  80. firstChild: '.nav-bottom',
  81. prevSib: '.nav-left',
  82. nextSib: '.nav-right'
  83. }
  84. });
  85.  
  86. if (domNavigation) {
  87. btnNext.setAttribute('disabled', 'disabled');
  88. btnPrev.setAttribute('disabled', 'disabled');
  89. } else {
  90. switch (true) {
  91. case currentMatchIdx === 0:
  92. btnNext.removeAttribute('disabled', 'disabled');
  93. btnPrev.setAttribute('disabled', 'disabled');
  94. break;
  95. case currentMatchIdx < results.length - 1:
  96. btnNext.removeAttribute('disabled', 'disabled');
  97. btnPrev.removeAttribute('disabled', 'disabled');
  98. break;
  99. case currentMatchIdx === results.length - 1:
  100. btnNext.setAttribute('disabled', 'disabled');
  101. btnPrev.removeAttribute('disabled', 'disabled');
  102. break;
  103. default:
  104. console.log('Current match index', currentMatchIdx);
  105. }
  106. }
  107. } else {
  108. btnNext.setAttribute('disabled', 'disabled');
  109. btnPrev.setAttribute('disabled', 'disabled');
  110. btnTop.setAttribute('disabled', 'disabled');
  111. btnBottom.setAttribute('disabled', 'disabled');
  112. btnLeft.setAttribute('disabled', 'disabled');
  113. btnRight.setAttribute('disabled', 'disabled');
  114. }
  115. }
  116.  
  117. //state mutations
  118. function setCurrentTarget({ target }) {
  119. if (target instanceof HTMLElement) {
  120. updateState({
  121. currenTarget: {
  122. target,
  123. parent: target.parentElement,
  124. firstChild: target.firstElementChild,
  125. prevSib: target.previousElementSibling,
  126. nextSib: target.nextElementSibling
  127. }
  128. });
  129. }
  130. }
  131.  
  132. function findMatches(event) {
  133. const { results, currenTarget, prevMatchTarget, currentMatchIdx } = AppState;
  134. const query = event.target.previousElementSibling.value;
  135. const searchedRezults = Array.prototype.slice.apply(
  136. document.querySelectorAll(query)
  137. );
  138.  
  139. const prevTarget =
  140. prevMatchTarget instanceof HTMLElement && prevMatchTarget !== null
  141. ? prevMatchTarget
  142. : searchedRezults[0];
  143.  
  144. setCurrentTarget({
  145. target: searchedRezults[0]
  146. });
  147.  
  148. updateState({
  149. results: searchedRezults,
  150. prevMatchTarget: prevTarget,
  151. domNavigation: false,
  152. currentMatchIdx: 0
  153. });
  154.  
  155. console.log('AppState', AppState);
  156. }
  157.  
  158. function goTo(event) {
  159. const { results, currentMatchIdx, prevMatchTarget } = AppState;
  160. let nextIndex;
  161. if (event.target.classList.contains('selector-next')) {
  162. if (currentMatchIdx < results.length - 1) {
  163. nextIndex = currentMatchIdx + 1;
  164. }
  165. } else if (currentMatchIdx > 0) {
  166. nextIndex = currentMatchIdx - 1;
  167. }
  168.  
  169. setCurrentTarget({ target: results[nextIndex] });
  170.  
  171. updateState({
  172. currentMatchIdx: nextIndex,
  173. prevMatchTarget: results[currentMatchIdx]
  174. });
  175. }
  176.  
  177. function domNav(event) {
  178. const { currenTarget } = AppState;
  179. const buttons = {
  180. 'nav-top': 'parent',
  181. 'nav-bottom': 'firstChild',
  182. 'nav-left': 'prevSib',
  183. 'nav-right': 'nextSib'
  184. };
  185.  
  186. updateState({
  187. prevMatchTarget: currenTarget.target,
  188. domNavigation: true
  189. });
  190.  
  191. setCurrentTarget({
  192. target: currenTarget[buttons[event.target.classList.value]]
  193. });
  194. }
  195.  
  196. //main stream
  197.  
  198. function renderView({ container, AppState }) {
  199. const {
  200. results,
  201. currenTarget,
  202. prevMatchTarget,
  203. domNavigation,
  204. currentMatchIdx
  205. } = AppState;
  206.  
  207. renderPage({
  208. currenTarget,
  209. prevMatchTarget
  210. });
  211.  
  212. renderPanel({
  213. panel: container.querySelector('.jsbursa-panel'),
  214. results,
  215. currentMatchIdx,
  216. currenTarget,
  217. domNavigation
  218. });
  219. }
  220.  
  221. const render = () =>
  222. renderView({
  223. container: document.querySelector('#css-zen-garden'),
  224. AppState
  225. });
  226.  
  227. function listenTo({ event, selector, handler }) {
  228. document.addEventListener(event, evt => {
  229. if (evt.target.matches(selector)) {
  230. handler(evt);
  231. render();
  232. }
  233. });
  234. }
  235.  
  236. function bindEvents() {
  237. listenTo({
  238. event: 'click',
  239. selector: 'button.selector-find',
  240. handler: findMatches
  241. });
  242. listenTo({
  243. event: 'click',
  244. selector: 'button.selector-next',
  245. handler: goTo
  246. });
  247. listenTo({
  248. event: 'click',
  249. selector: 'button.selector-prev',
  250. handler: goTo
  251. });
  252. listenTo({
  253. event: 'click',
  254. selector: 'button.nav-top',
  255. handler: domNav
  256. });
  257. listenTo({
  258. event: 'click',
  259. selector: 'button.nav-bottom',
  260. handler: domNav
  261. });
  262. listenTo({
  263. event: 'click',
  264. selector: 'button.nav-left',
  265. handler: domNav
  266. });
  267. listenTo({
  268. event: 'click',
  269. selector: 'button.nav-right',
  270. handler: domNav
  271. });
  272. }
  273.  
  274. bindEvents();
Add Comment
Please, Sign In to add comment