Skip to content

Commit db17ed3

Browse files
Made each taxonomy appear on its own panel.
Before all taxonomies appeared under "Categories & Tags" panel.
1 parent 4004ee2 commit db17ed3

File tree

9 files changed

+102
-68
lines changed

9 files changed

+102
-68
lines changed

components/panel/style.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
}
6464
.components-panel__body.is-opened > .components-panel__body-title {
6565
margin: -1 * $panel-padding;
66-
margin-bottom: 0;
66+
margin-bottom: 5px;
6767
}
6868

6969
.components-panel__body-toggle.components-button {

edit-post/components/sidebar/block-inspector-panel/style.scss

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66
margin: 0 0 1em 0;
77
}
88

9-
&.is-opened > .components-panel__body-title {
10-
margin-bottom: 5px;
11-
}
12-
139
.components-panel__body-toggle {
1410
color: $dark-gray-500;
1511
}

edit-post/components/sidebar/post-taxonomies/index.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,38 @@
22
* External Dependencies
33
*/
44
import { connect } from 'react-redux';
5+
import { get } from 'lodash';
56

67
/**
78
* WordPress dependencies
89
*/
9-
import { __ } from '@wordpress/i18n';
10-
import { PanelBody } from '@wordpress/components';
1110
import { PostTaxonomies as PostTaxonomiesForm, PostTaxonomiesCheck } from '@wordpress/editor';
1211

1312
/**
1413
* Internal dependencies
1514
*/
1615
import { isEditorSidebarPanelOpened } from '../../../store/selectors';
1716
import { toggleGeneralSidebarEditorPanel } from '../../../store/actions';
17+
import TaxonomyPanel from './taxonomy-panel';
1818

1919
/**
2020
* Module Constants
2121
*/
2222
const PANEL_NAME = 'post-taxonomies';
2323

24-
function PostTaxonomies( { isOpened, onTogglePanel } ) {
24+
function PostTaxonomies() {
2525
return (
2626
<PostTaxonomiesCheck>
27-
<PanelBody
28-
title={ __( 'Categories & Tags' ) }
29-
opened={ isOpened }
30-
onToggle={ onTogglePanel }
31-
>
32-
<PostTaxonomiesForm />
33-
</PanelBody>
27+
<PostTaxonomiesForm
28+
taxonomyWrapper={ ( content, taxonomy ) => {
29+
const slug = get( taxonomy, [ 'slug' ] );
30+
return (
31+
<TaxonomyPanel taxonomy={ taxonomy } key={ `taxonomy-panel-${ slug }` }>
32+
{ content }
33+
</TaxonomyPanel>
34+
);
35+
} }
36+
/>
3437
</PostTaxonomiesCheck>
3538
);
3639
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* External Dependencies
3+
*/
4+
import { get } from 'lodash';
5+
6+
/**
7+
* WordPress dependencies
8+
*/
9+
import { compose } from '@wordpress/element';
10+
import { PanelBody } from '@wordpress/components';
11+
import { withSelect, withDispatch } from '@wordpress/data';
12+
13+
function TaxonomyPanel( { taxonomy, isOpened, onTogglePanel, children } ) {
14+
const taxonomyMenuName = get( taxonomy, [ 'labels', 'menu_name' ] );
15+
if ( ! taxonomyMenuName ) {
16+
return null;
17+
}
18+
return (
19+
<PanelBody
20+
title={ taxonomyMenuName }
21+
opened={ isOpened }
22+
onToggle={ onTogglePanel }
23+
>
24+
{ children }
25+
</PanelBody>
26+
);
27+
}
28+
29+
export default compose(
30+
withSelect( ( select, ownProps ) => {
31+
const slug = get( ownProps.taxonomy, [ 'slug' ] );
32+
const panelName = slug ? `taxonomy-panel-${ slug }` : '';
33+
return {
34+
panelName,
35+
isOpened: slug ?
36+
select( 'core/edit-post' ).isEditorSidebarPanelOpened( panelName ) :
37+
false,
38+
};
39+
} ),
40+
withDispatch( ( dispatch, ownProps ) => ( {
41+
onTogglePanel: () => {
42+
if ( ownProps.panelName ) {
43+
return dispatch( 'core/edit-post' ).
44+
toggleGeneralSidebarEditorPanel( ownProps.panelName );
45+
}
46+
},
47+
} ) ),
48+
)( TaxonomyPanel );

editor/components/post-taxonomies/flat-term-selector.js

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class FlatTermSelector extends Component {
160160
}
161161

162162
render() {
163-
const { label, slug, taxonomy } = this.props;
163+
const { slug, taxonomy } = this.props;
164164
const { loading, availableTerms, selectedTerms } = this.state;
165165
const termNames = availableTerms.map( ( term ) => term.name );
166166
const newTermPlaceholderLabel = get(
@@ -178,24 +178,21 @@ class FlatTermSelector extends Component {
178178
const removeTermLabel = sprintf( _x( 'Remove %s: %%s', 'term' ), singularName );
179179

180180
return (
181-
<div className="editor-post-taxonomies__flat-terms-selector">
182-
<h3 className="editor-post-taxonomies__flat-terms-selector-title">{ label }</h3>
183-
<FormTokenField
184-
value={ selectedTerms }
185-
displayTransform={ unescapeString }
186-
suggestions={ termNames }
187-
onChange={ this.onChange }
188-
onInputChange={ this.searchTerms }
189-
maxSuggestions={ MAX_TERMS_SUGGESTIONS }
190-
disabled={ loading }
191-
placeholder={ newTermPlaceholderLabel }
192-
messages={ {
193-
added: termAddedLabel,
194-
removed: termRemovedLabel,
195-
remove: removeTermLabel,
196-
} }
197-
/>
198-
</div>
181+
<FormTokenField
182+
value={ selectedTerms }
183+
displayTransform={ unescapeString }
184+
suggestions={ termNames }
185+
onChange={ this.onChange }
186+
onInputChange={ this.searchTerms }
187+
maxSuggestions={ MAX_TERMS_SUGGESTIONS }
188+
disabled={ loading }
189+
placeholder={ newTermPlaceholderLabel }
190+
messages={ {
191+
added: termAddedLabel,
192+
removed: termRemovedLabel,
193+
remove: removeTermLabel,
194+
} }
195+
/>
199196
);
200197
}
201198
}

editor/components/post-taxonomies/hierarchical-term-selector.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { stringify } from 'querystring';
99
* WordPress dependencies
1010
*/
1111
import { __, _x, sprintf } from '@wordpress/i18n';
12-
import { Component, compose } from '@wordpress/element';
12+
import { Component, compose, Fragment } from '@wordpress/element';
1313
import { TreeSelect, withAPIData, withInstanceId, withSpokenMessages } from '@wordpress/components';
1414
import { buildTermsTree } from '@wordpress/utils';
1515

@@ -221,7 +221,7 @@ class HierarchicalTermSelector extends Component {
221221
}
222222

223223
render() {
224-
const { label, slug, taxonomy, instanceId } = this.props;
224+
const { slug, taxonomy, instanceId } = this.props;
225225
const { availableTermsTree, availableTerms, formName, formParent, loading, showForm } = this.state;
226226
const labelWithFallback = ( labelProperty, fallbackIsCategory, fallbackIsNotCategory ) => get(
227227
taxonomy,
@@ -249,8 +249,7 @@ class HierarchicalTermSelector extends Component {
249249

250250
/* eslint-disable jsx-a11y/no-onchange */
251251
return (
252-
<div className="editor-post-taxonomies__hierarchical-terms-selector">
253-
<h3 className="editor-post-taxonomies__hierarchical-terms-selector-title">{ label }</h3>
252+
<Fragment>
254253
{ this.renderTerms( availableTermsTree ) }
255254
{ ! loading &&
256255
<button
@@ -294,7 +293,7 @@ class HierarchicalTermSelector extends Component {
294293
</button>
295294
</form>
296295
}
297-
</div>
296+
</Fragment>
298297
);
299298
/* eslint-enable jsx-a11y/no-onchange */
300299
}

editor/components/post-taxonomies/index.js

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
* External Dependencies
33
*/
44
import { connect } from 'react-redux';
5-
import { filter, includes } from 'lodash';
5+
import { filter, identity, includes } from 'lodash';
66

77
/**
88
* WordPress dependencies
99
*/
1010
import { withAPIData } from '@wordpress/components';
11-
import { compose } from '@wordpress/element';
11+
import { compose, Fragment } from '@wordpress/element';
1212

1313
/**
1414
* Internal dependencies
@@ -18,23 +18,26 @@ import HierarchicalTermSelector from './hierarchical-term-selector';
1818
import FlatTermSelector from './flat-term-selector';
1919
import { getCurrentPostType } from '../../store/selectors';
2020

21-
export function PostTaxonomies( { postType, taxonomies } ) {
21+
export function PostTaxonomies( { postType, taxonomies, taxonomyWrapper = identity } ) {
2222
const availableTaxonomies = filter( taxonomies.data, ( taxonomy ) => includes( taxonomy.types, postType ) );
23-
23+
const taxonomyComponents = availableTaxonomies.map( ( taxonomy ) => {
24+
const TaxonomyComponent = taxonomy.hierarchical ? HierarchicalTermSelector : FlatTermSelector;
25+
return taxonomyWrapper(
26+
<TaxonomyComponent
27+
key={ taxonomy.slug }
28+
restBase={ taxonomy.rest_base }
29+
slug={ taxonomy.slug }
30+
/>,
31+
taxonomy
32+
);
33+
} );
34+
35+
// Fragment is used because enzyme shallow does not seems to handle correctly components returning just arrays.
36+
// Using debug method it was possible to verify shallow always output <undefined /> when arrays are used.
2437
return (
25-
<div>
26-
{ availableTaxonomies.map( ( taxonomy ) => {
27-
const TaxonomyComponent = taxonomy.hierarchical ? HierarchicalTermSelector : FlatTermSelector;
28-
return (
29-
<TaxonomyComponent
30-
key={ taxonomy.slug }
31-
label={ taxonomy.name }
32-
restBase={ taxonomy.rest_base }
33-
slug={ taxonomy.slug }
34-
/>
35-
);
36-
} ) }
37-
</div>
38+
<Fragment>
39+
{ taxonomyComponents }
40+
</Fragment>
3841
);
3942
}
4043

editor/components/post-taxonomies/style.scss

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
1-
.editor-post-taxonomies__flat-terms-selector,
2-
.editor-post-taxonomies__hierarchical-terms-selector {
3-
margin-top: $panel-padding;
4-
}
5-
6-
.editor-sidebar .editor-post-taxonomies__flat-terms-selector-title,
7-
.editor-sidebar .editor-post-taxonomies__hierarchical-terms-selector-title {
8-
display: block;
9-
margin-bottom: 10px;
10-
}
11-
121
.editor-post-taxonomies__hierarchical-terms-choice {
132
margin-bottom: 5px;
143
}

editor/components/post-taxonomies/test/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ describe( 'PostTaxonomies', () => {
4545

4646
expect( wrapper.children() ).toHaveLength( 1 );
4747
expect( wrapper.childAt( 0 ).props() ).toEqual( {
48-
label: 'Categories',
4948
slug: 'category',
5049
restBase: 'categories',
5150
} );

0 commit comments

Comments
 (0)