-
로그인로그 목록
+
+
로그인로그 목록
+
+
+
+
-
-
+
+ {/* Debug: 로딩 상태 표시 */}
+ {(query.isLoading || query.isPending || isManualLoading) && (
+
+ )}
+ {tableComponent}
diff --git a/apps/cs/src/pages/menu/ui/type-menu-form.tsx b/apps/cs/src/pages/menu/ui/type-menu-form.tsx
index 8cbd7b8b0..ac62e2520 100644
--- a/apps/cs/src/pages/menu/ui/type-menu-form.tsx
+++ b/apps/cs/src/pages/menu/ui/type-menu-form.tsx
@@ -34,7 +34,7 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) {
};
const handleContentSelect = (content: Contents) => {
- form.setValue("urlPath", `/cntns/${content.contsSn}`);
+ form.setValue("urlPath", `/cms/cntns/${content.contsSn}`);
form.setValue("menuLnkgSn", content.contsSn);
form.setValue("menuLnkgSnNm", content.contsTtl);
};
@@ -47,7 +47,7 @@ function TypeMenuForm({ form, menuType }: TypeMenuFormProps) {
const handleBoardSelect = (board: BoardPopup) => {
form.setValue(
"urlPath",
- `/pst/${board.bbsTypeCd.toLowerCase()}/${board.bbsId}`,
+ `/cms/${board.bbsTypeCd.toLowerCase()}/${board.bbsId}`,
);
form.setValue("menuLnkgSn", board.bbsId);
form.setValue("menuLnkgSnNm", board.bbsNm);
diff --git a/apps/cs/src/pages/privacylog/index.ts b/apps/cs/src/pages/privacylog/index.ts
new file mode 100644
index 000000000..7bbd75042
--- /dev/null
+++ b/apps/cs/src/pages/privacylog/index.ts
@@ -0,0 +1 @@
+export { PrivacyLogPage } from "./ui/privacylog-page";
diff --git a/apps/cs/src/pages/privacylog/model/table-columns.tsx b/apps/cs/src/pages/privacylog/model/table-columns.tsx
new file mode 100644
index 000000000..a5b52d796
--- /dev/null
+++ b/apps/cs/src/pages/privacylog/model/table-columns.tsx
@@ -0,0 +1,41 @@
+import dayjs from "dayjs";
+import type { ColumnDef } from "@tanstack/react-table";
+import type { PrivacyLog } from "@/entities/privacylog";
+
+
+export const columns: ColumnDef
[] = [
+ {
+ id: "no",
+ header: "NO",
+ cell: ({ row, table }) => {
+ const totalRows = table.getRowCount();
+ const { pageIndex, pageSize } = table.getState().pagination;
+ return totalRows - (pageIndex * pageSize + row.index);
+ },
+ },
+ {
+ accessorKey: "inqDt",
+ header: "요청일시",
+ cell: ({ row }) => {
+ const date = dayjs(row.original.inqDt);
+ return date.format("YYYY-MM-DD HH:mm:ss");
+ },
+ },
+ {
+ accessorKey: "siteNm",
+ header: "사이트명",
+ },
+ {
+ accessorKey: "rqstrNm",
+ header: "조회자명",
+ },
+ {
+ accessorKey: "rqstrIp",
+ header: "조회IP",
+ },
+ {
+ accessorKey: "inqInfoSummary",
+ header: "조회정보",
+ }
+];
+
diff --git a/apps/cs/src/pages/privacylog/ui/privacylog-page.tsx b/apps/cs/src/pages/privacylog/ui/privacylog-page.tsx
new file mode 100644
index 000000000..5cb8bf13d
--- /dev/null
+++ b/apps/cs/src/pages/privacylog/ui/privacylog-page.tsx
@@ -0,0 +1,206 @@
+"use client";
+
+import dayjs from "dayjs";
+import { useState } from "react";
+import { keepPreviousData, useQuery } from "@tanstack/react-query";
+import {
+ getCoreRowModel,
+ type PaginationState,
+} from "@tanstack/react-table";
+import {
+ Button,
+ DateRangePicker,
+ Input,
+ Label,
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+ } from "@common/components";
+import { PrivacyLogPrivacy } from "@/entities/privacylog";
+import { type PrivacyLogParams} from "@/entities/privacylog/model/privacylog-interface";
+import { useDataTable } from "@/shared/lib";
+import { ENDPOINT } from "@/shared/config";
+import { columns } from "@/pages/privacylog/model/table-columns";
+
+
+
+type DateRange = {
+ from: Date | undefined;
+ to?: Date | undefined;
+};
+
+function PrivacyLogPage({ }) {
+
+ // 1주일 전부터 오늘까지 기본 날짜 설정
+ const defaultDateRange: DateRange = {
+ from: dayjs().subtract(7, "day").toDate(),
+ to: dayjs().toDate(),
+ };
+
+ const [dateRange, setDateRange] = useState(defaultDateRange);
+
+ const [pagination, setPagination] = useState({
+ pageIndex: 0,
+ pageSize: 10,
+ });
+
+ const [privacylogPostQuery, setprivacylogPostQuery] = useState< PrivacyLogParams>({
+ siteId: "",
+ inqInfoKeywordType: "userName",
+ inqInfoKeyword: "",
+ rqstrIp: "",
+ inqDtStart: dayjs().subtract(7, "day").format("YYYY-MM-DD"),
+ inqDtEnd: dayjs().format("YYYY-MM-DD"),
+ sort:"inqDt,asc"
+ });
+
+
+ const query = useQuery({
+ queryKey: [ENDPOINT.USER_SERVICE.PRIVACYLOG, pagination],
+ queryFn: () =>
+ PrivacyLogPrivacy.getPrivacyLogList({
+ ...privacylogPostQuery,
+ page: pagination.pageIndex,
+ size: pagination.pageSize,
+ }),
+ placeholderData: keepPreviousData,
+ });
+
+ const { tableComponent, tableInstance: table } = useDataTable({
+ query,
+ tableOptions: {
+ columns,
+ state: {
+ pagination,
+ },
+ manualPagination: true,
+ enableMultiRowSelection: true,
+ getCoreRowModel: getCoreRowModel(),
+ onPaginationChange: setPagination,
+ },
+ dataTableOptions: {
+ viewPagination: true,
+ },
+ });
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ query.refetch();
+ };
+
+ const handleprivacylogParamsChange =
+ (key: keyof PrivacyLogParams) => (value: unknown) => {
+ setprivacylogPostQuery({ ...privacylogPostQuery, [key]: value });
+ };
+
+ const handlePresetDateRange = (value: string) => {
+ let presetDateRange: DateRange | undefined;
+ switch (value) {
+ case "1W":
+ presetDateRange = {
+ from: dayjs().subtract(7, "day").toDate(),
+ to: dayjs().toDate(),
+ };
+ break;
+ case "1M":
+ presetDateRange = {
+ from: dayjs().subtract(30, "day").toDate(),
+ to: dayjs().toDate(),
+ };
+ break;
+ case "3M":
+ presetDateRange = {
+ from: dayjs().subtract(90, "day").toDate(),
+ to: dayjs().toDate(),
+ };
+ break;
+ default:
+ presetDateRange = undefined;
+ }
+ handleDateRangeChange(presetDateRange);
+ };
+
+
+
+ const handleDateRangeChange = (value: DateRange | undefined) => {
+ setDateRange(value || defaultDateRange);
+ setprivacylogPostQuery({
+ ...privacylogPostQuery,
+ inqDtStart: dayjs(value?.from).format("YYYY-MM-DD") ?? dayjs().subtract(7, "day").format("YYYY-MM-DD"),
+ inqDtEnd: dayjs(value?.to).format("YYYY-MM-DD") ?? dayjs().format("YYYY-MM-DD"),
+ });
+ };
+
+
+
+
+ return (
+
+
+
+
+
+
로그인로그 목록
+
+
+
+
+
+
{tableComponent}
+
+
+ );
+}
+
+export { PrivacyLogPage };
diff --git a/apps/cs/src/pages/recent/ui/recent-page.tsx b/apps/cs/src/pages/recent/ui/recent-page.tsx
index 681c25e34..ec9fec78a 100644
--- a/apps/cs/src/pages/recent/ui/recent-page.tsx
+++ b/apps/cs/src/pages/recent/ui/recent-page.tsx
@@ -62,6 +62,7 @@ function RecentPage() {
delYn: "N",
frDateYmd: "",
toDateYmd: "",
+ sort:"regDt,desc"
});
const [isDeletePostData, setIsDeletePostData] = useState(false);
diff --git a/apps/cs/src/pages/site/ui/ip-management-dialog.tsx b/apps/cs/src/pages/site/ui/ip-management-dialog.tsx
index c2a2c2702..43e2c2155 100644
--- a/apps/cs/src/pages/site/ui/ip-management-dialog.tsx
+++ b/apps/cs/src/pages/site/ui/ip-management-dialog.tsx
@@ -46,7 +46,7 @@ function IPManagementDialog({
const { data: ipList } = useQuery({
queryKey: [ENDPOINT.CMS_SERVICE.IPS, props.open],
- queryFn: () => IpApi.getIpList({ siteId, sort: [] }),
+ queryFn: () => IpApi.getIpList({ siteId, sort: "" }),
select: (data) => {
const ips = data.content.map((item) => ({
...item,
diff --git a/apps/cs/src/pages/site/ui/site-page.tsx b/apps/cs/src/pages/site/ui/site-page.tsx
index 6d0041a65..734ba7658 100644
--- a/apps/cs/src/pages/site/ui/site-page.tsx
+++ b/apps/cs/src/pages/site/ui/site-page.tsx
@@ -17,6 +17,7 @@ function SitePage() {
const [siteQuery, setSiteQuery] = useState({
siteNm: "",
+ sort:"regDt,desc"
});
const [pagination, setPagination] = useState({
pageIndex: 0,
diff --git a/apps/cs/src/pages/template/ui/template-page.tsx b/apps/cs/src/pages/template/ui/template-page.tsx
index dc90b69ff..59e8c8b01 100644
--- a/apps/cs/src/pages/template/ui/template-page.tsx
+++ b/apps/cs/src/pages/template/ui/template-page.tsx
@@ -18,6 +18,7 @@ function TemplatePage() {
const [templateQuery, setTemplateQuery] = useState({
tmpltSeCd: "",
keyword: "",
+ sort:"regDt,desc"
});
const [pagination, setPagination] = useState({
pageIndex: 0,
diff --git a/apps/cs/src/pages/terms/ui/terms-page.tsx b/apps/cs/src/pages/terms/ui/terms-page.tsx
index 8cb6a911e..617d4eff6 100644
--- a/apps/cs/src/pages/terms/ui/terms-page.tsx
+++ b/apps/cs/src/pages/terms/ui/terms-page.tsx
@@ -17,7 +17,8 @@ function TermsPage() {
const [termsQuery, setTermsQuery] = useState({
trmsSeCd: "",
- keyword: "",
+ keyword: "",
+ sort:"regDt,desc"
});
const [pagination, setPagination] = useState({
pageIndex: 0,
diff --git a/apps/cs/src/pages/users/ui/users-page.tsx b/apps/cs/src/pages/users/ui/users-page.tsx
index d6f77deb5..2ffe05eb4 100644
--- a/apps/cs/src/pages/users/ui/users-page.tsx
+++ b/apps/cs/src/pages/users/ui/users-page.tsx
@@ -51,7 +51,7 @@ function UsersPage() {
grpId: "",
frDateYmd: "",
toDateYmd: "",
- sort: ["aprvYmd,desc"],
+ sort: "regDt,desc"
},
});
@@ -288,9 +288,9 @@ function UsersPage() {
회원 목록
diff --git a/apps/cs/src/widgets/post/ui/post.tsx b/apps/cs/src/widgets/post/ui/post.tsx
index a7f3cb43a..040262218 100644
--- a/apps/cs/src/widgets/post/ui/post.tsx
+++ b/apps/cs/src/widgets/post/ui/post.tsx
@@ -5,14 +5,21 @@ import Image from "next/image";
import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import { useQuery } from "@tanstack/react-query";
-import { Button, Skeleton } from "@common/components";
+import {
+ Button,
+ Label,
+ RadioGroup,
+ RadioGroupItem,
+ Skeleton,
+} from "@common/components";
import { AttachmentApi } from "@/entities/attachment";
import { PostApi } from "@/entities/post";
-import { useAlertStore, useMutationWrapper, useMenuStore } from "@/shared/lib";
+import { BoardApi } from "@/entities/board";
import { ENDPOINT } from "@/shared/config";
+import { useAlertStore, useMutationWrapper, useMenuStore } from "@/shared/lib";
import { PostAction } from "./post-action";
import { PostComment } from "./post-comment";
-import { BoardApi } from "@/entities/board";
+import { PostEvaluationApi } from "../api/post-evaluation-service";
function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) {
const router = useRouter();
@@ -20,6 +27,7 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) {
const { bbsInfo, setBbsInfo } = useMenuStore((state) => state);
const [filename, setFilename] = useState("");
+ const [evlScr, setEvlScr] = useState(5);
const { data: boardInfo } = useQuery({
queryKey: [ENDPOINT.BOARD_SERVICE.BBS, bbsId],
@@ -72,6 +80,17 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) {
},
});
+ const { mutate: postEvaluation } = useMutationWrapper({
+ mutationFn: (evlScr: number) =>
+ PostEvaluationApi.postEvaluation({
+ pstNo: parseInt(pstNo),
+ evlScr,
+ }),
+ onSuccess: () => {
+ alert("게시물 평가가 완료되었습니다.");
+ },
+ });
+
const handleDownload = async () => {
if (!downloadResponse) return;
try {
@@ -187,6 +206,53 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) {
>
)
)}
+ {bbsInfo?.dgstfnEvlUseYn === "Y" && (
+ <>
+
+
+
+ 이 페이지에서 제공하는
+
+ 정보에 대하여 만족하시나요?
+
+
+
setEvlScr(parseInt(value))}
+ className="flex items-center space-x-4"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )}