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

59
node_modules/postcss-unique-selectors/src/index.js generated vendored Normal file
View File

@@ -0,0 +1,59 @@
'use strict';
const selectorParser = require('postcss-selector-parser');
/**
* @param {string} selectors
* @param {selectorParser.SyncProcessor<void>} callback
* @return {string}
*/
function parseSelectors(selectors, callback) {
return selectorParser(callback).processSync(selectors);
}
/**
* @param {import('postcss').Rule} rule
* @return {string}
*/
function unique(rule) {
const selector = [...new Set(rule.selectors)];
selector.sort();
return selector.join();
}
/**
* @type {import('postcss').PluginCreator<void>}
* @return {import('postcss').Plugin}
*/
function pluginCreator() {
return {
postcssPlugin: 'postcss-unique-selectors',
OnceExit(css) {
css.walkRules((nodes) => {
/** @type {string[]} */
let comments = [];
/** @type {selectorParser.SyncProcessor<void>} */
const removeAndSaveComments = (selNode) => {
selNode.walk((sel) => {
if (sel.type === 'comment') {
comments.push(sel.value);
sel.remove();
return;
} else {
return;
}
});
};
if (nodes.raws.selector && nodes.raws.selector.raw) {
parseSelectors(nodes.raws.selector.raw, removeAndSaveComments);
nodes.raws.selector.raw = unique(nodes);
}
nodes.selector = parseSelectors(nodes.selector, removeAndSaveComments);
nodes.selector = unique(nodes);
nodes.selectors = nodes.selectors.concat(comments);
});
},
};
}
pluginCreator.postcss = true;
module.exports = pluginCreator;