UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 12.9 kB
{ "version": 3, "sources": ["../../src/table-of-contents/edit.js"], "sourcesContent": ["import {\n\tBlockControls,\n\tBlockIcon,\n\tInspectorControls,\n\tstore as blockEditorStore,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport { createBlock } from '@wordpress/blocks';\nimport {\n\tPlaceholder,\n\tToggleControl,\n\tSelectControl,\n\tToolbarButton,\n\tToolbarGroup,\n\t__experimentalConfirmDialog as ConfirmDialog,\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n} from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { useState } from '@wordpress/element';\nimport { __, isRTL } from '@wordpress/i18n';\nimport { useInstanceId } from '@wordpress/compose';\nimport { store as noticeStore } from '@wordpress/notices';\nimport {\n\ttableOfContents as icon,\n\tformatListBullets,\n\tformatListBulletsRTL,\n\tformatListNumbered,\n\tformatListNumberedRTL,\n} from '@wordpress/icons';\nimport TableOfContentsList from './list';\nimport { createListItemBlocks, linearToNestedHeadingList } from './utils';\nimport { useObserveHeadings } from './hooks';\nimport { useToolsPanelDropdownMenuProps } from '../utils/hooks';\n\n/** @typedef {import('./utils').HeadingData} HeadingData */\n\nfunction TableOfContentsToolbar( {\n\tclientId,\n\theadingTree,\n\tordered,\n\tsetAttributes,\n} ) {\n\tconst canInsertList = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlockRootClientId, canInsertBlockType } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst rootClientId = getBlockRootClientId( clientId );\n\n\t\t\treturn canInsertBlockType( 'core/list', rootClientId );\n\t\t},\n\t\t[ clientId ]\n\t);\n\tconst { replaceBlocks } = useDispatch( blockEditorStore );\n\tconst [ isConfirmingDetach, setIsConfirmingDetach ] = useState( false );\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls>\n\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\tisRTL() ? formatListBulletsRTL : formatListBullets\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitle={ __( 'Unordered' ) }\n\t\t\t\t\t\tdescription={ __( 'Convert to unordered list' ) }\n\t\t\t\t\t\tonClick={ () => setAttributes( { ordered: false } ) }\n\t\t\t\t\t\tisActive={ ordered === false }\n\t\t\t\t\t/>\n\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\tisRTL() ? formatListNumberedRTL : formatListNumbered\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitle={ __( 'Ordered' ) }\n\t\t\t\t\t\tdescription={ __( 'Convert to ordered list' ) }\n\t\t\t\t\t\tonClick={ () => setAttributes( { ordered: true } ) }\n\t\t\t\t\t\tisActive={ ordered === true }\n\t\t\t\t\t/>\n\t\t\t\t</ToolbarGroup>\n\t\t\t\t{ canInsertList && (\n\t\t\t\t\t<ToolbarGroup>\n\t\t\t\t\t\t<ToolbarButton\n\t\t\t\t\t\t\tonClick={ () => setIsConfirmingDetach( true ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Detach' ) }\n\t\t\t\t\t\t</ToolbarButton>\n\t\t\t\t\t</ToolbarGroup>\n\t\t\t\t) }\n\t\t\t</BlockControls>\n\t\t\t{ isConfirmingDetach && (\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\tisOpen\n\t\t\t\t\ttitle={ __( 'Detach Table of Contents' ) }\n\t\t\t\t\t__experimentalHideHeader={ false }\n\t\t\t\t\tconfirmButtonText={ __( 'Detach' ) }\n\t\t\t\t\tonConfirm={ () => {\n\t\t\t\t\t\tsetIsConfirmingDetach( false );\n\t\t\t\t\t\treplaceBlocks(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tcreateBlock(\n\t\t\t\t\t\t\t\t'core/list',\n\t\t\t\t\t\t\t\t{ ordered },\n\t\t\t\t\t\t\t\tcreateListItemBlocks( headingTree, ordered )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} }\n\t\t\t\t\tonCancel={ () => setIsConfirmingDetach( false ) }\n\t\t\t\t\tsize=\"medium\"\n\t\t\t\t>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'The Table of Contents block lists the headings in the post. Detaching will enable you to edit, reorder, or remove entries. However, new headings will no longer be added automatically.'\n\t\t\t\t\t) }\n\t\t\t\t</ConfirmDialog>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default function TableOfContentsEdit( {\n\tattributes: {\n\t\theadings = [],\n\t\tonlyIncludeCurrentPage,\n\t\tmaxLevel,\n\t\tordered = true,\n\t},\n\tclientId,\n\tsetAttributes,\n} ) {\n\tuseObserveHeadings( clientId );\n\n\tconst blockProps = useBlockProps();\n\tconst instanceId = useInstanceId(\n\t\tTableOfContentsEdit,\n\t\t'table-of-contents'\n\t);\n\n\t// If a user clicks to a link prevent redirection and show a warning.\n\tconst { createWarningNotice } = useDispatch( noticeStore );\n\tconst showRedirectionPreventedNotice = ( event ) => {\n\t\tevent.preventDefault();\n\t\tcreateWarningNotice( __( 'Links are disabled in the editor.' ), {\n\t\t\tid: `block-library/core/table-of-contents/redirection-prevented/${ instanceId }`,\n\t\t\ttype: 'snackbar',\n\t\t} );\n\t};\n\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\tconst headingTree = linearToNestedHeadingList( headings );\n\n\tconst toolbarControls = (\n\t\t<TableOfContentsToolbar\n\t\t\tclientId={ clientId }\n\t\t\theadingTree={ headingTree }\n\t\t\tordered={ ordered }\n\t\t\tsetAttributes={ setAttributes }\n\t\t/>\n\t);\n\n\tconst inspectorControls = (\n\t\t<InspectorControls>\n\t\t\t<ToolsPanel\n\t\t\t\tlabel={ __( 'Settings' ) }\n\t\t\t\tresetAll={ () => {\n\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\tonlyIncludeCurrentPage: false,\n\t\t\t\t\t\tmaxLevel: undefined,\n\t\t\t\t\t\tordered: true,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t\tdropdownMenuProps={ dropdownMenuProps }\n\t\t\t>\n\t\t\t\t<ToolsPanelItem\n\t\t\t\t\thasValue={ () => !! onlyIncludeCurrentPage }\n\t\t\t\t\tlabel={ __( 'Only include current page' ) }\n\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\tsetAttributes( { onlyIncludeCurrentPage: false } )\n\t\t\t\t\t}\n\t\t\t\t\tisShownByDefault\n\t\t\t\t>\n\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\tlabel={ __( 'Only include current page' ) }\n\t\t\t\t\t\tchecked={ onlyIncludeCurrentPage }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( { onlyIncludeCurrentPage: value } )\n\t\t\t\t\t\t}\n\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\tonlyIncludeCurrentPage\n\t\t\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t\t\t'Only including headings from the current page (if the post is paginated).'\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: __(\n\t\t\t\t\t\t\t\t\t\t'Include headings from all pages (if the post is paginated).'\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</ToolsPanelItem>\n\t\t\t\t<ToolsPanelItem\n\t\t\t\t\thasValue={ () => !! maxLevel }\n\t\t\t\t\tlabel={ __( 'Limit heading levels' ) }\n\t\t\t\t\tonDeselect={ () =>\n\t\t\t\t\t\tsetAttributes( { maxLevel: undefined } )\n\t\t\t\t\t}\n\t\t\t\t\tisShownByDefault\n\t\t\t\t>\n\t\t\t\t\t<SelectControl\n\t\t\t\t\t\tlabel={ __( 'Include headings down to level' ) }\n\t\t\t\t\t\tvalue={ maxLevel || '' }\n\t\t\t\t\t\toptions={ [\n\t\t\t\t\t\t\t{ value: '', label: __( 'All levels' ) },\n\t\t\t\t\t\t\t{ value: '1', label: __( 'Heading 1' ) },\n\t\t\t\t\t\t\t{ value: '2', label: __( 'Heading 2' ) },\n\t\t\t\t\t\t\t{ value: '3', label: __( 'Heading 3' ) },\n\t\t\t\t\t\t\t{ value: '4', label: __( 'Heading 4' ) },\n\t\t\t\t\t\t\t{ value: '5', label: __( 'Heading 5' ) },\n\t\t\t\t\t\t\t{ value: '6', label: __( 'Heading 6' ) },\n\t\t\t\t\t\t] }\n\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\tsetAttributes( {\n\t\t\t\t\t\t\t\tmaxLevel: value ? parseInt( value ) : undefined,\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t}\n\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t! maxLevel\n\t\t\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t\t\t'Including all heading levels in the table of contents.'\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: __(\n\t\t\t\t\t\t\t\t\t\t'Only include headings up to and including this level.'\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t</ToolsPanelItem>\n\t\t\t</ToolsPanel>\n\t\t</InspectorControls>\n\t);\n\n\t// If there are no headings or the only heading is empty.\n\t// Note that the toolbar controls are intentionally omitted since the\n\t// \"Detach\" option is useless to the placeholder state.\n\tif ( headings.length === 0 ) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div { ...blockProps }>\n\t\t\t\t\t<Placeholder\n\t\t\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\t\t\tlabel={ __( 'Table of Contents' ) }\n\t\t\t\t\t\tinstructions={ __(\n\t\t\t\t\t\t\t'Start adding Heading blocks to create a table of contents. Headings with HTML anchors will be linked here.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{ inspectorControls }\n\t\t\t</>\n\t\t);\n\t}\n\n\tconst ListTag = ordered ? 'ol' : 'ul';\n\n\treturn (\n\t\t<>\n\t\t\t<nav { ...blockProps }>\n\t\t\t\t<ListTag>\n\t\t\t\t\t<TableOfContentsList\n\t\t\t\t\t\tnestedHeadingList={ headingTree }\n\t\t\t\t\t\tdisableLinkActivation\n\t\t\t\t\t\tonClick={ showRedirectionPreventedNotice }\n\t\t\t\t\t\tordered={ ordered }\n\t\t\t\t\t/>\n\t\t\t\t</ListTag>\n\t\t\t</nav>\n\t\t\t{ toolbarControls }\n\t\t\t{ inspectorControls }\n\t\t</>\n\t);\n}\n"], "mappings": "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", "names": [] }