fix: prevent asset conflicts between React and Grid.js versions

Add coexistence checks to all enqueue methods to prevent loading
both React and Grid.js assets simultaneously.

Changes:
- ReactAdmin.php: Only enqueue React assets when ?react=1
- Init.php: Skip Grid.js when React active on admin pages
- Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0
- Customer.php, Product.php, License.php: Add coexistence checks

Now the toggle between Classic and React versions works correctly.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
dwindown
2026-04-18 17:02:14 +07:00
parent bd9cdac02e
commit e8fbfb14c1
74973 changed files with 6658406 additions and 71 deletions

61
node_modules/@wordpress/html-entities/src/index.js generated vendored Normal file
View File

@@ -0,0 +1,61 @@
/** @type {HTMLTextAreaElement} */
let _decodeTextArea;
/**
* Decodes the HTML entities from a given string.
*
* @param {string} html String that contain HTML entities.
*
* @example
* ```js
* import { decodeEntities } from '@wordpress/html-entities';
*
* const result = decodeEntities( '&aacute;' );
* console.log( result ); // result will be "á"
* ```
*
* @return {string} The decoded string.
*/
export function decodeEntities( html ) {
// Not a string, or no entities to decode.
if ( 'string' !== typeof html || -1 === html.indexOf( '&' ) ) {
return html;
}
// Create a textarea for decoding entities, that we can reuse.
if ( undefined === _decodeTextArea ) {
if (
document.implementation &&
document.implementation.createHTMLDocument
) {
_decodeTextArea = document.implementation
.createHTMLDocument( '' )
.createElement( 'textarea' );
} else {
_decodeTextArea = document.createElement( 'textarea' );
}
}
_decodeTextArea.innerHTML = html;
const decoded = _decodeTextArea.textContent;
_decodeTextArea.innerHTML = '';
/**
* Cast to string, HTMLTextAreaElement should always have `string` textContent.
*
* > The `textContent` property of the `Node` interface represents the text content of the
* > node and its descendants.
* >
* > Value: A string or `null`
* >
* > * If the node is a `document` or a Doctype, `textContent` returns `null`.
* > * If the node is a CDATA section, comment, processing instruction, or text node,
* > textContent returns the text inside the node, i.e., the `Node.nodeValue`.
* > * For other node types, `textContent returns the concatenation of the textContent of
* > every child node, excluding comments and processing instructions. (This is an empty
* > string if the node has no children.)
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent
*/
return /** @type {string} */ ( decoded );
}

View File

@@ -0,0 +1,27 @@
/**
* Internal dependencies
*/
import { decodeEntities } from '../';
describe( 'decodeEntities', () => {
it( 'should not change html with no entities', () => {
const html = '<h1>A noble tag embiggens the smallest text.</h1>';
const expected = '<h1>A noble tag embiggens the smallest text.</h1>';
expect( decodeEntities( html ) ).toEqual( expected );
} );
it( 'should decode entities', () => {
const html = '&lt;h1&gt;This post&#8217;s title.&lt;/h1&gt;';
const expected = '<h1>This posts title.</h1>';
expect( decodeEntities( html ) ).toEqual( expected );
} );
it( 'should not double decode entities', () => {
const html = 'This post&amp;rsquo;s title.';
const expected = 'This post&rsquo;s title.';
expect( decodeEntities( html ) ).toEqual( expected );
} );
it( 'should not care about leading zeros on entity codes', () => {
const html = 'Jim&#0039;s mother&#039s post&#39s title.';
const expected = "Jim's mother's post's title.";
expect( decodeEntities( html ) ).toEqual( expected );
} );
} );