Lidarr/frontend/src/Calendar/CalendarPage.js

222 lines
6.1 KiB
JavaScript
Raw Normal View History

2017-09-04 02:20:56 +00:00
import PropTypes from 'prop-types';
import React, { Component } from 'react';
2020-09-07 01:33:10 +00:00
import NoArtist from 'Artist/NoArtist';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Measure from 'Components/Measure';
2020-09-07 01:33:10 +00:00
import FilterMenu from 'Components/Menu/FilterMenu';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
2017-09-04 02:20:56 +00:00
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
2020-09-07 01:33:10 +00:00
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
2020-03-19 01:32:43 +00:00
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
2020-09-07 01:33:10 +00:00
import { align, icons } from 'Helpers/Props';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
2021-10-03 15:01:09 +00:00
import translate from 'Utilities/String/translate';
2020-09-07 01:33:10 +00:00
import CalendarConnector from './CalendarConnector';
2017-09-04 02:20:56 +00:00
import CalendarLinkModal from './iCal/CalendarLinkModal';
import LegendConnector from './Legend/LegendConnector';
2020-09-07 01:33:10 +00:00
import CalendarOptionsModal from './Options/CalendarOptionsModal';
2017-09-04 02:20:56 +00:00
import styles from './CalendarPage.css';
const MINIMUM_DAY_WIDTH = 120;
class CalendarPage extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isCalendarLinkModalOpen: false,
isOptionsModalOpen: false,
2017-09-04 02:20:56 +00:00
width: 0
};
}
//
// Listeners
onMeasure = ({ width }) => {
this.setState({ width });
const days = Math.max(3, Math.min(7, Math.floor(width / MINIMUM_DAY_WIDTH)));
this.props.onDaysCountChange(days);
2021-12-24 18:18:14 +00:00
};
2017-09-04 02:20:56 +00:00
onGetCalendarLinkPress = () => {
this.setState({ isCalendarLinkModalOpen: true });
2021-12-24 18:18:14 +00:00
};
2017-09-04 02:20:56 +00:00
onGetCalendarLinkModalClose = () => {
this.setState({ isCalendarLinkModalOpen: false });
2021-12-24 18:18:14 +00:00
};
2017-09-04 02:20:56 +00:00
onOptionsPress = () => {
this.setState({ isOptionsModalOpen: true });
2021-12-24 18:18:14 +00:00
};
onOptionsModalClose = () => {
this.setState({ isOptionsModalOpen: false });
2021-12-24 18:18:14 +00:00
};
onSearchMissingPress = () => {
const {
missingAlbumIds,
onSearchMissingPress
} = this.props;
onSearchMissingPress(missingAlbumIds);
2021-12-24 18:18:14 +00:00
};
2017-09-04 02:20:56 +00:00
//
// Render
render() {
const {
2018-03-15 01:28:46 +00:00
selectedFilterKey,
filters,
2017-11-26 20:09:45 +00:00
hasArtist,
artistError,
artistIsFetching,
artistIsPopulated,
missingAlbumIds,
2020-03-19 01:32:43 +00:00
isRssSyncExecuting,
isSearchingForMissing,
useCurrentPage,
2020-03-19 01:32:43 +00:00
onRssSyncPress,
onFilterSelect
2017-09-04 02:20:56 +00:00
} = this.props;
const {
isCalendarLinkModalOpen,
isOptionsModalOpen
} = this.state;
2018-03-15 01:28:46 +00:00
const isMeasured = this.state.width > 0;
2017-11-26 20:09:45 +00:00
2017-09-04 02:20:56 +00:00
return (
2021-10-03 15:01:09 +00:00
<PageContent title={translate('Calendar')}>
2017-09-04 02:20:56 +00:00
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
2021-10-03 15:01:09 +00:00
label={translate('ICalLink')}
2017-09-04 02:20:56 +00:00
iconName={icons.CALENDAR}
onPress={this.onGetCalendarLinkPress}
/>
2020-03-19 01:32:43 +00:00
<PageToolbarSeparator />
<PageToolbarButton
2021-10-03 15:01:09 +00:00
label={translate('RSSSync')}
2020-03-19 01:32:43 +00:00
iconName={icons.RSS}
isSpinning={isRssSyncExecuting}
onPress={onRssSyncPress}
/>
<PageToolbarButton
2021-10-03 15:01:09 +00:00
label={translate('SearchForMissing')}
iconName={icons.SEARCH}
isDisabled={!missingAlbumIds.length}
isSpinning={isSearchingForMissing}
onPress={this.onSearchMissingPress}
/>
2017-09-04 02:20:56 +00:00
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT}>
<PageToolbarButton
2021-10-03 15:01:09 +00:00
label={translate('Options')}
iconName={icons.POSTER}
onPress={this.onOptionsPress}
/>
2017-11-26 20:09:45 +00:00
<FilterMenu
alignMenu={align.RIGHT}
2018-03-16 02:26:49 +00:00
isDisabled={!hasArtist}
2018-03-15 01:28:46 +00:00
selectedFilterKey={selectedFilterKey}
filters={filters}
customFilters={[]}
onFilterSelect={onFilterSelect}
2018-03-15 01:28:46 +00:00
/>
2017-09-04 02:20:56 +00:00
</PageToolbarSection>
</PageToolbar>
<PageContentBody
2017-09-04 02:20:56 +00:00
className={styles.calendarPageBody}
innerClassName={styles.calendarInnerPageBody}
>
{
artistIsFetching && !artistIsPopulated &&
<LoadingIndicator />
}
{
artistError &&
2020-06-27 21:51:59 +00:00
<div className={styles.errorMessage}>
{getErrorMessage(artistError, 'Failed to load artist from API')}
</div>
}
{
!artistError && artistIsPopulated && hasArtist &&
<Measure
whitelist={['width']}
onMeasure={this.onMeasure}
>
{
isMeasured ?
<CalendarConnector
useCurrentPage={useCurrentPage}
/> :
<div />
}
</Measure>
}
2017-09-04 02:20:56 +00:00
{
!artistError && artistIsPopulated && !hasArtist &&
<NoArtist />
}
2017-11-26 20:09:45 +00:00
{
hasArtist && !!artistError &&
<LegendConnector />
2017-11-26 20:09:45 +00:00
}
</PageContentBody>
2017-09-04 02:20:56 +00:00
<CalendarLinkModal
isOpen={isCalendarLinkModalOpen}
2017-09-04 02:20:56 +00:00
onModalClose={this.onGetCalendarLinkModalClose}
/>
<CalendarOptionsModal
isOpen={isOptionsModalOpen}
onModalClose={this.onOptionsModalClose}
/>
2017-09-04 02:20:56 +00:00
</PageContent>
);
}
}
CalendarPage.propTypes = {
2018-03-15 01:28:46 +00:00
selectedFilterKey: PropTypes.string.isRequired,
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
2017-11-26 20:09:45 +00:00
hasArtist: PropTypes.bool.isRequired,
artistError: PropTypes.object,
artistIsFetching: PropTypes.bool.isRequired,
artistIsPopulated: PropTypes.bool.isRequired,
missingAlbumIds: PropTypes.arrayOf(PropTypes.number).isRequired,
2020-03-19 01:32:43 +00:00
isRssSyncExecuting: PropTypes.bool.isRequired,
isSearchingForMissing: PropTypes.bool.isRequired,
useCurrentPage: PropTypes.bool.isRequired,
onSearchMissingPress: PropTypes.func.isRequired,
2017-09-04 02:20:56 +00:00
onDaysCountChange: PropTypes.func.isRequired,
2020-03-19 01:32:43 +00:00
onRssSyncPress: PropTypes.func.isRequired,
onFilterSelect: PropTypes.func.isRequired
2017-09-04 02:20:56 +00:00
};
export default CalendarPage;