Fixed: Faster artist endpoint (#874)

* Fixed: Speed up AllArtist API endpoint

* New: Display UI before artists have loaded

* Add test of new repository methods
This commit is contained in:
ta264 2019-08-17 08:04:59 +01:00 committed by GitHub
commit 0352f8d3ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 158 additions and 31 deletions

View file

@ -50,6 +50,10 @@ class BlacklistRow extends Component {
onRemovePress
} = this.props;
if (!artist) {
return null;
}
return (
<TableRow>
{

View file

@ -67,7 +67,7 @@ class HistoryRow extends Component {
onMarkAsFailedPress
} = this.props;
if (!album) {
if (!artist || !album) {
return null;
}

View file

@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
@ -145,7 +146,7 @@ class AlbumStudio extends Component {
{
!isFetching && !!error &&
<div>Unable to load the Album Studio</div>
<div>{getErrorMessage(error, 'Failed to load artist from API')}</div>
}
{

View file

@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
@ -209,7 +210,7 @@ class ArtistEditor extends Component {
{
!isFetching && !!error &&
<div>Unable to load the calendar</div>
<div>{getErrorMessage(error, 'Failed to load artist from API')}</div>
}
{

View file

@ -4,6 +4,12 @@
overflow: hidden;
}
.errorMessage {
margin-top: 20px;
text-align: center;
font-size: 20px;
}
.contentBody {
composes: contentBody from '~Components/Page/PageContentBody.css';

View file

@ -2,6 +2,7 @@ import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import { align, icons, sortDirections } from 'Helpers/Props';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
@ -340,7 +341,9 @@ class ArtistIndex extends Component {
{
!isFetching && !!error &&
<div>Unable to load artist</div>
<div className={styles.errorMessage}>
{getErrorMessage(error, 'Failed to load artist from API')}
</div>
}
{

View file

@ -12,3 +12,9 @@
flex-grow: 1;
width: 100%;
}
.errorMessage {
margin-top: 20px;
text-align: center;
font-size: 20px;
}

View file

@ -1,5 +1,6 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import getErrorMessage from 'Utilities/Object/getErrorMessage';
import { align, icons } from 'Helpers/Props';
import PageContent from 'Components/Page/PageContent';
import Measure from 'Components/Measure';
@ -75,6 +76,7 @@ class CalendarPage extends Component {
selectedFilterKey,
filters,
hasArtist,
artistError,
missingAlbumIds,
isSearchingForMissing,
useCurrentPage,
@ -131,21 +133,31 @@ class CalendarPage extends Component {
className={styles.calendarPageBody}
innerClassName={styles.calendarInnerPageBody}
>
<Measure
whitelist={['width']}
onMeasure={this.onMeasure}
>
{
isMeasured ?
<PageComponent
useCurrentPage={useCurrentPage}
/> :
<div />
}
</Measure>
{
artistError &&
<div className={styles.errorMessage}>
{getErrorMessage(artistError, 'Failed to load artist from API')}
</div>
}
{
hasArtist &&
!artistError &&
<Measure
whitelist={['width']}
onMeasure={this.onMeasure}
>
{
isMeasured ?
<PageComponent
useCurrentPage={useCurrentPage}
/> :
<div />
}
</Measure>
}
{
hasArtist && !!artistError &&
<LegendConnector />
}
</PageContentBodyConnector>
@ -169,6 +181,7 @@ CalendarPage.propTypes = {
selectedFilterKey: PropTypes.string.isRequired,
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
hasArtist: PropTypes.bool.isRequired,
artistError: PropTypes.object,
missingAlbumIds: PropTypes.arrayOf(PropTypes.number).isRequired,
isSearchingForMissing: PropTypes.bool.isRequired,
useCurrentPage: PropTypes.bool.isRequired,

View file

@ -72,7 +72,8 @@ function createMapStateToProps() {
selectedFilterKey,
filters,
colorImpairedMode: uiSettings.enableColorImpairedMode,
hasArtist: !!artistCount,
hasArtist: !!artistCount.count,
artistError: artistCount.error,
missingAlbumIds,
isSearchingForMissing
};

View file

@ -43,7 +43,6 @@ const selectAppProps = createSelector(
);
const selectIsPopulated = createSelector(
(state) => state.artist.isPopulated,
(state) => state.customFilters.isPopulated,
(state) => state.tags.isPopulated,
(state) => state.settings.ui.isPopulated,
@ -52,7 +51,6 @@ const selectIsPopulated = createSelector(
(state) => state.settings.importLists.isPopulated,
(state) => state.system.status.isPopulated,
(
artistIsPopulated,
customFiltersIsPopulated,
tagsIsPopulated,
uiSettingsIsPopulated,
@ -62,7 +60,6 @@ const selectIsPopulated = createSelector(
systemStatusIsPopulated
) => {
return (
artistIsPopulated &&
customFiltersIsPopulated &&
tagsIsPopulated &&
uiSettingsIsPopulated &&
@ -75,7 +72,6 @@ const selectIsPopulated = createSelector(
);
const selectErrors = createSelector(
(state) => state.artist.error,
(state) => state.customFilters.error,
(state) => state.tags.error,
(state) => state.settings.ui.error,
@ -84,7 +80,6 @@ const selectErrors = createSelector(
(state) => state.settings.importLists.error,
(state) => state.system.status.error,
(
artistError,
customFiltersError,
tagsError,
uiSettingsError,
@ -94,7 +89,6 @@ const selectErrors = createSelector(
systemStatusError
) => {
const hasError = !!(
artistError ||
customFiltersError ||
tagsError ||
uiSettingsError ||
@ -106,7 +100,6 @@ const selectErrors = createSelector(
return {
hasError,
artistError,
customFiltersError,
tagsError,
uiSettingsError,

View file

@ -4,8 +4,12 @@ import createAllArtistSelector from './createAllArtistSelector';
function createArtistCountSelector() {
return createSelector(
createAllArtistSelector(),
(artists) => {
return artists.length;
(state) => state.artist.error,
(artists, error) => {
return {
count: artists.length,
error
};
}
);
}

View file

@ -26,6 +26,10 @@ function CutoffUnmetRow(props) {
onSelectedChange
} = props;
if (!artist) {
return null;
}
return (
<TableRow>
<TableSelectCell