PluginProbe
Polylang / trunk
Polylang vtrunk
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
← All changes | js/build/admin.js +43 -401 3.0.3 → trunk View file →
@@ -1,416 +1,58 @@
1 +/******/ "use strict";
2 +
3 +;// ./js/src/lib/ajax-filter/index.js
1 4 /**
2 5 * @package Polylang
3 6 */
4 7
5 -jQuery(
6 - function( $ ) {
8 +/**
9 + * Adds data to all ajax requests made with jQuery.
10 + *
11 + * @since 3.7
12 + *
13 + * @param {Object} data The data to add.
14 + * @returns {void}
15 + */
16 +function ajaxFilter( data ) {
17 + if ( 'undefined' === typeof jQuery || ! data ) {
18 + return;
19 + }
7 20
8 - // languages list table
9 - // accessibility to row actions on focus
10 - // mainly copy paste of WP code from common.js
11 - var transitionTimeout;
12 - $( 'table.languages' ).on(
13 - { // restricted to languages list table
14 - focusin: function() {
15 - clearTimeout( transitionTimeout );
16 - var focusedRowActions = $( this ).find( '.row-actions' );
17 - // transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help.
18 - $( '.row-actions' ).not( this ).removeClass( 'visible' );
19 - focusedRowActions.addClass( 'visible' );
20 - },
21 - focusout: function() {
22 - // Tabbing between post title and .row-actions links needs a brief pause, otherwise
23 - // the .row-actions div gets hidden in transit in some browsers ( ahem, Firefox ).
24 - transitionTimeout = setTimeout(
25 - function() {
26 - focusedRowActions.removeClass( 'visible' );
27 - },
28 - 30
29 - );
30 - }
31 - },
32 - 'tr'
33 - ); // acts on the whole tr instead of single td as we have actions links in several columns
21 + const dataStr = jQuery.param( data );
34 22
35 - /**
36 - * Common functions and variables for overriding languages and flags dropdown list by a jQuery UI selectmenu widget.
37 - */
38 -
39 - // Add a boolean variable to be able to check jQuery UI >= 1.12 which is introduced in WP 5.6.
40 - // Backward compatibility WP < 5.6
41 - var isJqueryUImin112 = $.ui.version >= '1.12.0';
42 - // Allow to check if a flag list dropdown is present. Not present in the Wizard steps or other settings page.
43 - var flagListExist = $( "#flag_list" ).length;
44 - // Allow to check if a language list dropdown is present. Not present in other settings page.
45 - var langListExist = $( "#lang_list" ).length;
46 - // jQuery UI selectmenu widget width option
47 - var defaultSelectmenuWidth = '95%';
48 - var wizardSelectmenuWidth = '100%';
49 -
50 - // Inject flag image when jQuery UI selectmenu is created or an item is selected.
51 - // jQuery UI 1.12 introduce a wrapper inside de li tag which is necessary to selectmenu widget to work correctly.
52 - // Mainly copy from the orginal jQuery UI 1.12 selectmenu widget _renderItem method.
53 - // Note this code works fine with jQuery UI 1.11.4 too.
54 - var selectmenuRenderItem = function( ul, item ) {
55 - var li = $( '<li>' );
56 - var wrapper = $( '<div>');
57 -
58 - if ( item.disabled ) {
59 - this._addClass( li, null, "ui-state-disabled" );
60 - }
61 - this._setText( wrapper, item.label );
62 -
63 - // Add the flag from the data attribute in the selected element.
64 - wrapper.prepend( $( item.element ).data( 'flag-html' ) );
65 - wrapper.children( 'img' ).addClass( 'ui-icon' );
66 -
67 - return li.append( wrapper ).appendTo( ul );
68 - };
69 - // Override selected item to inject flag for jQuery UI less than 1.12.
70 - var selectmenuRefreshButtonText = function( selectElement ) {
71 - var buttonText = $( selectElement ).selectmenu( 'instance' ).buttonText;
72 - buttonText.prepend( $( selectElement ).children( ':selected' ).data( 'flag-html' ) );
73 - buttonText.children( 'img' ).addClass( 'ui-icon' );
74 - };
75 - // Override selected item since jQuery UI 1.12 which introduces extension point method _renderButtonItem.
76 - // @see https://api.jqueryui.com/1.12/selectmenu/#method-_renderButtonItem _renderButtonItem documentation.
77 - var selectmenuRenderButtonItem = function ( selectElement ) {
78 - var buttonItem = $( '<span>' );
79 - this._setText( buttonItem, selectElement.label );
80 - this._addClass( buttonItem, "ui-selectmenu-text" );
81 -
82 - // Add the flag from the data attribute in the selected element.
83 - buttonItem.prepend( $( selectElement.element ).data( 'flag-html' ) );
84 - buttonItem.children( 'img' ).addClass( 'ui-icon' );
85 -
86 - return buttonItem;
23 + jQuery.ajaxPrefilter( function ( options ) {
24 + if ( -1 === options.url.indexOf( ajaxurl ) && -1 === ajaxurl.indexOf( options.url ) ) {
25 + return;
87 26 }
88 27
89 - /**
90 - * Initialize a jQuery UI selectmenu widget on a DOM element
91 - *
92 - * @param {*} element - The jQuery object representing the DOM element to attach the widget with.
93 - * @param {*} config - All the parameters - options and callbacks - necessary to configure the jQuery UI selectmenu widget.
94 - * @return {Object} - The jQuery UI selectmenu widget object instance.
95 - */
96 - function initializeSelectmenuWidget( element, config ) {
97 - // Create the jQuery UI selectmenu widget for flags list dropdown and return its instance.
98 - var selectmenuWidgetInstance = element.selectmenu( config ).selectmenu( 'instance' );
99 - // Overrides each item in the jQuery UI selectmenu list by injecting flag image.
100 - selectmenuWidgetInstance._renderItem = selectmenuRenderItem;
101 - // Override the selected item rendering for jQuery UI 1.12
102 - if ( isJqueryUImin112 ) {
103 - selectmenuWidgetInstance._renderButtonItem = selectmenuRenderButtonItem;
104 - // Need to refresh to take in account the new button item rendering method after the selectmenu widget instanciaion.
105 - selectmenuWidgetInstance.refresh();
28 + if (
29 + 'undefined' === typeof options.data ||
30 + null === options.data ||
31 + 'string' === typeof options.data && '' === options.data.trim()
32 + ) {
33 + // An empty string or null/undefined.
34 + options.data = dataStr;
35 + } else if ( 'string' === typeof options.data ) {
36 + // A non-empty string: can be a JSON string or a query string.
37 + try {
38 + options.data = JSON.stringify( Object.assign( JSON.parse( options.data ), data ) );
39 + } catch ( exception ) {
40 + // A non-empty non-JSON string is considered a query string.
41 + options.data = `${ options.data }&${ dataStr }`;
106 42 }
107 - return selectmenuWidgetInstance
43 + } else if ( jQuery.isPlainObject( options.data ) ) {
44 + // An object.
45 + options.data = Object.assign( options.data, data );
108 46 }
109 - /**
110 - * Selectmenu widget common parameters for its configuration: options and callbacks.
111 - */
47 + } );
48 +}
112 49
113 - // Selectmenu widget options
114 - var selectmenuOptions = {
115 - width: defaultSelectmenuWidth,
116 - classes: {
117 - 'ui-selectmenu-menu': 'pll-selectmenu-menu',
118 - 'ui-selectmenu-button': 'pll-selectmenu-button',
119 - }
120 - };
50 +;// ./js/src/admin.js
51 +/**
52 + * @package Polylang
53 + */
121 54
122 - // Selectmenu widget callbacks
123 - var selectmenuFlagListCallbacks = {};
124 - // Callbacks when Selectmenu widget create or select event is triggered.
125 - var createSelectCallback = function( event, ui ) {
126 - selectmenuRefreshButtonText( event.target );
127 - }
128 55
129 - /**
130 - * Overrides the flag dropdown list with our customized jquery ui selectmenu.
131 - */
132 56
133 - // Callbacks when Selectmenu widget change or open event is triggered.
134 - // Needed to correctly refresh the selected element in the list when editing an existing language or when the value change is triggered by the language choice.
135 - // jQuery UI 1.11 callback version.
136 - var changeOpenCallback = function( event, ui ){
137 - selectmenuRefreshButtonText( $( event.target ).selectmenu( 'refresh' ) );
138 - }
139 - // jQueryUI 1.12 callback version.
140 - var changeOpenCallbackjQueryUI112 = function( event, ui ){
141 - // Just a refresh of the menu is needed with jQuery UI 1.12 because _renderButtonItem is triggered and then inject correctly the flag.
142 - $( event.target ).selectmenu( 'refresh' );
143 - }
144 - // There is no need of create and select callbacks with jQuery UI 1.12 because overriding _renderButtonItem method do the job.
145 - if ( isJqueryUImin112 ) {
146 - selectmenuFlagListCallbacks =
147 - {
148 - change: changeOpenCallbackjQueryUI112,
149 - open: changeOpenCallbackjQueryUI112,
150 - };
151 - } else {
152 - selectmenuFlagListCallbacks = {
153 - create: createSelectCallback,
154 - select: createSelectCallback,
155 - change: changeOpenCallback,
156 - open: changeOpenCallback,
157 - };
158 - }
159 -
160 - // Create the selectmenu widget only if the field is present.
161 - if ( flagListExist ) {
162 - // Create the jQuery UI selectmenu widget for flags list dropdown and return its instance.
163 - var selectmenuFlagList = initializeSelectmenuWidget( $( '#flag_list' ), Object.assign( {}, selectmenuOptions, selectmenuFlagListCallbacks ) );
164 - $( '#lang_list' ).on(
165 - 'languageChanged',
166 - function( event, flag ) {
167 - // Refresh the flag field
168 - selectmenuFlagList.element.val( flag );
169 - selectmenuFlagList._trigger( 'change' );
170 - }
171 - );
172 - }
173 -
174 - /**
175 - * Language choice in predefined languages in Polylang Languages settings page and wizard.
176 - * Overrides the predefined language dropdown list with our customized jQuery ui selectmenu widget.
177 - */
178 -
179 - /**
180 - * Fill the other language form fields from the language element selected in the language list dropdown.
181 - *
182 - * @param {Object} language - language object of the selected element in the language list dropdown.
183 - */
184 - function fillLanguageFields( language ) {
185 - $( '#lang_slug' ).val( language.slug );
186 - $( '#lang_locale' ).val( language.locale );
187 - $( 'input[name="rtl"]' ).val( language.rtl );
188 - $( '#lang_name' ).val( language.name );
189 - }
190 -
191 - /**
192 - * Parse selected language element in the language list dropdown.
193 - *
194 - * @param {object} event - jQuery triggered event.
195 - * @return {object} The language object with its named properties.
196 - */
197 - function parseSelectedLanguage( event ) {
198 - var selectedElement = $('option:selected', event.target);
199 - var values = selectedElement.val().split(':')
200 - return {
201 - slug: values[0],
202 - locale: values[1],
203 - rtl: [values[2]],
204 - flag: values[3],
205 - name: selectedElement.text().split(' - ')[0] // At the moment there is no need of the 2nd part because it corresponds on the locale which is already known by splitting the selected element value
206 - };
207 - }
208 -
209 - // Callback when selectmenu widget change event is triggered.
210 - var changeCallback = function( event, ui ) {
211 - var language = parseSelectedLanguage( event );
212 -
213 - fillLanguageFields( language );
214 -
215 - $( event.target ).trigger( 'languageChanged', language.flag );
216 - };
217 -
218 - // Create the jQuery UI selectmenu widget languages list dropdown and return its instance.
219 - var selectmenuLangListCallbacks = {};
220 - // For the wizard we need a 100% width. So we override the previous defined value of selectmenuOptions.
221 - if( $( '#lang_list' ).closest( '.pll-wizard-content' ).length > 0 ) {
222 - selectmenuOptions = Object.assign( selectmenuOptions, { width: wizardSelectmenuWidth } );
223 - }
224 -
225 - // There is no need of create and select callbacks with jQuery UI 1.12 because overrinding _renderButtonItem method do the job.
226 - if ( isJqueryUImin112 ) {
227 - selectmenuLangListCallbacks = {
228 - change: changeCallback,
229 - };
230 - } else {
231 - selectmenuLangListCallbacks = {
232 - create: createSelectCallback,
233 - select: createSelectCallback,
234 - change: changeCallback,
235 - };
236 - }
237 - if ( langListExist ) {
238 - initializeSelectmenuWidget( $( '#lang_list' ), Object.assign( {}, selectmenuOptions, selectmenuLangListCallbacks ) );
239 - }
240 -
241 - // strings translations
242 - // save translations when pressing enter
243 - $( '.translation input' ).on(
244 - 'keydown',
245 - function( event ){
246 - if ( 'Enter' === event.key ) {
247 - event.preventDefault();
248 - $( '#submit' ).trigger( 'click' );
249 - }
250 - }
251 - );
252 -
253 - // settings page
254 - // click on configure link
255 - $( '#the-list' ).on(
256 - 'click',
257 - '.configure>a',
258 - function(){
259 - $( '.pll-configure' ).hide().prev().show();
260 - $( this ).closest( 'tr' ).hide().next().show();
261 - return false;
262 - }
263 - );
264 -
265 - // cancel
266 - $( '#the-list' ).on(
267 - 'click',
268 - '.cancel',
269 - function(){
270 - $( this ).closest( 'tr' ).hide().prev().show();
271 - }
272 - );
273 -
274 - // save settings
275 - $( '#the-list' ).on(
276 - 'click',
277 - '.save',
278 - function(){
279 - var tr = $( this ).closest( 'tr' );
280 - var parts = tr.attr( 'id' ).split( '-' );
281 -
282 - var data = {
283 - action: 'pll_save_options',
284 - pll_ajax_settings: true,
285 - module: parts[parts.length - 1],
286 - _pll_nonce: $( '#_pll_nonce' ).val()
287 - };
288 -
289 - data = tr.find( ':input' ).serialize() + '&' + $.param( data );
290 -
291 - $.post(
292 - ajaxurl,
293 - data,
294 - function( response ) {
295 - var res = wpAjax.parseAjaxResponse( response, 'ajax-response' );
296 - $.each(
297 - res.responses,
298 - function() {
299 - switch ( this.what ) {
300 - case 'license-update':
301 - $( '#pll-license-' + this.data ).replaceWith( this.supplemental.html );
302 - break;
303 - case 'success':
304 - tr.hide().prev().show(); // close only if there is no error
305 - case 'error':
306 - $( '.settings-error' ).remove(); // remove previous messages if any
307 - $( 'h1' ).after( this.data );
308 -
309 - // Make notices dismissible
310 - // copy paste of common.js from WP 4.2.2
311 - $( '.notice.is-dismissible' ).each(
312 - function() {
313 - var $this = $( this ),
314 - $button = $( '<button type="button" class="notice-dismiss"><span class="screen-reader-text"></span></button>' ),
315 - btnText = pll_admin.dismiss_notice || '';
316 -
317 - // Ensure plain text
318 - $button.find( '.screen-reader-text' ).text( btnText );
319 -
320 - // Whitelist because of how the button is built. See above
321 - $this.append( $button ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
322 -
323 - $button.on(
324 - 'click.wp-dismiss-notice',
325 - function( event ) {
326 - event.preventDefault();
327 - $this.fadeTo(
328 - 100,
329 - 0,
330 - function() {
331 - $( this ).slideUp(
332 - 100,
333 - function() {
334 - $( this ).remove();
335 - }
336 - );
337 - }
338 - );
339 - }
340 - );
341 - }
342 - );
343 - break;
344 - }
345 - }
346 - );
347 - }
348 - );
349 - }
350 - );
351 -
352 - // act when pressing enter or esc in configurations
353 - $( '.pll-configure' ).on(
354 - 'keydown',
355 - function( event ){
356 - if ( 'Enter' === event.key ) {
357 - event.preventDefault();
358 - $( this ).find( '.save' ).trigger( 'click' );
359 - }
360 -
361 - if ( 'Escape' === event.key ) {
362 - event.preventDefault();
363 - $( this ).find( '.cancel' ).trigger( 'click' );
364 - }
365 - }
366 - );
367 -
368 - // settings URL modifications
369 - // manages visibility of fields
370 - $( "input[name='force_lang']" ).on(
371 - 'change',
372 - function() {
373 - function pll_toggle( a, test ) {
374 - test ? a.show() : a.hide();
375 - }
376 -
377 - var value = $( this ).val();
378 - pll_toggle( $( '#pll-domains-table' ), 3 == value );
379 - pll_toggle( $( "#pll-hide-default" ), 3 > value );
380 - pll_toggle( $( "#pll-rewrite" ), 2 > value );
381 - pll_toggle( $( "#pll-redirect-lang" ), 2 > value );
382 - }
383 - );
384 -
385 - // settings license
386 - // deactivate button
387 - $( '.pll-deactivate-license' ).on(
388 - 'click',
389 - function() {
390 - var data = {
391 - action: 'pll_deactivate_license',
392 - pll_ajax_settings: true,
393 - id: $( this ).attr( 'id' ),
394 - _pll_nonce: $( '#_pll_nonce' ).val()
395 - };
396 - $.post(
397 - ajaxurl,
398 - data,
399 - function( response ){
400 - $( '#pll-license-' + response.id ).replaceWith( response.html );
401 - }
402 - );
403 - }
404 - );
405 -
406 - // Manage closing the metabox.
407 - // close postboxes that should be closed
408 - $( '.if-js-closed' ).removeClass( 'if-js-closed' ).addClass( 'closed' );
409 - // postboxes setup
410 - if ( 'undefined' !== typeof postboxes ) {
411 - postboxes.add_postbox_toggles( pagenow );
412 - }
413 - }
414 -);
415 -
57 +ajaxFilter( pll_admin?.ajax_filter );
416 58