diff --git a/apps/cs/app/(with-base-layout)/template/register/[sequential]/page.tsx b/apps/cs/app/(with-base-layout)/template/register/[sequential]/page.tsx new file mode 100644 index 000000000..3878a4e41 --- /dev/null +++ b/apps/cs/app/(with-base-layout)/template/register/[sequential]/page.tsx @@ -0,0 +1,10 @@ +import { ModifyPage as VModifyPage } from "@/pages/template"; + +export default async function ModifyPage({ + params, +}: { + params: Promise<{ sequential: string }>; +}) { + const { sequential } = await params; + return ; +} diff --git a/apps/cs/src/entities/editor/api/editor-service.ts b/apps/cs/src/entities/editor/api/editor-service.ts new file mode 100644 index 000000000..3e2fc75a4 --- /dev/null +++ b/apps/cs/src/entities/editor/api/editor-service.ts @@ -0,0 +1,19 @@ +import { client } from "@/shared/api"; +import type { + EditorService, + FileInfo, + UploadFile, +} from "../model/editor-interface"; +import { ENDPOINT } from "@/shared/config"; + +export class EditorApiService implements EditorService { + async uploadImage(data: UploadFile): Promise { + const response = await client.post( + ENDPOINT.ATTACH_SERVICE.EDITOR_UPLOAD, + data, + ); + return response.data; + } +} + +export const EditorApi = new EditorApiService(); diff --git a/apps/cs/src/entities/editor/index.ts b/apps/cs/src/entities/editor/index.ts new file mode 100644 index 000000000..1ae82fb4f --- /dev/null +++ b/apps/cs/src/entities/editor/index.ts @@ -0,0 +1 @@ +export { Editor } from "./ui/editor"; diff --git a/apps/cs/src/entities/editor/model/editor-base-config.ts b/apps/cs/src/entities/editor/model/editor-base-config.ts new file mode 100644 index 000000000..1b97ba9a0 --- /dev/null +++ b/apps/cs/src/entities/editor/model/editor-base-config.ts @@ -0,0 +1,37 @@ +import { SERVER_API_URL } from "@/shared/config"; + +export const editorBaseConfig = { + apiKey: process.env.NEXT_PUBLIC_TINY_API_KEY, + init: { + language: "ko_KR", + height: 500, + plugins: [ + "advlist", + "autolink", + "lists", + "link", + "image", + "charmap", + "preview", + "anchor", + "searchreplace", + "visualblocks", + "code", + "codesample", + "fullscreen", + "insertdatetime", + "media", + "table", + "code", + "help", + "wordcount", + "save", + ], + toolbar: [ + "undo redo | blocks fontfamily fontsize | bold italic underline strikethrough forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist blockquote | table", + "link image", + ], + images_upload_base_path: SERVER_API_URL, + file_picker_types: "image", + }, +}; diff --git a/apps/cs/src/entities/editor/model/editor-interface.ts b/apps/cs/src/entities/editor/model/editor-interface.ts new file mode 100644 index 000000000..ed6b4a987 --- /dev/null +++ b/apps/cs/src/entities/editor/model/editor-interface.ts @@ -0,0 +1,20 @@ +export interface UploadFile { + fieldName: string; + fileType: string; + fileBase64: string; + originalName: string; + size: number; +} + +export interface FileInfo { + originalFileName: string; + message: string; + fileType: string; + size: number; + uploaded: number; + url: string; +} + +export interface EditorService { + uploadImage(data: UploadFile): Promise; +} diff --git a/apps/cs/src/entities/editor/ui/editor.tsx b/apps/cs/src/entities/editor/ui/editor.tsx new file mode 100644 index 000000000..e55bf89a0 --- /dev/null +++ b/apps/cs/src/entities/editor/ui/editor.tsx @@ -0,0 +1,70 @@ +import { Editor as TinyEditor, type IAllProps } from "@tinymce/tinymce-react"; +import { editorBaseConfig as baseConfig } from "../model/editor-base-config"; +import { EditorApi } from "../api/editor-service"; + +const Editor = ({ ...props }: IAllProps) => { + return ( + Blob; + filename: () => string; + }) => + new Promise(async (resolve) => { + const blob = blobInfo.blob(); + const fileInfo = { + fieldName: `${blob.type.split("/")[1]}`, + fileType: blob.type, + fileBase64: "", + originalName: blobInfo.filename(), + size: blob.size, + }; + + const reader = new FileReader(); + reader.onload = async () => { + const base64 = reader.result as string; + fileInfo.fileBase64 = base64.split(",")[1] || ""; + + const data = await EditorApi.uploadImage(fileInfo); + resolve(data.url); + }; + reader.readAsDataURL(blob); + }), + file_picker_callback() { + const input = document.createElement("input"); + input.setAttribute("type", "file"); + input.setAttribute("accept", "image/*"); + + // input.addEventListener("change", (e) => { + // const file = e.target.files[0]; + + // const reader = new FileReader(); + // reader.addEventListener("load", () => { + // /* + // Note: Now we need to register the blob in TinyMCEs image blob + // registry. In the next release this part hopefully won't be + // necessary, as we are looking to handle it internally. + // */ + // const id = "blobid" + new Date().getTime(); + // const blobCache = tinymce.activeEditor.editorUpload.blobCache; + // const base64 = reader.result.split(",")[1]; + // const blobInfo = blobCache.create(id, file, base64); + // blobCache.add(blobInfo); + + // /* call the callback and populate the Title field with the file name */ + // cb(blobInfo.blobUri(), { title: file.name }); + // }); + // reader.readAsDataURL(file); + // }); + + input.click(); + }, + }} + {...props} + /> + ); +}; + +export { Editor }; diff --git a/apps/cs/src/pages/banner/ui/banner-form.tsx b/apps/cs/src/pages/banner/ui/banner-form.tsx index 49c9cc6a1..a39be8c1a 100644 --- a/apps/cs/src/pages/banner/ui/banner-form.tsx +++ b/apps/cs/src/pages/banner/ui/banner-form.tsx @@ -30,7 +30,7 @@ import { handleUpload } from "../lib/utils"; type BannerFormProps = { form: UseFormReturn; - bnrSn?: string; + bnrSn?: number; handleSave: (data: BannerFormData) => Promise; handleDelete?: () => Promise; }; diff --git a/apps/cs/src/pages/banner/ui/modify-page.tsx b/apps/cs/src/pages/banner/ui/modify-page.tsx index 7af0f246b..024e334c1 100644 --- a/apps/cs/src/pages/banner/ui/modify-page.tsx +++ b/apps/cs/src/pages/banner/ui/modify-page.tsx @@ -108,7 +108,7 @@ function ModifyPage({ sequential }: { sequential: string }) { diff --git a/apps/cs/src/pages/image/ui/image-form.tsx b/apps/cs/src/pages/image/ui/image-form.tsx index 4a768811b..9a5857b31 100644 --- a/apps/cs/src/pages/image/ui/image-form.tsx +++ b/apps/cs/src/pages/image/ui/image-form.tsx @@ -24,11 +24,12 @@ import { AttachmentApi } from "@/entities/attachment"; import { ENDPOINT } from "@/shared/config"; import { useTus } from "@/shared/lib/use-tus"; import { FormControl, FormField, FormItem } from "@/shared/ui/form"; +import { useAttachmentStore } from "@/shared/lib/use-attachment-store"; import type { ImageFormData } from "../model/image-interface"; type ImageFormProps = { form: UseFormReturn; - imgSn?: string; + imgSn?: number; handleSave: (data: ImageFormData) => Promise; handleDelete?: () => Promise; }; @@ -43,6 +44,7 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) { progress, setFile, } = useTus(); + const { setAttachmentFileCode } = useAttachmentStore((state) => state); const [imageUrl, setImageUrl] = useState(""); const { data: attachmentData } = useQuery({ @@ -201,6 +203,7 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) { onUpload={(e) => { const files = e.target.files; if (!files) return; + setAttachmentFileCode(""); setFile(files[0] ?? null); }} customPreview={ diff --git a/apps/cs/src/pages/image/ui/modify-page.tsx b/apps/cs/src/pages/image/ui/modify-page.tsx index 1405ed1f2..cf51acd6a 100644 --- a/apps/cs/src/pages/image/ui/modify-page.tsx +++ b/apps/cs/src/pages/image/ui/modify-page.tsx @@ -104,7 +104,7 @@ function ModifyPage({ sequential }: { sequential: string }) { diff --git a/apps/cs/src/pages/template/api/template-service.ts b/apps/cs/src/pages/template/api/template-service.ts index 6f2d1f73a..9a1fe4c5e 100644 --- a/apps/cs/src/pages/template/api/template-service.ts +++ b/apps/cs/src/pages/template/api/template-service.ts @@ -5,6 +5,7 @@ import type { TemplateList, TemplateParams, TemplateFormData, + Template, } from "../model/template-interface"; export class TemplateApiService implements TemplateService { @@ -16,6 +17,13 @@ export class TemplateApiService implements TemplateService { return response.data; } + public async getTemplateInfo(tmpltSn: string): Promise