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,24 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PageControlIcon = void 0;
var _react = require("react");
var _primitives = require("@wordpress/primitives");
/**
* WordPress dependencies
*/
const PageControlIcon = () => (0, _react.createElement)(_primitives.SVG, {
width: "8",
height: "8",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
}, (0, _react.createElement)(_primitives.Circle, {
cx: "4",
cy: "4",
r: "4"
}));
exports.PageControlIcon = PageControlIcon;
//# sourceMappingURL=icons.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_primitives","require","PageControlIcon","_react","createElement","SVG","width","height","fill","xmlns","Circle","cx","cy","r","exports"],"sources":["@wordpress/components/src/guide/icons.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { SVG, Circle } from '@wordpress/primitives';\n\nexport const PageControlIcon = () => (\n\t<SVG width=\"8\" height=\"8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<Circle cx=\"4\" cy=\"4\" r=\"4\" />\n\t</SVG>\n);\n"],"mappings":";;;;;;;AAGA,IAAAA,WAAA,GAAAC,OAAA;AAHA;AACA;AACA;;AAGO,MAAMC,eAAe,GAAGA,CAAA,KAC9B,IAAAC,MAAA,CAAAC,aAAA,EAACJ,WAAA,CAAAK,GAAG;EAACC,KAAK,EAAC,GAAG;EAACC,MAAM,EAAC,GAAG;EAACC,IAAI,EAAC,MAAM;EAACC,KAAK,EAAC;AAA4B,GACvE,IAAAN,MAAA,CAAAC,aAAA,EAACJ,WAAA,CAAAU,MAAM;EAACC,EAAE,EAAC,GAAG;EAACC,EAAE,EAAC,GAAG;EAACC,CAAC,EAAC;AAAG,CAAE,CACzB,CACL;AAACC,OAAA,CAAAZ,eAAA,GAAAA,eAAA"}

149
node_modules/@wordpress/components/build/guide/index.js generated vendored Normal file
View File

@@ -0,0 +1,149 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _classnames = _interopRequireDefault(require("classnames"));
var _element = require("@wordpress/element");
var _deprecated = _interopRequireDefault(require("@wordpress/deprecated"));
var _i18n = require("@wordpress/i18n");
var _modal = _interopRequireDefault(require("../modal"));
var _button = _interopRequireDefault(require("../button"));
var _pageControl = _interopRequireDefault(require("./page-control"));
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
/**
* `Guide` is a React component that renders a _user guide_ in a modal. The guide consists of several pages which the user can step through one by one. The guide is finished when the modal is closed or when the user clicks _Finish_ on the last page of the guide.
*
* ```jsx
* function MyTutorial() {
* const [ isOpen, setIsOpen ] = useState( true );
*
* if ( ! isOpen ) {
* return null;
* }
*
* return (
* <Guide
* onFinish={ () => setIsOpen( false ) }
* pages={ [
* {
* content: <p>Welcome to the ACME Store!</p>,
* },
* {
* image: <img src="https://acmestore.com/add-to-cart.png" />,
* content: (
* <p>
* Click <i>Add to Cart</i> to buy a product.
* </p>
* ),
* },
* ] }
* />
* );
* }
* ```
*/
function Guide({
children,
className,
contentLabel,
finishButtonText = (0, _i18n.__)('Finish'),
onFinish,
pages = []
}) {
const ref = (0, _element.useRef)(null);
const [currentPage, setCurrentPage] = (0, _element.useState)(0);
(0, _element.useEffect)(() => {
// Place focus at the top of the guide on mount and when the page changes.
const frame = ref.current?.querySelector('.components-guide');
if (frame instanceof HTMLElement) {
frame.focus();
}
}, [currentPage]);
(0, _element.useEffect)(() => {
if (_element.Children.count(children)) {
(0, _deprecated.default)('Passing children to <Guide>', {
since: '5.5',
alternative: 'the `pages` prop'
});
}
}, [children]);
if (_element.Children.count(children)) {
var _Children$map;
pages = (_Children$map = _element.Children.map(children, child => ({
content: child
}))) !== null && _Children$map !== void 0 ? _Children$map : [];
}
const canGoBack = currentPage > 0;
const canGoForward = currentPage < pages.length - 1;
const goBack = () => {
if (canGoBack) {
setCurrentPage(currentPage - 1);
}
};
const goForward = () => {
if (canGoForward) {
setCurrentPage(currentPage + 1);
}
};
if (pages.length === 0) {
return null;
}
return (0, _react.createElement)(_modal.default, {
className: (0, _classnames.default)('components-guide', className),
contentLabel: contentLabel,
isDismissible: pages.length > 1,
onRequestClose: onFinish,
onKeyDown: event => {
if (event.code === 'ArrowLeft') {
goBack();
// Do not scroll the modal's contents.
event.preventDefault();
} else if (event.code === 'ArrowRight') {
goForward();
// Do not scroll the modal's contents.
event.preventDefault();
}
},
ref: ref
}, (0, _react.createElement)("div", {
className: "components-guide__container"
}, (0, _react.createElement)("div", {
className: "components-guide__page"
}, pages[currentPage].image, pages.length > 1 && (0, _react.createElement)(_pageControl.default, {
currentPage: currentPage,
numberOfPages: pages.length,
setCurrentPage: setCurrentPage
}), pages[currentPage].content), (0, _react.createElement)("div", {
className: "components-guide__footer"
}, canGoBack && (0, _react.createElement)(_button.default, {
className: "components-guide__back-button",
variant: "tertiary",
onClick: goBack
}, (0, _i18n.__)('Previous')), canGoForward && (0, _react.createElement)(_button.default, {
className: "components-guide__forward-button",
variant: "primary",
onClick: goForward
}, (0, _i18n.__)('Next')), !canGoForward && (0, _react.createElement)(_button.default, {
className: "components-guide__finish-button",
variant: "primary",
onClick: onFinish
}, finishButtonText))));
}
var _default = Guide;
exports.default = _default;
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,43 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = PageControl;
var _react = require("react");
var _i18n = require("@wordpress/i18n");
var _button = _interopRequireDefault(require("../button"));
var _icons = require("./icons");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function PageControl({
currentPage,
numberOfPages,
setCurrentPage
}) {
return (0, _react.createElement)("ul", {
className: "components-guide__page-control",
"aria-label": (0, _i18n.__)('Guide controls')
}, Array.from({
length: numberOfPages
}).map((_, page) => (0, _react.createElement)("li", {
key: page
// Set aria-current="step" on the active page, see https://www.w3.org/TR/wai-aria-1.1/#aria-current
,
"aria-current": page === currentPage ? 'step' : undefined
}, (0, _react.createElement)(_button.default, {
key: page,
icon: (0, _react.createElement)(_icons.PageControlIcon, null),
"aria-label": (0, _i18n.sprintf)( /* translators: 1: current page number 2: total number of pages */
(0, _i18n.__)('Page %1$d of %2$d'), page + 1, numberOfPages),
onClick: () => setCurrentPage(page)
}))));
}
//# sourceMappingURL=page-control.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_i18n","require","_button","_interopRequireDefault","_icons","PageControl","currentPage","numberOfPages","setCurrentPage","_react","createElement","className","__","Array","from","length","map","_","page","key","undefined","default","icon","PageControlIcon","sprintf","onClick"],"sources":["@wordpress/components/src/guide/page-control.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __, sprintf } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport Button from '../button';\nimport { PageControlIcon } from './icons';\nimport type { PageControlProps } from './types';\n\nexport default function PageControl( {\n\tcurrentPage,\n\tnumberOfPages,\n\tsetCurrentPage,\n}: PageControlProps ) {\n\treturn (\n\t\t<ul\n\t\t\tclassName=\"components-guide__page-control\"\n\t\t\taria-label={ __( 'Guide controls' ) }\n\t\t>\n\t\t\t{ Array.from( { length: numberOfPages } ).map( ( _, page ) => (\n\t\t\t\t<li\n\t\t\t\t\tkey={ page }\n\t\t\t\t\t// Set aria-current=\"step\" on the active page, see https://www.w3.org/TR/wai-aria-1.1/#aria-current\n\t\t\t\t\taria-current={ page === currentPage ? 'step' : undefined }\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={ page }\n\t\t\t\t\t\ticon={ <PageControlIcon /> }\n\t\t\t\t\t\taria-label={ sprintf(\n\t\t\t\t\t\t\t/* translators: 1: current page number 2: total number of pages */\n\t\t\t\t\t\t\t__( 'Page %1$d of %2$d' ),\n\t\t\t\t\t\t\tpage + 1,\n\t\t\t\t\t\t\tnumberOfPages\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tonClick={ () => setCurrentPage( page ) }\n\t\t\t\t\t/>\n\t\t\t\t</li>\n\t\t\t) ) }\n\t\t</ul>\n\t);\n}\n"],"mappings":";;;;;;;;AAGA,IAAAA,KAAA,GAAAC,OAAA;AAKA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AATA;AACA;AACA;;AAGA;AACA;AACA;;AAKe,SAASI,WAAWA,CAAE;EACpCC,WAAW;EACXC,aAAa;EACbC;AACiB,CAAC,EAAG;EACrB,OACC,IAAAC,MAAA,CAAAC,aAAA;IACCC,SAAS,EAAC,gCAAgC;IAC1C,cAAa,IAAAC,QAAE,EAAE,gBAAiB;EAAG,GAEnCC,KAAK,CAACC,IAAI,CAAE;IAAEC,MAAM,EAAER;EAAc,CAAE,CAAC,CAACS,GAAG,CAAE,CAAEC,CAAC,EAAEC,IAAI,KACvD,IAAAT,MAAA,CAAAC,aAAA;IACCS,GAAG,EAAGD;IACN;IAAA;IACA,gBAAeA,IAAI,KAAKZ,WAAW,GAAG,MAAM,GAAGc;EAAW,GAE1D,IAAAX,MAAA,CAAAC,aAAA,EAACR,OAAA,CAAAmB,OAAM;IACNF,GAAG,EAAGD,IAAM;IACZI,IAAI,EAAG,IAAAb,MAAA,CAAAC,aAAA,EAACN,MAAA,CAAAmB,eAAe,MAAE,CAAG;IAC5B,cAAa,IAAAC,aAAO,GACnB;IACA,IAAAZ,QAAE,EAAE,mBAAoB,CAAC,EACzBM,IAAI,GAAG,CAAC,EACRX,aACD,CAAG;IACHkB,OAAO,EAAGA,CAAA,KAAMjB,cAAc,CAAEU,IAAK;EAAG,CACxC,CACE,CACH,CACC,CAAC;AAEP"}

26
node_modules/@wordpress/components/build/guide/page.js generated vendored Normal file
View File

@@ -0,0 +1,26 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = GuidePage;
var _react = require("react");
var _element = require("@wordpress/element");
var _deprecated = _interopRequireDefault(require("@wordpress/deprecated"));
/**
* WordPress dependencies
*/
function GuidePage(props) {
(0, _element.useEffect)(() => {
(0, _deprecated.default)('<GuidePage>', {
since: '5.5',
alternative: 'the `pages` prop in <Guide>'
});
}, []);
return (0, _react.createElement)("div", {
...props
});
}
//# sourceMappingURL=page.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_element","require","_deprecated","_interopRequireDefault","GuidePage","props","useEffect","deprecated","since","alternative","_react","createElement"],"sources":["@wordpress/components/src/guide/page.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useEffect } from '@wordpress/element';\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport type { WordPressComponentProps } from '../context';\n\nexport default function GuidePage(\n\tprops: WordPressComponentProps< {}, 'div', false >\n) {\n\tuseEffect( () => {\n\t\tdeprecated( '<GuidePage>', {\n\t\t\tsince: '5.5',\n\t\t\talternative: 'the `pages` prop in <Guide>',\n\t\t} );\n\t}, [] );\n\n\treturn <div { ...props } />;\n}\n"],"mappings":";;;;;;;;AAGA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAC,sBAAA,CAAAF,OAAA;AAJA;AACA;AACA;;AASe,SAASG,SAASA,CAChCC,KAAkD,EACjD;EACD,IAAAC,kBAAS,EAAE,MAAM;IAChB,IAAAC,mBAAU,EAAE,aAAa,EAAE;MAC1BC,KAAK,EAAE,KAAK;MACZC,WAAW,EAAE;IACd,CAAE,CAAC;EACJ,CAAC,EAAE,EAAG,CAAC;EAEP,OAAO,IAAAC,MAAA,CAAAC,aAAA;IAAA,GAAUN;EAAK,CAAI,CAAC;AAC5B"}

View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
//# sourceMappingURL=types.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":[],"sources":["@wordpress/components/src/guide/types.ts"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { ReactNode } from 'react';\n\n/**\n * Internal dependencies\n */\nimport type { ModalProps } from '../modal/types';\n\nexport type Page = {\n\t/**\n\t * Content of the page.\n\t */\n\tcontent: ReactNode;\n\t/**\n\t * Image displayed above the page content.\n\t */\n\timage?: ReactNode;\n};\n\nexport type GuideProps = {\n\t/**\n\t * Deprecated. Use `pages` prop instead.\n\t *\n\t * @deprecated since 5.5\n\t */\n\tchildren?: ReactNode;\n\t/**\n\t * A custom class to add to the modal.\n\t */\n\tclassName?: string;\n\t/**\n\t * Used as the modal's accessibility label.\n\t */\n\tcontentLabel: ModalProps[ 'contentLabel' ];\n\t/**\n\t * Use this to customize the label of the _Finish_ button shown at the end of the guide.\n\t *\n\t * @default 'Finish'\n\t */\n\tfinishButtonText?: string;\n\t/**\n\t * A function which is called when the guide is finished.\n\t */\n\tonFinish: ModalProps[ 'onRequestClose' ];\n\t/**\n\t * A list of objects describing each page in the guide. Each object **must** contain a `'content'` property and may optionally contain a `'image'` property.\n\t *\n\t * @default []\n\t */\n\tpages?: Page[];\n};\n\nexport type PageControlProps = {\n\t/**\n\t * Current page index.\n\t */\n\tcurrentPage: number;\n\t/**\n\t * Total number of pages.\n\t */\n\tnumberOfPages: number;\n\t/**\n\t * Called when user clicks on a `PageControlIcon` button.\n\t */\n\tsetCurrentPage: ( page: number ) => void;\n};\n"],"mappings":""}