PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 11.1.1
Jetpack – WP Security, Backup, Speed, & Growth v11.1.1
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 / plugin-search / plugin-search.js
jetpack / modules / plugin-search Last commit date
plugin-search.css 4 years ago plugin-search.js 5 years ago psh-128.png 7 years ago psh-256.png 7 years ago psh.svg 4 years ago
plugin-search.js
274 lines
1 /**
2 * Handles the activation of a Jetpack feature, dismissing the card, and replacing the bottom row
3 * of the card with customized content.
4 */
5
6 /* global jetpackPluginSearch, JSON, jpTracksAJAX */
7
8 var JetpackPSH = {};
9
10 ( function ( $, jpsh ) {
11 JetpackPSH = {
12 $pluginFilter: $( '#plugin-filter' ),
13
14 /**
15 * Get parent search hint element.
16 * @returns {Element | null}
17 */
18 getCard: function () {
19 return document.querySelector( '.plugin-card-jetpack-plugin-search' );
20 },
21
22 /**
23 * Track user event such as a click on a button or a link.
24 *
25 * @param {string} eventName Event identifier.
26 * @param {object} feature Identifier of feature involved in the event.
27 * @param {object} target Object where action was performed.
28 */
29 trackEvent: function ( eventName, feature, target ) {
30 jpTracksAJAX
31 .record_ajax_event( eventName, 'click', { feature: feature } )
32 .always( function () {
33 if ( 'undefined' !== typeof target && !! target.getAttribute( 'href' ) ) {
34 // If it has an href, follow it.
35 window.location = target.getAttribute( 'href' );
36 }
37 } );
38 },
39
40 /**
41 * Update title of the card to add a mention that the result is from the Jetpack plugin.
42 */
43 updateCardTitle: function () {
44 var hint = JetpackPSH.getCard();
45
46 if ( 'object' === typeof hint && null !== hint ) {
47 var title = hint.querySelector( '.column-name h3' );
48 title.outerHTML =
49 title.outerHTML + '<strong>' + jetpackPluginSearch.poweredBy + '</strong>';
50 }
51 },
52
53 /**
54 * Move action links below description.
55 */
56 moveActionLinks: function () {
57 var hint = JetpackPSH.getCard();
58 if ( 'object' === typeof hint && null !== hint ) {
59 var descriptionContainer = hint.querySelector( '.column-description' );
60 // Keep only the first paragraph. The second is the plugin author.
61 var descriptionText = descriptionContainer.querySelector( 'p:first-child' );
62 var actionLinks = hint.querySelector( '.action-links' );
63
64 // Change the contents of the description, to keep the description text and the action links.
65 descriptionContainer.innerHTML = descriptionText.outerHTML + actionLinks.outerHTML;
66
67 // Remove the action links from their default location.
68 actionLinks.parentNode.removeChild( actionLinks );
69 }
70 },
71
72 /**
73 * Replace bottom row of the card to insert logo, text and link to dismiss the card.
74 */
75 replaceCardBottom: function () {
76 var hint = JetpackPSH.getCard();
77 if ( 'object' === typeof hint && null !== hint ) {
78 hint.querySelector( '.plugin-card-bottom' ).outerHTML =
79 '<div class="jetpack-plugin-search__bottom"><img src="' +
80 jetpackPluginSearch.logo +
81 '" width="32" />' +
82 '<p class="jetpack-plugin-search__text">' +
83 jetpackPluginSearch.legend +
84 ' <a class="jetpack-plugin-search__support_link" href="' +
85 jetpackPluginSearch.supportLink +
86 '" target="_blank" rel="noopener noreferrer" data-track="support_link" >' +
87 jetpackPluginSearch.supportText +
88 '</a>' +
89 '</p>' +
90 '</div>';
91
92 // Remove link and parent li from action links and move it to bottom row
93 var dismissLink = document.querySelector( '.jetpack-plugin-search__dismiss' );
94 dismissLink.parentNode.parentNode.removeChild( dismissLink.parentNode );
95 document.querySelector( '.jetpack-plugin-search__bottom' ).appendChild( dismissLink );
96 }
97 },
98
99 /**
100 * Check if plugin card list nodes changed. If there's a Jetpack PSH card, replace the title and the bottom row.
101 * @param {array} mutationsList
102 */
103 replaceOnNewResults: function ( mutationsList ) {
104 mutationsList.forEach( function ( mutation ) {
105 if (
106 'childList' === mutation.type &&
107 1 === document.querySelectorAll( '.plugin-card-jetpack-plugin-search' ).length
108 ) {
109 JetpackPSH.updateCardTitle();
110 JetpackPSH.moveActionLinks();
111 JetpackPSH.replaceCardBottom();
112 }
113 } );
114 },
115
116 dismiss: function ( moduleName ) {
117 document.getElementById( 'the-list' ).removeChild( JetpackPSH.getCard() );
118 $.ajax( {
119 url: jpsh.base_rest_url + '/hints',
120 method: 'post',
121 beforeSend: function ( xhr ) {
122 xhr.setRequestHeader( 'X-WP-Nonce', jpsh.nonce );
123 },
124 data: JSON.stringify( {
125 hint: moduleName,
126 } ),
127 contentType: 'application/json',
128 dataType: 'json',
129 } ).done( function () {
130 JetpackPSH.trackEvent( 'wpa_plugin_search_dismiss', moduleName );
131 } );
132 },
133
134 ajaxActivateModule: function ( moduleName ) {
135 var $moduleBtn = JetpackPSH.$pluginFilter.find( '#plugin-select-activate' );
136 $moduleBtn.toggleClass( 'install-now updating-message' );
137 $moduleBtn.prop( 'disabled', true );
138 $moduleBtn.text( jpsh.activating );
139 var data = {};
140 data[ moduleName ] = true;
141 $.ajax( {
142 url: jpsh.base_rest_url + '/settings',
143 method: 'post',
144 beforeSend: function ( xhr ) {
145 xhr.setRequestHeader( 'X-WP-Nonce', jpsh.nonce );
146 },
147 data: JSON.stringify( data ),
148 contentType: 'application/json',
149 dataType: 'json',
150 } )
151 .done( function () {
152 JetpackPSH.updateButton( moduleName );
153 JetpackPSH.trackEvent( 'wpa_plugin_search_activate', moduleName );
154 } )
155 .error( function () {
156 $moduleBtn.toggleClass( 'install-now updating-message' );
157 } );
158 },
159
160 // Remove onclick handler, disable loading spinner, update button to redirect to module settings.
161 updateButton: function ( moduleName ) {
162 $.ajax( {
163 url: jpsh.base_rest_url + '/module/' + moduleName,
164 method: 'get',
165 beforeSend: function ( xhr ) {
166 xhr.setRequestHeader( 'X-WP-Nonce', jpsh.nonce );
167 },
168 dataType: 'json',
169 } ).done( function ( response ) {
170 var $moduleBtn = JetpackPSH.$pluginFilter.find( '#plugin-select-activate' );
171 $moduleBtn.prop( 'onclick', null ).off( 'click' );
172 $moduleBtn.toggleClass( 'install-now updating-message' );
173 $moduleBtn.text( jpsh.activated );
174 setTimeout( function () {
175 var url = 'https://jetpack.com/redirect/?source=plugin-hint-learn-' + moduleName,
176 label = jpsh.getStarted,
177 classes = 'jetpack-plugin-search__primary button',
178 track = 'configure';
179
180 // If the feature has options in Jetpack admin UI, link to them.
181 if ( response.options && 0 < Object.keys( response.options ).length ) {
182 url = $moduleBtn.data( 'configure-url' );
183 label = jpsh.manageSettings;
184 classes += ' jetpack-plugin-search__configure';
185 } else {
186 // If it has no options, the Get started button will be displayed so remove the Learn more link if it's there.
187 var learnMore = document.querySelector( '.jetpack-plugin-search__learn-more' );
188 learnMore.parentNode.removeChild( learnMore );
189 classes += ' jetpack-plugin-search__get-started';
190 track = 'get_started';
191 }
192 $moduleBtn.replaceWith(
193 '<a id="plugin-select-settings" class="' +
194 classes +
195 '" href="' +
196 url +
197 '" data-module="' +
198 moduleName +
199 '" data-track="' +
200 track +
201 '">' +
202 label +
203 '</a>'
204 );
205 }, 1000 );
206 } );
207 },
208
209 /**
210 * Start suggesting.
211 */
212 init: function () {
213 if ( JetpackPSH.$pluginFilter.length < 1 ) {
214 return;
215 }
216
217 // Update title to show that the suggestion is from Jetpack.
218 JetpackPSH.updateCardTitle();
219
220 // Update the description and action links.
221 JetpackPSH.moveActionLinks();
222
223 // Replace PSH bottom row on page load
224 JetpackPSH.replaceCardBottom();
225
226 // Listen for changes in plugin search results
227 var resultsObserver = new MutationObserver( JetpackPSH.replaceOnNewResults );
228 resultsObserver.observe( document.getElementById( 'plugin-filter' ), { childList: true } );
229
230 JetpackPSH.$pluginFilter
231 .on( 'click', '.jetpack-plugin-search__dismiss', function ( event ) {
232 event.preventDefault();
233 JetpackPSH.dismiss( $( this ).data( 'module' ) );
234 } )
235 .on( 'click', 'button#plugin-select-activate', function ( event ) {
236 event.preventDefault();
237 JetpackPSH.ajaxActivateModule( $( this ).data( 'module' ) );
238 } )
239 .on( 'click', '.jetpack-plugin-search__primary', function ( event ) {
240 event.preventDefault();
241 var $this = $( this );
242 if ( $this.data( 'track' ) ) {
243 // This catches Purchase, Configure, and Get started. Feature activation is tracked when it ends successfully, in its callback.
244 JetpackPSH.trackEvent(
245 'wpa_plugin_search_' + $this.data( 'track' ),
246 $this.data( 'module' ),
247 $this.get( 0 )
248 );
249 }
250 } )
251 .on( 'click', '.jetpack-plugin-search__learn-more', function ( event ) {
252 event.preventDefault();
253 var $this = $( this );
254 JetpackPSH.trackEvent(
255 'wpa_plugin_search_learn_more',
256 $this.data( 'module' ),
257 $this.get( 0 )
258 );
259 } )
260 .on( 'click', '.jetpack-plugin-search__support_link', function ( event ) {
261 event.preventDefault();
262 var $this = $( this );
263 JetpackPSH.trackEvent(
264 'wpa_plugin_search_support_link',
265 $this.data( 'module' ),
266 $this.get( 0 )
267 );
268 } );
269 },
270 };
271
272 JetpackPSH.init();
273 } )( jQuery, jetpackPluginSearch );
274