feat: add content showcase feature to rate card profiles with PDF rendering support

This commit is contained in:
I-Fun
2026-04-05 23:43:33 +07:00
parent 47dfc7cc95
commit 1c73279e52
7 changed files with 453 additions and 174 deletions

View File

@@ -103,7 +103,8 @@ class RateCardController extends Controller
public function profilePage(): View
{
$profile = RateCardProfile::getSingleton();
return view('rate-cards.profile', compact('profile'));
$mediaFiles = \App\Models\MediaFile::latest()->get();
return view('rate-cards.profile', compact('profile', 'mediaFiles'));
}
public function profileUpdate(Request $request): RedirectResponse
@@ -125,6 +126,11 @@ class RateCardController extends Controller
'brand_logo_size' => 'nullable|in:small,medium,large',
'contact_person_html' => 'nullable|string',
'logo' => 'nullable|image|max:2048',
'content_showcase' => 'nullable|array',
'content_showcase.*.file_id' => 'required_with:content_showcase|string',
'content_showcase.*.name' => 'required_with:content_showcase|string|max:255',
'content_showcase.*.url' => 'nullable|url',
'content_showcase.*.thumbnail_path' => 'nullable|string',
]);
$profile = RateCardProfile::getSingleton();
@@ -135,6 +141,7 @@ class RateCardController extends Controller
}
$validated['show_prices'] = $request->has('show_prices');
$validated['content_showcase'] = $request->input('content_showcase', []);
unset($validated['logo']);
$profile->update($validated);
@@ -221,6 +228,17 @@ class RateCardController extends Controller
// ── PDF Download ─────────────────────────────────────────────
public function uploadShowcaseThumbnail(Request $request)
{
$request->validate(['thumbnail' => 'required|image|max:2048']);
$path = $request->file('thumbnail')->store('showcase', 'public');
return response()->json([
'path' => $path,
'url' => asset('storage/' . $path)
]);
}
public function pdf(): \Illuminate\Http\Response
{
$profile = RateCardProfile::getSingleton();

View File

@@ -17,11 +17,13 @@ class RateCardProfile extends Model
'past_brands',
'brand_logo_size',
'contact_person_html',
'content_showcase',
];
protected $casts = [
'show_prices' => 'boolean',
'past_brands' => 'array',
'content_showcase' => 'array',
];
/** Get the singleton profile, creating defaults if needed */