mirror of
https://github.com/lidarr/lidarr.git
synced 2025-08-14 10:47:08 -07:00
Added: Add Release Status to Metadata Profile, Default to Official Only (#250)
* Added: Add Release Status to Metadata Profile, Default to Official Only * Fixed: Unit Test and Comparison
This commit is contained in:
parent
9d7c6bc961
commit
df4e1e9b26
18 changed files with 632 additions and 19 deletions
|
@ -14,6 +14,7 @@ import FormLabel from 'Components/Form/FormLabel';
|
|||
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||
import PrimaryTypeItems from './PrimaryTypeItems';
|
||||
import SecondaryTypeItems from './SecondaryTypeItems';
|
||||
import ReleaseStatusItems from './ReleaseStatusItems';
|
||||
import styles from './EditMetadataProfileModalContent.css';
|
||||
|
||||
function EditMetadataProfileModalContent(props) {
|
||||
|
@ -37,7 +38,8 @@ function EditMetadataProfileModalContent(props) {
|
|||
id,
|
||||
name,
|
||||
primaryAlbumTypes: itemPrimaryAlbumTypes,
|
||||
secondaryAlbumTypes: itemSecondaryAlbumTypes
|
||||
secondaryAlbumTypes: itemSecondaryAlbumTypes,
|
||||
releaseStatuses: itemReleaseStatuses
|
||||
} = item;
|
||||
|
||||
return (
|
||||
|
@ -89,6 +91,14 @@ function EditMetadataProfileModalContent(props) {
|
|||
{...otherProps}
|
||||
/>
|
||||
|
||||
<ReleaseStatusItems
|
||||
metadataProfileItems={itemReleaseStatuses.value}
|
||||
errors={itemReleaseStatuses.errors}
|
||||
warnings={itemReleaseStatuses.warnings}
|
||||
formLabel="Release Statuses"
|
||||
{...otherProps}
|
||||
/>
|
||||
|
||||
</Form>
|
||||
}
|
||||
</ModalBody>
|
||||
|
@ -134,6 +144,7 @@ EditMetadataProfileModalContent.propTypes = {
|
|||
saveError: PropTypes.object,
|
||||
primaryAlbumTypes: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
secondaryAlbumTypes: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
releaseStatuses: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
item: PropTypes.object.isRequired,
|
||||
isInUse: PropTypes.bool.isRequired,
|
||||
onInputChange: PropTypes.func.isRequired,
|
||||
|
|
|
@ -54,16 +54,41 @@ function createSecondaryAlbumTypesSelector() {
|
|||
);
|
||||
}
|
||||
|
||||
function createReleaseStatusesSelector() {
|
||||
return createSelector(
|
||||
createProviderSettingsSelector(),
|
||||
(metadataProfile) => {
|
||||
const releaseStatuses = metadataProfile.item.releaseStatuses;
|
||||
if (!releaseStatuses || !releaseStatuses.value) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return _.reduceRight(releaseStatuses.value, (result, { allowed, releaseStatus }) => {
|
||||
if (allowed) {
|
||||
result.push({
|
||||
key: releaseStatus.id,
|
||||
value: releaseStatus.name
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}, []);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createProviderSettingsSelector(),
|
||||
createPrimaryAlbumTypesSelector(),
|
||||
createSecondaryAlbumTypesSelector(),
|
||||
createReleaseStatusesSelector(),
|
||||
createProfileInUseSelector('metadataProfileId'),
|
||||
(metadataProfile, primaryAlbumTypes, secondaryAlbumTypes, isInUse) => {
|
||||
(metadataProfile, primaryAlbumTypes, secondaryAlbumTypes, releaseStatuses, isInUse) => {
|
||||
return {
|
||||
primaryAlbumTypes,
|
||||
secondaryAlbumTypes,
|
||||
releaseStatuses,
|
||||
...metadataProfile,
|
||||
isInUse
|
||||
};
|
||||
|
@ -138,6 +163,18 @@ class EditMetadataProfileModalContentConnector extends Component {
|
|||
});
|
||||
}
|
||||
|
||||
onMetadataReleaseStatusItemAllowedChange = (id, allowed) => {
|
||||
const metadataProfile = _.cloneDeep(this.props.item);
|
||||
|
||||
const item = _.find(metadataProfile.releaseStatuses.value, (i) => i.releaseStatus.id === id);
|
||||
item.allowed = allowed;
|
||||
|
||||
this.props.setMetadataProfileValue({
|
||||
name: 'releaseStatuses',
|
||||
value: metadataProfile.releaseStatuses.value
|
||||
});
|
||||
}
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
|
@ -154,6 +191,7 @@ class EditMetadataProfileModalContentConnector extends Component {
|
|||
onInputChange={this.onInputChange}
|
||||
onMetadataPrimaryTypeItemAllowedChange={this.onMetadataPrimaryTypeItemAllowedChange}
|
||||
onMetadataSecondaryTypeItemAllowedChange={this.onMetadataSecondaryTypeItemAllowedChange}
|
||||
onMetadataReleaseStatusItemAllowedChange={this.onMetadataReleaseStatusItemAllowedChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
60
frontend/src/Settings/Profiles/Metadata/ReleaseStatusItem.js
Normal file
60
frontend/src/Settings/Profiles/Metadata/ReleaseStatusItem.js
Normal file
|
@ -0,0 +1,60 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import classNames from 'classnames';
|
||||
import CheckInput from 'Components/Form/CheckInput';
|
||||
import styles from './TypeItem.css';
|
||||
|
||||
class ReleaseStatusItem extends Component {
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
onAllowedChange = ({ value }) => {
|
||||
const {
|
||||
albumTypeId,
|
||||
onMetadataReleaseStatusItemAllowedChange
|
||||
} = this.props;
|
||||
|
||||
onMetadataReleaseStatusItemAllowedChange(albumTypeId, value);
|
||||
}
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
name,
|
||||
allowed
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<div
|
||||
className={classNames(
|
||||
styles.metadataProfileItem
|
||||
)}
|
||||
>
|
||||
<label
|
||||
className={styles.albumTypeName}
|
||||
>
|
||||
<CheckInput
|
||||
containerClassName={styles.checkContainer}
|
||||
name={name}
|
||||
value={allowed}
|
||||
onChange={this.onAllowedChange}
|
||||
/>
|
||||
{name}
|
||||
</label>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ReleaseStatusItem.propTypes = {
|
||||
albumTypeId: PropTypes.number.isRequired,
|
||||
name: PropTypes.string.isRequired,
|
||||
allowed: PropTypes.bool.isRequired,
|
||||
sortIndex: PropTypes.number.isRequired,
|
||||
onMetadataReleaseStatusItemAllowedChange: PropTypes.func
|
||||
};
|
||||
|
||||
export default ReleaseStatusItem;
|
|
@ -0,0 +1,87 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import FormGroup from 'Components/Form/FormGroup';
|
||||
import FormLabel from 'Components/Form/FormLabel';
|
||||
import FormInputHelpText from 'Components/Form/FormInputHelpText';
|
||||
import ReleaseStatusItem from './ReleaseStatusItem';
|
||||
import styles from './TypeItems.css';
|
||||
|
||||
class ReleaseStatusItems extends Component {
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
metadataProfileItems,
|
||||
errors,
|
||||
warnings,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<FormGroup>
|
||||
<FormLabel>Release Statuses</FormLabel>
|
||||
<div>
|
||||
|
||||
{
|
||||
errors.map((error, index) => {
|
||||
return (
|
||||
<FormInputHelpText
|
||||
key={index}
|
||||
text={error.message}
|
||||
isError={true}
|
||||
isCheckInput={false}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
{
|
||||
warnings.map((warning, index) => {
|
||||
return (
|
||||
<FormInputHelpText
|
||||
key={index}
|
||||
text={warning.message}
|
||||
isWarning={true}
|
||||
isCheckInput={false}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
<div className={styles.albumTypes}>
|
||||
{
|
||||
metadataProfileItems.map(({ allowed, releaseStatus }, index) => {
|
||||
return (
|
||||
<ReleaseStatusItem
|
||||
key={releaseStatus.id}
|
||||
albumTypeId={releaseStatus.id}
|
||||
name={releaseStatus.name}
|
||||
allowed={allowed}
|
||||
sortIndex={index}
|
||||
{...otherProps}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</FormGroup>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ReleaseStatusItems.propTypes = {
|
||||
metadataProfileItems: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
errors: PropTypes.arrayOf(PropTypes.object),
|
||||
warnings: PropTypes.arrayOf(PropTypes.object),
|
||||
formLabel: PropTypes.string
|
||||
};
|
||||
|
||||
ReleaseStatusItems.defaultProps = {
|
||||
errors: [],
|
||||
warnings: []
|
||||
};
|
||||
|
||||
export default ReleaseStatusItems;
|
|
@ -63,7 +63,7 @@ class SecondaryTypeItems extends Component {
|
|||
{...otherProps}
|
||||
/>
|
||||
);
|
||||
}).reverse()
|
||||
})
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue