diff --git a/persistence/mediafile_repository.go b/persistence/mediafile_repository.go
index d0d728f39..dec45155f 100644
--- a/persistence/mediafile_repository.go
+++ b/persistence/mediafile_repository.go
@@ -28,13 +28,14 @@ func NewMediaFileRepository(ctx context.Context, o orm.Ormer) *mediaFileReposito
"random": "RANDOM()",
}
r.filterMappings = map[string]filterFunc{
- "title": fullTextFilter,
+ "title": fullTextFilter,
+ "starred": booleanFilter,
}
return r
}
func (r mediaFileRepository) CountAll(options ...model.QueryOptions) (int64, error) {
- return r.count(Select(), options...)
+ return r.count(r.newSelectWithAnnotation("id", options...))
}
func (r mediaFileRepository) Exists(id string) (bool, error) {
diff --git a/ui/src/album/AlbumSongs.js b/ui/src/album/AlbumSongs.js
index 19a00ee4c..c709a6605 100644
--- a/ui/src/album/AlbumSongs.js
+++ b/ui/src/album/AlbumSongs.js
@@ -6,6 +6,7 @@ import {
ListToolbar,
TextField,
useListController,
+ useTranslate,
} from 'react-admin'
import classnames from 'classnames'
import { useDispatch } from 'react-redux'
@@ -65,6 +66,7 @@ const trackName = (r) => {
const AlbumSongs = (props) => {
const classes = useStyles(props)
+ const translate = useTranslate()
const classesToolbar = useStylesListToolbar(props)
const dispatch = useDispatch()
const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))
@@ -144,7 +146,9 @@ const AlbumSongs = (props) => {
)}
{isDesktop && }
-
+
)}
diff --git a/ui/src/i18n/en.json b/ui/src/i18n/en.json
index f30ddb00c..c027c90b5 100644
--- a/ui/src/i18n/en.json
+++ b/ui/src/i18n/en.json
@@ -18,7 +18,8 @@
"size": "File size",
"bitRate": "Bit rate",
"updatedAt": "Uploaded at",
- "discSubtitle": "Disc Subtitle"
+ "discSubtitle": "Disc Subtitle",
+ "starred": "Starred"
},
"actions": {
"addToQueue": "Play Later",
diff --git a/ui/src/song/SongList.js b/ui/src/song/SongList.js
index 58eb1c1ba..94bc7c133 100644
--- a/ui/src/song/SongList.js
+++ b/ui/src/song/SongList.js
@@ -2,11 +2,14 @@ import React from 'react'
import {
Filter,
FunctionField,
+ NullableBooleanInput,
NumberField,
SearchInput,
TextField,
+ useTranslate,
} from 'react-admin'
import { useMediaQuery } from '@material-ui/core'
+import StarBorderIcon from '@material-ui/icons/StarBorder'
import {
DurationField,
SimpleList,
@@ -23,11 +26,13 @@ import { AlbumLinkField } from './AlbumLinkField'
const SongFilter = (props) => (
+
)
const SongList = (props) => {
const dispatch = useDispatch()
+ const translate = useTranslate()
const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))
const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))
return (
@@ -66,7 +71,10 @@ const SongList = (props) => {
r.year || ''} />
)}
-
+
)}