diff --git a/Modules/CCMS/app/Http/Controllers/EventController.php b/Modules/CCMS/app/Http/Controllers/EventController.php
new file mode 100644
index 0000000..fca8958
--- /dev/null
+++ b/Modules/CCMS/app/Http/Controllers/EventController.php
@@ -0,0 +1,147 @@
+ajax()) {
+ $model = Event::query()->orderBy('order');
+ return DataTables::eloquent($model)
+ ->addIndexColumn()
+ ->setRowClass('tableRow')
+ ->editColumn('image', function (Event $event) {
+ return $event->getRawOriginal('image') ? "" : '-';
+ })
+ ->editColumn('parent_id', function (Event $event) {
+ return $event->parent ? "{$event->parent?->title}" : '-';
+ })
+ ->editColumn('status', function (Event $event) {
+ $status = $event->status ? 'Published' : 'Draft';
+ $color = $event->status ? 'text-success' : 'text-danger';
+ return "
{$status}
"; + }) + ->addColumn('action', 'ccms::event.datatable.action') + ->rawColumns(['parent_id', 'image', 'status', 'action']) + ->toJson(); + } + + return view('ccms::event.index', [ + 'title' => 'Event List', + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $eventOptions = Event::where('status', 1)->pluck('title', 'id'); + return view('ccms::event.create', [ + 'title' => 'Create Event', + 'editable' => false, + 'eventOptions' => $eventOptions + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $maxOrder = Event::max('order'); + $order = $maxOrder ? ++$maxOrder : 1; + + $request->mergeIfMissing([ + 'slug' => Str::slug($request->title), + 'order' => $order, + ]); + + + + $validated = $request->validate([ + 'title' => 'required', + ]); + Event::create($request->all()); + flash()->success("Event has been created!"); + return redirect()->route('event.index'); + } + + /** + * Show the specified resource. + */ + public function show($id) + { + return view('ccms::show'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $eventOptions = Event::where('status', 1)->pluck('title', 'id'); + $event = Event::findOrFail($id); + return view('ccms::event.edit', [ + 'title' => 'Edit Event', + 'editable' => true, + 'event' => $event, + 'eventOptions' => $eventOptions + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id) + { + $request->merge([ + 'slug' => Str::slug($request->title), + ]); + $validated = $request->validate([]); + $event = Event::findOrFail($id); + $event->update($request->all()); + flash()->success("Event has been updated."); + return redirect()->back(); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + $event = Event::findOrFail($id); + $event->delete(); + return response()->json(['status' => 200, 'message' => "Event has been deleted."], 200); + } + + public function reorder(Request $request) + { + $events = Event::all(); + foreach ($events as $event) { + foreach ($request->order as $order) { + if ($order['id'] == $event->id) { + $event->update(['order' => $order['position']]); + } + } + } + return response(['status' => true, 'message' => 'Reordered successfully'], 200); + } + + public function toggle($id) + { + $event = Event::findOrFail($id); + $event->update(['status' => !$event->status]); + return response(['status' => 200, 'message' => 'Toggled successfully'], 200); + } +} diff --git a/Modules/CCMS/app/Http/Controllers/FranchiseController.php b/Modules/CCMS/app/Http/Controllers/FranchiseController.php new file mode 100644 index 0000000..b3575c8 --- /dev/null +++ b/Modules/CCMS/app/Http/Controllers/FranchiseController.php @@ -0,0 +1,116 @@ +ajax()) { + $model = Franchise::query()->latest(); + return DataTables::eloquent($model) + ->addIndexColumn() + ->addColumn('action', 'ccms::franchise.datatable.action') + ->rawColumns(['action']) + ->toJson(); + } + return view('ccms::franchise.index', [ + 'title' => 'Franchise List', + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + try { + $rules = [ + 'first_name' => 'required|string', + 'email' => 'required|email', + ]; + + if (setting('enable_reCaptcha') == 1) { + $rules['g-recaptcha-response'] = ['required', new Recaptcha]; + } + + $messages = [ + 'email.email' => 'Must be a valid email address.', + 'g-recaptcha-response.required' => 'Please complete reCAPTCHA validation.', + 'g-recaptcha-response' => 'Invalid reCAPTCHA.', + ]; + + $validator = Validator::make($request->all(), $rules, $messages); + if ($validator->fails()) { + return response()->json(['errors' => $validator->errors()], 422); + } + + Franchise::create($request->all()); + + return response()->json(['status' => 200, 'message' => "Thank you for reaching out! Your message has been received and we'll get back to you shortly."], 200); + } catch (\Exception $e) { + return response()->json(['status' => 500, 'message' => 'Internal server error', 'error' => $e->getMessage()], 500); + } + } + + /** + * Show the specified resource. + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + $franchise = Franchise::whereId($id)->first(); + if ($franchise) { + $franchise->delete(); + } + return response()->json(['status' => 200, 'message' => 'Franchise has been deleted!'], 200); + } catch (\Throwable $th) { + return redirect()->back()->with('error', $th->getMessage()); + } + } + +} diff --git a/Modules/CCMS/app/Http/Controllers/NewsletterController.php b/Modules/CCMS/app/Http/Controllers/NewsletterController.php new file mode 100644 index 0000000..db7f764 --- /dev/null +++ b/Modules/CCMS/app/Http/Controllers/NewsletterController.php @@ -0,0 +1,115 @@ +ajax()) { + $model = Newsletter::query()->latest(); + return DataTables::eloquent($model) + ->addIndexColumn() + ->addColumn('action', 'ccms::newsletter.datatable.action') + ->rawColumns(['action']) + ->toJson(); + } + return view('ccms::newsletter.index', [ + 'title' => 'Newsletter List', + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + try { + $rules = [ + 'email' => 'required|email', + ]; + + if (setting('enable_reCaptcha') == 1) { + $rules['g-recaptcha-response'] = ['required', new Recaptcha]; + } + + $messages = [ + 'email.email' => 'Must be a valid email address.', + 'g-recaptcha-response.required' => 'Please complete reCAPTCHA validation.', + 'g-recaptcha-response' => 'Invalid reCAPTCHA.', + ]; + + $validator = Validator::make($request->all(), $rules, $messages); + if ($validator->fails()) { + return response()->json(['errors' => $validator->errors()], 422); + } + + Newsletter::create($validator->validated()); + + return response()->json(['status' => 200, 'message' => "Thank you for reaching out! Your message has been received and we'll get back to you shortly."], 200); + } catch (\Exception $e) { + return response()->json(['status' => 500, 'message' => 'Internal server error', 'error' => $e->getMessage()], 500); + } + } + + /** + * Show the specified resource. + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + $newsletter = Newsletter::whereId($id)->first(); + if ($newsletter) { + $newsletter->delete(); + } + return response()->json(['status' => 200, 'message' => 'Newsletter has been deleted!'], 200); + } catch (\Throwable $th) { + return redirect()->back()->with('error', $th->getMessage()); + } + } + +} diff --git a/Modules/CCMS/app/Models/Event.php b/Modules/CCMS/app/Models/Event.php new file mode 100644 index 0000000..cb3322b --- /dev/null +++ b/Modules/CCMS/app/Models/Event.php @@ -0,0 +1,113 @@ + 'array', + ]; + } + + protected function images(): Attribute + { + return Attribute::make( + get: function ($value) { + if (empty($value)) { + return []; + } + + $parts = explode(',', $value); + return array_map(fn($part) => asset(trim($part)), $parts); + } + ); + } + + protected function image(): Attribute + { + return Attribute::make( + get: fn($value) => asset($value), + ); + } + + protected function banner(): Attribute + { + return Attribute::make( + get: fn($value) => asset($value), + ); + } + + protected function sidebarImage(): Attribute + { + return Attribute::make( + get: fn($value) => asset($value), + ); + } + + protected function iconImage(): Attribute + { + return Attribute::make( + get: fn($value) => asset($value), + ); + } + + public function children() + { + return $this->hasMany(Event::class, 'parent_id'); + } + + public function parent() + { + return $this->belongsTo(Event::class, 'parent_id'); + } + + public function documents() + { + return $this->morphMany(Document::class, 'documentable'); + } +} diff --git a/Modules/CCMS/app/Models/Franchise.php b/Modules/CCMS/app/Models/Franchise.php new file mode 100644 index 0000000..f7d7d3c --- /dev/null +++ b/Modules/CCMS/app/Models/Franchise.php @@ -0,0 +1,37 @@ +id(); + $table->string('email')->unique(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('newsletters'); + } +}; diff --git a/Modules/CCMS/database/migrations/2025_08_21_165829_create_franchises_table.php b/Modules/CCMS/database/migrations/2025_08_21_165829_create_franchises_table.php new file mode 100644 index 0000000..757e355 --- /dev/null +++ b/Modules/CCMS/database/migrations/2025_08_21_165829_create_franchises_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('first_name')->nullable(); + $table->string('last_name')->nullable(); + $table->string('email')->nullable(); + $table->string('phone')->nullable(); + $table->string('address')->nullable(); + $table->string('city')->nullable(); + $table->string('state')->nullable(); + $table->string('invest_level')->nullable(); + $table->string('own_business')->nullable(); + $table->text('yes_own_des')->nullable(); + $table->string('franchise_location')->nullable(); + $table->string('start_time_frame')->nullable(); + $table->string('office_setup')->nullable(); + $table->string('website')->nullable(); + $table->timestamps(); + }); + } + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('franchises'); + } +}; diff --git a/Modules/CCMS/database/migrations/2025_08_22_044129_create_events_table.php b/Modules/CCMS/database/migrations/2025_08_22_044129_create_events_table.php new file mode 100644 index 0000000..3f69e09 --- /dev/null +++ b/Modules/CCMS/database/migrations/2025_08_22_044129_create_events_table.php @@ -0,0 +1,58 @@ +id(); + $table->text('title'); + $table->text('slug')->nullable(); + $table->text('short_description')->nullable(); + $table->longText('description')->nullable(); + $table->json('custom')->nullable(); + $table->integer('parent_id')->unsigned()->nullable(); + + $table->string('image')->nullable(); + $table->string('banner')->nullable(); + + $table->text('images')->nullable(); + $table->date('start_date')->nullable(); + $table->date('end_date')->nullable(); + $table->text('meta_title')->nullable(); + $table->text('meta_description')->nullable(); + $table->text('meta_keywords')->nullable(); + + $table->text('sidebar_title')->nullable(); + $table->mediumText('sidebar_content')->nullable(); + $table->string('sidebar_image')->nullable(); + + $table->string('button_text')->nullable(); + $table->string('button_url')->nullable(); + $table->string('button_target')->nullable(); + + $table->integer('status')->default(1); + $table->string('icon_class')->nullable(); + $table->string('icon_image')->nullable(); + $table->integer('createdby')->unsigned()->nullable(); + $table->integer('updatedby')->unsigned()->nullable(); + $table->integer('order')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('events'); + } +}; diff --git a/Modules/CCMS/resources/views/event/create.blade.php b/Modules/CCMS/resources/views/event/create.blade.php new file mode 100644 index 0000000..a5faed8 --- /dev/null +++ b/Modules/CCMS/resources/views/event/create.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.app') +@section('content') +