mirror of
https://github.com/makeplane/plane
synced 2025-08-07 19:59:33 +00:00
fix: added workspaceslug in renderChildren of project settings (#5951)
* fix: added workspaceslug in renderChildren of project settings * fix: updated apis * fix: types * fix: added editor * fix: handled avatar for intake
This commit is contained in:
3
packages/types/src/inbox.d.ts
vendored
3
packages/types/src/inbox.d.ts
vendored
@@ -100,7 +100,8 @@ export type TInboxIssueWithPagination = TInboxIssuePaginationInfo & {
|
||||
export type TInboxForm = {
|
||||
anchor: string;
|
||||
id: string;
|
||||
is_disabled: boolean;
|
||||
is_in_app_enabled: boolean;
|
||||
is_form_enabled: boolean;
|
||||
};
|
||||
|
||||
export type TInboxIssueForm = {
|
||||
|
||||
41
space/core/components/editor/rich-text-editor.tsx
Normal file
41
space/core/components/editor/rich-text-editor.tsx
Normal file
@@ -0,0 +1,41 @@
|
||||
import React, { forwardRef } from "react";
|
||||
// editor
|
||||
import { EditorRefApi, IMentionHighlight, IRichTextEditor, RichTextEditorWithRef } from "@plane/editor";
|
||||
// types
|
||||
// helpers
|
||||
import { cn } from "@/helpers/common.helper";
|
||||
import { getEditorFileHandlers } from "@/helpers/editor.helper";
|
||||
|
||||
interface RichTextEditorWrapperProps extends Omit<IRichTextEditor, "fileHandler" | "mentionHandler"> {
|
||||
uploadFile: (file: File) => Promise<string>;
|
||||
}
|
||||
|
||||
export const RichTextEditor = forwardRef<EditorRefApi, RichTextEditorWrapperProps>((props, ref) => {
|
||||
const { containerClassName, uploadFile, ...rest } = props;
|
||||
// store hooks
|
||||
|
||||
// use-mention
|
||||
|
||||
// file size
|
||||
|
||||
return (
|
||||
<RichTextEditorWithRef
|
||||
mentionHandler={{
|
||||
highlights: function (): Promise<IMentionHighlight[]> {
|
||||
throw new Error("Function not implemented.");
|
||||
},
|
||||
suggestions: undefined,
|
||||
}}
|
||||
ref={ref}
|
||||
fileHandler={getEditorFileHandlers({
|
||||
uploadFile,
|
||||
workspaceId: "",
|
||||
anchor: "",
|
||||
})}
|
||||
{...rest}
|
||||
containerClassName={cn("relative pl-3 pb-3", containerClassName)}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
RichTextEditor.displayName = "RichTextEditor";
|
||||
@@ -36,6 +36,7 @@ export interface IIssueDetailStore {
|
||||
updateIssueComment: (anchor: string, issueID: string, commentID: string, data: any) => Promise<any>;
|
||||
deleteIssueComment: (anchor: string, issueID: string, commentID: string) => void;
|
||||
uploadCommentAsset: (file: File, anchor: string, commentID?: string) => Promise<TFileSignedURLResponse>;
|
||||
uploadIssueAsset: (file: File, anchor: string, commentID?: string) => Promise<TFileSignedURLResponse>;
|
||||
addCommentReaction: (anchor: string, issueID: string, commentID: string, reactionHex: string) => void;
|
||||
removeCommentReaction: (anchor: string, issueID: string, commentID: string, reactionHex: string) => void;
|
||||
// reaction actions
|
||||
@@ -79,6 +80,7 @@ export class IssueDetailStore implements IIssueDetailStore {
|
||||
updateIssueComment: action,
|
||||
deleteIssueComment: action,
|
||||
uploadCommentAsset: action,
|
||||
uploadIssueAsset: action,
|
||||
addCommentReaction: action,
|
||||
removeCommentReaction: action,
|
||||
// reaction actions
|
||||
@@ -245,6 +247,23 @@ export class IssueDetailStore implements IIssueDetailStore {
|
||||
}
|
||||
};
|
||||
|
||||
uploadIssueAsset = async (file: File, anchor: string, commentID?: string) => {
|
||||
try {
|
||||
const res = await this.fileService.uploadAsset(
|
||||
anchor,
|
||||
{
|
||||
entity_identifier: commentID ?? "",
|
||||
entity_type: EFileAssetType.ISSUE_ATTACHMENT,
|
||||
},
|
||||
file
|
||||
);
|
||||
return res;
|
||||
} catch (error) {
|
||||
console.log("Error in uploading comment asset:", error);
|
||||
throw new Error("Asset upload failed. Please try again later.");
|
||||
}
|
||||
};
|
||||
|
||||
addCommentReaction = async (anchor: string, issueID: string, commentID: string, reactionHex: string) => {
|
||||
const newReaction = {
|
||||
id: uuidv4(),
|
||||
|
||||
6
space/core/types/intake.d.ts
vendored
Normal file
6
space/core/types/intake.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
export type TIntakeIssueForm = {
|
||||
name: string;
|
||||
email: string;
|
||||
username: string;
|
||||
description_html: string;
|
||||
};
|
||||
@@ -13,7 +13,8 @@ export type TProperties = {
|
||||
renderChildren?: (
|
||||
currentProjectDetails: IProject,
|
||||
isAdmin: boolean,
|
||||
handleSubmit: (featureKey: string, featureProperty: string) => Promise<void>
|
||||
handleSubmit: (featureKey: string, featureProperty: string) => Promise<void>,
|
||||
workspaceSlug: string
|
||||
) => ReactNode;
|
||||
};
|
||||
export type TFeatureList = {
|
||||
|
||||
@@ -4,7 +4,7 @@ import { FC, MouseEvent } from "react";
|
||||
import { observer } from "mobx-react";
|
||||
import Link from "next/link";
|
||||
import { useSearchParams } from "next/navigation";
|
||||
import { Tooltip, PriorityIcon, Row } from "@plane/ui";
|
||||
import { Tooltip, PriorityIcon, Row, Avatar } from "@plane/ui";
|
||||
// components
|
||||
import { ButtonAvatars } from "@/components/dropdowns/member/avatar";
|
||||
import { InboxIssueStatus } from "@/components/inbox";
|
||||
@@ -12,6 +12,7 @@ import { InboxIssueStatus } from "@/components/inbox";
|
||||
import { cn } from "@/helpers/common.helper";
|
||||
import { renderFormattedDate } from "@/helpers/date-time.helper";
|
||||
// hooks
|
||||
import { getFileURL } from "@/helpers/file.helper";
|
||||
import { useLabel, useMember, useProjectInbox } from "@/hooks/store";
|
||||
import { usePlatformOS } from "@/hooks/use-platform-os";
|
||||
|
||||
@@ -116,7 +117,11 @@ export const InboxIssueListItem: FC<InboxIssueListItemProps> = observer((props)
|
||||
)}
|
||||
</div>
|
||||
{/* created by */}
|
||||
{createdByDetails && <ButtonAvatars showTooltip={false} userIds={createdByDetails?.id} />}
|
||||
{createdByDetails && createdByDetails.email?.includes("intake@plane.so") ? (
|
||||
<Avatar src={getFileURL("")} name={"Plane"} size="md" showTooltip />
|
||||
) : createdByDetails ? (
|
||||
<ButtonAvatars showTooltip={false} userIds={createdByDetails?.id} />
|
||||
) : null}
|
||||
</div>
|
||||
</Row>
|
||||
</Link>
|
||||
|
||||
@@ -102,7 +102,7 @@ export const ProjectFeaturesList: FC<Props> = observer((props) => {
|
||||
<div className="pl-14">
|
||||
{currentProjectDetails?.[featureItem.property as keyof IProject] &&
|
||||
featureItem.renderChildren &&
|
||||
featureItem.renderChildren(currentProjectDetails, isAdmin, handleSubmit)}
|
||||
featureItem.renderChildren(currentProjectDetails, isAdmin, handleSubmit, workspaceSlug)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -77,17 +77,15 @@ export class InboxIssueService extends APIService {
|
||||
}
|
||||
|
||||
async retrievePublishForm(workspaceSlug: string, projectId: string): Promise<TInboxForm> {
|
||||
return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/publish-intake/`)
|
||||
return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/intake-settings/`)
|
||||
.then((response) => response?.data)
|
||||
.catch((error) => {
|
||||
throw error?.response?.data;
|
||||
});
|
||||
}
|
||||
|
||||
async updatePublishForm(workspaceSlug: string, projectId: string, is_disabled: boolean): Promise<TInboxIssue> {
|
||||
return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/publish-intake/`, {
|
||||
is_disabled,
|
||||
})
|
||||
async updatePublishForm(workspaceSlug: string, projectId: string, data: Partial<TInboxForm>): Promise<TInboxForm> {
|
||||
return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/intake-settings/`, data)
|
||||
.then((response) => response?.data)
|
||||
.catch((error) => {
|
||||
throw error?.response?.data;
|
||||
|
||||
@@ -71,7 +71,7 @@ export interface IProjectInboxStore {
|
||||
fetchInboxPaginationIssues: (workspaceSlug: string, projectId: string) => Promise<void>;
|
||||
fetchInboxIssueById: (workspaceSlug: string, projectId: string, inboxIssueId: string) => Promise<TInboxIssue>;
|
||||
fetchIntakeForms: (workspaceSlug: string, projectId: string) => Promise<void>;
|
||||
toggleIntakeForms: (workspaceSlug: string, projectId: string, isDisabled: boolean) => Promise<void>;
|
||||
toggleIntakeForms: (workspaceSlug: string, projectId: string, data: Partial<TInboxForm>) => Promise<void>;
|
||||
regenerateIntakeForms: (workspaceSlug: string, projectId: string) => Promise<void>;
|
||||
createInboxIssue: (
|
||||
workspaceSlug: string,
|
||||
@@ -329,20 +329,23 @@ export class ProjectInboxStore implements IProjectInboxStore {
|
||||
}
|
||||
};
|
||||
|
||||
toggleIntakeForms = async (workspaceSlug: string, projectId: string, isDisabled: boolean) => {
|
||||
toggleIntakeForms = async (workspaceSlug: string, projectId: string, data: Partial<TInboxForm>) => {
|
||||
const initialData = this.intakeForms[projectId];
|
||||
try {
|
||||
runInAction(() => {
|
||||
set(this.intakeForms, projectId, { ...this.intakeForms[projectId], is_disabled: isDisabled });
|
||||
set(this.intakeForms, projectId, { ...this.intakeForms[projectId], ...data });
|
||||
});
|
||||
const result = await this.inboxIssueService.updatePublishForm(workspaceSlug, projectId, data);
|
||||
runInAction(() => {
|
||||
set(this.intakeForms, projectId, { ...this.intakeForms[projectId], anchor: result?.anchor });
|
||||
});
|
||||
await this.inboxIssueService.updatePublishForm(workspaceSlug, projectId, isDisabled);
|
||||
} catch {
|
||||
console.error("Error fetching the publish forms");
|
||||
runInAction(() => {
|
||||
set(this.intakeForms, projectId, { ...this.intakeForms[projectId], is_disabled: !isDisabled });
|
||||
set(this.intakeForms, projectId, initialData);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
regenerateIntakeForms = async (workspaceSlug: string, projectId: string) => {
|
||||
try {
|
||||
const form = await this.inboxIssueService.regeneratePublishForm(workspaceSlug, projectId);
|
||||
|
||||
Reference in New Issue
Block a user