controls-toggle.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. 'use strict';
  2. require('jsdom-global')();
  3. const chai = require('chai');
  4. const dom = require('../mock/dom');
  5. const mixitup = require('../../dist/mixitup.js');
  6. chai.use(require('chai-shallow-deep-equal'));
  7. chai.use(require('chai-as-promised'));
  8. describe('Controls', () => {
  9. describe('Toggle', () => {
  10. describe('OR', () => {
  11. let frag = document.createDocumentFragment();
  12. let container = dom.getContainer();
  13. let controls = dom.getFilterControls();
  14. container.insertBefore(controls, container.children[0]);
  15. frag.appendChild(container);
  16. let mixer = mixitup(container, {
  17. controls: {
  18. scope: 'local'
  19. }
  20. });
  21. after(() => mixer.destroy());
  22. it('should accept toggle controls with a selector value', () => {
  23. return mixer.hide()
  24. .then(() => {
  25. let toggle = controls.querySelector('[data-toggle=".category-a"]');
  26. let totalMatching = container.querySelectorAll('.category-a').length;
  27. toggle.click();
  28. let state = mixer.getState();
  29. chai.assert.equal(state.activeFilter.selector, '.category-a');
  30. chai.assert.equal(state.totalShow, totalMatching);
  31. chai.assert.isOk(toggle.matches('.mixitup-control-active'));
  32. });
  33. });
  34. it('should build up a compound selector as toggles are activated', () => {
  35. let toggleA = controls.querySelector('[data-toggle=".category-a"]');
  36. let toggleB = controls.querySelector('[data-toggle=".category-b"]');
  37. let totalMatching = container.querySelectorAll('.category-a, .category-b').length;
  38. toggleB.click();
  39. let state = mixer.getState();
  40. chai.assert.equal(state.activeFilter.selector, '.category-a, .category-b');
  41. chai.assert.equal(state.totalShow, totalMatching);
  42. chai.assert.isOk(toggleA.matches('.mixitup-control-active'));
  43. chai.assert.isOk(toggleB.matches('.mixitup-control-active'));
  44. });
  45. it('should break down a compound selector as toggles are deactivated', () => {
  46. let toggle = controls.querySelector('[data-toggle=".category-a"]');
  47. let totalMatching = container.querySelectorAll('.category-b').length;
  48. toggle.click();
  49. let state = mixer.getState();
  50. chai.assert.equal(state.activeFilter.selector, '.category-b');
  51. chai.assert.equal(state.totalShow, totalMatching);
  52. chai.assert.isNotOk(toggle.matches('.mixitup-control-active'));
  53. });
  54. it('should return to "all" when all toggles are deactivated', () => {
  55. let toggle = controls.querySelector('[data-toggle=".category-b"]');
  56. toggle.click();
  57. let state = mixer.getState();
  58. chai.assert.equal(state.activeFilter.selector, '.mix');
  59. chai.assert.equal(state.totalHide, 0);
  60. chai.assert.isNotOk(toggle.matches('.mixitup-control-active'));
  61. });
  62. it ('should activate the appropriate toggle controls on load for an OR compound selector', () => {
  63. const frag = document.createDocumentFragment();
  64. const container = dom.getContainer();
  65. const controls = dom.getFilterControls();
  66. frag.appendChild(controls);
  67. frag.appendChild(container);
  68. const mixer = mixitup(container, {
  69. load: {
  70. filter: '.category-a, .category-c'
  71. }
  72. }, frag);
  73. after(() => mixer.destroy());
  74. const toggleA = controls.querySelector('[data-toggle=".category-a"]');
  75. const toggleC = controls.querySelector('[data-toggle=".category-c"]');
  76. chai.assert.isTrue(toggleA.classList.contains('mixitup-control-active'));
  77. chai.assert.isTrue(toggleC.classList.contains('mixitup-control-active'));
  78. });
  79. });
  80. describe('AND', () => {
  81. let frag = document.createDocumentFragment();
  82. let container = dom.getContainer();
  83. let controls = dom.getFilterControls();
  84. container.insertBefore(controls, container.children[0]);
  85. frag.appendChild(container);
  86. let mixer = mixitup(container, {
  87. controls: {
  88. scope: 'local',
  89. toggleLogic: 'AND'
  90. }
  91. });
  92. after(() => mixer.destroy());
  93. it('should accept toggle controls with a selector value', () => {
  94. return mixer.hide()
  95. .then(() => {
  96. let toggle = controls.querySelector('[data-toggle=".category-a"]');
  97. let totalMatching = container.querySelectorAll('.category-a').length;
  98. toggle.click();
  99. let state = mixer.getState();
  100. chai.assert.equal(state.activeFilter.selector, '.category-a');
  101. chai.assert.equal(state.totalShow, totalMatching);
  102. chai.assert.isOk(toggle.matches('.mixitup-control-active'));
  103. });
  104. });
  105. it('should build up a compound selector as toggles are activated', () => {
  106. let toggleA = controls.querySelector('[data-toggle=".category-a"]');
  107. let toggleB = controls.querySelector('[data-toggle=".category-c"]');
  108. let totalMatching = container.querySelectorAll('.category-a.category-c').length;
  109. toggleB.click();
  110. let state = mixer.getState();
  111. chai.assert.equal(state.activeFilter.selector, '.category-a.category-c');
  112. chai.assert.equal(state.totalShow, totalMatching);
  113. chai.assert.isOk(toggleA.matches('.mixitup-control-active'));
  114. chai.assert.isOk(toggleB.matches('.mixitup-control-active'));
  115. });
  116. it('should break down a compound selector as toggles are deactivated', () => {
  117. let toggle = controls.querySelector('[data-toggle=".category-a"]');
  118. let totalMatching = container.querySelectorAll('.category-c').length;
  119. toggle.click();
  120. let state = mixer.getState();
  121. chai.assert.equal(state.activeFilter.selector, '.category-c');
  122. chai.assert.equal(state.totalShow, totalMatching);
  123. chai.assert.isNotOk(toggle.matches('.mixitup-control-active'));
  124. });
  125. it('should return to "all" when all toggles are deactivated', () => {
  126. let toggle = controls.querySelector('[data-toggle=".category-c"]');
  127. toggle.click();
  128. let state = mixer.getState();
  129. chai.assert.equal(state.activeFilter.selector, '.mix');
  130. chai.assert.equal(state.totalHide, 0);
  131. chai.assert.isNotOk(toggle.matches('.mixitup-control-active'));
  132. });
  133. it('should allow toggles to activated via the API', () => {
  134. let totalMatching = container.querySelectorAll('.category-a.category-c').length;
  135. mixer.toggleOn('.category-a');
  136. mixer.toggleOn('.category-c');
  137. let state = mixer.getState();
  138. chai.assert.equal(state.activeFilter.selector, '.category-a.category-c');
  139. chai.assert.equal(state.totalShow, totalMatching);
  140. });
  141. it ('should activate the appropriate toggle controls on load for an AND compound selector', () => {
  142. const frag = document.createDocumentFragment();
  143. const container = dom.getContainer();
  144. const controls = dom.getFilterControls();
  145. frag.appendChild(controls);
  146. frag.appendChild(container);
  147. const mixer = mixitup(container, {
  148. controls: {
  149. toggleLogic: 'and'
  150. },
  151. load: {
  152. filter: '.category-a.category-c'
  153. }
  154. }, frag);
  155. after(() => mixer.destroy());
  156. const toggleA = controls.querySelector('[data-toggle=".category-a"]');
  157. const toggleC = controls.querySelector('[data-toggle=".category-c"]');
  158. chai.assert.isTrue(toggleA.classList.contains('mixitup-control-active'));
  159. chai.assert.isTrue(toggleC.classList.contains('mixitup-control-active'));
  160. });
  161. });
  162. describe('Defaults', () => {
  163. it('should default to "none" when all toggles are deactivated and toggleDefault is set to "none"', () => {
  164. let frag = document.createDocumentFragment();
  165. let container = dom.getContainer();
  166. let controls = dom.getFilterControls();
  167. container.insertBefore(controls, container.children[0]);
  168. frag.appendChild(container);
  169. let mixer = mixitup(container, {
  170. controls: {
  171. scope: 'local',
  172. toggleDefault: 'none'
  173. }
  174. });
  175. return mixer.hide()
  176. .then(() => {
  177. let toggle = controls.querySelector('[data-toggle=".category-a"]');
  178. // on
  179. toggle.click();
  180. // off
  181. toggle.click();
  182. let state = mixer.getState();
  183. chai.assert.equal(state.activeFilter.selector, '');
  184. chai.assert.equal(state.totalShow, 0);
  185. chai.assert.isNotOk(toggle.matches('.mixitup-control-active'));
  186. mixer.destroy();
  187. });
  188. });
  189. it('should default to "all" when all toggles are deactivated', () => {
  190. let container = dom.getContainer();
  191. let controls = dom.getFilterControls();
  192. container.insertBefore(controls, container.children[0]);
  193. document.body.appendChild(container);
  194. let mixer = mixitup(container, {
  195. controls: {
  196. scope: 'local',
  197. toggleDefault: 'all'
  198. }
  199. });
  200. return mixer.hide()
  201. .then(() => {
  202. let toggle = controls.querySelector('[data-toggle=".category-a"]');
  203. // on
  204. toggle.click();
  205. // off
  206. toggle.click();
  207. let state = mixer.getState();
  208. chai.assert.equal(state.activeFilter.selector, '.mix');
  209. chai.assert.equal(state.totalHide, 0);
  210. chai.assert.isNotOk(toggle.matches('.mixitup-control-active'));
  211. });
  212. });
  213. });
  214. });
  215. });