Movie scene sort (#1325)

* Add movie_scene_number sort order
* Sort movie scenes by scene number by default
This commit is contained in:
WithoutPants
2021-04-22 12:22:51 +10:00
committed by GitHub
parent 1767390e0d
commit bf3f658091
6 changed files with 30 additions and 11 deletions

View File

@@ -673,6 +673,9 @@ func (qb *sceneQueryBuilder) setSceneSort(query *queryBuilder, findFilter *model
sort := findFilter.GetSort("title") sort := findFilter.GetSort("title")
direction := findFilter.GetDirection() direction := findFilter.GetDirection()
switch sort { switch sort {
case "movie_scene_number":
query.join(moviesScenesTable, "movies_join", "scenes.id")
query.sortAndPagination += fmt.Sprintf(" ORDER BY movies_join.scene_index %s", getSortDirection(direction))
case "tag_count": case "tag_count":
query.sortAndPagination += getCountSort(sceneTable, scenesTagsTable, sceneIDColumn, direction) query.sortAndPagination += getCountSort(sceneTable, scenesTagsTable, sceneIDColumn, direction)
case "performer_count": case "performer_count":

View File

@@ -11,6 +11,7 @@
* Added scene queue. * Added scene queue.
### 🎨 Improvements ### 🎨 Improvements
* Sort movie scenes by scene number by default.
* Support http request headers in scrapers. * Support http request headers in scrapers.
* Sort performers by gender in scene/image/gallery cards and details. * Sort performers by gender in scene/image/gallery cards and details.
* Add popover buttons for scenes/images/galleries on performer/studio/tag cards. * Add popover buttons for scenes/images/galleries on performer/studio/tag cards.

View File

@@ -42,7 +42,9 @@ export const MovieScenesPanel: React.FC<IMovieScenesPanel> = ({ movie }) => {
} }
if (movie && movie.id) { if (movie && movie.id) {
return <SceneList filterHook={filterHook} />; return (
<SceneList filterHook={filterHook} defaultSort="movie_scene_number" />
);
} }
return <></>; return <></>;
}; };

View File

@@ -23,11 +23,13 @@ import { SceneCardsGrid } from "./SceneCardsGrid";
interface ISceneList { interface ISceneList {
filterHook?: (filter: ListFilterModel) => ListFilterModel; filterHook?: (filter: ListFilterModel) => ListFilterModel;
defaultSort?: string;
persistState?: PersistanceLevel.ALL; persistState?: PersistanceLevel.ALL;
} }
export const SceneList: React.FC<ISceneList> = ({ export const SceneList: React.FC<ISceneList> = ({
filterHook, filterHook,
defaultSort,
persistState, persistState,
}) => { }) => {
const history = useHistory(); const history = useHistory();
@@ -83,6 +85,7 @@ export const SceneList: React.FC<ISceneList> = ({
zoomable: true, zoomable: true,
selectable: true, selectable: true,
otherOperations, otherOperations,
defaultSort,
renderContent, renderContent,
renderEditDialog: renderEditScenesDialog, renderEditDialog: renderEditScenesDialog,
renderDeleteDialog, renderDeleteDialog,

View File

@@ -88,6 +88,7 @@ export enum PersistanceLevel {
interface IListHookOptions<T, E> { interface IListHookOptions<T, E> {
persistState?: PersistanceLevel; persistState?: PersistanceLevel;
persistanceKey?: string; persistanceKey?: string;
defaultSort?: string;
filterHook?: (filter: ListFilterModel) => ListFilterModel; filterHook?: (filter: ListFilterModel) => ListFilterModel;
zoomable?: boolean; zoomable?: boolean;
selectable?: boolean; selectable?: boolean;
@@ -431,7 +432,11 @@ const useList = <QueryResult extends IQueryResult, QueryData extends IDataItem>(
const persistanceKey = options.persistanceKey ?? options.filterMode; const persistanceKey = options.persistanceKey ?? options.filterMode;
const [filter, setFilter] = useState<ListFilterModel>( const [filter, setFilter] = useState<ListFilterModel>(
new ListFilterModel(options.filterMode, queryString.parse(location.search)) new ListFilterModel(
options.filterMode,
queryString.parse(location.search),
options.defaultSort
)
); );
const updateInterfaceConfig = useCallback( const updateInterfaceConfig = useCallback(

View File

@@ -111,11 +111,15 @@ export class ListFilterModel {
return new CriterionOption(Criterion.getLabel(criterion), criterion); return new CriterionOption(Criterion.getLabel(criterion), criterion);
} }
public constructor(filterMode: FilterMode, rawParms?: ParsedQuery<string>) { public constructor(
filterMode: FilterMode,
rawParms?: ParsedQuery<string>,
defaultSort?: string
) {
const params = rawParms as IQueryParameters; const params = rawParms as IQueryParameters;
switch (filterMode) { switch (filterMode) {
case FilterMode.Scenes: case FilterMode.Scenes:
this.sortBy = "date"; this.sortBy = defaultSort ?? "date";
this.sortByOptions = [ this.sortByOptions = [
"title", "title",
"path", "path",
@@ -131,6 +135,7 @@ export class ListFilterModel {
"tag_count", "tag_count",
"performer_count", "performer_count",
"random", "random",
"movie_scene_number",
]; ];
this.displayModeOptions = [ this.displayModeOptions = [
DisplayMode.Grid, DisplayMode.Grid,
@@ -159,7 +164,7 @@ export class ListFilterModel {
]; ];
break; break;
case FilterMode.Images: case FilterMode.Images:
this.sortBy = "path"; this.sortBy = defaultSort ?? "path";
this.sortByOptions = [ this.sortByOptions = [
"title", "title",
"path", "path",
@@ -189,7 +194,7 @@ export class ListFilterModel {
]; ];
break; break;
case FilterMode.Performers: { case FilterMode.Performers: {
this.sortBy = "name"; this.sortBy = defaultSort ?? "name";
this.sortByOptions = [ this.sortByOptions = [
"name", "name",
"height", "height",
@@ -239,7 +244,7 @@ export class ListFilterModel {
break; break;
} }
case FilterMode.Studios: case FilterMode.Studios:
this.sortBy = "name"; this.sortBy = defaultSort ?? "name";
this.sortByOptions = [ this.sortByOptions = [
"name", "name",
"scenes_count", "scenes_count",
@@ -259,7 +264,7 @@ export class ListFilterModel {
]; ];
break; break;
case FilterMode.Movies: case FilterMode.Movies:
this.sortBy = "name"; this.sortBy = defaultSort ?? "name";
this.sortByOptions = ["name", "scenes_count", "random"]; this.sortByOptions = ["name", "scenes_count", "random"];
this.displayModeOptions = [DisplayMode.Grid]; this.displayModeOptions = [DisplayMode.Grid];
this.criterionOptions = [ this.criterionOptions = [
@@ -270,7 +275,7 @@ export class ListFilterModel {
]; ];
break; break;
case FilterMode.Galleries: case FilterMode.Galleries:
this.sortBy = "path"; this.sortBy = defaultSort ?? "path";
this.sortByOptions = [ this.sortByOptions = [
"path", "path",
"file_mod_time", "file_mod_time",
@@ -302,7 +307,7 @@ export class ListFilterModel {
]; ];
break; break;
case FilterMode.SceneMarkers: case FilterMode.SceneMarkers:
this.sortBy = "title"; this.sortBy = defaultSort ?? "title";
this.sortByOptions = [ this.sortByOptions = [
"title", "title",
"seconds", "seconds",
@@ -319,7 +324,7 @@ export class ListFilterModel {
]; ];
break; break;
case FilterMode.Tags: case FilterMode.Tags:
this.sortBy = "name"; this.sortBy = defaultSort ?? "name";
// scene markers count has been disabled for now due to performance // scene markers count has been disabled for now due to performance
// issues // issues
this.sortByOptions = [ this.sortByOptions = [