PluginProbe
Polylang / 2.9
Polylang v2.9
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 / block-editor.js

block-editor.js in Polylang 2.9, at js/block-editor.js

204 lines 6.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * @package Polylang
3 */
4
5 /**
6 * Filter REST API requests to add the language in the request
7 *
8 * @since 2.5
9 */
10 wp.apiFetch.use(
11 function( options, next ) {
12 // If options.url is defined, this is not a REST request but a direct call to post.php for legacy metaboxes.
13 if ( 'undefined' === typeof options.url ) {
14 if ( 'undefined' === typeof options.data || null === options.data ) {
15 // GET
16 options.path += ( ( options.path.indexOf( '?' ) >= 0 ) ? '&lang=' : '?lang=' ) + getCurrentLanguage();
17 } else {
18 // PUT, POST
19 options.data.lang = getCurrentLanguage();
20 }
21 }
22 return next( options );
23 }
24 );
25
26 /**
27 * Get the language from the HTML form
28 *
29 * @since 2.5
30 *
31 * @return {Element.value}
32 */
33 function getCurrentLanguage() {
34 return document.querySelector( '[name=post_lang_choice]' ).value;
35 }
36
37 /**
38 * Save post after lang choice is done and redirect to the same page for refreshing all the data
39 *
40 * @since 2.5
41 */
42 jQuery(
43 function( $ ) {
44 // savePost after changing the post's language and reload page for refreshing post translated data
45 $( '.post_lang_choice' ).on(
46 'change',
47 function() {
48 const select = wp.data.select;
49 const dispatch = wp.data.dispatch;
50 const subscribe = wp.data.subscribe;
51
52 let unsubscribe = null;
53
54 // Listen if the savePost is done
55 const savePostIsDone = new Promise(
56 function( resolve, reject ) {
57 unsubscribe = subscribe(
58 function() {
59 const isSavePostSucceeded = select( 'core/editor' ).didPostSaveRequestSucceed();
60 const isSavePostFailed = select( 'core/editor' ).didPostSaveRequestFail();
61 if ( isSavePostSucceeded || isSavePostFailed ) {
62 if ( isSavePostFailed ) {
63 reject();
64 } else {
65 resolve();
66 }
67 }
68 }
69 );
70 }
71 );
72
73 // Specific case for empty posts
74 if ( location.pathname.match( /post-new.php/gi ) ) {
75 const title = select( 'core/editor' ).getEditedPostAttribute( 'title' );
76 const content = select( 'core/editor' ).getEditedPostAttribute( 'content' );
77 const excerpt = select( 'core/editor' ).getEditedPostAttribute( 'excerpt' );
78 if ( '' === title && '' === content && '' === excerpt ) {
79 // Change the new_lang parameter with the new language value for reloading the page
80 // WPCS location.search is never written in the page, just used to relaoad page ( See line 94 ) with the right value of new_lang
81 // new_lang input is controlled server side in PHP. The value come from the dropdown list of language returned and escaped server side
82 if ( -1 != location.search.indexOf( 'new_lang' ) ) {
83 // use regexp non capturing group to replace new_lang parameter no matter where it is and capture other parameters which can be behind it
84 window.location.search = window.location.search.replace( /(?:new_lang=[^&]*)(&)?(.*)/, 'new_lang=' + this.value + '$1$2' ); // phpcs:ignore WordPressVIPMinimum.JS.Window.location, WordPressVIPMinimum.JS.Window.VarAssignment
85 } else {
86 window.location.search = window.location.search + ( ( -1 != window.location.search.indexOf( '?' ) ) ? '&' : '?' ) + 'new_lang=' + this.value; // phpcs:ignore WordPressVIPMinimum.JS.Window.location, WordPressVIPMinimum.JS.Window.VarAssignment
87 }
88 }
89 }
90
91 // For empty posts savePost does nothing
92 dispatch( 'core/editor' ).savePost();
93
94 savePostIsDone.then(
95 function() {
96 // If the post is well saved, we can reload the page
97 unsubscribe();
98 window.location.reload();
99 },
100 function() {
101 // If the post save failed
102 unsubscribe();
103 }
104 ).catch(
105 function() {
106 // If an exception is thrown
107 unsubscribe();
108 }
109 );
110 }
111 );
112 }
113 );
114
115 /**
116 * Handles internals of the metabox:
117 * Language select, autocomplete input field.
118 *
119 * @since 1.5
120 */
121 jQuery(
122 function( $ ) {
123 // Ajax for changing the post's language in the languages metabox
124 $( '.post_lang_choice' ).on(
125 'change',
126 function() {
127 var data = {
128 action: 'post_lang_choice',
129 lang: $( this ).val(),
130 post_type: $( '#post_type' ).val(),
131 post_id: $( '#post_ID' ).val(),
132 _pll_nonce: $( '#_pll_nonce' ).val()
133 }
134
135 $.post(
136 ajaxurl,
137 data,
138 function( response ) {
139 var res = wpAjax.parseAjaxResponse( response, 'ajax-response' );
140 $.each(
141 res.responses,
142 function() {
143 switch ( this.what ) {
144 case 'translations': // Translations fields
145 // Data is built and come from server side and is well escaped when necessary
146 $( '.translations' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
147 init_translations();
148 break;
149 case 'flag': // Flag in front of the select dropdown
150 // Data is built and come from server side and is well escaped when necessary
151 $( '.pll-select-flag' ).html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
152 break;
153 }
154 }
155 );
156 }
157 );
158 }
159 );
160
161 // Translations autocomplete input box
162 function init_translations() {
163 $( '.tr_lang' ).each(
164 function(){
165 var tr_lang = $( this ).attr( 'id' ).substring( 8 );
166 var td = $( this ).parent().parent().siblings( '.pll-edit-column' );
167
168 $( this ).autocomplete(
169 {
170 minLength: 0,
171
172 source: ajaxurl + '?action=pll_posts_not_translated' +
173 '&post_language=' + $( '.post_lang_choice' ).val() +
174 '&translation_language=' + tr_lang +
175 '&post_type=' + $( '#post_type' ).val() +
176 '&_pll_nonce=' + $( '#_pll_nonce' ).val(),
177
178 select: function( event, ui ) {
179 $( '#htr_lang_' + tr_lang ).val( ui.item.id );
180 // ui.item.link is built and come from server side and is well escaped when necessary
181 td.html( ui.item.link ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
182 },
183 }
184 );
185
186 // When the input box is emptied
187 $( this ).on(
188 'blur',
189 function() {
190 if ( ! $( this ).val() ) {
191 $( '#htr_lang_' + tr_lang ).val( 0 );
192 // Value is retrieved from HTML already generated server side
193 td.html( td.siblings( '.hidden' ).children().clone() ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
194 }
195 }
196 );
197 }
198 );
199 }
200
201 init_translations();
202 }
203 );
204