Fix: Aphrodite UI enhancements

* New: Display UI before movies have loaded

* Revised webpack bundling

* New: Option for production build with profiling

* Fixed: Faster hasDifferentItems and specialized OrOrder version

* Fixed: Faster movie selector

* Fixed: Speed up release processing, add indices (migration 161)

* Fixed: Use a worker for UI fuzzy search

* Fixed: Don't loop over all movies if we know none selected

* Fixed: Strip UrlBase from UI events before sending to sentry

Should mean that source maps are picked up correctly.

* Better selection of jump bar items

Show first, last and most common items

* Fixed: Don't repeatedly re-render cells

* Rework Movie Index and virtualTable

* Corresponding improvements for AddListMovie and ImportMovie
This commit is contained in:
ta264
2019-11-27 14:19:35 +00:00
committed by Devin Buhl
parent 95e5e3132b
commit abe7a85a39
65 changed files with 1529 additions and 1305 deletions

View File

@@ -42,6 +42,7 @@ export default function createHandleActions(handlers, defaultState, section) {
if (_.isArray(payload.data)) {
newState.items = payload.data;
newState.itemMap = _.zipObject(_.map(payload.data, 'id'), _.range(payload.data.length));
} else {
newState.item = payload.data;
}
@@ -75,6 +76,7 @@ export default function createHandleActions(handlers, defaultState, section) {
newState.items.splice(index, 1, { ...item, ...otherProps });
} else if (!updateOnly) {
newState.items.push({ ...otherProps });
newState.itemMap = _.zipObject(_.map(newState.items, 'id'), _.range(newState.items.length));
}
return updateSectionState(state, payloadSection, newState);
@@ -111,6 +113,8 @@ export default function createHandleActions(handlers, defaultState, section) {
newState.items = [...newState.items];
_.remove(newState.items, { id: payload.id });
newState.itemMap = _.zipObject(_.map(newState.items, 'id'), _.range(newState.items.length));
return updateSectionState(state, payloadSection, newState);
}

View File

@@ -1,5 +1,6 @@
import _ from 'lodash';
import * as sentry from '@sentry/browser';
import * as Integrations from '@sentry/integrations';
import parseUrl from 'Utilities/String/parseUrl';
function cleanseUrl(url) {
@@ -34,6 +35,13 @@ function identity(stuff) {
return stuff;
}
function stripUrlBase(frame) {
if (frame.filename && window.Radarr.urlBase) {
frame.filename = frame.filename.replace(window.Radarr.urlBase, '');
}
return frame;
}
function createMiddleware() {
return (store) => (next) => (action) => {
try {
@@ -80,7 +88,8 @@ export default function createSentryMiddleware() {
environment: branch,
release,
sendDefaultPii: true,
beforeSend: cleanseData
beforeSend: cleanseData,
integrations: [new Integrations.RewriteFrames({ iteratee: stripUrlBase })]
});
sentry.configureScope((scope) => {

View File

@@ -4,8 +4,12 @@ import createAllMoviesSelector from './createAllMoviesSelector';
function createMovieCountSelector() {
return createSelector(
createAllMoviesSelector(),
(movies) => {
return movies.length;
(state) => state.movies.error,
(movies, error) => {
return {
count: movies.length,
error
};
}
);
}

View File

@@ -1,12 +1,15 @@
import { createSelector } from 'reselect';
import createAllMoviesSelector from './createAllMoviesSelector';
function createMovieSelector() {
return createSelector(
(state, { movieId }) => movieId,
createAllMoviesSelector(),
(movieId, allMovies) => {
return allMovies.find((movie) => movie.id === movieId);
(state) => state.movies.itemMap,
(state) => state.movies.items,
(movieId, itemMap, allMovies) => {
if (allMovies && itemMap && movieId in itemMap) {
return allMovies[itemMap[movieId]];
}
return undefined;
}
);
}