From 8be0d57e16ac776fbd185610f6342fc15b7215e9 Mon Sep 17 00:00:00 2001
From: Yoga Pangestu
Date: Mon, 31 Aug 2026 16:09:54 +0700
Subject: [PATCH] feat: add create and edit feedback functionality with
corresponding UI components
---
.../Controllers/Admin/FeedbackController.php | 17 ++
resources/js/pages/admin/feedback/create.tsx | 126 ++++++++++++
resources/js/pages/admin/feedback/edit.tsx | 128 ++++++++++++
resources/js/pages/admin/feedback/index.tsx | 188 ++----------------
routes/admin.php | 6 +-
5 files changed, 294 insertions(+), 171 deletions(-)
create mode 100644 resources/js/pages/admin/feedback/create.tsx
create mode 100644 resources/js/pages/admin/feedback/edit.tsx
diff --git a/app/Http/Controllers/Admin/FeedbackController.php b/app/Http/Controllers/Admin/FeedbackController.php
index dd300fe..a6e4832 100644
--- a/app/Http/Controllers/Admin/FeedbackController.php
+++ b/app/Http/Controllers/Admin/FeedbackController.php
@@ -36,6 +36,13 @@ public function index(PaginatedRequest $request): Response
]);
}
+ public function create(): Response
+ {
+ return Inertia::render('admin/feedback/create', [
+ 'types' => FeedbackType::options(),
+ ]);
+ }
+
public function store(FeedbackRequest $request): RedirectResponse
{
$this->service->create($request->user(), $request->validated());
@@ -45,6 +52,16 @@ public function store(FeedbackRequest $request): RedirectResponse
return to_route('admin.feedback.index');
}
+ public function edit(Request $request, Feedback $feedback): Response
+ {
+ abort_unless($feedback->user_id === $request->user()->id, 403);
+
+ return Inertia::render('admin/feedback/edit', [
+ 'feedback' => $feedback,
+ 'types' => FeedbackType::options(),
+ ]);
+ }
+
public function update(FeedbackRequest $request, Feedback $feedback): RedirectResponse
{
abort_unless($feedback->user_id === $request->user()->id, 403);
diff --git a/resources/js/pages/admin/feedback/create.tsx b/resources/js/pages/admin/feedback/create.tsx
new file mode 100644
index 0000000..423017a
--- /dev/null
+++ b/resources/js/pages/admin/feedback/create.tsx
@@ -0,0 +1,126 @@
+import { Form, Head, Link } from '@inertiajs/react';
+import { ArrowLeft, Save } from 'lucide-react';
+import { useState } from 'react';
+import InputError from '@/components/input-error';
+import { PageHeader } from '@/components/page-header';
+import TiptapEditor from '@/components/rich-text-editor';
+import { Button } from '@/components/ui/button';
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+import { index, store } from '@/routes/admin/feedback';
+
+type FeedbackTypeOption = { value: string; label: string };
+
+type Props = {
+ types: FeedbackTypeOption[];
+};
+
+export default function FeedbackCreate({ types }: Props) {
+ const [message, setMessage] = useState('');
+
+ return (
+ <>
+
+
+
+
+
+
+ Kembali
+
+
+ }
+ />
+
+
+
+ >
+ );
+}
diff --git a/resources/js/pages/admin/feedback/edit.tsx b/resources/js/pages/admin/feedback/edit.tsx
new file mode 100644
index 0000000..2ca550b
--- /dev/null
+++ b/resources/js/pages/admin/feedback/edit.tsx
@@ -0,0 +1,128 @@
+import { Form, Head, Link } from '@inertiajs/react';
+import { ArrowLeft, Save } from 'lucide-react';
+import { useState } from 'react';
+import InputError from '@/components/input-error';
+import { PageHeader } from '@/components/page-header';
+import TiptapEditor from '@/components/rich-text-editor';
+import { Button } from '@/components/ui/button';
+import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+import { index, update } from '@/routes/admin/feedback';
+import type { Feedback } from '@/types/feedback';
+
+type FeedbackTypeOption = { value: string; label: string };
+
+type Props = {
+ feedback: Feedback;
+ types: FeedbackTypeOption[];
+};
+
+export default function FeedbackEdit({ feedback, types }: Props) {
+ const [message, setMessage] = useState(feedback.message);
+
+ return (
+ <>
+