mirror of
https://github.com/lidarr/lidarr.git
synced 2025-07-16 10:03:51 -07:00
New: Add/remove individual albums
This commit is contained in:
parent
8da53ae6aa
commit
0bde5fd9e5
128 changed files with 2796 additions and 743 deletions
|
@ -10,6 +10,7 @@ import createSetTableOptionReducer from './Creators/Reducers/createSetTableOptio
|
|||
import createSaveProviderHandler from './Creators/createSaveProviderHandler';
|
||||
import albumEntities from 'Album/albumEntities';
|
||||
import createFetchHandler from './Creators/createFetchHandler';
|
||||
import createRemoveItemHandler from './Creators/createRemoveItemHandler';
|
||||
import createHandleActions from './Creators/createHandleActions';
|
||||
import { updateItem } from './baseActions';
|
||||
|
||||
|
@ -113,6 +114,7 @@ export const SET_ALBUMS_TABLE_OPTION = 'albums/setAlbumsTableOption';
|
|||
export const CLEAR_ALBUMS = 'albums/clearAlbums';
|
||||
export const SET_ALBUM_VALUE = 'albums/setAlbumValue';
|
||||
export const SAVE_ALBUM = 'albums/saveAlbum';
|
||||
export const DELETE_ALBUM = 'albums/deleteAlbum';
|
||||
export const TOGGLE_ALBUM_MONITORED = 'albums/toggleAlbumMonitored';
|
||||
export const TOGGLE_ALBUMS_MONITORED = 'albums/toggleAlbumsMonitored';
|
||||
|
||||
|
@ -128,6 +130,16 @@ export const toggleAlbumsMonitored = createThunk(TOGGLE_ALBUMS_MONITORED);
|
|||
|
||||
export const saveAlbum = createThunk(SAVE_ALBUM);
|
||||
|
||||
export const deleteAlbum = createThunk(DELETE_ALBUM, (payload) => {
|
||||
return {
|
||||
...payload,
|
||||
queryParams: {
|
||||
deleteFiles: payload.deleteFiles,
|
||||
addImportListExclusion: payload.addImportListExclusion
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
export const setAlbumValue = createAction(SET_ALBUM_VALUE, (payload) => {
|
||||
return {
|
||||
section: 'albums',
|
||||
|
@ -141,6 +153,7 @@ export const setAlbumValue = createAction(SET_ALBUM_VALUE, (payload) => {
|
|||
export const actionHandlers = handleThunks({
|
||||
[FETCH_ALBUMS]: createFetchHandler(section, '/album'),
|
||||
[SAVE_ALBUM]: createSaveProviderHandler(section, '/album'),
|
||||
[DELETE_ALBUM]: createRemoveItemHandler(section, '/album'),
|
||||
|
||||
[TOGGLE_ALBUM_MONITORED]: function(getState, payload, dispatch) {
|
||||
const {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import * as addArtist from './addArtistActions';
|
||||
import * as app from './appActions';
|
||||
import * as blacklist from './blacklistActions';
|
||||
import * as calendar from './calendarActions';
|
||||
|
@ -24,6 +23,7 @@ import * as artist from './artistActions';
|
|||
import * as artistEditor from './artistEditorActions';
|
||||
import * as artistHistory from './artistHistoryActions';
|
||||
import * as artistIndex from './artistIndexActions';
|
||||
import * as search from './searchActions';
|
||||
import * as settings from './settingsActions';
|
||||
import * as system from './systemActions';
|
||||
import * as tags from './tagActions';
|
||||
|
@ -31,7 +31,6 @@ import * as tracks from './trackActions';
|
|||
import * as wanted from './wantedActions';
|
||||
|
||||
export default [
|
||||
addArtist,
|
||||
app,
|
||||
blacklist,
|
||||
captcha,
|
||||
|
@ -57,6 +56,7 @@ export default [
|
|||
artistEditor,
|
||||
artistHistory,
|
||||
artistIndex,
|
||||
search,
|
||||
settings,
|
||||
system,
|
||||
tags,
|
||||
|
|
|
@ -6,15 +6,15 @@ import getSectionState from 'Utilities/State/getSectionState';
|
|||
import updateSectionState from 'Utilities/State/updateSectionState';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import getNewArtist from 'Utilities/Artist/getNewArtist';
|
||||
import getNewAlbum from 'Utilities/Album/getNewAlbum';
|
||||
import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import createSetSettingValueReducer from './Creators/Reducers/createSetSettingValueReducer';
|
||||
import createHandleActions from './Creators/createHandleActions';
|
||||
import { set, update, updateItem } from './baseActions';
|
||||
|
||||
//
|
||||
// Variables
|
||||
|
||||
export const section = 'addArtist';
|
||||
export const section = 'search';
|
||||
let abortCurrentRequest = null;
|
||||
|
||||
//
|
||||
|
@ -40,39 +40,33 @@ export const defaultState = {
|
|||
};
|
||||
|
||||
export const persistState = [
|
||||
'addArtist.defaults'
|
||||
'search.defaults'
|
||||
];
|
||||
|
||||
//
|
||||
// Actions Types
|
||||
|
||||
export const LOOKUP_ARTIST = 'addArtist/lookupArtist';
|
||||
export const ADD_ARTIST = 'addArtist/addArtist';
|
||||
export const SET_ADD_ARTIST_VALUE = 'addArtist/setAddArtistValue';
|
||||
export const CLEAR_ADD_ARTIST = 'addArtist/clearAddArtist';
|
||||
export const SET_ADD_ARTIST_DEFAULT = 'addArtist/setAddArtistDefault';
|
||||
export const GET_SEARCH_RESULTS = 'search/getSearchResults';
|
||||
export const ADD_ARTIST = 'search/addArtist';
|
||||
export const ADD_ALBUM = 'search/addAlbum';
|
||||
export const CLEAR_SEARCH_RESULTS = 'search/clearSearchResults';
|
||||
export const SET_ADD_DEFAULT = 'search/setAddDefault';
|
||||
|
||||
//
|
||||
// Action Creators
|
||||
|
||||
export const lookupArtist = createThunk(LOOKUP_ARTIST);
|
||||
export const getSearchResults = createThunk(GET_SEARCH_RESULTS);
|
||||
export const addArtist = createThunk(ADD_ARTIST);
|
||||
export const clearAddArtist = createAction(CLEAR_ADD_ARTIST);
|
||||
export const setAddArtistDefault = createAction(SET_ADD_ARTIST_DEFAULT);
|
||||
|
||||
export const setAddArtistValue = createAction(SET_ADD_ARTIST_VALUE, (payload) => {
|
||||
return {
|
||||
section,
|
||||
...payload
|
||||
};
|
||||
});
|
||||
export const addAlbum = createThunk(ADD_ALBUM);
|
||||
export const clearSearchResults = createAction(CLEAR_SEARCH_RESULTS);
|
||||
export const setAddDefault = createAction(SET_ADD_DEFAULT);
|
||||
|
||||
//
|
||||
// Action Handlers
|
||||
|
||||
export const actionHandlers = handleThunks({
|
||||
|
||||
[LOOKUP_ARTIST]: function(getState, payload, dispatch) {
|
||||
[GET_SEARCH_RESULTS]: function(getState, payload, dispatch) {
|
||||
dispatch(set({ section, isFetching: true }));
|
||||
|
||||
if (abortCurrentRequest) {
|
||||
|
@ -80,7 +74,7 @@ export const actionHandlers = handleThunks({
|
|||
}
|
||||
|
||||
const { request, abortRequest } = createAjaxRequest({
|
||||
url: '/artist/lookup',
|
||||
url: '/search',
|
||||
data: {
|
||||
term: payload.term
|
||||
}
|
||||
|
@ -115,8 +109,9 @@ export const actionHandlers = handleThunks({
|
|||
dispatch(set({ section, isAdding: true }));
|
||||
|
||||
const foreignArtistId = payload.foreignArtistId;
|
||||
const items = getState().addArtist.items;
|
||||
const newArtist = getNewArtist(_.cloneDeep(_.find(items, { foreignArtistId })), payload);
|
||||
const items = getState().search.items;
|
||||
const itemToAdd = _.find(items, { foreignId: foreignArtistId });
|
||||
const newArtist = getNewArtist(_.cloneDeep(itemToAdd.artist), payload);
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: '/artist',
|
||||
|
@ -138,6 +133,47 @@ export const actionHandlers = handleThunks({
|
|||
]));
|
||||
});
|
||||
|
||||
promise.fail((xhr) => {
|
||||
dispatch(set({
|
||||
section,
|
||||
isAdding: false,
|
||||
isAdded: false,
|
||||
addError: xhr
|
||||
}));
|
||||
});
|
||||
},
|
||||
|
||||
[ADD_ALBUM]: function(getState, payload, dispatch) {
|
||||
dispatch(set({ section, isAdding: true }));
|
||||
|
||||
const foreignAlbumId = payload.foreignAlbumId;
|
||||
const items = getState().search.items;
|
||||
const itemToAdd = _.find(items, { foreignId: foreignAlbumId });
|
||||
const newAlbum = getNewAlbum(_.cloneDeep(itemToAdd.album), payload);
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
url: '/album',
|
||||
method: 'POST',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify(newAlbum)
|
||||
}).request;
|
||||
|
||||
promise.done((data) => {
|
||||
data.releases = itemToAdd.album.releases;
|
||||
itemToAdd.album = data;
|
||||
dispatch(batchActions([
|
||||
updateItem({ section: 'artist', ...data.artist }),
|
||||
updateItem({ section, ...itemToAdd }),
|
||||
|
||||
set({
|
||||
section,
|
||||
isAdding: false,
|
||||
isAdded: true,
|
||||
addError: null
|
||||
})
|
||||
]));
|
||||
});
|
||||
|
||||
promise.fail((xhr) => {
|
||||
dispatch(set({
|
||||
section,
|
||||
|
@ -154,9 +190,7 @@ export const actionHandlers = handleThunks({
|
|||
|
||||
export const reducers = createHandleActions({
|
||||
|
||||
[SET_ADD_ARTIST_VALUE]: createSetSettingValueReducer(section),
|
||||
|
||||
[SET_ADD_ARTIST_DEFAULT]: function(state, { payload }) {
|
||||
[SET_ADD_DEFAULT]: function(state, { payload }) {
|
||||
const newState = getSectionState(state, section);
|
||||
|
||||
newState.defaults = {
|
||||
|
@ -167,7 +201,7 @@ export const reducers = createHandleActions({
|
|||
return updateSectionState(state, section, newState);
|
||||
},
|
||||
|
||||
[CLEAR_ADD_ARTIST]: function(state) {
|
||||
[CLEAR_SEARCH_RESULTS]: function(state) {
|
||||
const {
|
||||
defaults,
|
||||
...otherDefaultState
|
Loading…
Add table
Add a link
Reference in a new issue