import PropTypes from 'prop-types'; import React, { Component } from 'react'; import Alert from 'Components/Alert'; import FieldSet from 'Components/FieldSet'; import Form from 'Components/Form/Form'; import FormGroup from 'Components/Form/FormGroup'; import FormInputButton from 'Components/Form/FormInputButton'; import FormInputGroup from 'Components/Form/FormInputGroup'; import FormLabel from 'Components/Form/FormLabel'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import { inputTypes, kinds, sizes } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import NamingModal from './NamingModal'; import styles from './Naming.css'; class Naming extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { isNamingModalOpen: false, namingModalOptions: null }; } // // Listeners onStandardNamingModalOpenClick = () => { this.setState({ isNamingModalOpen: true, namingModalOptions: { name: 'standardEpisodeFormat', season: true, episode: true, additional: true } }); }; onDailyNamingModalOpenClick = () => { this.setState({ isNamingModalOpen: true, namingModalOptions: { name: 'dailyEpisodeFormat', season: true, episode: true, daily: true, additional: true } }); }; onAnimeNamingModalOpenClick = () => { this.setState({ isNamingModalOpen: true, namingModalOptions: { name: 'animeEpisodeFormat', season: true, episode: true, anime: true, additional: true } }); }; onSeriesFolderNamingModalOpenClick = () => { this.setState({ isNamingModalOpen: true, namingModalOptions: { name: 'seriesFolderFormat' } }); }; onSeasonFolderNamingModalOpenClick = () => { this.setState({ isNamingModalOpen: true, namingModalOptions: { name: 'seasonFolderFormat', season: true } }); }; onSpecialsFolderNamingModalOpenClick = () => { this.setState({ isNamingModalOpen: true, namingModalOptions: { name: 'specialsFolderFormat', season: true } }); }; onNamingModalClose = () => { this.setState({ isNamingModalOpen: false }); }; // // Render render() { const { advancedSettings, isFetching, error, settings, hasSettings, examples, examplesPopulated, onInputChange } = this.props; const { isNamingModalOpen, namingModalOptions } = this.state; const renameEpisodes = hasSettings && settings.renameEpisodes.value; const replaceIllegalCharacters = hasSettings && settings.replaceIllegalCharacters.value; const multiEpisodeStyleOptions = [ { key: 0, value: translate('Extend'), hint: 'S01E01-02-03' }, { key: 1, value: translate('Duplicate'), hint: 'S01E01.S01E02' }, { key: 2, value: translate('Repeat'), hint: 'S01E01E02E03' }, { key: 3, value: translate('Scene'), hint: 'S01E01-E02-E03' }, { key: 4, value: translate('Range'), hint: 'S01E01-03' }, { key: 5, value: translate('PrefixedRange'), hint: 'S01E01-E03' } ]; const colonReplacementOptions = [ { key: 0, value: translate('Delete') }, { key: 1, value: translate('ReplaceWithDash') }, { key: 2, value: translate('ReplaceWithSpaceDash') }, { key: 3, value: translate('ReplaceWithSpaceDashSpace') }, { key: 4, value: translate('SmartReplace'), hint: translate('SmartReplaceHint') } ]; const standardEpisodeFormatHelpTexts = []; const standardEpisodeFormatErrors = []; const dailyEpisodeFormatHelpTexts = []; const dailyEpisodeFormatErrors = []; const animeEpisodeFormatHelpTexts = []; const animeEpisodeFormatErrors = []; const seriesFolderFormatHelpTexts = []; const seriesFolderFormatErrors = []; const seasonFolderFormatHelpTexts = []; const seasonFolderFormatErrors = []; const specialsFolderFormatHelpTexts = []; const specialsFolderFormatErrors = []; if (examplesPopulated) { if (examples.singleEpisodeExample) { standardEpisodeFormatHelpTexts.push(`${translate('SingleEpisode')}: ${examples.singleEpisodeExample}`); } else { standardEpisodeFormatErrors.push({ message: translate('SingleEpisodeInvalidFormat') }); } if (examples.multiEpisodeExample) { standardEpisodeFormatHelpTexts.push(`${translate('MultiEpisode')}: ${examples.multiEpisodeExample}`); } else { standardEpisodeFormatErrors.push({ message: translate('MultiEpisodeInvalidFormat') }); } if (examples.dailyEpisodeExample) { dailyEpisodeFormatHelpTexts.push(`${translate('Example')}: ${examples.dailyEpisodeExample}`); } else { dailyEpisodeFormatErrors.push({ message: translate('InvalidFormat') }); } if (examples.animeEpisodeExample) { animeEpisodeFormatHelpTexts.push(`${translate('SingleEpisode')}: ${examples.animeEpisodeExample}`); } else { animeEpisodeFormatErrors.push({ message: translate('SingleEpisodeInvalidFormat') }); } if (examples.animeMultiEpisodeExample) { animeEpisodeFormatHelpTexts.push(`${translate('MultiEpisode')}: ${examples.animeMultiEpisodeExample}`); } else { animeEpisodeFormatErrors.push({ message: translate('MultiEpisodeInvalidFormat') }); } if (examples.seriesFolderExample) { seriesFolderFormatHelpTexts.push(`${translate('Example')}: ${examples.seriesFolderExample}`); } else { seriesFolderFormatErrors.push({ message: translate('InvalidFormat') }); } if (examples.seasonFolderExample) { seasonFolderFormatHelpTexts.push(`${translate('Example')}: ${examples.seasonFolderExample}`); } else { seasonFolderFormatErrors.push({ message: translate('InvalidFormat') }); } if (examples.specialsFolderExample) { specialsFolderFormatHelpTexts.push(`${translate('Example')}: ${examples.specialsFolderExample}`); } else { specialsFolderFormatErrors.push({ message: translate('InvalidFormat') }); } } return (
{ isFetching && } { !isFetching && error && {translate('NamingSettingsLoadError')} } { hasSettings && !isFetching && !error &&
{translate('RenameEpisodes')} {translate('ReplaceIllegalCharacters')} { replaceIllegalCharacters ? {translate('ColonReplacement')} : null } { renameEpisodes &&
{translate('StandardEpisodeFormat')} ?} onChange={onInputChange} {...settings.standardEpisodeFormat} helpTexts={standardEpisodeFormatHelpTexts} errors={[...standardEpisodeFormatErrors, ...settings.standardEpisodeFormat.errors]} /> {translate('DailyEpisodeFormat')} ?} onChange={onInputChange} {...settings.dailyEpisodeFormat} helpTexts={dailyEpisodeFormatHelpTexts} errors={[...dailyEpisodeFormatErrors, ...settings.dailyEpisodeFormat.errors]} /> {translate('DailyEpisodeFormat')} ?} onChange={onInputChange} {...settings.animeEpisodeFormat} helpTexts={animeEpisodeFormatHelpTexts} errors={[...animeEpisodeFormatErrors, ...settings.animeEpisodeFormat.errors]} />
} {translate('SeriesFolderFormat')} ?} onChange={onInputChange} {...settings.seriesFolderFormat} helpTexts={[translate('SeriesFolderFormatHelpText'), ...seriesFolderFormatHelpTexts]} errors={[...seriesFolderFormatErrors, ...settings.seriesFolderFormat.errors]} /> {translate('SeasonFolderFormat')} ?} onChange={onInputChange} {...settings.seasonFolderFormat} helpTexts={seasonFolderFormatHelpTexts} errors={[...seasonFolderFormatErrors, ...settings.seasonFolderFormat.errors]} /> {translate('SpecialsFolderFormat')} ?} onChange={onInputChange} {...settings.specialsFolderFormat} helpTexts={specialsFolderFormatHelpTexts} errors={[...specialsFolderFormatErrors, ...settings.specialsFolderFormat.errors]} /> {translate('MultiEpisodeStyle')} { namingModalOptions && } }
); } } Naming.propTypes = { advancedSettings: PropTypes.bool.isRequired, isFetching: PropTypes.bool.isRequired, error: PropTypes.object, settings: PropTypes.object.isRequired, hasSettings: PropTypes.bool.isRequired, examples: PropTypes.object.isRequired, examplesPopulated: PropTypes.bool.isRequired, onInputChange: PropTypes.func.isRequired }; export default Naming;