From cef6698781926ca9fe2eb1920103093f54d1fc13 Mon Sep 17 00:00:00 2001 From: Pierre Leroux Date: Mon, 7 Oct 2024 12:35:25 +0200 Subject: [PATCH] first --- src/common/redux/reducers/creator.ts | 2 +- src/common/redux/states/creator.ts | 2 +- .../redux/states/renderer/annotation.ts | 3 + src/renderer/reader/components/ReaderMenu.tsx | 66 +++++++++++++++++-- src/renderer/reader/redux/sagas/annotation.ts | 8 +++ 5 files changed, 74 insertions(+), 7 deletions(-) diff --git a/src/common/redux/reducers/creator.ts b/src/common/redux/reducers/creator.ts index bb561e34b..f6ebd098c 100644 --- a/src/common/redux/reducers/creator.ts +++ b/src/common/redux/reducers/creator.ts @@ -44,7 +44,7 @@ try { } const initialState: IAnnotationCreator = { - id: uuidv4(), + id: "urn:uuid:" + uuidv4(), type: "Organization", name: username, }; diff --git a/src/common/redux/states/creator.ts b/src/common/redux/states/creator.ts index b40d286b0..2415cb80e 100644 --- a/src/common/redux/states/creator.ts +++ b/src/common/redux/states/creator.ts @@ -8,5 +8,5 @@ export interface IAnnotationCreator { id: string, type: "Organization" | "Person", - name: string, + name?: string, } diff --git a/src/common/redux/states/renderer/annotation.ts b/src/common/redux/states/renderer/annotation.ts index 473002950..1b9be84c7 100644 --- a/src/common/redux/states/renderer/annotation.ts +++ b/src/common/redux/states/renderer/annotation.ts @@ -8,6 +8,8 @@ import { MiniLocatorExtended } from "readium-desktop/common/redux/states/locatorInitialState"; import { TPQueueState } from "readium-desktop/utils/redux-reducers/pqueue.reducer"; +import { creatorActions } from "../../actions"; +import { IAnnotationCreator } from "../creator"; export interface IColor { red: number; @@ -25,6 +27,7 @@ export interface IAnnotationState { drawType: TDrawType; tags?: string[] | undefined; modified?: number; + creator?: IAnnotationCreator; } export type TAnnotationState = TPQueueState; diff --git a/src/renderer/reader/components/ReaderMenu.tsx b/src/renderer/reader/components/ReaderMenu.tsx index 69f1739a6..ec6870d98 100644 --- a/src/renderer/reader/components/ReaderMenu.tsx +++ b/src/renderer/reader/components/ReaderMenu.tsx @@ -683,6 +683,7 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU const [tagArrayFilter, setTagArrayFilter] = React.useState(new Set([])); const [colorArrayFilter, setColorArrayFilter] = React.useState(new Set([])); const [drawTypeArrayFilter, setDrawTypeArrayFilter] = React.useState(new Set([])); + const [creatorArrayFilter, setCreatorArrayFilter] = React.useState(new Set([])); let annotationList: TAnnotationState = []; let startPage = 1; @@ -690,14 +691,16 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU annotationList = (selectionIsSet(tagArrayFilter) && tagArrayFilter.size) || (selectionIsSet(colorArrayFilter) && colorArrayFilter.size) || - (selectionIsSet(drawTypeArrayFilter) && drawTypeArrayFilter.size) - ? annotationsQueue.filter(([, { tags, color, drawType }]) => { + (selectionIsSet(drawTypeArrayFilter) && drawTypeArrayFilter.size) || + (selectionIsSet(creatorArrayFilter) && creatorArrayFilter.size) + ? annotationsQueue.filter(([, { tags, color, drawType, creator }]) => { const colorHex = rgbToHex(color); return (!selectionIsSet(tagArrayFilter) || !tagArrayFilter.size || tags.some((tagsValueName) => tagArrayFilter.has(tagsValueName))) && (!selectionIsSet(colorArrayFilter) || !colorArrayFilter.size || colorArrayFilter.has(colorHex)) && - (!selectionIsSet(drawTypeArrayFilter) || !drawTypeArrayFilter.size || drawTypeArrayFilter.has(drawType)); + (!selectionIsSet(drawTypeArrayFilter) || !drawTypeArrayFilter.size || drawTypeArrayFilter.has(drawType)) && + (!selectionIsSet(creatorArrayFilter) || !creatorArrayFilter.size || creatorArrayFilter.has(creator?.id)); }) : annotationsQueue; @@ -732,6 +735,9 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU if (drawTypeArrayFilter !== "all" && !drawTypeArrayFilter.has(annotationFound.drawType) && drawTypeArrayFilter.size !== 0) { setDrawTypeArrayFilter(new Set([])); } + if (creatorArrayFilter !== "all" && !creatorArrayFilter.has(annotationFound.creator?.id) && creatorArrayFilter.size !== 0) { + setCreatorArrayFilter(new Set([])); + } } } resetAnnotationUUID(); @@ -800,6 +806,14 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU setTagArrayFilter(new Set(tagArrayFilterArrayDifference)); } + const creatorList = annotationList.map(([,{creator}]) => creator); + const creatorSet = creatorList.reduce>((acc, {id, name}) => { + if (!acc[id]) return {...acc, [id]: name || ""}; + return acc; + }, {}); + + const selectCreatorOptions = Object.entries(creatorSet).map(([k, v]) => ({ id: k, name: v })); + const annotationsColors = React.useMemo(() => Object.entries(annotationsColorsLight).map(([k, v]) => ({ hex: k, name: __(v) })), [__]); // I'm disable this feature for performance reason, push new Colors from incoming publicaiton annotation, not used for the moment. So let's commented it for the moment. @@ -818,7 +832,11 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU { name: "outline", svg: TextOutlineIcon }, ]; - const nbOfFilters = ((tagArrayFilter === "all") ? selectTagOption.length : tagArrayFilter.size) + ((colorArrayFilter === "all") ? annotationsColors.length : colorArrayFilter.size) + ((drawTypeArrayFilter === "all") ? selectDrawtypesOptions.length : drawTypeArrayFilter.size); + const nbOfFilters = ((tagArrayFilter === "all") ? + selectTagOption.length : tagArrayFilter.size) + ((colorArrayFilter === "all") ? + annotationsColors.length : colorArrayFilter.size) + ((drawTypeArrayFilter === "all") ? + selectDrawtypesOptions.length : drawTypeArrayFilter.size) + ((creatorArrayFilter === "all") ? + selectCreatorOptions.length : creatorArrayFilter.size); return ( <> @@ -850,6 +868,7 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU setTagArrayFilter(new Set([])); setColorArrayFilter(new Set([])); setDrawTypeArrayFilter(new Set([])); + setCreatorArrayFilter(new Set([])); }} type="button"> {__("dialog.yes")} @@ -1028,7 +1047,44 @@ const AnnotationList: React.FC<{ annotationUUIDFocused: string, resetAnnotationU - {(item) => } + {(item) => } + + + + +
+ + +
+ + +
+
+ + {(item) => {item.name}}
diff --git a/src/renderer/reader/redux/sagas/annotation.ts b/src/renderer/reader/redux/sagas/annotation.ts index de0ccb570..5fc69d549 100644 --- a/src/renderer/reader/redux/sagas/annotation.ts +++ b/src/renderer/reader/redux/sagas/annotation.ts @@ -23,6 +23,8 @@ import { MiniLocatorExtended } from "readium-desktop/common/redux/states/locator import { HighlightDrawTypeBackground, HighlightDrawTypeOutline, HighlightDrawTypeStrikethrough, HighlightDrawTypeUnderline } from "@r2-navigator-js/electron/common/highlight"; import { IHighlightHandlerState } from "readium-desktop/common/redux/states/renderer/highlight"; import { diReaderGet } from "../../di"; +import { useSelector } from "readium-desktop/renderer/common/hooks/useSelector"; +import { ICommonRootState } from "readium-desktop/common/redux/states/commonRootState"; // Logger const debug = debug_("readium-desktop:renderer:reader:redux:sagas:annotation"); @@ -99,6 +101,8 @@ function* createAnnotation(locatorExtended: MiniLocatorExtended, color: IColor, // clean __selection global variable state __selectionInfoGlobal.locatorExtended = undefined; + const creator = useSelector((state: IReaderRootState) => state.creator); + debug(`Create an annotation for, [${locatorExtended.selectionInfo.cleanText.slice(0, 10)}]`); yield* put(readerActions.annotation.push.build({ color, @@ -106,6 +110,10 @@ function* createAnnotation(locatorExtended: MiniLocatorExtended, color: IColor, locatorExtended, drawType, tags, + creator: { + id: creator.id, + type: creator.type, // not used but required https://github.com/readium/annotations/?tab=readme-ov-file#11-creator + }, })); // sure! close the popover