mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-11 15:47:09 -07:00
Fixed: UI Selector, Rendering Improvements
This commit is contained in:
parent
38723d0753
commit
7cf39e6a30
14 changed files with 276 additions and 77 deletions
|
@ -21,7 +21,7 @@ import ArtistIndexBannerOptionsModal from './Banners/Options/ArtistIndexBannerOp
|
||||||
import ArtistIndexBannersConnector from './Banners/ArtistIndexBannersConnector';
|
import ArtistIndexBannersConnector from './Banners/ArtistIndexBannersConnector';
|
||||||
import ArtistIndexOverviewOptionsModal from './Overview/Options/ArtistIndexOverviewOptionsModal';
|
import ArtistIndexOverviewOptionsModal from './Overview/Options/ArtistIndexOverviewOptionsModal';
|
||||||
import ArtistIndexOverviewsConnector from './Overview/ArtistIndexOverviewsConnector';
|
import ArtistIndexOverviewsConnector from './Overview/ArtistIndexOverviewsConnector';
|
||||||
import ArtistIndexFooter from './ArtistIndexFooter';
|
import ArtistIndexFooterConnector from './ArtistIndexFooterConnector';
|
||||||
import ArtistIndexFilterMenu from './Menus/ArtistIndexFilterMenu';
|
import ArtistIndexFilterMenu from './Menus/ArtistIndexFilterMenu';
|
||||||
import ArtistIndexSortMenu from './Menus/ArtistIndexSortMenu';
|
import ArtistIndexSortMenu from './Menus/ArtistIndexSortMenu';
|
||||||
import ArtistIndexViewMenu from './Menus/ArtistIndexViewMenu';
|
import ArtistIndexViewMenu from './Menus/ArtistIndexViewMenu';
|
||||||
|
@ -358,9 +358,7 @@ class ArtistIndex extends Component {
|
||||||
{...otherProps}
|
{...otherProps}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ArtistIndexFooter
|
<ArtistIndexFooterConnector />
|
||||||
artist={items}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
import createArtistClientSideCollectionItemsSelector from 'Store/Selectors/createArtistClientSideCollectionItemsSelector';
|
||||||
import dimensions from 'Styles/Variables/dimensions';
|
import dimensions from 'Styles/Variables/dimensions';
|
||||||
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
||||||
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||||
|
@ -46,7 +46,7 @@ function getScrollTop(view, scrollTop, isSmallScreen) {
|
||||||
|
|
||||||
function createMapStateToProps() {
|
function createMapStateToProps() {
|
||||||
return createSelector(
|
return createSelector(
|
||||||
createClientSideCollectionSelector('artist', 'artistIndex'),
|
createArtistClientSideCollectionItemsSelector('artistIndex'),
|
||||||
createCommandExecutingSelector(commandNames.REFRESH_ARTIST),
|
createCommandExecutingSelector(commandNames.REFRESH_ARTIST),
|
||||||
createCommandExecutingSelector(commandNames.RSS_SYNC),
|
createCommandExecutingSelector(commandNames.RSS_SYNC),
|
||||||
createDimensionsSelector(),
|
createDimensionsSelector(),
|
||||||
|
|
46
frontend/src/Artist/Index/ArtistIndexFooterConnector.js
Normal file
46
frontend/src/Artist/Index/ArtistIndexFooterConnector.js
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import createDeepEqualSelector from 'Store/Selectors/createDeepEqualSelector';
|
||||||
|
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
||||||
|
import ArtistIndexFooter from './ArtistIndexFooter';
|
||||||
|
|
||||||
|
function createUnoptimizedSelector() {
|
||||||
|
return createSelector(
|
||||||
|
createClientSideCollectionSelector('artist', 'artistIndex'),
|
||||||
|
(artist) => {
|
||||||
|
return artist.items.map((s) => {
|
||||||
|
const {
|
||||||
|
monitored,
|
||||||
|
status,
|
||||||
|
statistics
|
||||||
|
} = s;
|
||||||
|
|
||||||
|
return {
|
||||||
|
monitored,
|
||||||
|
status,
|
||||||
|
statistics
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createArtistSelector() {
|
||||||
|
return createDeepEqualSelector(
|
||||||
|
createUnoptimizedSelector(),
|
||||||
|
(artist) => artist
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
createArtistSelector(),
|
||||||
|
(artist) => {
|
||||||
|
return {
|
||||||
|
artist
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(createMapStateToProps)(ArtistIndexFooter);
|
|
@ -6,9 +6,9 @@ import { connect } from 'react-redux';
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
import createArtistSelector from 'Store/Selectors/createArtistSelector';
|
import createArtistSelector from 'Store/Selectors/createArtistSelector';
|
||||||
import createExecutingCommandsSelector from 'Store/Selectors/createExecutingCommandsSelector';
|
import createExecutingCommandsSelector from 'Store/Selectors/createExecutingCommandsSelector';
|
||||||
import createQualityProfileSelector from 'Store/Selectors/createQualityProfileSelector';
|
import createArtistQualityProfileSelector from 'Store/Selectors/createArtistQualityProfileSelector';
|
||||||
import createLanguageProfileSelector from 'Store/Selectors/createLanguageProfileSelector';
|
import createArtistLanguageProfileSelector from 'Store/Selectors/createArtistLanguageProfileSelector';
|
||||||
import createMetadataProfileSelector from 'Store/Selectors/createMetadataProfileSelector';
|
import createArtistMetadataProfileSelector from 'Store/Selectors/createArtistMetadataProfileSelector';
|
||||||
import { executeCommand } from 'Store/Actions/commandActions';
|
import { executeCommand } from 'Store/Actions/commandActions';
|
||||||
import * as commandNames from 'Commands/commandNames';
|
import * as commandNames from 'Commands/commandNames';
|
||||||
|
|
||||||
|
@ -35,9 +35,9 @@ function selectShowSearchAction() {
|
||||||
function createMapStateToProps() {
|
function createMapStateToProps() {
|
||||||
return createSelector(
|
return createSelector(
|
||||||
createArtistSelector(),
|
createArtistSelector(),
|
||||||
createQualityProfileSelector(),
|
createArtistQualityProfileSelector(),
|
||||||
createLanguageProfileSelector(),
|
createArtistLanguageProfileSelector(),
|
||||||
createMetadataProfileSelector(),
|
createArtistMetadataProfileSelector(),
|
||||||
selectShowSearchAction(),
|
selectShowSearchAction(),
|
||||||
createExecutingCommandsSelector(),
|
createExecutingCommandsSelector(),
|
||||||
(
|
(
|
||||||
|
@ -89,7 +89,7 @@ function createMapStateToProps() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapDispatchToProps = {
|
const mapDispatchToProps = {
|
||||||
executeCommand
|
dispatchExecuteCommand: executeCommand
|
||||||
};
|
};
|
||||||
|
|
||||||
class ArtistIndexItemConnector extends Component {
|
class ArtistIndexItemConnector extends Component {
|
||||||
|
@ -98,14 +98,14 @@ class ArtistIndexItemConnector extends Component {
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
onRefreshArtistPress = () => {
|
onRefreshArtistPress = () => {
|
||||||
this.props.executeCommand({
|
this.props.dispatchExecuteCommand({
|
||||||
name: commandNames.REFRESH_ARTIST,
|
name: commandNames.REFRESH_ARTIST,
|
||||||
artistId: this.props.id
|
artistId: this.props.id
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onSearchPress = () => {
|
onSearchPress = () => {
|
||||||
this.props.executeCommand({
|
this.props.dispatchExecuteCommand({
|
||||||
name: commandNames.ARTIST_SEARCH,
|
name: commandNames.ARTIST_SEARCH,
|
||||||
artistId: this.props.id
|
artistId: this.props.id
|
||||||
});
|
});
|
||||||
|
@ -139,7 +139,7 @@ class ArtistIndexItemConnector extends Component {
|
||||||
ArtistIndexItemConnector.propTypes = {
|
ArtistIndexItemConnector.propTypes = {
|
||||||
id: PropTypes.number,
|
id: PropTypes.number,
|
||||||
component: PropTypes.func.isRequired,
|
component: PropTypes.func.isRequired,
|
||||||
executeCommand: PropTypes.func.isRequired
|
dispatchExecuteCommand: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default connect(createMapStateToProps, mapDispatchToProps)(ArtistIndexItemConnector);
|
export default connect(createMapStateToProps, mapDispatchToProps)(ArtistIndexItemConnector);
|
||||||
|
|
|
@ -13,7 +13,8 @@ function ErrorPage(props) {
|
||||||
qualityProfilesError,
|
qualityProfilesError,
|
||||||
languageProfilesError,
|
languageProfilesError,
|
||||||
metadataProfilesError,
|
metadataProfilesError,
|
||||||
uiSettingsError
|
uiSettingsError,
|
||||||
|
systemStatusError
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
let errorMessage = 'Failed to load Lidarr';
|
let errorMessage = 'Failed to load Lidarr';
|
||||||
|
@ -34,6 +35,8 @@ function ErrorPage(props) {
|
||||||
errorMessage = getErrorMessage(metadataProfilesError, 'Failed to load metadata profiles from API');
|
errorMessage = getErrorMessage(metadataProfilesError, 'Failed to load metadata profiles from API');
|
||||||
} else if (uiSettingsError) {
|
} else if (uiSettingsError) {
|
||||||
errorMessage = getErrorMessage(uiSettingsError, 'Failed to load UI settings from API');
|
errorMessage = getErrorMessage(uiSettingsError, 'Failed to load UI settings from API');
|
||||||
|
} else if (systemStatusError) {
|
||||||
|
errorMessage = getErrorMessage(uiSettingsError, 'Failed to load system status from API');
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -58,7 +61,8 @@ ErrorPage.propTypes = {
|
||||||
qualityProfilesError: PropTypes.object,
|
qualityProfilesError: PropTypes.object,
|
||||||
languageProfilesError: PropTypes.object,
|
languageProfilesError: PropTypes.object,
|
||||||
metadataProfilesError: PropTypes.object,
|
metadataProfilesError: PropTypes.object,
|
||||||
uiSettingsError: PropTypes.object
|
uiSettingsError: PropTypes.object,
|
||||||
|
systemStatusError: PropTypes.object
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ErrorPage;
|
export default ErrorPage;
|
||||||
|
|
|
@ -27,69 +27,124 @@ function testLocalStorage() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const selectAppProps = createSelector(
|
||||||
|
(state) => state.app.isSidebarVisible,
|
||||||
|
(state) => state.app.version,
|
||||||
|
(state) => state.app.isUpdated,
|
||||||
|
(state) => state.app.isDisconnected,
|
||||||
|
(isSidebarVisible, version, isUpdated, isDisconnected) => {
|
||||||
|
return {
|
||||||
|
isSidebarVisible,
|
||||||
|
version,
|
||||||
|
isUpdated,
|
||||||
|
isDisconnected
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const selectIsPopulated = createSelector(
|
||||||
|
(state) => state.artist.isPopulated,
|
||||||
|
(state) => state.customFilters.isPopulated,
|
||||||
|
(state) => state.tags.isPopulated,
|
||||||
|
(state) => state.settings.ui.isPopulated,
|
||||||
|
(state) => state.settings.qualityProfiles.isPopulated,
|
||||||
|
(state) => state.settings.languageProfiles.isPopulated,
|
||||||
|
(state) => state.settings.metadataProfiles.isPopulated,
|
||||||
|
(state) => state.settings.importLists.isPopulated,
|
||||||
|
(state) => state.system.status.isPopulated,
|
||||||
|
(
|
||||||
|
artistIsPopulated,
|
||||||
|
customFiltersIsPopulated,
|
||||||
|
tagsIsPopulated,
|
||||||
|
uiSettingsIsPopulated,
|
||||||
|
qualityProfilesIsPopulated,
|
||||||
|
languageProfilesIsPopulated,
|
||||||
|
metadataProfilesIsPopulated,
|
||||||
|
importListsIsPopulated,
|
||||||
|
systemStatusIsPopulated
|
||||||
|
) => {
|
||||||
|
return (
|
||||||
|
artistIsPopulated &&
|
||||||
|
customFiltersIsPopulated &&
|
||||||
|
tagsIsPopulated &&
|
||||||
|
uiSettingsIsPopulated &&
|
||||||
|
qualityProfilesIsPopulated &&
|
||||||
|
languageProfilesIsPopulated &&
|
||||||
|
metadataProfilesIsPopulated &&
|
||||||
|
importListsIsPopulated &&
|
||||||
|
systemStatusIsPopulated
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const selectErrors = createSelector(
|
||||||
|
(state) => state.artist.error,
|
||||||
|
(state) => state.customFilters.error,
|
||||||
|
(state) => state.tags.error,
|
||||||
|
(state) => state.settings.ui.error,
|
||||||
|
(state) => state.settings.qualityProfiles.error,
|
||||||
|
(state) => state.settings.languageProfiles.error,
|
||||||
|
(state) => state.settings.metadataProfiles.error,
|
||||||
|
(state) => state.settings.importLists.error,
|
||||||
|
(state) => state.system.status.error,
|
||||||
|
(
|
||||||
|
artistError,
|
||||||
|
customFiltersError,
|
||||||
|
tagsError,
|
||||||
|
uiSettingsError,
|
||||||
|
qualityProfilesError,
|
||||||
|
languageProfilesError,
|
||||||
|
metadataProfilesError,
|
||||||
|
importListsError,
|
||||||
|
systemStatusError
|
||||||
|
) => {
|
||||||
|
const hasError = !!(
|
||||||
|
artistError ||
|
||||||
|
customFiltersError ||
|
||||||
|
tagsError ||
|
||||||
|
uiSettingsError ||
|
||||||
|
qualityProfilesError ||
|
||||||
|
languageProfilesError ||
|
||||||
|
metadataProfilesError ||
|
||||||
|
importListsError ||
|
||||||
|
systemStatusError
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
hasError,
|
||||||
|
artistError,
|
||||||
|
customFiltersError,
|
||||||
|
tagsError,
|
||||||
|
uiSettingsError,
|
||||||
|
qualityProfilesError,
|
||||||
|
languageProfilesError,
|
||||||
|
metadataProfilesError,
|
||||||
|
importListsError,
|
||||||
|
systemStatusError
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
function createMapStateToProps() {
|
function createMapStateToProps() {
|
||||||
return createSelector(
|
return createSelector(
|
||||||
(state) => state.artist,
|
(state) => state.settings.ui.item.enableColorImpairedMode,
|
||||||
(state) => state.customFilters,
|
selectIsPopulated,
|
||||||
(state) => state.tags,
|
selectErrors,
|
||||||
(state) => state.settings.ui,
|
selectAppProps,
|
||||||
(state) => state.settings.qualityProfiles,
|
|
||||||
(state) => state.settings.languageProfiles,
|
|
||||||
(state) => state.settings.metadataProfiles,
|
|
||||||
(state) => state.settings.importLists,
|
|
||||||
(state) => state.app,
|
|
||||||
createDimensionsSelector(),
|
createDimensionsSelector(),
|
||||||
(
|
(
|
||||||
artist,
|
enableColorImpairedMode,
|
||||||
customFilters,
|
isPopulated,
|
||||||
tags,
|
errors,
|
||||||
uiSettings,
|
|
||||||
qualityProfiles,
|
|
||||||
languageProfiles,
|
|
||||||
metadataProfiles,
|
|
||||||
importLists,
|
|
||||||
app,
|
app,
|
||||||
dimensions
|
dimensions
|
||||||
) => {
|
) => {
|
||||||
const isPopulated = (
|
|
||||||
artist.isPopulated &&
|
|
||||||
customFilters.isPopulated &&
|
|
||||||
tags.isPopulated &&
|
|
||||||
qualityProfiles.isPopulated &&
|
|
||||||
languageProfiles.isPopulated &&
|
|
||||||
metadataProfiles.isPopulated &&
|
|
||||||
importLists.isPopulated &&
|
|
||||||
uiSettings.isPopulated
|
|
||||||
);
|
|
||||||
|
|
||||||
const hasError = !!(
|
|
||||||
artist.error ||
|
|
||||||
customFilters.error ||
|
|
||||||
tags.error ||
|
|
||||||
qualityProfiles.error ||
|
|
||||||
languageProfiles.error ||
|
|
||||||
metadataProfiles.error ||
|
|
||||||
importLists.error ||
|
|
||||||
uiSettings.error
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
...app,
|
||||||
|
...errors,
|
||||||
isPopulated,
|
isPopulated,
|
||||||
hasError,
|
|
||||||
artistError: artist.error,
|
|
||||||
customFiltersError: tags.error,
|
|
||||||
tagsError: tags.error,
|
|
||||||
qualityProfilesError: qualityProfiles.error,
|
|
||||||
languageProfilesError: languageProfiles.error,
|
|
||||||
metadataProfilesError: metadataProfiles.error,
|
|
||||||
importListsError: importLists.error,
|
|
||||||
uiSettingsError: uiSettings.error,
|
|
||||||
isSmallScreen: dimensions.isSmallScreen,
|
isSmallScreen: dimensions.isSmallScreen,
|
||||||
isSidebarVisible: app.isSidebarVisible,
|
enableColorImpairedMode
|
||||||
enableColorImpairedMode: uiSettings.item.enableColorImpairedMode,
|
|
||||||
version: app.version,
|
|
||||||
isUpdated: app.isUpdated,
|
|
||||||
isDisconnected: app.isDisconnected
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import createDeepEqualSelector from './createDeepEqualSelector';
|
||||||
|
import createClientSideCollectionSelector from './createClientSideCollectionSelector';
|
||||||
|
|
||||||
|
function createUnoptimizedSelector(uiSection) {
|
||||||
|
return createSelector(
|
||||||
|
createClientSideCollectionSelector('artist', uiSection),
|
||||||
|
(artist) => {
|
||||||
|
const items = artist.items.map((s) => {
|
||||||
|
const {
|
||||||
|
id,
|
||||||
|
sortName
|
||||||
|
} = s;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
sortName
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
...artist,
|
||||||
|
items
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createArtistClientSideCollectionItemsSelector(uiSection) {
|
||||||
|
return createDeepEqualSelector(
|
||||||
|
createUnoptimizedSelector(uiSection),
|
||||||
|
(artist) => artist
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createArtistClientSideCollectionItemsSelector;
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import createArtistSelector from './createArtistSelector';
|
||||||
|
|
||||||
|
function createArtistLanguageProfileSelector() {
|
||||||
|
return createSelector(
|
||||||
|
(state) => state.settings.languageProfiles.items,
|
||||||
|
createArtistSelector(),
|
||||||
|
(languageProfiles, artist) => {
|
||||||
|
return languageProfiles.find((profile) => {
|
||||||
|
return profile.id === artist.languageProfileId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createArtistLanguageProfileSelector;
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import createArtistSelector from './createArtistSelector';
|
||||||
|
|
||||||
|
function createArtistMetadataProfileSelector() {
|
||||||
|
return createSelector(
|
||||||
|
(state) => state.settings.metadataProfiles.items,
|
||||||
|
createArtistSelector(),
|
||||||
|
(metadataProfiles, artist) => {
|
||||||
|
return metadataProfiles.find((profile) => {
|
||||||
|
return profile.id === artist.metadataProfileId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createArtistMetadataProfileSelector;
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import createArtistSelector from './createArtistSelector';
|
||||||
|
|
||||||
|
function createArtistQualityProfileSelector() {
|
||||||
|
return createSelector(
|
||||||
|
(state) => state.settings.qualityProfiles.items,
|
||||||
|
createArtistSelector(),
|
||||||
|
(qualityProfiles, artist) => {
|
||||||
|
return qualityProfiles.find((profile) => {
|
||||||
|
return profile.id === artist.qualityProfileId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createArtistQualityProfileSelector;
|
9
frontend/src/Store/Selectors/createDeepEqualSelector.js
Normal file
9
frontend/src/Store/Selectors/createDeepEqualSelector.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import { createSelectorCreator, defaultMemoize } from 'reselect';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
|
const createDeepEqualSelector = createSelectorCreator(
|
||||||
|
defaultMemoize,
|
||||||
|
_.isEqual
|
||||||
|
);
|
||||||
|
|
||||||
|
export default createDeepEqualSelector;
|
|
@ -1,4 +1,3 @@
|
||||||
import _ from 'lodash';
|
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
|
||||||
function createLanguageProfileSelector() {
|
function createLanguageProfileSelector() {
|
||||||
|
@ -6,7 +5,9 @@ function createLanguageProfileSelector() {
|
||||||
(state, { languageProfileId }) => languageProfileId,
|
(state, { languageProfileId }) => languageProfileId,
|
||||||
(state) => state.settings.languageProfiles.items,
|
(state) => state.settings.languageProfiles.items,
|
||||||
(languageProfileId, languageProfiles) => {
|
(languageProfileId, languageProfiles) => {
|
||||||
return _.find(languageProfiles, { id: languageProfileId });
|
return languageProfiles.find((profile) => {
|
||||||
|
return profile.id === languageProfileId;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import _ from 'lodash';
|
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
|
||||||
function createMetadataProfileSelector() {
|
function createMetadataProfileSelector() {
|
||||||
|
@ -6,7 +5,9 @@ function createMetadataProfileSelector() {
|
||||||
(state, { metadataProfileId }) => metadataProfileId,
|
(state, { metadataProfileId }) => metadataProfileId,
|
||||||
(state) => state.settings.metadataProfiles.items,
|
(state) => state.settings.metadataProfiles.items,
|
||||||
(metadataProfileId, metadataProfiles) => {
|
(metadataProfileId, metadataProfiles) => {
|
||||||
return _.find(metadataProfiles, { id: metadataProfileId });
|
return metadataProfiles.find((profile) => {
|
||||||
|
return profile.id === metadataProfileId;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import _ from 'lodash';
|
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
|
||||||
function createQualityProfileSelector() {
|
function createQualityProfileSelector() {
|
||||||
|
@ -6,7 +5,9 @@ function createQualityProfileSelector() {
|
||||||
(state, { qualityProfileId }) => qualityProfileId,
|
(state, { qualityProfileId }) => qualityProfileId,
|
||||||
(state) => state.settings.qualityProfiles.items,
|
(state) => state.settings.qualityProfiles.items,
|
||||||
(qualityProfileId, qualityProfiles) => {
|
(qualityProfileId, qualityProfiles) => {
|
||||||
return _.find(qualityProfiles, { id: qualityProfileId });
|
return qualityProfiles.find((profile) => {
|
||||||
|
return profile.id === qualityProfileId;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue