From dab36058a3f3d26d8270de640232afb082e54ba8 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Thu, 23 Jul 2026 22:13:37 +0330 Subject: [PATCH] feat(blog): add representation blog management features including listing, creating, and editing blogs --- assets/admin/App.tsx | 5 + assets/admin/components/BlogSeoFields.tsx | 115 ++++++++++++ assets/admin/components/layout/Sidebar.tsx | 10 + assets/admin/pages/BlogFormPage.tsx | 149 +++++++-------- .../pages/RepresentationBlogFormPage.tsx | 176 ++++++++++++++++++ .../admin/pages/RepresentationBlogsPage.tsx | 87 +++++++++ docs/api/blog.md | 1 + .../RepresentationBlogController.php | 9 + tests/Blog/BlogV2FieldsTest.php | 19 ++ 9 files changed, 485 insertions(+), 86 deletions(-) create mode 100644 assets/admin/components/BlogSeoFields.tsx create mode 100644 assets/admin/pages/RepresentationBlogFormPage.tsx create mode 100644 assets/admin/pages/RepresentationBlogsPage.tsx diff --git a/assets/admin/App.tsx b/assets/admin/App.tsx index 584b86aa..74daca40 100644 --- a/assets/admin/App.tsx +++ b/assets/admin/App.tsx @@ -39,6 +39,8 @@ import FinancialReportPage from './pages/FinancialReportPage'; import RepresentationSettlementPage from './pages/RepresentationSettlementPage'; import RepresentationFinancePage from './pages/RepresentationFinancePage'; import RepresentationProfilePage from './pages/RepresentationProfilePage'; +import RepresentationBlogsPage from './pages/RepresentationBlogsPage'; +import RepresentationBlogFormPage from './pages/RepresentationBlogFormPage'; import DoctorProfilePage from './pages/DoctorProfilePage'; import MyPatientsPage from './pages/MyPatientsPage'; import MyPaymentsPage from './pages/MyPaymentsPage'; @@ -223,6 +225,9 @@ export default function App() { } /> } /> } /> + } /> + } /> + } /> } /> } /> } /> diff --git a/assets/admin/components/BlogSeoFields.tsx b/assets/admin/components/BlogSeoFields.tsx new file mode 100644 index 00000000..a750a2f7 --- /dev/null +++ b/assets/admin/components/BlogSeoFields.tsx @@ -0,0 +1,115 @@ +import { Controller, useFieldArray } from 'react-hook-form'; +import type { Control, UseFormRegister } from 'react-hook-form'; +import type { BlogFormData } from '../lib/blogForm'; +import PersianDatePicker from './ui/PersianDatePicker'; + +interface Props { + control: Control; + register: UseFormRegister; +} + +/** SEO + FAQ + scheduling fields, shared by admin and representative blog forms. */ +export default function BlogSeoFields({ control, register }: Props) { + const { fields, append, remove } = useFieldArray({ control, name: 'faq' }); + + return ( +
+

سئو و زمان‌بندی

+ +
+ + +
+ +
+ +