Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
dc32ac8f91 | |||
9d371a8d0f | |||
0c9adf1c7a | |||
087c19dc4a | |||
0c92a6f518 | |||
2d8c43691f | |||
27f371955c | |||
1ee87559da | |||
6ef55240a0 | |||
6d71fe4b4a | |||
52732b0f09 | |||
a11de7be9e | |||
b24e6a9c66 | |||
4c272e0e67 |
137
Modules/CCMS/app/Http/Controllers/CareerController.php
Normal file
137
Modules/CCMS/app/Http/Controllers/CareerController.php
Normal file
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\CCMS\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Str;
|
||||
use Modules\CCMS\Models\Career;
|
||||
use Yajra\DataTables\Facades\DataTables;
|
||||
|
||||
class CareerController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
if (request()->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 "<p class='{$color}'>{$status}</p>";
|
||||
})
|
||||
->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);
|
||||
}
|
||||
}
|
@@ -60,6 +60,7 @@ class EnquiryController extends Controller
|
||||
$rules = [
|
||||
'name' => 'required|string',
|
||||
'email' => 'required|email',
|
||||
'mobile' => 'required|string',
|
||||
'digits:10',
|
||||
'subject' => 'nullable',
|
||||
'message' => 'nullable|max:250',
|
||||
|
147
Modules/CCMS/app/Http/Controllers/VacancyController.php
Normal file
147
Modules/CCMS/app/Http/Controllers/VacancyController.php
Normal file
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\CCMS\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Rules\Recaptcha;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Modules\CCMS\Models\Vacancy;
|
||||
use Yajra\DataTables\Facades\DataTables;
|
||||
|
||||
class VacancyController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
|
||||
public function index()
|
||||
{
|
||||
if (request()->ajax()) {
|
||||
$model = Vacancy::query()->latest();
|
||||
return DataTables::eloquent($model)
|
||||
->addIndexColumn()
|
||||
// ->setRowClass(function (Vacancy $vacancy) {
|
||||
// return $vacancy->is_read ? 'text-muted' : 'text-dark';
|
||||
// })
|
||||
// ->editColumn('class', function (Vacancy $vacancy) {
|
||||
// return $vacancy->class ?? '-';
|
||||
// })
|
||||
// ->editColumn('subject', function (Vacancy $vacancy) {
|
||||
// return $vacancy->subject ?? '-';
|
||||
// })
|
||||
// ->editColumn('message', function (Vacancy $vacancy) {
|
||||
// return $vacancy->message ?? '-';
|
||||
// })
|
||||
->addColumn('action', 'ccms::vacancy.datatable.action')
|
||||
->rawColumns(['action'])
|
||||
->toJson();
|
||||
}
|
||||
return view('ccms::vacancy.index', [
|
||||
'title' => 'Vacancy 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 = [
|
||||
|
||||
|
||||
// ];
|
||||
|
||||
// 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());
|
||||
// if ($validator->fails()) {
|
||||
// return response()->json(['errors' => $validator->errors()], 422);
|
||||
// }
|
||||
|
||||
$modelClass = "Modules\\CCMS\\Models\\Career";
|
||||
|
||||
$model = $modelClass::findOrFail($request->career_id);
|
||||
foreach ($request->document as $file) {
|
||||
$model->addToDocumentCollection(collectionName: 'uploads/document', file: $file, documentName: $request->first_name, referenceDocumentId: null);
|
||||
}
|
||||
|
||||
Vacancy::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 {
|
||||
$vacancy = Vacancy::whereId($id)->first();
|
||||
if ($vacancy) {
|
||||
$vacancy->delete();
|
||||
}
|
||||
return response()->json(['status' => 200, 'message' => 'Vacancy has been deleted!'], 200);
|
||||
} catch (\Throwable $th) {
|
||||
return redirect()->back()->with('error', $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function markAsRead($id)
|
||||
{
|
||||
try {
|
||||
$vacancy = Vacancy::whereId($id)->first();
|
||||
if ($vacancy) {
|
||||
$vacancy->update(['is_read' => 1]);
|
||||
}
|
||||
return response()->json(['status' => 200, 'message' => 'Vacancy has been marked as read!'], 200);
|
||||
} catch (\Throwable $th) {
|
||||
return redirect()->back()->with('error', $th->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
97
Modules/CCMS/app/Models/Career.php
Normal file
97
Modules/CCMS/app/Models/Career.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\CCMS\Models;
|
||||
|
||||
|
||||
use App\Traits\CreatedUpdatedBy;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Modules\CCMS\Traits\UpdateCustomFields;
|
||||
use Modules\Document\Models\Document;
|
||||
use App\Traits\AddToDocumentCollection;
|
||||
|
||||
class Career extends Model
|
||||
{
|
||||
use HasFactory, UpdateCustomFields, AddToDocumentCollection, CreatedUpdatedBy;
|
||||
|
||||
protected $fillable = [
|
||||
'department',
|
||||
'job_title',
|
||||
'job_description',
|
||||
'job_requirements',
|
||||
'salary_range',
|
||||
'location',
|
||||
'position',
|
||||
'start_date',
|
||||
'end_date',
|
||||
'status',
|
||||
'createdby',
|
||||
'updatedby',
|
||||
'order',
|
||||
];
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'custom' => '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');
|
||||
}
|
||||
}
|
21
Modules/CCMS/app/Models/Vacancy.php
Normal file
21
Modules/CCMS/app/Models/Vacancy.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\CCMS\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
// use Modules\CCMS\Database\Factories\VacancyFactory;
|
||||
|
||||
class vacancy extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'first_name',
|
||||
'last_name',
|
||||
'email',
|
||||
'phone',
|
||||
'qualification',
|
||||
'description',
|
||||
];
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('careers', function (Blueprint $table) {
|
||||
$table->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');
|
||||
}
|
||||
};
|
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('vacancies', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('first_name')->nullable();
|
||||
$table->string('last_name')->nullable();
|
||||
$table->string('email')->nullable();
|
||||
$table->string('phone')->nullable();
|
||||
$table->string('qualification')->nullable();
|
||||
$table->text('description')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('vacancies');
|
||||
}
|
||||
};
|
16
Modules/CCMS/resources/views/career/create.blade.php
Normal file
16
Modules/CCMS/resources/views/career/create.blade.php
Normal file
@@ -0,0 +1,16 @@
|
||||
@extends('layouts.app')
|
||||
@section('content')
|
||||
<x-dashboard.breadcumb :title="$title" />
|
||||
<div class="container-fluid">
|
||||
@if ($errors->any())
|
||||
<x-flash-message type="danger" :messages="$errors->all()" />
|
||||
@endif
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
{{ html()->form('POST')->route('career.store')->class('needs-validation')->attributes(['novalidate'])->open() }}
|
||||
@include('ccms::career.partials._form')
|
||||
{{ html()->form()->close() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
@@ -0,0 +1,12 @@
|
||||
<div class="hstack flex-wrap gap-3">
|
||||
<a href="{{ route('career.edit', $id) }}" data-bs-toggle="tooltip"
|
||||
data-bs-placement="bottom" data-bs-title="Edit" class="link-success fs-15 edit-item-btn"><i
|
||||
class=" ri-edit-2-line"></i></a>
|
||||
|
||||
<a data-link="{{ route('career.toggle', $id) }}" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Toggle" data-status="{{ $status == 1 ? 'Draft' : 'Published' }}"
|
||||
class="link-info fs-15 toggle-item"><i class="{{ $status == 1 ? 'ri-toggle-line' : 'ri-toggle-fill' }}"></i></a>
|
||||
|
||||
<a href="javascript:void(0);" data-link="{{ route('career.destroy', $id) }}" class="link-danger fs-15 remove-item"
|
||||
data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Delete"><i class="ri-delete-bin-6-line"></i>
|
||||
</a>
|
||||
</div>
|
16
Modules/CCMS/resources/views/career/edit.blade.php
Normal file
16
Modules/CCMS/resources/views/career/edit.blade.php
Normal file
@@ -0,0 +1,16 @@
|
||||
@extends('layouts.app')
|
||||
@section('content')
|
||||
<x-dashboard.breadcumb :title="$title" />
|
||||
<div class="container-fluid">
|
||||
@if ($errors->any())
|
||||
<x-flash-message type="danger" :messages="$errors->all()" />
|
||||
@endif
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
{{ html()->modelForm($career, 'PUT')->route('career.update', $career->id)->class('needs-validation')->attributes(['novalidate'])->open() }}
|
||||
@include('ccms::career.partials._form')
|
||||
{{ html()->closeModelForm() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
51
Modules/CCMS/resources/views/career/index.blade.php
Normal file
51
Modules/CCMS/resources/views/career/index.blade.php
Normal file
@@ -0,0 +1,51 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
<x-dashboard.breadcumb :title="$title" />
|
||||
@if ($errors->any())
|
||||
<x-flash-message type="danger" :messages="$errors->all()" />
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex align-items-center justify-content-between">
|
||||
<h5 class="card-title mb-0">{{ $title }}</h5>
|
||||
<a href="{{ route('career.create') }}" class="btn btn-primary waves-effect waves-light text-white"><i
|
||||
class="ri-add-line align-middle"></i> Create</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@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
|
||||
<x-data-table-script :route="route('career.index')" :reorder="route('career.reorder')" :columns="$columns" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
220
Modules/CCMS/resources/views/career/partials/_form.blade.php
Normal file
220
Modules/CCMS/resources/views/career/partials/_form.blade.php
Normal file
@@ -0,0 +1,220 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-8">
|
||||
<div class="card h-auto">
|
||||
<div class="card-body">
|
||||
<div class="row gy-3">
|
||||
<div class="col-md-6">
|
||||
{{ 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) }}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{{ html()->label('Department')->class('form-label')->for('department') }}
|
||||
{{ html()->span('*')->class('text-danger') }}
|
||||
{{ html()->text('department')->class('form-control')->placeholder('Enter Department')->required(true) }}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{{ html()->label('Vacancy Start Date')->class('form-label') }}
|
||||
<div class="input-group">
|
||||
{{ 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() }}
|
||||
<span class="input-group-text"><i class="ri-calendar-career-line"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{{ html()->label('Vacancy End Date')->class('form-label') }}
|
||||
<div class="input-group">
|
||||
{{ 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' => '',
|
||||
]) }}
|
||||
<span class="input-group-text"><i class="ri-calendar-career-line"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{{ 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) }}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{{ html()->label('Location')->class('form-label')->for('location') }}
|
||||
{{ html()->span('*')->class('text-danger') }}
|
||||
{{ html()->text('location')->class('form-control')->placeholder('Enter location')->required(true) }}
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
{{ 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) }}
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
{{ html()->label('Job Description')->class('form-label')->for('job_description') }}
|
||||
{{ html()->textarea('job_description')->class('form-control')->placeholder('Enter Job Description (JD)')->rows(5) }}
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
{{ html()->label('Job Requirements')->class('form-label')->for('job_requirements') }}
|
||||
{{ html()->textarea('job_requirements')->class('form-control ckeditor-classic')->placeholder('Enter Job Requirements') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- <x-ccms::custom-form-field :data="$career->custom ?? []" /> --}}
|
||||
|
||||
<div class="card meta-section">
|
||||
<div class="card-header">
|
||||
<h6 class="card-title mb-0 fs-14">Meta</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-xl-12 col-sm-12">
|
||||
{{ html()->label('Meta Title')->class('form-label')->for('meta_title') }}
|
||||
{{ html()->text('meta_title')->class('form-control mb-3')->placeholder('Meta Title') }}
|
||||
</div>
|
||||
<div class="col-xl-12 col-sm-12">
|
||||
{{ html()->label('Meta Keywords')->class('form-label')->for('meta_keywords') }}
|
||||
{{ html()->textarea('meta_keywords')->class('form-control mb-3')->placeholder('Meta Keywords') }}
|
||||
</div>
|
||||
|
||||
<div class="col-xl-12 col-sm-12">
|
||||
{{ 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) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-4">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h6 class="card-title mb-0 fs-14">
|
||||
Published
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ html()->label('Status')->class('form-label visually-hidden')->for('status') }}
|
||||
{{ html()->select('status', config('constants.page_status_options'))->class('form-select choices-select') }}
|
||||
</div>
|
||||
|
||||
<x-form-buttons :href="route('career.index')" :label="isset($career) ? 'Update' : 'Create'" />
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h6 class="card-title mb-0 fs-14">
|
||||
Page Attributes
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ 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') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card media-gallery-section">
|
||||
<div class="card-header">
|
||||
<h6 class="card-title mb-0 fs-14">
|
||||
Icon
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
{{ html()->label('Icon')->class('form-label')->for('icon_class') }}
|
||||
{{ html()->text('icon_class')->class('form-control')->placeholder('Icon class') }}
|
||||
</div>
|
||||
|
||||
{{ html()->label('Icon Image')->class('form-label')->for('icon_image') }}
|
||||
<x-image-input :data="$editable ? $career->getRawOriginal('icon_image') : null" id="icon_image" name="icon_image" :editable="$editable" :multiple=false />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="card featured-image-section">
|
||||
<div class="card-header">
|
||||
<h6 class="card-title mb-0 fs-14">
|
||||
Featured Image
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
{{ html()->label('Featured')->class('form-label')->for('image') }}
|
||||
<x-image-input :data="$editable ? $career->getRawOriginal('image') : null" id="image" name="image" :editable="$editable" :multiple=false />
|
||||
</div>
|
||||
|
||||
{{ html()->label('Banner')->class('form-label')->for('banner') }}
|
||||
<x-image-input :data="$editable ? $career->getRawOriginal('banner') : null" id="banner" name="banner" :editable="$editable" :multiple=false />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card media-gallery-section">
|
||||
<div class="card-header">
|
||||
<h6 class="card-title mb-0 fs-14">
|
||||
Media Gallery
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<x-image-input :editable="$editable" id="images" name="images" :data="$editable ? $career->getRawOriginal('images') : null" :multiple="true"
|
||||
label="Select Images" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card sidebar-section">
|
||||
<div class="card-header d-flex jusitfy-content-between align-items-center">
|
||||
<h6 class="card-title mb-0 fs-14">Sidebar</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row gy-3">
|
||||
<div class="col-lg-12">
|
||||
{{ html()->label('Title')->class('form-label')->for('sidebar_title') }}
|
||||
{{ html()->text('sidebar_title')->class('form-control') }}
|
||||
</div>
|
||||
<div class="col-lg-12">
|
||||
{{ html()->label('Content')->class('form-label')->for('sidebar_content') }}
|
||||
{{ html()->textarea('sidebar_content')->class('form-control')->placeholder('Short Content (optional)')->rows(3) }}
|
||||
</div>
|
||||
|
||||
<div class="col-lg-12">
|
||||
{{ html()->label('Image')->class('form-label')->for('sidebar_content') }}
|
||||
<x-image-input :data="$editable ? $career->getRawOriginal('sidebar_image') : null" id="sidebar_image" name="sidebar_image" :editable="$editable"
|
||||
:multiple=false />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card button-section">
|
||||
<div class="card-header d-flex jusitfy-content-between align-items-center">
|
||||
<h6 class="card-title mb-0 fs-14">Button</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row gy-3">
|
||||
<div class="col-lg-12">
|
||||
{{ html()->label('Text')->class('form-label')->for('button_text') }}
|
||||
{{ html()->text('button_text')->class('form-control') }}
|
||||
</div>
|
||||
<div class="col-lg-12">
|
||||
{{ html()->label('Link')->class('form-label')->for('button_url') }}
|
||||
{{ html()->text('button_url')->class('form-control')->placeholder('Button Link') }}
|
||||
</div>
|
||||
|
||||
<div class="col-lg-12">
|
||||
{{ html()->label('Target')->class('form-label')->for('button_target') }}
|
||||
{{ html()->select('button_target', config('constants.redirect_options'))->class('form-select choices-select') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@@ -19,7 +19,7 @@
|
||||
],
|
||||
['title' => 'Name', 'data' => 'name', 'name' => 'name'],
|
||||
['title' => 'Email', 'data' => 'email', 'name' => 'email'],
|
||||
['title' => 'Contact', 'data' => 'mobile', 'name' => 'mobile'],
|
||||
['title' => 'Mobile', 'data' => 'mobile', 'name' => 'mobile'],
|
||||
['title' => 'Class', 'data' => 'class', 'name' => 'class'],
|
||||
['title' => 'Subject', 'data' => 'subject', 'name' => 'subject'],
|
||||
['title' => 'Message', 'data' => 'message', 'name' => 'message'],
|
||||
|
@@ -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'],
|
||||
|
@@ -17,15 +17,19 @@
|
||||
'searchable' => false,
|
||||
'sortable' => false,
|
||||
],
|
||||
['title' => 'First Name', 'data' => 'name', 'first_name' => 'first_name'],
|
||||
['title' => 'Last Name', 'data' => 'name', 'first_name' => 'first_name'],
|
||||
['title' => 'First Name', 'data' => 'first_name', 'name' => 'first_name'],
|
||||
['title' => 'Last Name', 'data' => 'last_name', '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' => 'Franchise Location',
|
||||
'data' => 'franchise_location',
|
||||
'name' => 'franchise_location',
|
||||
],
|
||||
[
|
||||
'title' => 'Action',
|
||||
'data' => 'action',
|
||||
|
@@ -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');
|
||||
|
@@ -5,6 +5,7 @@ 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\Http\Controllers\VacancyController;
|
||||
use Modules\CCMS\Models\Franchise;
|
||||
use Modules\CourseFinder\Http\Controllers\CoopController;
|
||||
use Modules\CourseFinder\Http\Controllers\ProgramController;
|
||||
@@ -24,6 +25,9 @@ Route::get('getCoursesList', [ProgramController::class, 'getCoursesList'])->name
|
||||
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::post('vacancy', [VacancyController::class, 'store'])->name('vacancy.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');
|
||||
|
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Modules\CCMS\Models\Blog;
|
||||
use Modules\CCMS\Models\Career;
|
||||
use Modules\CCMS\Models\Category;
|
||||
use Modules\CCMS\Models\Counter;
|
||||
use Modules\CCMS\Models\Country;
|
||||
@@ -151,6 +152,18 @@ function getServices($limit = null, $order = 'desc')
|
||||
->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()
|
||||
|
@@ -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()
|
||||
@@ -263,61 +272,78 @@ class WebsiteController extends Controller
|
||||
|
||||
public function getCost(Request $request)
|
||||
{
|
||||
$data['costss'] = $this->costCalculatorService->findAll($request);
|
||||
foreach ($data['costss'] as $value) {
|
||||
$id = $value->id;
|
||||
$costs = $this->costCalculatorService->findAll($request);
|
||||
|
||||
if ($costs->isEmpty()) {
|
||||
return view("client.raffles.errors.404");
|
||||
}
|
||||
|
||||
$id = $costs->last()->id;
|
||||
|
||||
$cost = CostCalculator::with([
|
||||
'stayTypeLiving',
|
||||
'stayTypeAccomodation',
|
||||
'stayTypeOnetime',
|
||||
'stayTypeService'
|
||||
])->findOrFail($id);
|
||||
$data['fee'] = Program::where('id', $request->program_id)->first();
|
||||
$data['title'] = 'View Cost Calculation';
|
||||
$data['cost'] = $cost;
|
||||
])->find($id);
|
||||
|
||||
if (!$cost) {
|
||||
return view("client.raffles.errors.404");
|
||||
}
|
||||
$program = Program::find($request->program_id);
|
||||
|
||||
if (!$program) {
|
||||
return view("client.raffles.errors.404");
|
||||
}
|
||||
|
||||
$getBreakdown = function ($stayTypeTitle) use ($cost) {
|
||||
$living = optional($cost->stayTypeLiving->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
$living = optional($cost->stayTypeLiving->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
$accomodation = optional($cost->stayTypeAccomodation->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
$onetime = optional($cost->stayTypeOnetime->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
$service = optional($cost->stayTypeService->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
$onetime = optional($cost->stayTypeOnetime->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
$service = optional($cost->stayTypeService->firstWhere('title', $stayTypeTitle))->pivot;
|
||||
|
||||
return [
|
||||
'living' => [
|
||||
'monthly' => $living->monthly ?? 0,
|
||||
'yearly' => $living->yearly ?? 0,
|
||||
'yearly' => $living->yearly ?? 0,
|
||||
],
|
||||
'accomodation' => [
|
||||
'monthly' => $accomodation->monthly ?? 0,
|
||||
'yearly' => $accomodation->yearly ?? 0,
|
||||
'yearly' => $accomodation->yearly ?? 0,
|
||||
],
|
||||
'onetime' => [
|
||||
'visa' => $onetime->visa ?? 0,
|
||||
'biometrics' => $onetime->biometrics ?? 0,
|
||||
'sevis' => $onetime->sevis ?? 0,
|
||||
'visa' => $onetime->visa ?? 0,
|
||||
'biometrics' => $onetime->biometrics ?? 0,
|
||||
'sevis' => $onetime->sevis ?? 0,
|
||||
'application' => $onetime->application ?? 0,
|
||||
'total' => ($onetime->visa ?? 0) + ($onetime->biometrics ?? 0) + ($onetime->sevis ?? 0) + ($onetime->application ?? 0),
|
||||
'total' => ($onetime->visa ?? 0) + ($onetime->biometrics ?? 0) + ($onetime->sevis ?? 0) + ($onetime->application ?? 0),
|
||||
],
|
||||
'service' => [
|
||||
'flight_ticket' => $service->flight_ticket ?? 0,
|
||||
'insurance' => $service->insurance ?? 0,
|
||||
'extra' => $service->extra ?? 0,
|
||||
'total' => ($service->flight_ticket ?? 0) + ($service->insurance ?? 0) + ($service->extra ?? 0),
|
||||
'insurance' => $service->insurance ?? 0,
|
||||
'extra' => $service->extra ?? 0,
|
||||
'total' => ($service->flight_ticket ?? 0) + ($service->insurance ?? 0) + ($service->extra ?? 0),
|
||||
]
|
||||
];
|
||||
};
|
||||
|
||||
$data['breakdowns'] = [
|
||||
'alone' => $getBreakdown('Alone'),
|
||||
'with_spouse' => $getBreakdown('With Spouse'),
|
||||
'with_spouse_and_child' => $getBreakdown('With Spouse and Child'),
|
||||
$data = [
|
||||
'costs' => $costs,
|
||||
'fee' => $program,
|
||||
'title' => 'View Cost Calculation',
|
||||
'cost' => $cost,
|
||||
'breakdowns' => [
|
||||
'alone' => $getBreakdown('Alone'),
|
||||
'with_spouse' => $getBreakdown('With Spouse'),
|
||||
'with_spouse_and_child' => $getBreakdown('With Spouse and Child'),
|
||||
],
|
||||
];
|
||||
|
||||
return view('client.raffles.pages.cost-result', $data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function thankyouPage(Request $r)
|
||||
{
|
||||
$data = new \stdClass();
|
||||
|
@@ -11,6 +11,7 @@ trait AddToDocumentCollection
|
||||
{
|
||||
public function addToDocumentCollection(string $collectionName = 'uploads', string $file, ?string $documentName = null, ?int $referenceDocumentId = null)
|
||||
{
|
||||
dd($documentName);
|
||||
if (!Storage::disk('public')->exists($collectionName)) {
|
||||
Storage::disk('public')->makeDirectory($collectionName);
|
||||
}
|
||||
|
@@ -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',
|
||||
|
BIN
public/raffles/assets/images/404/404.png
Normal file
BIN
public/raffles/assets/images/404/404.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 267 KiB |
@@ -1,12 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>404</h1>
|
||||
</body>
|
||||
</html>
|
||||
@extends('client.raffles.layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div
|
||||
class="min-h-screen flex flex-col items-center justify-center bg-gradient-to-b from-yellow-100 via-white to-yellow-50 px-6">
|
||||
<!-- Monkey Illustration -->
|
||||
<div class="relative">
|
||||
<img src="{{ asset('raffles/assets/images/404/404.png') }}" alt="Monkey" class="animate-bounce" height="500px"
|
||||
width="700px">
|
||||
</div>
|
||||
<!-- Button -->
|
||||
<a href="{{ url('/') }}"
|
||||
class="mt-6 inline-block bg-yellow-400 text-gray-900 font-semibold px-6 py-3 rounded-2xl shadow-md hover:bg-yellow-500 transition duration-300">
|
||||
🏠 Back to Home
|
||||
</a>
|
||||
</div>
|
||||
@endsection
|
||||
|
@@ -219,7 +219,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const form = document.getElementById('franchise-form');
|
||||
const submitBtn = document.getElementById('franchise-submit');
|
||||
@@ -259,7 +259,7 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const form = document.getElementById('newsletter-form');
|
||||
const submitBtn = document.getElementById('newsletter-submit');
|
||||
@@ -339,6 +339,46 @@
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const form = document.getElementById('vacancy-form');
|
||||
const submitBtn = document.getElementById('vacancy-submit-btn');
|
||||
const url = form.action;
|
||||
form.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.textContent = 'Submitting…';
|
||||
const formData = new FormData(form);
|
||||
try {
|
||||
const res = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')
|
||||
.content
|
||||
},
|
||||
body: formData
|
||||
});
|
||||
const data = await res.json();
|
||||
if (res.ok) {
|
||||
form.reset();
|
||||
window.location.href =
|
||||
"{{ route('thankyou') }}"; // ✅ redirect instead of toastr
|
||||
} else if (data.errors && data.errors.email) {
|
||||
data.errors.email.forEach(msg => toastr.error(msg));
|
||||
} else {
|
||||
toastr.error('Submission failed. Please try again.');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
toastr.error('Something went wrong. Please try again.');
|
||||
} finally {
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.textContent = 'Submit';
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
var weekdays = [
|
||||
|
@@ -61,7 +61,8 @@
|
||||
<a href="{{ setting('whatsapp') }}" target="blank"> <i
|
||||
class="fa-brands fa-square-whatsapp"></i></a>
|
||||
</div>
|
||||
<form class="flex" action="{{ route('newsletter.store') }}" method="post" id="newsletter-form">
|
||||
<form class="flex" action="{{ route('newsletter.store') }}" method="post"
|
||||
id="newsletter-form">
|
||||
@csrf
|
||||
<input class=" border-0 w-80percent px-20 text-14 py-10 text-black" type="email"
|
||||
name="email" id="email" placeholder="Enter your Email">
|
||||
@@ -69,10 +70,8 @@
|
||||
class="border-0 text-white p-10 text-12 newsletter-submit">Subscribe</button>
|
||||
</form>
|
||||
<div>
|
||||
<iframe
|
||||
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3532.3752814608883!2d85.32120487541293!3d27.705697025564373!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39eb1907f7e2f099%3A0x517cd88424589879!2sRaffles%20Educare!5e0!3m2!1sen!2snp!4v1755670491057!5m2!1sen!2snp"
|
||||
width="100%" height="150" style="border:0;" allowfullscreen="" loading="lazy"
|
||||
referrerpolicy="no-referrer-when-downgrade"></iframe>
|
||||
<iframe src="{{ setting('map') }}" width="100%" height="150" style="border:0;"
|
||||
allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@@ -0,0 +1,143 @@
|
||||
@extends('client.raffles.layouts.app')
|
||||
@section('content')
|
||||
<div class="p-20 ">
|
||||
<div class="h-175 rounded-10 bg-after relative">
|
||||
<img class="h-full w-full rounded-30 object-cover"
|
||||
src="{{ asset('raffles/assets/images/general/about-banner.png') }}" alt="">
|
||||
<div
|
||||
class="flex justify-center flex-col text-center items-center w-70percent mx-auto absolute top-20percent left-15percent z-30">
|
||||
<h2 class="md:text-40 text-94 text-white">Career-Details</h2>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<section class="pt-60 career-details ">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col col col-12">
|
||||
<div class="relative line-through">
|
||||
<div class="position ">
|
||||
<h4 class="text-brand">Available Position</h4>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col col col-12 ">
|
||||
|
||||
<div class="d-flex gap-5 pt-5">
|
||||
<div class="career-img">
|
||||
<img class="w-full" src="assets/images/icons/team.svg" alt="">
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-brand">{{ $career->job_title }}</h3>
|
||||
<p>{{ setting('location') }}</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="py-5 ">
|
||||
|
||||
<div class="flex gap-10">
|
||||
<div class="text-12">
|
||||
<i class="fa-solid fa-money-bill-wave"></i> {{ $career->salary_range }}
|
||||
</div>
|
||||
<div class="text-12">
|
||||
<i class="fa-solid fa-location-dot"></i> {{ $career->location }}
|
||||
</div>
|
||||
<div class="text-12">
|
||||
<i class="fa-solid fa-briefcase"></i> {{ $career->position }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-between">
|
||||
<div class="col col-12 col-md-6 pt-5">
|
||||
<h5>Job Description</h5>
|
||||
<p>{{ $career->job_description }}
|
||||
</p>
|
||||
|
||||
<h6 class="py-3">Key Responsibilities (JD):</h6>
|
||||
{{-- <ul>
|
||||
<li>1. Creative Design Development: Conceptualize and create high-quality designs for
|
||||
digital and print media, including websites, social media, brochures, and promotional
|
||||
materials.</li>
|
||||
<li>2. BTL Marketing Designs: Design engaging visual materials for BTL marketing campaigns,
|
||||
such as posters, banners, and standees, ensuring alignment with brand guidelines.</li>
|
||||
|
||||
<li>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.
|
||||
</li>
|
||||
<li>4. Brand Identity Development: Work on visual brand identity projects, creating logos,
|
||||
color schemes, and overall brand guidelines that resonate with target audiences.</li>
|
||||
<li>5. Client Collaboration: Collaborate with clients to understand their design
|
||||
requirements and deliver solutions that meet their objectives.</li>
|
||||
<li>6. Cross-Departmental Collaboration: Work closely with the marketing and production
|
||||
teams to deliver cohesive and integrated creative projects.</li>
|
||||
<li>7. Design for Digital Campaigns: Create digital assets for social media, websites, and
|
||||
online campaigns, ensuring visual consistency across all platforms.</li>
|
||||
<li>8. Quality Control: Ensure the highest standards of quality and consistency across all
|
||||
creative outputs, adhering to timelines and project goals.</li>
|
||||
<li>9. Software Proficiency: Utilize design tools such as Adobe Creative Suite (Photoshop,
|
||||
Illustrator, InDesign, etc.) to produce creative assets with speed and precision.</li>
|
||||
<li>10. Mentorship and Team Leadership: Guide and mentor junior designers, providing
|
||||
feedback and support to ensure continuous growth and improvement within the team.</li>
|
||||
</ul> --}}
|
||||
{!! $career->job_requirements !!}
|
||||
</div>
|
||||
<div class="col col-12 col-md-5">
|
||||
<div class=" form ">
|
||||
<h2 class="text-26 mb-30 text-brand text-center">Quick Apply</h2>
|
||||
<form action="{{ route('vacancy.store') }}" method="post" id="vacancy-form">
|
||||
@csrf
|
||||
<input type="hidden" name="career_id" value="{{ $career->id }}">
|
||||
<div class="flex gap-20">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text"
|
||||
name="first_name" id="" placeholder="First Name">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text"
|
||||
name="last_name" id="" placeholder="Last Name">
|
||||
</div>
|
||||
|
||||
<div class="flex gap-20">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email"
|
||||
name="email" id="" placeholder="Email">
|
||||
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="tel"
|
||||
name="phone" id="" placeholder="Phone Number">
|
||||
</div>
|
||||
|
||||
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text"
|
||||
name="qualification" id="" placeholder="Your Qualification">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<textarea class="w-full mb-10 rounded-6 py-15 text-14 px-10" name="description" id=""
|
||||
placeholder="Short description about you"></textarea>
|
||||
<label class="text-16" for="">Please Upload Your CV</label>
|
||||
<input class="mb-20" type="file" name="document" id="">
|
||||
<button type="submit" id="vacancy-submit-btn"
|
||||
class="button-hover px-30 py-10 bg-sec text-white rounded-30 text-14 border-0 mt-20 ">Submit</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</section>
|
||||
@endsection
|
@@ -14,168 +14,30 @@
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="lqd-section pt-40 pb-30">
|
||||
<div class="container">
|
||||
<div class="row pb-20">
|
||||
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="career-detail.php" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
Marketing</h5>
|
||||
</span>
|
||||
|
||||
<h6 class="text-16 font-bols mb-10">Seo Executive</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: 2025/03/05</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">Join our team as an SEO Executive and help
|
||||
improve our website's visibility and search
|
||||
engine rankings. The ideal candidate will be…</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
|
||||
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="career-detail.php" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
Marketing</h5>
|
||||
</span>
|
||||
|
||||
<h6 class="text-16 font-bols mb-10">Seo Executive</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: 2025/03/05</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">Join our team as an SEO Executive and help
|
||||
improve our website's visibility and search
|
||||
engine rankings. The ideal candidate will be…</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
|
||||
|
||||
</a>
|
||||
</div>
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="career-detail.php" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
Marketing</h5>
|
||||
</span>
|
||||
|
||||
<h6 class="text-16 font-bols mb-10">Seo Executive</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: 2025/03/05</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">Join our team as an SEO Executive and help
|
||||
improve our website's visibility and search
|
||||
engine rankings. The ideal candidate will be…</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
|
||||
|
||||
</a>
|
||||
</div>
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="career-detail.php" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
Marketing</h5>
|
||||
</span>
|
||||
|
||||
<h6 class="text-16 font-bols mb-10">Seo Executive</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: 2025/03/05</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">Join our team as an SEO Executive and help
|
||||
improve our website's visibility and search
|
||||
engine rankings. The ideal candidate will be…</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
|
||||
|
||||
</a>
|
||||
</div>
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="career-detail.php" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
Marketing</h5>
|
||||
</span>
|
||||
|
||||
<h6 class="text-16 font-bols mb-10">Seo Executive</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: 2025/03/05</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">Join our team as an SEO Executive and help
|
||||
improve our website's visibility and search
|
||||
engine rankings. The ideal candidate will be…</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
|
||||
|
||||
</a>
|
||||
</div>
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="career-detail.php" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
Marketing</h5>
|
||||
</span>
|
||||
|
||||
<h6 class="text-16 font-bols mb-10">Seo Executive</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: 2025/03/05</p>
|
||||
</div>
|
||||
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">Join our team as an SEO Executive and help
|
||||
improve our website's visibility and search
|
||||
engine rankings. The ideal candidate will be…</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
|
||||
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@foreach ($careers as $career)
|
||||
<div class="col col-sm-6 col-md-4">
|
||||
<a href="{{ route('career.single', $career->id) }}" class="career-box flex flex-col gap-20 border">
|
||||
<span>
|
||||
<h5 class="text-white bg-sec px-20 py-10 rounded-10 text-18 mb-10 ml-0 inline-block">
|
||||
{{ $career->department }}</h5>
|
||||
</span>
|
||||
<h6 class="text-16 font-bols mb-10">{{ $career->job_title }}</h6>
|
||||
<div class="flex items-center gap-10 mb-10">
|
||||
<i class="fa-solid fa-calendar-days text-20"></i>
|
||||
<p class="font-bold text-16 text-black m-0 ">Post Date: {{ $career->created_At }}</p>
|
||||
</div>
|
||||
<div class="mb-10">
|
||||
<h2 class="text-16 font-medium text-gray">{{ $career->job_description }}</h2>
|
||||
</div>
|
||||
<button>View Detail</button>
|
||||
</a>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</section>
|
||||
@endsection
|
||||
|
@@ -218,7 +218,7 @@
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10 bg-light-blue border-light-grey"
|
||||
type="text" name="name" id="" placeholder="Full Name">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10 bg-light-blue border-light-grey"
|
||||
type="text" name="phone" id="" placeholder="Phone">
|
||||
type="text" name="mobile" id="" placeholder="Phone">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10 bg-light-blue border-light-grey"
|
||||
type="email" name="email" id="" placeholder="Email">
|
||||
<textarea class="w-full mb-20 rounded-6 py-15 text-14 px-10 bg-light-blue border-light-grey" name="subject"
|
||||
|
@@ -313,18 +313,19 @@
|
||||
|
||||
<h3 class="text-brand text-20">Let's Connect Quick</h3>
|
||||
<div class="divider"></div>
|
||||
<form class="pt-20" action="">
|
||||
|
||||
|
||||
<form action="{{ route('enquiry.store') }}" method="post" id="contact-form">
|
||||
@csrf
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10 border-bottom" type="text"
|
||||
name="" id="" placeholder="Your Name">
|
||||
name="name" id="" placeholder="Your Name" required>
|
||||
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email" name=""
|
||||
id="" placeholder="Your Email">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email" name=""
|
||||
id="" placeholder="Phone">
|
||||
<textarea class="w-full mb-40 rounded-6 text-14 px-10" name="" id="" placeholder="Your Message"></textarea>
|
||||
<button class="px-10 py-10 bg-brand text-white rounded-10 text-16 border-0 button-hover">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email" name="email"
|
||||
id="email" placeholder="Your Email" required>
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="mobile"
|
||||
id="mobile" placeholder="Phone" required>
|
||||
<textarea class="w-full mb-40 rounded-6 text-14 px-10" name="message" id="" placeholder="Your Message"
|
||||
required></textarea>
|
||||
<button type="submit" id="submit-btn"
|
||||
class="px-10 py-10 bg-brand text-white rounded-10 text-16 border-0 button-hover">
|
||||
<i class="fa-solid fa-paper-plane text-white text-16 pr-5"></i>
|
||||
Send Message</button>
|
||||
</form>
|
||||
|
@@ -30,7 +30,7 @@
|
||||
@csrf
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="name"
|
||||
id="" placeholder="Full Name">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="phone"
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="mobile"
|
||||
id="" placeholder="Phone">
|
||||
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email" name="email"
|
||||
id="" placeholder="Email">
|
||||
|
@@ -20,7 +20,7 @@
|
||||
<div class="row ">
|
||||
@foreach ($firstCourse->custom as $index => $data)
|
||||
<div class=" col col-md-3">
|
||||
<a href="course-finder.php" class=" course-box rounded-10 ">
|
||||
<a href="{{ route('program.coursefinder') }}" class=" course-box rounded-10 ">
|
||||
<div class="">
|
||||
<img class="w-ful " src="{{ asset($firstCourse->images[$index]) }}" alt="">
|
||||
</div>
|
||||
|
@@ -22,6 +22,11 @@ Route::middleware('guest')->group(function () {
|
||||
|
||||
Route::post('login', [AuthenticatedSessionController::class, 'store']);
|
||||
|
||||
Route::get('admin/login', [AuthenticatedSessionController::class, 'create'])
|
||||
->name('admin.login');
|
||||
|
||||
Route::post('admin/login', [AuthenticatedSessionController::class, 'store']);
|
||||
|
||||
Route::get('forgot-password', [PasswordResetLinkController::class, 'create'])
|
||||
->name('password.request');
|
||||
|
||||
|
Reference in New Issue
Block a user