PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0.1
Jetpack – WP Security, Backup, Speed, & Growth v16.0.1
16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / widget-visibility / widget-conditions / widget-conditions.js
jetpack / modules / widget-visibility / widget-conditions Last commit date
rtl 9 years ago widget-conditions-rtl.css 7 months ago widget-conditions-rtl.min.css 1 month ago widget-conditions.css 7 months ago widget-conditions.js 4 years ago widget-conditions.min.css 1 month ago
widget-conditions.js
314 lines
1 /* global isRtl, widget_conditions_parent_pages, widget_conditions_data */
2
3 jQuery( function ( $ ) {
4 // Gutenberg 'widgets.php' screen.
5 var widgets_shell = $( '#widgets-editor' );
6
7 if ( 0 === widgets_shell.length ) {
8 // Legacy 'widgets.php' screen + customizer.
9 widgets_shell = $( 'div#widgets-right' );
10
11 // For backwards compatibility
12 if ( 0 === widgets_shell.length ) {
13 widgets_shell = $( 'form#customize-controls' );
14 }
15 }
16
17 function setWidgetMargin( $widget ) {
18 var currentWidth, extra;
19
20 if ( $( 'body' ).hasClass( 'wp-customizer' ) ) {
21 // set the inside widget 2 top this way we can see the widget settings
22 $widget.find( '.widget-inside' ).css( 'top', 0 );
23
24 return;
25 }
26
27 if ( $widget.hasClass( 'expanded' ) ) {
28 // The expanded widget must be at least 400px wide in order to
29 // contain the visibility settings. IE wasn't handling the
30 // margin-left value properly.
31
32 if ( $widget.attr( 'style' ) ) {
33 $widget.data( 'original-style', $widget.attr( 'style' ) );
34 }
35
36 currentWidth = $widget.width();
37
38 if ( currentWidth < 400 ) {
39 extra = 400 - currentWidth;
40 if ( isRtl ) {
41 $widget
42 .css( 'position', 'relative' )
43 .css( 'right', '-' + extra + 'px' )
44 .css( 'width', '400px' );
45 } else {
46 $widget
47 .css( 'position', 'relative' )
48 .css( 'left', '-' + extra + 'px' )
49 .css( 'width', '400px' );
50 }
51 }
52 } else if ( $widget.data( 'original-style' ) ) {
53 // Restore any original inline styles when visibility is toggled off.
54 $widget.attr( 'style', $widget.data( 'original-style' ) ).data( 'original-style', null );
55 } else {
56 $widget.removeAttr( 'style' );
57 }
58 }
59
60 function moveWidgetVisibilityButton( $widget ) {
61 var $displayOptionsButton = $widget.find( 'a.display-options' ).first(),
62 $relativeWidget = $widget.find( 'input.widget-control-save' );
63
64 if ( 0 === $relativeWidget.length ) {
65 // The save button doesn't exist in gutenberg widget editor, the conditional HTML ought to be displayed
66 // last inside the widget options, so display the button before that.
67 $relativeWidget = $widget.find( 'div.widget-conditional' );
68 }
69 $displayOptionsButton.insertBefore( $relativeWidget );
70
71 // Widgets with no configurable options don't show the Save button's container.
72 $displayOptionsButton
73 .parent()
74 .removeClass( 'widget-control-noform' )
75 .find( '.spinner' )
76 .remove()
77 .css( 'float', 'left' )
78 .prependTo( $displayOptionsButton.parent() );
79 }
80
81 $( '.widget' ).each( function () {
82 moveWidgetVisibilityButton( $( this ) );
83 } );
84
85 $( document ).on( 'widget-added', function ( e, $widget ) {
86 if ( $widget.find( 'div.widget-control-actions a.display-options' ).length === 0 ) {
87 moveWidgetVisibilityButton( $widget );
88 }
89 } );
90
91 widgets_shell.on( 'click.widgetconditions', 'a.add-condition', function ( e ) {
92 var $condition = $( this ).closest( 'div.condition' ),
93 $conditionClone = $condition
94 .clone()
95 .data( 'rule-major', '' )
96 .data( 'rule-minor', '' )
97 .data( 'has-children', '' )
98 .insertAfter( $condition );
99
100 e.preventDefault();
101
102 $conditionClone.find( 'select.conditions-rule-major' ).val( '' );
103 $conditionClone.find( 'select.conditions-rule-minor' ).html( '' ).attr( 'disabled' );
104 $conditionClone
105 .find( 'span.conditions-rule-has-children' )
106 .hide()
107 .find( 'input[type="checkbox"]' )
108 .removeAttr( 'checked' );
109
110 resetRuleIndexes( $conditionClone.closest( '.conditions' ) );
111 } );
112
113 widgets_shell.on( 'click.widgetconditions', 'a.display-options', function ( e ) {
114 var $displayOptionsButton = $( this ),
115 $widget = $displayOptionsButton.closest( 'div.widget' );
116
117 e.preventDefault();
118
119 $widget.find( 'div.widget-conditional' ).toggleClass( 'widget-conditional-hide' );
120 $( this ).toggleClass( 'active' );
121 $widget.toggleClass( 'expanded' );
122 setWidgetMargin( $widget );
123
124 if ( $( this ).hasClass( 'active' ) ) {
125 $widget.find( 'input[name=widget-conditions-visible]' ).val( '1' );
126 $widget.find( '.condition' ).each( function () {
127 buildMinorConditions( $( this ) );
128 } );
129 } else {
130 $widget.find( 'input[name=widget-conditions-visible]' ).val( '0' );
131 }
132 } );
133
134 widgets_shell.on( 'click.widgetconditions', 'a.delete-condition', function ( e ) {
135 var $condition = $( this ).closest( 'div.condition' );
136
137 e.preventDefault();
138
139 if ( $condition.is( ':first-child' ) && $condition.is( ':last-child' ) ) {
140 $( this ).closest( 'div.widget' ).find( 'a.display-options' ).click();
141 $condition.find( 'select.conditions-rule-major' ).val( '' ).change();
142 } else {
143 $condition.find( 'select.conditions-rule-major' ).change();
144 $condition.detach();
145 }
146
147 resetRuleIndexes( $condition.closest( '.conditions' ) );
148 } );
149
150 widgets_shell.on( 'click.widgetconditions', 'div.widget-top', function () {
151 var $widget = $( this ).closest( 'div.widget' ),
152 $displayOptionsButton = $widget.find( 'a.display-options' );
153
154 if ( $displayOptionsButton.hasClass( 'active' ) ) {
155 $displayOptionsButton.attr( 'opened', 'true' );
156 }
157
158 if ( $displayOptionsButton.attr( 'opened' ) ) {
159 $displayOptionsButton.removeAttr( 'opened' );
160 $widget.toggleClass( 'expanded' );
161 setWidgetMargin( $widget );
162 }
163 } );
164
165 widgets_shell.on( 'change.widgetconditions', 'input.conditions-match-all', function () {
166 $( this )
167 .parents( '.widget-conditional' )
168 .toggleClass( 'conjunction' )
169 .toggleClass( 'intersection' );
170 } );
171
172 $( document ).on( 'change.widgetconditions', 'select.conditions-rule-major', function () {
173 var $conditionsRuleMajor = $( this ),
174 $conditionsRuleMinor = $conditionsRuleMajor.siblings( 'select.conditions-rule-minor:first' ),
175 $conditionsRuleHasChildren = $conditionsRuleMajor.siblings(
176 'span.conditions-rule-has-children'
177 ),
178 $condition = $conditionsRuleMinor.closest( '.condition' );
179
180 $condition.data( 'rule-minor', '' ).data( 'rule-major', $conditionsRuleMajor.val() );
181
182 if ( $conditionsRuleMajor.val() ) {
183 buildMinorConditions( $condition );
184 } else {
185 $conditionsRuleMajor
186 .siblings( 'select.conditions-rule-minor' )
187 .attr( 'disabled', 'disabled' )
188 .html( '' );
189 $conditionsRuleHasChildren.hide().find( 'input[type="checkbox"]' ).removeAttr( 'checked' );
190 }
191 } );
192
193 $( document ).on( 'change.widgetconditions', 'select.conditions-rule-minor', function () {
194 var $conditionsRuleMinor = $( this ),
195 $conditionsRuleMajor = $conditionsRuleMinor.siblings( 'select.conditions-rule-major' ),
196 $conditionsRuleHasChildren = $conditionsRuleMinor.siblings(
197 'span.conditions-rule-has-children'
198 ),
199 $condition = $conditionsRuleMinor.closest( '.condition' );
200
201 $condition.data( 'rule-minor', $conditionsRuleMinor.val() );
202
203 if ( $conditionsRuleMajor.val() === 'page' ) {
204 if ( $conditionsRuleMinor.val() in widget_conditions_parent_pages ) {
205 $conditionsRuleHasChildren.show();
206 } else {
207 $conditionsRuleHasChildren.hide().find( 'input[type="checkbox"]' ).removeAttr( 'checked' );
208 }
209 } else {
210 $conditionsRuleHasChildren.hide().find( 'input[type="checkbox"]' ).removeAttr( 'checked' );
211 }
212 } );
213
214 $( document ).on( 'widget-updated widget-synced', function ( e, widget ) {
215 widget.find( '.condition' ).each( function () {
216 buildMinorConditions( $( this ) );
217 } );
218 } );
219
220 function buildMinorConditions( condition ) {
221 var minor,
222 hasChildren,
223 majorData,
224 i,
225 j,
226 key,
227 val,
228 _len,
229 _jlen,
230 subkey,
231 subval,
232 optgroup,
233 select = condition.find( '.conditions-rule-minor' ).html( '' ),
234 major = condition.data( 'rule-major' );
235
236 // Disable the select, if major rule is empty or if it's a `post_type`.
237 // "Post Type" rule has been removed in Jetpack 4.7, and
238 // because it breaks all other rules we should `return`.
239 if ( ! major || 'post_type' === major ) {
240 select.attr( 'disabled', 'disabled' );
241 return;
242 }
243
244 minor = condition.data( 'rule-minor' );
245 hasChildren = condition.data( 'rule-has-children' );
246 majorData = widget_conditions_data[ major ];
247
248 for ( i = 0, _len = majorData.length; i < _len; i++ ) {
249 key = majorData[ i ][ 0 ];
250 val = majorData[ i ][ 1 ];
251
252 if ( typeof val === 'object' ) {
253 optgroup = $( '<optgroup/>' ).attr( 'label', key );
254
255 for ( j = 0, _jlen = val.length; j < _jlen; j++ ) {
256 subkey = majorData[ i ][ 1 ][ j ][ 0 ];
257 subval = majorData[ i ][ 1 ][ j ][ 1 ];
258
259 optgroup.append(
260 $( '<option/>' )
261 .val( subkey )
262 .text( decodeEntities( subval.replace( /&nbsp;/g, '\xA0' ) ) )
263 );
264 }
265
266 select.append( optgroup );
267 } else {
268 select.append(
269 $( '<option/>' )
270 .val( key )
271 .text( decodeEntities( val.replace( /&nbsp;/g, '\xA0' ) ) )
272 );
273 }
274 }
275
276 select.removeAttr( 'disabled' );
277 select.val( minor );
278
279 if ( 'page' === major && minor in widget_conditions_parent_pages ) {
280 select.siblings( 'span.conditions-rule-has-children' ).show();
281
282 if ( hasChildren ) {
283 select
284 .siblings( 'span.conditions-rule-has-children' )
285 .find( 'input[type="checkbox"]' )
286 .attr( 'checked', 'checked' );
287 }
288 } else {
289 select
290 .siblings( 'span.conditions-rule-has-children' )
291 .hide()
292 .find( 'input[type="checkbox"]' )
293 .removeAttr( 'checked' );
294 }
295 }
296
297 function resetRuleIndexes( widget ) {
298 var index = 0;
299 widget
300 .find( 'span.conditions-rule-has-children' )
301 .find( 'input[type="checkbox"]' )
302 .each( function () {
303 $( this ).attr( 'name', 'conditions[page_children][' + index + ']' );
304 index++;
305 } );
306 }
307
308 function decodeEntities( encodedString ) {
309 var textarea = document.createElement( 'textarea' );
310 textarea.innerHTML = encodedString;
311 return textarea.value;
312 }
313 } );
314