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

73
node_modules/rtlcss-webpack-plugin/dist/test/bundle.js generated vendored Normal file
View File

@@ -0,0 +1,73 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.bundle = bundle;
exports.filePath = filePath;
exports.fixture = fixture;
var _path = _interopRequireDefault(require("path"));
var _webpack = _interopRequireDefault(require("webpack"));
var _memoryFs = _interopRequireDefault(require("memory-fs"));
var _src = _interopRequireDefault(require("../src"));
var _miniCssExtractPlugin = _interopRequireDefault(require("mini-css-extract-plugin"));
/* global wallaby */
var workingFolder = typeof wallaby !== 'undefined' ? _path["default"].join(wallaby.localProjectDir, 'test') : __dirname;
function fixture(fileName) {
return _path["default"].join(workingFolder, 'fixtures', fileName);
}
function bundle(options, modifier) {
if (modifier === void 0) {
modifier = function modifier(x) {
return x;
};
}
return new Promise(function (resolve, reject) {
var compiler = (0, _webpack["default"])(modifier({
entry: {
bundle: fixture('index.js')
},
output: {
filename: '[name].js'
},
resolveLoader: {
modules: [_path["default"].resolve(workingFolder, '..', 'node_modules')]
},
module: {
rules: [{
test: /\.css$/,
use: [{
loader: _miniCssExtractPlugin["default"].loader
}, 'css-loader']
}]
},
plugins: [new _miniCssExtractPlugin["default"]({
filename: '[name].css'
}), new _src["default"](options)]
}));
var memoryFileSystem = new _memoryFs["default"]();
compiler.outputFileSystem = memoryFileSystem;
compiler.run(function (err, stats) {
if (err) {
return reject(err);
} else if (stats.hasErrors()) {
return reject(new Error(stats.toString()));
} else {
resolve(memoryFileSystem);
}
});
});
}
function filePath(name) {
return _path["default"].join(process.cwd(), 'dist', name);
}

View File

@@ -0,0 +1 @@
require('./style.css');

View File

@@ -0,0 +1 @@
require('./style2.css');

View File

@@ -0,0 +1,3 @@
.a {
float: left;
}

View File

@@ -0,0 +1,3 @@
.b {
float: left;
}

View File

@@ -0,0 +1,196 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _chai = require("chai");
var _webpack = require("webpack");
var _bundle = require("./bundle");
var _path = require("path");
describe('RtlCss Webpack Plugin', function () {
it('should contain the correct content', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var fs;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _bundle.bundle)();
case 2:
fs = _context.sent;
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle.css'), 'utf-8')).to.equal('.a {\n float: left;\n}\n\n');
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle.rtl.css'), 'utf-8')).to.equal('.a {\n float: right;\n}\n\n');
case 5:
case "end":
return _context.stop();
}
}
}, _callee);
})));
it('should create bundle per chunk', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var addChunk, fs;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
addChunk = function addChunk(x) {
return (0, _extends2["default"])({}, x, {
entry: (0, _extends2["default"])({}, x.entry, {
bundle2: (0, _bundle.fixture)('index2.js')
})
});
};
_context2.next = 3;
return (0, _bundle.bundle)(undefined, addChunk);
case 3:
fs = _context2.sent;
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle.rtl.css'), 'utf-8')).to.equal('.a {\n float: right;\n}\n\n');
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle2.rtl.css'), 'utf-8')).to.equal('.b {\n float: right;\n}\n\n');
case 6:
case "end":
return _context2.stop();
}
}
}, _callee2);
})));
it('should contain the correct content when minimized', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
var minimize, fs;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
minimize = function minimize(x) {
return (0, _extends2["default"])({}, x, {
plugins: x.plugins.concat(new _webpack.LoaderOptionsPlugin({
minimize: true
}))
});
};
_context3.next = 3;
return (0, _bundle.bundle)(undefined, minimize);
case 3:
fs = _context3.sent;
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle.css'), 'utf-8')).to.equal('.a {\n float: left;\n}\n\n');
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle.rtl.css'), 'utf-8')).to.equal('.a {\n float: right;\n}\n\n');
case 6:
case "end":
return _context3.stop();
}
}
}, _callee3);
})));
it('should set filename according to options as object', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
var fs;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return (0, _bundle.bundle)({
filename: 'foo.rtl.css'
});
case 2:
fs = _context4.sent;
// eslint-disable-next-line no-unused-expressions
(0, _chai.expect)(fs.existsSync((0, _bundle.filePath)('foo.rtl.css'))).to.be["true"];
case 4:
case "end":
return _context4.stop();
}
}
}, _callee4);
})));
it('should set filename according to options as string', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
var fs;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.next = 2;
return (0, _bundle.bundle)('foo.rtl.css');
case 2:
fs = _context5.sent;
// eslint-disable-next-line no-unused-expressions
(0, _chai.expect)(fs.existsSync((0, _bundle.filePath)('foo.rtl.css'))).to.be["true"];
case 4:
case "end":
return _context5.stop();
}
}
}, _callee5);
})));
it('should support [hash]', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
var fs, hashedFileName;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return (0, _bundle.bundle)('foo.[hash].rtl.css');
case 2:
fs = _context6.sent;
hashedFileName = fs.readdirSync((0, _path.join)(process.cwd(), 'dist')).find(function (s) {
return s.startsWith('foo');
});
(0, _chai.expect)(hashedFileName).not.to.equal('foo.[hash].rtl.css');
(0, _chai.expect)(hashedFileName).to.match(/foo\.\w+\.rtl\.css/);
case 6:
case "end":
return _context6.stop();
}
}
}, _callee6);
})));
it('should support [name]', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
var addChunk, fs;
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
addChunk = function addChunk(x) {
return (0, _extends2["default"])({}, x, {
entry: (0, _extends2["default"])({}, x.entry, {
bundle2: (0, _bundle.fixture)('index2.js')
})
});
};
_context7.next = 3;
return (0, _bundle.bundle)('[name]-rtl.css', addChunk);
case 3:
fs = _context7.sent;
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle-rtl.css'), 'utf-8')).to.equal('.a {\n float: right;\n}\n\n');
(0, _chai.expect)(fs.readFileSync((0, _bundle.filePath)('bundle2-rtl.css'), 'utf-8')).to.equal('.b {\n float: right;\n}\n\n');
case 6:
case "end":
return _context7.stop();
}
}
}, _callee7);
})));
});