@wordpress/block-editor
Version:
77 lines (71 loc) • 3.19 kB
JavaScript
/**
* WordPress dependencies
*/
import { __experimentalUseSlotFills as useSlotFills } from '@wordpress/components';
import { useSelect } from '@wordpress/data';
/**
* Internal dependencies
*/
import InspectorControlsGroups from '../inspector-controls/groups';
import useIsListViewTabDisabled from './use-is-list-view-tab-disabled';
import { InspectorAdvancedControls } from '../inspector-controls';
import { TAB_LIST_VIEW, TAB_SETTINGS, TAB_STYLES } from './utils';
import { store as blockEditorStore } from '../../store';
const EMPTY_ARRAY = [];
function getShowTabs(blockName, tabSettings = {}) {
// Block specific setting takes precedence over generic default.
if (tabSettings[blockName] !== undefined) {
return tabSettings[blockName];
}
// Use generic default if set over the Gutenberg experiment option.
if (tabSettings.default !== undefined) {
return tabSettings.default;
}
return true;
}
export default function useInspectorControlsTabs(blockName) {
const tabs = [];
const {
bindings: bindingsGroup,
border: borderGroup,
color: colorGroup,
default: defaultGroup,
dimensions: dimensionsGroup,
list: listGroup,
position: positionGroup,
styles: stylesGroup,
typography: typographyGroup,
effects: effectsGroup
} = InspectorControlsGroups;
// List View Tab: If there are any fills for the list group add that tab.
const listViewDisabled = useIsListViewTabDisabled(blockName);
const listFills = useSlotFills(listGroup.name);
const hasListFills = !listViewDisabled && !!listFills && listFills.length;
// Styles Tab: Add this tab if there are any fills for block supports
// e.g. border, color, spacing, typography, etc.
const styleFills = [...(useSlotFills(borderGroup.name) || []), ...(useSlotFills(colorGroup.name) || []), ...(useSlotFills(dimensionsGroup.name) || []), ...(useSlotFills(stylesGroup.name) || []), ...(useSlotFills(typographyGroup.name) || []), ...(useSlotFills(effectsGroup.name) || [])];
const hasStyleFills = styleFills.length;
// Settings Tab: If we don't have multiple tabs to display
// (i.e. both list view and styles), check only the default and position
// InspectorControls slots. If we have multiple tabs, we'll need to check
// the advanced controls slot as well to ensure they are rendered.
const advancedFills = [...(useSlotFills(InspectorAdvancedControls.slotName) || []), ...(useSlotFills(bindingsGroup.name) || [])];
const settingsFills = [...(useSlotFills(defaultGroup.name) || []), ...(useSlotFills(positionGroup.name) || []), ...(hasListFills && hasStyleFills > 1 ? advancedFills : [])];
// Add the tabs in the order that they will default to if available.
// List View > Settings > Styles.
if (hasListFills) {
tabs.push(TAB_LIST_VIEW);
}
if (settingsFills.length) {
tabs.push(TAB_SETTINGS);
}
if (hasStyleFills) {
tabs.push(TAB_STYLES);
}
const tabSettings = useSelect(select => {
return select(blockEditorStore).getSettings().blockInspectorTabs;
}, []);
const showTabs = getShowTabs(blockName, tabSettings);
return showTabs ? tabs : EMPTY_ARRAY;
}
//# sourceMappingURL=use-inspector-controls-tabs.js.map