From 483e0b319a43844aef03db8bd4543dc1ec600846 Mon Sep 17 00:00:00 2001
From: bicochan
Date: Wed, 2 Apr 2025 17:47:14 +0900
Subject: [PATCH 01/38] =?UTF-8?q?chore:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?=
=?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=95=88=EB=82=B4=20=EB=AC=B8?=
=?UTF-8?q?=EA=B5=AC=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/cs/src/pages/image/ui/image-form.tsx | 31 +++++++++++++++--------
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/apps/cs/src/pages/image/ui/image-form.tsx b/apps/cs/src/pages/image/ui/image-form.tsx
index 81ab21726..58ecdd1b1 100644
--- a/apps/cs/src/pages/image/ui/image-form.tsx
+++ b/apps/cs/src/pages/image/ui/image-form.tsx
@@ -213,18 +213,27 @@ function ImageForm({ form, imgSn, handleSave, handleDelete }: ImageFormProps) {
});
}}
customPreview={
-
- {attachmentFileId && (
+ {imageUrl && (
(null);
const [progress, setProgress] = useState(0);
@@ -79,11 +79,15 @@ function ImageForm({ form, imgSn, handleSave, handleDelete }: ImageFormProps) {
const { atflCd, atflId } = JSON.parse(fileInfo) ?? {};
if (atflCd) form.setValue("atflCd", atflCd);
- if (atflId) setAttachmentFileId(atflId);
+ if (atflId) setImageUrl(await AttachmentApi.getImageUrl(atflId));
};
useEffect(() => {
- if (atflId) setAttachmentFileId(atflId);
+ if (!atflId) return;
+
+ (async () => {
+ setImageUrl(await AttachmentApi.getImageUrl(atflId));
+ })();
}, [atflId]);
return (
@@ -228,9 +232,9 @@ function ImageForm({ form, imgSn, handleSave, handleDelete }: ImageFormProps) {
{(upload?.file as File)?.name}
- {attachmentFileId && (
+ {imageUrl && (
([]);
function isPathMatched(path: string) {
- return currentPath === path;
+ if (!path) return false;
+ return currentPath?.startsWith(path);
}
function MenuItem({ item }: { item: MenuItem }) {
From 77539bb7855e572467b56d5d5d50d31e2cf18a5a Mon Sep 17 00:00:00 2001
From: bicochan
Date: Tue, 8 Apr 2025 13:59:04 +0900
Subject: [PATCH 20/38] =?UTF-8?q?refactor:=20form=20wrapper=20=EC=84=A0?=
=?UTF-8?q?=EC=96=B8=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/cs/src/entities/code/@x/posting.ts | 1 +
.../entities/posting/ui/posting-dialog.tsx | 4 +-
apps/cs/src/entities/site/@x/posting.ts | 2 +
.../src/entities/site/model/site-interface.ts | 16 +-
apps/cs/src/pages/banner/ui/banner-form.tsx | 482 ++++++-------
apps/cs/src/pages/image/ui/image-form.tsx | 497 ++++++-------
apps/cs/src/pages/menu/ui/menu-form.tsx | 89 +--
apps/cs/src/pages/site/ui/create-page.tsx | 4 +-
.../site/ui/domain-management-dialog.tsx | 308 ++++----
.../pages/site/ui/ip-management-dialog.tsx | 266 ++++---
apps/cs/src/pages/site/ui/site-form.tsx | 667 ++++++++----------
apps/cs/src/widgets/form-wrapper/index.ts | 1 +
.../widgets/form-wrapper/ui/form-wrapper.tsx | 68 ++
13 files changed, 1146 insertions(+), 1259 deletions(-)
create mode 100644 apps/cs/src/entities/code/@x/posting.ts
create mode 100644 apps/cs/src/entities/site/@x/posting.ts
create mode 100644 apps/cs/src/widgets/form-wrapper/index.ts
create mode 100644 apps/cs/src/widgets/form-wrapper/ui/form-wrapper.tsx
diff --git a/apps/cs/src/entities/code/@x/posting.ts b/apps/cs/src/entities/code/@x/posting.ts
new file mode 100644
index 000000000..0525684d9
--- /dev/null
+++ b/apps/cs/src/entities/code/@x/posting.ts
@@ -0,0 +1 @@
+export { CodeSelect } from "../ui/code-select";
diff --git a/apps/cs/src/entities/posting/ui/posting-dialog.tsx b/apps/cs/src/entities/posting/ui/posting-dialog.tsx
index d7c0b60ca..b49e541c2 100644
--- a/apps/cs/src/entities/posting/ui/posting-dialog.tsx
+++ b/apps/cs/src/entities/posting/ui/posting-dialog.tsx
@@ -25,8 +25,8 @@ import {
DialogFooter,
} from "@common/components/ui";
import { cn } from "@common/components/lib";
-import { CodeSelect } from "@/entities/code";
-import { SiteApi, type Site } from "@/entities/site";
+import { CodeSelect } from "@/entities/code/@x/posting";
+import { SiteApi, type Site } from "@/entities/site/@x/posting";
import type { PageableList } from "@/shared/model";
import { ENDPOINT } from "@/shared/config";
import { PostingApi } from "../api/posting-service";
diff --git a/apps/cs/src/entities/site/@x/posting.ts b/apps/cs/src/entities/site/@x/posting.ts
new file mode 100644
index 000000000..6470b3cb2
--- /dev/null
+++ b/apps/cs/src/entities/site/@x/posting.ts
@@ -0,0 +1,2 @@
+export { SiteApi } from "../api/site-service";
+export type { Site } from "../model/site-interface";
diff --git a/apps/cs/src/entities/site/model/site-interface.ts b/apps/cs/src/entities/site/model/site-interface.ts
index 85b1f802f..8846f59b9 100644
--- a/apps/cs/src/entities/site/model/site-interface.ts
+++ b/apps/cs/src/entities/site/model/site-interface.ts
@@ -35,17 +35,17 @@ export interface SiteDetail extends SiteFormData {
export const siteFormSchema = z.object({
siteId: z.string().max(2).nonempty(),
siteNm: z.string().max(100).nonempty(),
- siteExpln: z.string().max(1000).nullable(),
+ siteExpln: z.string().max(1000).nullish(),
siteKndCd: z.string().max(10).nonempty(),
- siteAddr: z.string().max(2000).nullable(),
- faxNo: z.string().max(100).nullable(),
- telNo: z.string().max(1000).nullable(),
- lwndCn: z.string().max(2000).nullable(),
+ siteAddr: z.string().max(2000).nullish(),
+ faxNo: z.string().max(100).nullish(),
+ telNo: z.string().max(1000).nullish(),
+ lwndCn: z.string().max(2000).nullish(),
bscSiteYn: z.string(),
- bkmkIcon: z.string().max(100).nullable(),
+ bkmkIcon: z.string().max(100).nullish(),
useYn: z.string(),
- siteSkn: z.string().max(10).nullable(),
- dmnAddr: z.string().nullable(),
+ siteSkn: z.string().max(10).nullish(),
+ dmnAddr: z.string().nullish(),
});
export type SiteFormData = z.infer;
diff --git a/apps/cs/src/pages/banner/ui/banner-form.tsx b/apps/cs/src/pages/banner/ui/banner-form.tsx
index 4e283d45d..ade05f13e 100644
--- a/apps/cs/src/pages/banner/ui/banner-form.tsx
+++ b/apps/cs/src/pages/banner/ui/banner-form.tsx
@@ -2,13 +2,10 @@
import Image from "next/image";
import { useEffect, useState } from "react";
-import { useRouter } from "next/navigation";
import { useQuery } from "@tanstack/react-query";
import type { UseFormReturn } from "react-hook-form";
import type { HttpResponse, Upload } from "tus-js-client";
-import { useConfirm } from "@frontend-opensource/use-react-hooks";
import {
- Button,
FileUploader,
Input,
Label,
@@ -25,9 +22,10 @@ import {
import { CodeSelect } from "@/entities/code";
import { AttachmentApi } from "@/entities/attachment";
import { ENDPOINT } from "@/shared/config";
-import { Form, FormControl, FormField, FormItem } from "@/shared/ui/form";
+import { FormControl, FormField, FormItem } from "@/shared/ui/form";
import type { BannerFormData } from "../model/banner-interface";
import { handleUpload } from "../lib/utils";
+import { FormWrapper } from "@/widgets/form-wrapper";
type BannerFormProps = {
form: UseFormReturn;
@@ -36,17 +34,9 @@ type BannerFormProps = {
handleDelete?: () => Promise;
};
-function BannerForm({
- form,
- bnrSn,
- handleSave,
- handleDelete,
-}: BannerFormProps) {
- const isModifyMode = !!bnrSn;
+function BannerForm({ form, bnrSn, ...props }: BannerFormProps) {
const atflCd = form.watch("atflCd");
- const router = useRouter();
- const { confirm } = useConfirm();
const [imageUrl, setImageUrl] = useState("");
const [upload, setUpload] = useState(null);
const [progress, setProgress] = useState(0);
@@ -58,22 +48,6 @@ function BannerForm({
enabled: !!atflCd,
});
- const onSubmit = async (data: BannerFormData) => {
- const confirmMessage = isModifyMode
- ? "수정하시겠습니까?"
- : "저장하시겠습니까?";
-
- if (await confirm(confirmMessage)) {
- await handleSave(data);
- }
- };
-
- const onDelete = async () => {
- if (await confirm("삭제하시겠습니까?")) {
- await handleDelete?.();
- }
- };
-
const handleProgress = (percentage: string) => {
setProgress(Number(percentage));
};
@@ -96,245 +70,223 @@ function BannerForm({
}, [atflId]);
return (
- <>
-
-
diff --git a/apps/cs/src/pages/image/ui/image-form.tsx b/apps/cs/src/pages/image/ui/image-form.tsx
index 236fee434..3b4bb46d4 100644
--- a/apps/cs/src/pages/image/ui/image-form.tsx
+++ b/apps/cs/src/pages/image/ui/image-form.tsx
@@ -60,14 +60,16 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) {
if (atflCd) form.setValue("atflCd", atflCd);
if (atflId) setImageUrl(await AttachmentApi.getImageUrl(atflId));
if (attachmentData)
- await AttachmentApi.deleteAttachment(attachmentData.atflId);
+ await AttachmentApi.deleteAttachmentByAtflCd(attachmentData.atflCd);
};
useEffect(() => {
if (!attachmentData) return;
(async () => {
- setImageUrl(await AttachmentApi.getImageUrl(attachmentData.atflId));
+ setImageUrl(
+ await AttachmentApi.getImageUrlByAtflCd(attachmentData.atflCd),
+ );
})();
}, [attachmentData]);
diff --git a/apps/cs/src/pages/image/ui/image-page.tsx b/apps/cs/src/pages/image/ui/image-page.tsx
index 648b8e410..18d2fa2fb 100644
--- a/apps/cs/src/pages/image/ui/image-page.tsx
+++ b/apps/cs/src/pages/image/ui/image-page.tsx
@@ -125,7 +125,7 @@ function ImagePage() {
-
From 2eb9eb9370f57639d2ecbbf03030c93e767fa183 Mon Sep 17 00:00:00 2001
From: bicochan
Date: Tue, 8 Apr 2025 16:28:27 +0900
Subject: [PATCH 23/38] =?UTF-8?q?fix:=20atflCd=20=EC=BF=A0=ED=82=A4=20?=
=?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?=
=?UTF-8?q?=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/cs/src/pages/banner/model/banner-table-columns.tsx | 2 --
apps/cs/src/pages/banner/ui/banner-form.tsx | 4 +++-
apps/cs/src/pages/image/ui/image-form.tsx | 6 +++---
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/apps/cs/src/pages/banner/model/banner-table-columns.tsx b/apps/cs/src/pages/banner/model/banner-table-columns.tsx
index d30d28444..2468821f4 100644
--- a/apps/cs/src/pages/banner/model/banner-table-columns.tsx
+++ b/apps/cs/src/pages/banner/model/banner-table-columns.tsx
@@ -64,8 +64,6 @@ const BannerImage = ({ atflCd }: { atflCd: string }) => {
const [imageUrl, setImageUrl] = useState("");
useEffect(() => {
- if (!atflCd) return;
-
(async () => {
setImageUrl(await AttachmentApi.getImageUrlByAtflCd(atflCd));
})();
diff --git a/apps/cs/src/pages/banner/ui/banner-form.tsx b/apps/cs/src/pages/banner/ui/banner-form.tsx
index 2c901bd90..3b439653c 100644
--- a/apps/cs/src/pages/banner/ui/banner-form.tsx
+++ b/apps/cs/src/pages/banner/ui/banner-form.tsx
@@ -19,13 +19,14 @@ import {
TableRow,
Textarea,
} from "@common/components";
+import { FormWrapper } from "@/widgets/form-wrapper";
import { CodeSelect } from "@/entities/code";
import { AttachmentApi } from "@/entities/attachment";
import { ENDPOINT } from "@/shared/config";
+import { setCookie } from "@/shared/lib/cookie";
import { FormControl, FormField, FormItem } from "@/shared/ui/form";
import type { BannerFormData } from "../model/banner-interface";
import { handleUpload } from "../lib/utils";
-import { FormWrapper } from "@/widgets/form-wrapper";
type BannerFormProps = {
form: UseFormReturn;
@@ -138,6 +139,7 @@ function BannerForm({ form, bnrSn, ...props }: BannerFormProps) {
onUpload={(e) => {
const files = e.target.files;
if (!files) return;
+ setCookie("atfl-cd-key", "");
handleUpload(files, {
handleUploadStart: setUpload,
handleProgress,
diff --git a/apps/cs/src/pages/image/ui/image-form.tsx b/apps/cs/src/pages/image/ui/image-form.tsx
index 3b4bb46d4..c3a8cca7a 100644
--- a/apps/cs/src/pages/image/ui/image-form.tsx
+++ b/apps/cs/src/pages/image/ui/image-form.tsx
@@ -22,6 +22,7 @@ import { FormWrapper } from "@/widgets/form-wrapper";
import { CodeSelect } from "@/entities/code";
import { AttachmentApi } from "@/entities/attachment";
import { ENDPOINT } from "@/shared/config";
+import { setCookie } from "@/shared/lib/cookie";
import { FormControl, FormField, FormItem } from "@/shared/ui/form";
import type { ImageFormData } from "../model/image-interface";
import { handleUpload } from "../lib/utils";
@@ -64,11 +65,9 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) {
};
useEffect(() => {
- if (!attachmentData) return;
-
(async () => {
setImageUrl(
- await AttachmentApi.getImageUrlByAtflCd(attachmentData.atflCd),
+ await AttachmentApi.getImageUrlByAtflCd(attachmentData?.atflCd ?? ""),
);
})();
}, [attachmentData]);
@@ -198,6 +197,7 @@ function ImageForm({ form, imgSn, ...props }: ImageFormProps) {
onUpload={(e) => {
const files = e.target.files;
if (!files) return;
+ setCookie("atfl-cd-key", "");
handleUpload(files, {
handleUploadStart: setUpload,
handleProgress,
From 661eb3597a13804f53822a7b2a8f643c006fe324 Mon Sep 17 00:00:00 2001
From: bicochan
Date: Tue, 8 Apr 2025 17:00:59 +0900
Subject: [PATCH 24/38] =?UTF-8?q?feat:=20=EB=B0=B0=EB=84=88=20=EB=AA=A9?=
=?UTF-8?q?=EB=A1=9D=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EC=97=90=20=EC=8A=A4?=
=?UTF-8?q?=EC=BC=88=EB=A0=88=ED=86=A4=20=EC=A0=81=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pages/banner/model/banner-table-columns.tsx | 17 +++++++++--------
packages/common/components/src/ui/index.ts | 1 +
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/apps/cs/src/pages/banner/model/banner-table-columns.tsx b/apps/cs/src/pages/banner/model/banner-table-columns.tsx
index 2468821f4..3d993f766 100644
--- a/apps/cs/src/pages/banner/model/banner-table-columns.tsx
+++ b/apps/cs/src/pages/banner/model/banner-table-columns.tsx
@@ -2,11 +2,12 @@
import dayjs from "dayjs";
import Image from "next/image";
+import { useQuery } from "@tanstack/react-query";
import type { ColumnDef } from "@tanstack/react-table";
-import { Checkbox } from "@common/components/ui";
+import { Checkbox, Skeleton } from "@common/components/ui";
import { AttachmentApi } from "@/entities/attachment";
+import { ENDPOINT } from "@/shared/config";
import type { Banner } from "./banner-interface";
-import { useEffect, useState } from "react";
export const columns: ColumnDef[] = [
{
@@ -61,13 +62,13 @@ export const columns: ColumnDef[] = [
];
const BannerImage = ({ atflCd }: { atflCd: string }) => {
- const [imageUrl, setImageUrl] = useState("");
+ const { data: imageUrl, isLoading } = useQuery({
+ queryKey: [ENDPOINT.ATTACH_SERVICE.IMAGES, atflCd],
+ queryFn: () => AttachmentApi.getImageUrlByAtflCd(atflCd),
+ enabled: !!atflCd,
+ });
- useEffect(() => {
- (async () => {
- setImageUrl(await AttachmentApi.getImageUrlByAtflCd(atflCd));
- })();
- }, [atflCd]);
+ if (isLoading) return ;
if (!imageUrl) return null;
diff --git a/packages/common/components/src/ui/index.ts b/packages/common/components/src/ui/index.ts
index 4ff471de1..bea09fa74 100644
--- a/packages/common/components/src/ui/index.ts
+++ b/packages/common/components/src/ui/index.ts
@@ -20,6 +20,7 @@ export * from "./progress";
export * from "./radio-group";
export * from "./select";
export * from "./slider";
+export * from "./skeleton";
export * from "./switch";
export * from "./table";
export * from "./tabs";
From 12a12339b90be5af1203d7ebc2e4888f11c49d3f Mon Sep 17 00:00:00 2001
From: bicochan
Date: Tue, 8 Apr 2025 18:10:27 +0900
Subject: [PATCH 25/38] =?UTF-8?q?feat:=20=EB=B0=B0=EB=84=88=20=EC=9D=B4?=
=?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20?=
=?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=9E=91?=
=?UTF-8?q?=EC=97=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../banner/model/banner-table-columns.tsx | 28 +-
apps/cs/src/pages/banner/ui/banner-page.tsx | 16 +-
.../pages/banner/ui/preview-banner-dialog.tsx | 57 ++++
packages/common/components/package.json | 1 +
.../components/src/ui/carousel/index.tsx | 261 ++++++++++++++++++
packages/common/components/src/ui/index.ts | 1 +
pnpm-lock.yaml | 25 ++
7 files changed, 383 insertions(+), 6 deletions(-)
create mode 100644 apps/cs/src/pages/banner/ui/preview-banner-dialog.tsx
create mode 100644 packages/common/components/src/ui/carousel/index.tsx
diff --git a/apps/cs/src/pages/banner/model/banner-table-columns.tsx b/apps/cs/src/pages/banner/model/banner-table-columns.tsx
index 3d993f766..65c8c6e87 100644
--- a/apps/cs/src/pages/banner/model/banner-table-columns.tsx
+++ b/apps/cs/src/pages/banner/model/banner-table-columns.tsx
@@ -9,7 +9,9 @@ import { AttachmentApi } from "@/entities/attachment";
import { ENDPOINT } from "@/shared/config";
import type { Banner } from "./banner-interface";
-export const columns: ColumnDef[] = [
+export const columns = (
+ imageRefs: React.MutableRefObject