diff --git a/frontend/src/Activity/Blacklist/BlacklistRowConnector.js b/frontend/src/Activity/Blacklist/BlacklistRowConnector.js index a38e824b6..a36e00a17 100644 --- a/frontend/src/Activity/Blacklist/BlacklistRowConnector.js +++ b/frontend/src/Activity/Blacklist/BlacklistRowConnector.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import { createSelector } from 'reselect'; -import { removeFromBlacklist } from 'Store/Actions/blacklistActions'; +import { removeBlacklistItem } from 'Store/Actions/blacklistActions'; import createAuthorSelector from 'Store/Selectors/createAuthorSelector'; import BlacklistRow from './BlacklistRow'; diff --git a/frontend/src/Author/Details/AuthorDetails.js b/frontend/src/Author/Details/AuthorDetails.js index fe09acbb9..1fd0db970 100644 --- a/frontend/src/Author/Details/AuthorDetails.js +++ b/frontend/src/Author/Details/AuthorDetails.js @@ -24,6 +24,8 @@ import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import Popover from 'Components/Tooltip/Popover'; import Tooltip from 'Components/Tooltip/Tooltip'; import { align, icons, kinds, sizes, tooltipPositions } from 'Helpers/Props'; +import InteractiveSearchFilterMenuConnector from 'InteractiveSearch/InteractiveSearchFilterMenuConnector'; +import InteractiveSearchTable from 'InteractiveSearch/InteractiveSearchTable'; import OrganizePreviewModalConnector from 'Organize/OrganizePreviewModalConnector'; import RetagPreviewModalConnector from 'Retag/RetagPreviewModalConnector'; import QualityProfileNameConnector from 'Settings/Profiles/Quality/QualityProfileNameConnector'; diff --git a/frontend/src/Author/Details/BookRow.js b/frontend/src/Author/Details/BookRow.js index 1470cc5f0..c0535f928 100644 --- a/frontend/src/Author/Details/BookRow.js +++ b/frontend/src/Author/Details/BookRow.js @@ -9,7 +9,6 @@ import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellCo import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; import { kinds, sizes } from 'Helpers/Props'; -import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; import styles from './BookRow.css'; function getBookCountKind(monitored, bookFileCount, bookCount) { diff --git a/frontend/src/Author/Editor/AuthorEditorConnector.js b/frontend/src/Author/Editor/AuthorEditorConnector.js index 4bf42a6f9..befa215d9 100644 --- a/frontend/src/Author/Editor/AuthorEditorConnector.js +++ b/frontend/src/Author/Editor/AuthorEditorConnector.js @@ -55,7 +55,7 @@ class AuthorEditorConnector extends Component { } onTableOptionChange = (payload) => { - this.props.dispatchSetArtistEditorTableOption(payload); + this.props.dispatchSetAuthorEditorTableOption(payload); } onSaveSelected = (payload) => { @@ -85,7 +85,7 @@ class AuthorEditorConnector extends Component { } } -ArtistEditorConnector.propTypes = { +AuthorEditorConnector.propTypes = { dispatchSetAuthorEditorSort: PropTypes.func.isRequired, dispatchSetAuthorEditorFilter: PropTypes.func.isRequired, dispatchSetAuthorEditorTableOption: PropTypes.func.isRequired, diff --git a/frontend/src/Author/Editor/AuthorEditorFooter.js b/frontend/src/Author/Editor/AuthorEditorFooter.js index e763dd28f..fadfd49fc 100644 --- a/frontend/src/Author/Editor/AuthorEditorFooter.js +++ b/frontend/src/Author/Editor/AuthorEditorFooter.js @@ -147,6 +147,7 @@ class AuthorEditorFooter extends Component { monitored, qualityProfileId, metadataProfileId, + bookFolder, rootFolderPath, savingTags, isTagsModalOpen, @@ -161,6 +162,12 @@ class AuthorEditorFooter extends Component { { key: 'unmonitored', value: 'Unmonitored' } ]; + const bookFolderOptions = [ + { key: NO_CHANGE, value: 'No Change', disabled: true }, + { key: 'yes', value: 'Yes' }, + { key: 'no', value: 'No' } + ]; + return (
diff --git a/frontend/src/Author/Editor/AuthorEditorRow.js b/frontend/src/Author/Editor/AuthorEditorRow.js index 437f4fccf..adadd5f1f 100644 --- a/frontend/src/Author/Editor/AuthorEditorRow.js +++ b/frontend/src/Author/Editor/AuthorEditorRow.js @@ -27,9 +27,10 @@ class AuthorEditorRow extends Component { const { id, status, - titleSlug, + foreignAuthorId, authorName, authorType, + bookFolder, monitored, metadataProfile, qualityProfile, @@ -37,7 +38,9 @@ class AuthorEditorRow extends Component { statistics, tags, columns, + isSaving, isSelected, + onAuthorMonitoredPress, onSelectedChange } = this.props; @@ -79,7 +82,7 @@ class AuthorEditorRow extends Component { key={name} className={styles.title} > - @@ -156,9 +159,11 @@ class AuthorEditorRow extends Component { AuthorEditorRow.propTypes = { id: PropTypes.number.isRequired, status: PropTypes.string.isRequired, + foreignAuthorId: PropTypes.string.isRequired, titleSlug: PropTypes.string.isRequired, authorName: PropTypes.string.isRequired, authorType: PropTypes.string, + bookFolder: PropTypes.string, monitored: PropTypes.bool.isRequired, metadataProfile: PropTypes.object.isRequired, qualityProfile: PropTypes.object.isRequired, @@ -166,7 +171,9 @@ AuthorEditorRow.propTypes = { statistics: PropTypes.object.isRequired, tags: PropTypes.arrayOf(PropTypes.number).isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, + isSaving: PropTypes.bool.isRequired, isSelected: PropTypes.bool, + onAuthorMonitoredPress: PropTypes.func.isRequired, onSelectedChange: PropTypes.func.isRequired }; diff --git a/frontend/src/Author/Index/Posters/AuthorIndexPosters.js b/frontend/src/Author/Index/Posters/AuthorIndexPosters.js index df5b21041..e873404c2 100644 --- a/frontend/src/Author/Index/Posters/AuthorIndexPosters.js +++ b/frontend/src/Author/Index/Posters/AuthorIndexPosters.js @@ -152,6 +152,10 @@ class AuthorIndexPosters extends Component { }); } } + + if (this._grid && scrollTop !== 0) { + this._grid.scrollToPosition({ scrollTop }); + } } // @@ -316,6 +320,7 @@ AuthorIndexPosters.propTypes = { sortKey: PropTypes.string, posterOptions: PropTypes.object.isRequired, jumpToCharacter: PropTypes.string, + scrollTop: PropTypes.number.isRequired, scroller: PropTypes.instanceOf(Element).isRequired, showRelativeDates: PropTypes.bool.isRequired, shortDateFormat: PropTypes.string.isRequired, diff --git a/frontend/src/BookFile/Editor/BookFileEditorRow.js b/frontend/src/BookFile/Editor/BookFileEditorRow.js index 2447ffc71..30ce6405d 100644 --- a/frontend/src/BookFile/Editor/BookFileEditorRow.js +++ b/frontend/src/BookFile/Editor/BookFileEditorRow.js @@ -4,7 +4,6 @@ import BookQuality from 'Book/BookQuality'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableSelectCell from 'Components/Table/Cells/TableSelectCell'; import TableRow from 'Components/Table/TableRow'; -import padNumber from 'Utilities/Number/padNumber'; function BookFileEditorRow(props) { const { diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index 1a81f42f8..7a453fef0 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -19,7 +19,6 @@ import NumberInput from './NumberInput'; import OAuthInputConnector from './OAuthInputConnector'; import PasswordInput from './PasswordInput'; import PathInputConnector from './PathInputConnector'; -import PlaylistInputConnector from './PlaylistInputConnector'; import QualityProfileSelectInputConnector from './QualityProfileSelectInputConnector'; import RootFolderSelectInputConnector from './RootFolderSelectInputConnector'; import SeriesTypeSelectInput from './SeriesTypeSelectInput'; diff --git a/frontend/src/Components/Menu/ToolbarMenuButton.js b/frontend/src/Components/Menu/ToolbarMenuButton.js index 235892eba..55af71c3e 100644 --- a/frontend/src/Components/Menu/ToolbarMenuButton.js +++ b/frontend/src/Components/Menu/ToolbarMenuButton.js @@ -9,6 +9,7 @@ import styles from './ToolbarMenuButton.css'; function ToolbarMenuButton(props) { const { iconName, + indicator, text, ...otherProps } = props; @@ -24,6 +25,21 @@ function ToolbarMenuButton(props) { size={21} /> + { + indicator && + + + + } +
{text} @@ -36,7 +52,8 @@ function ToolbarMenuButton(props) { ToolbarMenuButton.propTypes = { iconName: PropTypes.object.isRequired, - text: PropTypes.string + text: PropTypes.string, + indicator: PropTypes.bool.isRequired }; export default ToolbarMenuButton; diff --git a/frontend/src/Components/Page/PageContentBody.js b/frontend/src/Components/Page/PageContentBody.js index c310cdfb3..126bd2ced 100644 --- a/frontend/src/Components/Page/PageContentBody.js +++ b/frontend/src/Components/Page/PageContentBody.js @@ -9,6 +9,14 @@ import styles from './PageContentBody.css'; class PageContentBody extends Component { + // + // Lifecyle + + constructor(props, context) { + super(props, context); + + this._isMobile = isMobileUtil(); + } // // Listeners @@ -27,13 +35,12 @@ class PageContentBody extends Component { const { className, innerClassName, - isSmallScreen, children, dispatch, ...otherProps } = this.props; - const ScrollerComponent = isSmallScreen ? Scroller : OverlayScroller; + const ScrollerComponent = this._isMobile ? Scroller : OverlayScroller; return ( diff --git a/frontend/src/InteractiveSearch/InteractiveSearch.js b/frontend/src/InteractiveSearch/InteractiveSearch.js index e373be097..05b0a77b6 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearch.js +++ b/frontend/src/InteractiveSearch/InteractiveSearch.js @@ -90,16 +90,33 @@ function InteractiveSearch(props) { error, totalReleasesCount, items, + selectedFilterKey, + filters, + customFilters, sortKey, sortDirection, + type, longDateFormat, timeFormat, onSortPress, + onFilterSelect, onGrabPress } = props; return (
+
+ +
{ isFetching ? : null } @@ -174,12 +191,16 @@ InteractiveSearch.propTypes = { error: PropTypes.object, totalReleasesCount: PropTypes.number.isRequired, items: PropTypes.arrayOf(PropTypes.object).isRequired, + selectedFilterKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, + filters: PropTypes.arrayOf(PropTypes.object).isRequired, + customFilters: PropTypes.arrayOf(PropTypes.object).isRequired, sortKey: PropTypes.string, sortDirection: PropTypes.string, type: PropTypes.string.isRequired, longDateFormat: PropTypes.string.isRequired, timeFormat: PropTypes.string.isRequired, onSortPress: PropTypes.func.isRequired, + onFilterSelect: PropTypes.func.isRequired, onGrabPress: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js b/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js index 39edba5cc..a873f2ae8 100644 --- a/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js +++ b/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js @@ -12,9 +12,6 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; -import PrimaryTypeItems from './PrimaryTypeItems'; -import ReleaseStatusItems from './ReleaseStatusItems'; -import SecondaryTypeItems from './SecondaryTypeItems'; import styles from './EditMetadataProfileModalContent.css'; function EditMetadataProfileModalContent(props) { diff --git a/frontend/src/Settings/Tags/Details/TagDetailsModalContentConnector.js b/frontend/src/Settings/Tags/Details/TagDetailsModalContentConnector.js index c57f1f337..3444039f4 100644 --- a/frontend/src/Settings/Tags/Details/TagDetailsModalContentConnector.js +++ b/frontend/src/Settings/Tags/Details/TagDetailsModalContentConnector.js @@ -9,7 +9,7 @@ function findMatchingItems(ids, items) { }); } -function createMatchingAuthorSelector() { +function createUnorderedMatchingAuthorSelector() { return createSelector( (state, { authorIds }) => authorIds, createAllAuthorSelector(), @@ -17,13 +17,13 @@ function createMatchingAuthorSelector() { ); } -function createMatchingArtistSelector() { +function createMatchingAuthorSelector() { return createSelector( - createUnorderedMatchingArtistSelector(), - (artists) => { - return artists.sort((artistA, artistB) => { - const sortNameA = artistA.sortName; - const sortNameB = artistB.sortName; + createUnorderedMatchingAuthorSelector(), + (authors) => { + return authors.sort((authorA, authorB) => { + const sortNameA = authorA.sortName; + const sortNameB = authorB.sortName; if (sortNameA > sortNameB) { return 1; diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index 341a90b40..27c558621 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -10,7 +10,6 @@ import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; import { inputTypes } from 'Helpers/Props'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; -import styles from './UISettings.css'; export const firstDayOfWeekOptions = [ { key: 0, value: 'Sunday' }, diff --git a/frontend/src/Store/Actions/index.js b/frontend/src/Store/Actions/index.js index ed38420e6..1dcba166c 100644 --- a/frontend/src/Store/Actions/index.js +++ b/frontend/src/Store/Actions/index.js @@ -1,6 +1,3 @@ -import * as albums from './albumActions'; -import * as albumHistory from './albumHistoryActions'; -import * as albumStudio from './albumStudioActions'; import * as app from './appActions'; import * as author from './authorActions'; import * as authorEditor from './authorEditorActions'; diff --git a/frontend/src/Store/Actions/seriesActions.js b/frontend/src/Store/Actions/seriesActions.js index c6bf25810..f9d0d3b5f 100644 --- a/frontend/src/Store/Actions/seriesActions.js +++ b/frontend/src/Store/Actions/seriesActions.js @@ -5,7 +5,6 @@ import createFetchHandler from './Creators/createFetchHandler'; import createHandleActions from './Creators/createHandleActions'; import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer'; import createSetSettingValueReducer from './Creators/Reducers/createSetSettingValueReducer'; -import createSetTableOptionReducer from './Creators/Reducers/createSetTableOptionReducer'; // // Variables @@ -105,7 +104,6 @@ export const SET_SERIES_VALUE = 'albums/setAlbumValue'; export const fetchSeries = createThunk(FETCH_SERIES); export const setSeriesSort = createAction(SET_SERIES_SORT); -export const setSeriesTableOption = createAction(SET_SERIES_TABLE_OPTION); export const clearSeries = createAction(CLEAR_SERIES); // @@ -122,8 +120,6 @@ export const reducers = createHandleActions({ [SET_SERIES_SORT]: createSetClientSideCollectionSortReducer(section), - [SET_SERIES_TABLE_OPTION]: createSetTableOptionReducer(section), - [SET_SERIES_VALUE]: createSetSettingValueReducer(section), [CLEAR_SERIES]: (state) => {