PluginProbe
Polylang / 3.8.10
Polylang v3.8.10
3.8.10 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 All 234 releases
← All changes | js/build/user.js +67 -27 3.8.3 → 3.8.10 View file →
@@ -1,34 +1,74 @@
1 1 /**
2 - * Adds one biography input field per language in the user profile.
3 - *
4 - * @package Polylang
2 + * Adds one biography textarea field per language in the user profile.
5 3 */
6 4
7 -jQuery(
8 - function ( $ ) {
9 - // biography
10 - // FIXME there is probably a more efficient way to do this
11 - var td = $( '#description' ).parent();
12 - var d = $( '#description' ).clone();
13 - var span = td.children( '.description' ).clone();
14 - td.children().remove();
5 +const pllDescription = {
6 + /**
7 + * Init.
8 + */
9 + init: () => {
10 + if ( ! pllDescriptionData ) {
11 + return;
12 + }
13 + if ( document.readyState !== 'loading' ) {
14 + pllDescription.ready();
15 + } else {
16 + document.addEventListener(
17 + 'DOMContentLoaded',
18 + pllDescription.ready
19 + );
20 + }
21 + },
15 22
16 - $( '.biography' ).each(
17 - function () {
18 - lang = $( this ).attr( 'name' ).split( '___' );
19 - desc = d.clone();
20 - desc.attr( 'name', 'description_' + lang[0] );
21 - desc.attr( 'id', 'description_' + lang[0] );
22 - // Whitelist because description and lang value is already escaped by the side of PHP
23 - desc.html( $( this ).val() ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
24 - td.append( $( '<div></div>' ).text( lang[1] ) ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
25 - td.append( desc ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
23 + /**
24 + * Called when the DOM is ready.
25 + */
26 + ready: () => {
27 + const originTextarea = document.getElementById( 'description' );
28 +
29 + if ( ! originTextarea ) {
30 + return;
31 + }
32 +
33 + const rows = [];
34 +
35 + pllDescriptionData.forEach( ( data ) => {
36 + const wrapper = document.createElement( 'div' );
37 + wrapper.setAttribute( 'lang', data.lang );
38 +
39 + const label = document.createElement( 'label' );
40 + label.setAttribute( 'for', `description_${ data.slug }` );
41 + label.setAttribute( 'dir', data.direction );
42 +
43 + if ( data.flag.src ) {
44 + const img = document.createElement( 'img' );
45 + img.setAttribute( 'alt', '' );
46 + img.setAttribute( 'src', data.flag.src );
47 + if ( data.flag.width ) {
48 + img.setAttribute( 'width', data.flag.width );
49 + }
50 + if ( data.flag.height ) {
51 + img.setAttribute( 'height', data.flag.height );
52 + }
53 + label.textContent = ` ${ data.name }`;
54 + label.prepend( img ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.prepend
55 + } else {
56 + label.textContent = data.name;
26 57 }
27 - );
28 58
29 - td.append( '<br />' );
30 - // Whitelist because description come from html code generated by WordPress
31 - td.append( span ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
32 - }
33 -);
59 + const textarea = originTextarea.cloneNode( true );
60 + textarea.setAttribute( 'id', `description_${ data.slug }` );
61 + textarea.setAttribute( 'name', `description_${ data.slug }` );
62 + textarea.setAttribute( 'dir', data.direction );
63 + textarea.innerHTML = data.description; // phpcs:ignore WordPressVIPMinimum.JS.InnerHTML.Found
64 +
65 + wrapper.append( label, document.createElement( 'br' ), textarea ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
66 + rows.push( wrapper );
67 + } );
68 +
69 + originTextarea.replaceWith( ...rows ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.replaceWith
70 + },
71 +};
72 +
73 +pllDescription.init();
34 74