From a439a7be3c5cb001d55c78b99cb8da6506afb31a Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Thu, 17 Oct 2024 11:16:25 -0400
Subject: fixed drag/drop of faces from one face to another.

---
 .../collectionFreeForm/FaceCollectionBox.tsx       | 23 +++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

(limited to 'src/client/views/collections/collectionFreeForm/FaceCollectionBox.tsx')

diff --git a/src/client/views/collections/collectionFreeForm/FaceCollectionBox.tsx b/src/client/views/collections/collectionFreeForm/FaceCollectionBox.tsx
index 534f67927..6d51ecac6 100644
--- a/src/client/views/collections/collectionFreeForm/FaceCollectionBox.tsx
+++ b/src/client/views/collections/collectionFreeForm/FaceCollectionBox.tsx
@@ -8,7 +8,7 @@ import { observer } from 'mobx-react';
 import React from 'react';
 import { DivHeight, lightOrDark, returnTrue, setupMoveUpEvents } from '../../../../ClientUtils';
 import { emptyFunction } from '../../../../Utils';
-import { Doc, Opt } from '../../../../fields/Doc';
+import { Doc, DocListCast, Opt } from '../../../../fields/Doc';
 import { DocData } from '../../../../fields/DocSymbols';
 import { List } from '../../../../fields/List';
 import { DocCast, ImageCast, NumCast, StrCast } from '../../../../fields/Types';
@@ -54,7 +54,7 @@ export class UniqueFaceBox extends ViewBoxBaseComponent<FieldViewProps>() {
     @observable _headerRef: HTMLDivElement | null = null;
     @observable _listRef: HTMLDivElement | null = null;
 
-    observer = new ResizeObserver(a => {
+    observer = new ResizeObserver(() => {
         this._props.setHeight?.(
             (this.props.Document._face_showImages ? 20 : 0) + //
                 (!this._headerRef ? 0 : DivHeight(this._headerRef)) +
@@ -97,9 +97,9 @@ export class UniqueFaceBox extends ViewBoxBaseComponent<FieldViewProps>() {
                     const faceMatcher = new FaceMatcher([labeledFaceDescriptor], 1);
                     const faceAnno =
                         FaceRecognitionHandler.ImageDocFaceAnnos(imgDoc).reduce(
-                            (prev, faceAnno) => {
-                                const match = faceMatcher.matchDescriptor(new Float32Array(Array.from(faceAnno.faceDescriptor as List<number>)));
-                                return match.distance < prev.dist ? { dist: match.distance, faceAnno } : prev;
+                            (prev, fAnno) => {
+                                const match = faceMatcher.matchDescriptor(new Float32Array(Array.from(fAnno.faceDescriptor as List<number>)));
+                                return match.distance < prev.dist ? { dist: match.distance, faceAnno: fAnno } : prev;
                             },
                             { dist: 1, faceAnno: undefined as Opt<Doc> }
                         ).faceAnno ?? imgDoc;
@@ -108,10 +108,18 @@ export class UniqueFaceBox extends ViewBoxBaseComponent<FieldViewProps>() {
                     if (faceAnno) {
                         faceAnno.face && FaceRecognitionHandler.UniqueFaceRemoveFaceImage(faceAnno, DocCast(faceAnno.face));
                         FaceRecognitionHandler.UniqueFaceAddFaceImage(faceAnno, this.Document);
-                        faceAnno.face = this.Document;
+                        faceAnno[DocData].face = this.Document[DocData];
                     }
                 }
             });
+        de.complete.docDragData?.droppedDocuments
+            ?.filter(doc => DocCast(doc.face)?.type === DocumentType.UFACE)
+            .forEach(faceAnno => {
+                const imgDoc = faceAnno;
+                faceAnno.face && FaceRecognitionHandler.UniqueFaceRemoveFaceImage(imgDoc, DocCast(faceAnno.face));
+                FaceRecognitionHandler.UniqueFaceAddFaceImage(faceAnno, this.Document);
+                faceAnno[DocData].face = this.Document[DocData];
+            });
         e.stopPropagation();
         return true;
     }
@@ -189,7 +197,8 @@ export class UniqueFaceBox extends ViewBoxBaseComponent<FieldViewProps>() {
                                             this,
                                             e,
                                             () => {
-                                                DragManager.StartDocumentDrag([e.target as HTMLElement], new DragManager.DocumentDragData([doc], dropActionType.embed), e.clientX, e.clientY);
+                                                const dragDoc = DocListCast(doc.data_annotations).find(a => a.face === this.Document[DocData]) ?? this.Document;
+                                                DragManager.StartDocumentDrag([e.target as HTMLElement], new DragManager.DocumentDragData([dragDoc], dropActionType.embed), e.clientX, e.clientY);
                                                 return true;
                                             },
                                             emptyFunction,
-- 
cgit v1.2.3-70-g09d2

