mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 12:24:38 +03:00
Improve 'item not found' pages (#3438)
* Make scene 'not found' page consistent * Make backend response for no result consistent
This commit is contained in:
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
@@ -16,7 +18,7 @@ func (r *queryResolver) FindGallery(ctx context.Context, id string) (ret *models
|
|||||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||||
ret, err = r.repository.Gallery.Find(ctx, idInt)
|
ret, err = r.repository.Gallery.Find(ctx, idInt)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/99designs/gqlgen/graphql"
|
"github.com/99designs/gqlgen/graphql"
|
||||||
@@ -23,7 +25,7 @@ func (r *queryResolver) FindImage(ctx context.Context, id *string, checksum *str
|
|||||||
}
|
}
|
||||||
|
|
||||||
image, err = qb.Find(ctx, idInt)
|
image, err = qb.Find(ctx, idInt)
|
||||||
if err != nil {
|
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if checksum != nil {
|
} else if checksum != nil {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
@@ -16,7 +18,7 @@ func (r *queryResolver) FindMovie(ctx context.Context, id string) (ret *models.M
|
|||||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||||
ret, err = r.repository.Movie.Find(ctx, idInt)
|
ret, err = r.repository.Movie.Find(ctx, idInt)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +36,6 @@ func (r *queryResolver) FindMovies(ctx context.Context, movieFilter *models.Movi
|
|||||||
Count: total,
|
Count: total,
|
||||||
Movies: movies,
|
Movies: movies,
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
@@ -16,7 +18,7 @@ func (r *queryResolver) FindPerformer(ctx context.Context, id string) (ret *mode
|
|||||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||||
ret, err = r.repository.Performer.Find(ctx, idInt)
|
ret, err = r.repository.Performer.Find(ctx, idInt)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
@@ -16,7 +18,7 @@ func (r *queryResolver) FindSavedFilter(ctx context.Context, id string) (ret *mo
|
|||||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||||
ret, err = r.repository.SavedFilter.Find(ctx, idInt)
|
ret, err = r.repository.SavedFilter.Find(ctx, idInt)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return ret, err
|
return ret, err
|
||||||
@@ -40,7 +42,7 @@ func (r *queryResolver) FindDefaultFilter(ctx context.Context, mode models.Filte
|
|||||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||||
ret, err = r.repository.SavedFilter.FindDefault(ctx, mode)
|
ret, err = r.repository.SavedFilter.FindDefault(ctx, mode)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return ret, err
|
return ret, err
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/99designs/gqlgen/graphql"
|
"github.com/99designs/gqlgen/graphql"
|
||||||
@@ -21,7 +23,7 @@ func (r *queryResolver) FindScene(ctx context.Context, id *string, checksum *str
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
scene, err = qb.Find(ctx, idInt)
|
scene, err = qb.Find(ctx, idInt)
|
||||||
if err != nil {
|
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if checksum != nil {
|
} else if checksum != nil {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
@@ -17,7 +19,7 @@ func (r *queryResolver) FindStudio(ctx context.Context, id string) (ret *models.
|
|||||||
var err error
|
var err error
|
||||||
ret, err = r.repository.Studio.Find(ctx, idInt)
|
ret, err = r.repository.Studio.Find(ctx, idInt)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
@@ -16,7 +18,7 @@ func (r *queryResolver) FindTag(ctx context.Context, id string) (ret *models.Tag
|
|||||||
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
if err := r.withReadTxn(ctx, func(ctx context.Context) error {
|
||||||
ret, err = r.repository.Tag.Find(ctx, idInt)
|
ret, err = r.repository.Tag.Find(ctx, idInt)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,12 @@ import {
|
|||||||
queryFindScenesByID,
|
queryFindScenesByID,
|
||||||
} from "src/core/StashService";
|
} from "src/core/StashService";
|
||||||
|
|
||||||
import Icon from "src/components/Shared/Icon";
|
import {
|
||||||
|
ErrorMessage,
|
||||||
|
LoadingIndicator,
|
||||||
|
Icon,
|
||||||
|
Counter,
|
||||||
|
} from "src/components/Shared";
|
||||||
import { useToast } from "src/hooks";
|
import { useToast } from "src/hooks";
|
||||||
import SceneQueue, { QueuedScene } from "src/models/sceneQueue";
|
import SceneQueue, { QueuedScene } from "src/models/sceneQueue";
|
||||||
import { ListFilterModel } from "src/models/list-filter/filter";
|
import { ListFilterModel } from "src/models/list-filter/filter";
|
||||||
@@ -58,7 +63,6 @@ const DeleteScenesDialog = lazy(() => import("../DeleteScenesDialog"));
|
|||||||
const GenerateDialog = lazy(() => import("../../Dialogs/GenerateDialog"));
|
const GenerateDialog = lazy(() => import("../../Dialogs/GenerateDialog"));
|
||||||
const SceneVideoFilterPanel = lazy(() => import("./SceneVideoFilterPanel"));
|
const SceneVideoFilterPanel = lazy(() => import("./SceneVideoFilterPanel"));
|
||||||
import { objectPath, objectTitle } from "src/core/files";
|
import { objectPath, objectTitle } from "src/core/files";
|
||||||
import { Counter } from "src/components/Shared";
|
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
scene: GQL.SceneDataFragment;
|
scene: GQL.SceneDataFragment;
|
||||||
@@ -514,7 +518,7 @@ const SceneLoader: React.FC = () => {
|
|||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
const { configuration } = useContext(ConfigurationContext);
|
const { configuration } = useContext(ConfigurationContext);
|
||||||
const { data, loading } = useFindScene(id ?? "");
|
const { data, loading, error } = useFindScene(id ?? "");
|
||||||
|
|
||||||
const queryParams = useMemo(
|
const queryParams = useMemo(
|
||||||
() => queryString.parse(location.search, { decode: false }),
|
() => queryString.parse(location.search, { decode: false }),
|
||||||
@@ -728,11 +732,14 @@ const SceneLoader: React.FC = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (loading) return <LoadingIndicator />;
|
||||||
|
if (error) return <ErrorMessage error={error.message} />;
|
||||||
|
|
||||||
const scene = data?.findScene;
|
const scene = data?.findScene;
|
||||||
|
if (!scene) return <ErrorMessage error={`No scene found with id ${id}.`} />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="row">
|
<div className="row">
|
||||||
{!loading && scene ? (
|
|
||||||
<ScenePage
|
<ScenePage
|
||||||
scene={scene}
|
scene={scene}
|
||||||
setTimestamp={setTimestamp}
|
setTimestamp={setTimestamp}
|
||||||
@@ -751,9 +758,6 @@ const SceneLoader: React.FC = () => {
|
|||||||
setCollapsed={setCollapsed}
|
setCollapsed={setCollapsed}
|
||||||
setContinuePlaylist={setContinuePlaylist}
|
setContinuePlaylist={setContinuePlaylist}
|
||||||
/>
|
/>
|
||||||
) : (
|
|
||||||
<div className="scene-tabs" />
|
|
||||||
)}
|
|
||||||
<div className={`scene-player-container ${collapsed ? "expanded" : ""}`}>
|
<div className={`scene-player-container ${collapsed ? "expanded" : ""}`}>
|
||||||
<ScenePlayer
|
<ScenePlayer
|
||||||
key="ScenePlayer"
|
key="ScenePlayer"
|
||||||
|
|||||||
Reference in New Issue
Block a user