dom.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. 'use strict';
  2. require('jsdom-global')();
  3. const renderElement = (html) => {
  4. const temp = document.createElement('div');
  5. temp.innerHTML = html;
  6. return temp.firstElementChild;
  7. };
  8. module.exports = {
  9. getContainer() {
  10. return renderElement('<div class="mixitup-container" data-ref="container">' +
  11. '<div id="target-1" class="mix category-a" data-ref="mix" data-category="a" data-published="20161102" data-views="100"></div> ' +
  12. '<div id="target-2" class="mix category-a" data-ref="mix" data-category="a" data-published="20130501" data-views="54"></div> ' +
  13. '<div id="target-3" class="mix category-b" data-ref="mix" data-category="b" data-published="20121231" data-views="3"></div> ' +
  14. '<div id="target-4" class="mix category-b" data-ref="mix" data-category="b" data-published="20160407" data-views="62"></div> ' +
  15. '<div id="target-5" class="mix category-c" data-ref="mix" data-category="c" data-published="20160820" data-views="54"></div> ' +
  16. '<div id="target-6" class="mix category-a category-c" data-ref="mix" data-category="a c" data-published="20151020" data-views="95"></div>' +
  17. '<span class="mixitup-container-gap></span>' +
  18. '</div>');
  19. },
  20. getTarget() {
  21. return renderElement('<div id="7" class="mix category-d" data-ref="mix" data-category="d" data-published="20161222" data-views="132"></div>');
  22. },
  23. getEmptyContainer() {
  24. return renderElement('<div class="container" data-ref="container"></div>');
  25. },
  26. getFilterControls() {
  27. return renderElement('<div class="mixitup-controls">' +
  28. '<div class="mixitup-control" data-filter="all">All</div> ' +
  29. '<div class="mixitup-control" data-filter="none">None</div> ' +
  30. '<div class="mixitup-control" data-filter=".category-a">Category A</div> ' +
  31. '<div class="mixitup-control" data-filter=".category-b">Category B</div> ' +
  32. '<div class="mixitup-control" data-filter=".category-c">Category C</div> ' +
  33. '<div class="mixitup-control" data-filter=".category-d">Category D</div> ' +
  34. '<div class="mixitup-control" data-filter=".category-a, .category-b">Category A OR B</div> ' +
  35. '<div class="mixitup-control" data-filter=".category-a.category-c">Category A AND C</div> ' +
  36. '<div class="mixitup-control mixitup_control__attr-a" data-filter=\'[data-category="a"]\'>Category A (attribute)</div> ' +
  37. '<div class="mixitup-control mixitup_control__attr-a-or-b" data-filter=\'[data-category="a"], [data-category="b"]\'>Category A OR B (attribute)</div> ' +
  38. '<div class="mixitup-control mixitup_control__attr-a-and-c" data-filter=\'[data-category="a"][data-category="c"]\'>Category A AND C (attribute)</div> ' +
  39. '<div class="mixitup-control" data-toggle=".category-a">Category A</div> ' +
  40. '<div class="mixitup-control" data-toggle=".category-b">Category B</div> ' +
  41. '<div class="mixitup-control" data-toggle=".category-c">Category C</div> ' +
  42. '</div>');
  43. },
  44. getFilterControl() {
  45. return renderElement('<div class="mixitup-control" data-filter=".category-d">Category D</div>');
  46. },
  47. getToggleControl() {
  48. return renderElement('<div class="mixitup-control" data-toggle=".category-b">Category B</div>');
  49. },
  50. getSortControl() {
  51. return renderElement('<div class="mixitup-control" data-sort="views:desc published:asc">Views (desc) Published (asc)</div>');
  52. },
  53. getSortControls() {
  54. return renderElement('<div class="mixitup-controls">' +
  55. '<div class="mixitup-control" data-sort="default">Default</div> ' +
  56. '<div class="mixitup-control" data-sort="default:asc">Default Ascending</div> ' +
  57. '<div class="mixitup-control" data-sort="default:desc">Default Descending</div> ' +
  58. '<div class="mixitup-control" data-sort="random">Random</div> ' +
  59. '<div class="mixitup-control" data-sort="published">Published Date</div> ' +
  60. '<div class="mixitup-control" data-sort="views">Views</div> ' +
  61. '<div class="mixitup-control" data-sort="published:asc views:desc">Published (asc) Views (desc)</div> ' +
  62. '</div>');
  63. },
  64. getMultimixControls() {
  65. return renderElement('<div class="mixitup-controls">' +
  66. '<div class="mixitup-control" data-filter="all" data-sort="default:asc">All / Default</div> ' +
  67. '<div class="mixitup-control" data-filter=".category-b" data-sort="published">Category B / Published</div> ' +
  68. '</div>');
  69. },
  70. getTotalWhitespace(html) {
  71. let re = /[>? ]( )[<? ]/g;
  72. let totalWhitespace = 0;
  73. let matches;
  74. while (matches = re.exec(html)) {
  75. totalWhitespace++;
  76. }
  77. return totalWhitespace;
  78. },
  79. Item: class Item {
  80. constructor(data) {
  81. this.id = typeof data !== 'undefined' ? data.id : undefined;
  82. this.categories = Array.prototype.slice.call(data.categories) || [];
  83. this.published = typeof data.published === 'string' ? data.published : '';
  84. this.views = typeof data.views === 'number' ? data.views : 0;
  85. Object.seal(this);
  86. }
  87. get classList() {
  88. return 'mix ' + this.categories.map(category => 'category-' + category).join(' ');
  89. }
  90. get categoryList() {
  91. return this.categories.join(' ');
  92. }
  93. },
  94. ITEM_TEMPLATE: '<div id="${id}" class="${classList}" data-ref="mix" data-category="${categoryList}" data-published="${published}" data-views="${views}"></div>',
  95. ITEM_TEMPLATE_ALT: '<div id="${id}"></div>'
  96. };