From a3e53465010ce4132272cb2a3f9bf36e904e34cb Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Sat, 20 Feb 2021 14:45:43 +0100 Subject: [PATCH] Properly configure face gallery --- api/graphql/generated.go | 48 +++++++++---------- api/graphql/resolvers/faces.go | 2 +- api/graphql/schema.graphql | 4 +- ui/src/Pages/PeoplePage/PeoplePage.js | 5 ++ .../SingleFaceGroup/SingleFaceGroup.js | 19 ++++++-- 5 files changed, 48 insertions(+), 30 deletions(-) diff --git a/api/graphql/generated.go b/api/graphql/generated.go index 5c01fe64..f9ec1221 100644 --- a/api/graphql/generated.go +++ b/api/graphql/generated.go @@ -144,7 +144,7 @@ type ComplexityRoot struct { DeleteUser func(childComplexity int, id int) int FavoriteMedia func(childComplexity int, mediaID int, favorite bool) int InitialSetupWizard func(childComplexity int, username string, password string, rootPath string) int - MoveImageFace func(childComplexity int, imageFaceID int, newFaceGroupID int) int + MoveImageFaces func(childComplexity int, imageFaceIDs []int, destinationFaceGroupID int) int ProtectShareToken func(childComplexity int, token string, password *string) int RecognizeUnlabeledFaces func(childComplexity int) int ScanAll func(childComplexity int) int @@ -295,7 +295,7 @@ type MutationResolver interface { SetScannerConcurrentWorkers(ctx context.Context, workers int) (int, error) SetFaceGroupLabel(ctx context.Context, faceGroupID int, label *string) (*models.FaceGroup, error) CombineFaceGroups(ctx context.Context, destinationFaceGroupID int, sourceFaceGroupID int) (*models.FaceGroup, error) - MoveImageFace(ctx context.Context, imageFaceID int, newFaceGroupID int) (*models.ImageFace, error) + MoveImageFaces(ctx context.Context, imageFaceIDs []int, destinationFaceGroupID int) (*models.FaceGroup, error) RecognizeUnlabeledFaces(ctx context.Context) ([]*models.ImageFace, error) } type QueryResolver interface { @@ -827,17 +827,17 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Mutation.InitialSetupWizard(childComplexity, args["username"].(string), args["password"].(string), args["rootPath"].(string)), true - case "Mutation.moveImageFace": - if e.complexity.Mutation.MoveImageFace == nil { + case "Mutation.moveImageFaces": + if e.complexity.Mutation.MoveImageFaces == nil { break } - args, err := ec.field_Mutation_moveImageFace_args(context.TODO(), rawArgs) + args, err := ec.field_Mutation_moveImageFaces_args(context.TODO(), rawArgs) if err != nil { return 0, false } - return e.complexity.Mutation.MoveImageFace(childComplexity, args["imageFaceID"].(int), args["newFaceGroupID"].(int)), true + return e.complexity.Mutation.MoveImageFaces(childComplexity, args["imageFaceIDs"].([]int), args["destinationFaceGroupID"].(int)), true case "Mutation.protectShareToken": if e.complexity.Mutation.ProtectShareToken == nil { @@ -1651,8 +1651,8 @@ type Mutation { setFaceGroupLabel(faceGroupID: ID!, label: String): FaceGroup! "Merge two face groups into a single one, all ImageFaces from source will be moved to destination" combineFaceGroups(destinationFaceGroupID: ID!, sourceFaceGroupID: ID!): FaceGroup! - "Move a single ImageFace to another face group" - moveImageFace(imageFaceID: ID!, newFaceGroupID: ID!): ImageFace! + "Move a list of ImageFaces to another face group" + moveImageFaces(imageFaceIDs: [ID!]!, destinationFaceGroupID: ID!): FaceGroup! "Check all unlabeled faces to see if they match a labeled FaceGroup, and move them if they match" recognizeUnlabeledFaces: [ImageFace!]! } @@ -2111,27 +2111,27 @@ func (ec *executionContext) field_Mutation_initialSetupWizard_args(ctx context.C return args, nil } -func (ec *executionContext) field_Mutation_moveImageFace_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { +func (ec *executionContext) field_Mutation_moveImageFaces_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} - var arg0 int - if tmp, ok := rawArgs["imageFaceID"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("imageFaceID")) - arg0, err = ec.unmarshalNID2int(ctx, tmp) + var arg0 []int + if tmp, ok := rawArgs["imageFaceIDs"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("imageFaceIDs")) + arg0, err = ec.unmarshalNID2ᚕintᚄ(ctx, tmp) if err != nil { return nil, err } } - args["imageFaceID"] = arg0 + args["imageFaceIDs"] = arg0 var arg1 int - if tmp, ok := rawArgs["newFaceGroupID"]; ok { - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("newFaceGroupID")) + if tmp, ok := rawArgs["destinationFaceGroupID"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("destinationFaceGroupID")) arg1, err = ec.unmarshalNID2int(ctx, tmp) if err != nil { return nil, err } } - args["newFaceGroupID"] = arg1 + args["destinationFaceGroupID"] = arg1 return args, nil } @@ -5448,7 +5448,7 @@ func (ec *executionContext) _Mutation_combineFaceGroups(ctx context.Context, fie return ec.marshalNFaceGroup2ᚖgithubᚗcomᚋphotoviewᚋphotoviewᚋapiᚋgraphqlᚋmodelsᚐFaceGroup(ctx, field.Selections, res) } -func (ec *executionContext) _Mutation_moveImageFace(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { +func (ec *executionContext) _Mutation_moveImageFaces(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) @@ -5465,7 +5465,7 @@ func (ec *executionContext) _Mutation_moveImageFace(ctx context.Context, field g ctx = graphql.WithFieldContext(ctx, fc) rawArgs := field.ArgumentMap(ec.Variables) - args, err := ec.field_Mutation_moveImageFace_args(ctx, rawArgs) + args, err := ec.field_Mutation_moveImageFaces_args(ctx, rawArgs) if err != nil { ec.Error(ctx, err) return graphql.Null @@ -5473,7 +5473,7 @@ func (ec *executionContext) _Mutation_moveImageFace(ctx context.Context, field g fc.Args = args resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().MoveImageFace(rctx, args["imageFaceID"].(int), args["newFaceGroupID"].(int)) + return ec.resolvers.Mutation().MoveImageFaces(rctx, args["imageFaceIDs"].([]int), args["destinationFaceGroupID"].(int)) }) if err != nil { ec.Error(ctx, err) @@ -5485,9 +5485,9 @@ func (ec *executionContext) _Mutation_moveImageFace(ctx context.Context, field g } return graphql.Null } - res := resTmp.(*models.ImageFace) + res := resTmp.(*models.FaceGroup) fc.Result = res - return ec.marshalNImageFace2ᚖgithubᚗcomᚋphotoviewᚋphotoviewᚋapiᚋgraphqlᚋmodelsᚐImageFace(ctx, field.Selections, res) + return ec.marshalNFaceGroup2ᚖgithubᚗcomᚋphotoviewᚋphotoviewᚋapiᚋgraphqlᚋmodelsᚐFaceGroup(ctx, field.Selections, res) } func (ec *executionContext) _Mutation_recognizeUnlabeledFaces(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { @@ -9617,8 +9617,8 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { invalids++ } - case "moveImageFace": - out.Values[i] = ec._Mutation_moveImageFace(ctx, field) + case "moveImageFaces": + out.Values[i] = ec._Mutation_moveImageFaces(ctx, field) if out.Values[i] == graphql.Null { invalids++ } diff --git a/api/graphql/resolvers/faces.go b/api/graphql/resolvers/faces.go index dbe77178..7ea9284c 100644 --- a/api/graphql/resolvers/faces.go +++ b/api/graphql/resolvers/faces.go @@ -149,7 +149,7 @@ func (r *mutationResolver) CombineFaceGroups(ctx context.Context, destinationFac return destinationFaceGroup, nil } -func (r *mutationResolver) MoveImageFace(ctx context.Context, imageFaceID int, newFaceGroupID int) (*models.ImageFace, error) { +func (r *mutationResolver) MoveImageFaces(ctx context.Context, imageFaceIDs []int, destinationFaceGroupID int) (*models.FaceGroup, error) { panic("not implemented") } diff --git a/api/graphql/schema.graphql b/api/graphql/schema.graphql index 36bb8ebd..ffcac478 100644 --- a/api/graphql/schema.graphql +++ b/api/graphql/schema.graphql @@ -120,8 +120,8 @@ type Mutation { setFaceGroupLabel(faceGroupID: ID!, label: String): FaceGroup! "Merge two face groups into a single one, all ImageFaces from source will be moved to destination" combineFaceGroups(destinationFaceGroupID: ID!, sourceFaceGroupID: ID!): FaceGroup! - "Move a single ImageFace to another face group" - moveImageFace(imageFaceID: ID!, newFaceGroupID: ID!): ImageFace! + "Move a list of ImageFaces to another face group" + moveImageFaces(imageFaceIDs: [ID!]!, destinationFaceGroupID: ID!): FaceGroup! "Check all unlabeled faces to see if they match a labeled FaceGroup, and move them if they match" recognizeUnlabeledFaces: [ImageFace!]! } diff --git a/ui/src/Pages/PeoplePage/PeoplePage.js b/ui/src/Pages/PeoplePage/PeoplePage.js index 8bbfc391..f445a5f6 100644 --- a/ui/src/Pages/PeoplePage/PeoplePage.js +++ b/ui/src/Pages/PeoplePage/PeoplePage.js @@ -23,11 +23,16 @@ export const MY_FACES_QUERY = gql` } media { id + type thumbnail { url width height } + highRes { + url + } + favorite } } } diff --git a/ui/src/Pages/PeoplePage/SingleFaceGroup/SingleFaceGroup.js b/ui/src/Pages/PeoplePage/SingleFaceGroup/SingleFaceGroup.js index 5a32e5d8..a6110817 100644 --- a/ui/src/Pages/PeoplePage/SingleFaceGroup/SingleFaceGroup.js +++ b/ui/src/Pages/PeoplePage/SingleFaceGroup/SingleFaceGroup.js @@ -1,5 +1,5 @@ import PropTypes from 'prop-types' -import React from 'react' +import React, { useState } from 'react' import PhotoGallery from '../../../components/photoGallery/PhotoGallery' import { ProtectedImage } from '../../../components/photoGallery/ProtectedMedia' import FaceGroupTitle from './FaceGroupTitle' @@ -18,16 +18,29 @@ ImageFace.propTypes = { } const SingleFaceGroup = ({ faceGroup }) => { + const [presenting, setPresenting] = useState(false) + const [activeIndex, setActiveIndex] = useState(-1) + let mediaGallery = null if (faceGroup) { const media = faceGroup.imageFaces.map(x => x.media) + + const nextImage = () => + setActiveIndex(i => Math.min(i + 1, media.length - 1)) + + const previousImage = () => setActiveIndex(i => Math.max(i - 1, 0)) + mediaGallery = (
{}} - onSelectImage={() => {}} + presenting={presenting} + setPresenting={setPresenting} + onSelectImage={setActiveIndex} + activeIndex={activeIndex} + nextImage={nextImage} + previousImage={previousImage} />
)