PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.2.3
Jetpack – WP Security, Backup, Speed, & Growth v12.2.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 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 / contact-form / js / grunion-admin.js
jetpack / modules / contact-form / js Last commit date
dropdown.js 3 years ago editor-view.js 6 years ago grunion-admin.js 3 years ago grunion-frontend.js 6 years ago grunion.js 6 years ago tinymce-plugin-form-button.js 6 years ago
grunion-admin.js
314 lines
1 /* global ajaxurl jetpack_empty_spam_button_parameters */
2 jQuery( function ( $ ) {
3 if ( typeof jetpack_empty_spam_button_parameters !== 'undefined' ) {
4 // Create the "Empty Spam" button and add it above and below the list of spam feedbacks.
5 var jetpack_empty_spam_feedbacks_button_container = $( '<div/>' ).addClass(
6 'jetpack-empty-spam-container'
7 );
8
9 var jetpack_empty_spam_feedbacks_button = $( '<a />' )
10 .addClass( 'button-secondary' )
11 .addClass( 'jetpack-empty-spam' )
12 .attr( 'href', '#' )
13 .attr( 'data-progress-label', jetpack_empty_spam_button_parameters.progress_label )
14 .attr( 'data-success-url', jetpack_empty_spam_button_parameters.success_url )
15 .attr( 'data-failure-url', jetpack_empty_spam_button_parameters.failure_url )
16 .attr( 'data-spam-feedbacks-count', jetpack_empty_spam_button_parameters.spam_count )
17 .attr( 'data-nonce', jetpack_empty_spam_button_parameters.nonce )
18 .text( jetpack_empty_spam_button_parameters.label );
19 jetpack_empty_spam_feedbacks_button_container.append( jetpack_empty_spam_feedbacks_button );
20
21 var jetpack_empty_spam_feedbacks_spinner = $( '<span />' ).addClass(
22 'jetpack-empty-spam-spinner'
23 );
24 jetpack_empty_spam_feedbacks_button_container.append( jetpack_empty_spam_feedbacks_spinner );
25
26 // Add the button both above and below the list of spam feedbacks.
27 $( '.tablenav.top .actions, .tablenav.bottom .actions' )
28 .not( '.bulkactions' )
29 .append( jetpack_empty_spam_feedbacks_button_container );
30 }
31
32 $( document ).on( 'click', '#jetpack-check-feedback-spam:not(.button-disabled)', function ( e ) {
33 e.preventDefault();
34
35 $( '#jetpack-check-feedback-spam:not(.button-disabled)' ).addClass( 'button-disabled' );
36 $( '.jetpack-check-feedback-spam-spinner' ).addClass( 'spinner' ).show();
37 grunion_check_for_spam( 0, 100 );
38 } );
39
40 function grunion_check_for_spam( offset, limit ) {
41 var nonceName = $( '#jetpack-check-feedback-spam' ).data( 'nonce-name' );
42 var nonce = $( '#' + nonceName ).attr( 'value' );
43 var failureUrl = $( '#jetpack-check-feedback-spam' ).data( 'failure-url' );
44
45 var requestOptions = {
46 action: 'grunion_recheck_queue',
47 offset: offset,
48 limit: limit,
49 };
50 requestOptions[ nonceName ] = nonce;
51
52 $.post( ajaxurl, requestOptions )
53 .fail( function () {
54 // An error is only returned in the case of a missing nonce or invalid permissions, so we don't need the actual error message.
55 window.location.href = failureUrl;
56 return;
57 } )
58 .done( function ( result ) {
59 if ( result.processed < limit ) {
60 window.location.reload();
61 } else {
62 grunion_check_for_spam( offset + limit, limit );
63 }
64 } );
65 }
66
67 var initial_spam_count = 0;
68 var deleted_spam_count = 0;
69
70 $( document ).on( 'click', '.jetpack-empty-spam', function ( e ) {
71 e.preventDefault();
72
73 if ( $( this ).hasClass( 'button-disabled' ) ) {
74 // An Emptying process is already underway or the button is otherwise disabled.
75 return;
76 }
77
78 $( '.jetpack-empty-spam' ).addClass( 'button-disabled' ).addClass( 'emptying' );
79 $( '.jetpack-empty-spam-spinner' ).addClass( 'spinner' ).addClass( 'is-active' );
80
81 // Update the label on the "Empty Spam" button to use the active "Emptying Spam" language.
82 $( '.jetpack-empty-spam' ).text(
83 $( '.jetpack-empty-spam' ).data( 'progress-label' ).replace( '%1$s', '0' )
84 );
85
86 initial_spam_count = parseInt( $( this ).data( 'spam-feedbacks-count' ), 10 );
87
88 grunion_delete_spam();
89 } );
90
91 function grunion_delete_spam() {
92 var empty_spam_buttons = $( '.jetpack-empty-spam' );
93
94 var nonce = empty_spam_buttons.data( 'nonce' );
95
96 // We show the percentage complete down to one decimal point so even with 100k
97 // spam feedbacks, it will show some progress pretty quickly.
98 var percentage_complete = Math.round( ( deleted_spam_count / initial_spam_count ) * 1000 ) / 10;
99
100 // Update the progress counter on the "Check for Spam" button.
101 empty_spam_buttons.text(
102 empty_spam_buttons.data( 'progress-label' ).replace( '%1$s', percentage_complete )
103 );
104
105 $.post( ajaxurl, {
106 action: 'jetpack_delete_spam_feedbacks',
107 nonce: nonce,
108 } )
109 .fail( function ( result ) {
110 // An error is only returned in the case of a missing nonce or invalid permissions, so we don't need the actual error message.
111 window.location.href = empty_spam_buttons.data( 'failure-url' );
112 return;
113 } )
114 .done( function ( result ) {
115 deleted_spam_count += result.data.counts.deleted;
116
117 if ( result.data.counts.deleted < result.data.counts.limit ) {
118 window.location.href = empty_spam_buttons.data( 'success-url' );
119 } else {
120 grunion_delete_spam();
121 }
122 } );
123 }
124
125 // Async handling for response table actions
126 $( document ).ready( function () {
127 function updateStatus( postId, status, indicatorColor ) {
128 $.post(
129 ajaxurl,
130 {
131 action: 'grunion_ajax_spam',
132 post_id: postId,
133 make_it: status,
134 sub_menu: jQuery( '.subsubsub .current' ).attr( 'href' ),
135 _ajax_nonce: window.__grunionPostStatusNonce,
136 },
137 function ( response ) {
138 $( '#post-' + postId )
139 .css( { backgroundColor: indicatorColor } )
140 .fadeOut( 350, function () {
141 $( this ).remove();
142 $( '.subsubsub' ).html( response );
143 } );
144 }
145 );
146 }
147
148 $( 'tr.type-feedback .row-actions a' ).click( function ( e ) {
149 e.preventDefault();
150
151 var postRowId = $( e.target ).closest( 'tr.type-feedback' ).attr( 'id' );
152 var match = postRowId.match( /^post\-(\d+)/ );
153
154 if ( ! match ) {
155 return;
156 }
157
158 var postId = parseInt( match[ 1 ], 10 );
159
160 if ( $( e.target ).parent().hasClass( 'spam' ) ) {
161 e.preventDefault();
162 updateStatus( postId, 'spam', '#FF7979' );
163 }
164
165 if ( $( e.target ).parent().hasClass( 'trash' ) ) {
166 e.preventDefault();
167 updateStatus( postId, 'trash', '#FF7979' );
168 }
169
170 if ( $( e.target ).parent().hasClass( 'unspam' ) ) {
171 e.preventDefault();
172 updateStatus( postId, 'ham', '#59C859' );
173 }
174
175 if ( $( e.target ).parent().hasClass( 'untrash' ) ) {
176 e.preventDefault();
177 updateStatus( postId, 'publish', '#59C859' );
178 }
179 } );
180 } );
181
182 function startPollingConnection( { name, value } ) {
183 let hasConnection = false;
184 let replacementHtml = null;
185 let interval = setInterval( function () {
186 if ( hasConnection ) {
187 return;
188 }
189 $.post(
190 ajaxurl,
191 {
192 action: 'grunion_gdrive_connection',
193 [ name ]: value,
194 },
195 function ( data ) {
196 if ( data && data.connection && data.html ) {
197 clearInterval( interval );
198 hasConnection = true;
199 replacementHtml = $( data.html );
200 $( '#jetpack-form-responses-connect' ).replaceWith( replacementHtml );
201 }
202 }
203 ).fail( function () {
204 clearInterval( interval );
205 } );
206 }, 5000 );
207 }
208
209 $( document ).on( 'click', '#jetpack-form-responses-connect', function () {
210 const $this = $( this );
211 const name = $this.data( 'nonce-name' );
212 const value = $( '#' + name ).attr( 'value' );
213 $this.attr( 'disabled', 'disabled' );
214 $this.text(
215 ( window.exportParameters && window.exportParameters.waitingConnection ) ||
216 'Waiting for connection...'
217 );
218 startPollingConnection( { name, value } );
219 } );
220
221 // Handle export to Google Drive
222 $( document ).on( 'click', '#jetpack-export-feedback-gdrive', function ( event ) {
223 event.preventDefault();
224 var $btn = $( event.target );
225 var nonceName = $btn.data( 'nonce-name' );
226 var nonce = $( '#' + nonceName ).attr( 'value' );
227 var date = window.location.search.match( /(\?|\&)m=(\d+)/ );
228 var post = window.location.search.match( /(\?|\&)jetpack_form_parent_id=(\d+)/ );
229
230 var selected = [];
231 $( '#posts-filter .check-column input[type=checkbox]:checked' ).each( function () {
232 selected.push( parseInt( $( this ).attr( 'value' ), 10 ) );
233 } );
234
235 var errorMessage =
236 ( window.exportParameters && window.exportParameters.exportError ) ||
237 'There was an error exporting your results';
238
239 $btn.attr( 'disabled', 'disabled' );
240 $.post(
241 ajaxurl,
242 {
243 action: 'grunion_export_to_gdrive',
244 year: date ? date[ 2 ].substr( 0, 4 ) : '',
245 month: date ? date[ 2 ].substr( 4, 2 ) : '',
246 post: post ? parseInt( post[ 2 ], 10 ) : 'all',
247 selected: selected,
248 [ nonceName ]: nonce,
249 },
250 function ( payload, status ) {
251 if ( status === 'success' && payload.data && payload.data.sheet_link ) {
252 window.open( payload.data.sheet_link, '_blank' );
253 }
254 }
255 )
256 .fail( function () {
257 window.alert( errorMessage );
258 } )
259 .always( function () {
260 $btn.removeAttr( 'disabled' );
261 } );
262 } );
263
264 // Handle export to CSV
265 $( document ).on( 'click', '#jetpack-export-feedback-csv', function ( e ) {
266 e.preventDefault();
267
268 var nonceName = $( e.target ).data( 'nonce-name' );
269 var nonce = $( '#' + nonceName ).attr( 'value' );
270
271 var date = window.location.search.match( /(\?|\&)m=(\d+)/ );
272 var post = window.location.search.match( /(\?|\&)jetpack_form_parent_id=(\d+)/ );
273
274 var selected = [];
275 $( '#posts-filter .check-column input[type=checkbox]:checked' ).each( function () {
276 selected.push( parseInt( $( this ).attr( 'value' ), 10 ) );
277 } );
278
279 $.post(
280 ajaxurl,
281 {
282 action: 'feedback_export',
283 year: date ? date[ 2 ].substr( 0, 4 ) : '',
284 month: date ? date[ 2 ].substr( 4, 2 ) : '',
285 post: post ? parseInt( post[ 2 ], 10 ) : 'all',
286 selected: selected,
287 [ nonceName ]: nonce,
288 },
289 function ( response, status, xhr ) {
290 var blob = new Blob( [ response ], { type: 'application/octetstream' } );
291 var a = document.createElement( 'a' );
292 a.href = window.URL.createObjectURL( blob );
293
294 // Get filename from backend headers
295 var contentDispositionHeader = xhr.getResponseHeader( 'content-disposition' );
296 a.download =
297 contentDispositionHeader.split( 'filename=' )[ 1 ] || 'Jetpack Form Responses.csv';
298
299 document.body.appendChild( a );
300 a.click();
301 document.body.removeChild( a );
302 window.URL.revokeObjectURL( a.href );
303 }
304 );
305 } );
306
307 // modal opener
308 $( document ).on( 'click', '#export-modal-opener', function ( event ) {
309 const button = $( this );
310 event.preventDefault();
311 window.tb_show( button.html(), button.attr( 'href' ) );
312 } );
313 } );
314