diff --git a/persistence/album_repository.go b/persistence/album_repository.go index 692a3a68..ac3df791 100644 --- a/persistence/album_repository.go +++ b/persistence/album_repository.go @@ -41,6 +41,7 @@ func NewAlbumRepository(ctx context.Context, o orm.Ormer) model.AlbumRepository "artist_id": artistFilter, "year": yearFilter, "recently_played": recentlyPlayedFilter, + "starred": booleanFilter, } return r @@ -313,5 +314,22 @@ func (r *albumRepository) NewInstance() interface{} { return &model.Album{} } +func (r albumRepository) Delete(id string) error { + return r.delete(Eq{"id": id}) +} + +func (r albumRepository) Save(entity interface{}) (string, error) { + mf := entity.(*model.Artist) + id, err := r.put(mf.ID, mf) + return id, err +} + +func (r albumRepository) Update(entity interface{}, cols ...string) error { + mf := entity.(*model.Artist) + _, err := r.put(mf.ID, mf) + return err +} + var _ model.AlbumRepository = (*albumRepository)(nil) var _ model.ResourceRepository = (*albumRepository)(nil) +var _ rest.Persistable = (*albumRepository)(nil) diff --git a/persistence/artist_repository.go b/persistence/artist_repository.go index 443cd41e..e9b626b0 100644 --- a/persistence/artist_repository.go +++ b/persistence/artist_repository.go @@ -203,14 +203,14 @@ func (r artistRepository) Delete(id string) error { } func (r artistRepository) Save(entity interface{}) (string, error) { - mf := entity.(*model.Artist) - err := r.Put(mf) - return mf.ID, err + artist := entity.(*model.Artist) + err := r.Put(artist) + return artist.ID, err } func (r artistRepository) Update(entity interface{}, cols ...string) error { - mf := entity.(*model.Artist) - return r.Put(mf) + artist := entity.(*model.Artist) + return r.Put(artist) } var _ model.ArtistRepository = (*artistRepository)(nil) diff --git a/resources/i18n/pt.json b/resources/i18n/pt.json index a9227c66..1fc487da 100644 --- a/resources/i18n/pt.json +++ b/resources/i18n/pt.json @@ -53,6 +53,7 @@ "lists": { "all": "Todos", "random": "Aleatório", + "starred": "Favoritos", "recentlyAdded": "Recém-adicionados", "recentlyPlayed": "Recém-tocados", "mostPlayed": "Mais tocados" diff --git a/ui/src/album/AlbumList.js b/ui/src/album/AlbumList.js index 65b557e9..9a9bdd79 100644 --- a/ui/src/album/AlbumList.js +++ b/ui/src/album/AlbumList.js @@ -12,8 +12,9 @@ import { useTranslate, useListParams, } from 'react-admin' -import { List, Title, useAlbumsPerPage } from '../common' +import StarIcon from '@material-ui/icons/Star' import { withWidth } from '@material-ui/core' +import { List, QuickFilter, Title, useAlbumsPerPage } from '../common' import AlbumListActions from './AlbumListActions' import AlbumListView from './AlbumListView' import AlbumGridView from './AlbumGridView' @@ -37,6 +38,11 @@ const AlbumFilter = (props) => { + } + defaultValue={true} + /> ) } diff --git a/ui/src/album/AlbumListView.js b/ui/src/album/AlbumListView.js index 22fcb055..b3d1e720 100644 --- a/ui/src/album/AlbumListView.js +++ b/ui/src/album/AlbumListView.js @@ -10,14 +10,24 @@ import { SimpleShowLayout, TextField, } from 'react-admin' +import { useMediaQuery } from '@material-ui/core' +import StarBorderIcon from '@material-ui/icons/StarBorder' import { ArtistLinkField, DurationField, RangeField, SimpleList, } from '../common' -import { useMediaQuery } from '@material-ui/core' import { AlbumContextMenu } from '../common' +import { makeStyles } from '@material-ui/core/styles' + +const useStyles = makeStyles({ + columnIcon: { + marginLeft: '3px', + marginTop: '-2px', + verticalAlign: 'text-top', + }, +}) const AlbumDetails = (props) => { return ( @@ -64,6 +74,7 @@ const AlbumDatagrid = (props) => ( ) const AlbumListView = ({ hasShow, hasEdit, hasList, ...rest }) => { + const classes = useStyles() const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md')) const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs')) return isXsmall ? ( @@ -88,7 +99,11 @@ const AlbumListView = ({ hasShow, hasEdit, hasList, ...rest }) => { {isDesktop && } {isDesktop && } - + + } + /> ) } diff --git a/ui/src/album/albumLists.js b/ui/src/album/albumLists.js index 7dc1b0ef..e83700bc 100644 --- a/ui/src/album/albumLists.js +++ b/ui/src/album/albumLists.js @@ -3,6 +3,7 @@ import LibraryAddIcon from '@material-ui/icons/LibraryAdd' import VideoLibraryIcon from '@material-ui/icons/VideoLibrary' import RepeatIcon from '@material-ui/icons/Repeat' import AlbumIcon from '@material-ui/icons/Album' +import StarIcon from '@material-ui/icons/Star' export default { all: { @@ -10,6 +11,10 @@ export default { params: 'sort=name&order=ASC', }, random: { icon: ShuffleIcon, params: 'sort=random' }, + starred: { + icon: StarIcon, + params: 'sort=starred_at&order=DESC&filter={"starred":true}', + }, recentlyAdded: { icon: LibraryAddIcon, params: 'sort=created_at&order=DESC', diff --git a/ui/src/common/ContextMenus.js b/ui/src/common/ContextMenus.js index 7089ec20..710f0441 100644 --- a/ui/src/common/ContextMenus.js +++ b/ui/src/common/ContextMenus.js @@ -201,10 +201,12 @@ AlbumContextMenu.propTypes = { discNumber: PropTypes.number, visible: PropTypes.bool, color: PropTypes.string, + showStar: PropTypes.bool, } AlbumContextMenu.defaultProps = { visible: true, + showStar: true, addLabel: true, } diff --git a/ui/src/i18n/en.json b/ui/src/i18n/en.json index 9d73bce7..507b66be 100644 --- a/ui/src/i18n/en.json +++ b/ui/src/i18n/en.json @@ -54,6 +54,7 @@ "lists": { "all": "All", "random": "Random", + "starred": "Starred", "recentlyAdded": "Recently Added", "recentlyPlayed": "Recently Played", "mostPlayed": "Most Played"