1 | 'use strict';
|
2 |
|
3 | import $ from 'jquery';
|
4 |
|
5 | import { MediaQuery } from './foundation.util.mediaQuery';
|
6 | import { Motion } from './foundation.util.motion';
|
7 | import { Plugin } from './foundation.plugin';
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | class ResponsiveToggle extends Plugin {
|
17 | |
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | _setup(element, options) {
|
26 | this.$element = $(element);
|
27 | this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options);
|
28 | this.className = 'ResponsiveToggle';
|
29 |
|
30 | this._init();
|
31 | this._events();
|
32 | }
|
33 |
|
34 | |
35 |
|
36 |
|
37 |
|
38 |
|
39 | _init() {
|
40 | MediaQuery._init();
|
41 | var targetID = this.$element.data('responsive-toggle');
|
42 | if (!targetID) {
|
43 | console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.');
|
44 | }
|
45 |
|
46 | this.$targetMenu = $(`#${targetID}`);
|
47 | this.$toggler = this.$element.find('[data-toggle]').filter(function() {
|
48 | var target = $(this).data('toggle');
|
49 | return (target === targetID || target === "");
|
50 | });
|
51 | this.options = $.extend({}, this.options, this.$targetMenu.data());
|
52 |
|
53 |
|
54 | if(this.options.animate) {
|
55 | let input = this.options.animate.split(' ');
|
56 |
|
57 | this.animationIn = input[0];
|
58 | this.animationOut = input[1] || null;
|
59 | }
|
60 |
|
61 | this._update();
|
62 | }
|
63 |
|
64 | |
65 |
|
66 |
|
67 |
|
68 |
|
69 | _events() {
|
70 | var _this = this;
|
71 |
|
72 | this._updateMqHandler = this._update.bind(this);
|
73 |
|
74 | $(window).on('changed.zf.mediaquery', this._updateMqHandler);
|
75 |
|
76 | this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this));
|
77 | }
|
78 |
|
79 | |
80 |
|
81 |
|
82 |
|
83 |
|
84 | _update() {
|
85 |
|
86 | if (!MediaQuery.atLeast(this.options.hideFor)) {
|
87 | this.$element.show();
|
88 | this.$targetMenu.hide();
|
89 | }
|
90 |
|
91 |
|
92 | else {
|
93 | this.$element.hide();
|
94 | this.$targetMenu.show();
|
95 | }
|
96 | }
|
97 |
|
98 | |
99 |
|
100 |
|
101 |
|
102 |
|
103 | toggleMenu() {
|
104 | if (!MediaQuery.atLeast(this.options.hideFor)) {
|
105 | |
106 |
|
107 |
|
108 |
|
109 | if(this.options.animate) {
|
110 | if (this.$targetMenu.is(':hidden')) {
|
111 | Motion.animateIn(this.$targetMenu, this.animationIn, () => {
|
112 | this.$element.trigger('toggled.zf.responsiveToggle');
|
113 | this.$targetMenu.find('[data-mutate]').triggerHandler('mutateme.zf.trigger');
|
114 | });
|
115 | }
|
116 | else {
|
117 | Motion.animateOut(this.$targetMenu, this.animationOut, () => {
|
118 | this.$element.trigger('toggled.zf.responsiveToggle');
|
119 | });
|
120 | }
|
121 | }
|
122 | else {
|
123 | this.$targetMenu.toggle(0);
|
124 | this.$targetMenu.find('[data-mutate]').trigger('mutateme.zf.trigger');
|
125 | this.$element.trigger('toggled.zf.responsiveToggle');
|
126 | }
|
127 | }
|
128 | };
|
129 |
|
130 | _destroy() {
|
131 | this.$element.off('.zf.responsiveToggle');
|
132 | this.$toggler.off('.zf.responsiveToggle');
|
133 |
|
134 | $(window).off('changed.zf.mediaquery', this._updateMqHandler);
|
135 | }
|
136 | }
|
137 |
|
138 | ResponsiveToggle.defaults = {
|
139 | |
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 | hideFor: 'medium',
|
146 |
|
147 | |
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 | animate: false
|
154 | };
|
155 |
|
156 | export { ResponsiveToggle };
|