packages/lib/reporting-components/report-form-controls/report-period.js (78 lines of code) (raw):

import React, {useCallback, useMemo} from 'react'; import PropTypes from 'prop-types'; import {i18n} from 'hub-dashboard-addons/dist/localization'; import DatePicker from '@jetbrains/ring-ui/components/date-picker/date-picker'; import Select from '@jetbrains/ring-ui/components/select/select'; import ReportNamedTimeRanges from '../report-model/report-time-ranges'; import BackendTypes from '../backend-types/backend-types'; const ReportPeriod = ({ period, disabled, onChange }) => { const namedRange = (period || {}).range; const ranges = useMemo(() => ReportNamedTimeRanges.allRanges(). map(range => ({ id: range.id, label: range.text(), description: (range.id === ReportNamedTimeRanges.fixedRange().id ? i18n('Custom dates interval') : undefined) })), []); const selected = useMemo(() => ranges.filter(range => range.id === (namedRange || ReportNamedTimeRanges.fixedRange()).id )[0], [period]); const changeRangeSetting = useCallback(({id}) => { const newPeriod = getNewPeriod(id, (period || {}).id); onChange(newPeriod); function getNewPeriod(selectedId, periodId) { if (selectedId === ReportNamedTimeRanges.fixedRange().id) { return ({ id: periodId, $type: BackendTypes.get().FixedTimeRange, ...ReportNamedTimeRanges.fixedRange().getDefaultTimePeriod() }); } return ({ id: periodId, $type: BackendTypes.get().NamedTimeRange, range: {id: selectedId} }); } }, [period, onChange]); const setRangeForFixedPeriod = useCallback(({from, to}) => { if (period && !period.range) { period.from = from.valueOf(); period.to = to.valueOf(); onChange(period); } }, [period, onChange]); return ( <span> <Select data={ranges} selected={selected} onSelect={changeRangeSetting} disabled={disabled} type={Select.Type.INLINE} filter={true} /> { !namedRange && <span className="time-report-widget__sub-control"> <DatePicker from={period.from} to={period.to} onChange={setRangeForFixedPeriod} range={true} disabled={disabled} /> </span> } </span> ); }; ReportPeriod.propTypes = { period: PropTypes.object, disabled: PropTypes.bool, onChange: PropTypes.func.isRequired }; export default ReportPeriod;