Simplify course search functionality and update route names for clarity

This commit is contained in:
2025-08-04 17:44:59 +05:45
parent afc7c61f86
commit 6772e269fb
6 changed files with 378 additions and 192 deletions

View File

@@ -217,10 +217,7 @@ class ProgramController extends Controller
}
if ($request->filled('search')) {
$query->where(function ($q) use ($request) {
$q->where('keywords', 'like', "%{$request->search}%")
->orWhere('title', 'like', "%{$request->search}%");
});
$query->where('title', 'like', "%{$request->search}%");
}
if ($request->filled('programlevels_id')) {

View File

@@ -23,7 +23,7 @@ class ProgramService
if ($request->filled('intake_id')) {
$intakeId = $request->intake_id;
$query->whereJsonContains('intake', $intakeId);
$query->whereJsonContains('intakes', $intakeId);
}
if ($request->filled('status')) {
@@ -32,14 +32,13 @@ class ProgramService
if ($request->filled('search')) {
$search = $request->search;
$query->where('keywords', 'like', "%{$search}%");
$query->where('title', 'like', "%{$search}%");
}
if ($request->filled('location')) {
$location = $request->location;
$query->where('location', 'like', "%{$location}%");
}
})->latest()->paginate(10)->withQueryString();
}

View File

@@ -3,14 +3,18 @@
use App\Http\Controllers\WebsiteController;
use Illuminate\Support\Facades\Route;
use Modules\CCMS\Http\Controllers\EnquiryController;
use Modules\CourseFinder\Http\Controllers\CoopController;
use Modules\CourseFinder\Http\Controllers\ProgramController;
use Modules\CourseFinder\Http\Controllers\ProgramLevelController;
Route::get('/', [WebsiteController::class, 'home']);
Route::get('/course-finder', [WebsiteController::class, 'coursefinder']);
Route::get('/course-finder', [WebsiteController::class, 'coursefinder'])->name('program.coursefinder');
Route::get('/resources', [WebsiteController::class, 'resources'])->name('resources');
Route::get('blog/{alias}', [WebsiteController::class, 'blogSingle'])->name('blog.single');
Route::get('service/{alias}', [WebsiteController::class, 'serviceSingle'])->name('service.single');
Route::get('test/{alias}', [WebsiteController::class, 'testSingle'])->name('test.single');
Route::get('destination/{alias}', [WebsiteController::class, 'countrySingle'])->name('country.single');
Route::get('/home/resources', [WebsiteController::class, 'resources']);
Route::get('{parent}/{slug?}', [WebsiteController::class, 'loadPage'])->name('page.load');
Route::get('getCoursesList', [ProgramController::class, 'getCoursesList'])->name('program.getCoursesList');
Route::post('enquiry', [EnquiryController::class, 'store'])->name('enquiry.store');
Route::get('{parent}/{slug?}', [WebsiteController::class, 'loadPage'])->name('page.load');

View File

@@ -8,7 +8,6 @@
<img class="w-full h-full" src="{{ $item->institution?->image }}" alt="">
</div>
</div>
<div class="col col-md-7">
<div class="flex flex-col gap-5">
<h3 class="text-20 font-medium">{{ $item->title }}</h3>

View File

@@ -0,0 +1,261 @@
@extends('client.raffles.layouts.app')
@section('content')
<div class="services-banner">
<img src="{{ asset('raffles/assets/images/backgrounds_general/course-finder-banner.png')}}" width="1425" height="356" alt="course finder">
</div>
<div class="container section">
<!-- Main Content -->
<div class="row">
<div class="col col-md-8">
<!-- Course Header -->
<div class="course-header">
<div class="university-info">
<div class="university-loo sm:w-50percent w-125 "> <img class="w-full h-full" src="assets/images/general/university.jpg" alt=""></div>
<div class="university-details">
<h1>(STEM) Bachelor of Architecture (BArch)</h1>
<div class="university-name">Marywood University (USA)</div>
</div>
</div>
<div class="course-meta">
<div class="meta-item">
<div class="meta-label">Course Code</div>
<div class="meta-value">BArch</div>
</div>
<div class="meta-item">
<div class="meta-label">Duration</div>
<div class="meta-value">4 Years</div>
</div>
<div class="meta-item">
<div class="meta-label">Level</div>
<div class="meta-value">Bachelor</div>
</div>
<div class="meta-item">
<div class="meta-label">Annual Fee</div>
<div class="meta-value">$41,700</div>
</div>
<div class="meta-item">
<div class="meta-label">Scholarship</div>
<div class="meta-value">Up to $25,000</div>
</div>
</div>
</div>
<!-- Course Content -->
<div class="course-content">
<!-- Course Overview -->
<div class="content-section">
<h2 class="section-title">Course Overview</h2>
<p>The Bachelor of Architecture (BArch) program at Marywood University is a comprehensive 4-year STEM-designated degree that prepares students for professional practice in architecture. This program combines creative design thinking with technical knowledge, sustainability principles, and cutting-edge technology to develop well-rounded architects ready for the challenges of the 21st century.</p>
<br>
<p>Students will engage in hands-on design studios, learn from experienced faculty, and have access to state-of-the-art facilities including digital fabrication labs, 3D printing, and virtual reality design tools. The program emphasizes both theoretical knowledge and practical application, ensuring graduates are prepared for licensure and professional practice.</p>
</div>
<!-- Entry Requirements -->
<div class="content-section">
<h2 class="section-title">Entry Requirements</h2>
<div class="requirements-grid">
<div class="requirement-card">
<div class="requirement-title">English Language Requirements</div>
<div class="requirement-details">
<div class="score-badge">IELTS: 5.5 (5.5)</div>
<div class="score-badge">PTE: 48 (48)</div>
<div class="score-badge">Duolingo: 90 Overall</div>
<div class="score-badge">TOEFL: 70 Overall</div>
</div>
</div>
<div class="requirement-card">
<div class="requirement-title">Academic Requirements</div>
<div class="requirement-details">
High School Diploma or equivalent<br>
Minimum GPA of 3.0<br>
Mathematics and Physics recommended<br>
Portfolio submission required
</div>
</div>
<div class="requirement-card">
<div class="requirement-title">Additional Documents</div>
<div class="requirement-details">
Official transcripts<br>
Letters of recommendation (2)<br>
Personal statement<br>
Portfolio of creative work
</div>
</div>
<div class="requirement-card">
<div class="requirement-title">Application Deadlines</div>
<div class="requirement-details">
Fall Semester: June 1st<br>
Spring Semester: November 1st<br>
Early Decision: March 15th<br>
Rolling admissions available
</div>
</div>
</div>
</div>
<!-- Fees Breakdown -->
<div class="content-section">
<h2 class="section-title">Fees Breakdown</h2>
<table class="fees-table">
<thead>
<tr>
<th>Fee Type</th>
<th>Amount (USD)</th>
<th>Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tuition Fee</td>
<td>$38,500</td>
<td>Per Year</td>
</tr>
<tr>
<td>Technology Fee</td>
<td>$1,200</td>
<td>Per Year</td>
</tr>
<tr>
<td>Student Activities</td>
<td>$800</td>
<td>Per Year</td>
</tr>
<tr>
<td>Health Services</td>
<td>$600</td>
<td>Per Year</td>
</tr>
<tr>
<td>Library Fee</td>
<td>$400</td>
<td>Per Year</td>
</tr>
<tr>
<td>Application Fee</td>
<td>$50</td>
<td>One Time</td>
</tr>
<tr class="total-row">
<td><strong>Total Annual Cost</strong></td>
<td><strong>$41,700</strong></td>
<td><strong>Per Year</strong></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col col-md-4">
<!-- Sidebar -->
<aside class="sidebar">
<!-- Contact Form -->
<div class="sidebar-card">
<h3 class="sidebar-title">Get Your Free Counselling!</h3>
<form>
<div class="form-group">
<input type="text" placeholder="Full Name" required>
</div>
<div class="form-group">
<input type="tel" placeholder="Phone" required>
</div>
<div class="form-group">
<input type="email" placeholder="Email" required>
</div>
<div class="form-group">
<textarea placeholder="Message"></textarea>
</div>
<button type="submit" class="btn-blue">Submit</button>
</form>
</div>
<!-- Quick Info -->
<div class="quick-info">
<h3 class="sidebar-title">Quick Information</h3>
<div class="info-item">
<span class="info-label">Application Fee:</span>
<span class="info-value">$50</span>
</div>
<div class="info-item">
<span class="info-label">Processing Time:</span>
<span class="info-value">2-4 weeks</span>
</div>
<div class="info-item">
<span class="info-label">Campus Location:</span>
<span class="info-value">Scranton, PA</span>
</div>
<div class="info-item">
<span class="info-label">Student Body:</span>
<span class="info-value">2,500+ students</span>
</div>
<div class="info-item">
<span class="info-label">Accreditation:</span>
<span class="info-value">NAAB Accredited</span>
</div>
<div class="info-item">
<span class="info-label">Class Size:</span>
<span class="info-value">15-20 students</span>
</div>
<div class="info-item">
<span class="info-label">Faculty Ratio:</span>
<span class="info-value">1:12</span>
</div>
</div>
<!-- Intake Information -->
<div class="content-section">
<h2 class="section-title">Available Intakes</h2>
<div class="intake-badges">
<div class="intake-badge">January 2024</div>
<div class="intake-badge">August 2024</div>
<div class="intake-badge">January 2025</div>
</div>
</div>
<!-- Course Modules -->
<div class="content-section">
<h2 class="section-title">Course Modules</h2>
<div class="modules-grid">
<div class="module-item">
<div class="module-name">Architectural Design Studio I-VIII</div>
<div class="module-credits">32 Credits</div>
</div>
<div class="module-item">
<div class="module-name">History of Architecture</div>
<div class="module-credits">6 Credits</div>
</div>
<div class="module-item">
<div class="module-name">Building Technology & Materials</div>
<div class="module-credits">9 Credits</div>
</div>
<div class="module-item">
<div class="module-name">Structural Systems</div>
<div class="module-credits">6 Credits</div>
</div>
<div class="module-item">
<div class="module-name">Environmental Systems</div>
<div class="module-credits">6 Credits</div>
</div>
</div>
</div>
</aside>
</div>
</div>
@endsection

View File

@@ -14,13 +14,13 @@
</div>
{{ html()->form('GET')->route('program.index')->class(['filter-form', 'filterForm'])->attributes(['id' => 'filter-form'])->open() }}
{{ html()->form('GET')->route('program.coursefinder')->class(['filter-course-form'])->attributes(['id' => 'filter-course-form'])->open() }}
<div class="row">
<div class=" col col-md-9 ">
<div class=" course-finder-top">
<h2 class="text-black text-center text-24 py-10">Browse Subjects</h2>
{{ html()->text('search')->value(request('search'))->placeholder('Search Program')->class('form-control px-10 py-10')->style('width: 95%;') }}
<button type="submit" class="bg-transparent border-0"><i
{{ html()->text('search')->placeholder('Search Program...')->class('form-control px-10 py-10')->style('width: 95%;') }}
<button class="bg-transparent border-0"><i
class="lqd-icn-ess icon-ld-search-2 text-24 font-bold"></i></button>
</div>
</div>
@@ -70,10 +70,9 @@
<div class="col col-sm-6 col-md-4">
<div class="flex gap-10 items-center flex-wrp">
<input class="text-14 px-5 py-10 w-50percent" type="text" name="min_score"
placeholder="Min score" value="{{ request('min_score') }}">
<input class="text-14 px-5 py-10 w-50percent" type="text" placeholder="Max Score"
value="{{ request('max_score') }}">
{{ html()->text('min_score')->class('form-control form-control-sm numeric bg-light text-14 px-5 py-10 w-50percent')->placeholder('Min score') }}
{{ html()->text('max_score')->class('form-control form-control-sm numeric bg-light text-14 px-5 py-10 w-50percent')->placeholder('Max score') }}
</div>
</div>
@@ -82,18 +81,17 @@
<button type="submit"
class="text-14 px-20 py-10 rounded-10 bg-sec text-white border-0">Submit</button>
<a href="javascript:void(0)" onclick="resetForm()"><button
class="text-14 px-20 py-10 rounded-10 bg-brand text-white border-0">Reset</button></a>
class="text-14 px-20 py-10 rounded-10 bg-brand text-white border-0 reset-course-filter">Reset</button></a>
</div>
</div>
</div>
</div>
{{ html()->form()->close() }}
<div class="data-wrapper py-20">
<h2 class="text-22 text-center text-sec font-bold">Available Courses</h2>
<div class="card">
<div class="card-body">
<div class="data-wrapper py-20" id="data-wrapper">
@forelse ($programs as $item)
<h2 class="text-22 text-center text-sec font-bold">Available Courses</h2>
<div class="course-finder-box">
<div class="row">
<div class="col col-md-2">
@@ -118,7 +116,8 @@
{{ !empty($item->fee) ? $item->fee : 'N/A' }}</h6>
<h6 class="text-grey font-medium text-14"><span
class="font-bold">Schlorship:</span>
{{ !empty($item->scholarship) ? $item->scholarship : 'N/A' }}</h6>
{{ !empty($item->scholarship) ? $item->scholarship : 'N/A' }}
</h6>
</div>
<div class="flex gap-10 items-center">
@@ -159,7 +158,8 @@
@if (!empty($item->intakes))
<h6 class="text-16">Intake:</h6>
@forelse ($item->intakes as $value)
<h6 class="bg-sec text-14 text-white px-5 py-5 rounded-10 font-bold">
<h6
class="bg-sec text-14 text-white px-5 py-5 rounded-10 font-bold">
{{ $intakeOptions[$value] }}</h6>
</h6>
@empty
@@ -173,12 +173,31 @@
</div>
@empty
<div class="card">
<div class="card-body">
<div class="data-wrapper py-20" id="data-wrapper">
<div class="text-center">
<p class="text-danger">No Course Found !!!</p>
<h2 class="text-danger">No Course Found !!!</h2>
</div>
</div>
</div>
</div>
@endforelse
{{ $programs->links() }}
</div>
<div class="auto-load text-center" style="display: none;">
<svg version="1.1" id="L9" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="60"
viewBox="0 0 100 100" enable-background="new 0 0 0 0" xml:space="preserve">
<path fill="#000"
d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50">
<animateTransform attributeName="transform" attributeType="XML" type="rotate"
dur="1s" from="0 50 50" to="360 50 50" repeatCount="indefinite" />
</path>
</svg>
</div>
</div>
</div>
</div>
<div class="col col-md-3">
<div class=" sticky top-60 " data-custom-animations="true"
@@ -211,102 +230,9 @@
</div>
</div>
</div>
{{ html()->form()->close() }}
<!-- next row for b -->
<!-- form starts -->
</div>
@endsection
@push('js')
<script>
const url = "{{ route('program.getCoursesList') }}";
let isLoading = false;
$(document).ready(function() {
setTimeout(() => {
infiniteLoadMore(1)
}, 2000);
})
// var institutionSelect = $('.institution-select').select2();
$(document).on('submit', '#filter-course-form', function(event) {
event.preventDefault();
const page = 1;
if (!isLoading) {
isLoading = true;
infiniteLoadMore(page);
}
})
// $(document).on('click', '.reset-course-filter', function(event) {
// event.preventDefault();
// const page = 1;
// $('.institution-select').val(null).trigger('change.select2');
// institutionSelect.select2('destroy').select2();
// $('#filter-course-form')
// .find('input:not([type="hidden"]), select, textarea')
// .val('')
// .prop('checked', false)
// .prop('selected', false);
// if (!isLoading) {
// isLoading = true;
// infiniteLoadMore(page);
// }
// })
$(document).on('click', '.pagination .page-link', function(event) {
event.preventDefault();
const page = $(this).attr('href').split('page=')[1];
if (!isLoading) {
isLoading = true;
infiniteLoadMore(page);
}
});
function infiniteLoadMore(page) {
$.ajax({
url: `${url}?page=${page}`,
datatype: "html",
type: "GET",
data: $('#filter-course-form').serializeArray(),
beforeSend: function() {
$("#data-wrapper").empty();
$('.auto-load').show();
}
})
.done(function(response) {
if (response.html == '') {
$('#total-result').text(`Total Results: ${response.queryCount}`);
$('.pagination').closest().parent().find('nav').hide();
$("#data-wrapper").empty().append(`
<div class="card">
<div class="card-body">
<p class="d-flex align-items-center justify-content-center">
No data to display :(
</p>
</div>
</div>
`);
$('.auto-load').hide();
return;
}
$('.auto-load').hide();
$('#total-result').text(`Total Results: ${response.queryCount}`);
$("#data-wrapper").empty().append(response.html);
})
.fail(function(jqXHR, ajaxOptions, thrownError) {
console.log('Server error occurred');
})
.always(function() {
isLoading = false;
});
}
</script>
@endpush