summaryrefslogtreecommitdiff
path: root/lib/page-visits/table/page-visits-table-toolbar-actions.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/page-visits/table/page-visits-table-toolbar-actions.tsx')
-rw-r--r--lib/page-visits/table/page-visits-table-toolbar-actions.tsx112
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/page-visits/table/page-visits-table-toolbar-actions.tsx b/lib/page-visits/table/page-visits-table-toolbar-actions.tsx
new file mode 100644
index 00000000..5a74a765
--- /dev/null
+++ b/lib/page-visits/table/page-visits-table-toolbar-actions.tsx
@@ -0,0 +1,112 @@
+"use client"
+
+import { type Table } from "@tanstack/react-table"
+import { Download, RotateCcw, BarChart3, Filter } from "lucide-react"
+import { useRouter } from "next/navigation"
+import { useTransition } from "react"
+
+import { Button } from "@/components/ui/button"
+import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
+
+import { ExtendedPageVisit } from "../validation"
+import { exportTableToExcel } from "@/lib/export_all"
+
+interface PageVisitsTableToolbarActionsProps {
+ table: Table<ExtendedPageVisit>
+}
+
+export function PageVisitsTableToolbarActions({
+ table,
+}: PageVisitsTableToolbarActionsProps) {
+ const router = useRouter()
+ const [isPending, startTransition] = useTransition()
+
+ const handleRefresh = () => {
+ startTransition(() => {
+ router.refresh() // ✅ 서버 컴포넌트만 새로고침 (더 빠르고 부드러움)
+ })
+ }
+
+ return (
+ <div className="flex items-center gap-2">
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <Button
+ variant="outline"
+ size="sm"
+ onClick={() =>
+ exportTableToExcel(table, {
+ filename: "page-visits",
+ excludeColumns: ["select", "actions"],
+ })
+ }
+ >
+ <Download className="mr-2 size-4" aria-hidden="true" />
+ Export
+ </Button>
+ </TooltipTrigger>
+ <TooltipContent>
+ <p>페이지 방문 데이터를 엑셀로 내보내기</p>
+ </TooltipContent>
+ </Tooltip>
+
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <Button
+ variant="outline"
+ size="sm"
+ onClick={handleRefresh}
+ disabled={isPending} // 로딩 중 비활성화
+ >
+ <RotateCcw
+ className={`mr-2 size-4 ${isPending ? 'animate-spin' : ''}`}
+ aria-hidden="true"
+ />
+ {isPending ? '새로고침 중...' : '새로고침'}
+ </Button>
+ </TooltipTrigger>
+ <TooltipContent>
+ <p>데이터 새로고침</p>
+ </TooltipContent>
+ </Tooltip>
+
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <Button
+ variant="outline"
+ size="sm"
+ onClick={() => {
+ // 페이지 통계 분석 기능
+ console.log("Generate page analytics")
+ }}
+ >
+ <BarChart3 className="mr-2 size-4" aria-hidden="true" />
+ 페이지 분석
+ </Button>
+ </TooltipTrigger>
+ <TooltipContent>
+ <p>페이지별 방문 통계 분석</p>
+ </TooltipContent>
+ </Tooltip>
+
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <Button
+ variant="outline"
+ size="sm"
+ onClick={() => {
+ // 고급 필터링 옵션
+ console.log("Advanced filtering options")
+ }}
+ >
+ <Filter className="mr-2 size-4" aria-hidden="true" />
+ 고급 필터
+ </Button>
+ </TooltipTrigger>
+ <TooltipContent>
+ <p>고급 필터링 옵션</p>
+ </TooltipContent>
+ </Tooltip>
+ </div>
+ )
+}