Rôles et Permissions
- {hasPermissions(user.roles, { roles: ["insert"] }) && (
+ {rolesPerm.insert && (
);
diff --git a/frontend/app/globals.css b/frontend/app/globals.css
index 32bac5f..27321e2 100644
--- a/frontend/app/globals.css
+++ b/frontend/app/globals.css
@@ -4,6 +4,7 @@
body {
font-family: Arial, Helvetica, sans-serif;
+ pointer-events: auto !important;
}
@layer base {
@@ -82,6 +83,7 @@ body {
* {
@apply border-border outline-ring/50;
}
+
body {
@apply bg-background text-foreground;
}
diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx
index f4c7939..b1fed24 100644
--- a/frontend/app/layout.tsx
+++ b/frontend/app/layout.tsx
@@ -1,3 +1,4 @@
+import "@/lib/utils";
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "@/app/globals.css";
diff --git a/frontend/app/robots.ts b/frontend/app/robots.ts
new file mode 100644
index 0000000..939873a
--- /dev/null
+++ b/frontend/app/robots.ts
@@ -0,0 +1,13 @@
+import { BASE_URL } from "@/lib/constants";
+import type { MetadataRoute } from "next";
+
+export default function robots(): MetadataRoute.Robots {
+ return {
+ rules: {
+ userAgent: "*",
+ allow: "/",
+ disallow: ["/dashboard/", "/gallery/"],
+ },
+ sitemap: `${BASE_URL}/sitemap.xml`,
+ };
+}
diff --git a/frontend/app/sitemap.ts b/frontend/app/sitemap.ts
new file mode 100644
index 0000000..73c55e9
--- /dev/null
+++ b/frontend/app/sitemap.ts
@@ -0,0 +1,43 @@
+import { BASE_URL } from "@/lib/constants";
+import type { MetadataRoute } from "next";
+
+export default function sitemap(): MetadataRoute.Sitemap {
+ return [
+ {
+ url: BASE_URL,
+ lastModified: new Date(),
+ changeFrequency: "yearly",
+ priority: 1,
+ },
+ {
+ url: `${BASE_URL}/about`,
+ lastModified: new Date(),
+ changeFrequency: "monthly",
+ priority: 0.8,
+ },
+ {
+ url: `${BASE_URL}/blog`,
+ lastModified: new Date(),
+ changeFrequency: "weekly",
+ priority: 0.5,
+ },
+ {
+ url: `${BASE_URL}/planning`,
+ lastModified: new Date(),
+ changeFrequency: "daily",
+ priority: 0.8,
+ },
+ {
+ url: `${BASE_URL}/gallery`,
+ lastModified: new Date(),
+ changeFrequency: "daily",
+ priority: 0.8,
+ },
+ {
+ url: `${BASE_URL}/contact`,
+ lastModified: new Date(),
+ changeFrequency: "yearly",
+ priority: 0.8,
+ },
+ ];
+}
diff --git a/frontend/components/article.tsx b/frontend/components/article.tsx
index 0b50a80..c8dfc68 100644
--- a/frontend/components/article.tsx
+++ b/frontend/components/article.tsx
@@ -13,8 +13,10 @@ const BlogArticle: React.FC<{ blog: Blog; user?: IUser }> = ({
blog,
user,
}) => {
+ const perms =
+ user && hasPermissions(user.roles, { blogs: ["update"] } as const);
const UpdateButton = () => {
- if (!user || !hasPermissions(user.roles, { blogs: ["update"] })) return;
+ if (!perms?.blogs.update) return;
return (
diff --git a/frontend/components/article/delete-button.tsx b/frontend/components/article/delete-button.tsx
index a27348b..f1900d7 100644
--- a/frontend/components/article/delete-button.tsx
+++ b/frontend/components/article/delete-button.tsx
@@ -11,14 +11,10 @@ import {
AlertDialogTitle,
} from "@/components/ui/alert-dialog";
import { Button } from "@/components/ui/button";
-import { Loader2, Trash2 } from "lucide-react";
-import { useState } from "react";
+import { Trash2 } from "lucide-react";
import hasPermissions from "@/lib/hasPermissions";
import IUser from "@/interfaces/IUser";
-import { useToast } from "@/hooks/use-toast";
-import { useRouter } from "next/navigation";
import request from "@/lib/request";
-import { ApiResponse } from "@/types/types";
interface DeleteArticleButtonProps {
id: string;
@@ -29,7 +25,9 @@ const DeleteArticleButton: React.FC = ({
id,
user,
}) => {
- if (!user || !hasPermissions(user.roles, { blogs: ["update"] })) {
+ const perms =
+ user && hasPermissions(user.roles, { blogs: ["delete"] } as const);
+ if (!perms?.blogs.delete) {
return null;
}
diff --git a/frontend/components/editor-menu.tsx b/frontend/components/editor/editor-menu.tsx
similarity index 83%
rename from frontend/components/editor-menu.tsx
rename to frontend/components/editor/editor-menu.tsx
index ca5dfd4..1bc3b09 100644
--- a/frontend/components/editor-menu.tsx
+++ b/frontend/components/editor/editor-menu.tsx
@@ -7,8 +7,6 @@ import {
AlignLeft,
AlignRight,
Bold,
- Code,
- Code2,
Heading1,
Heading2,
Heading3,
@@ -43,10 +41,14 @@ import {
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
-import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover";
-import { Label } from "./ui/label";
-import { Input } from "./ui/input";
-import { Switch } from "./ui/switch";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/ui/popover";
+import { Label } from "@/components/ui/label";
+import { Input } from "@/components/ui/input";
+import { Switch } from "@/components/ui/switch";
import { useState } from "react";
import {
Dialog,
@@ -55,12 +57,27 @@ import {
DialogFooter,
DialogHeader,
DialogTitle,
-} from "./ui/dialog";
+} from "@/components/ui/dialog";
+
+import { SizeOption } from "./extensions/marks";
interface EditorMenuProps {
editor: Editor | null;
}
+const sizeOptions: SizeOption[] = ["xs", "sm", "base", "lg", "xl"];
+const tailwindColors = [
+ { value: "default", label: "Default" }, // Changed from '' to "default"
+ { value: "gray-500", label: "Gray" },
+ { value: "red-500", label: "Red" },
+ { value: "yellow-500", label: "Yellow" },
+ { value: "green-500", label: "Green" },
+ { value: "blue-500", label: "Blue" },
+ { value: "indigo-500", label: "Indigo" },
+ { value: "purple-500", label: "Purple" },
+ { value: "pink-500", label: "Pink" },
+];
+
export function EditorMenu({ editor }: EditorMenuProps) {
if (!editor) {
return null;
@@ -70,6 +87,7 @@ export function EditorMenu({ editor }: EditorMenuProps) {
+ {/* Existing formatting toggles */}
Strikethrough
-
-
-
-
- editor
- .chain()
- .focus()
- .toggleCode()
- .run()
- }
- >
-
-
-
- Code
-
+ {/* Font Size Selector */}
+
+
+ {/* Text Color Selector */}
+ {/*
*/}
+
+
+
+ {/* Heading Selector */}