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

View File

@@ -0,0 +1,3 @@
'use strict';
export default typeof Blob !== 'undefined' ? Blob : null;

View File

@@ -0,0 +1,3 @@
'use strict';
export default typeof FormData !== 'undefined' ? FormData : null;

View File

@@ -0,0 +1,4 @@
'use strict';
import AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';
export default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;

13
node_modules/axios/lib/platform/browser/index.js generated vendored Normal file
View File

@@ -0,0 +1,13 @@
import URLSearchParams from './classes/URLSearchParams.js';
import FormData from './classes/FormData.js';
import Blob from './classes/Blob.js';
export default {
isBrowser: true,
classes: {
URLSearchParams,
FormData,
Blob,
},
protocols: ['http', 'https', 'file', 'blob', 'url', 'data'],
};

52
node_modules/axios/lib/platform/common/utils.js generated vendored Normal file
View File

@@ -0,0 +1,52 @@
const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';
const _navigator = (typeof navigator === 'object' && navigator) || undefined;
/**
* Determine if we're running in a standard browser environment
*
* This allows axios to run in a web worker, and react-native.
* Both environments support XMLHttpRequest, but not fully standard globals.
*
* web workers:
* typeof window -> undefined
* typeof document -> undefined
*
* react-native:
* navigator.product -> 'ReactNative'
* nativescript
* navigator.product -> 'NativeScript' or 'NS'
*
* @returns {boolean}
*/
const hasStandardBrowserEnv =
hasBrowserEnv &&
(!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);
/**
* Determine if we're running in a standard browser webWorker environment
*
* Although the `isStandardBrowserEnv` method indicates that
* `allows axios to run in a web worker`, the WebWorker will still be
* filtered out due to its judgment standard
* `typeof window !== 'undefined' && typeof document !== 'undefined'`.
* This leads to a problem when axios post `FormData` in webWorker
*/
const hasStandardBrowserWebWorkerEnv = (() => {
return (
typeof WorkerGlobalScope !== 'undefined' &&
// eslint-disable-next-line no-undef
self instanceof WorkerGlobalScope &&
typeof self.importScripts === 'function'
);
})();
const origin = (hasBrowserEnv && window.location.href) || 'http://localhost';
export {
hasBrowserEnv,
hasStandardBrowserWebWorkerEnv,
hasStandardBrowserEnv,
_navigator as navigator,
origin,
};

7
node_modules/axios/lib/platform/index.js generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import platform from './node/index.js';
import * as utils from './common/utils.js';
export default {
...utils,
...platform,
};

View File

@@ -0,0 +1,3 @@
import FormData from 'form-data';
export default FormData;

View File

@@ -0,0 +1,4 @@
'use strict';
import url from 'url';
export default url.URLSearchParams;

37
node_modules/axios/lib/platform/node/index.js generated vendored Normal file
View File

@@ -0,0 +1,37 @@
import crypto from 'crypto';
import URLSearchParams from './classes/URLSearchParams.js';
import FormData from './classes/FormData.js';
const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
const DIGIT = '0123456789';
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT,
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = '';
const { length } = alphabet;
const randomValues = new Uint32Array(size);
crypto.randomFillSync(randomValues);
for (let i = 0; i < size; i++) {
str += alphabet[randomValues[i] % length];
}
return str;
};
export default {
isNode: true,
classes: {
URLSearchParams,
FormData,
Blob: (typeof Blob !== 'undefined' && Blob) || null,
},
ALPHABET,
generateString,
protocols: ['http', 'https', 'file', 'data'],
};