clientjs/packages/dashboard-components/src/ui/IndexList.jsx
changeset 0 5f4fcbc80b37
equal deleted inserted replaced
-1:000000000000 0:5f4fcbc80b37
       
     1 import React from 'react';
       
     2 import PropTypes from 'prop-types';
       
     3 import md5 from 'md5';
       
     4 
       
     5 import IndexEntryItem from './IndexEntryItem';
       
     6 
       
     7 const IndexEntry = ({ letter, items }) => (
       
     8   <li>
       
     9     { letter }
       
    10     <ul className="p-0 mb-2 small">
       
    11       {
       
    12         items.sort().map(indexEntryItem => <IndexEntryItem term={indexEntryItem} key={`${letter}_${md5(indexEntryItem)}`} />)
       
    13       }
       
    14     </ul>
       
    15   </li>
       
    16 );
       
    17 
       
    18 IndexEntry.propTypes = {
       
    19   letter: PropTypes.string.isRequired,
       
    20   items: PropTypes.arrayOf(PropTypes.string).isRequired,
       
    21 };
       
    22 
       
    23 const Index = ({ terms }) => {
       
    24   const termsIndex = terms.reduce((res, term) => {
       
    25     const firstLetter = term[0];
       
    26     res[firstLetter] = (res[firstLetter] || []);
       
    27     res[firstLetter].push(term);
       
    28     return res;
       
    29   }, {});
       
    30 
       
    31   return (
       
    32     <ul id="index" className="text-muted p-0">
       
    33       {
       
    34         Object.keys(termsIndex).sort().map(
       
    35           letter => <IndexEntry letter={letter} items={termsIndex[letter]} key={letter} />,
       
    36         )
       
    37       }
       
    38     </ul>
       
    39   );
       
    40 };
       
    41 
       
    42 Index.propTypes = {
       
    43   terms: PropTypes.arrayOf(PropTypes.string).isRequired,
       
    44 };
       
    45 
       
    46 const IndexList = ({ terms, className }) => (
       
    47   <div className={className}>
       
    48     <Index terms={terms} />
       
    49   </div>
       
    50 );
       
    51 
       
    52 IndexList.propTypes = {
       
    53   terms: PropTypes.arrayOf(PropTypes.string).isRequired,
       
    54   className: PropTypes.string.isRequired,
       
    55 };
       
    56 
       
    57 export default IndexList;