import PropTypes from 'prop-types'; import React, { Component } from 'react'; import FieldSet from 'Components/FieldSet'; import SelectInput from 'Components/Form/SelectInput'; import TextInput from 'Components/Form/TextInput'; import Button from 'Components/Link/Button'; import Modal from 'Components/Modal/Modal'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { sizes } from 'Helpers/Props'; import translate from 'Utilities/String/translate'; import NamingOption from './NamingOption'; import styles from './NamingModal.css'; const separatorOptions = [ { key: ' ', get value() { return `${translate('Space')} ( )`; } }, { key: '.', get value() { return `${translate('Period')} (.)`; } }, { key: '_', get value() { return `${translate('Underscore')} (_)`; } }, { key: '-', get value() { return `${translate('Dash')} (-)`; } } ]; const caseOptions = [ { key: 'title', get value() { return translate('DefaultCase'); } }, { key: 'lower', get value() { return translate('Lowercase'); } }, { key: 'upper', get value() { return translate('Uppercase'); } } ]; const fileNameTokens = [ { token: '{Artist Name} - {Album Title} - {track:00} - {Track Title} {Quality Full}', example: 'Artist Name - Album Title - 01 - Track Title MP3-320 Proper' }, { token: '{Artist.Name}.{Album.Title}.{track:00}.{TrackClean.Title}.{Quality.Full}', example: 'Artist.Name.Album.Title.01.Track.Title.MP3-320' } ]; const artistTokens = [ { token: '{Artist Name}', example: 'Artist Name' }, { token: '{Artist CleanName}', example: 'Artist Name' }, { token: '{Artist NameThe}', example: 'Artist Name, The' }, { token: '{Artist CleanNameThe}', example: 'Artist Name, The' }, { token: '{Artist NameFirstCharacter}', example: 'A' }, { token: '{Artist Disambiguation}', example: 'Disambiguation' }, { token: '{Artist Genre}', example: 'Pop' }, { token: '{Artist MbId}', example: 'db92a151-1ac2-438b-bc43-b82e149ddd50' } ]; const albumTokens = [ { token: '{Album Title}', example: 'Album Title' }, { token: '{Album CleanTitle}', example: 'Album Title' }, { token: '{Album TitleThe}', example: 'Album Title, The' }, { token: '{Album CleanTitleThe}', example: 'Album Title, The' }, { token: '{Album Type}', example: 'Album Type' }, { token: '{Album Disambiguation}', example: 'Disambiguation' }, { token: '{Album Genre}', example: 'Rock' }, { token: '{Album MbId}', example: '082c6aff-a7cc-36e0-a960-35a578ecd937' } ]; const mediumTokens = [ { token: '{medium:0}', example: '1' }, { token: '{medium:00}', example: '01' } ]; const mediumFormatTokens = [ { token: '{Medium Name}', example: 'First Medium' }, { token: '{Medium Format}', example: 'CD' } ]; const trackTokens = [ { token: '{track:0}', example: '1' }, { token: '{track:00}', example: '01' } ]; const releaseDateTokens = [ { token: '{Release Year}', example: '2016' } ]; const trackTitleTokens = [ { token: '{Track Title}', example: 'Track Title' }, { token: '{Track CleanTitle}', example: 'Track Title' } ]; const trackArtistTokens = [ { token: '{Track ArtistName}', example: 'Artist Name' }, { token: '{Track ArtistCleanName}', example: 'Artist Name' }, { token: '{Track ArtistNameThe}', example: 'Artist Name, The' }, { token: '{Track ArtistCleanNameThe}', example: 'Artist Name, The' }, { token: '{Track ArtistMbId}', example: 'db92a151-1ac2-438b-bc43-b82e149ddd50' } ]; const qualityTokens = [ { token: '{Quality Full}', example: 'FLAC Proper' }, { token: '{Quality Title}', example: 'FLAC' } ]; const mediaInfoTokens = [ { token: '{MediaInfo AudioCodec}', example: 'FLAC' }, { token: '{MediaInfo AudioChannels}', example: '2.0' }, { token: '{MediaInfo AudioBitRate}', example: '320kbps' }, { token: '{MediaInfo AudioBitsPerSample}', example: '24bit' }, { token: '{MediaInfo AudioSampleRate}', example: '44.1kHz' } ]; const otherTokens = [ { token: '{Release Group}', example: 'Rls Grp' }, { token: '{Custom Formats}', example: 'iNTERNAL' }, { token: '{Custom Format:FormatName}', example: 'AMZN' } ]; const originalTokens = [ { token: '{Original Title}', example: 'Artist.Name.Album.Name.2018.FLAC-EVOLVE' }, { token: '{Original Filename}', example: '01 - track name' } ]; class NamingModal extends Component { // // Lifecycle constructor(props, context) { super(props, context); this._selectionStart = null; this._selectionEnd = null; this.state = { separator: ' ', case: 'title' }; } // // Listeners onTokenSeparatorChange = (event) => { this.setState({ separator: event.value }); }; onTokenCaseChange = (event) => { this.setState({ case: event.value }); }; onInputSelectionChange = (selectionStart, selectionEnd) => { this._selectionStart = selectionStart; this._selectionEnd = selectionEnd; }; onOptionPress = ({ isFullFilename, tokenValue }) => { const { name, value, onInputChange } = this.props; const selectionStart = this._selectionStart; const selectionEnd = this._selectionEnd; if (isFullFilename) { onInputChange({ name, value: tokenValue }); } else if (selectionStart == null) { onInputChange({ name, value: `${value}${tokenValue}` }); } else { const start = value.substring(0, selectionStart); const end = value.substring(selectionEnd); const newValue = `${start}${tokenValue}${end}`; onInputChange({ name, value: newValue }); this._selectionStart = newValue.length - 1; this._selectionEnd = newValue.length - 1; } }; // // Render render() { const { name, value, isOpen, advancedSettings, album, track, additional, onInputChange, onModalClose } = this.props; const { separator: tokenSeparator, case: tokenCase } = this.state; return ( {translate('FileNameTokens')}
{ !advancedSettings &&
{ fileNameTokens.map(({ token, example }) => { return ( ); } ) }
}
{ artistTokens.map(({ token, example }) => { return ( ); } ) }
{ album &&
{ albumTokens.map(({ token, example }) => { return ( ); } ) }
{ releaseDateTokens.map(({ token, example }) => { return ( ); } ) }
} { track &&
{ mediumTokens.map(({ token, example }) => { return ( ); } ) }
{ mediumFormatTokens.map(({ token, example }) => { return ( ); } ) }
{ trackTokens.map(({ token, example }) => { return ( ); } ) }
} { additional &&
{ trackTitleTokens.map(({ token, example }) => { return ( ); } ) }
{ trackArtistTokens.map(({ token, example }) => { return ( ); } ) }
{ qualityTokens.map(({ token, example }) => { return ( ); } ) }
{ mediaInfoTokens.map(({ token, example }) => { return ( ); } ) }
{ otherTokens.map(({ token, example }) => { return ( ); } ) }
{ originalTokens.map(({ token, example }) => { return ( ); } ) }
}
); } } NamingModal.propTypes = { name: PropTypes.string.isRequired, value: PropTypes.string.isRequired, isOpen: PropTypes.bool.isRequired, advancedSettings: PropTypes.bool.isRequired, album: PropTypes.bool.isRequired, track: PropTypes.bool.isRequired, additional: PropTypes.bool.isRequired, onInputChange: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; NamingModal.defaultProps = { album: false, track: false, additional: false }; export default NamingModal;