diff --git a/apps/space/ce/components/editor/embeds/mentions/root.tsx b/apps/space/ce/components/editor/embeds/mentions/root.tsx index 23f15fe27..299a1e36a 100644 --- a/apps/space/ce/components/editor/embeds/mentions/root.tsx +++ b/apps/space/ce/components/editor/embeds/mentions/root.tsx @@ -1,4 +1,4 @@ // plane editor -import type { TMentionComponentProps } from "@plane/editor"; +import type { TCallbackMentionComponentProps } from "@plane/editor"; -export const EditorAdditionalMentionsRoot: React.FC = () => null; +export const EditorAdditionalMentionsRoot: React.FC = () => null; diff --git a/apps/space/core/components/editor/embeds/mentions/root.tsx b/apps/space/core/components/editor/embeds/mentions/root.tsx index 95149b926..348bc1e09 100644 --- a/apps/space/core/components/editor/embeds/mentions/root.tsx +++ b/apps/space/core/components/editor/embeds/mentions/root.tsx @@ -1,11 +1,11 @@ // plane editor -import type { TMentionComponentProps } from "@plane/editor"; +import type { TCallbackMentionComponentProps } from "@plane/editor"; // plane web components import { EditorAdditionalMentionsRoot } from "@/plane-web/components/editor"; // local components import { EditorUserMention } from "./user"; -export const EditorMentionsRoot: React.FC = (props) => { +export const EditorMentionsRoot: React.FC = (props) => { const { entity_identifier, entity_name } = props; switch (entity_name) { diff --git a/apps/web/ce/components/editor/embeds/index.ts b/apps/web/ce/components/editor/embeds/index.ts deleted file mode 100644 index 8146e94d9..000000000 --- a/apps/web/ce/components/editor/embeds/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./mentions"; diff --git a/apps/web/ce/components/editor/embeds/mentions/root.tsx b/apps/web/ce/components/editor/embeds/mentions/root.tsx index 23f15fe27..e3d7cc49d 100644 --- a/apps/web/ce/components/editor/embeds/mentions/root.tsx +++ b/apps/web/ce/components/editor/embeds/mentions/root.tsx @@ -1,4 +1,6 @@ -// plane editor -import type { TMentionComponentProps } from "@plane/editor"; +// plane imports +import type { TCallbackMentionComponentProps } from "@plane/editor"; -export const EditorAdditionalMentionsRoot: React.FC = () => null; +export type TEditorMentionComponentProps = TCallbackMentionComponentProps; + +export const EditorAdditionalMentionsRoot: React.FC = () => null; diff --git a/apps/web/ce/components/editor/index.ts b/apps/web/ce/components/editor/index.ts deleted file mode 100644 index cf8352ae4..000000000 --- a/apps/web/ce/components/editor/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./embeds"; diff --git a/apps/web/ce/constants/editor.ts b/apps/web/ce/constants/editor.ts deleted file mode 100644 index f01879602..000000000 --- a/apps/web/ce/constants/editor.ts +++ /dev/null @@ -1,4 +0,0 @@ -// plane types -import type { TSearchEntities } from "@plane/types"; - -export const EDITOR_MENTION_TYPES: TSearchEntities[] = ["user_mention"]; diff --git a/apps/web/ce/hooks/use-additional-editor-mention.tsx b/apps/web/ce/hooks/use-additional-editor-mention.tsx index 604649e71..a3b719231 100644 --- a/apps/web/ce/hooks/use-additional-editor-mention.tsx +++ b/apps/web/ce/hooks/use-additional-editor-mention.tsx @@ -1,11 +1,18 @@ -import { useCallback } from "react"; +import { useCallback, useMemo } from "react"; // plane editor import type { TMentionSection } from "@plane/editor"; // plane types import type { TSearchEntities, TSearchResponse } from "@plane/types"; +export type TUseAdditionalEditorMentionArgs = { + enableAdvancedMentions: boolean; +}; + export type TAdditionalEditorMentionHandlerArgs = { response: TSearchResponse; +}; + +export type TAdditionalEditorMentionHandlerReturnType = { sections: TMentionSection[]; }; @@ -21,21 +28,24 @@ export type TAdditionalParseEditorContentReturnType = } | undefined; -export const useAdditionalEditorMention = () => { - const updateAdditionalSections = useCallback((args: TAdditionalEditorMentionHandlerArgs) => { - const {} = args; - }, []); - - const parseAdditionalEditorContent = useCallback( - (args: TAdditionalParseEditorContentArgs): TAdditionalParseEditorContentReturnType => { - const {} = args; - return undefined; - }, +export const useAdditionalEditorMention = (_args: TUseAdditionalEditorMentionArgs) => { + const updateAdditionalSections = useCallback( + (_args: TAdditionalEditorMentionHandlerArgs): TAdditionalEditorMentionHandlerReturnType => ({ + sections: [], + }), [] ); + const parseAdditionalEditorContent = useCallback( + (_args: TAdditionalParseEditorContentArgs): TAdditionalParseEditorContentReturnType => undefined, + [] + ); + + const editorMentionTypes: TSearchEntities[] = useMemo(() => ["user_mention"], []); + return { updateAdditionalSections, parseAdditionalEditorContent, + editorMentionTypes, }; }; diff --git a/apps/web/core/components/editor/document/editor.tsx b/apps/web/core/components/editor/document/editor.tsx index 9695088b4..573d96d3d 100644 --- a/apps/web/core/components/editor/document/editor.tsx +++ b/apps/web/core/components/editor/document/editor.tsx @@ -1,4 +1,4 @@ -import React, { forwardRef } from "react"; +import { forwardRef } from "react"; // plane imports import { DocumentEditorWithRef } from "@plane/editor"; import type { IEditorPropsExtended, EditorRefApi, IDocumentEditorProps, TFileHandler } from "@plane/editor"; @@ -50,6 +50,7 @@ export const DocumentEditor = forwardRef await props.searchMentionCallback(payload) : async () => ({}), }); // editor config diff --git a/apps/web/core/components/editor/embeds/mentions/root.tsx b/apps/web/core/components/editor/embeds/mentions/root.tsx index 95149b926..bc27dd82f 100644 --- a/apps/web/core/components/editor/embeds/mentions/root.tsx +++ b/apps/web/core/components/editor/embeds/mentions/root.tsx @@ -1,11 +1,10 @@ -// plane editor -import type { TMentionComponentProps } from "@plane/editor"; -// plane web components -import { EditorAdditionalMentionsRoot } from "@/plane-web/components/editor"; -// local components +// plane web imports +import type { TEditorMentionComponentProps } from "@/plane-web/components/editor/embeds/mentions"; +import { EditorAdditionalMentionsRoot } from "@/plane-web/components/editor/embeds/mentions"; +// local imports import { EditorUserMention } from "./user"; -export const EditorMentionsRoot: React.FC = (props) => { +export const EditorMentionsRoot: React.FC = (props) => { const { entity_identifier, entity_name } = props; switch (entity_name) { diff --git a/apps/web/core/components/editor/embeds/mentions/user.tsx b/apps/web/core/components/editor/embeds/mentions/user.tsx index 0c4239cf3..206682fba 100644 --- a/apps/web/core/components/editor/embeds/mentions/user.tsx +++ b/apps/web/core/components/editor/embeds/mentions/user.tsx @@ -1,15 +1,11 @@ -import { useState } from "react"; import { observer } from "mobx-react"; -import Link from "next/link"; import { useParams } from "next/navigation"; -import { usePopper } from "react-popper"; +import { Link } from "react-router"; // plane imports import { ROLE } from "@plane/constants"; -// plane ui +import { Popover } from "@plane/propel/popover"; import { Avatar } from "@plane/ui"; import { cn, getFileURL } from "@plane/utils"; -// constants -// helpers // hooks import { useMember } from "@/hooks/store/use-member"; import { useUser } from "@/hooks/store/user"; @@ -22,9 +18,6 @@ export const EditorUserMention: React.FC = observer((props) => { const { id } = props; // router const { projectId } = useParams(); - // states - const [popperElement, setPopperElement] = useState(null); - const [referenceElement, setReferenceElement] = useState(null); // params const { workspaceSlug } = useParams(); // store hooks @@ -33,18 +26,6 @@ export const EditorUserMention: React.FC = observer((props) => { getUserDetails, project: { getProjectMemberDetails }, } = useMember(); - // popper-js refs - const { styles, attributes } = usePopper(referenceElement, popperElement, { - placement: "bottom-start", - modifiers: [ - { - name: "preventOverflow", - options: { - padding: 12, - }, - }, - ], - }); // derived values const userDetails = getUserDetails(id); const roleDetails = projectId ? getProjectMemberDetails(id, projectId.toString())?.role : null; @@ -53,7 +34,7 @@ export const EditorUserMention: React.FC = observer((props) => { if (!userDetails) { return (
- @deactivated user + @suspended user
); } @@ -61,39 +42,38 @@ export const EditorUserMention: React.FC = observer((props) => { return (
- - @{userDetails?.display_name} - -
-
-
- + + + @{userDetails?.display_name} + + +
+
+
+ +
+
+ + {userDetails?.first_name} {userDetails?.last_name} + + {roleDetails &&

{ROLE[roleDetails]}

} +
+
-
- - {userDetails?.first_name} {userDetails?.last_name} - - {roleDetails &&

{ROLE[roleDetails]}

} -
-
-
+ +
); }); diff --git a/apps/web/core/components/pages/editor/editor-body.tsx b/apps/web/core/components/pages/editor/editor-body.tsx index 476917252..598a9e1fc 100644 --- a/apps/web/core/components/pages/editor/editor-body.tsx +++ b/apps/web/core/components/pages/editor/editor-body.tsx @@ -95,6 +95,7 @@ export const PageEditorBody: React.FC = observer((props) => { const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id ?? ""; // use editor mention const { fetchMentions } = useEditorMention({ + enableAdvancedMentions: true, searchEntity: handlers.fetchEntity, }); // editor flaggings diff --git a/apps/web/core/hooks/editor/use-editor-mention.tsx b/apps/web/core/hooks/editor/use-editor-mention.tsx index 03598191a..622fc0438 100644 --- a/apps/web/core/hooks/editor/use-editor-mention.tsx +++ b/apps/web/core/hooks/editor/use-editor-mention.tsx @@ -7,26 +7,27 @@ import type { TSearchEntities, TSearchEntityRequestPayload, TSearchResponse, TUs import { Avatar } from "@plane/ui"; // helpers import { getFileURL } from "@plane/utils"; -// plane web constants -import { EDITOR_MENTION_TYPES } from "@/plane-web/constants/editor"; // plane web hooks import { useAdditionalEditorMention } from "@/plane-web/hooks/use-additional-editor-mention"; type TArgs = { + enableAdvancedMentions?: boolean; searchEntity: (payload: TSearchEntityRequestPayload) => Promise; }; export const useEditorMention = (args: TArgs) => { - const { searchEntity } = args; + const { enableAdvancedMentions = false, searchEntity } = args; // additional mentions - const { updateAdditionalSections } = useAdditionalEditorMention(); + const { editorMentionTypes, updateAdditionalSections } = useAdditionalEditorMention({ + enableAdvancedMentions, + }); // fetch mentions handler const fetchMentions = useCallback( async (query: string): Promise => { try { const res = await searchEntity({ count: 5, - query_type: EDITOR_MENTION_TYPES, + query_type: editorMentionTypes, query, }); const suggestionSections: TMentionSection[] = []; @@ -57,17 +58,16 @@ export const useEditorMention = (args: TArgs) => { }); } }); - updateAdditionalSections({ + const { sections } = updateAdditionalSections({ response: res, - sections: suggestionSections, }); - return suggestionSections; + return [...suggestionSections, ...sections]; } catch (error) { - console.error("Error in fetching mentions for project pages:", error); + console.error("Error in fetching mentions:", error); throw error; } }, - [searchEntity, updateAdditionalSections] + [editorMentionTypes, searchEntity, updateAdditionalSections] ); return { diff --git a/apps/web/core/hooks/use-parse-editor-content.ts b/apps/web/core/hooks/use-parse-editor-content.ts index 2845ba20b..bf52fff08 100644 --- a/apps/web/core/hooks/use-parse-editor-content.ts +++ b/apps/web/core/hooks/use-parse-editor-content.ts @@ -15,7 +15,9 @@ export const useParseEditorContent = () => { // store hooks const { getUserDetails } = useMember(); // parse additional content - const { parseAdditionalEditorContent } = useAdditionalEditorMention(); + const { parseAdditionalEditorContent } = useAdditionalEditorMention({ + enableAdvancedMentions: true, + }); /** * @description function to replace all the custom components from the html component to make it pdf compatible diff --git a/apps/web/ee/components/editor/index.ts b/apps/web/ee/components/editor/index.ts deleted file mode 100644 index f8506c1d6..000000000 --- a/apps/web/ee/components/editor/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "ce/components/editor"; diff --git a/apps/web/ee/constants/editor.ts b/apps/web/ee/constants/editor.ts deleted file mode 100644 index c59cd0b61..000000000 --- a/apps/web/ee/constants/editor.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "ce/constants/editor"; diff --git a/packages/editor/src/core/types/mention.ts b/packages/editor/src/core/types/mention.ts index ab7020c48..4fed4aad8 100644 --- a/packages/editor/src/core/types/mention.ts +++ b/packages/editor/src/core/types/mention.ts @@ -16,10 +16,10 @@ export type TMentionSection = { items: TMentionSuggestion[]; }; -export type TMentionComponentProps = Pick; +export type TCallbackMentionComponentProps = Pick; export type TMentionHandler = { getMentionedEntityDetails?: (entity_identifier: string) => { display_name: string } | undefined; - renderComponent: (props: TMentionComponentProps) => React.ReactNode; + renderComponent: (props: TCallbackMentionComponentProps) => React.ReactNode; searchCallback?: (query: string) => Promise; }; diff --git a/packages/types/src/issues/issue.ts b/packages/types/src/issues/issue.ts index f24e2718c..127dc1cad 100644 --- a/packages/types/src/issues/issue.ts +++ b/packages/types/src/issues/issue.ts @@ -1,4 +1,5 @@ import type { TIssuePriorities } from "../issues"; +import type { TStateGroups } from "../state"; import type { TIssuePublicComment } from "./activity/issue_comment"; import type { TIssueAttachment } from "./issue_attachment"; import type { TIssueLink } from "./issue_link"; @@ -93,7 +94,7 @@ export type TIssue = TBaseIssue & { tempId?: string; // sourceIssueId is used to store the original issue id when creating a copy of an issue. Used in cloning property values. It is not a part of the API response. sourceIssueId?: string; - state__group?: string | null; + state__group?: TStateGroups | null; }; export type TIssueMap = {