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') +{{ setting('location') }}
+{{ $career->job_description }} +
+ +