diff --git a/frontend/src/Artist/Details/ArtistDetails.js b/frontend/src/Artist/Details/ArtistDetails.js
index c4dd61011..7cf6a1aab 100644
--- a/frontend/src/Artist/Details/ArtistDetails.js
+++ b/frontend/src/Artist/Details/ArtistDetails.js
@@ -197,7 +197,6 @@ class ArtistDetails extends Component {
overview,
links,
images,
- artistType,
alternateTitles,
tags,
isSaving,
diff --git a/frontend/src/InteractiveImport/Track/SelectTrackModalContent.css b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.css
new file mode 100644
index 000000000..794fca1ef
--- /dev/null
+++ b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.css
@@ -0,0 +1,51 @@
+.modalBody {
+ composes: modalBody from '~Components/Modal/ModalBody.css';
+
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+
+.filterInput {
+ composes: input from '~Components/Form/TextInput.css';
+
+ flex: 0 0 auto;
+ margin-bottom: 20px;
+}
+
+.scroller {
+ flex: 1 1 auto;
+}
+
+.footer {
+ composes: modalFooter from '~Components/Modal/ModalFooter.css';
+
+ display: flex;
+ justify-content: space-between;
+ overflow: hidden;
+}
+
+.path {
+ margin-right: 20px;
+ color: var(--dimColor);
+}
+
+.buttons {
+ display: flex;
+}
+
+@media only screen and (max-width: $breakpointSmall) {
+ .footer {
+ display: block;
+ }
+
+ .path {
+ margin-right: 0;
+ margin-bottom: 10px;
+ }
+
+ .buttons {
+ justify-content: space-between;
+ flex-grow: 1;
+ }
+}
diff --git a/frontend/src/InteractiveImport/Track/SelectTrackModalContent.css.d.ts b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.css.d.ts
new file mode 100644
index 000000000..4f4df1647
--- /dev/null
+++ b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.css.d.ts
@@ -0,0 +1,12 @@
+// This file is automatically generated.
+// Please do not change this file!
+interface CssExports {
+ 'buttons': string;
+ 'filterInput': string;
+ 'footer': string;
+ 'modalBody': string;
+ 'path': string;
+ 'scroller': string;
+}
+export const cssExports: CssExports;
+export default cssExports;
diff --git a/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js
index 3b31637ab..05ba1725d 100644
--- a/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js
+++ b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js
@@ -1,15 +1,17 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
+import TextInput from 'Components/Form/TextInput';
import Button from 'Components/Link/Button';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
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 Scroller from 'Components/Scroller/Scroller';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
-import { kinds } from 'Helpers/Props';
+import { kinds, scrollDirections } from 'Helpers/Props';
import ExpandingFileDetails from 'TrackFile/ExpandingFileDetails';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
@@ -17,6 +19,7 @@ import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
import SelectTrackRow from './SelectTrackRow';
+import styles from './SelectTrackModalContent.css';
const columns = [
{
@@ -65,11 +68,12 @@ class SelectTrackModalContent extends Component {
this.state = {
allSelected: false,
allUnselected: false,
+ filter: '',
lastToggled: null,
selectedState: init
};
- props.onSortPress( props.sortKey, props.sortDirection );
+ props.onSortPress(props.sortKey, props.sortDirection);
}
//
@@ -82,6 +86,10 @@ class SelectTrackModalContent extends Component {
//
// Listeners
+ onFilterChange = ({ value }) => {
+ this.setState({ filter: value.toLowerCase() });
+ };
+
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
};
@@ -119,8 +127,10 @@ class SelectTrackModalContent extends Component {
const {
allSelected,
allUnselected,
+ filter,
selectedState
} = this.state;
+ const filterTrackNumber = parseInt(filter);
const errorMessage = getErrorMessage(error, 'Unable to load tracks');
@@ -141,63 +151,84 @@ class SelectTrackModalContent extends Component {
{translate('ManualImport')} - {translate('SelectTracks')}
-
- {
- isFetching &&
-
- }
-
- {
- error &&
- {errorMessage}
- }
-
-
+
- {
- isPopulated && !!items.length &&
-
-
- {
- items.map((item) => {
- return (
-
- );
- })
- }
-
-
- }
+
+ {
+ isFetching ? : null
+ }
- {
- isPopulated && !items.length &&
- 'No tracks were found for the selected album'
- }
+ {
+ error ? {errorMessage}
: null
+ }
+
+
+
+ {
+ isPopulated && !!items.length ?
+
+
+ {
+ items.map((item) => {
+ return item.title.toLowerCase().includes(filter) ||
+ item.absoluteTrackNumber === filterTrackNumber ||
+ item.trackNumber === filterTrackNumber ?
+ (
+
+ ) :
+ null;
+ })
+ }
+
+
:
+ null
+ }
+
+ {
+ isPopulated && !items.length ?
+ translate('NoTracksFoundForSelectedAlbum') :
+ null
+ }
+
diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json
index cab23ac98..531cbc38d 100644
--- a/src/NzbDrone.Core/Localization/Core/en.json
+++ b/src/NzbDrone.Core/Localization/Core/en.json
@@ -830,6 +830,7 @@
"NoMediumInformation": "No medium information is available.",
"NoMinimumForAnyDuration": "No minimum for any duration",
"NoMissingItems": "No missing items",
+ "NoTracksFoundForSelectedAlbum": "No tracks were found for the selected album",
"NoResultsFound": "No results found",
"NoTagsHaveBeenAddedYet": "No tags have been added yet",
"NoTracksInThisMedium": "No tracks in this medium",