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,25 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = NavigationItemBaseContent;
var _react = require("react");
var _navigationStyles = require("../styles/navigation-styles");
/**
* Internal dependencies
*/
function NavigationItemBaseContent(props) {
const {
badge,
title
} = props;
return (0, _react.createElement)(_react.Fragment, null, title && (0, _react.createElement)(_navigationStyles.ItemTitleUI, {
className: "components-navigation__item-title",
as: "span"
}, title), badge && (0, _react.createElement)(_navigationStyles.ItemBadgeUI, {
className: "components-navigation__item-badge"
}, badge));
}
//# sourceMappingURL=base-content.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_navigationStyles","require","NavigationItemBaseContent","props","badge","title","_react","createElement","Fragment","ItemTitleUI","className","as","ItemBadgeUI"],"sources":["@wordpress/components/src/navigation/item/base-content.tsx"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { ItemBadgeUI, ItemTitleUI } from '../styles/navigation-styles';\n\nimport type { NavigationItemBaseContentProps } from '../types';\n\nexport default function NavigationItemBaseContent(\n\tprops: NavigationItemBaseContentProps\n) {\n\tconst { badge, title } = props;\n\n\treturn (\n\t\t<>\n\t\t\t{ title && (\n\t\t\t\t<ItemTitleUI\n\t\t\t\t\tclassName=\"components-navigation__item-title\"\n\t\t\t\t\tas=\"span\"\n\t\t\t\t>\n\t\t\t\t\t{ title }\n\t\t\t\t</ItemTitleUI>\n\t\t\t) }\n\n\t\t\t{ badge && (\n\t\t\t\t<ItemBadgeUI className=\"components-navigation__item-badge\">\n\t\t\t\t\t{ badge }\n\t\t\t\t</ItemBadgeUI>\n\t\t\t) }\n\t\t</>\n\t);\n}\n"],"mappings":";;;;;;;AAGA,IAAAA,iBAAA,GAAAC,OAAA;AAHA;AACA;AACA;;AAKe,SAASC,yBAAyBA,CAChDC,KAAqC,EACpC;EACD,MAAM;IAAEC,KAAK;IAAEC;EAAM,CAAC,GAAGF,KAAK;EAE9B,OACC,IAAAG,MAAA,CAAAC,aAAA,EAAAD,MAAA,CAAAE,QAAA,QACGH,KAAK,IACN,IAAAC,MAAA,CAAAC,aAAA,EAACP,iBAAA,CAAAS,WAAW;IACXC,SAAS,EAAC,mCAAmC;IAC7CC,EAAE,EAAC;EAAM,GAEPN,KACU,CACb,EAECD,KAAK,IACN,IAAAE,MAAA,CAAAC,aAAA,EAACP,iBAAA,CAAAY,WAAW;IAACF,SAAS,EAAC;EAAmC,GACvDN,KACU,CAEb,CAAC;AAEL"}

View File

@@ -0,0 +1,50 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = NavigationItemBase;
var _react = require("react");
var _classnames = _interopRequireDefault(require("classnames"));
var _element = require("@wordpress/element");
var _context = require("../context");
var _useNavigationTreeItem = require("./use-navigation-tree-item");
var _navigationStyles = require("../styles/navigation-styles");
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
let uniqueId = 0;
function NavigationItemBase(props) {
// Also avoid to pass the `title` and `href` props to the ItemBaseUI styled component.
const {
children,
className,
title,
href,
...restProps
} = props;
const [itemId] = (0, _element.useState)(`item-${++uniqueId}`);
(0, _useNavigationTreeItem.useNavigationTreeItem)(itemId, props);
const {
navigationTree
} = (0, _context.useNavigationContext)();
if (!navigationTree.getItem(itemId)?._isVisible) {
return null;
}
const classes = (0, _classnames.default)('components-navigation__item', className);
return (0, _react.createElement)(_navigationStyles.ItemBaseUI, {
className: classes,
...restProps
}, children);
}
//# sourceMappingURL=base.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_classnames","_interopRequireDefault","require","_element","_context","_useNavigationTreeItem","_navigationStyles","uniqueId","NavigationItemBase","props","children","className","title","href","restProps","itemId","useState","useNavigationTreeItem","navigationTree","useNavigationContext","getItem","_isVisible","classes","classnames","_react","createElement","ItemBaseUI"],"sources":["@wordpress/components/src/navigation/item/base.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { useState } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { useNavigationContext } from '../context';\nimport { useNavigationTreeItem } from './use-navigation-tree-item';\nimport { ItemBaseUI } from '../styles/navigation-styles';\n\nimport type { NavigationItemBaseProps } from '../types';\n\nlet uniqueId = 0;\n\nexport default function NavigationItemBase( props: NavigationItemBaseProps ) {\n\t// Also avoid to pass the `title` and `href` props to the ItemBaseUI styled component.\n\tconst { children, className, title, href, ...restProps } = props;\n\n\tconst [ itemId ] = useState( `item-${ ++uniqueId }` );\n\n\tuseNavigationTreeItem( itemId, props );\n\tconst { navigationTree } = useNavigationContext();\n\n\tif ( ! navigationTree.getItem( itemId )?._isVisible ) {\n\t\treturn null;\n\t}\n\n\tconst classes = classnames( 'components-navigation__item', className );\n\n\treturn (\n\t\t<ItemBaseUI className={ classes } { ...restProps }>\n\t\t\t{ children }\n\t\t</ItemBaseUI>\n\t);\n}\n"],"mappings":";;;;;;;;AAGA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAKA,IAAAC,QAAA,GAAAD,OAAA;AAKA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AAfA;AACA;AACA;;AAGA;AACA;AACA;;AAGA;AACA;AACA;;AAOA,IAAIK,QAAQ,GAAG,CAAC;AAED,SAASC,kBAAkBA,CAAEC,KAA8B,EAAG;EAC5E;EACA,MAAM;IAAEC,QAAQ;IAAEC,SAAS;IAAEC,KAAK;IAAEC,IAAI;IAAE,GAAGC;EAAU,CAAC,GAAGL,KAAK;EAEhE,MAAM,CAAEM,MAAM,CAAE,GAAG,IAAAC,iBAAQ,EAAG,QAAQ,EAAET,QAAU,EAAE,CAAC;EAErD,IAAAU,4CAAqB,EAAEF,MAAM,EAAEN,KAAM,CAAC;EACtC,MAAM;IAAES;EAAe,CAAC,GAAG,IAAAC,6BAAoB,EAAC,CAAC;EAEjD,IAAK,CAAED,cAAc,CAACE,OAAO,CAAEL,MAAO,CAAC,EAAEM,UAAU,EAAG;IACrD,OAAO,IAAI;EACZ;EAEA,MAAMC,OAAO,GAAG,IAAAC,mBAAU,EAAE,6BAA6B,EAAEZ,SAAU,CAAC;EAEtE,OACC,IAAAa,MAAA,CAAAC,aAAA,EAACnB,iBAAA,CAAAoB,UAAU;IAACf,SAAS,EAAGW,OAAS;IAAA,GAAMR;EAAS,GAC7CJ,QACS,CAAC;AAEf"}

View File

@@ -0,0 +1,98 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.NavigationItem = NavigationItem;
exports.default = void 0;
var _react = require("react");
var _classnames = _interopRequireDefault(require("classnames"));
var _icons = require("@wordpress/icons");
var _i18n = require("@wordpress/i18n");
var _button = _interopRequireDefault(require("../../button"));
var _context = require("../context");
var _navigationStyles = require("../styles/navigation-styles");
var _baseContent = _interopRequireDefault(require("./base-content"));
var _base = _interopRequireDefault(require("./base"));
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const noop = () => {};
function NavigationItem(props) {
const {
badge,
children,
className,
href,
item,
navigateToMenu,
onClick = noop,
title,
icon,
hideIfTargetMenuEmpty,
isText,
...restProps
} = props;
const {
activeItem,
setActiveMenu,
navigationTree: {
isMenuEmpty
}
} = (0, _context.useNavigationContext)();
// If hideIfTargetMenuEmpty prop is true
// And the menu we are supposed to navigate to
// Is marked as empty, then we skip rendering the item.
if (hideIfTargetMenuEmpty && navigateToMenu && isMenuEmpty(navigateToMenu)) {
return null;
}
const isActive = item && activeItem === item;
const classes = (0, _classnames.default)(className, {
'is-active': isActive
});
const onItemClick = event => {
if (navigateToMenu) {
setActiveMenu(navigateToMenu);
}
onClick(event);
};
const navigationIcon = (0, _i18n.isRTL)() ? _icons.chevronLeft : _icons.chevronRight;
const baseProps = children ? props : {
...props,
onClick: undefined
};
const itemProps = isText ? restProps : {
as: _button.default,
href,
onClick: onItemClick,
'aria-current': isActive ? 'page' : undefined,
...restProps
};
return (0, _react.createElement)(_base.default, {
...baseProps,
className: classes
}, children || (0, _react.createElement)(_navigationStyles.ItemUI, {
...itemProps
}, icon && (0, _react.createElement)(_navigationStyles.ItemIconUI, null, (0, _react.createElement)(_icons.Icon, {
icon: icon
})), (0, _react.createElement)(_baseContent.default, {
title: title,
badge: badge
}), navigateToMenu && (0, _react.createElement)(_icons.Icon, {
icon: navigationIcon
})));
}
var _default = NavigationItem;
exports.default = _default;
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,52 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useNavigationTreeItem = void 0;
var _element = require("@wordpress/element");
var _context = require("../context");
var _context2 = require("../group/context");
var _context3 = require("../menu/context");
var _utils = require("../utils");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const useNavigationTreeItem = (itemId, props) => {
const {
activeMenu,
navigationTree: {
addItem,
removeItem
}
} = (0, _context.useNavigationContext)();
const {
group
} = (0, _context2.useNavigationGroupContext)();
const {
menu,
search
} = (0, _context3.useNavigationMenuContext)();
(0, _element.useEffect)(() => {
const isMenuActive = activeMenu === menu;
const isItemVisible = !search || props.title !== undefined && (0, _utils.normalizedSearch)(props.title, search);
addItem(itemId, {
...props,
group,
menu,
_isVisible: isMenuActive && isItemVisible
});
return () => {
removeItem(itemId);
};
// Ignore exhaustive-deps rule for now. See https://github.com/WordPress/gutenberg/pull/41639
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [activeMenu, search]);
};
exports.useNavigationTreeItem = useNavigationTreeItem;
//# sourceMappingURL=use-navigation-tree-item.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_element","require","_context","_context2","_context3","_utils","useNavigationTreeItem","itemId","props","activeMenu","navigationTree","addItem","removeItem","useNavigationContext","group","useNavigationGroupContext","menu","search","useNavigationMenuContext","useEffect","isMenuActive","isItemVisible","title","undefined","normalizedSearch","_isVisible","exports"],"sources":["@wordpress/components/src/navigation/item/use-navigation-tree-item.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { useNavigationContext } from '../context';\nimport { useNavigationGroupContext } from '../group/context';\nimport { useNavigationMenuContext } from '../menu/context';\nimport { normalizedSearch } from '../utils';\n\nimport type { NavigationItemProps } from '../types';\n\nexport const useNavigationTreeItem = (\n\titemId: string,\n\tprops: NavigationItemProps\n) => {\n\tconst {\n\t\tactiveMenu,\n\t\tnavigationTree: { addItem, removeItem },\n\t} = useNavigationContext();\n\tconst { group } = useNavigationGroupContext();\n\tconst { menu, search } = useNavigationMenuContext();\n\n\tuseEffect( () => {\n\t\tconst isMenuActive = activeMenu === menu;\n\t\tconst isItemVisible =\n\t\t\t! search ||\n\t\t\t( props.title !== undefined &&\n\t\t\t\tnormalizedSearch( props.title, search ) );\n\n\t\taddItem( itemId, {\n\t\t\t...props,\n\t\t\tgroup,\n\t\t\tmenu,\n\t\t\t_isVisible: isMenuActive && isItemVisible,\n\t\t} );\n\n\t\treturn () => {\n\t\t\tremoveItem( itemId );\n\t\t};\n\t\t// Ignore exhaustive-deps rule for now. See https://github.com/WordPress/gutenberg/pull/41639\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [ activeMenu, search ] );\n};\n"],"mappings":";;;;;;AAGA,IAAAA,QAAA,GAAAC,OAAA;AAKA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,SAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AAXA;AACA;AACA;;AAGA;AACA;AACA;;AAQO,MAAMK,qBAAqB,GAAGA,CACpCC,MAAc,EACdC,KAA0B,KACtB;EACJ,MAAM;IACLC,UAAU;IACVC,cAAc,EAAE;MAAEC,OAAO;MAAEC;IAAW;EACvC,CAAC,GAAG,IAAAC,6BAAoB,EAAC,CAAC;EAC1B,MAAM;IAAEC;EAAM,CAAC,GAAG,IAAAC,mCAAyB,EAAC,CAAC;EAC7C,MAAM;IAAEC,IAAI;IAAEC;EAAO,CAAC,GAAG,IAAAC,kCAAwB,EAAC,CAAC;EAEnD,IAAAC,kBAAS,EAAE,MAAM;IAChB,MAAMC,YAAY,GAAGX,UAAU,KAAKO,IAAI;IACxC,MAAMK,aAAa,GAClB,CAAEJ,MAAM,IACNT,KAAK,CAACc,KAAK,KAAKC,SAAS,IAC1B,IAAAC,uBAAgB,EAAEhB,KAAK,CAACc,KAAK,EAAEL,MAAO,CAAG;IAE3CN,OAAO,CAAEJ,MAAM,EAAE;MAChB,GAAGC,KAAK;MACRM,KAAK;MACLE,IAAI;MACJS,UAAU,EAAEL,YAAY,IAAIC;IAC7B,CAAE,CAAC;IAEH,OAAO,MAAM;MACZT,UAAU,CAAEL,MAAO,CAAC;IACrB,CAAC;IACD;IACA;EACD,CAAC,EAAE,CAAEE,UAAU,EAAEQ,MAAM,CAAG,CAAC;AAC5B,CAAC;AAACS,OAAA,CAAApB,qBAAA,GAAAA,qBAAA"}