PluginProbe
Polylang / 3.1.4
Polylang v3.1.4
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
polylang / js / build / admin.js

admin.js in Polylang 3.1.4, at js/build/admin.js

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