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

58
node_modules/reakit/src/Portal/Portal.tsx generated vendored Normal file
View File

@@ -0,0 +1,58 @@
import * as React from "react";
import * as ReactDOM from "react-dom";
import { useIsomorphicEffect } from "reakit-utils/useIsomorphicEffect";
import { canUseDOM } from "reakit-utils/canUseDOM";
export type PortalProps = {
/**
* Portal's children.
*/
children: React.ReactNode;
};
function getBodyElement() {
return canUseDOM ? document.body : null;
}
export const PortalContext = React.createContext<HTMLElement | null>(
getBodyElement()
);
export function Portal({ children }: PortalProps) {
// if it's a nested portal, context is the parent portal
// otherwise it's document.body
// https://github.com/reakit/reakit/issues/513
const context = React.useContext(PortalContext) || getBodyElement();
const [hostNode] = React.useState(() => {
if (canUseDOM) {
const element = document.createElement("div");
element.className = Portal.__className;
return element;
}
// ssr
return null;
});
useIsomorphicEffect(() => {
if (!hostNode || !context) return undefined;
context.appendChild(hostNode);
return () => {
context.removeChild(hostNode);
};
}, [hostNode, context]);
if (hostNode) {
return ReactDOM.createPortal(
<PortalContext.Provider value={hostNode}>
{children}
</PortalContext.Provider>,
hostNode
);
}
// ssr
return null;
}
Portal.__className = "__reakit-portal";
Portal.__selector = `.${Portal.__className}`;

33
node_modules/reakit/src/Portal/README.md generated vendored Normal file
View File

@@ -0,0 +1,33 @@
---
path: /docs/portal/
redirect_from:
- /components/portal/
---
# Portal
`Portal` is an abstract wrapper component that uses [React Portals](https://reactjs.org/docs/portals.html) underneath. It can be used to put anything in a portal and supports nested portals.
<carbon-ad></carbon-ad>
## Installation
```sh
npm install reakit
```
Learn more in [Get started](/docs/get-started/).
## Usage
```jsx
import { Portal } from "reakit/Portal";
function Example() {
return (
<div style={{ background: "red", color: "white" }}>
I am here, <Portal>but I am detached at the bottom of the page.</Portal>
</div>
);
}
```

View File

@@ -0,0 +1,73 @@
import * as React from "react";
import { render } from "reakit-test-utils";
import { Portal } from "../Portal";
test("render", () => {
const { baseElement } = render(<Portal>portal</Portal>);
expect(baseElement).toMatchInlineSnapshot(`
<body>
<div />
<div
class="__reakit-portal"
>
portal
</div>
</body>
`);
});
test("render nested", () => {
const { baseElement } = render(
<Portal>
portal1
<Portal>portal2</Portal>
</Portal>
);
expect(baseElement).toMatchInlineSnapshot(`
<body>
<div />
<div
class="__reakit-portal"
>
portal1
<div
class="__reakit-portal"
>
portal2
</div>
</div>
</body>
`);
});
test("render nested and sibling", () => {
const { baseElement } = render(
<>
<Portal>
portal1
<Portal>portal2</Portal>
</Portal>
<Portal>portal3</Portal>
</>
);
expect(baseElement).toMatchInlineSnapshot(`
<body>
<div />
<div
class="__reakit-portal"
>
portal1
<div
class="__reakit-portal"
>
portal2
</div>
</div>
<div
class="__reakit-portal"
>
portal3
</div>
</body>
`);
});

1
node_modules/reakit/src/Portal/index.ts generated vendored Normal file
View File

@@ -0,0 +1 @@
export * from "./Portal";