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>
199 lines
7.4 KiB
JavaScript
199 lines
7.4 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = exports.TabPanel = void 0;
|
|
var _react = require("react");
|
|
var Ariakit = _interopRequireWildcard(require("@ariakit/react"));
|
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
var _element = require("@wordpress/element");
|
|
var _compose = require("@wordpress/compose");
|
|
var _button = _interopRequireDefault(require("../button"));
|
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
/**
|
|
* External dependencies
|
|
*/
|
|
// eslint-disable-next-line no-restricted-imports
|
|
|
|
/**
|
|
* WordPress dependencies
|
|
*/
|
|
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
|
|
// Separate the actual tab name from the instance ID. This is
|
|
// necessary because Ariakit internally uses the element ID when
|
|
// a new tab is selected, but our implementation looks specifically
|
|
// for the tab name to be passed to the `onSelect` callback.
|
|
const extractTabName = id => {
|
|
if (typeof id === 'undefined' || id === null) {
|
|
return;
|
|
}
|
|
return id.match(/^tab-panel-[0-9]*-(.*)/)?.[1];
|
|
};
|
|
|
|
/**
|
|
* TabPanel is an ARIA-compliant tabpanel.
|
|
*
|
|
* TabPanels organize content across different screens, data sets, and interactions.
|
|
* It has two sections: a list of tabs, and the view to show when tabs are chosen.
|
|
*
|
|
* ```jsx
|
|
* import { TabPanel } from '@wordpress/components';
|
|
*
|
|
* const onSelect = ( tabName ) => {
|
|
* console.log( 'Selecting tab', tabName );
|
|
* };
|
|
*
|
|
* const MyTabPanel = () => (
|
|
* <TabPanel
|
|
* className="my-tab-panel"
|
|
* activeClass="active-tab"
|
|
* onSelect={ onSelect }
|
|
* tabs={ [
|
|
* {
|
|
* name: 'tab1',
|
|
* title: 'Tab 1',
|
|
* className: 'tab-one',
|
|
* },
|
|
* {
|
|
* name: 'tab2',
|
|
* title: 'Tab 2',
|
|
* className: 'tab-two',
|
|
* },
|
|
* ] }
|
|
* >
|
|
* { ( tab ) => <p>{ tab.title }</p> }
|
|
* </TabPanel>
|
|
* );
|
|
* ```
|
|
*/
|
|
const UnforwardedTabPanel = ({
|
|
className,
|
|
children,
|
|
tabs,
|
|
selectOnMove = true,
|
|
initialTabName,
|
|
orientation = 'horizontal',
|
|
activeClass = 'is-active',
|
|
onSelect
|
|
}, ref) => {
|
|
const instanceId = (0, _compose.useInstanceId)(TabPanel, 'tab-panel');
|
|
const prependInstanceId = (0, _element.useCallback)(tabName => {
|
|
if (typeof tabName === 'undefined') {
|
|
return;
|
|
}
|
|
return `${instanceId}-${tabName}`;
|
|
}, [instanceId]);
|
|
const tabStore = Ariakit.useTabStore({
|
|
setSelectedId: newTabValue => {
|
|
if (typeof newTabValue === 'undefined' || newTabValue === null) {
|
|
return;
|
|
}
|
|
const newTab = tabs.find(t => prependInstanceId(t.name) === newTabValue);
|
|
if (newTab?.disabled || newTab === selectedTab) {
|
|
return;
|
|
}
|
|
const simplifiedTabName = extractTabName(newTabValue);
|
|
if (typeof simplifiedTabName === 'undefined') {
|
|
return;
|
|
}
|
|
onSelect?.(simplifiedTabName);
|
|
},
|
|
orientation,
|
|
selectOnMove,
|
|
defaultSelectedId: prependInstanceId(initialTabName)
|
|
});
|
|
const selectedTabName = extractTabName(tabStore.useState('selectedId'));
|
|
const setTabStoreSelectedId = (0, _element.useCallback)(tabName => {
|
|
tabStore.setState('selectedId', prependInstanceId(tabName));
|
|
}, [prependInstanceId, tabStore]);
|
|
const selectedTab = tabs.find(({
|
|
name
|
|
}) => name === selectedTabName);
|
|
const previousSelectedTabName = (0, _compose.usePrevious)(selectedTabName);
|
|
|
|
// Ensure `onSelect` is called when the initial tab is selected.
|
|
(0, _element.useEffect)(() => {
|
|
if (previousSelectedTabName !== selectedTabName && selectedTabName === initialTabName && !!selectedTabName) {
|
|
onSelect?.(selectedTabName);
|
|
}
|
|
}, [selectedTabName, initialTabName, onSelect, previousSelectedTabName]);
|
|
|
|
// Handle selecting the initial tab.
|
|
(0, _element.useLayoutEffect)(() => {
|
|
// If there's a selected tab, don't override it.
|
|
if (selectedTab) {
|
|
return;
|
|
}
|
|
const initialTab = tabs.find(tab => tab.name === initialTabName);
|
|
// Wait for the denoted initial tab to be declared before making a
|
|
// selection. This ensures that if a tab is declared lazily it can
|
|
// still receive initial selection.
|
|
if (initialTabName && !initialTab) {
|
|
return;
|
|
}
|
|
if (initialTab && !initialTab.disabled) {
|
|
// Select the initial tab if it's not disabled.
|
|
setTabStoreSelectedId(initialTab.name);
|
|
} else {
|
|
// Fallback to the first enabled tab when the initial tab is
|
|
// disabled or it can't be found.
|
|
const firstEnabledTab = tabs.find(tab => !tab.disabled);
|
|
if (firstEnabledTab) {
|
|
setTabStoreSelectedId(firstEnabledTab.name);
|
|
}
|
|
}
|
|
}, [tabs, selectedTab, initialTabName, instanceId, setTabStoreSelectedId]);
|
|
|
|
// Handle the currently selected tab becoming disabled.
|
|
(0, _element.useEffect)(() => {
|
|
// This effect only runs when the selected tab is defined and becomes disabled.
|
|
if (!selectedTab?.disabled) {
|
|
return;
|
|
}
|
|
const firstEnabledTab = tabs.find(tab => !tab.disabled);
|
|
// If the currently selected tab becomes disabled, select the first enabled tab.
|
|
// (if there is one).
|
|
if (firstEnabledTab) {
|
|
setTabStoreSelectedId(firstEnabledTab.name);
|
|
}
|
|
}, [tabs, selectedTab?.disabled, setTabStoreSelectedId, instanceId]);
|
|
return (0, _react.createElement)("div", {
|
|
className: className,
|
|
ref: ref
|
|
}, (0, _react.createElement)(Ariakit.TabList, {
|
|
store: tabStore,
|
|
className: "components-tab-panel__tabs"
|
|
}, tabs.map(tab => {
|
|
return (0, _react.createElement)(Ariakit.Tab, {
|
|
key: tab.name,
|
|
id: prependInstanceId(tab.name),
|
|
className: (0, _classnames.default)('components-tab-panel__tabs-item', tab.className, {
|
|
[activeClass]: tab.name === selectedTabName
|
|
}),
|
|
disabled: tab.disabled,
|
|
"aria-controls": `${prependInstanceId(tab.name)}-view`,
|
|
render: (0, _react.createElement)(_button.default, {
|
|
icon: tab.icon,
|
|
label: tab.icon && tab.title,
|
|
showTooltip: !!tab.icon
|
|
})
|
|
}, !tab.icon && tab.title);
|
|
})), selectedTab && (0, _react.createElement)(Ariakit.TabPanel, {
|
|
id: `${prependInstanceId(selectedTab.name)}-view`,
|
|
store: tabStore,
|
|
tabId: prependInstanceId(selectedTab.name),
|
|
className: 'components-tab-panel__tab-content'
|
|
}, children(selectedTab)));
|
|
};
|
|
const TabPanel = (0, _element.forwardRef)(UnforwardedTabPanel);
|
|
exports.TabPanel = TabPanel;
|
|
var _default = TabPanel;
|
|
exports.default = _default;
|
|
//# sourceMappingURL=index.js.map
|