From 3f975cb1a1802ce3b851e7e55b9a24493f3d8bd3 Mon Sep 17 00:00:00 2001 From: adilkadivala Date: Tue, 26 Aug 2025 20:50:47 +0530 Subject: [PATCH] cms completed --- src/components/data-not-avaiable.tsx | 9 + src/components/editor/artical-info.tsx | 272 ++++++++++++++++++ src/components/editor/content-sidebar.tsx | 118 -------- src/components/editor/editor-header.tsx | 17 +- src/components/editor/editor-layout.tsx | 81 +++--- src/components/editor/editor-toolbar.tsx | 2 - src/components/editor/seo-fields.tsx | 163 ----------- src/components/editor/toolbar/ai-tools.tsx | 96 ------- .../route-protection/auth-protected-route.tsx | 16 -- .../dashboard-protected-route.tsx | 12 - src/components/setting-profile.tsx | 14 +- src/components/sidebar.tsx | 4 +- .../content-management/content-editor.tsx | 98 ++++--- .../content-management/content-preview.tsx | 91 +++++- .../content-management/cover-image.tsx | 94 ------ .../content-management/image-uploader.tsx | 136 --------- src/features/content-management/index.tsx | 147 ++++++++++ .../content-management/subtitle-input.tsx | 50 ---- .../content-management/title-input.tsx | 27 -- src/features/events/index.tsx | 2 +- src/lib/utils.ts | 22 +- src/pages/dashboard/academic-personal.tsx | 108 +++++++ src/pages/dashboard/camous-map.tsx | 121 ++++++++ src/pages/dashboard/content-management.tsx | 120 +------- src/pages/dashboard/fresh-man.tsx | 141 +++++++++ src/pages/dashboard/library.tsx | 151 ++++++++++ src/pages/dashboard/restaurant.tsx | 210 ++++++++++++++ src/pages/dashboard/services.tsx | 226 +++++++++++++++ src/routes/index.tsx | 26 +- .../content-management/content-management.ts | 7 + .../content-management/content-management.ts | 19 ++ .../content-management/content-management.ts | 27 ++ src/types/index.d.ts | 23 ++ 33 files changed, 1708 insertions(+), 942 deletions(-) create mode 100644 src/components/data-not-avaiable.tsx create mode 100644 src/components/editor/artical-info.tsx delete mode 100644 src/components/editor/content-sidebar.tsx delete mode 100644 src/components/editor/seo-fields.tsx delete mode 100644 src/components/editor/toolbar/ai-tools.tsx delete mode 100644 src/features/content-management/cover-image.tsx delete mode 100644 src/features/content-management/image-uploader.tsx create mode 100644 src/features/content-management/index.tsx delete mode 100644 src/features/content-management/subtitle-input.tsx delete mode 100644 src/features/content-management/title-input.tsx create mode 100644 src/pages/dashboard/academic-personal.tsx create mode 100644 src/pages/dashboard/camous-map.tsx create mode 100644 src/pages/dashboard/fresh-man.tsx create mode 100644 src/pages/dashboard/library.tsx create mode 100644 src/pages/dashboard/restaurant.tsx create mode 100644 src/pages/dashboard/services.tsx create mode 100644 src/store/atoms/content-management/content-management.ts create mode 100644 src/store/hooks/content-management/content-management.ts create mode 100644 src/store/selectors/content-management/content-management.ts diff --git a/src/components/data-not-avaiable.tsx b/src/components/data-not-avaiable.tsx new file mode 100644 index 0000000..e80d611 --- /dev/null +++ b/src/components/data-not-avaiable.tsx @@ -0,0 +1,9 @@ +const DateNotAvailable = ({ text = " No data available to show" }) => { + return ( +
+ {text} +
+ ); +}; + +export default DateNotAvailable; diff --git a/src/components/editor/artical-info.tsx b/src/components/editor/artical-info.tsx new file mode 100644 index 0000000..f8d2c7d --- /dev/null +++ b/src/components/editor/artical-info.tsx @@ -0,0 +1,272 @@ +"use client"; + +import { Badge } from "@/components/ui/badge"; +import { Calendar, User, X } from "lucide-react"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { Button } from "@/components/ui/button"; +import type { ContentManagement } from "@/types"; +import { useAdminData } from "@/store/hooks/users/useAdminData"; + +interface ArticleInfoProps { + contentData: ContentManagement; + onContentDataChange: (updates: Partial) => void; +} + +export const ArticleInfo = ({ + contentData, + onContentDataChange, +}: ArticleInfoProps) => { + // Add keyword + const addKeyword = (keyword: string) => { + if (keyword.trim() && !contentData.keywords.includes(keyword.trim())) { + onContentDataChange({ + keywords: [...contentData.keywords, keyword.trim()], + }); + } + }; + + // Remove keyword + const removeKeyword = (keyword: string) => { + onContentDataChange({ + keywords: contentData.keywords.filter((k) => k !== keyword), + }); + }; + + // Handle Enter key for keywords + const handleKeywordKeyPress = (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + e.preventDefault(); + const target = e.target as HTMLInputElement; + addKeyword(target.value); + target.value = ""; + } + }; + + const { adminInfo, error, loading } = useAdminData(); + + if (loading) return
Loading...
; + if (error) return
Error loading data
; + + return ( +
+
+ {/* Status Info */} +
+

Article Status

+ +
+ + {contentData.status || "Draft"} + + {contentData.category && ( + {contentData.category} + )} +
+ +
+
+ + {new Date().toLocaleDateString()} +
+
+ + + {adminInfo?.firstname} {adminInfo?.lastname} + +
+
+
+ + {/* Basic Info */} +
+

Basic Information

+ +
+
+ + onContentDataChange({ title: e.target.value })} + placeholder="Article title" + className="mt-1" + /> +
+ +
+ + + onContentDataChange({ subtitle: e.target.value }) + } + placeholder="Subtitle (optional)" + className="mt-1" + /> +
+ +
+ + { + const file = e.target.files?.[0]; + if (file) { + const url = URL.createObjectURL(file); + onContentDataChange({ coverimage: url }); + } + }} + className="mt-1" + /> + {contentData.coverimage && ( +
+ Cover + +
+ )} +
+
+
+ + {/* SEO */} +
+

SEO Settings

+ +
+
+ + + onContentDataChange({ metaTitle: e.target.value }) + } + placeholder="SEO title" + maxLength={60} + className="mt-1" + /> +
+ {(contentData.metaTitle || "").length}/60 +
+
+ +
+ +