mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-09 19:01:42 +00:00
feat: add make key face photo sup
This commit is contained in:
@@ -369,6 +369,14 @@ class MetadataManagerAPI {
|
||||
return this.req.post(url, params);
|
||||
};
|
||||
|
||||
setPeoplePhoto = (repoID, peopleId, recordId) => {
|
||||
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/people-cover-photo/' + peopleId + '/';
|
||||
const params = {
|
||||
record_id: recordId
|
||||
};
|
||||
return this.req.put(url, params);
|
||||
};
|
||||
|
||||
// ocr
|
||||
openOCR = (repoID) => {
|
||||
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/ocr/';
|
||||
|
@@ -179,6 +179,14 @@ class Context {
|
||||
return viewId === FACE_RECOGNITION_VIEW_ID;
|
||||
};
|
||||
|
||||
canSetPeoplePhoto = () => {
|
||||
const viewId = this.getSetting('viewID');
|
||||
if (this.permission === 'r' || viewId !== FACE_RECOGNITION_VIEW_ID) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
restoreRows = () => {
|
||||
// todo
|
||||
};
|
||||
@@ -282,6 +290,11 @@ class Context {
|
||||
return this.metadataAPI.removePeoplePhotos(repoID, recordId, photoIds);
|
||||
};
|
||||
|
||||
setPeoplePhoto = (recordId, photoId) => {
|
||||
const repoID = this.settings['repoID'];
|
||||
return this.metadataAPI.setPeoplePhoto(repoID, recordId, photoId);
|
||||
};
|
||||
|
||||
// file tag
|
||||
updateFileTags = (data) => {
|
||||
const repoID = this.settings['repoID'];
|
||||
|
@@ -622,6 +622,14 @@ class Store {
|
||||
this.applyOperation(operation);
|
||||
};
|
||||
|
||||
setPeoplePhoto = (peopleId, selectedPhoto) => {
|
||||
const type = OPERATION_TYPE.SET_PEOPLE_COVER_PHOTO;
|
||||
const operation = this.createOperation({
|
||||
type, repo_id: this.repoId, people_id: peopleId, selected_photo: selectedPhoto
|
||||
});
|
||||
this.applyOperation(operation);
|
||||
};
|
||||
|
||||
// tag
|
||||
updateFileTags = (data) => {
|
||||
const type = OPERATION_TYPE.UPDATE_FILE_TAGS;
|
||||
|
@@ -32,6 +32,7 @@ export const OPERATION_TYPE = {
|
||||
DELETE_PEOPLE_PHOTOS: 'delete_people_photos',
|
||||
REMOVE_PEOPLE_PHOTOS: 'remove_people_photos',
|
||||
ADD_PEOPLE_PHOTOS: 'add_people_photos',
|
||||
SET_PEOPLE_COVER_PHOTO: 'set_people_cover_photo',
|
||||
|
||||
// tag
|
||||
UPDATE_FILE_TAGS: 'update_file_tags',
|
||||
@@ -72,6 +73,7 @@ export const OPERATION_ATTRIBUTES = {
|
||||
[OPERATION_TYPE.DELETE_PEOPLE_PHOTOS]: ['repo_id', 'people_id', 'deleted_photos'],
|
||||
[OPERATION_TYPE.REMOVE_PEOPLE_PHOTOS]: ['repo_id', 'people_id', 'removed_photos', 'success_callback'],
|
||||
[OPERATION_TYPE.ADD_PEOPLE_PHOTOS]: ['repo_id', 'people_id', 'old_people_id', 'added_photos', 'success_callback'],
|
||||
[OPERATION_TYPE.SET_PEOPLE_COVER_PHOTO]: ['repo_id', 'people_id', 'selected_photo'],
|
||||
|
||||
[OPERATION_TYPE.MODIFY_SETTINGS]: ['repo_id', 'view_id', 'settings'],
|
||||
|
||||
|
@@ -234,6 +234,15 @@ class ServerOperator {
|
||||
});
|
||||
break;
|
||||
}
|
||||
case OPERATION_TYPE.SET_PEOPLE_COVER_PHOTO: {
|
||||
const { people_id, selected_photo } = operation;
|
||||
window.sfMetadataContext.setPeoplePhoto(people_id, selected_photo).then(res => {
|
||||
callback({ operation });
|
||||
}).catch(error => {
|
||||
callback({ error: gettext('Failed to set people cover photo') });
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
||||
// tags
|
||||
case OPERATION_TYPE.UPDATE_FILE_TAGS: {
|
||||
|
@@ -31,6 +31,10 @@ const FaceRecognition = () => {
|
||||
store.removePeoplePhotos(peopleId, peoplePhotos, { success_callback });
|
||||
}, [store]);
|
||||
|
||||
const onSetPeoplePhoto = useCallback((peopleId, peoplePhoto) => {
|
||||
store.setPeoplePhoto(peopleId, peoplePhoto);
|
||||
}, [store]);
|
||||
|
||||
const openPeople = useCallback((people) => {
|
||||
peopleRef.current = people;
|
||||
const name = people._is_someone ? (people._name || gettext('Person image')) : gettext('Unknown people');
|
||||
@@ -64,6 +68,7 @@ const FaceRecognition = () => {
|
||||
onAddPeoplePhotos={onAddPeoplePhotos}
|
||||
onRemovePeoplePhotos={onRemovePeoplePhotos}
|
||||
onDeletePeoplePhotos={onDeletePeoplePhotos}
|
||||
onSetPeoplePhoto={onSetPeoplePhoto}
|
||||
/>
|
||||
) : (
|
||||
<Peoples peoples={peoples} onRename={onRename} onOpenPeople={openPeople} />
|
||||
|
@@ -22,7 +22,7 @@ import '../../gallery/index.css';
|
||||
|
||||
dayjs.extend(utc);
|
||||
|
||||
const PeoplePhotos = ({ view, people, onClose, onDeletePeoplePhotos, onAddPeoplePhotos, onRemovePeoplePhotos }) => {
|
||||
const PeoplePhotos = ({ view, people, onClose, onDeletePeoplePhotos, onAddPeoplePhotos, onSetPeoplePhoto, onRemovePeoplePhotos }) => {
|
||||
const [isLoading, setLoading] = useState(true);
|
||||
const [isLoadingMore, setLoadingMore] = useState(false);
|
||||
const [metadata, setMetadata] = useState({ rows: [] });
|
||||
@@ -148,6 +148,11 @@ const PeoplePhotos = ({ view, people, onClose, onDeletePeoplePhotos, onAddPeople
|
||||
});
|
||||
}, [people, onAddPeoplePhotos, deletedByIds]);
|
||||
|
||||
const handleSetPeoplePhoto = useCallback((selectedImage) => {
|
||||
const { id } = selectedImage;
|
||||
onSetPeoplePhoto(people._id, id);
|
||||
}, [people, onSetPeoplePhoto]);
|
||||
|
||||
const loadData = useCallback((view) => {
|
||||
setLoading(true);
|
||||
metadataAPI.getPeoplePhotos(repoID, people._id, 0, PER_LOAD_NUMBER).then(res => {
|
||||
@@ -245,6 +250,7 @@ const PeoplePhotos = ({ view, people, onClose, onDeletePeoplePhotos, onAddPeople
|
||||
onDelete={handelDelete}
|
||||
onRemoveImage={people._is_someone ? handelRemove : null}
|
||||
onAddImage={!people._is_someone ? handelAdd : null}
|
||||
onSetPeoplePhoto={handleSetPeoplePhoto}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
@@ -18,10 +18,11 @@ const CONTEXT_MENU_KEY = {
|
||||
DELETE: 'delete',
|
||||
DUPLICATE: 'duplicate',
|
||||
REMOVE: 'remove',
|
||||
SET_PEOPLE_PHOTO: 'set_people_photo',
|
||||
ADD_PHOTO_TO_GROUP: 'add_photo_to_group',
|
||||
};
|
||||
|
||||
const GalleryContextMenu = ({ metadata, selectedImages, onDelete, onDuplicate, addFolder, onRemoveImage, onAddImage }) => {
|
||||
const GalleryContextMenu = ({ metadata, selectedImages, onDelete, onDuplicate, addFolder, onRemoveImage, onAddImage, onSetPeoplePhoto }) => {
|
||||
const [isZipDialogOpen, setIsZipDialogOpen] = useState(false);
|
||||
const [isCopyDialogOpen, setIsCopyDialogOpen] = useState(false);
|
||||
const [isPeoplesDialogShow, setPeoplesDialogShow] = useState(false);
|
||||
@@ -31,6 +32,7 @@ const GalleryContextMenu = ({ metadata, selectedImages, onDelete, onDuplicate, a
|
||||
const canDuplicateRow = window.sfMetadataContext.canDuplicateRow();
|
||||
const canRemovePhotoFromPeople = window.sfMetadataContext.canRemovePhotoFromPeople();
|
||||
const canAddPhotoToPeople = window.sfMetadataContext.canAddPhotoToPeople();
|
||||
const canSetPeoplePhoto = window.sfMetadataContext.canSetPeoplePhoto();
|
||||
|
||||
const options = useMemo(() => {
|
||||
let validOptions = [{ value: CONTEXT_MENU_KEY.DOWNLOAD, label: gettext('Download') }];
|
||||
@@ -46,8 +48,11 @@ const GalleryContextMenu = ({ metadata, selectedImages, onDelete, onDuplicate, a
|
||||
if (onAddImage && canAddPhotoToPeople) {
|
||||
validOptions.push({ value: CONTEXT_MENU_KEY.ADD_PHOTO_TO_GROUP, label: gettext('Add to group') });
|
||||
}
|
||||
if (onSetPeoplePhoto && canSetPeoplePhoto) {
|
||||
validOptions.push({ value: CONTEXT_MENU_KEY.SET_PEOPLE_PHOTO, label: gettext('Set as cover photo') });
|
||||
}
|
||||
return validOptions;
|
||||
}, [checkCanDeleteRow, canDuplicateRow, canRemovePhotoFromPeople, canAddPhotoToPeople, selectedImages, onDuplicate, onDelete, onRemoveImage, onAddImage]);
|
||||
}, [checkCanDeleteRow, canDuplicateRow, canRemovePhotoFromPeople, canAddPhotoToPeople, selectedImages, onDuplicate, onDelete, onRemoveImage, onAddImage, canSetPeoplePhoto, onSetPeoplePhoto]);
|
||||
|
||||
const closeZipDialog = () => {
|
||||
setIsZipDialogOpen(false);
|
||||
@@ -104,8 +109,13 @@ const GalleryContextMenu = ({ metadata, selectedImages, onDelete, onDuplicate, a
|
||||
case CONTEXT_MENU_KEY.ADD_PHOTO_TO_GROUP:
|
||||
setPeoplesDialogShow(true);
|
||||
break;
|
||||
case CONTEXT_MENU_KEY.SET_PEOPLE_PHOTO:
|
||||
onSetPeoplePhoto(selectedImages[0]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}, [handleDownload, onDelete, selectedImages, toggleCopyDialog, onRemoveImage]);
|
||||
}, [handleDownload, onDelete, selectedImages, toggleCopyDialog, onRemoveImage, onSetPeoplePhoto]);
|
||||
|
||||
const closePeoplesDialog = useCallback(() => {
|
||||
setPeoplesDialogShow(false);
|
||||
|
@@ -19,7 +19,7 @@ import './index.css';
|
||||
|
||||
const OVER_SCAN_ROWS = 20;
|
||||
|
||||
const Main = ({ isLoadingMore, metadata, onDelete, onLoadMore, duplicateRecord, onAddFolder, onRemoveImage, onAddImage }) => {
|
||||
const Main = ({ isLoadingMore, metadata, onDelete, onLoadMore, duplicateRecord, onAddFolder, onRemoveImage, onAddImage, onSetPeoplePhoto }) => {
|
||||
const [isFirstLoading, setFirstLoading] = useState(true);
|
||||
const [zoomGear, setZoomGear] = useState(0);
|
||||
const [containerWidth, setContainerWidth] = useState(0);
|
||||
@@ -237,6 +237,13 @@ const Main = ({ isLoadingMore, metadata, onDelete, onLoadMore, duplicateRecord,
|
||||
});
|
||||
}, [onRemoveImage, updateCurrentDirent]);
|
||||
|
||||
const handleMakeSelectedAsCoverPhoto = useCallback((selectedImage) => {
|
||||
onSetPeoplePhoto(selectedImage, () => {
|
||||
updateCurrentDirent();
|
||||
setSelectedImages([]);
|
||||
});
|
||||
}, [onSetPeoplePhoto, updateCurrentDirent]);
|
||||
|
||||
const handleClickOutside = useCallback((event) => {
|
||||
const className = getEventClassName(event);
|
||||
const isClickInsideImage = className.includes('metadata-gallery-image-item') || className.includes('metadata-gallery-grid-image');
|
||||
@@ -401,6 +408,7 @@ const Main = ({ isLoadingMore, metadata, onDelete, onLoadMore, duplicateRecord,
|
||||
addFolder={onAddFolder}
|
||||
onRemoveImage={onRemoveImage ? handelRemoveSelectedImages : null}
|
||||
onAddImage={onAddImage}
|
||||
onSetPeoplePhoto={handleMakeSelectedAsCoverPhoto}
|
||||
/>
|
||||
{isImagePopupOpen && (
|
||||
<ModalPortal>
|
||||
|
Reference in New Issue
Block a user