course finder view page completed

This commit is contained in:
2025-08-06 17:55:22 +05:45
parent 6772e269fb
commit 59e5392370
16 changed files with 3856 additions and 2435 deletions

View File

@@ -35,12 +35,18 @@ class Program extends Model
'scholarship',
'level',
'program_url',
'fee_breakdown',
'course_module',
'quick_info',
'academic_module',
'additional_module',
'application_module',
'status',
'remarks',
'createdby',
'updatedby',
];
public const INTAKE = [
1 => 'January',
@@ -62,6 +68,12 @@ class Program extends Model
'required_documents' => 'json',
'prof_test_accepted' => 'object',
'level' => 'object',
'fee_breakdown' => 'object',
'course_module' => 'object',
'quick_info' => 'object',
'academic_module' => 'object',
'additional_module' => 'object',
'application_module' => 'object',
];
public function institution()

View File

@@ -0,0 +1,32 @@
<?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::table('programs', function (Blueprint $table) {
$table->json('fee_breakdown')->nullable();
$table->json('course_module')->nullable();
$table->json('quick_info')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('programs', function (Blueprint $table) {
$table->dropColumn('fee_breakdown');
$table->dropColumn('course_module');
$table->dropColumn('quick_info');
});
}
};

View File

@@ -0,0 +1,32 @@
<?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::table('programs', function (Blueprint $table) {
$table->json('academic_module')->nullable();
$table->json('additional_module')->nullable();
$table->json('application_module')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('programs', function (Blueprint $table) {
$table->dropColumn('academic_module');
$table->dropColumn('additional_module');
$table->dropColumn('application_module');
});
}
};

View File

@@ -0,0 +1,16 @@
<tr class="academic-module">
<td class="d-flex flex-column gap-2">
{{ html()->text('academic_module[' . $numInc . '][requirements]')->class('form-control numeric')->value($value->requirements ?? null)->placeholder('Requirements') }}
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" class="btn btn-sm btn-secondary fw-medium" onclick="cloneRow(this)"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)"><i
class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
</tr>

View File

@@ -0,0 +1,16 @@
<tr class="additional-module">
<td class="d-flex flex-column gap-2">
{{ html()->text('additional_module[' . $numInc . '][requirements]')->class('form-control numeric')->value($value->requirements ?? null)->placeholder('Requirements') }}
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" class="btn btn-sm btn-secondary fw-medium" onclick="cloneRow(this)"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)"><i
class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
</tr>

View File

@@ -0,0 +1,16 @@
<tr class="application-module">
<td class="d-flex flex-column gap-2">
{{ html()->text('application_module[' . $numInc . '][requirements]')->class('form-control numeric')->value($value->requirements ?? null)->placeholder('Requirements') }}
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" class="btn btn-sm btn-secondary fw-medium" onclick="cloneRow(this)"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)"><i
class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
</tr>

View File

@@ -0,0 +1,20 @@
<tr class="course-module">
<td class="d-flex flex-column gap-2">
{{ html()->text('course_module[' . $numInc . '][title]')->class('form-control numeric')->value($value->title ?? null)->placeholder('Course Module Title') }}
</td>
<td>
{{ html()->text('course_module[' . $numInc . '][credit_hour]')->class('form-control numeric')->value($value->credit_hour ?? null)->placeholder('Credit Hours') }}
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" class="btn btn-sm btn-secondary fw-medium" onclick="cloneRow(this)"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)"><i
class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
</tr>

View File

@@ -0,0 +1,36 @@
<tr class="fee-breakdown">
<td class="d-flex flex-column gap-2">
{{ html()->text('fee_breakdown[' . $numInc . '][application_fee]')->class('form-control')->value($value->application_fee ?? null)->placeholder('Application Fee') }}
</td>
<td>
{{ html()->text('fee_breakdown[' . $numInc . '][tution_fee]')->class('form-control')->value($value->tution_fee ?? null)->placeholder('Tution Fee') }}
</td>
<td>
{{ html()->text('fee_breakdown[' . $numInc . '][health_service]')->class('form-control')->value($value->health_service ?? null)->placeholder('Health Service') }}
</td>
<td>
{{ html()->text('fee_breakdown[' . $numInc . '][student_activities]')->class('form-control')->value($value->student_activities ?? null)->placeholder('Student Activities') }}
</td>
<td>
{{ html()->text('fee_breakdown[' . $numInc . '][technology_fee]')->class('form-control')->value($value->technology_fee ?? null)->placeholder('Technology Fee') }}
</td>
<td>
{{ html()->text('fee_breakdown[' . $numInc . '][library_fee]')->class('form-control')->value($value->library_fee ?? null)->placeholder('Library Fee') }}
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" onclick="cloneRow(this)" class="btn btn-sm btn-secondary fw-medium"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)">
<i class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
</tr>

View File

@@ -167,6 +167,7 @@
<tbody>
@if ($editable)
@if ($program->level)
@forelse ($program->level as $key => $item)
@include('coursefinder::program.partials.qualification-form', [
'numInc' => $key,
@@ -246,6 +247,125 @@
<!-- end card body -->
</div>
<!-- end card -->
<div class="card">
<div class="card-header">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h6 class="card-title mb-0">Fee Breakdown</h6>
</div>
<div class="flex-shrink-0">
<ul class="list-inline card-toolbar-menu d-flex align-items-center mb-0">
<li class="list-inline-item">
<a class="minimize-card collapsed align-middle" data-bs-toggle="collapse"
href="#collapse-fee-breakdown" role="button" aria-expanded="false"
aria-controls="collapseExample2">
<i class="mdi mdi-plus plus align-middle"></i>
<i class="mdi mdi-minus minus align-middle"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="card-body show collapse" id="collapse-fee-breakdown">
<div class="table-responsive">
<table class="table-borderless table-nowrap table-sm table" id="feeBreakdown-table">
<thead class="table-primary text-center">
<tr>
<th scope="col">Application Fee</th>
<th scope="col">Tution Fee</th>
<th scope="col">Health Service</th>
<th scope="col">Student Activities</th>
<th scope="col">Technology Fee</th>
<th scope="col">Library Fee</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@if ($editable)
@if ($program->fee_breakdown)
@forelse ($program->fee_breakdown as $key => $item)
@include('coursefinder::program.partials.feeBreakdown', [
'numInc' => $key,
'value' => $item,
])
@empty
@endforelse
@else
@include('coursefinder::program.partials.feeBreakdown', [
'numInc' => 0,
])
@endif
@else
@include('coursefinder::program.partials.feeBreakdown', [
'numInc' => 0,
])
@endif
</tbody>
</table>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h6 class="card-title mb-0">Course Module</h6>
</div>
<div class="flex-shrink-0">
<ul class="list-inline card-toolbar-menu d-flex align-items-center mb-0">
<li class="list-inline-item">
<a class="minimize-card collapsed align-middle" data-bs-toggle="collapse"
href="#collapse-course-module" role="button" aria-expanded="false"
aria-controls="collapseExample2">
<i class="mdi mdi-plus plus align-middle"></i>
<i class="mdi mdi-minus minus align-middle"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="card-body show collapse" id="collapse-course-module">
<div class="table-responsive">
<table class="table-borderless table-nowrap table-sm table" id="courseModule-table">
<thead class="table-primary text-center">
<tr>
<th scope="col">Title</th>
<th scope="col">Credit Hours</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@if ($editable)
@if ($program->course_module)
@forelse ($program->course_module as $key => $item)
@include('coursefinder::program.partials.courseModule', [
'numInc' => $key,
'value' => $item,
])
@empty
@endforelse
@else
@include('coursefinder::program.partials.courseModule', [
'numInc' => 0,
])
@endif
@else
@include('coursefinder::program.partials.courseModule', [
'numInc' => 0,
])
@endif
</tbody>
</table>
</div>
</div>
</div>
<div class="mb-3 text-end">
<a href="{{ route('program.index') }}" class="btn btn-danger w-sm">Cancel</a>
<button type="submit" class="btn btn-success w-sm">Save</button>
@@ -360,7 +480,7 @@
<ul class="list-inline card-toolbar-menu d-flex align-items-center mb-0">
<li class="list-inline-item">
<a class="minimize-card align-middle" data-bs-toggle="collapse"
href="#collapse-documents" role="button" aria-expanded="true"
href="#collapse-keywords" role="button" aria-expanded="true"
aria-controls="collapseExample2">
<i class="mdi mdi-plus plus align-middle"></i>
<i class="mdi mdi-minus minus align-middle"></i>
@@ -370,7 +490,7 @@
</div>
</div>
</div>
<div class="card-body show collapse" id="collapse-documents">
<div class="card-body show collapse" id="collapse-keywords">
<div class="d-flex flex-column flex-wrap gap-2">
{{ html()->text('keywords')->class('form-control')->attributes([
'data-choices' => 'true',
@@ -382,6 +502,178 @@
</div>
<!-- end card body -->
</div>
<div class="card bg-white">
<div class="card-header">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h6 class="card-title mb-0">Academic Requirements</h6>
</div>
<div class="flex-shrink-0">
<ul class="list-inline card-toolbar-menu d-flex align-items-center mb-0">
<li class="list-inline-item">
<a class="minimize-card align-middle" data-bs-toggle="collapse"
href="#collapse-academic" role="button" aria-expanded="true"
aria-controls="collapseExample2">
<i class="mdi mdi-plus plus align-middle"></i>
<i class="mdi mdi-minus minus align-middle"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="card-body show collapse" id="collapse-academic">
<div class="table-responsive">
<table class="table-borderless table-nowrap table-sm table" id="academic-table">
<thead class="table-primary text-center">
<tr>
<th scope="col">Requirements</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@if ($editable)
@if ($program->academic_module)
@forelse ($program->academic_module as $key => $item)
@include('coursefinder::program.partials.academic', [
'numInc' => $key,
'value' => $item,
])
@empty
@endforelse
@else
@include('coursefinder::program.partials.academic', [
'numInc' => 0,
])
@endif
@else
@include('coursefinder::program.partials.academic', [
'numInc' => 0,
])
@endif
</tbody>
</table>
</div>
</div>
<!-- end card body -->
</div>
<div class="card bg-white">
<div class="card-header">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h6 class="card-title mb-0">Additional Documents</h6>
</div>
<div class="flex-shrink-0">
<ul class="list-inline card-toolbar-menu d-flex align-items-center mb-0">
<li class="list-inline-item">
<a class="minimize-card align-middle" data-bs-toggle="collapse"
href="#collapse-additional" role="button" aria-expanded="true"
aria-controls="collapseExample2">
<i class="mdi mdi-plus plus align-middle"></i>
<i class="mdi mdi-minus minus align-middle"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="card-body show collapse" id="collapse-additional">
<div class="table-responsive">
<table class="table-borderless table-nowrap table-sm table" id="additional-table">
<thead class="table-primary text-center">
<tr>
<th scope="col">Requirements</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@if ($editable)
@if ($program->additional_module)
@forelse ($program->additional_module as $key => $item)
@include('coursefinder::program.partials.additional', [
'numInc' => $key,
'value' => $item,
])
@empty
@endforelse
@else
@include('coursefinder::program.partials.additional', [
'numInc' => 0,
])
@endif
@else
@include('coursefinder::program.partials.additional', [
'numInc' => 0,
])
@endif
</tbody>
</table>
</div>
</div>
<!-- end card body -->
</div>
<div class="card bg-white">
<div class="card-header">
<div class="d-flex align-items-center">
<div class="flex-grow-1">
<h6 class="card-title mb-0">Application Deadlines</h6>
</div>
<div class="flex-shrink-0">
<ul class="list-inline card-toolbar-menu d-flex align-items-center mb-0">
<li class="list-inline-item">
<a class="minimize-card align-middle" data-bs-toggle="collapse"
href="#collapse-applications" role="button" aria-expanded="true"
aria-controls="collapseExample2">
<i class="mdi mdi-plus plus align-middle"></i>
<i class="mdi mdi-minus minus align-middle"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="card-body show collapse" id="collapse-applications">
<div class="table-responsive">
<table class="table-borderless table-nowrap table-sm table" id="application-table">
<thead class="table-primary text-center">
<tr>
<th scope="col">Requirements</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@if ($editable)
@if ($program->application_module)
@forelse ($program->application_module as $key => $item)
@include('coursefinder::program.partials.application', [
'numInc' => $key,
'value' => $item,
])
@empty
@endforelse
@else
@include('coursefinder::program.partials.application', [
'numInc' => 0,
])
@endif
@else
@include('coursefinder::program.partials.application', [
'numInc' => 0,
])
@endif
</tbody>
</table>
</div>
</div>
<!-- end card body -->
</div>
<!-- end card -->
</div>
</div>

View File

@@ -1,25 +1,25 @@
<tr class="clone-proficiency">
<td>
{{ html()->select('prof_test_accepted[' . $numInc . '][test_id]', $testOptions)->class('form-select')->placeholder('Select')->value($value->id ?? null)->required() }}
{{ html()->div('Please choose test')->class('invalid-feedback') }}
<td>
{{ html()->select('prof_test_accepted[' . $numInc . '][test_id]', $testOptions)->class('form-select')->placeholder('Select')->value($value->id ?? null)->required() }}
{{ html()->div('Please choose test')->class('invalid-feedback') }}
</td>
</td>
<td class="d-flex flex-column gap-2">
{{ html()->text('prof_test_accepted[' . $numInc . '][min_score]')->class('form-control numeric')->value($value->pivot?->min_score ?? null)->placeholder('Min Score') }}
</td>
<td class="d-flex flex-column gap-2">
{{ html()->text('prof_test_accepted[' . $numInc . '][min_score]')->class('form-control numeric')->value($value->pivot?->min_score ?? null)->placeholder('Min Score') }}
</td>
<td>
{{ html()->text('prof_test_accepted[' . $numInc . '][band_score]')->class('form-control numeric')->value($value->pivot?->band_score ?? null)->placeholder('Band Score') }}
</td>
<td>
{{ html()->text('prof_test_accepted[' . $numInc . '][band_score]')->class('form-control numeric')->value($value->pivot?->band_score ?? null)->placeholder('Band Score') }}
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" class="btn btn-sm btn-secondary fw-medium" onclick="cloneRow(this)"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)"><i
class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
<td class="align-middle">
<div class="hstack gap-2">
<a href="javascript:void(0)" class="btn btn-sm btn-secondary fw-medium" onclick="cloneRow(this)"><i
class="ri-add-fill align-middle"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-danger" onclick="removeRow(this)"><i
class="ri-subtract-line align-middle"></i>
</a>
</div>
</td>
</tr>

View File

@@ -4,7 +4,7 @@
@section('content')
<div class="container-fluid">
<x-dashboard.breadcumb :title="$title" />
<x-dashboard.breadcumb :title="$title" />
<div class="row">
<div class="col-lg-12">
@@ -16,8 +16,8 @@
<div class="col-md-auto">
<div class="avatar-md">
<div class="avatar-title rounded-circle bg-white">
<img src="{{ $program->institution?->image }}"
alt="Institution Logo" class="avatar-sm">
<img src="{{ $program->institution?->image }}" alt="Institution Logo"
class="avatar-sm">
</div>
</div>
</div>
@@ -31,7 +31,9 @@
{{ $program->institution?->title }}</a></span>
</div>
<div class="vr"></div>
<div>City : <span class="fw-medium">{{ $program->institution?->location ?? 'N/A' }}</span></div>
<div>City : <span
class="fw-medium">{{ $program->institution?->location ?? 'N/A' }}</span>
</div>
<div class="vr"></div>
<div>Code : <span class="fw-medium">{{ $program->code }}</span></div>
</div>
@@ -71,55 +73,60 @@
<div class="card-body">
<div class="text-muted">
<h5 class="card-title mb-0">Summary</h6>
<div class="border-top border-top-dashed mt-4 pt-3">
<div class="row gy-3">
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Program Level :</p>
<h5 class="fs-15 mb-0">{{ $program->programLevel?->title }}</h5>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Duration :</p>
<h5 class="fs-15 mb-0">{{ $program->year }}</h5>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">PSW :</p>
<div class="badge bg-danger fs-12">{{ $program->psw }}</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">PROSPECTS :</p>
<div class="badge bg-primary fs-12">{{ $program->prospects }}
<div class="border-top border-top-dashed mt-4 pt-3">
<div class="row gy-3">
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Program Level :</p>
<h5 class="fs-15 mb-0">{{ $program->programLevel?->title }}
</h5>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Tution Fee :</p>
<div class="badge bg-warning fs-12">{{ $program->fee }}</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Scholarship :</p>
<div class="badge bg-info fs-12">{{ $program->scholarship }}
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Duration :</p>
<h5 class="fs-15 mb-0">{{ $program->year }}</h5>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">PSW :</p>
<div class="badge bg-danger fs-12">{{ $program->psw }}
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">PROSPECTS :</p>
<div class="badge bg-primary fs-12">
{{ $program->prospects }}
</div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Tution Fee :</p>
<div class="badge bg-warning fs-12">{{ $program->fee }}
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6">
<div>
<p class="text-uppercase fw-medium mb-2">Scholarship :</p>
<div class="badge bg-info fs-12">
{{ $program->scholarship }}
</div>
</div>
</div>
</div>
</div>
</div>
<h6 class="fw-semibold text-uppercase my-4">Keywords</h6>
{!! $program->keywords !!}
<h6 class="fw-semibold text-uppercase my-4">Keywords</h6>
{!! $program->keywords !!}
</div>
@@ -147,7 +154,7 @@
<tbody>
@foreach ($program->level as $index => $item)
<tr>
<td scope="row">{{ $index++ }}</td>
<td scope="row">{{ $index + 1 }}</td>
<td scope="row">{{ $item->level }}</td>
<td>{{ $item->faculty }}</td>
<td>{{ $item->score }}</td>
@@ -179,7 +186,7 @@
<tbody>
@foreach ($program->tests as $index => $item)
<tr>
<td scope="row">{{ $index++ }}</td>
<td scope="row">{{ $index + 1 }}</td>
<td scope="row">{{ $item->title }}</td>
<td>{{ $item->pivot?->min_score }}</td>
<td>{{ $item->pivot?->band_score }}</td>
@@ -203,7 +210,7 @@
class="badge fw-bold fs-6 {{ $program->status == 1 ? 'text-bg-success' : 'text-bg-danger' }}">{{ config('constants.page_status_options')[$program->status] }}</span>
</div>
</div>
</div>
</div>
<!-- end card -->
<div class="card bg-white">

View File

@@ -8,6 +8,7 @@ use Modules\CourseFinder\Http\Controllers\ProgramController;
use Modules\CourseFinder\Http\Controllers\ProgramLevelController;
Route::get('/', [WebsiteController::class, 'home']);
Route::get('course-finder/{id}', [WebsiteController::class, 'coursefinderSingle'])->name('coursefinder.single');
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');