PluginProbe
Polylang / 2.5
Polylang v2.5
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/admin.js +168 -244 2.82.5 View file →
@@ -1,271 +1,195 @@
1 -/**
2 - * @package Polylang
3 - */
1 +jQuery( document ).ready(function( $ ) {
2 + var transitionTimeout;
4 3
5 -jQuery( document ).ready(
6 - function( $ ) {
7 - var transitionTimeout;
4 + // languages list table
5 + // accessibility to row actions on focus
6 + // mainly copy paste of WP code from common.js
7 + $( 'table.languages' ).on({ // restricted to languages list table
8 + focusin: function() {
9 + clearTimeout( transitionTimeout );
10 + focusedRowActions = $( this ).find( '.row-actions' );
11 + // transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help.
12 + $( '.row-actions' ).not( this ).removeClass( 'visible' );
13 + focusedRowActions.addClass( 'visible' );
14 + },
15 + focusout: function() {
16 + // Tabbing between post title and .row-actions links needs a brief pause, otherwise
17 + // the .row-actions div gets hidden in transit in some browsers ( ahem, Firefox ).
18 + transitionTimeout = setTimeout(function() {
19 + focusedRowActions.removeClass( 'visible' );
20 + }, 30 );
21 + }
22 + }, 'tr' ); // acts on the whole tr instead of single td as we have actions links in several columns
8 23
9 - // languages list table
10 - // accessibility to row actions on focus
11 - // mainly copy paste of WP code from common.js
12 - $( 'table.languages' ).on(
13 - { // restricted to languages list table
14 - focusin: function() {
15 - clearTimeout( transitionTimeout );
16 - 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
24 + // extends selectmenu to add flags in menu items
25 + $.widget( "custom.iconselectmenu", $.ui.selectmenu, {
26 + _renderItem: function( ul, item ) {
27 + var li = $( "<li>", { text: item.label } );
28 + var el = $( item.element );
29 + var url = el.data( "url" );
34 30
35 - // Common functions for overriding language and flag dropdown list.
36 - var selectmenuRenderItem = function( wrapper, item ) {
37 - var li = $( '<li>' ).text( item.label ).prepend( $( item.element ).data( 'flag-html' ) );
38 - li.children( 'img' ).addClass( 'ui-icon' );
39 - return li.appendTo( wrapper );
40 - };
41 - var selectmenuRefreshButtonText = function( selectElement ) {
42 - var buttonText = $( selectElement ).selectmenu( 'instance' ).buttonText;
43 - buttonText.prepend( $( selectElement ).children( ':selected' ).data( 'flag-html' ) );
44 - buttonText.children( 'img' ).addClass( 'ui-icon' );
45 - };
46 - // Overrides the flag dropdown list with our customized jquery ui selectmenu.
31 + if ( url ) {
32 + var w = el.data( "width" );
33 + var h = el.data( "height" );
34 + $( "<img class='ui-icon' />" ).prop( "src", url ).prop( "width", w ).prop( "height", h ).appendTo( li );
35 + }
47 36
48 - // Inject flag image when jQuery UI selectmenu is created or an item is selected.
49 - $( '#flag_list' ).on(
50 - 'selectmenucreate selectmenuselect',
51 - function(){
52 - selectmenuRefreshButtonText( this );
53 - }
54 - );
55 - // Refresh jQuery UI selectmenu when the value is changed programmatically: select another language or edit an existing language.
56 - // For putting the focus in the list on the selected item and injecting the right flag on the selected item.
57 - $( '#flag_list' ).on(
58 - 'selectmenuopen',
59 - function(){
60 - $( this ).selectmenu( 'refresh' ).trigger( 'selectmenuselect' );
61 - }
62 - );
63 - // Create the jQuery UI selectmenu widget
64 - $( '#flag_list' ).selectmenu( { width: '100%' } );
65 - // Overrides each item in the jQuery UI selectmenu list by injecting flag image.
66 - $( '#flag_list' ).selectmenu( 'instance' )._renderItem = selectmenuRenderItem;
37 + return li.appendTo( ul );
38 + }
39 + });
67 40
68 - // Language choice in predefined languages in Polylang Languages settings page and wizard.
69 - // Overrides the predefined language dropdown list with our customized jquery ui selectmenu.
41 + // allows to display the flag for the selected menu item
42 + function add_icon( event, ui ) {
43 + var sel = $( this ).find( ":selected" );
44 + var url = sel.data( "url" );
70 45
71 - // Inject flag image when jQuery UI selectmenu is created or an item is selected.
72 - $( '#lang_list' ).on(
73 - 'selectmenucreate selectmenuselect',
74 - function() {
75 - selectmenuRefreshButtonText( this );
76 - }
77 - );
78 - // Create the jQuery UI selectmenu widget
79 - $( '#lang_list' ).selectmenu( { width: '100%' } );
80 - // Overrides each element in the jQuery UI selectmenu list by injecting flag image.
81 - $( '#lang_list' ).selectmenu( 'instance' )._renderItem = selectmenuRenderItem;
46 + if ( url ) {
47 + var txt = $( this ).iconselectmenu( "widget" ).children( ":last" );
48 + var w = sel.data( "width" );
49 + var h = sel.data( "height" );
50 + $( "<img class='ui-icon' />" ).prop( "src", url ).prop( "width", w ).prop( "height", h ).appendTo( txt );
51 + }
52 + }
82 53
83 - // Languages form
84 - // Fills the fields based on the language dropdown list choice
85 - $( '#add-lang #lang_list' ).on(
86 - 'selectmenuchange',
87 - function() {
88 - var value = $( this ).val().split( ':' );
89 - var selected = $( "option:selected", this ).text().split( ' - ' );
90 - $( '#lang_slug' ).val( value[0] );
91 - $( '#lang_locale' ).val( value[1] );
92 - $( 'input[name="rtl"]' ).val( [value[2]] );
93 - $( '#lang_name' ).val( selected[0] );
94 - $( '#flag_list').val( value[3] );
54 + // overrides the flag dropdown list with our customized jquery ui selectmenu
55 + $( "#flag_list" ).iconselectmenu({
56 + create: add_icon,
57 + select: add_icon,
58 + });
95 59
96 - // Refresh the jQuery UI selectmenu flags list.
97 - $( '#flag_list' ).selectmenu( 'refresh' ).trigger( 'selectmenuselect' );
98 - }
99 - );
60 + // languages form
61 + // fills the fields based on the language dropdown list choice
62 + $( '#lang_list' ).change(function() {
63 + var value = $( this ).val().split( ':' );
64 + var selected = $( "option:selected", this ).text().split( ' - ' );
65 + $( '#lang_slug' ).val( value[0] );
66 + $( '#lang_locale' ).val( value[1] );
67 + $( 'input[name="rtl"]' ).val( [value[2]] );
68 + $( '#lang_name' ).val( selected[0] );
69 + $( '#flag_list option[value="' + value[3] + '"]' ).attr( 'selected', 'selected' );
100 70
101 - // strings translations
102 - // save translations when pressing enter
103 - $( '.translation input' ).keypress(
104 - function( event ){
105 - if ( 13 === event.keyCode ) {
106 - event.preventDefault();
107 - $( '#submit' ).click();
108 - }
109 - }
110 - );
71 + // recreate the jquery ui selectmenu
72 + $( "#flag_list" ).iconselectmenu( 'destroy' ).iconselectmenu({
73 + create: add_icon,
74 + select: add_icon,
75 + })
76 + });
111 77
112 - // settings page
113 - // click on configure link
114 - $( '#the-list' ).on(
115 - 'click',
116 - '.configure>a',
117 - function(){
118 - $( '.pll-configure' ).hide().prev().show();
119 - $( this ).closest( 'tr' ).hide().next().show();
120 - return false;
121 - }
122 - );
78 + // strings translations
79 + // save translations when pressing enter
80 + $( '.translation input' ).keypress(function( event ){
81 + if ( 13 === event.keyCode ) {
82 + event.preventDefault();
83 + $( '#submit' ).click();
84 + }
85 + });
123 86
124 - // cancel
125 - $( '#the-list' ).on(
126 - 'click',
127 - '.cancel',
128 - function(){
129 - $( this ).closest( 'tr' ).hide().prev().show();
130 - }
131 - );
87 + // settings page
88 + // click on configure link
89 + $( '#the-list' ).on( 'click', '.configure>a', function(){
90 + $( '.pll-configure' ).hide().prev().show();
91 + $( this ).closest( 'tr' ).hide().next().show();
92 + return false;
93 + });
132 94
133 - // save settings
134 - $( '#the-list' ).on(
135 - 'click',
136 - '.save',
137 - function(){
138 - var tr = $( this ).closest( 'tr' );
139 - var parts = tr.attr( 'id' ).split( '-' );
95 + // cancel
96 + $( '#the-list' ).on( 'click', '.cancel', function(){
97 + $( this ).closest( 'tr' ).hide().prev().show();
98 + });
140 99
141 - var data = {
142 - action: 'pll_save_options',
143 - pll_ajax_settings: true,
144 - module: parts[parts.length - 1],
145 - _pll_nonce: $( '#_pll_nonce' ).val()
146 - };
100 + // save settings
101 + $( '#the-list' ).on( 'click', '.save', function(){
102 + var tr = $( this ).closest( 'tr' );
103 + var parts = tr.attr( 'id' ).split( '-' );
147 104
148 - data = tr.find( ':input' ).serialize() + '&' + $.param( data );
105 + var data = {
106 + action: 'pll_save_options',
107 + pll_ajax_settings: true,
108 + module: parts[parts.length - 1],
109 + _pll_nonce: $( '#_pll_nonce' ).val()
110 + }
149 111
150 - $.post(
151 - ajaxurl,
152 - data,
153 - function( response ) {
154 - var res = wpAjax.parseAjaxResponse( response, 'ajax-response' );
155 - $.each(
156 - res.responses,
157 - function() {
158 - switch ( this.what ) {
159 - case 'license-update':
160 - $( '#pll-license-' + this.data ).replaceWith( this.supplemental.html );
161 - break;
162 - case 'success':
163 - tr.hide().prev().show(); // close only if there is no error
164 - case 'error':
165 - $( '.settings-error' ).remove(); // remove previous messages if any
166 - $( 'h1' ).after( this.data );
112 + data = tr.find( ':input' ).serialize() + '&' + $.param( data );
167 113
168 - // Make notices dismissible
169 - // copy paste of common.js from WP 4.2.2
170 - $( '.notice.is-dismissible' ).each(
171 - function() {
172 - var $this = $( this ),
173 - $button = $( '<button type="button" class="notice-dismiss"><span class="screen-reader-text"></span></button>' ),
174 - btnText = commonL10n.dismiss || '';
114 + $.post( ajaxurl, data, function( response ) {
115 + var res = wpAjax.parseAjaxResponse( response, 'ajax-response' );
116 + $.each( res.responses, function() {
117 + switch ( this.what ) {
118 + case 'license-update':
119 + $( '#pll-license-' + this.data ).replaceWith( this.supplemental.html );
120 + break;
121 + case 'success':
122 + tr.hide().prev().show(); // close only if there is no error
123 + case 'error':
124 + $( '.settings-error' ).remove(); // remove previous messages if any
125 + $( 'h1' ).after( this.data );
175 126
176 - // Ensure plain text
177 - $button.find( '.screen-reader-text' ).text( btnText );
127 + // Make notices dismissible
128 + // copy paste of common.js from WP 4.2.2
129 + $( '.notice.is-dismissible' ).each(function() {
130 + var $this = $( this ),
131 + $button = $( '<button type="button" class="notice-dismiss"><span class="screen-reader-text"></span></button>' ),
132 + btnText = commonL10n.dismiss || '';
178 133
179 - // Whitelist because of how the button is built. See above
180 - $this.append( $button ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
134 + // Ensure plain text
135 + $button.find( '.screen-reader-text' ).text( btnText );
181 136
182 - $button.on(
183 - 'click.wp-dismiss-notice',
184 - function( event ) {
185 - event.preventDefault();
186 - $this.fadeTo(
187 - 100,
188 - 0,
189 - function() {
190 - $( this ).slideUp(
191 - 100,
192 - function() {
193 - $( this ).remove();
194 - }
195 - );
196 - }
197 - );
198 - }
199 - );
200 - }
201 - );
202 - break;
203 - }
204 - }
205 - );
206 - }
207 - );
208 - }
209 - );
137 + $this.append( $button );
210 138
211 - // act when pressing enter or esc in configurations
212 - $( '.pll-configure' ).keypress(
213 - function( event ){
214 - if ( 13 === event.keyCode ) {
215 - event.preventDefault();
216 - $( this ).find( '.save' ).click();
139 + $button.on( 'click.wp-dismiss-notice', function( event ) {
140 + event.preventDefault();
141 + $this.fadeTo( 100 , 0, function() {
142 + $( this ).slideUp( 100, function() {
143 + $( this ).remove();
144 + });
145 + });
146 + });
147 + });
148 + break;
217 149 }
150 + });
151 + });
152 + });
218 153
219 - if ( 27 === event.keyCode ) {
220 - event.preventDefault();
221 - $( this ).find( '.cancel' ).click();
222 - }
223 - }
224 - );
154 + // act when pressing enter or esc in configurations
155 + $( '.pll-configure' ).keypress(function( event ){
156 + if ( 13 === event.keyCode ) {
157 + event.preventDefault();
158 + $( this ).find( '.save' ).click();
159 + }
225 160
226 - // settings URL modifications
227 - // manages visibility of fields
228 - $( "input[name='force_lang']" ).change(
229 - function() {
230 - function pll_toggle( a, test ) {
231 - test ? a.show() : a.hide();
232 - }
161 + if ( 27 === event.keyCode ) {
162 + event.preventDefault();
163 + $( this ).find( '.cancel' ).click();
164 + }
165 + });
233 166
234 - var value = $( this ).val();
235 - pll_toggle( $( '#pll-domains-table' ), 3 == value );
236 - pll_toggle( $( "#pll-hide-default" ), 3 > value );
237 - pll_toggle( $( "#pll-rewrite" ), 2 > value );
238 - pll_toggle( $( "#pll-redirect-lang" ), 2 > value );
239 - }
240 - );
167 + // settings URL modifications
168 + // manages visibility of fields
169 + $( "input[name='force_lang']" ).change(function() {
170 + function pll_toggle( a, test ) {
171 + test ? a.show() : a.hide();
172 + }
241 173
242 - // settings license
243 - // deactivate button
244 - $( '.pll-deactivate-license' ).on(
245 - 'click',
246 - function() {
247 - var data = {
248 - action: 'pll_deactivate_license',
249 - pll_ajax_settings: true,
250 - id: $( this ).attr( 'id' ),
251 - _pll_nonce: $( '#_pll_nonce' ).val()
252 - };
253 - $.post(
254 - ajaxurl,
255 - data,
256 - function( response ){
257 - $( '#pll-license-' + response.id ).replaceWith( response.html );
258 - }
259 - );
260 - }
261 - );
174 + var value = $( this ).val();
175 + pll_toggle( $( '#pll-domains-table' ), 3 == value );
176 + pll_toggle( $( "#pll-hide-default" ), 3 > value );
177 + pll_toggle( $( "#pll-rewrite" ), 2 > value );
178 + pll_toggle( $( "#pll-redirect-lang" ), 2 > value );
179 + });
262 180
263 - // Manage closing the metabox.
264 - // close postboxes that should be closed
265 - $( '.if-js-closed' ).removeClass( 'if-js-closed' ).addClass( 'closed' );
266 - // postboxes setup
267 - if ( 'undefined' !== typeof postboxes ) {
268 - postboxes.add_postbox_toggles( pagenow );
181 + // settings license
182 + // deactivate button
183 + $( '.pll-deactivate-license' ).on( 'click', function() {
184 + var data = {
185 + action: 'pll_deactivate_license',
186 + pll_ajax_settings: true,
187 + id: $( this ).attr( 'id' ),
188 + _pll_nonce: $( '#_pll_nonce' ).val()
269 189 }
270 - }
271 -);
190 + $.post( ajaxurl, data , function( response ){
191 + $( '#pll-license-' + response.id ).replaceWith( response.html );
192 + });
193 + });
194 +
195 +});