Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 82 additions & 72 deletions apps/web/core/components/editor/rich-text/description-input/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const workspaceService = new WorkspaceService();
type TFormData = {
id: string;
description_html: string;
description_json?: object;
isMigrationUpdate: boolean;
};

Expand Down Expand Up @@ -57,7 +58,13 @@ type Props = {
/**
* @description Submit handler, the actual function which will be called when the form is submitted
*/
onSubmit: (value: string, isMigrationUpdate?: boolean) => Promise<void>;
onSubmit: (
value: {
description_html: string;
description_json: object | undefined;
},
isMigrationUpdate?: boolean
) => Promise<void>;
/**
* @description Placeholder, if not provided, the placeholder will be the default placeholder
*/
Expand Down Expand Up @@ -97,13 +104,13 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props)
entityId,
fileAssetType,
initialValue,
issueSequenceId,
onSubmit,
placeholder,
projectId,
setIsSubmitting,
swrDescription,
workspaceSlug,
issueSequenceId,
} = props;
// states
const [localDescription, setLocalDescription] = useState<TFormData>({
Expand Down Expand Up @@ -132,7 +139,13 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props)
// submit handler
const handleDescriptionFormSubmit = useCallback(
async (formData: TFormData) => {
await onSubmit(formData.description_html, formData.isMigrationUpdate);
await onSubmit(
{
description_html: formData.description_html,
description_json: formData.description_json,
},
formData.isMigrationUpdate
);
},
[onSubmit]
);
Expand Down Expand Up @@ -192,77 +205,74 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props)

if (!workspaceDetails) return null;

if (!localDescription.description_html) return <DescriptionInputLoader />;

return (
<>
{localDescription.description_html ? (
<Controller
name="description_html"
control={control}
render={({ field: { onChange } }) => (
<RichTextEditor
editable={!disabled}
ref={editorRef}
id={entityId}
issueSequenceId={issueSequenceId}
disabledExtensions={disabledExtensions}
initialValue={localDescription.description_html ?? "<p></p>"}
value={swrDescription ?? null}
workspaceSlug={workspaceSlug}
workspaceId={workspaceDetails.id}
projectId={projectId}
dragDropEnabled
onChange={(_description, description_html, options) => {
setIsSubmitting("submitting");
onChange(description_html);
setValue("isMigrationUpdate", options?.isMigrationUpdate ?? false);
hasUnsavedChanges.current = true;
debouncedFormSave();
}}
placeholder={placeholder ?? ((isFocused, value) => t(getDescriptionPlaceholderI18n(isFocused, value)))}
searchMentionCallback={async (payload) =>
await workspaceService.searchEntity(workspaceSlug?.toString() ?? "", {
...payload,
project_id: projectId,
})
}
containerClassName={containerClassName}
uploadFile={async (blockId, file) => {
try {
const { asset_id } = await uploadEditorAsset({
blockId,
data: {
entity_identifier: entityId,
entity_type: fileAssetType,
},
file,
projectId,
workspaceSlug,
});
return asset_id;
} catch (error) {
console.log("Error in uploading asset:", error);
throw new Error("Asset upload failed. Please try again later.");
}
}}
duplicateFile={async (assetId: string) => {
try {
const { asset_id } = await duplicateEditorAsset({
assetId,
entityType: fileAssetType,
projectId,
workspaceSlug,
});
return asset_id;
} catch {
throw new Error("Asset duplication failed. Please try again later.");
}
}}
/>
)}
<Controller
name="description_html"
control={control}
render={({ field: { onChange } }) => (
<RichTextEditor
editable={!disabled}
ref={editorRef}
id={entityId}
issueSequenceId={issueSequenceId}
disabledExtensions={disabledExtensions}
initialValue={localDescription.description_html ?? "<p></p>"}
value={swrDescription ?? null}
workspaceSlug={workspaceSlug}
workspaceId={workspaceDetails.id}
projectId={projectId}
dragDropEnabled
onChange={(description_json, description_html, options) => {
setIsSubmitting("submitting");
onChange(description_html);
setValue("isMigrationUpdate", options?.isMigrationUpdate ?? false);
setValue("description_json", description_json);
hasUnsavedChanges.current = true;
debouncedFormSave();
}}
placeholder={placeholder ?? ((isFocused, value) => t(getDescriptionPlaceholderI18n(isFocused, value)))}
searchMentionCallback={async (payload) =>
await workspaceService.searchEntity(workspaceSlug?.toString() ?? "", {
...payload,
project_id: projectId,
})
}
containerClassName={containerClassName}
uploadFile={async (blockId, file) => {
try {
const { asset_id } = await uploadEditorAsset({
blockId,
data: {
entity_identifier: entityId,
entity_type: fileAssetType,
},
file,
projectId,
workspaceSlug,
});
return asset_id;
} catch (error) {
console.log("Error in uploading asset:", error);
throw new Error("Asset upload failed. Please try again later.");
}
}}
duplicateFile={async (assetId: string) => {
try {
const { asset_id } = await duplicateEditorAsset({
assetId,
entityType: fileAssetType,
projectId,
workspaceSlug,
});
return asset_id;
} catch {
throw new Error("Asset duplication failed. Please try again later.");
}
}}
/>
) : (
<DescriptionInputLoader />
)}
</>
/>
);
});
2 changes: 1 addition & 1 deletion apps/web/core/components/inbox/content/issue-root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ export const InboxIssueMainContent = observer(function InboxIssueMainContent(pro
onSubmit={async (value, isMigrationUpdate) => {
if (!issue.id || !issue.project_id) return;
await issueOperations.update(workspaceSlug, issue.project_id, issue.id, {
description_html: value,
description_html: value.description_html,
...(isMigrationUpdate ? { skip_activity: "true" } : {}),
});
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ export const IssueMainContent = observer(function IssueMainContent(props: Props)
onSubmit={async (value, isMigrationUpdate) => {
if (!issue.id || !issue.project_id) return;
await issueOperations.update(workspaceSlug, issue.project_id, issue.id, {
description_html: value,
description_html: value.description_html,
...(isMigrationUpdate ? { skip_activity: "true" } : {}),
});
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ export const PeekOverviewIssueDetails = observer(function PeekOverviewIssueDetai
onSubmit={async (value, isMigrationUpdate) => {
if (!issue.id || !issue.project_id) return;
await issueOperations.update(workspaceSlug, issue.project_id, issue.id, {
description_html: value,
description_html: value.description_html,
...(isMigrationUpdate ? { skip_activity: "true" } : {}),
});
}}
Expand Down
Loading