mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-07 21:42:16 -07:00
New: Don't require artist mapping
This commit is contained in:
parent
1cc434a498
commit
be4e748977
159 changed files with 2934 additions and 4208 deletions
|
@ -1,6 +1,6 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import FileBrowserModal from 'Components/FileBrowser/FileBrowserModal';
|
||||
import EditRootFolderModalConnector from 'Settings/MediaManagement/RootFolder/EditRootFolderModalConnector';
|
||||
import EnhancedSelectInput from './EnhancedSelectInput';
|
||||
import RootFolderSelectInputOption from './RootFolderSelectInputOption';
|
||||
import RootFolderSelectInputSelectedValue from './RootFolderSelectInputSelectedValue';
|
||||
|
@ -14,8 +14,7 @@ class RootFolderSelectInput extends Component {
|
|||
super(props, context);
|
||||
|
||||
this.state = {
|
||||
isAddNewRootFolderModalOpen: false,
|
||||
newRootFolderPath: ''
|
||||
isAddNewRootFolderModalOpen: false
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -52,9 +51,7 @@ class RootFolderSelectInput extends Component {
|
|||
}
|
||||
|
||||
onNewRootFolderSelect = ({ value }) => {
|
||||
this.setState({ newRootFolderPath: value }, () => {
|
||||
this.props.onNewRootFolderSelect(value);
|
||||
});
|
||||
this.setState({ newRootFolderPath: value });
|
||||
}
|
||||
|
||||
onAddRootFolderModalClose = () => {
|
||||
|
@ -66,8 +63,7 @@ class RootFolderSelectInput extends Component {
|
|||
|
||||
render() {
|
||||
const {
|
||||
includeNoChange,
|
||||
onNewRootFolderSelect,
|
||||
value,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
|
@ -75,17 +71,16 @@ class RootFolderSelectInput extends Component {
|
|||
<div>
|
||||
<EnhancedSelectInput
|
||||
{...otherProps}
|
||||
value={value || ''}
|
||||
selectedValueComponent={RootFolderSelectInputSelectedValue}
|
||||
optionComponent={RootFolderSelectInputOption}
|
||||
onChange={this.onChange}
|
||||
/>
|
||||
|
||||
<FileBrowserModal
|
||||
<EditRootFolderModalConnector
|
||||
isOpen={this.state.isAddNewRootFolderModalOpen}
|
||||
name="rootFolderPath"
|
||||
value=""
|
||||
onChange={this.onNewRootFolderSelect}
|
||||
onModalClose={this.onAddRootFolderModalClose}
|
||||
onRootFolderAdded={this.onNewRootFolderSelect}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
@ -94,16 +89,11 @@ class RootFolderSelectInput extends Component {
|
|||
|
||||
RootFolderSelectInput.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
value: PropTypes.string,
|
||||
values: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
isSaving: PropTypes.bool.isRequired,
|
||||
saveError: PropTypes.object,
|
||||
includeNoChange: PropTypes.bool.isRequired,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
onNewRootFolderSelect: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
RootFolderSelectInput.defaultProps = {
|
||||
includeNoChange: false
|
||||
onChange: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default RootFolderSelectInput;
|
||||
|
|
|
@ -2,20 +2,20 @@ import PropTypes from 'prop-types';
|
|||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { addRootFolder } from 'Store/Actions/rootFolderActions';
|
||||
import RootFolderSelectInput from './RootFolderSelectInput';
|
||||
|
||||
const ADD_NEW_KEY = 'addNew';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
(state) => state.rootFolders,
|
||||
(state) => state.settings.rootFolders,
|
||||
(state, { includeNoChange }) => includeNoChange,
|
||||
(rootFolders, includeNoChange) => {
|
||||
const values = rootFolders.items.map((rootFolder) => {
|
||||
return {
|
||||
key: rootFolder.path,
|
||||
value: rootFolder.path,
|
||||
name: rootFolder.name,
|
||||
freeSpace: rootFolder.freeSpace
|
||||
};
|
||||
});
|
||||
|
@ -23,7 +23,8 @@ function createMapStateToProps() {
|
|||
if (includeNoChange) {
|
||||
values.unshift({
|
||||
key: 'noChange',
|
||||
value: 'No Change',
|
||||
value: '',
|
||||
name: 'No Change',
|
||||
isDisabled: true
|
||||
});
|
||||
}
|
||||
|
@ -32,6 +33,7 @@ function createMapStateToProps() {
|
|||
values.push({
|
||||
key: '',
|
||||
value: '',
|
||||
name: '',
|
||||
isDisabled: true,
|
||||
isHidden: true
|
||||
});
|
||||
|
@ -39,7 +41,8 @@ function createMapStateToProps() {
|
|||
|
||||
values.push({
|
||||
key: ADD_NEW_KEY,
|
||||
value: 'Add a new path'
|
||||
value: '',
|
||||
name: 'Add a new path'
|
||||
});
|
||||
|
||||
return {
|
||||
|
@ -51,14 +54,6 @@ function createMapStateToProps() {
|
|||
);
|
||||
}
|
||||
|
||||
function createMapDispatchToProps(dispatch, props) {
|
||||
return {
|
||||
dispatchAddRootFolder(path) {
|
||||
dispatch(addRootFolder({ path }));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
class RootFolderSelectInputConnector extends Component {
|
||||
|
||||
//
|
||||
|
@ -95,19 +90,11 @@ class RootFolderSelectInputConnector extends Component {
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
onNewRootFolderSelect = (path) => {
|
||||
this.props.dispatchAddRootFolder(path);
|
||||
}
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
dispatchAddRootFolder,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
|
@ -125,12 +112,11 @@ RootFolderSelectInputConnector.propTypes = {
|
|||
value: PropTypes.string,
|
||||
values: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
includeNoChange: PropTypes.bool.isRequired,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
dispatchAddRootFolder: PropTypes.func.isRequired
|
||||
onChange: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
RootFolderSelectInputConnector.defaultProps = {
|
||||
includeNoChange: false
|
||||
};
|
||||
|
||||
export default connect(createMapStateToProps, createMapDispatchToProps)(RootFolderSelectInputConnector);
|
||||
export default connect(createMapStateToProps)(RootFolderSelectInputConnector);
|
||||
|
|
|
@ -8,11 +8,14 @@ import styles from './RootFolderSelectInputOption.css';
|
|||
function RootFolderSelectInputOption(props) {
|
||||
const {
|
||||
value,
|
||||
name,
|
||||
freeSpace,
|
||||
isMobile,
|
||||
...otherProps
|
||||
} = props;
|
||||
|
||||
const text = value === '' ? name : `${name} [${value}]`;
|
||||
|
||||
return (
|
||||
<EnhancedSelectInputOption
|
||||
isMobile={isMobile}
|
||||
|
@ -23,7 +26,7 @@ function RootFolderSelectInputOption(props) {
|
|||
isMobile && styles.isMobile
|
||||
)}
|
||||
>
|
||||
<div>{value}</div>
|
||||
<div>{text}</div>
|
||||
|
||||
{
|
||||
freeSpace != null &&
|
||||
|
@ -37,6 +40,7 @@ function RootFolderSelectInputOption(props) {
|
|||
}
|
||||
|
||||
RootFolderSelectInputOption.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
value: PropTypes.string.isRequired,
|
||||
freeSpace: PropTypes.number,
|
||||
isMobile: PropTypes.bool.isRequired
|
||||
|
|
|
@ -6,19 +6,22 @@ import styles from './RootFolderSelectInputSelectedValue.css';
|
|||
|
||||
function RootFolderSelectInputSelectedValue(props) {
|
||||
const {
|
||||
name,
|
||||
value,
|
||||
freeSpace,
|
||||
includeFreeSpace,
|
||||
...otherProps
|
||||
} = props;
|
||||
|
||||
const text = value === '' ? name : `${name} [${value}]`;
|
||||
|
||||
return (
|
||||
<EnhancedSelectInputSelectedValue
|
||||
className={styles.selectedValue}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.path}>
|
||||
{value}
|
||||
{text}
|
||||
</div>
|
||||
|
||||
{
|
||||
|
@ -32,6 +35,7 @@ function RootFolderSelectInputSelectedValue(props) {
|
|||
}
|
||||
|
||||
RootFolderSelectInputSelectedValue.propTypes = {
|
||||
name: PropTypes.string,
|
||||
value: PropTypes.string,
|
||||
freeSpace: PropTypes.number,
|
||||
includeFreeSpace: PropTypes.bool.isRequired
|
||||
|
|
|
@ -75,7 +75,7 @@ SelectInput.propTypes = {
|
|||
className: PropTypes.string,
|
||||
disabledClassName: PropTypes.string,
|
||||
name: PropTypes.string.isRequired,
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||
values: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
isDisabled: PropTypes.bool,
|
||||
hasError: PropTypes.bool,
|
||||
|
|
|
@ -17,6 +17,8 @@ function getIconName(name) {
|
|||
return icons.SEARCH;
|
||||
case 'Housekeeping':
|
||||
return icons.HOUSEKEEPING;
|
||||
case 'RescanFolders':
|
||||
return icons.RESCAN;
|
||||
case 'RefreshArtist':
|
||||
return icons.REFRESH;
|
||||
case 'RssSync':
|
||||
|
|
|
@ -28,10 +28,6 @@ const links = [
|
|||
title: 'Add New',
|
||||
to: '/add/search'
|
||||
},
|
||||
{
|
||||
title: 'Import',
|
||||
to: '/add/import'
|
||||
},
|
||||
{
|
||||
title: 'Mass Editor',
|
||||
to: '/artisteditor'
|
||||
|
|
|
@ -11,7 +11,7 @@ import { update, updateItem, removeItem } from 'Store/Actions/baseActions';
|
|||
import { fetchArtist } from 'Store/Actions/artistActions';
|
||||
import { fetchHealth } from 'Store/Actions/systemActions';
|
||||
import { fetchQueue, fetchQueueDetails } from 'Store/Actions/queueActions';
|
||||
import { fetchRootFolders } from 'Store/Actions/rootFolderActions';
|
||||
import { fetchRootFolders } from 'Store/Actions/settingsActions';
|
||||
import { fetchTags, fetchTagDetails } from 'Store/Actions/tagActions';
|
||||
|
||||
function getHandlerName(name) {
|
||||
|
@ -275,8 +275,14 @@ class SignalRConnector extends Component {
|
|||
// No-op for now, we may want this later
|
||||
}
|
||||
|
||||
handleRootfolder = () => {
|
||||
this.props.dispatchFetchRootFolders();
|
||||
handleRootfolder = (body) => {
|
||||
if (body.action === 'updated') {
|
||||
this.props.dispatchUpdateItem({
|
||||
section: 'settings.rootFolders',
|
||||
updateOnly: true,
|
||||
...body.resource
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
handleTag = (body) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue