feat: Implement vacancy management features including listing, creating, and editing vacancies
This commit is contained in:
@@ -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',
|
||||
]);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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>
|
37
Modules/CCMS/resources/views/vacancy/index.blade.php
Normal file
37
Modules/CCMS/resources/views/vacancy/index.blade.php
Normal 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
|
@@ -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
|
14
Modules/CCMS/resources/views/vacancy/partials/edit.blade.php
Normal file
14
Modules/CCMS/resources/views/vacancy/partials/edit.blade.php
Normal 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
|
@@ -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']);
|
||||
});
|
||||
|
@@ -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'],
|
||||
]);
|
||||
|
||||
|
@@ -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),
|
||||
]);
|
||||
|
@@ -125,7 +125,7 @@ return [
|
||||
],
|
||||
|
||||
'sidebar' => [
|
||||
'default' => env('DEFAULT_SIDEBAR', 'cpm-sidebar'),
|
||||
'default' => env('DEFAULT_SIDEBAR', 'sidebar'),
|
||||
'other' => env('OTHER_SIDEBAR', 'sidebar'),
|
||||
],
|
||||
];
|
||||
|
@@ -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'],
|
||||
// ],
|
||||
];
|
||||
|
@@ -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
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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"
|
||||
|
@@ -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>
|
||||
|
@@ -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 ?? '' !!}
|
||||
|
@@ -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>
|
||||
|
@@ -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">
|
||||
|
Reference in New Issue
Block a user