mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Movie scene sort (#1325)
* Add movie_scene_number sort order * Sort movie scenes by scene number by default
This commit is contained in:
@@ -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":
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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 <></>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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 = [
|
||||||
|
|||||||
Reference in New Issue
Block a user