src/components/Search/SearchOverTime.tsx (287 lines of code) (raw):

import InfoIcon from '@mui/icons-material/InfoOutlined'; import Grid from '@mui/material/Grid'; import InputLabel from '@mui/material/InputLabel'; import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import { Box } from '@mui/system'; import { style } from 'typestyle'; import SearchDropdown from './SearchDropdown'; import SearchInputAndResults from './SearchInputAndResults'; import SelectedRevisions from './SelectedRevisions'; import TimeRangeDropdown from './TimeRangeDropdown'; import { compareOverTimeView, timeRanges } from '../../common/constants'; import { useAppSelector } from '../../hooks/app'; import { Strings } from '../../resources/Strings'; import { Spacing, //SearchStyles can be found in CompareCards.ts SearchStyles, Colors, FontSize, } from '../../styles'; import { Changeset, Repository } from '../../types/state'; import { TimeRange } from '../../types/types'; import { formatDateRange } from '../../utils/format'; interface SearchProps { hasEditButton: boolean; displayedRevisions: Changeset[]; baseRepo: Repository['name']; newRepo: Repository['name']; timeRangeValue: TimeRange['value']; formIsDisplayed: boolean; onRemoveRevision: (item: Changeset) => void; onSearchResultsToggle: (item: Changeset) => void; onBaseRepositoryChange: (repo: Repository['name']) => unknown; onNewRepositoryChange: (repo: Repository['name']) => unknown; onTimeRangeChange: (val: TimeRange['value']) => unknown; } export default function SearchOverTime({ hasEditButton, baseRepo, newRepo, displayedRevisions, timeRangeValue, onRemoveRevision, onSearchResultsToggle, onBaseRepositoryChange, onNewRepositoryChange, onTimeRangeChange, formIsDisplayed, }: SearchProps) { const mode = useAppSelector((state) => state.theme.mode); const styles = SearchStyles(mode); const timeRangeStrings = Strings.components.searchDefault.overTime.collapsed.timeRange; const stringsBase = Strings.components.searchDefault.overTime.collapsed.baseRepo; const stringsNew = Strings.components.searchDefault.overTime.collapsed.revisions; const timeRangeText = timeRanges.find( (entry) => entry.value === timeRangeValue, )?.text; const readOnlyStyles = style({ borderRadius: Spacing.xSmall, backgroundColor: mode === 'light' ? Colors.Background200 : Colors.Background300Dark, padding: '6px 12px 6px 16px', }); const maxWidthTimeRangeL = '430px'; const maxWidthTimeRangeS = '365px'; return ( <Grid className={styles.component}> {/**** Base - Time-Range Labels ****/} <Grid container spacing={2} className={`base-repo-dropdown ${styles.dropDown}`} > <Grid item xs display='flex' alignItems='center'> <InputLabel id='base-repo-dropdown--overtime' className='dropdown-select-label dropdown-select-label--base' > {stringsBase.selectLabelBase} </InputLabel> <Tooltip classes={{ tooltip: `tooltip-${mode === 'light' ? 'light' : 'dark'}`, }} placement='top' title={stringsBase.tooltipBase} > <InfoIcon fontSize='small' className='dropdown-info-icon' /> </Tooltip> </Grid> <Grid item xs display='flex' alignItems='center'> <InputLabel id='select-timerange-label' className='dropdown-select-label dropdown-select-label--time' > {timeRangeStrings.selectLabel} </InputLabel> <Tooltip classes={{ tooltip: `tooltip-${mode === 'light' ? 'light' : 'dark'}`, }} placement='top' title={timeRangeStrings.tooltip} > <InfoIcon fontSize='small' className='dropdown-info-icon' /> </Tooltip> </Grid> </Grid> {/**** Base - TimeRange ReadyOnly ****/} {!formIsDisplayed && ( <Grid container alignItems='flex-start' mb={3} p={0} ml={0} id='time-search-container--readonly' className={styles.container} > <Grid item xs style={{ maxWidth: hasEditButton ? maxWidthTimeRangeL : maxWidthTimeRangeS, }} className={`base-search-dropdown ${readOnlyStyles} ${ styles.dropDown } ${hasEditButton ? compareOverTimeView : ''}-base-dropdown`} > <Typography component='span' variant='body2' color='text.primary' alignItems='center' > {baseRepo} </Typography> </Grid> <Grid item xs style={{ maxWidth: hasEditButton ? maxWidthTimeRangeL : maxWidthTimeRangeS, }} className={`new-search-dropdown ${readOnlyStyles}`} > <div style={{ display: 'flex', justifyContent: 'space-between' }}> <Typography component='span' variant='body2' color='text.primary' alignItems='center' > {timeRangeText} </Typography> <Box sx={{ color: 'text.secondary' }} className={FontSize.Small}> {`(${formatDateRange( new Date(Date.now() - Number(timeRangeValue) * 1000), new Date(), )})`} </Box> </div> </Grid> </Grid> )} {/**** Base - TimeRange DropDowns Section ****/} {formIsDisplayed && ( <Grid container alignItems='flex-start' id='base-time-dropdown-container' mb={3} p={0} ml={0} className={`${styles.container}`} > <Grid item xs style={{ maxWidth: hasEditButton ? maxWidthTimeRangeL : maxWidthTimeRangeS, }} id='base_search-dropdown--time' className='base-search-dropdown' > <SearchDropdown compact={hasEditButton} selectLabel={stringsBase.selectLabelBase} searchType='base' repository={baseRepo} labelIdInfo='base-repo-dropdown--overtime' onChange={onBaseRepositoryChange} name='baseRepo' /> </Grid> <Grid item xs id='time-range' style={{ maxWidth: maxWidthTimeRangeL }} className={`new-search-dropdown ${hasEditButton ? 'small' : ''} ${ styles.dropDown } `} > <TimeRangeDropdown timeRangeValue={timeRangeValue} onChange={onTimeRangeChange} /> </Grid> </Grid> )} {/*** Revision- DropDown Labels Section ***/} <Grid item xs={2} className={`new-search-dropdown ${styles.dropDown}`}> <InputLabel id='repo-dropdown--overtime' className='dropdown-select-label' > {stringsNew.selectLabel} <Tooltip classes={{ tooltip: `tooltip-${mode === 'light' ? 'light' : 'dark'}`, }} placement='top' title={stringsNew.tooltip} > <InfoIcon fontSize='small' className='dropdown-info-icon' /> </Tooltip> </InputLabel> </Grid> {formIsDisplayed && ( <Grid container alignItems='flex-start' id='new-search-container--time' className={`${styles.container} show-container--time }`} > <Grid item xs={2} id='new_search-dropdown--time' className={`new-search-dropdown ${styles.dropDown} ${ hasEditButton ? 'small' : '' } ${hasEditButton ? compareOverTimeView : ''}-new-dropdown`} > <SearchDropdown compact={hasEditButton} selectLabel={stringsNew.selectLabel} searchType='new' repository={newRepo} labelIdInfo='repo-dropdown--overtime' onChange={onNewRepositoryChange} /> </Grid> <Grid item xs={7} id='new_search-input--time' className={`new-search-input--time ${styles.baseSearchInput}`} > <SearchInputAndResults compact={hasEditButton} inputPlaceholder={stringsNew.inputPlaceholder} displayedRevisions={displayedRevisions} searchType='new' repository={newRepo} onSearchResultsToggle={onSearchResultsToggle} /> </Grid> </Grid> )} {/***** Selected Revisions Section *****/} {displayedRevisions && ( <Grid className='d-flex'> <SelectedRevisions isBase={false} canRemoveRevision={!hasEditButton || formIsDisplayed} isWarning={false} displayedRevisions={displayedRevisions} onRemoveRevision={onRemoveRevision} /> </Grid> )} </Grid> ); }