@@ -45,13 +45,52 @@ class PanelsWithSidebar extends Component {
4545 ) ;
4646 }
4747
48+ getUniqueValues ( value , index , self ) {
49+ return self . indexOf ( value ) === index ;
50+ }
51+
4852 computeMenuOptions ( props ) {
49- const { children} = props ;
53+ const { children, order } = props ;
5054 const sections = [ ] ;
5155 const groupLookup = { } ;
5256 let groupIndex ;
57+ const orderedChildren = React . Children . toArray ( children ) ;
58+
59+ if ( order ) {
60+ const groupOrder = order . map ( panel => panel . group ) . filter ( this . getUniqueValues ) ;
61+ const nameOrder = order . map ( panel => panel . name ) . filter ( this . getUniqueValues ) ;
62+
63+ orderedChildren . sort ( ( a , b ) => {
64+ // if one of the elements is not in the groupOrder array, then it goes to the end of the list
65+ if ( groupOrder . includes ( a . props . group ) && ! groupOrder . includes ( b . props . group ) ) {
66+ return - 1 ;
67+ }
68+ if ( ! groupOrder . includes ( a . props . group ) && groupOrder . includes ( b . props . group ) ) {
69+ return 1 ;
70+ }
71+
72+ // if both elements are not in the groupOrder array, they get sorted alphabetically,
73+ // by group, then by name
74+ if ( ! groupOrder . includes ( a . props . group ) && ! groupOrder . includes ( b . props . group ) ) {
75+ const sortByGroup =
76+ a . props . group === b . props . group ? 0 : a . props . group < b . props . group ? - 1 : 1 ;
77+ const sortByName =
78+ a . props . name === b . props . name ? 0 : a . props . name < b . props . name ? - 1 : 1 ;
79+ return sortByGroup || sortByName ;
80+ }
81+
82+ // if both elements are in the groupOrder array, they get sorted according to their order in
83+ // the groupOrder, then nameOrder arrays.
84+ if ( groupOrder . includes ( a . props . group ) && groupOrder . includes ( b . props . group ) ) {
85+ const sortByGroup = groupOrder . indexOf ( a . props . group ) - groupOrder . indexOf ( b . props . group ) ;
86+ const sortByName = nameOrder . indexOf ( a . props . name ) - nameOrder . indexOf ( b . props . name ) ;
87+ return sortByGroup || sortByName ;
88+ }
89+ return 0 ;
90+ } ) ;
91+ }
5392
54- React . Children . forEach ( children , child => {
93+ orderedChildren . forEach ( child => {
5594 if ( ! child ) {
5695 return ;
5796 }
@@ -101,6 +140,7 @@ class PanelsWithSidebar extends Component {
101140
102141PanelsWithSidebar . propTypes = {
103142 children : PropTypes . node ,
143+ order : PropTypes . array ,
104144} ;
105145
106146PanelsWithSidebar . childContextTypes = {
0 commit comments