@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
8 lines (7 loc) • 21.3 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/components/post-taxonomies/hierarchical-term-selector.js"],
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { __, _n, _x, sprintf } from '@wordpress/i18n';\nimport { useMemo, useState } from '@wordpress/element';\nimport { store as noticesStore } from '@wordpress/notices';\nimport {\n\tButton,\n\tCheckboxControl,\n\tTextControl,\n\tTreeSelect,\n\twithFilters,\n\tFlex,\n\tFlexItem,\n\tSearchControl,\n\tSpinner,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { useDebounce } from '@wordpress/compose';\nimport {\n\tstore as coreStore,\n\tprivateApis as coreDataPrivateApis,\n} from '@wordpress/core-data';\nimport { speak } from '@wordpress/a11y';\nimport { decodeEntities } from '@wordpress/html-entities';\n\n/**\n * Internal dependencies\n */\nimport { buildTermsTree } from '../../utils/terms';\nimport { store as editorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nconst { normalizeTextString } = unlock( componentsPrivateApis );\nconst { RECEIVE_INTERMEDIATE_RESULTS } = unlock( coreDataPrivateApis );\n\n/**\n * Module Constants\n */\nconst DEFAULT_QUERY = {\n\tper_page: -1,\n\torderby: 'name',\n\torder: 'asc',\n\t_fields: 'id,name,parent',\n\tcontext: 'view',\n\t[ RECEIVE_INTERMEDIATE_RESULTS ]: true,\n};\nconst MIN_TERMS_COUNT_FOR_FILTER = 8;\nconst EMPTY_ARRAY = [];\n\n/**\n * Sort Terms by Selected.\n *\n * @param {Object[]} termsTree Array of terms in tree format.\n * @param {number[]} terms Selected terms.\n *\n * @return {Object[]} Sorted array of terms.\n */\nexport function sortBySelected( termsTree, terms ) {\n\tconst treeHasSelection = ( termTree ) => {\n\t\tif ( terms.indexOf( termTree.id ) !== -1 ) {\n\t\t\treturn true;\n\t\t}\n\t\tif ( undefined === termTree.children ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\ttermTree.children\n\t\t\t\t.map( treeHasSelection )\n\t\t\t\t.filter( ( child ) => child ).length > 0\n\t\t);\n\t};\n\tconst termOrChildIsSelected = ( termA, termB ) => {\n\t\tconst termASelected = treeHasSelection( termA );\n\t\tconst termBSelected = treeHasSelection( termB );\n\n\t\tif ( termASelected === termBSelected ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( termASelected && ! termBSelected ) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif ( ! termASelected && termBSelected ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\tconst newTermTree = [ ...termsTree ];\n\tnewTermTree.sort( termOrChildIsSelected );\n\treturn newTermTree;\n}\n\n/**\n * Find term by parent id or name.\n *\n * @param {Object[]} terms Array of Terms.\n * @param {number|string} parent id.\n * @param {string} name Term name.\n * @return {Object} Term object.\n */\nexport function findTerm( terms, parent, name ) {\n\treturn terms.find( ( term ) => {\n\t\treturn (\n\t\t\t( ( ! term.parent && ! parent ) ||\n\t\t\t\tparseInt( term.parent ) === parseInt( parent ) ) &&\n\t\t\tterm.name.toLowerCase() === name.toLowerCase()\n\t\t);\n\t} );\n}\n\n/**\n * Get filter matcher function.\n *\n * @param {string} filterValue Filter value.\n * @return {(function(Object): (Object|boolean))} Matcher function.\n */\nexport function getFilterMatcher( filterValue ) {\n\tconst matchTermsForFilter = ( originalTerm ) => {\n\t\tif ( '' === filterValue ) {\n\t\t\treturn originalTerm;\n\t\t}\n\n\t\t// Shallow clone, because we'll be filtering the term's children and\n\t\t// don't want to modify the original term.\n\t\tconst term = { ...originalTerm };\n\n\t\t// Map and filter the children, recursive so we deal with grandchildren\n\t\t// and any deeper levels.\n\t\tif ( term.children.length > 0 ) {\n\t\t\tterm.children = term.children\n\t\t\t\t.map( matchTermsForFilter )\n\t\t\t\t.filter( ( child ) => child );\n\t\t}\n\n\t\t// If the term's name contains the filterValue, or it has children\n\t\t// (i.e. some child matched at some point in the tree) then return it.\n\t\tif (\n\t\t\t-1 !==\n\t\t\t\tnormalizeTextString( term.name ).indexOf(\n\t\t\t\t\tnormalizeTextString( filterValue )\n\t\t\t\t) ||\n\t\t\tterm.children.length > 0\n\t\t) {\n\t\t\treturn term;\n\t\t}\n\n\t\t// Otherwise, return false. After mapping, the list of terms will need\n\t\t// to have false values filtered out.\n\t\treturn false;\n\t};\n\treturn matchTermsForFilter;\n}\n\n/**\n * Hierarchical term selector.\n *\n * @param {Object} props Component props.\n * @param {string} props.slug Taxonomy slug.\n * @return {Element} Hierarchical term selector component.\n */\nexport function HierarchicalTermSelector( { slug } ) {\n\tconst [ adding, setAdding ] = useState( false );\n\tconst [ formName, setFormName ] = useState( '' );\n\t/**\n\t * @type {[number|'', Function]}\n\t */\n\tconst [ formParent, setFormParent ] = useState( '' );\n\tconst [ showForm, setShowForm ] = useState( false );\n\tconst [ filterValue, setFilterValue ] = useState( '' );\n\tconst [ filteredTermsTree, setFilteredTermsTree ] = useState( [] );\n\tconst debouncedSpeak = useDebounce( speak, 500 );\n\n\tconst {\n\t\thasCreateAction,\n\t\thasAssignAction,\n\t\tterms,\n\t\tloading,\n\t\tavailableTerms,\n\t\ttaxonomy,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getCurrentPost, getEditedPostAttribute } =\n\t\t\t\tselect( editorStore );\n\t\t\tconst { getEntityRecord, getEntityRecords, isResolving } =\n\t\t\t\tselect( coreStore );\n\t\t\tconst _taxonomy = getEntityRecord( 'root', 'taxonomy', slug );\n\t\t\tconst post = getCurrentPost();\n\n\t\t\treturn {\n\t\t\t\thasCreateAction: _taxonomy\n\t\t\t\t\t? !! post._links?.[\n\t\t\t\t\t\t\t'wp:action-create-' + _taxonomy.rest_base\n\t\t\t\t\t ]\n\t\t\t\t\t: false,\n\t\t\t\thasAssignAction: _taxonomy\n\t\t\t\t\t? !! post._links?.[\n\t\t\t\t\t\t\t'wp:action-assign-' + _taxonomy.rest_base\n\t\t\t\t\t ]\n\t\t\t\t\t: false,\n\t\t\t\tterms: _taxonomy\n\t\t\t\t\t? getEditedPostAttribute( _taxonomy.rest_base )\n\t\t\t\t\t: EMPTY_ARRAY,\n\t\t\t\tloading: isResolving( 'getEntityRecords', [\n\t\t\t\t\t'taxonomy',\n\t\t\t\t\tslug,\n\t\t\t\t\tDEFAULT_QUERY,\n\t\t\t\t] ),\n\t\t\t\tavailableTerms:\n\t\t\t\t\tgetEntityRecords( 'taxonomy', slug, DEFAULT_QUERY ) ||\n\t\t\t\t\tEMPTY_ARRAY,\n\t\t\t\ttaxonomy: _taxonomy,\n\t\t\t};\n\t\t},\n\t\t[ slug ]\n\t);\n\n\tconst { editPost } = useDispatch( editorStore );\n\tconst { saveEntityRecord } = useDispatch( coreStore );\n\n\tconst availableTermsTree = useMemo(\n\t\t() => sortBySelected( buildTermsTree( availableTerms ), terms ),\n\t\t// Remove `terms` from the dependency list to avoid reordering every time\n\t\t// checking or unchecking a term.\n\t\t[ availableTerms ]\n\t);\n\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\n\tif ( ! hasAssignAction ) {\n\t\treturn null;\n\t}\n\n\t/**\n\t * Append new term.\n\t *\n\t * @param {Object} term Term object.\n\t * @return {Promise} A promise that resolves to save term object.\n\t */\n\tconst addTerm = ( term ) => {\n\t\treturn saveEntityRecord( 'taxonomy', slug, term, {\n\t\t\tthrowOnError: true,\n\t\t} );\n\t};\n\n\t/**\n\t * Update terms for post.\n\t *\n\t * @param {number[]} termIds Term ids.\n\t */\n\tconst onUpdateTerms = ( termIds ) => {\n\t\teditPost( { [ taxonomy.rest_base ]: termIds } );\n\t};\n\n\t/**\n\t * Handler for checking term.\n\t *\n\t * @param {number} termId\n\t */\n\tconst onChange = ( termId ) => {\n\t\tconst hasTerm = terms.includes( termId );\n\t\tconst newTerms = hasTerm\n\t\t\t? terms.filter( ( id ) => id !== termId )\n\t\t\t: [ ...terms, termId ];\n\t\tonUpdateTerms( newTerms );\n\t};\n\n\tconst onChangeFormName = ( value ) => {\n\t\tsetFormName( value );\n\t};\n\n\t/**\n\t * Handler for changing form parent.\n\t *\n\t * @param {number|''} parentId Parent post id.\n\t */\n\tconst onChangeFormParent = ( parentId ) => {\n\t\tsetFormParent( parentId );\n\t};\n\n\tconst onToggleForm = () => {\n\t\tsetShowForm( ! showForm );\n\t};\n\n\tconst onAddTerm = async ( event ) => {\n\t\tevent.preventDefault();\n\t\tif ( formName === '' || adding ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the term we are adding already exists.\n\t\tconst existingTerm = findTerm( availableTerms, formParent, formName );\n\t\tif ( existingTerm ) {\n\t\t\t// If the term we are adding exists but is not selected select it.\n\t\t\tif ( ! terms.some( ( term ) => term === existingTerm.id ) ) {\n\t\t\t\tonUpdateTerms( [ ...terms, existingTerm.id ] );\n\t\t\t}\n\n\t\t\tsetFormName( '' );\n\t\t\tsetFormParent( '' );\n\n\t\t\treturn;\n\t\t}\n\t\tsetAdding( true );\n\t\tlet newTerm;\n\t\ttry {\n\t\t\tnewTerm = await addTerm( {\n\t\t\t\tname: formName,\n\t\t\t\tparent: formParent ? formParent : undefined,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\ttype: 'snackbar',\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\t\tconst defaultName =\n\t\t\tslug === 'category' ? __( 'Category' ) : __( 'Term' );\n\t\tconst termAddedMessage = sprintf(\n\t\t\t/* translators: %s: term name. */\n\t\t\t_x( '%s added', 'term' ),\n\t\t\ttaxonomy?.labels?.singular_name ?? defaultName\n\t\t);\n\t\tspeak( termAddedMessage, 'assertive' );\n\t\tsetAdding( false );\n\t\tsetFormName( '' );\n\t\tsetFormParent( '' );\n\t\tonUpdateTerms( [ ...terms, newTerm.id ] );\n\t};\n\n\tconst setFilter = ( value ) => {\n\t\tconst newFilteredTermsTree = availableTermsTree\n\t\t\t.map( getFilterMatcher( value ) )\n\t\t\t.filter( ( term ) => term );\n\t\tconst getResultCount = ( termsTree ) => {\n\t\t\tlet count = 0;\n\t\t\tfor ( let i = 0; i < termsTree.length; i++ ) {\n\t\t\t\tcount++;\n\t\t\t\tif ( undefined !== termsTree[ i ].children ) {\n\t\t\t\t\tcount += getResultCount( termsTree[ i ].children );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t};\n\n\t\tsetFilterValue( value );\n\t\tsetFilteredTermsTree( newFilteredTermsTree );\n\n\t\tconst resultCount = getResultCount( newFilteredTermsTree );\n\t\tconst resultsFoundMessage = sprintf(\n\t\t\t/* translators: %d: number of results. */\n\t\t\t_n( '%d result found.', '%d results found.', resultCount ),\n\t\t\tresultCount\n\t\t);\n\n\t\tdebouncedSpeak( resultsFoundMessage, 'assertive' );\n\t};\n\n\tconst renderTerms = ( renderedTerms ) => {\n\t\treturn renderedTerms.map( ( term ) => {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tkey={ term.id }\n\t\t\t\t\tclassName=\"editor-post-taxonomies__hierarchical-terms-choice\"\n\t\t\t\t>\n\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\tchecked={ terms.indexOf( term.id ) !== -1 }\n\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\tconst termId = parseInt( term.id, 10 );\n\t\t\t\t\t\t\tonChange( termId );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tlabel={ decodeEntities( term.name ) }\n\t\t\t\t\t/>\n\t\t\t\t\t{ !! term.children.length && (\n\t\t\t\t\t\t<div className=\"editor-post-taxonomies__hierarchical-terms-subchoices\">\n\t\t\t\t\t\t\t{ renderTerms( term.children ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t</div>\n\t\t\t);\n\t\t} );\n\t};\n\n\tconst labelWithFallback = (\n\t\tlabelProperty,\n\t\tfallbackIsCategory,\n\t\tfallbackIsNotCategory\n\t) =>\n\t\ttaxonomy?.labels?.[ labelProperty ] ??\n\t\t( slug === 'category' ? fallbackIsCategory : fallbackIsNotCategory );\n\n\tconst newTermButtonLabel = labelWithFallback(\n\t\t'add_new_item',\n\t\t__( 'Add Category' ),\n\t\t__( 'Add Term' )\n\t);\n\tconst newTermLabel = labelWithFallback(\n\t\t'new_item_name',\n\t\t__( 'Add Category' ),\n\t\t__( 'Add Term' )\n\t);\n\tconst parentSelectLabel = labelWithFallback(\n\t\t'parent_item',\n\t\t__( 'Parent Category' ),\n\t\t__( 'Parent Term' )\n\t);\n\tconst noParentOption = `\u2014 ${ parentSelectLabel } \u2014`;\n\tconst newTermSubmitLabel = newTermButtonLabel;\n\tconst filterLabel = taxonomy?.labels?.search_items ?? __( 'Search Terms' );\n\tconst groupLabel = taxonomy?.name ?? __( 'Terms' );\n\tconst showFilter = availableTerms.length >= MIN_TERMS_COUNT_FOR_FILTER;\n\n\treturn (\n\t\t<Flex direction=\"column\" gap=\"4\">\n\t\t\t{ showFilter && ! loading && (\n\t\t\t\t<SearchControl\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\tlabel={ filterLabel }\n\t\t\t\t\tplaceholder={ filterLabel }\n\t\t\t\t\tvalue={ filterValue }\n\t\t\t\t\tonChange={ setFilter }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ loading && (\n\t\t\t\t<Flex\n\t\t\t\t\tjustify=\"center\"\n\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t// Match SearchControl height to prevent layout shift.\n\t\t\t\t\t\theight: '40px',\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Spinner />\n\t\t\t\t</Flex>\n\t\t\t) }\n\t\t\t<div\n\t\t\t\tclassName=\"editor-post-taxonomies__hierarchical-terms-list\"\n\t\t\t\ttabIndex=\"0\"\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label={ groupLabel }\n\t\t\t>\n\t\t\t\t{ renderTerms(\n\t\t\t\t\t'' !== filterValue ? filteredTermsTree : availableTermsTree\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t{ ! loading && hasCreateAction && (\n\t\t\t\t<FlexItem>\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tonClick={ onToggleForm }\n\t\t\t\t\t\tclassName=\"editor-post-taxonomies__hierarchical-terms-add\"\n\t\t\t\t\t\taria-expanded={ showForm }\n\t\t\t\t\t\tvariant=\"link\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ newTermButtonLabel }\n\t\t\t\t\t</Button>\n\t\t\t\t</FlexItem>\n\t\t\t) }\n\t\t\t{ showForm && (\n\t\t\t\t<form onSubmit={ onAddTerm }>\n\t\t\t\t\t<Flex direction=\"column\" gap=\"4\">\n\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tclassName=\"editor-post-taxonomies__hierarchical-terms-input\"\n\t\t\t\t\t\t\tlabel={ newTermLabel }\n\t\t\t\t\t\t\tvalue={ formName }\n\t\t\t\t\t\t\tonChange={ onChangeFormName }\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ !! availableTerms.length && (\n\t\t\t\t\t\t\t<TreeSelect\n\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\tlabel={ parentSelectLabel }\n\t\t\t\t\t\t\t\tnoOptionLabel={ noParentOption }\n\t\t\t\t\t\t\t\tonChange={ onChangeFormParent }\n\t\t\t\t\t\t\t\tselectedId={ formParent }\n\t\t\t\t\t\t\t\ttree={ availableTermsTree }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t<FlexItem>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tclassName=\"editor-post-taxonomies__hierarchical-terms-submit\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ newTermSubmitLabel }\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</FlexItem>\n\t\t\t\t\t</Flex>\n\t\t\t\t</form>\n\t\t\t) }\n\t\t</Flex>\n\t);\n}\n\nexport default withFilters( 'editor.PostTaxonomyType' )(\n\tHierarchicalTermSelector\n);\n"],
"mappings": "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",
"names": ["componentsPrivateApis", "coreDataPrivateApis", "editorStore", "coreStore", "noticesStore"]
}