@@ -3,9 +3,14 @@ import React, { PropTypes } from 'react'
3
3
import { connect } from 'react-redux'
4
4
import { bindActionCreators } from 'redux'
5
5
6
+ import AlbumGrid from '../../components/AlbumGrid'
6
7
import Header from '../../components/Header'
8
+ import DropdownField from '../../components/DropdownField'
7
9
import List from '../../components/List'
10
+ import LazyLoadListener from '../../components/LazyLoadListener'
8
11
12
+ import * as helpers from '../../helpers'
13
+ import * as uiActions from '../../services/ui/actions'
9
14
import * as mopidyActions from '../../services/mopidy/actions'
10
15
import * as spotifyActions from '../../services/spotify/actions'
11
16
@@ -20,14 +25,77 @@ class LibraryLocalAlbums extends React.Component{
20
25
}
21
26
22
27
componentWillReceiveProps ( nextProps ) {
23
- if ( ! this . props . mopidy_connected && nextProps . mopidy_connected ) {
28
+ if ( ! this . props . mopidy_connected && nextProps . mopidy_connected ) {
24
29
this . loadAlbums ( nextProps ) ;
25
30
}
26
31
}
27
32
28
33
loadAlbums ( props = this . props ) {
29
- if ( props . mopidy_connected ) {
30
- this . props . mopidyActions . getAlbums ( ) ;
34
+ if ( props . mopidy_connected && ! this . props . local_albums ) {
35
+ this . props . mopidyActions . getLocalAlbums ( ) ;
36
+ }
37
+ }
38
+
39
+ loadMore ( ) {
40
+ var uris = [ ]
41
+ if ( this . props . albums && this . props . local_albums ) {
42
+ for ( var i = 0 ; i < this . props . local_albums . length ; i ++ ) {
43
+ var uri = this . props . local_albums [ i ]
44
+ if ( ! this . props . albums . hasOwnProperty ( uri ) ) {
45
+ uris . push ( uri )
46
+ }
47
+
48
+ // limit each lookup to 50 URIs
49
+ if ( uris . length >= 50 ) break
50
+ }
51
+ }
52
+
53
+ if ( uris && uris . length > 0 ) this . props . mopidyActions . getAlbums ( uris )
54
+ }
55
+
56
+ setSort ( value ) {
57
+ var reverse = false
58
+ if ( this . props . sort == value ) reverse = ! this . props . sort_reverse
59
+
60
+ var data = {
61
+ library_local_albums_sort_reverse : reverse ,
62
+ library_local_albums_sort : value
63
+ }
64
+ this . props . uiActions . set ( data )
65
+ }
66
+
67
+ renderView ( albums ) {
68
+ if ( this . props . view == 'list' ) {
69
+
70
+ var columns = [
71
+ {
72
+ label : 'Name' ,
73
+ name : 'name' ,
74
+ width : 40
75
+ } ,
76
+ {
77
+ label : 'Artists' ,
78
+ name : 'artists' ,
79
+ width : 30
80
+ } ,
81
+ {
82
+ label : 'Tracks' ,
83
+ name : 'tracks_total' ,
84
+ width : 15
85
+ }
86
+ ]
87
+
88
+ return (
89
+ < section className = "list-wrapper" >
90
+ < List columns = { columns } rows = { albums } link_prefix = { global . baseURL + "album/" } />
91
+ </ section >
92
+ )
93
+ } else {
94
+ return (
95
+ < section className = "grid-wrapper" >
96
+ < AlbumGrid albums = { albums } />
97
+ </ section >
98
+ )
31
99
}
32
100
}
33
101
@@ -40,16 +108,44 @@ class LibraryLocalAlbums extends React.Component{
40
108
albums . push ( this . props . albums [ uri ] )
41
109
}
42
110
}
111
+
112
+ if ( this . props . sort ) {
113
+ albums = helpers . sortItems ( albums , this . props . sort , this . props . sort_reverse )
114
+ }
43
115
}
44
116
117
+ var view_options = [
118
+ {
119
+ value : 'thumbnails' ,
120
+ label : 'Thumbnails'
121
+ } ,
122
+ {
123
+ value : 'list' ,
124
+ label : 'List'
125
+ }
126
+ ]
127
+
128
+ var sort_options = [
129
+ {
130
+ value : 'name' ,
131
+ label : 'Name'
132
+ }
133
+ ]
134
+
135
+ var actions = (
136
+ < span >
137
+ < DropdownField icon = "sort" name = "Sort" value = { this . props . sort } options = { sort_options } reverse = { this . props . sort_reverse } handleChange = { val => this . setSort ( val ) } />
138
+ < DropdownField icon = "eye" name = "View" value = { this . props . view } options = { view_options } handleChange = { val => this . props . uiActions . set ( { library_local_albums_view : val } ) } />
139
+ </ span >
140
+ )
141
+
45
142
return (
46
143
< div className = "view library-local-view" >
47
- < Header icon = "music" title = "Local albums" />
48
- < div >
49
- < List columns = { [ { name : 'name' , width : '100' } ] } rows = { albums } link_prefix = { global . baseURL + "album/" } />
50
- </ div >
144
+ < Header icon = "music" title = "Local albums" actions = { actions } />
145
+ { this . renderView ( albums ) }
146
+ < LazyLoadListener loadMore = { ( ) => this . loadMore ( ) } />
51
147
</ div >
52
- ) ;
148
+ )
53
149
}
54
150
}
55
151
@@ -63,13 +159,17 @@ class LibraryLocalAlbums extends React.Component{
63
159
const mapStateToProps = ( state , ownProps ) => {
64
160
return {
65
161
mopidy_connected : state . mopidy . connected ,
162
+ albums : state . ui . albums ,
66
163
local_albums : state . ui . local_albums ,
67
- albums : state . ui . albums
164
+ view : state . ui . library_local_albums_view ,
165
+ sort : state . ui . library_local_albums_sort ,
166
+ sort_reverse : state . ui . library_local_albums_sort_reverse
68
167
}
69
168
}
70
169
71
170
const mapDispatchToProps = ( dispatch ) => {
72
171
return {
172
+ uiActions : bindActionCreators ( uiActions , dispatch ) ,
73
173
mopidyActions : bindActionCreators ( mopidyActions , dispatch ) ,
74
174
spotifyActions : bindActionCreators ( spotifyActions , dispatch )
75
175
}
0 commit comments