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') ? "{$event->title}" : '-'; + }) + ->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') + +
+ @if ($errors->any()) + + @endif +
+
+ {{ html()->form('POST')->route('event.store')->class('needs-validation')->attributes(['novalidate'])->open() }} + @include('ccms::event.partials._form') + {{ html()->form()->close() }} +
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/event/datatable/action.blade.php b/Modules/CCMS/resources/views/event/datatable/action.blade.php new file mode 100644 index 0000000..0d3ddd6 --- /dev/null +++ b/Modules/CCMS/resources/views/event/datatable/action.blade.php @@ -0,0 +1,12 @@ +
+ + + + + + +
diff --git a/Modules/CCMS/resources/views/event/edit.blade.php b/Modules/CCMS/resources/views/event/edit.blade.php new file mode 100644 index 0000000..4716a97 --- /dev/null +++ b/Modules/CCMS/resources/views/event/edit.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.app') +@section('content') + +
+ @if ($errors->any()) + + @endif +
+
+ {{ html()->modelForm($event, 'PUT')->route('event.update', $event->id)->class('needs-validation')->attributes(['novalidate'])->open() }} + @include('ccms::event.partials._form') + {{ html()->closeModelForm() }} +
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/event/index.blade.php b/Modules/CCMS/resources/views/event/index.blade.php new file mode 100644 index 0000000..a2a19fc --- /dev/null +++ b/Modules/CCMS/resources/views/event/index.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.app') + +@section('content') +
+ + @if ($errors->any()) + + @endif + +
+
+
+
+
{{ $title }}
+ Create +
+
+ @php + $columns = [ + [ + 'title' => 'S.N', + 'data' => 'DT_RowIndex', + 'name' => 'DT_RowIndex', + 'orderable' => false, + 'searchable' => false, + 'sortable' => false, + ], + ['title' => 'Image', 'data' => 'image', 'name' => 'image'], + ['title' => 'Parent', 'data' => 'parent_id', 'name' => 'parent_ids'], + ['title' => 'Title', 'data' => 'title', 'name' => 'title'], + ['title' => 'Start Date', 'data' => 'start_date', 'name' => 'start_date'], + ['title' => 'End Date', 'data' => 'end_date', 'name' => 'end_date'], + ['title' => 'Slug', 'data' => 'slug', 'name' => 'slug'], + ['title' => 'Status', 'data' => 'status', 'name' => 'status'], + [ + 'title' => 'Action', + 'data' => 'action', + 'orderable' => false, + 'searchable' => false, + ], + ]; + @endphp + +
+
+
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/event/partials/_form.blade.php b/Modules/CCMS/resources/views/event/partials/_form.blade.php new file mode 100644 index 0000000..292fda3 --- /dev/null +++ b/Modules/CCMS/resources/views/event/partials/_form.blade.php @@ -0,0 +1,196 @@ +
+
+
+
+
+
+ {{ html()->label('Title')->class('form-label')->for('title') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('title')->class('form-control')->placeholder('Enter Event Title')->required(true) }} +
+ +
+ {{ html()->label('Start Date')->class('form-label') }} +
+ {{ html()->text('start_date')->class('form-control')->id('event-start-date')->placeholder('Event Start Date')->attributes([ + 'data-provider' => 'flatpickr', + 'data-date-format' => 'Y-m-d', + 'data-enable-time' => '', + ])->required() }} + +
+
+ +
+ {{ html()->label('End Date')->class('form-label') }} +
+ {{ html()->text('end_date')->class('form-control')->id('event-end-date')->placeholder('Event End Date')->attributes([ + 'data-provider' => 'flatpickr', + 'data-date-format' => 'Y-m-d', + 'data-enable-time' => '', + ]) }} + +
+
+ +
+ {{ html()->label('Description (Short)')->class('form-label')->for('short_description') }} + {{ html()->textarea('short_description')->class('form-control')->placeholder('Enter Description (Short)')->rows(5) }} +
+ +
+ {{ html()->label('Description')->class('form-label')->for('description') }} + {{ html()->textarea('description')->class('form-control ckeditor-classic')->placeholder('Enter Description') }} +
+
+
+
+ + + +
+
+
Meta
+
+
+
+
+ {{ html()->label('Meta Title')->class('form-label')->for('meta_title') }} + {{ html()->text('meta_title')->class('form-control mb-3')->placeholder('Meta Title') }} +
+
+ {{ html()->label('Meta Keywords')->class('form-label')->for('meta_keywords') }} + {{ html()->textarea('meta_keywords')->class('form-control mb-3')->placeholder('Meta Keywords') }} +
+ +
+ {{ html()->label('Meta Description')->class('form-label')->for('meta_description') }} + {{ html()->textarea('meta_description')->class('form-control mb-3')->placeholder('Meta wire:Description')->rows(3) }} +
+
+
+
+
+ +
+
+
+
+ Published +
+
+
+ {{ html()->label('Status')->class('form-label visually-hidden')->for('status') }} + {{ html()->select('status', config('constants.page_status_options'))->class('form-select choices-select') }} +
+ + +
+ +
+
+
+ Page Attributes +
+
+
+ {{ html()->label('Parent Event')->class('form-label')->for('parent_id') }} + {{ html()->select('parent_id', $eventOptions ?? [])->value($event->parent_id ?? old('parent_id'))->class('form-select choices-select')->placeholder('Select') }} +
+
+ + + + + + + + + + +
+
+
Button
+
+
+
+
+ {{ html()->label('Text')->class('form-label')->for('button_text') }} + {{ html()->text('button_text')->class('form-control') }} +
+
+ {{ html()->label('Link')->class('form-label')->for('button_url') }} + {{ html()->text('button_url')->class('form-control')->placeholder('Button Link') }} +
+ +
+ {{ html()->label('Target')->class('form-label')->for('button_target') }} + {{ html()->select('button_target', config('constants.redirect_options'))->class('form-select choices-select') }} +
+
+
+
+
+
diff --git a/Modules/CCMS/resources/views/franchise/create.blade.php b/Modules/CCMS/resources/views/franchise/create.blade.php new file mode 100644 index 0000000..b386130 --- /dev/null +++ b/Modules/CCMS/resources/views/franchise/create.blade.php @@ -0,0 +1,14 @@ +@extends('layouts.app') +@section('content') +
+ + + + {{ html()->form('POST')->route('testimonial.store')->class(['needs-validation'])->attributes(['enctype' => 'multipart/form-data', 'novalidate'])->open() }} + + @include('ccms::testimonial.partials._form') + + {{ html()->form()->close() }} + +
+@endsection diff --git a/Modules/CCMS/resources/views/franchise/datatable/action.blade.php b/Modules/CCMS/resources/views/franchise/datatable/action.blade.php new file mode 100644 index 0000000..e220d39 --- /dev/null +++ b/Modules/CCMS/resources/views/franchise/datatable/action.blade.php @@ -0,0 +1,10 @@ +
+ + {{-- --}} + + + + + +
diff --git a/Modules/CCMS/resources/views/franchise/edit.blade.php b/Modules/CCMS/resources/views/franchise/edit.blade.php new file mode 100644 index 0000000..5d96439 --- /dev/null +++ b/Modules/CCMS/resources/views/franchise/edit.blade.php @@ -0,0 +1,14 @@ +@extends('layouts.app') +@section('content') +
+ + + + {{ html()->modelForm($testimonial, 'PUT')->route('testimonial.update', $testimonial->id)->class(['needs-validation'])->attributes(['novalidate'])->open() }} + + @include('ccms::testimonial.partials._form') + + {{ html()->form()->close() }} + +
+@endsection diff --git a/Modules/CCMS/resources/views/franchise/index.blade.php b/Modules/CCMS/resources/views/franchise/index.blade.php new file mode 100644 index 0000000..18a4159 --- /dev/null +++ b/Modules/CCMS/resources/views/franchise/index.blade.php @@ -0,0 +1,41 @@ +@extends('layouts.app') +@section('content') +
+ +
+
+
{{ $title }}
+
+
+ @php + $columns = [ + [ + 'title' => 'S.N', + 'data' => 'DT_RowIndex', + 'name' => 'DT_RowIndex', + 'orderable' => false, + 'searchable' => false, + 'sortable' => false, + ], + ['title' => 'First Name', 'data' => 'name', 'first_name' => 'first_name'], + ['title' => 'Last Name', 'data' => 'name', 'first_name' => 'first_name'], + ['title' => 'Email', 'data' => 'email', 'name' => 'email'], + ['title' => 'Phone', 'data' => 'phone', 'name' => 'phone'], + ['title' => 'Address', 'data' => 'address', 'name' => 'address'], + ['title' => 'City', 'data' => 'city', 'name' => 'city'], + ['title' => 'State', 'data' => 'state', 'name' => 'state'], + ['title' => 'Invest Level', 'data' => 'invest_level', 'name' => 'invest_level'], + ['title' => 'Franchise Location', 'data' => 'franchise_location', 'name' => 'franchise_location'], + [ + 'title' => 'Action', + 'data' => 'action', + 'orderable' => false, + 'searchable' => false, + ], + ]; + @endphp + +
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/franchise/partials/_form.blade.php b/Modules/CCMS/resources/views/franchise/partials/_form.blade.php new file mode 100644 index 0000000..d2b7a04 --- /dev/null +++ b/Modules/CCMS/resources/views/franchise/partials/_form.blade.php @@ -0,0 +1,71 @@ +
+
+
+
+
+
+ {{ html()->label('Name')->class('form-label') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('title')->class('form-control')->placeholder('Enter Name')->required() }} + {{ html()->div('Name is required')->class('invalid-feedback') }} +
+ +
+ {{ html()->label('Designation')->class('form-label') }} + {{ html()->text('designation')->class('form-control')->placeholder('Enter Designation') }} +
+ +
+ {{ html()->label('Company')->class('form-label') }} + {{ html()->text('company')->class('form-control')->placeholder('Enter Company') }} +
+ +
+ {{ html()->label('Branch')->class('form-label')->for('branch_id') }} + {{ html()->select('branch_id', $branchOptions)->class('form-select choices-select')->placeholder('Select') }} +
+ +
+ {{ html()->label('Comment')->class('form-label')->for('description') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->textarea('description')->class('form-control')->rows(10) }} +
+
+
+
+
+ +
+
+
+
Publish
+
+
+
+
+ {{ html()->select('status', config('constants.page_status_options'))->class('form-select choices-select ') }} +
+
+
+ + + +
+ + +
+ +
diff --git a/Modules/CCMS/resources/views/newsletter/create.blade.php b/Modules/CCMS/resources/views/newsletter/create.blade.php new file mode 100644 index 0000000..b386130 --- /dev/null +++ b/Modules/CCMS/resources/views/newsletter/create.blade.php @@ -0,0 +1,14 @@ +@extends('layouts.app') +@section('content') +
+ + + + {{ html()->form('POST')->route('testimonial.store')->class(['needs-validation'])->attributes(['enctype' => 'multipart/form-data', 'novalidate'])->open() }} + + @include('ccms::testimonial.partials._form') + + {{ html()->form()->close() }} + +
+@endsection diff --git a/Modules/CCMS/resources/views/newsletter/datatable/action.blade.php b/Modules/CCMS/resources/views/newsletter/datatable/action.blade.php new file mode 100644 index 0000000..ab5049c --- /dev/null +++ b/Modules/CCMS/resources/views/newsletter/datatable/action.blade.php @@ -0,0 +1,8 @@ +
+ + + + + +
diff --git a/Modules/CCMS/resources/views/newsletter/edit.blade.php b/Modules/CCMS/resources/views/newsletter/edit.blade.php new file mode 100644 index 0000000..5d96439 --- /dev/null +++ b/Modules/CCMS/resources/views/newsletter/edit.blade.php @@ -0,0 +1,14 @@ +@extends('layouts.app') +@section('content') +
+ + + + {{ html()->modelForm($testimonial, 'PUT')->route('testimonial.update', $testimonial->id)->class(['needs-validation'])->attributes(['novalidate'])->open() }} + + @include('ccms::testimonial.partials._form') + + {{ html()->form()->close() }} + +
+@endsection diff --git a/Modules/CCMS/resources/views/newsletter/index.blade.php b/Modules/CCMS/resources/views/newsletter/index.blade.php new file mode 100644 index 0000000..9f7a0a3 --- /dev/null +++ b/Modules/CCMS/resources/views/newsletter/index.blade.php @@ -0,0 +1,33 @@ +@extends('layouts.app') +@section('content') +
+ +
+
+
{{ $title }}
+
+
+ @php + $columns = [ + [ + 'title' => 'S.N', + 'data' => 'DT_RowIndex', + 'name' => 'DT_RowIndex', + 'orderable' => false, + 'searchable' => false, + 'sortable' => false, + ], + ['title' => 'Email', 'data' => 'email', 'name' => 'email'], + [ + 'title' => 'Action', + 'data' => 'action', + 'orderable' => false, + 'searchable' => false, + ], + ]; + @endphp + +
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/newsletter/partials/_form.blade.php b/Modules/CCMS/resources/views/newsletter/partials/_form.blade.php new file mode 100644 index 0000000..d2b7a04 --- /dev/null +++ b/Modules/CCMS/resources/views/newsletter/partials/_form.blade.php @@ -0,0 +1,71 @@ +
+
+
+
+
+
+ {{ html()->label('Name')->class('form-label') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('title')->class('form-control')->placeholder('Enter Name')->required() }} + {{ html()->div('Name is required')->class('invalid-feedback') }} +
+ +
+ {{ html()->label('Designation')->class('form-label') }} + {{ html()->text('designation')->class('form-control')->placeholder('Enter Designation') }} +
+ +
+ {{ html()->label('Company')->class('form-label') }} + {{ html()->text('company')->class('form-control')->placeholder('Enter Company') }} +
+ +
+ {{ html()->label('Branch')->class('form-label')->for('branch_id') }} + {{ html()->select('branch_id', $branchOptions)->class('form-select choices-select')->placeholder('Select') }} +
+ +
+ {{ html()->label('Comment')->class('form-label')->for('description') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->textarea('description')->class('form-control')->rows(10) }} +
+
+
+
+
+ +
+
+
+
Publish
+
+
+
+
+ {{ html()->select('status', config('constants.page_status_options'))->class('form-select choices-select ') }} +
+
+
+ + + +
+ + +
+ +
diff --git a/Modules/CCMS/routes/web.php b/Modules/CCMS/routes/web.php index bf7bfe3..a17b0e4 100644 --- a/Modules/CCMS/routes/web.php +++ b/Modules/CCMS/routes/web.php @@ -8,11 +8,14 @@ use Modules\CCMS\Http\Controllers\CounselorController; use Modules\CCMS\Http\Controllers\CounterController; use Modules\CCMS\Http\Controllers\CountryController; use Modules\CCMS\Http\Controllers\EnquiryController; +use Modules\CCMS\Http\Controllers\EventController; use Modules\CCMS\Http\Controllers\FaqCategoryController; use Modules\CCMS\Http\Controllers\FaqController; +use Modules\CCMS\Http\Controllers\FranchiseController; use Modules\CCMS\Http\Controllers\GalleryCategoryController; use Modules\CCMS\Http\Controllers\GalleryController; use Modules\CCMS\Http\Controllers\InstitutionController; +use Modules\CCMS\Http\Controllers\NewsletterController; use Modules\CCMS\Http\Controllers\PageController; use Modules\CCMS\Http\Controllers\PartnerController; use Modules\CCMS\Http\Controllers\PopupController; @@ -31,7 +34,7 @@ use Modules\CCMS\Http\Controllers\TestimonialController; | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! -| +|Eventcontr */ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/'], function () { @@ -83,6 +86,10 @@ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/ Route::get('service/toggle/{id}', [ServiceController::class, 'toggle'])->name('service.toggle'); Route::resource('service', ServiceController::class)->names('service'); + Route::post('event/reorder', [EventController::class, 'reorder'])->name('event.reorder'); + Route::get('event/toggle/{id}', [EventController::class, 'toggle'])->name('event.toggle'); + Route::resource('event', EventController::class)->names('event'); + Route::post('branch/reorder', [BranchController::class, 'reorder'])->name('branch.reorder'); Route::get('branch/toggle/{id}', [BranchController::class, 'toggle'])->name('branch.toggle'); Route::resource('branch', BranchController::class)->names('branch'); @@ -124,5 +131,8 @@ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/ Route::get('enquiry/mark-as-read/{id}', [EnquiryController::class, 'markAsRead'])->name('enquiry.markAsRead'); Route::resource('enquiry', EnquiryController::class)->names('enquiry')->only(['index', 'store', 'destroy']); + Route::resource('franchise', FranchiseController::class)->names('franchise')->only(['index', 'store', 'destroy']); + Route::resource('newsletter', NewsletterController::class)->names('newsletter')->only(['index', 'store', 'destroy']); + Route::resource('counselor', CounselorController::class)->names('counselor')->only(['index', 'store', 'destroy']); }); diff --git a/Modules/Meeting/routes/web.php b/Modules/Meeting/routes/web.php index 2172583..3001e42 100644 --- a/Modules/Meeting/routes/web.php +++ b/Modules/Meeting/routes/web.php @@ -16,10 +16,9 @@ use Modules\Meeting\Http\Controllers\MeetingController; */ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/'], function () { - Route::resource('event', EventController::class)->names('event'); + // Route::resource('event', EventController::class)->names('event'); Route::post('meeting/sub-task', [MeetingController::class, 'storeSubTask'])->name('meeting.storeSubTask'); Route::resource('meeting', MeetingController::class)->names('meeting'); Route::get('meeting/{id}/send-email', [MeetingController::class, 'sendEmail'])->name('meeting.sendmail'); - }); diff --git a/Modules/User/routes/client.php b/Modules/User/routes/client.php index 69b9c06..12eed2e 100644 --- a/Modules/User/routes/client.php +++ b/Modules/User/routes/client.php @@ -3,6 +3,9 @@ use App\Http\Controllers\WebsiteController; use Illuminate\Support\Facades\Route; use Modules\CCMS\Http\Controllers\EnquiryController; +use Modules\CCMS\Http\Controllers\FranchiseController; +use Modules\CCMS\Http\Controllers\NewsletterController; +use Modules\CCMS\Models\Franchise; use Modules\CourseFinder\Http\Controllers\CoopController; use Modules\CourseFinder\Http\Controllers\ProgramController; use Modules\CourseFinder\Http\Controllers\ProgramLevelController; @@ -19,6 +22,9 @@ Route::get('destination/{alias}', [WebsiteController::class, 'countrySingle'])-> Route::get('/home/resources', [WebsiteController::class, 'resources']); Route::get('getCoursesList', [ProgramController::class, 'getCoursesList'])->name('program.getCoursesList'); Route::post('enquiry', [EnquiryController::class, 'store'])->name('enquiry.store'); +Route::post('franchise', [FranchiseController::class, 'store'])->name('franchise.store'); +Route::post('newsletter', [NewsletterController::class, 'store'])->name('newsletter.store'); + Route::get('getCost', [WebsiteController::class, 'getCost'])->name('cost.getCost'); Route::get('/thankyou', [WebsiteController::class, 'thankyouPage'])->name('thankyou'); diff --git a/app/Helpers/QueryHelper.php b/app/Helpers/QueryHelper.php index 919fc83..ab36c44 100644 --- a/app/Helpers/QueryHelper.php +++ b/app/Helpers/QueryHelper.php @@ -4,6 +4,7 @@ use Modules\CCMS\Models\Blog; use Modules\CCMS\Models\Category; use Modules\CCMS\Models\Counter; use Modules\CCMS\Models\Country; +use Modules\CCMS\Models\Event; use Modules\CCMS\Models\Faq; use Modules\CCMS\Models\FaqCategory; use Modules\CCMS\Models\Gallery; @@ -150,6 +151,32 @@ function getServices($limit = null, $order = 'desc') ->get(); } +function previousEvents($limit = null, $order = 'desc') +{ + return Event::query() + ->where('status', 1) + ->where('parent_id', null) + ->where('start_date', '<=', now()) + ->orderBy('order', $order) + ->when($limit, function ($query) use ($limit) { + $query->limit($limit); + }) + ->get(); +} + +function upcomingEvents($limit = null, $order = 'desc') +{ + return Event::query() + ->where('status', 1) + ->where('parent_id', null) + ->where('start_date', '>=', now()) + ->orderBy('order', $order) + ->when($limit, function ($query) use ($limit) { + $query->limit($limit); + }) + ->get(); +} + function getInstitutions($limit = null, $order = 'desc') { return Institution::query() diff --git a/app/Http/Controllers/WebsiteController.php b/app/Http/Controllers/WebsiteController.php index 686971e..ffebb33 100644 --- a/app/Http/Controllers/WebsiteController.php +++ b/app/Http/Controllers/WebsiteController.php @@ -33,6 +33,8 @@ class WebsiteController extends Controller $countries = Country::where('status', 1)->where('parent_id', null)->get(); $interviews = Service::where('status', 1)->where('parent_id', null)->get(); $services = Service::where('status', 1)->where('parent_id', null)->get(); + $data['previousEvents'] = previousEvents(limit: null, order: 'asc'); + $data['upcomingEvents'] = upcomingEvents(limit: null, order: 'asc'); $this->path = config('app.client'); view()->share([ @@ -42,6 +44,8 @@ class WebsiteController extends Controller 'countries' => $countries, 'services' => $services, 'interviews' => $interviews, + 'previousEvents' => $data['previousEvents'], + 'upcomingEvents' => $data['upcomingEvents'], ]); } @@ -57,7 +61,7 @@ class WebsiteController extends Controller $data['faqs'] = getFAQs(limit: null, order: 'desc'); $data['testimonials'] = getTestimonials(limit: null, order: 'desc'); $data['blogs'] = getBlogs(limit: 4, order: 'desc'); - $data['partners'] = getPartners(limit: 4, order: 'desc'); + $data['partners'] = getPartners(); $data['gallaries'] = getGalleries(limit: 6, order: 'asc'); $data['achievementGalleries'] = getGalleriesByCategory(limit: null, order: 'asc', category: 'achievement'); $data['visaGalleries'] = getGalleriesByCategory(limit: null, order: 'asc', category: 'visa-success'); @@ -176,7 +180,7 @@ class WebsiteController extends Controller $page = getPageWithChildrenBySlug(parent: $parent, slug: $slug, limit: null, order: 'asc'); $teams = getTeams(limit: null, order: 'asc'); $blogs = getBlogs(limit: null, order: 'asc'); - + $galleriesCSR = getPageWithChildrenBySlug(parent: $parent, slug: 'gallery', limit: null, order: 'asc'); if (!$page) { return view('client.raffles.errors.404'); } @@ -187,7 +191,7 @@ class WebsiteController extends Controller return view('client.raffles.errors.404'); } - return view($path, ['page' => $page, 'teams' => $teams, 'blogs' => $blogs]); + return view($path, ['page' => $page, 'teams' => $teams, 'blogs' => $blogs, 'galleriesCSR' => $galleriesCSR]); } public function fallback() diff --git a/config/sidebar.php b/config/sidebar.php index 7f6bf0c..020d954 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -45,6 +45,38 @@ return [ 'can' => ['menu.index'], ], + [ + 'text' => 'Enquiries', + 'icon' => 'ri-cellphone-line', + 'module' => 'CCMS', + 'submenu' => [ + + [ + 'text' => 'Enquiry', + 'url' => 'admin/enquiry', + 'can' => ['enquiry.index'], + ], + + [ + 'text' => 'Counsellor Request', + 'url' => 'admin/counselor', + 'can' => ['counselor.index'], + ], + + [ + 'text' => 'Franchise Request', + 'url' => 'admin/franchise', + 'can' => ['franchise.index'], + ], + + [ + 'text' => 'Newsletter', + 'url' => 'admin/newsletter', + 'can' => ['newsletter.index'], + ], + ], + ], + [ 'text' => 'Offer Popup', 'url' => 'admin/popup', @@ -101,6 +133,14 @@ return [ 'can' => ['service.index'], ], + [ + 'text' => 'Events', + 'url' => 'admin/event', + 'icon' => 'ri-feedback-line', + 'module' => 'CCMS', + 'can' => ['event.index'], + ], + [ 'text' => 'Team', 'url' => 'admin/team', @@ -181,21 +221,7 @@ return [ ], ], - [ - 'text' => 'Enquiry', - 'url' => 'admin/enquiry', - 'icon' => ' ri-cellphone-line', - 'module' => 'CCMS', - 'can' => ['enquiry.index'], - ], - [ - 'text' => 'Counsellor Request', - 'url' => 'admin/counselor', - 'icon' => ' ri-cellphone-line', - 'module' => 'CCMS', - 'can' => ['counselor.index'], - ], [ 'text' => 'Course Finder', diff --git a/resources/views/client/raffles/layouts/app.blade.php b/resources/views/client/raffles/layouts/app.blade.php index 66c5dce..b6a868a 100644 --- a/resources/views/client/raffles/layouts/app.blade.php +++ b/resources/views/client/raffles/layouts/app.blade.php @@ -219,6 +219,86 @@ }); + + + +