diff --git a/app/Config/Routes.php b/app/Config/Routes.php index c14afab..c757f90 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -244,6 +244,7 @@ $routes->group('admin', ['filter' => 'adminAuth'], static function ($routes): vo // 사용자 의견 검토 $routes->get('feedback', 'Admin\Feedback::index'); + $routes->get('feedback/all', 'Admin\Feedback::all'); $routes->get('feedback/image/(:num)', 'Admin\Feedback::image/$1'); $routes->get('feedback/file/(:num)', 'Admin\Feedback::file/$1'); $routes->get('feedback/(:num)', 'Admin\Feedback::show/$1'); diff --git a/app/Controllers/Admin/Feedback.php b/app/Controllers/Admin/Feedback.php index 2877d14..2cf229d 100644 --- a/app/Controllers/Admin/Feedback.php +++ b/app/Controllers/Admin/Feedback.php @@ -54,6 +54,48 @@ class Feedback extends BaseController ]); } + /** + * 전체 의견을 한 페이지에서 스크롤로 훑어볼 수 있는 화면(상세 클릭 없이 내용 전체 표시). + */ + public function all(): string + { + $model = model(FeedbackModel::class); + $builder = $model->orderBy('fb_idx', 'DESC'); + + $scope = $this->scopeLgIdx(); + if ($scope !== null) { + $builder->where('fb_lg_idx', $scope); + } + + $status = (string) ($this->request->getGet('status') ?? ''); + if (in_array($status, FeedbackModel::STATUSES, true)) { + $builder->where('fb_status', $status); + } + + $list = $builder->findAll(); + + $ids = array_map(static fn ($r): int => (int) $r->fb_idx, $list); + $filesByFb = []; + if ($ids !== []) { + $files = model(FeedbackFileModel::class) + ->whereIn('ff_fb_idx', $ids) + ->orderBy('ff_idx', 'ASC') + ->findAll(); + foreach ($files as $f) { + $filesByFb[(int) $f->ff_fb_idx][] = $f; + } + } + + return view('admin/layout', [ + 'title' => '사용자 의견 · 전체보기', + 'content' => view('admin/feedback/all', [ + 'list' => $list, + 'filesByFb' => $filesByFb, + 'status' => $status, + ]), + ]); + } + public function show(int $id): string|ResponseInterface { $model = model(FeedbackModel::class); @@ -91,6 +133,12 @@ class Feedback extends BaseController } $model->update($id, $update); + // 전체보기 화면에서 저장한 경우 스크롤 위치(#fb-{id})를 유지한 채 그 화면으로 되돌아간다. + $returnTo = (string) $this->request->getPost('return_to'); + if ($returnTo === 'all') { + return redirect()->to(site_url('admin/feedback/all') . '#fb-' . $id)->with('success', '처리 상태를 저장했습니다.'); + } + return redirect()->to(site_url('admin/feedback/' . $id))->with('success', '처리 상태를 저장했습니다.'); } diff --git a/app/Views/admin/feedback/all.php b/app/Views/admin/feedback/all.php new file mode 100644 index 0000000..41e6b4b --- /dev/null +++ b/app/Views/admin/feedback/all.php @@ -0,0 +1,105 @@ + $list + * @var array> $filesByFb + * @var string $status + */ +use App\Models\FeedbackModel; + +$list = $list ?? []; +$filesByFb = $filesByFb ?? []; +$status = (string) ($status ?? ''); +$badge = static function (string $s): string { + $map = [ + 'new' => 'bg-blue-50 text-blue-700', + 'in_progress' => 'bg-amber-50 text-amber-700', + 'done' => 'bg-emerald-50 text-emerald-700', + 'hold' => 'bg-gray-100 text-gray-500', + ]; + $c = $map[$s] ?? 'bg-gray-100 text-gray-600'; + return '' . esc(FeedbackModel::statusLabel($s)) . ''; +}; +?> +
+ 사용자 의견 · 전체보기 (건) +
+
+ +
+ 목록형으로 보기 +
+
+ + +
접수된 의견이 없습니다.
+ + + +
+ +
+ +
+ fb_idx; $files = $filesByFb[$fid] ?? []; ?> +
+
+
+ # + fb_status ?? 'new')) ?> + fb_regdate ?? '')) ?> + · + fb_mb_name ?? '')) ?> +
+
+ fb_page_title ?: '-')) ?> + · fb_page_url ?: '')) ?> +
+
+ +
+
+

fb_content) ?>

+ + +
+ + + 첨부 이미지 + + +
+ +
+ +
+ + +
+ + 상세 +
+ + +
+
+
+ +
+ diff --git a/app/Views/admin/feedback/index.php b/app/Views/admin/feedback/index.php index 18fc224..ade177a 100644 --- a/app/Views/admin/feedback/index.php +++ b/app/Views/admin/feedback/index.php @@ -21,14 +21,17 @@ $badge = static function (string $s): string { ?>
사용자 의견 -
- -
+
+
+ +
+ 전체보기(스크롤) +