All files / src/qComponents/helpers collapse-transition.js

5.13% Statements 2/39
0% Branches 0/8
14.29% Functions 1/7
5.41% Lines 2/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80                1x                                                                                                                                       1x      
/* eslint-disable no-param-reassign */
 
export default {
  name: 'QCollapseTransition',
 
  functional: true,
 
  render(h, { children }) {
    const data = {
      on: {
        beforeEnter(el) {
          el.classList.add('collapse-transition');
 
          if (!el.dataset) el.dataset = {};
 
          el.dataset.oldPaddingTop = el.style.paddingTop;
          el.dataset.oldPaddingBottom = el.style.paddingBottom;
 
          el.style.height = '0';
          el.style.paddingTop = 0;
          el.style.paddingBottom = 0;
        },
 
        enter(el) {
          el.dataset.oldOverflow = el.style.overflow;
          if (el.scrollHeight !== 0) {
            el.style.height = `${el.scrollHeight}px`;
            el.style.paddingTop = el.dataset.oldPaddingTop;
            el.style.paddingBottom = el.dataset.oldPaddingBottom;
          } else {
            el.style.height = '';
            el.style.paddingTop = el.dataset.oldPaddingTop;
            el.style.paddingBottom = el.dataset.oldPaddingBottom;
          }
 
          el.style.overflow = 'hidden';
        },
 
        afterEnter(el) {
          el.classList.remove('collapse-transition');
 
          // for safari: remove class then reset height is necessary
          el.style.height = '';
          el.style.overflow = el.dataset.oldOverflow;
        },
 
        beforeLeave(el) {
          if (!el.dataset) el.dataset = {};
          el.dataset.oldPaddingTop = el.style.paddingTop;
          el.dataset.oldPaddingBottom = el.style.paddingBottom;
          el.dataset.oldOverflow = el.style.overflow;
 
          el.style.height = `${el.scrollHeight}px`;
          el.style.overflow = 'hidden';
        },
 
        leave(el) {
          if (el.scrollHeight !== 0) {
            el.classList.add('collapse-transition');
            // for safari: add class after set height, or it will jump to zero height suddenly, weired
            el.style.height = 0;
            el.style.paddingTop = 0;
            el.style.paddingBottom = 0;
          }
        },
 
        afterLeave(el) {
          el.classList.remove('collapse-transition');
          el.style.height = '';
          el.style.overflow = el.dataset.oldOverflow;
          el.style.paddingTop = el.dataset.oldPaddingTop;
          el.style.paddingBottom = el.dataset.oldPaddingBottom;
        }
      }
    };
 
    return h('transition', data, children);
  }
};