feat: Implement vacancy management features including listing, creating, and editing vacancies

This commit is contained in:
2025-08-27 17:53:32 +05:45
parent 2ca99f9dbc
commit 086395a0a4
18 changed files with 180 additions and 106 deletions

View File

@@ -22,18 +22,6 @@ class VacancyController extends Controller
$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();
@@ -41,6 +29,11 @@ class VacancyController extends Controller
return view('ccms::vacancy.index', [
'title' => 'Vacancy List',
]);
}
/**

View File

@@ -0,0 +1,8 @@
<div class="hstack flex-wrap gap-3">
<a href="javascript:void(0);" data-link="{{ route('vacancy.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>

View File

@@ -0,0 +1,37 @@
@extends('layouts.app')
@section('content')
<div class="container-fluid">
<x-dashboard.breadcumb :title="$title" />
<div class="card">
<div class="card-header align-items-center d-flex">
<h5 class="card-title flex-grow-1 mb-0">{{ $title }}</h5>
</div>
<div class="card-body">
@php
$columns = [
[
'title' => 'S.N',
'data' => 'DT_RowIndex',
'name' => 'DT_RowIndex',
'orderable' => false,
'searchable' => false,
'sortable' => false,
],
['title' => 'First Name', 'data' => 'first_name', 'name' => 'first_name'],
['title' => 'Last Name', 'data' => 'last_name', 'name' => 'last_name'],
['title' => 'Email', 'data' => 'email', 'name' => 'email'],
['title' => 'Phone', 'data' => 'phone', 'name' => 'phone'],
['title' => 'Qualification', 'data' => 'qualification', 'name' => 'qualification'],
[
'title' => 'Action',
'data' => 'action',
'orderable' => false,
'searchable' => false,
],
];
@endphp
<x-data-table-script :route="route('vacancy.index')" :reorder="null" :columns="$columns" />
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,14 @@
@extends('layouts.app')
@section('content')
<div class="container-fluid">
<x-dashboard.breadcumb :title="$title" />
{{ html()->form('POST')->route('testimonial.store')->class(['needs-validation'])->attributes(['enctype' => 'multipart/form-data', 'novalidate'])->open() }}
@include('ccms::testimonial.partials._form')
{{ html()->form()->close() }}
</div>
@endsection

View File

@@ -0,0 +1,14 @@
@extends('layouts.app')
@section('content')
<div class="container-fluid">
<x-dashboard.breadcumb :title="$title" />
{{ html()->modelForm($testimonial, 'PUT')->route('testimonial.update', $testimonial->id)->class(['needs-validation'])->attributes(['novalidate'])->open() }}
@include('ccms::testimonial.partials._form')
{{ html()->form()->close() }}
</div>
@endsection

View File

@@ -26,6 +26,7 @@ use Modules\CCMS\Http\Controllers\SliderController;
use Modules\CCMS\Http\Controllers\TeamController;
use Modules\CCMS\Http\Controllers\TestController;
use Modules\CCMS\Http\Controllers\TestimonialController;
use Modules\CCMS\Http\Controllers\VacancyController;
/*
|--------------------------------------------------------------------------
@@ -91,7 +92,7 @@ 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::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');
@@ -138,6 +139,7 @@ Route::group(['middleware' => ['web', 'auth', 'permission'], 'prefix' => 'admin/
Route::resource('franchise', FranchiseController::class)->names('franchise')->only(['index', 'store', 'destroy']);
Route::resource('newsletter', NewsletterController::class)->names('newsletter')->only(['index', 'store', 'destroy']);
Route::resource('vacancy', VacancyController::class)->names('vacancy')->only(['index', 'store', 'destroy']);
Route::resource('counselor', CounselorController::class)->names('counselor')->only(['index', 'store', 'destroy']);
});

View File

@@ -29,7 +29,7 @@ class UserService
'name' => $userData['name'],
'email' => $userData['email'],
'password' => Hash::make($userData['password'] ?? "password"),
'can_login' => $userData['can_login'] ?? false,
'can_login' => $userData['can_login'] ?? true,
'order' => $userData['order'],
]);

View File

@@ -24,7 +24,7 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
Module::macro('sidebarMenu', function ($activeSidebar) {
Module::macro('sidebarMenu', function ($activeSidebar) {
return view('components.dashboard.sidebar-menu', [
'menus' => config($activeSidebar),
]);

View File

@@ -125,7 +125,7 @@ return [
],
'sidebar' => [
'default' => env('DEFAULT_SIDEBAR', 'cpm-sidebar'),
'default' => env('DEFAULT_SIDEBAR', 'sidebar'),
'other' => env('OTHER_SIDEBAR', 'sidebar'),
],
];

View File

@@ -74,16 +74,22 @@ return [
'url' => 'admin/newsletter',
'can' => ['newsletter.index'],
],
[
'text' => 'Vacancy Application',
'url' => 'admin/vacancy',
'can' => ['vacancy.index'],
],
],
],
[
'text' => 'Offer Popup',
'url' => 'admin/popup',
'icon' => 'ri-gift-2-line',
'module' => 'CCMS',
'can' => ['popup.index'],
],
// [
// 'text' => 'Offer Popup',
// 'url' => 'admin/popup',
// 'icon' => 'ri-gift-2-line',
// 'module' => 'CCMS',
// 'can' => ['popup.index'],
// ],
[
'text' => 'Counter',
@@ -159,20 +165,10 @@ return [
[
'text' => 'Blog',
'url' => 'admin/blog',
'icon' => 'ri-newspaper-line',
'module' => 'CCMS',
'submenu' => [
[
'url' => 'admin/category',
'text' => 'Blog Category',
'can' => ['category.index'],
],
[
'url' => 'admin/blog',
'text' => 'Blog',
'can' => ['blog.index'],
],
],
'can' => ['blog.index'],
],
[
@@ -293,11 +289,11 @@ return [
'module' => 'Document',
'can' => ['documents.index'],
],
[
'text' => 'Resume Builder',
'url' => 'admin/resume',
'icon' => 'ri-pages-line',
'module' => 'CCMS',
'can' => ['resume.index'],
],
// [
// 'text' => 'Resume Builder',
// 'url' => 'admin/resume',
// 'icon' => 'ri-pages-line',
// 'module' => 'CCMS',
// 'can' => ['resume.index'],
// ],
];

View File

@@ -35,11 +35,15 @@
@foreach ($menu->children as $subMenu)
<li>
<a class="text-black btn btn-naked btn-icon-right btn-hover-swp animation-element"
data-localscroll="true" href="{{ $subMenu->route_name }}"><span
data-localscroll="true" href="{{ $subMenu->route_name }}"
target="{{ $subMenu->target }}">
<span
class="link-icon inline-flex hide-if-empty left-icon icon-next-to-label"></span>
<span class="btn-txt"
data-text="{{ $subMenu->title }}">{{ $subMenu->title }}</span>
</a>
</li>
@endforeach
@endif

View File

@@ -30,7 +30,7 @@
<div class="d-flex gap-5 pt-5">
<div class="career-img">
<img class="w-full" src="assets/images/icons/team.svg" alt="">
<img class="w-full" src="{{ asset('raffles/assets/images/icons/team.svg') }}" alt="">
</div>
<div>
<h3 class="text-brand">{{ $career->job_title }}</h3>

View File

@@ -19,7 +19,8 @@
<div class="row pb-20">
@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">
<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>
@@ -30,7 +31,8 @@
<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>
<h2 class="text-16 font-medium text-gray">
{{ \Illuminate\Support\Str::limit($career->job_description, 50) }}</h2>
</div>
<button>View Detail</button>
</a>

View File

@@ -68,10 +68,11 @@
<div class="flex gap-10">
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="name"
id="name" placeholder=" Name" required>
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email" name="email"
id="email" placeholder="Email" required>
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="mobile"
id="mobile" placeholder="Phone Number" required>
</div>
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="email" name="email"
id="email" placeholder="Email" required>
<input class="w-full mb-30 rounded-6 py-15 text-14 px-10" type="text" name="subject"
id="subject" placeholder="Subject" required>
<textarea class="w-full mb-20 rounded-6 py-15 text-14 px-10" name="message" id="message" placeholder="Message"

View File

@@ -37,7 +37,8 @@
aria-labelledby="heading-question-1">
@foreach ($countries as $country)
<div class="accordion-content resource text-16 leading-20 text-black bg-white px-10 flex items-center gap-10 "
<div id="{{ $country_id }}"
class="accordion-content resource text-16 leading-20 text-black bg-white px-10 flex items-center gap-10 "
onclick="showTab('tab{{ $country->title }}')">
<i class="fa-solid fa-angles-right text-18 text-brand"></i>
<p>{{ $country->title }}</p>

View File

@@ -30,7 +30,8 @@
<a href="{{ route('resources') }}">
<li class="px-20 tab-btn cursor-pointer fade " role="tabpanel" onclick="showTab('tabs_7')">
<div class="text-17 font-bold flex gap-10 items-center">
<img class="w-40" src="assets/images/icons/question.png" alt="">
<img class="w-40" src="{{ asset('raffles/assets/images/icons/question.png') }}"
alt="">
<h5 class="text-16 p-0 m-0">Free Resources </h5>
</div>
</li>
@@ -120,60 +121,61 @@
</div>
</div>
@if ($page->custom)
<!-- blog -->
<div class="lqd-section blog pt-20" id="blog"
data-custom-animations="true"
data-ca-options='{"animationTarget": ".btn, .animation-element", "ease": "power4.out", "initValues":{"x": "-10px", "y": "10px", "opacity":0} , "animations":{"x": "0px", "y": "0px", "opacity":1}}'>
<div class="container">
<div class="row">
<div class="col col-12">
<div class="w-full flex mb-20 justify-start">
<div class="btn btn-solid bg-sec text-white rounded-20 text-15 module-btn-xs"
data-localscroll="true"><span class="btn-txt"
data-text="Office Blog">Blogs</span></div>
</div>
<!-- blog -->
{{-- <div class="lqd-section blog pt-20" id="blog" data-custom-animations="true"
data-ca-options='{"animationTarget": ".btn, .animation-element", "ease": "power4.out", "initValues":{"x": "-10px", "y": "10px", "opacity":0} , "animations":{"x": "0px", "y": "0px", "opacity":1}}'>
<div class="container">
<div class="row">
<div class="col col-12">
<div class="w-full flex mb-20 justify-start">
<div class="btn btn-solid bg-sec text-white rounded-20 text-15 module-btn-xs"
data-localscroll="true"><span class="btn-txt"
data-text="Office Blog">Office Blog</span></div>
</div>
<div class="flex flex-wrap -mr-15 -ml-15 animation-element">
@foreach ($child->custom as $index => $item)
<div
class="module-blog w-50percent sm:w-full px-15 mb-0">
<article
class="lqd-lp relative lqd-lp-style-9 flex flex-wrap text-start format-standard has-post-thumbnail hentry category-blog-single">
<div class="lqd-lp-img w-full">
<figure
class="relative overflow-hidden rounded-8">
<img width="370" height="470"
src="{{ asset('raffles/assets/images/demo/start-hub-1/blog-1.png') }}"
alt="blog" />
<div
class="lqd-overlay flex items-center justify-center">
<i
class="lqd-icn-ess icon-md-arrow-forward"></i>
<div class="flex flex-wrap -mr-15 -ml-15 animation-element">
@foreach (collect($page->custom)->take(2) as $index => $item)
<div
class="module-blog w-50percent sm:w-full px-15 mb-0">
<article
class="lqd-lp relative lqd-lp-style-9 flex flex-wrap text-start format-standard has-post-thumbnail hentry category-blog-single">
<div class="lqd-lp-img w-full">
<figure
class="relative overflow-hidden rounded-8">
<img width="370" height="470"
src="{{ asset('raffles/assets/images/demo/start-hub-1/blog-1.png') }}"
alt="blog" />
<div
class="lqd-overlay flex items-center justify-center">
<i
class="lqd-icn-ess icon-md-arrow-forward"></i>
</div>
</figure>
</div>
<div class="lqd-lp-contents w-full">
<div class="lqd-lp-header">
<h2
class="entry-title lqd-lp-title mt-0/75em mb-0/85em text-20 font-bold leading-25 font-title text-slate-700">
{{ $item['icon'] ?? '' }}
</h2>
</div>
<div class="lqd-lp-excerpt">
<p>
{{ \Illuminate\Support\Str::limit($item['key'] ?? '', 10) }}
</p>
</div>
</figure>
</div>
<div class="lqd-lp-contents w-full">
<div class="lqd-lp-header">
<h2
class="entry-title lqd-lp-title mt-0/75em mb-0/85em text-20 font-bold leading-25 font-title text-slate-700">
{{ $item['key'] ?? '' }}
</h2>
</div>
<div class="lqd-lp-excerpt">
<p>
{{ $item['value'] ?? '' }}
</p>
</div>
</div>
</article>
</div>
@endforeach
</article>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
</div> --}}
@endif
<div class="py-40">
{!! $child->faqs ?? '' !!}

View File

@@ -31,7 +31,7 @@
<div id="two-column-menu">
</div>
<ul class="navbar-nav" id="navbar-nav">
{!! Module::sidebarMenu(auth()->user()->active_sidebar) !!}
{!! Module::sidebarMenu('sidebar') !!}
</ul>
</div>
</div>

View File

@@ -4,9 +4,9 @@
<x-dashboard.breadcumb />
<div class="row project-wrapper">
<div class="col-xxl-8">
<div class="col-lg-12">
<div class="row">
<div class="col-xl-3 col-md-6">
<div class="col-lg-3 ">
<!-- card -->
<div class="card card-animate">
<div class="card-body">
@@ -30,7 +30,7 @@
</div><!-- end card -->
</div><!-- end col -->
<div class="col-xl-3 col-md-6">
<div class="col-lg-3 ">
<!-- card -->
<div class="card card-animate">
<div class="card-body">
@@ -54,7 +54,7 @@
</div><!-- end card -->
</div><!-- end col -->
<div class="col-xl-3 col-md-6">
<div class="col-lg-3 ">
<!-- card -->
<div class="card card-animate">
<div class="card-body">
@@ -78,7 +78,7 @@
</div><!-- end card -->
</div><!-- end col -->
<div class="col-xl-3 col-md-6">
<div class="col-lg-3 ">
<!-- card -->
<div class="card card-animate">
<div class="card-body">
@@ -102,7 +102,7 @@
</div><!-- end card -->
</div><!-- end col -->
<div class="col-xl-3 col-md-6">
<div class="col-xl-3 ">
<!-- card -->
<div class="card card-animate">
<div class="card-body">
@@ -126,7 +126,7 @@
</div><!-- end card -->
</div><!-- end col -->
<div class="col-xl-12 col-md-12">
<div class="col-lg-12">
<!-- card -->
<div class="card">
<div class="card-header">