diff --git a/Modules/CCMS/app/Http/Controllers/CareerController.php b/Modules/CCMS/app/Http/Controllers/CareerController.php new file mode 100644 index 0000000..421a8e2 --- /dev/null +++ b/Modules/CCMS/app/Http/Controllers/CareerController.php @@ -0,0 +1,137 @@ +ajax()) { + $model = Career::query()->orderBy('order'); + return DataTables::eloquent($model) + ->addIndexColumn() + ->setRowClass('tableRow') + ->editColumn('status', function (Career $career) { + $status = $career->status ? 'Published' : 'Draft'; + $color = $career->status ? 'text-success' : 'text-danger'; + return "

{$status}

"; + }) + ->addColumn('action', 'ccms::career.datatable.action') + ->rawColumns(['status', 'action']) + ->toJson(); + } + + return view('ccms::career.index', [ + 'title' => 'Career List', + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $careerOptions = Career::where('status', 1)->pluck('job_title', 'id'); + return view('ccms::career.create', [ + 'title' => 'Create Career', + 'editable' => false, + 'careerOptions' => $careerOptions + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $maxOrder = Career::max('order'); + $order = $maxOrder ? ++$maxOrder : 1; + + $request->mergeIfMissing([ + 'slug' => Str::slug($request->title), + // 'order' => $order, + ]); + + Career::create($request->all()); + flash()->success("Career has been created!"); + return redirect()->route('career.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) + { + $careerOptions = Career::where('status', 1)->pluck('job_title', 'id'); + + $career = Career::findOrFail($id); + return view('ccms::career.edit', [ + 'title' => 'Edit Career', + 'editable' => true, + 'career' => $career, + 'careerOptions' => $careerOptions + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id) + { + $request->merge([ + 'slug' => Str::slug($request->title), + ]); + $validated = $request->validate([]); + $career = Career::findOrFail($id); + $career->update($request->all()); + flash()->success("Career has been updated."); + return redirect()->back(); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + $career = Career::findOrFail($id); + $career->delete(); + return response()->json(['status' => 200, 'message' => "Career has been deleted."], 200); + } + + public function reorder(Request $request) + { + $careers = Career::all(); + foreach ($careers as $career) { + foreach ($request->order as $order) { + if ($order['id'] == $career->id) { + $career->update(['order' => $order['position']]); + } + } + } + return response(['status' => true, 'message' => 'Reordered successfully'], 200); + } + + public function toggle($id) + { + $career = Career::findOrFail($id); + $career->update(['status' => !$career->status]); + return response(['status' => 200, 'message' => 'Toggled successfully'], 200); + } +} diff --git a/Modules/CCMS/app/Models/Career.php b/Modules/CCMS/app/Models/Career.php new file mode 100644 index 0000000..ef3e49b --- /dev/null +++ b/Modules/CCMS/app/Models/Career.php @@ -0,0 +1,97 @@ + '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(Career::class, 'parent_id'); + } + + public function parent() + { + return $this->belongsTo(Career::class, 'parent_id'); + } + + public function documents() + { + return $this->morphMany(Document::class, 'documentable'); + } +} diff --git a/Modules/CCMS/database/migrations/2025_08_22_062659_create_careers_table.php b/Modules/CCMS/database/migrations/2025_08_22_062659_create_careers_table.php new file mode 100644 index 0000000..96bf2f9 --- /dev/null +++ b/Modules/CCMS/database/migrations/2025_08_22_062659_create_careers_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('department')->nullable(); + $table->string('job_title')->nullable(); + $table->text('job_description')->nullable(); + $table->text('job_requirements')->nullable(); + $table->string('salary_range')->nullable(); + $table->string('location')->nullable(); + $table->string('position')->nullable(); + $table->date('start_date')->nullable(); + $table->date('end_date')->nullable(); + $table->integer('status')->default(1); + $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('careers'); + } +}; diff --git a/Modules/CCMS/resources/views/career/create.blade.php b/Modules/CCMS/resources/views/career/create.blade.php new file mode 100644 index 0000000..8ee3015 --- /dev/null +++ b/Modules/CCMS/resources/views/career/create.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.app') +@section('content') + +
+ @if ($errors->any()) + + @endif +
+
+ {{ html()->form('POST')->route('career.store')->class('needs-validation')->attributes(['novalidate'])->open() }} + @include('ccms::career.partials._form') + {{ html()->form()->close() }} +
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/career/datatable/action.blade.php b/Modules/CCMS/resources/views/career/datatable/action.blade.php new file mode 100644 index 0000000..66467b8 --- /dev/null +++ b/Modules/CCMS/resources/views/career/datatable/action.blade.php @@ -0,0 +1,12 @@ +
+ + + + + + +
diff --git a/Modules/CCMS/resources/views/career/edit.blade.php b/Modules/CCMS/resources/views/career/edit.blade.php new file mode 100644 index 0000000..01eeba1 --- /dev/null +++ b/Modules/CCMS/resources/views/career/edit.blade.php @@ -0,0 +1,16 @@ +@extends('layouts.app') +@section('content') + +
+ @if ($errors->any()) + + @endif +
+
+ {{ html()->modelForm($career, 'PUT')->route('career.update', $career->id)->class('needs-validation')->attributes(['novalidate'])->open() }} + @include('ccms::career.partials._form') + {{ html()->closeModelForm() }} +
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/career/index.blade.php b/Modules/CCMS/resources/views/career/index.blade.php new file mode 100644 index 0000000..8081c05 --- /dev/null +++ b/Modules/CCMS/resources/views/career/index.blade.php @@ -0,0 +1,51 @@ +@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' => 'Job Title', 'data' => 'job_title', 'name' => 'job_title'], + ['title' => 'Start Date', 'data' => 'start_date', 'name' => 'start_date'], + ['title' => 'End Date', 'data' => 'end_date', 'name' => 'end_date'], + ['title' => 'Department', 'data' => 'department', 'name' => 'department'], + ['title' => 'Location', 'data' => 'location', 'name' => 'location'], + ['title' => 'Position', 'data' => 'position', 'name' => 'position'], + ['title' => 'Salary', 'data' => 'salary_range', 'name' => 'salary_range'], + ['title' => 'Status', 'data' => 'status', 'name' => 'status'], + [ + 'title' => 'Action', + 'data' => 'action', + 'orderable' => false, + 'searchable' => false, + ], + ]; + @endphp + +
+
+
+
+
+@endsection diff --git a/Modules/CCMS/resources/views/career/partials/_form.blade.php b/Modules/CCMS/resources/views/career/partials/_form.blade.php new file mode 100644 index 0000000..6bb211d --- /dev/null +++ b/Modules/CCMS/resources/views/career/partials/_form.blade.php @@ -0,0 +1,220 @@ +
+
+
+
+
+
+ {{ html()->label('Job Title')->class('form-label')->for('job_title') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('job_title')->class('form-control')->placeholder('Enter Job Title')->required(true) }} +
+ +
+ {{ html()->label('Department')->class('form-label')->for('department') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('department')->class('form-control')->placeholder('Enter Department')->required(true) }} +
+ +
+ {{ html()->label('Vacancy Start Date')->class('form-label') }} +
+ {{ html()->text('start_date')->class('form-control')->id('career-start-date')->placeholder('Vacancy Start Date')->attributes([ + 'data-provider' => 'flatpickr', + 'data-date-format' => 'Y-m-d', + 'data-enable-time' => '', + ])->required() }} + +
+
+ +
+ {{ html()->label('Vacancy End Date')->class('form-label') }} +
+ {{ html()->text('end_date')->class('form-control')->id('career-end-date')->placeholder('Vacancy End Date')->attributes([ + 'data-provider' => 'flatpickr', + 'data-date-format' => 'Y-m-d', + 'data-enable-time' => '', + ]) }} + +
+
+ +
+ {{ html()->label('Salary Range')->class('form-label')->for('salary_range') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('salary_range')->class('form-control')->placeholder('Enter Salary Range')->required(true) }} +
+ +
+ {{ html()->label('Location')->class('form-label')->for('location') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('location')->class('form-control')->placeholder('Enter location')->required(true) }} +
+ +
+ {{ html()->label('Position')->class('form-label')->for('position') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('position')->class('form-control')->placeholder('Enter Position (e.g. Fresher, Intermidiate, Senior)')->required(true) }} +
+ +
+ {{ html()->label('Job Description')->class('form-label')->for('job_description') }} + {{ html()->textarea('job_description')->class('form-control')->placeholder('Enter Job Description (JD)')->rows(5) }} +
+ +
+ {{ html()->label('Job Requirements')->class('form-label')->for('job_requirements') }} + {{ html()->textarea('job_requirements')->class('form-control ckeditor-classic')->placeholder('Enter Job Requirements') }} +
+
+
+
+ + {{-- --}} + +
+
+
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', $careerOptions ?? [])->value($career->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/event/index.blade.php b/Modules/CCMS/resources/views/event/index.blade.php index a2a19fc..6806bbb 100644 --- a/Modules/CCMS/resources/views/event/index.blade.php +++ b/Modules/CCMS/resources/views/event/index.blade.php @@ -27,7 +27,6 @@ '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'], diff --git a/Modules/CCMS/routes/web.php b/Modules/CCMS/routes/web.php index a17b0e4..cd3d406 100644 --- a/Modules/CCMS/routes/web.php +++ b/Modules/CCMS/routes/web.php @@ -3,6 +3,7 @@ use Illuminate\Support\Facades\Route; use Modules\CCMS\Http\Controllers\BlogController; use Modules\CCMS\Http\Controllers\BranchController; +use Modules\CCMS\Http\Controllers\CareerController; use Modules\CCMS\Http\Controllers\CategoryController; use Modules\CCMS\Http\Controllers\CounselorController; use Modules\CCMS\Http\Controllers\CounterController; @@ -90,6 +91,10 @@ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/ Route::get('event/toggle/{id}', [EventController::class, 'toggle'])->name('event.toggle'); Route::resource('event', EventController::class)->names('event'); + Route::post('career/reorder', [CareerController::class, 'reorder'])->name('career.reorder'); + Route::get('career/toggle/{id}', [CareerController::class, 'toggle'])->name('career.toggle'); + Route::resource('career', CareerController::class)->names('career'); + 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'); diff --git a/Modules/User/routes/client.php b/Modules/User/routes/client.php index 12eed2e..599de34 100644 --- a/Modules/User/routes/client.php +++ b/Modules/User/routes/client.php @@ -25,6 +25,8 @@ 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('career/{id}', [WebsiteController::class, 'careerSingle'])->name('career.single'); + 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 ab36c44..db26832 100644 --- a/app/Helpers/QueryHelper.php +++ b/app/Helpers/QueryHelper.php @@ -1,6 +1,7 @@ get(); } +function getCareers($limit = null, $order = 'desc') +{ + return Career::query() + ->where('status', 1) + ->orderBy('order', $order) + ->when($limit, function ($query) use ($limit) { + $query->limit($limit); + }) + ->get(); +} + + function previousEvents($limit = null, $order = 'desc') { return Event::query() diff --git a/app/Http/Controllers/WebsiteController.php b/app/Http/Controllers/WebsiteController.php index ffebb33..e47b70a 100644 --- a/app/Http/Controllers/WebsiteController.php +++ b/app/Http/Controllers/WebsiteController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\View; use Modules\CCMS\Models\Blog; +use Modules\CCMS\Models\Career; use Modules\CCMS\Models\Country; use Modules\CCMS\Models\Institution; use Modules\CCMS\Models\Page; @@ -130,6 +131,13 @@ class WebsiteController extends Controller } + public function careerSingle($id) + { + $data['career'] = Career::findorFail($id); + + return view("client.$this->path.pages.career-detail-template", $data); + } + public function testSingle($alias) { $testPreparations = $data["page"] = Test::where('status', 1) @@ -181,6 +189,7 @@ class WebsiteController extends Controller $teams = getTeams(limit: null, order: 'asc'); $blogs = getBlogs(limit: null, order: 'asc'); $galleriesCSR = getPageWithChildrenBySlug(parent: $parent, slug: 'gallery', limit: null, order: 'asc'); + $careers = getCareers(limit: null, order: 'asc'); if (!$page) { return view('client.raffles.errors.404'); } @@ -191,7 +200,7 @@ class WebsiteController extends Controller return view('client.raffles.errors.404'); } - return view($path, ['page' => $page, 'teams' => $teams, 'blogs' => $blogs, 'galleriesCSR' => $galleriesCSR]); + return view($path, ['page' => $page, 'teams' => $teams, 'blogs' => $blogs, 'galleriesCSR' => $galleriesCSR], ['careers' => $careers]); } public function fallback() diff --git a/config/sidebar.php b/config/sidebar.php index 020d954..eb7a83d 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -149,6 +149,14 @@ return [ 'can' => ['team.index'], ], + [ + 'text' => 'Career', + 'url' => 'admin/career', + 'icon' => 'ri-feedback-line', + 'module' => 'CCMS', + 'can' => ['career.index'], + ], + [ 'text' => 'Blog', 'icon' => 'ri-newspaper-line', diff --git a/resources/views/client/raffles/pages/career-detail-template.blade.php b/resources/views/client/raffles/pages/career-detail-template.blade.php new file mode 100644 index 0000000..08e7849 --- /dev/null +++ b/resources/views/client/raffles/pages/career-detail-template.blade.php @@ -0,0 +1,141 @@ +@extends('client.raffles.layouts.app') +@section('content') +
+
+ +
+

Career-Details

+ +
+
+ + +
+
+
+
+
+
+
+

Available Position

+
+ +
+ +
+ +
+ +
+
+ +
+
+

{{ $career->job_title }}

+

{{ setting('location') }}

+
+ +
+
+ +
+
+ {{ $career->salary_range }} +
+
+ {{ $career->location }} +
+
+ {{ $career->position }} +
+
+
+
+
+
Job Description
+

{{ $career->job_description }} +

+ +
Key Responsibilities (JD):
+ {{--
    +
  • 1. Creative Design Development: Conceptualize and create high-quality designs for + digital and print media, including websites, social media, brochures, and promotional + materials.
  • +
  • 2. BTL Marketing Designs: Design engaging visual materials for BTL marketing campaigns, + such as posters, banners, and standees, ensuring alignment with brand guidelines.
  • + +
  • 3. Layout and Page Design: Plan and design page layouts for print media such as + brochures, pamphlets, and magazines, ensuring an eye-catching yet functional structure. +
  • +
  • 4. Brand Identity Development: Work on visual brand identity projects, creating logos, + color schemes, and overall brand guidelines that resonate with target audiences.
  • +
  • 5. Client Collaboration: Collaborate with clients to understand their design + requirements and deliver solutions that meet their objectives.
  • +
  • 6. Cross-Departmental Collaboration: Work closely with the marketing and production + teams to deliver cohesive and integrated creative projects.
  • +
  • 7. Design for Digital Campaigns: Create digital assets for social media, websites, and + online campaigns, ensuring visual consistency across all platforms.
  • +
  • 8. Quality Control: Ensure the highest standards of quality and consistency across all + creative outputs, adhering to timelines and project goals.
  • +
  • 9. Software Proficiency: Utilize design tools such as Adobe Creative Suite (Photoshop, + Illustrator, InDesign, etc.) to produce creative assets with speed and precision.
  • +
  • 10. Mentorship and Team Leadership: Guide and mentor junior designers, providing + feedback and support to ensure continuous growth and improvement within the team.
  • +
--}} + {!! $career->job_requirements !!} +
+
+
+

Quick Apply

+
+
+ + +
+ +
+ + + +
+ + + + + + + + + + + + +
+ +
+
+ +
+ + +
+
+ + +
+ + + + + +
+@endsection diff --git a/resources/views/client/raffles/pages/carrer-template.blade.php b/resources/views/client/raffles/pages/carrer-template.blade.php index b47eff4..7e5c1d9 100644 --- a/resources/views/client/raffles/pages/carrer-template.blade.php +++ b/resources/views/client/raffles/pages/carrer-template.blade.php @@ -14,168 +14,30 @@ -
- - - - - - - - - - - - - + @foreach ($careers as $career) + + @endforeach
- - - - - @endsection