@arch-cadre/blog-module 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -5
- package/src/actions/index.d.ts +67 -0
- package/src/actions/index.js +149 -0
- package/src/actions/index.ts +157 -0
- package/src/components/BlogStatsWidget.d.ts +1 -0
- package/src/components/BlogStatsWidget.js +17 -0
- package/src/components/BlogStatsWidget.tsx +46 -0
- package/src/components/RecentCommentsWidget.d.ts +1 -0
- package/src/components/RecentCommentsWidget.js +24 -0
- package/src/components/RecentCommentsWidget.tsx +71 -0
- package/src/components/RecentPostsWidget.d.ts +1 -0
- package/src/components/RecentPostsWidget.js +24 -0
- package/src/components/RecentPostsWidget.tsx +68 -0
- package/src/components/ui/button.d.ts +11 -0
- package/src/components/ui/button.js +33 -0
- package/src/components/ui/button.tsx +56 -0
- package/src/components/ui/card.d.ts +6 -0
- package/src/components/ui/card.js +12 -0
- package/src/components/ui/card.tsx +51 -0
- package/src/components/ui/input.d.ts +5 -0
- package/src/components/ui/input.js +8 -0
- package/src/components/ui/input.tsx +24 -0
- package/src/components/ui/table.d.ts +8 -0
- package/src/components/ui/table.js +16 -0
- package/src/components/ui/table.tsx +83 -0
- package/src/components/ui/textarea.d.ts +5 -0
- package/src/components/ui/textarea.js +8 -0
- package/src/components/ui/textarea.tsx +23 -0
- package/src/index.d.ts +3 -0
- package/src/index.js +98 -0
- package/src/index.ts +121 -0
- package/src/intl.d.ts +7 -0
- package/src/lib/utils.d.ts +2 -0
- package/src/lib/utils.js +5 -0
- package/src/lib/utils.ts +6 -0
- package/src/lib/validation.d.ts +24 -0
- package/src/lib/validation.js +11 -0
- package/src/lib/validation.ts +13 -0
- package/src/navigation.d.ts +2 -0
- package/src/navigation.js +21 -0
- package/src/navigation.ts +23 -0
- package/src/routes.d.ts +3 -0
- package/src/routes.js +55 -0
- package/src/routes.tsx +74 -0
- package/src/schema.d.ts +736 -0
- package/src/schema.js +60 -0
- package/src/schema.ts +67 -0
- package/src/styles/globals.css +123 -0
- package/src/ui/views.d.ts +15 -0
- package/src/ui/views.js +119 -0
- package/src/ui/views.tsx +538 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
// --- Validation Schemas ---
|
|
4
|
+
export const postSchema = z.object({
|
|
5
|
+
title: z.string().min(3, "Title must be at least 3 characters"),
|
|
6
|
+
content: z.string().min(10, "Content must be at least 10 characters"),
|
|
7
|
+
slug: z.string().min(3, "Slug is required"),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export const commentSchema = z.object({
|
|
11
|
+
content: z.string().min(2, "Comment is too short"),
|
|
12
|
+
postId: z.string().uuid(),
|
|
13
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { i18n } from "@arch-cadre/intl";
|
|
2
|
+
export const navigation = {
|
|
3
|
+
public: [
|
|
4
|
+
{
|
|
5
|
+
title: i18n("Blog"),
|
|
6
|
+
url: "/blog",
|
|
7
|
+
icon: "solar:pen-2-broken",
|
|
8
|
+
},
|
|
9
|
+
],
|
|
10
|
+
admin: {
|
|
11
|
+
[i18n("CMS")]: [
|
|
12
|
+
{
|
|
13
|
+
title: i18n("Blog Manager"),
|
|
14
|
+
url: "/blog",
|
|
15
|
+
icon: "solar:posts-carousel-vertical-broken",
|
|
16
|
+
roles: ["admin"],
|
|
17
|
+
permissions: ["post:create", "post:update", "post:delete"],
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { i18n } from "@arch-cadre/intl";
|
|
2
|
+
import type { ModuleNavigation } from "@arch-cadre/modules";
|
|
3
|
+
|
|
4
|
+
export const navigation: ModuleNavigation = {
|
|
5
|
+
public: [
|
|
6
|
+
{
|
|
7
|
+
title: i18n("Blog"),
|
|
8
|
+
url: "/blog",
|
|
9
|
+
icon: "solar:pen-2-broken",
|
|
10
|
+
},
|
|
11
|
+
],
|
|
12
|
+
admin: {
|
|
13
|
+
[i18n("CMS")]: [
|
|
14
|
+
{
|
|
15
|
+
title: i18n("Blog Manager"),
|
|
16
|
+
url: "/blog",
|
|
17
|
+
icon: "solar:posts-carousel-vertical-broken",
|
|
18
|
+
roles: ["admin"],
|
|
19
|
+
permissions: ["post:create", "post:update", "post:delete"],
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
};
|
package/src/routes.d.ts
ADDED
package/src/routes.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getCurrentSession } from "@arch-cadre/core/server";
|
|
3
|
+
import { getComments, getPostById, getPostBySlug, getPosts } from "./actions/index.js";
|
|
4
|
+
import { BlogAdminPage, BlogListPage, CreatePostForm, EditPostForm, PostDetailPage, } from "./ui/views.js";
|
|
5
|
+
export const publicRoutes = [
|
|
6
|
+
{
|
|
7
|
+
path: "/blog",
|
|
8
|
+
component: async () => {
|
|
9
|
+
const posts = await getPosts();
|
|
10
|
+
return _jsx(BlogListPage, { posts: posts });
|
|
11
|
+
},
|
|
12
|
+
auth: false,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
path: "/blog/:slug",
|
|
16
|
+
component: async ({ params }) => {
|
|
17
|
+
const { slug } = await params;
|
|
18
|
+
const post = await getPostBySlug(slug);
|
|
19
|
+
const comments = post ? await getComments(post.id) : [];
|
|
20
|
+
const session = await getCurrentSession();
|
|
21
|
+
return (_jsx(PostDetailPage, { post: post, comments: comments, currentUser: session?.user }));
|
|
22
|
+
},
|
|
23
|
+
auth: false,
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
export const privateRoutes = [
|
|
27
|
+
{
|
|
28
|
+
path: "/blog",
|
|
29
|
+
component: async () => {
|
|
30
|
+
const posts = await getPosts();
|
|
31
|
+
return _jsx(BlogAdminPage, { posts: posts });
|
|
32
|
+
},
|
|
33
|
+
auth: true,
|
|
34
|
+
roles: ["admin"],
|
|
35
|
+
permissions: ["post:create", "post:update", "post:delete"],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
path: "/blog/new",
|
|
39
|
+
component: CreatePostForm,
|
|
40
|
+
auth: true,
|
|
41
|
+
roles: ["admin"],
|
|
42
|
+
permissions: ["post:create"],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
path: "/blog/edit/:id",
|
|
46
|
+
component: async ({ params }) => {
|
|
47
|
+
const { id } = await params;
|
|
48
|
+
const post = await getPostById(id);
|
|
49
|
+
return _jsx(EditPostForm, { post: post });
|
|
50
|
+
},
|
|
51
|
+
auth: true,
|
|
52
|
+
roles: ["admin"],
|
|
53
|
+
permissions: ["post:update"],
|
|
54
|
+
},
|
|
55
|
+
];
|
package/src/routes.tsx
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { getCurrentSession } from "@arch-cadre/core/server";
|
|
2
|
+
import type {
|
|
3
|
+
PrivateRouteDefinition,
|
|
4
|
+
PublicRouteDefinition,
|
|
5
|
+
} from "@arch-cadre/modules";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { getComments, getPostById, getPostBySlug, getPosts } from "./actions/index.js";
|
|
8
|
+
import {
|
|
9
|
+
BlogAdminPage,
|
|
10
|
+
BlogListPage,
|
|
11
|
+
CreatePostForm,
|
|
12
|
+
EditPostForm,
|
|
13
|
+
PostDetailPage,
|
|
14
|
+
} from "./ui/views.js";
|
|
15
|
+
|
|
16
|
+
export const publicRoutes: PublicRouteDefinition[] = [
|
|
17
|
+
{
|
|
18
|
+
path: "/blog",
|
|
19
|
+
component: async () => {
|
|
20
|
+
const posts = await getPosts();
|
|
21
|
+
return <BlogListPage posts={posts} />;
|
|
22
|
+
},
|
|
23
|
+
auth: false,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
path: "/blog/:slug",
|
|
27
|
+
component: async ({ params }: any) => {
|
|
28
|
+
const { slug } = await params;
|
|
29
|
+
const post = await getPostBySlug(slug);
|
|
30
|
+
const comments = post ? await getComments(post.id) : [];
|
|
31
|
+
const session = await getCurrentSession();
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<PostDetailPage
|
|
35
|
+
post={post}
|
|
36
|
+
comments={comments}
|
|
37
|
+
currentUser={session?.user}
|
|
38
|
+
/>
|
|
39
|
+
);
|
|
40
|
+
},
|
|
41
|
+
auth: false,
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
export const privateRoutes: PrivateRouteDefinition[] = [
|
|
46
|
+
{
|
|
47
|
+
path: "/blog",
|
|
48
|
+
component: async () => {
|
|
49
|
+
const posts = await getPosts();
|
|
50
|
+
return <BlogAdminPage posts={posts} />;
|
|
51
|
+
},
|
|
52
|
+
auth: true,
|
|
53
|
+
roles: ["admin"],
|
|
54
|
+
permissions: ["post:create", "post:update", "post:delete"],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
path: "/blog/new",
|
|
58
|
+
component: CreatePostForm,
|
|
59
|
+
auth: true,
|
|
60
|
+
roles: ["admin"],
|
|
61
|
+
permissions: ["post:create"],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
path: "/blog/edit/:id",
|
|
65
|
+
component: async ({ params }: any) => {
|
|
66
|
+
const { id } = await params;
|
|
67
|
+
const post = await getPostById(id);
|
|
68
|
+
return <EditPostForm post={post} />;
|
|
69
|
+
},
|
|
70
|
+
auth: true,
|
|
71
|
+
roles: ["admin"],
|
|
72
|
+
permissions: ["post:update"],
|
|
73
|
+
},
|
|
74
|
+
];
|