mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-30 03:38:26 -07:00
[UI Work] Artist Detail Page, Album Studio, Wanted, NavSearch, Rename
This commit is contained in:
parent
456ead09da
commit
0054226307
93 changed files with 590 additions and 603 deletions
|
@ -59,10 +59,10 @@ export const TOGGLE_ARTIST_MONITORED = 'TOGGLE_ARTIST_MONITORED';
|
|||
export const TOGGLE_ALBUM_MONITORED = 'TOGGLE_ALBUM_MONITORED';
|
||||
|
||||
//
|
||||
// Series Editor
|
||||
// Artist Editor
|
||||
|
||||
export const SET_SERIES_EDITOR_SORT = 'SET_SERIES_EDITOR_SORT';
|
||||
export const SET_SERIES_EDITOR_FILTER = 'SET_SERIES_EDITOR_FILTER';
|
||||
export const SET_ARTIST_EDITOR_SORT = 'SET_ARTIST_EDITOR_SORT';
|
||||
export const SET_ARTIST_EDITOR_FILTER = 'SET_ARTIST_EDITOR_FILTER';
|
||||
export const SAVE_ARTIST_EDITOR = 'SAVE_ARTIST_EDITOR';
|
||||
export const BULK_DELETE_ARTIST = 'BULK_DELETE_ARTIST';
|
||||
|
||||
|
|
|
@ -3,11 +3,11 @@ import $ from 'jquery';
|
|||
import getMonitoringOptions from 'Utilities/Series/getMonitoringOptions';
|
||||
import * as types from './actionTypes';
|
||||
import { set } from './baseActions';
|
||||
import { fetchArtist } from './seriesActions';
|
||||
import { fetchArtist } from './artistActions';
|
||||
|
||||
const section = 'seasonPass';
|
||||
const section = 'albumStudio';
|
||||
|
||||
const seasonPassActionHandlers = {
|
||||
const albumStudioActionHandlers = {
|
||||
[types.SAVE_SEASON_PASS]: function(payload) {
|
||||
return function(dispatch, getState) {
|
||||
const {
|
||||
|
@ -50,7 +50,7 @@ const seasonPassActionHandlers = {
|
|||
}));
|
||||
|
||||
const promise = $.ajax({
|
||||
url: '/seasonPass',
|
||||
url: '/albumStudio',
|
||||
method: 'POST',
|
||||
data: JSON.stringify({
|
||||
series,
|
||||
|
@ -80,4 +80,4 @@ const seasonPassActionHandlers = {
|
|||
}
|
||||
};
|
||||
|
||||
export default seasonPassActionHandlers;
|
||||
export default albumStudioActionHandlers;
|
7
frontend/src/Store/Actions/albumStudioActions.js
Normal file
7
frontend/src/Store/Actions/albumStudioActions.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { createAction } from 'redux-actions';
|
||||
import * as types from './actionTypes';
|
||||
import albumStudioActionHandlers from './albumStudioActionHandlers';
|
||||
|
||||
export const setAlbumStudioSort = createAction(types.SET_SEASON_PASS_SORT);
|
||||
export const setAlbumStudioFilter = createAction(types.SET_SEASON_PASS_FILTER);
|
||||
export const saveAlbumStudio = albumStudioActionHandlers[types.SAVE_SEASON_PASS];
|
|
@ -3,9 +3,9 @@ import { batchActions } from 'redux-batched-actions';
|
|||
import * as types from './actionTypes';
|
||||
import { set, updateItem } from './baseActions';
|
||||
|
||||
const section = 'seriesEditor';
|
||||
const section = 'artistEditor';
|
||||
|
||||
const seriesEditorActionHandlers = {
|
||||
const artistEditorActionHandlers = {
|
||||
[types.SAVE_ARTIST_EDITOR]: function(payload) {
|
||||
return function(dispatch, getState) {
|
||||
dispatch(set({
|
||||
|
@ -14,7 +14,7 @@ const seriesEditorActionHandlers = {
|
|||
}));
|
||||
|
||||
const promise = $.ajax({
|
||||
url: '/series/editor',
|
||||
url: '/artist/editor',
|
||||
method: 'PUT',
|
||||
data: JSON.stringify(payload),
|
||||
dataType: 'json'
|
||||
|
@ -56,7 +56,7 @@ const seriesEditorActionHandlers = {
|
|||
}));
|
||||
|
||||
const promise = $.ajax({
|
||||
url: '/series/editor',
|
||||
url: '/artist/editor',
|
||||
method: 'DELETE',
|
||||
data: JSON.stringify(payload),
|
||||
dataType: 'json'
|
||||
|
@ -83,4 +83,4 @@ const seriesEditorActionHandlers = {
|
|||
}
|
||||
};
|
||||
|
||||
export default seriesEditorActionHandlers;
|
||||
export default artistEditorActionHandlers;
|
8
frontend/src/Store/Actions/artistEditorActions.js
Normal file
8
frontend/src/Store/Actions/artistEditorActions.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
import { createAction } from 'redux-actions';
|
||||
import * as types from './actionTypes';
|
||||
import artistEditorActionHandlers from './artistEditorActionHandlers';
|
||||
|
||||
export const setArtistEditorSort = createAction(types.SET_ARTIST_EDITOR_SORT);
|
||||
export const setArtistEditorFilter = createAction(types.SET_ARTIST_EDITOR_FILTER);
|
||||
export const saveArtistEditor = artistEditorActionHandlers[types.SAVE_ARTIST_EDITOR];
|
||||
export const bulkDeleteArtist = artistEditorActionHandlers[types.BULK_DELETE_ARTIST];
|
|
@ -116,7 +116,7 @@ const importArtistActionHandlers = {
|
|||
|
||||
// Make sure we have a selected series and
|
||||
// the same series hasn't been added yet.
|
||||
if (selectedSeries && !_.some(acc, { tvdbId: selectedSeries.tvdbId })) {
|
||||
if (selectedSeries && !_.some(acc, { foreignArtistId: selectedSeries.foreignArtistId })) {
|
||||
const newSeries = getNewSeries(_.cloneDeep(selectedSeries), item);
|
||||
newSeries.path = item.path;
|
||||
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
import { createAction } from 'redux-actions';
|
||||
import * as types from './actionTypes';
|
||||
import seasonPassActionHandlers from './seasonPassActionHandlers';
|
||||
|
||||
export const setSeasonPassSort = createAction(types.SET_SEASON_PASS_SORT);
|
||||
export const setSeasonPassFilter = createAction(types.SET_SEASON_PASS_FILTER);
|
||||
export const saveSeasonPass = seasonPassActionHandlers[types.SAVE_SEASON_PASS];
|
|
@ -1,8 +0,0 @@
|
|||
import { createAction } from 'redux-actions';
|
||||
import * as types from './actionTypes';
|
||||
import seriesEditorActionHandlers from './seriesEditorActionHandlers';
|
||||
|
||||
export const setSeriesEditorSort = createAction(types.SET_SERIES_EDITOR_SORT);
|
||||
export const setSeriesEditorFilter = createAction(types.SET_SERIES_EDITOR_FILTER);
|
||||
export const saveArtistEditor = seriesEditorActionHandlers[types.SAVE_ARTIST_EDITOR];
|
||||
export const bulkDeleteArtist = seriesEditorActionHandlers[types.BULK_DELETE_ARTIST];
|
|
@ -3,8 +3,8 @@ import persistState from 'redux-localstorage';
|
|||
import * as addArtistReducers from 'Store/Reducers/addArtistReducers';
|
||||
import * as episodeReducers from 'Store/Reducers/episodeReducers';
|
||||
import * as artistIndexReducers from 'Store/Reducers/artistIndexReducers';
|
||||
import * as seriesEditorReducers from 'Store/Reducers/seriesEditorReducers';
|
||||
import * as seasonPassReducers from 'Store/Reducers/seasonPassReducers';
|
||||
import * as artistEditorReducers from 'Store/Reducers/artistEditorReducers';
|
||||
import * as albumStudioReducers from 'Store/Reducers/albumStudioReducers';
|
||||
import * as calendarReducers from 'Store/Reducers/calendarReducers';
|
||||
import * as historyReducers from 'Store/Reducers/historyReducers';
|
||||
import * as blacklistReducers from 'Store/Reducers/blacklistReducers';
|
||||
|
@ -18,8 +18,8 @@ const reducers = [
|
|||
addArtistReducers,
|
||||
episodeReducers,
|
||||
artistIndexReducers,
|
||||
seriesEditorReducers,
|
||||
seasonPassReducers,
|
||||
artistEditorReducers,
|
||||
albumStudioReducers,
|
||||
calendarReducers,
|
||||
historyReducers,
|
||||
blacklistReducers,
|
||||
|
|
|
@ -18,16 +18,16 @@ export const defaultState = {
|
|||
};
|
||||
|
||||
export const persistState = [
|
||||
'seasonPass.sortKey',
|
||||
'seasonPass.sortDirection',
|
||||
'seasonPass.filterKey',
|
||||
'seasonPass.filterValue',
|
||||
'seasonPass.filterType'
|
||||
'albumStudio.sortKey',
|
||||
'albumStudio.sortDirection',
|
||||
'albumStudio.filterKey',
|
||||
'albumStudio.filterValue',
|
||||
'albumStudio.filterType'
|
||||
];
|
||||
|
||||
const reducerSection = 'seasonPass';
|
||||
const reducerSection = 'albumStudio';
|
||||
|
||||
const seasonPassReducers = handleActions({
|
||||
const albumStudioReducers = handleActions({
|
||||
|
||||
[types.SET]: createSetReducer(reducerSection),
|
||||
|
||||
|
@ -36,4 +36,4 @@ const seasonPassReducers = handleActions({
|
|||
|
||||
}, defaultState);
|
||||
|
||||
export default seasonPassReducers;
|
||||
export default albumStudioReducers;
|
|
@ -20,22 +20,22 @@ export const defaultState = {
|
|||
};
|
||||
|
||||
export const persistState = [
|
||||
'seriesEditor.sortKey',
|
||||
'seriesEditor.sortDirection',
|
||||
'seriesEditor.filterKey',
|
||||
'seriesEditor.filterValue',
|
||||
'seriesEditor.filterType'
|
||||
'artistEditor.sortKey',
|
||||
'artistEditor.sortDirection',
|
||||
'artistEditor.filterKey',
|
||||
'artistEditor.filterValue',
|
||||
'artistEditor.filterType'
|
||||
];
|
||||
|
||||
const reducerSection = 'seriesEditor';
|
||||
const reducerSection = 'artistEditor';
|
||||
|
||||
const seriesEditorReducers = handleActions({
|
||||
const artistEditorReducers = handleActions({
|
||||
|
||||
[types.SET]: createSetReducer(reducerSection),
|
||||
|
||||
[types.SET_SERIES_EDITOR_SORT]: createSetClientSideCollectionSortReducer(reducerSection),
|
||||
[types.SET_SERIES_EDITOR_FILTER]: createSetClientSideCollectionFilterReducer(reducerSection)
|
||||
[types.SET_ARTIST_EDITOR_SORT]: createSetClientSideCollectionSortReducer(reducerSection),
|
||||
[types.SET_ARTIST_EDITOR_FILTER]: createSetClientSideCollectionFilterReducer(reducerSection)
|
||||
|
||||
}, defaultState);
|
||||
|
||||
export default seriesEditorReducers;
|
||||
export default artistEditorReducers;
|
|
@ -22,7 +22,7 @@ export const defaultState = {
|
|||
|
||||
const reducerSection = 'series';
|
||||
|
||||
const seriesReducers = handleActions({
|
||||
const artistReducers = handleActions({
|
||||
|
||||
[types.SET]: createSetReducer(reducerSection),
|
||||
[types.UPDATE]: createUpdateReducer(reducerSection),
|
||||
|
@ -34,4 +34,4 @@ const seriesReducers = handleActions({
|
|||
|
||||
}, defaultState);
|
||||
|
||||
export default seriesReducers;
|
||||
export default artistReducers;
|
|
@ -4,10 +4,10 @@ import { routerReducer } from 'react-router-redux';
|
|||
import app, { defaultState as defaultappState } from './appReducers';
|
||||
import addArtist, { defaultState as defaultAddSeriesState } from './addArtistReducers';
|
||||
import importArtist, { defaultState as defaultImportArtistState } from './importArtistReducers';
|
||||
import series, { defaultState as defaultSeriesState } from './seriesReducers';
|
||||
import series, { defaultState as defaultSeriesState } from './artistReducers';
|
||||
import seriesIndex, { defaultState as defaultSeriesIndexState } from './artistIndexReducers';
|
||||
import seriesEditor, { defaultState as defaultSeriesEditorState } from './seriesEditorReducers';
|
||||
import seasonPass, { defaultState as defaultSeasonPassState } from './seasonPassReducers';
|
||||
import artistEditor, { defaultState as defaultArtistEditorState } from './artistEditorReducers';
|
||||
import albumStudio, { defaultState as defaultAlbumStudioState } from './albumStudioReducers';
|
||||
import calendar, { defaultState as defaultCalendarState } from './calendarReducers';
|
||||
import history, { defaultState as defaultHistoryState } from './historyReducers';
|
||||
import queue, { defaultState as defaultQueueState } from './queueReducers';
|
||||
|
@ -34,8 +34,8 @@ export const defaultState = {
|
|||
importArtist: defaultImportArtistState,
|
||||
series: defaultSeriesState,
|
||||
seriesIndex: defaultSeriesIndexState,
|
||||
seriesEditor: defaultSeriesEditorState,
|
||||
seasonPass: defaultSeasonPassState,
|
||||
artistEditor: defaultArtistEditorState,
|
||||
albumStudio: defaultAlbumStudioState,
|
||||
calendar: defaultCalendarState,
|
||||
history: defaultHistoryState,
|
||||
queue: defaultQueueState,
|
||||
|
@ -63,8 +63,8 @@ export default enableBatching(combineReducers({
|
|||
importArtist,
|
||||
series,
|
||||
seriesIndex,
|
||||
seriesEditor,
|
||||
seasonPass,
|
||||
artistEditor,
|
||||
albumStudio,
|
||||
calendar,
|
||||
history,
|
||||
queue,
|
||||
|
|
|
@ -14,7 +14,7 @@ export const defaultState = {
|
|||
isFetching: false,
|
||||
isPopulated: false,
|
||||
pageSize: 20,
|
||||
sortKey: 'airDateUtc',
|
||||
sortKey: 'releaseDate',
|
||||
sortDirection: sortDirections.DESCENDING,
|
||||
filterKey: 'monitored',
|
||||
filterValue: 'true',
|
||||
|
@ -23,32 +23,32 @@ export const defaultState = {
|
|||
|
||||
columns: [
|
||||
{
|
||||
name: 'series.sortTitle',
|
||||
label: 'Series Title',
|
||||
name: 'artist.sortName',
|
||||
label: 'Artist Name',
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
// {
|
||||
// name: 'episode',
|
||||
// label: 'Episode',
|
||||
// isVisible: true
|
||||
// },
|
||||
{
|
||||
name: 'episode',
|
||||
label: 'Episode',
|
||||
name: 'albumTitle',
|
||||
label: 'Album Title',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'episodeTitle',
|
||||
label: 'Episode Title',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'airDateUtc',
|
||||
label: 'Air Date',
|
||||
name: 'releaseDate',
|
||||
label: 'Release Date',
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'status',
|
||||
label: 'Status',
|
||||
isVisible: true
|
||||
},
|
||||
// {
|
||||
// name: 'status',
|
||||
// label: 'Status',
|
||||
// isVisible: true
|
||||
// },
|
||||
{
|
||||
name: 'actions',
|
||||
columnLabel: 'Actions',
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { createSelector } from 'reselect';
|
||||
|
||||
function createAllSeriesSelector() {
|
||||
function createAllArtistSelector() {
|
||||
return createSelector(
|
||||
(state) => state.series,
|
||||
(series) => {
|
||||
|
@ -9,4 +9,4 @@ function createAllSeriesSelector() {
|
|||
);
|
||||
}
|
||||
|
||||
export default createAllSeriesSelector;
|
||||
export default createAllArtistSelector;
|
|
@ -1,11 +1,11 @@
|
|||
import _ from 'lodash';
|
||||
import { createSelector } from 'reselect';
|
||||
import createAllSeriesSelector from './createAllSeriesSelector';
|
||||
import createAllArtistSelector from './createAllArtistSelector';
|
||||
|
||||
function createArtistSelector() {
|
||||
return createSelector(
|
||||
(state, { artistId }) => artistId,
|
||||
createAllSeriesSelector(),
|
||||
createAllArtistSelector(),
|
||||
(artistId, series) => {
|
||||
return _.find(series, { id: artistId });
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import _ from 'lodash';
|
||||
import { createSelector } from 'reselect';
|
||||
import createAllSeriesSelector from './createAllSeriesSelector';
|
||||
import createAllArtistSelector from './createAllArtistSelector';
|
||||
|
||||
function createExistingArtistSelector() {
|
||||
return createSelector(
|
||||
(state, { foreignArtistId }) => foreignArtistId,
|
||||
createAllSeriesSelector(),
|
||||
createAllArtistSelector(),
|
||||
(foreignArtistId, series) => {
|
||||
return _.some(series, { foreignArtistId });
|
||||
}
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
import _ from 'lodash';
|
||||
import { createSelector } from 'reselect';
|
||||
import createAllSeriesSelector from './createAllSeriesSelector';
|
||||
import createAllArtistSelector from './createAllArtistSelector';
|
||||
|
||||
function createImportArtistItemSelector() {
|
||||
return createSelector(
|
||||
(state, { id }) => id,
|
||||
(state) => state.addArtist,
|
||||
(state) => state.importArtist,
|
||||
createAllSeriesSelector(),
|
||||
createAllArtistSelector(),
|
||||
(id, addArtist, importArtist, series) => {
|
||||
const item = _.find(importArtist.items, { id }) || {};
|
||||
const selectedSeries = item && item.selectedSeries;
|
||||
const isExistingArtist = !!selectedSeries && _.some(series, { tvdbId: selectedSeries.tvdbId });
|
||||
const isExistingArtist = !!selectedSeries && _.some(series, { foreignArtistId: selectedSeries.foreignArtistId });
|
||||
|
||||
return {
|
||||
defaultMonitor: addArtist.defaults.monitor,
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import _ from 'lodash';
|
||||
import { createSelector } from 'reselect';
|
||||
import createAllSeriesSelector from './createAllSeriesSelector';
|
||||
import createAllArtistSelector from './createAllArtistSelector';
|
||||
|
||||
function createProfileInUseSelector(profileProp) {
|
||||
return createSelector(
|
||||
(state, { id }) => id,
|
||||
createAllSeriesSelector(),
|
||||
createAllArtistSelector(),
|
||||
(id, series) => {
|
||||
if (!id) {
|
||||
return false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue