Final Commit

This commit is contained in:
Tanchohang 2024-04-24 10:17:18 +05:45
parent b49e06fa93
commit 3502bb0b4f
41 changed files with 1497 additions and 502 deletions

View File

@ -593,6 +593,34 @@ class LMS
{
static $initialized = false;
if (!$initialized) {
DB::statement("CREATE TABLE IF NOT EXISTS `tbl_logos` (
`logo_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`logo` VARCHAR(255),
`link` VARCHAR(255),
`display_order` INT(11),
`status` INT(11),
`remarks` TEXT,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`createdby` INT(11),
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updatedby` INT(11)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
DB::statement("CREATE TABLE IF NOT EXISTS `tbl_testimonials` (
`testimonial_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`video_url` VARCHAR(255),
`review` VARCHAR(255),
`name` VARCHAR(20) NOT NULL,
`designation` VARCHAR(100),
`display_order` INT(11),
`status` INT(11),
`remarks` TEXT,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`createdby` INT(11),
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updatedby` INT(11)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
DB::statement("CREATE TABLE IF NOT EXISTS `tbl_contactus` (
`inquiries_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR(255),
@ -1595,6 +1623,12 @@ class LMS
$table->string('photo')->nullable();
});
}
if (!Schema::hasColumn('campaignarticles', 'sub_title')) {
Schema::table('campaignarticles', function (Blueprint $table) {
// Add the new column to the table
$table->string('sub_title')->nullable()->after('title');
});
}
$initialized = true;
}

View File

@ -144,7 +144,7 @@
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $request->input('campaignarticle_id'));
$this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $id);
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());

View File

@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileController extends Controller
{
public function upload(Request $request)
{
$file = $request->file('upload');
$filename = uniqid() . '_' . $file->getClientOriginalName();
Storage::disk('public')->put($filename, file_get_contents($file));
$url = asset('storage/' . $filename);
return response()->json([
'url' => $url,
]);
}
}

View File

@ -0,0 +1,200 @@
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Logos;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use App\Service\CommonModelService;
use Log;
use Exception;
class LogosController extends Controller
{
protected $modelService;
public function __construct(Logos $model)
{
$this->modelService = new CommonModelService($model);
}
public function index(Request $request)
{
createActivityLog(LogosController::class, 'index', ' Logos index');
$data = Logos::where('status','<>',-1)->orderBy('display_order')->get();
return view("crud.generated.logos.index", compact('data'));
}
public function create(Request $request)
{
createActivityLog(LogosController::class, 'create', ' Logos create');
$TableData = Logos::where('status','<>',-1)->orderBy('display_order')->get();
return view("crud.generated.logos.create",compact('TableData'));
}
public function store(Request $request)
{
createActivityLog(LogosController::class, 'store', ' Logos store');
$validator = Validator::make($request->all(), [
//ADD REQUIRED FIELDS FOR VALIDATION
]);
if ($validator->fails()) {
return response()->json([
'error' => $validator->errors(),
],500);
}
$request->request->add(['alias' => slugify($request->title)]);
$request->request->add(['display_order' => getDisplayOrder('tbl_logos')]);
$request->request->add(['created_at' => date("Y-m-d h:i:s")]);
$request->request->add(['updated_at' => date("Y-m-d h:i:s")]);
$requestData=$request->all();
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL').'/', '', $value);
});
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL'), '', $value);
});
DB::beginTransaction();
try {
$operationNumber = getOperationNumber();
$this->modelService->create($operationNumber, $operationNumber, null, $requestData);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(LogosController::class, 'store', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
if ($request->ajax()) {
return response()->json(['status' => true, 'message' => 'The Logos Created Successfully.'], 200);
}
return redirect()->route('logos.index')->with('success','The Logos created Successfully.');
}
public function sort(Request $request)
{
$idOrder = $request->input('id_order');
foreach ($idOrder as $index => $id) {
$companyArticle = Logos::find($id);
$companyArticle->display_order = $index + 1;
$companyArticle->save();
}
return response()->json(['status' => true, 'content' => 'The articles sorted successfully.'], 200);
}
public function updatealias(Request $request)
{
$articleId = $request->input('articleId');
$newAlias = $request->input('newAlias');
$companyArticle = Logos::find($articleId);
if (!$companyArticle) {
return response()->json(['status' => false, 'content' => 'Company article not found.'], 404);
}
$companyArticle->alias = $newAlias;
$companyArticle->save();
return response()->json(['status' => true, 'content' => 'Alias updated successfully.'], 200);
}
public function show(Request $request, $id)
{
createActivityLog(LogosController::class, 'show', ' Logos show');
$data = Logos::findOrFail($id);
return view("crud.generated.logos.show", compact('data'));
}
public function edit(Request $request, $id)
{
createActivityLog(LogosController::class, 'edit', ' Logos edit');
$TableData = Logos::where('status','<>',-1)->orderBy('display_order')->get();
$data = Logos::findOrFail($id);
if ($request->ajax()) {
$html = view("crud.generated.logos.ajax.edit", compact('data'))->render();
return response()->json(['status' => true, 'content' => $html], 200);
}
return view("crud.generated.logos.edit", compact('data','TableData'));
}
public function update(Request $request, $id)
{
createActivityLog(LogosController::class, 'update', ' Logos update');
$validator = Validator::make($request->all(), [
//ADD VALIDATION FOR REQIRED FIELDS
]);
if ($validator->fails()) {
return response()->json([
'error' => $validator->errors(),
],500);
}
$requestData=$request->all();
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL').'/', '', $value);
});
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL'), '', $value);
});
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $request->input('logo_id'));
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(LogosController::class, 'update', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
if ($request->ajax()) {
return response()->json(['status' => true, 'message' => 'The Logos updated Successfully.'], 200);
}
// return redirect()->route('logos.index')->with('success','The Logos updated Successfully.');
return redirect()->back()->with('success', 'The Logos updated successfully.');
}
public function destroy(Request $request,$id)
{
createActivityLog(LogosController::class, 'destroy', ' Logos destroy');
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->destroy($OperationNumber, $OperationNumber, $id);
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(LogosController::class, 'destroy', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
return response()->json(['status'=>true,'message'=>'The Logos Deleted Successfully.'],200);
}
public function toggle(Request $request,$id)
{
createActivityLog(LogosController::class, 'destroy', ' Logos destroy');
$data = Logos::findOrFail($id);
$requestData=['status'=>($data->status==1)?0:1];
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $id);
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(LogosController::class, 'destroy', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
return response()->json(['status'=>true,'message'=>'The Logos Deleted Successfully.'],200);
}
}

View File

@ -6,8 +6,11 @@ use App\Http\Controllers\Controller;
use App\Mail\CustomMailer;
use App\Models\Agents;
use App\Models\Campaigns;
use App\Models\Campaignarticles;
use App\Models\Testimonials;
use App\Models\Countries;
use App\Models\Leadcategories;
use App\Models\Logos;
use Illuminate\Http\Request;
use App\Models\Registrations;
use App\Models\Sources;
@ -18,6 +21,7 @@ use App\Service\CommonModelService;
use Exception;
use Illuminate\Support\Facades\Mail;
use LMS;
use Illuminate\Support\Facades\View;
use NewRegistrationAdminNotification;
class RegistrationsController extends Controller
@ -26,6 +30,16 @@ class RegistrationsController extends Controller
public function __construct(Registrations $model)
{
$this->modelService = new CommonModelService($model);
$articles = Campaignarticles::where('status', 1)->latest()->get();
$testimonials = Testimonials::where('status', 1)->latest()->get();
$logos = Logos::where('status',1)->latest()->get();
View::share([
'articles'=> $articles,
'testimonials'=>$testimonials,
'logos'=>$logos,
]);
}
public function index(Request $request)
{
@ -225,20 +239,31 @@ class RegistrationsController extends Controller
}
if ($Campaign != null) {
$viewPath = env("CLIENT_PATH") . ".landing";
if (view()->exists($viewPath))
if (view()->exists($viewPath)) {
return view($viewPath, compact("Campaign"));
else
} else {
// dd($article);
return view(env("CLIENT_PATH") . '.home', compact("Campaign"));
}
} else {
$Campaign = LMS::getActiveCampaign();
$viewPath = env("CLIENT_PATH") . ".landing";
if (view()->exists($viewPath))
if (view()->exists($viewPath)) {
return view($viewPath, compact("Campaign"));
else
} else {
return view(env("CLIENT_PATH") . '.home', compact("Campaign"));
}
}
}
}
public function getTestimonial()
{
$testimonials = Testimonials::where('status', 1)->latest()->get();
// dd($testimonials);
return response()->json($testimonials);
}
public function reception(Request $request)
{
//Office ko Reception Bata directly fill-in garne form

View File

@ -0,0 +1,201 @@
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Testimonials;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use App\Service\CommonModelService;
use Log;
use Exception;
class TestimonialsController extends Controller
{
protected $modelService;
public function __construct(Testimonials $model)
{
$this->modelService = new CommonModelService($model);
}
public function index(Request $request)
{
createActivityLog(TestimonialsController::class, 'index', ' Testimonials index');
$data = Testimonials::where('status','<>',-1)->orderBy('display_order')->get();
return view("crud.generated.testimonials.index", compact('data'));
}
public function create(Request $request)
{
createActivityLog(TestimonialsController::class, 'create', ' Testimonials create');
$TableData = Testimonials::where('status','<>',-1)->orderBy('display_order')->get();
return view("crud.generated.testimonials.create",compact('TableData'));
}
public function store(Request $request)
{
createActivityLog(TestimonialsController::class, 'store', ' Testimonials store');
$validator = Validator::make($request->all(), [
//ADD REQUIRED FIELDS FOR VALIDATION
]);
if ($validator->fails()) {
return response()->json([
'error' => $validator->errors(),
],500);
}
$request->request->add(['alias' => slugify($request->title)]);
$request->request->add(['display_order' => getDisplayOrder('tbl_testimonials')]);
$request->request->add(['created_at' => date("Y-m-d h:i:s")]);
$request->request->add(['updated_at' => date("Y-m-d h:i:s")]);
$requestData=$request->all();
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL').'/', '', $value);
});
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL'), '', $value);
});
DB::beginTransaction();
try {
$operationNumber = getOperationNumber();
$this->modelService->create($operationNumber, $operationNumber, null, $requestData);
} catch (\Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(TestimonialsController::class, 'store', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
if ($request->ajax()) {
return response()->json(['status' => true, 'message' => 'The Testimonials Created Successfully.'], 200);
}
return redirect()->route('testimonials.index')->with('success','The Testimonials created Successfully.');
}
public function sort(Request $request)
{
$idOrder = $request->input('id_order');
foreach ($idOrder as $index => $id) {
$companyArticle = Testimonials::find($id);
$companyArticle->display_order = $index + 1;
$companyArticle->save();
}
return response()->json(['status' => true, 'content' => 'The articles sorted successfully.'], 200);
}
public function updatealias(Request $request)
{
$articleId = $request->input('articleId');
$newAlias = $request->input('newAlias');
$companyArticle = Testimonials::find($articleId);
if (!$companyArticle) {
return response()->json(['status' => false, 'content' => 'Company article not found.'], 404);
}
$companyArticle->alias = $newAlias;
$companyArticle->save();
return response()->json(['status' => true, 'content' => 'Alias updated successfully.'], 200);
}
public function show(Request $request, $id)
{
createActivityLog(TestimonialsController::class, 'show', ' Testimonials show');
$data = Testimonials::findOrFail($id);
return view("crud.generated.testimonials.show", compact('data'));
}
public function edit(Request $request, $id)
{
createActivityLog(TestimonialsController::class, 'edit', ' Testimonials edit');
$TableData = Testimonials::where('status','<>',-1)->orderBy('display_order')->get();
$data = Testimonials::findOrFail($id);
if ($request->ajax()) {
$html = view("crud.generated.testimonials.ajax.edit", compact('data'))->render();
return response()->json(['status' => true, 'content' => $html], 200);
}
return view("crud.generated.testimonials.edit", compact('data','TableData'));
}
public function update(Request $request, $id)
{
// dd($request->all());
createActivityLog(TestimonialsController::class, 'update', ' Testimonials update');
$validator = Validator::make($request->all(), [
//ADD VALIDATION FOR REQIRED FIELDS
]);
if ($validator->fails()) {
return response()->json([
'error' => $validator->errors(),
],500);
}
$requestData=$request->all();
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL').'/', '', $value);
});
array_walk_recursive($requestData, function (&$value) {
$value = str_replace(env('APP_URL'), '', $value);
});
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $id);
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(TestimonialsController::class, 'update', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
if ($request->ajax()) {
return response()->json(['status' => true, 'message' => 'The Testimonials updated Successfully.'], 200);
}
// return redirect()->route('testimonials.index')->with('success','The Testimonials updated Successfully.');
return redirect()->back()->with('success', 'The Testimonials updated successfully.');
}
public function destroy(Request $request,$id)
{
createActivityLog(TestimonialsController::class, 'destroy', ' Testimonials destroy');
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->destroy($OperationNumber, $OperationNumber, $id);
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(TestimonialsController::class, 'destroy', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
return response()->json(['status'=>true,'message'=>'The Testimonials Deleted Successfully.'],200);
}
public function toggle(Request $request,$id)
{
createActivityLog(TestimonialsController::class, 'destroy', ' Testimonials destroy');
$data = Testimonials::findOrFail($id);
$requestData=['status'=>($data->status==1)?0:1];
DB::beginTransaction();
try {
$OperationNumber = getOperationNumber();
$this->modelService->update($OperationNumber, $OperationNumber, null, $requestData, $id);
} catch (Exception $e) {
DB::rollBack();
Log::info($e->getMessage());
createErrorLog(TestimonialsController::class, 'destroy', $e->getMessage());
return response()->json(['status' => false, 'message' => $e->getMessage()], 500);
}
DB::commit();
return response()->json(['status'=>true,'message'=>'The Testimonials Deleted Successfully.'],200);
}
}

View File

@ -1,42 +1,44 @@
<?php
namespace App\Models;
use App\Models\User;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Traits\CreatedUpdatedBy;
namespace App\Models;
class Campaignarticles extends Model
{
use HasFactory, CreatedUpdatedBy;
protected $primaryKey = 'campaignarticle_id';
public $timestamps = true;
protected $fillable =[
'campaigns_id',
'parent_article',
'title',
'alias',
'text',
'link',
'cover_photo',
'thumb',
'display_order',
'status',
'created_at',
'updated_at',
'createdby',
'updatedby',
use App\Models\User;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Traits\CreatedUpdatedBy;
];
class Campaignarticles extends Model
{
use HasFactory, CreatedUpdatedBy;
protected $appends = ['status_name'];
protected $primaryKey = 'campaignarticle_id';
public $timestamps = true;
protected $fillable = [
'campaigns_id',
'parent_article',
'sub_title',
'title',
'alias',
'text',
'link',
'cover_photo',
'thumb',
'display_order',
'status',
'created_at',
'updated_at',
'createdby',
'updatedby',
protected function getStatusNameAttribute()
{
return $this->status == 1 ? '<span class="badge text-bg-success-soft"> Active </span>' : '<span class="badge text-bg-danger-soft">Inactive</span>';
}
];
protected $appends = ['status_name'];
protected function getStatusNameAttribute()
{
return $this->status == 1 ? '<span class="badge text-bg-success-soft"> Active </span>' : '<span class="badge text-bg-danger-soft">Inactive</span>';
}
protected function createdBy(): Attribute
{
@ -51,4 +53,4 @@
get: fn ($value) => User::find($value) ? User::find($value)->name : '',
);
}
}
}

49
app/Models/Logos.php Normal file
View File

@ -0,0 +1,49 @@
<?php
namespace App\Models;
use App\Models\User;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Traits\CreatedUpdatedBy;
class Logos extends Model
{
use HasFactory, CreatedUpdatedBy;
protected $primaryKey = 'logo_id';
public $timestamps = true;
protected $fillable =[
'logo',
'link',
'display_order',
'status',
'remarks',
'created_at',
'createdby',
'updated_at',
'updatedby',
];
protected $appends = ['status_name'];
protected function getStatusNameAttribute()
{
return $this->status == 1 ? '<span class="badge text-bg-success-soft"> Active </span>' : '<span class="badge text-bg-danger-soft">Inactive</span>';
}
protected function createdBy(): Attribute
{
return Attribute::make(
get: fn ($value) => User::find($value) ? User::find($value)->name : '',
);
}
protected function updatedBy(): Attribute
{
return Attribute::make(
get: fn ($value) => User::find($value) ? User::find($value)->name : '',
);
}
}

View File

@ -0,0 +1,52 @@
<?php
namespace App\Models;
use App\Models\User;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Traits\CreatedUpdatedBy;
class Testimonials extends Model
{
use HasFactory, CreatedUpdatedBy;
protected $primaryKey = 'testimonial_id';
public $timestamps = true;
protected $fillable = [
'video_url',
'review',
'name',
'designation',
'display_order',
'status',
'remarks',
'created_at',
'createdby',
'updated_at',
'updatedby',
];
protected $appends = ['status_name'];
protected function getStatusNameAttribute()
{
return $this->status == 1 ? '<span class="badge text-bg-success-soft"> Active </span>' : '<span class="badge text-bg-danger-soft">Inactive</span>';
}
protected function createdBy(): Attribute
{
return Attribute::make(
get: fn ($value) => User::find($value) ? User::find($value)->name : '',
);
}
protected function updatedBy(): Attribute
{
return Attribute::make(
get: fn ($value) => User::find($value) ? User::find($value)->name : '',
);
}
}

View File

@ -284,6 +284,9 @@
{{LMS::createMenuLink("Followups",route('followups.index'))}}
{{LMS::createMenuLink("Most Asked Questions",route('faqs.index'))}}
{{LMS::createMenuLink("Inquiries",route('contactus.index'))}}
{{LMS::createMenuLink("Testimonials",route('testimonials.index'))}}
{{LMS::createMenuLink("Manage Logos",route('logos.index'))}}
</div>
</ul>

View File

@ -1,61 +1,67 @@
@extends('backend.template')
@section('content')
<!-- start page title -->
<div class="row">
<!-- start page title -->
<div class="row">
<div class="col-12">
<div class="page-title-box d-sm-flex align-items-center justify-content-between">
<h4 class="mb-sm-0">Add Campaign</h4>
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Dashboards</a></li>
<li class="breadcrumb-item active">Add Campaign</li>
</ol>
</div>
<div class="page-title-box d-sm-flex align-items-center justify-content-between">
<h4 class="mb-sm-0">Add Campaign</h4>
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Dashboards</a></li>
<li class="breadcrumb-item active">Add Campaign</li>
</ol>
</div>
</div>
</div>
</div>
<!-- end page title -->
<form action="{{route('campaignarticles.store')}}" id="storeCustomForm" method="POST">
</div>
<!-- end page title -->
<form action="{{ route('campaignarticles.store') }}" id="storeCustomForm" method="POST">
@csrf
<div class="row">
<div class="col-lg-9">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-lg-12">{{createText("title","title","Title")}}</div>
<div class="col-lg-12 pb-2">{{createTextarea("text","text ckeditor-classic","Description")}}</div>
<div class="col-lg-12">{{createText("link","link","Link")}}</div>
</div>
</div>
<div class="col-lg-9">
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-lg-12">{{ createText('title', 'title', 'Title') }}</div>
<div class="col-lg-12">{{ createText('sub_title', 'sub_title', 'Sub Title') }}</div>
<div class="col-lg-12 pb-2">{{ createTextarea('text', 'text ckeditor-classic', 'Description') }}
</div>
<div class="col-lg-12">{{ createText('link', 'link', 'Link') }}</div>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Attributes</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-lg-12">{{createCustomSelect('tbl_campaigns', 'title', 'campaign_id', '', 'Campaigns Id','campaigns_id', 'form-control select2','status<>-1')}}</div>
<div class="col-lg-12">{{createCustomSelect('tbl_campaignarticles', 'title', 'campaignarticle_id', '', 'Parent Article','parent_article', 'form-control select2','status<>-1')}}</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Images</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-lg-12 pb-2">{{createImageInput("cover_photo","Cover Photo")}}</div>
<div class="col-lg-12 pb-2">{{createImageInput("thumb","Thumb")}}</div>
</div>
</div>
</div>
<div class="col-md-12">
<?php createButton("btn-primary btn-store", "", "Submit"); ?>
<?php createButton("btn-danger btn-cancel", "", "Cancel", route('campaignarticles.index')); ?>
</div>
<div class="col-lg-3">
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Attributes</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-lg-12">
{{ createCustomSelect('tbl_campaigns', 'title', 'campaign_id', '', 'Campaigns Id', 'campaigns_id', 'form-control select2', 'status<>-1') }}
</div>
<div class="col-lg-12">
{{ createCustomSelect('tbl_campaignarticles', 'title', 'campaignarticle_id', '', 'Parent Article', 'parent_article', 'form-control select2', 'status<>-1') }}
</div>
</div>
</div>
</div>
</form>
@endsection
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Images</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-lg-12 pb-2">{{ createImageInput('cover_photo', 'Cover Photo') }}</div>
<div class="col-lg-12 pb-2">{{ createImageInput('thumb', 'Thumb') }}</div>
</div>
</div>
</div>
<div class="col-md-12">
<?php createButton('btn-primary btn-store', '', 'Submit'); ?>
<?php createButton('btn-danger btn-cancel', '', 'Cancel', route('campaignarticles.index')); ?>
</div>
</div>
</form>
@endsection

View File

@ -23,6 +23,7 @@
<div class="card-body">
<div class="row">
<div class="col-lg-6">{{createText("title","title","Title",'',$data->title)}}</div>
<div class="col-lg-6">{{createText("sub_title","sub_title","Sub Title",'',$data->sub_title)}}</div>
<div class="col-lg-12 pb-2">{{createTextarea("text","text ckeditor-classic","Text",$data->text)}}</div>
<div class="col-lg-6">{{createText("link","link","Link",'',$data->link)}}</div>
</div>

View File

@ -0,0 +1,26 @@
@extends('backend.template')
@section('content')
<div class='card'>
<div class='card-header d-flex justify-content-between align-items-center'>
<h2 class="">{{ label('Add Logos') }}</h2>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('logos.index')); ?>
</div>
<div class='card-body'>
<form action="{{ route('logos.store') }}" id="storeCustomForm" method="POST">
@csrf
<div class="row">
<div class="col-lg-12 pb-2">
{{createImageInput('logo','Logo')}}
</div>
<div class="col-lg-6">{{ createText('link', 'link', 'Link') }}
</div>
<div class="col-lg-12 pb-2">{{ createPlainTextArea('remarks', 'remarks ', 'Remarks') }}
</div> <br>
<div class="col-md-12"><?php createButton('btn-primary btn-store', '', 'Submit'); ?>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('logos.index')); ?>
</div>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,27 @@
@extends('backend.template')
@section('content')
<div class='card'>
<div class='card-header d-flex justify-content-between align-items-center'>
<h2 class="">{{ label('Edit Logos') }}</h2>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('logos.index')); ?>
</div>
<div class='card-body'>
<form action="{{ route('logos.update', [$data->logo_id]) }}" id="updateCustomForm" method="POST">
@csrf <input type=hidden name='logo_id' value='{{ $data->logo_id }}' />
<div class="row">
<div class="col-lg-12 pb-2">
<div class="col-lg-12 pb-2">{{ createImageInput('thumb', 'Thumb', '', $data->logo) }}
</div>
<div class="col-lg-6">{{ createText('link', 'link', 'Link', '', $data->link) }}
</div>
<div class="col-lg-12 pb-2">{{ createPlainTextArea('remarks', '', 'Remarks', $data->remarks) }}
</div>
<div class="col-md-12"><?php createButton('btn-primary btn-update', '', 'Submit'); ?>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('logos.index')); ?>
</div>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,234 @@
@extends('backend.template')
@section('content')
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h2>{{ label('Logos List') }}</h2>
<a href="{{ route('logos.create') }}" class="btn btn-primary"><span>{{ label('Create New') }}</span></a>
</div>
<div class="card-body">
<table class="table dataTable" id="tbl_logos" data-url="{{ route('logos.sort') }}">
<thead class="table-light">
<tr>
<th class="tb-col"><span class="overline-title">{{ label('Sn.') }}</span></th>
<th class="tb-col"><span class="overline-title">{{ label('logo') }}</span></th>
<th class="tb-col"><span class="overline-title">{{ label('link') }}</span></th>
<th class="tb-col" data-sortable="false"><span class="overline-title">{{ label('Action') }}</span>
</th>
</tr>
</thead>
<tbody>
@php
$i = 1;
@endphp
@foreach ($data as $item)
<tr data-id="{{ $item->logo_id }}" data-display_order="{{ $item->display_order }}"
class="draggable-row <?php echo $item->status == 0 ? 'bg-light bg-danger' : ''; ?>">
<td class="tb-col">{{ $i++ }}</td>
<td class="tb-col">{{ showImageThumb($item->logo) }}</td>
<td class="tb-col">{{ $item->link }}</td>
<td class="tb-col">
<div class="dropdown d-inline-block">
<button class="btn btn-soft-secondary btn-sm dropdown" type="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="ri-more-fill align-middle"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a href="{{ route('logos.show', [$item->logo_id]) }}" class="dropdown-item"><i
class="ri-eye-fill align-bottom me-2 text-muted"></i>
{{ label('View') }}</a></li>
<li><a href="{{ route('logos.edit', [$item->logo_id]) }}"
class="dropdown-item edit-item-btn"><i
class="ri-pencil-fill align-bottom me-2 text-muted"></i>
{{ label('Edit') }}</a></li>
<li>
<a href="{{ route('logos.toggle', [$item->logo_id]) }}"
class="dropdown-item toggle-item-btn" onclick="confirmToggle(this.href)">
<i class="ri-article-fill align-bottom me-2 text-muted"></i>
{{ $item->status == 1 ? label('Unpublish') : label('Publish') }}
</a>
</li>
<li>
<a href="{{ route('logos.destroy', [$item->logo_id]) }}"
class="dropdown-item remove-item-btn" onclick="confirmDelete(this.href)">
<i class="ri-delete-bin-fill align-bottom me-2 text-muted"></i>
{{ label('Delete') }}
</a>
</li>
</ul>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endsection
@push('css')
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.5/css/dataTables.bootstrap4.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/rowreorder/1.4.0/css/rowReorder.dataTables.min.css">
@endpush
@push('js')
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.68/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.68/vfs_fonts.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.13.5/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/rowreorder/1.4.0/js/dataTables.rowReorder.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function(e) {
$('.change-alias-badge').on('click', function() {
var aliasWrapper = $(this).prev('.alias-wrapper');
var aliasSpan = aliasWrapper.find('.alias');
var aliasInput = aliasWrapper.find('.alias-input');
var isEditing = $(this).hasClass('editing');
aliasInput.toggleClass("d-none");
if (isEditing) {
// Update alias text and switch to non-editing state
var newAlias = aliasInput.val();
aliasSpan.text(newAlias);
aliasSpan.show();
aliasInput.hide();
$(this).removeClass('editing').text('Change Alias');
var articleId = $(aliasWrapper).data('id');
var ajaxUrl = "{{ route('logos.updatealias') }}";
var data = {
articleId: articleId,
newAlias: newAlias
};
$.ajax({
url: ajaxUrl,
type: 'POST',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
data: data,
success: function(response) {
console.log(response);
},
error: function(xhr, status, error) {
console.error(error);
}
});
} else {
// Switch to editing state
aliasSpan.hide();
aliasInput.show().focus();
$(this).addClass('editing').text('Save Alias');
}
});
var mytable = $(".dataTable").DataTable({
ordering: true,
rowReorder: {
//selector: 'tr'
},
});
var isRowReorderComplete = false;
mytable.on('row-reorder', function(e, diff, edit) {
isRowReorderComplete = true;
});
mytable.on('draw', function() {
if (isRowReorderComplete) {
var url = mytable.table().node().getAttribute('data-url');
var ids = mytable.rows().nodes().map(function(node) {
return $(node).data('id');
}).toArray();
console.log(ids);
$.ajax({
url: url,
type: "POST",
headers: {
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
},
data: {
id_order: ids
},
success: function(response) {
console.log(response);
},
error: function(xhr, status, error) {
console.error(error);
}
});
isRowReorderComplete = false;
}
});
});
function confirmDelete(url) {
event.preventDefault();
Swal.fire({
title: 'Are you sure?',
text: 'You will not be able to recover this item!',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Delete',
cancelButtonText: 'Cancel',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
$.ajax({
url: url,
type: 'DELETE',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
Swal.fire('Deleted!', 'The item has been deleted.', 'success');
location.reload();
},
error: function(xhr, status, error) {
Swal.fire('Error!', 'An error occurred while deleting the item.', 'error');
}
});
}
});
}
function confirmToggle(url) {
event.preventDefault();
Swal.fire({
title: 'Are you sure?',
text: 'Publish Status of Item will be changed!! if Unpublished, links will be dead!',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Proceed',
cancelButtonText: 'Cancel',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
$.ajax({
url: url,
type: 'GET',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
Swal.fire('Updated!', 'Publishing Status has been updated.', 'success');
location.reload();
},
error: function(xhr, status, error) {
Swal.fire('Error!', 'An error occurred.', 'error');
}
});
}
});
}
</script>
@endpush

View File

@ -0,0 +1,29 @@
@extends('backend.template')
@section('content')
<div class='card'>
<div class='card-header d-flex justify-content-between align-items-center'>
<h2><?php echo label('View Details'); ?></h2>
<?php createButton("btn-primary btn-cancel","","Back to List",route('logos.index')); ?>
</div>
<div class='card-body'>
<p><b>Logo :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->logo}}</span></p><p><b>Link :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->link}}</span></p><p><b>Display Order :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->display_order}}</span></p><p><b>Status :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span
class="{{$data->status == 1 ? 'text-success' : 'text-danger'}}">{{$data->status == 1 ? 'Active' : 'Inactive'}}</span></p><p><b>Remarks :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->remarks}}</span></p><p><b>Createdby :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->createdby}}</span></p><p><b>Updatedby :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->updatedby}}</span></p><div class="d-flex justify-content-between">
<div>
<p><b>Created On :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->created_at}}</span></p>
<p><b>Created By :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->createdBy}}</span></p>
</div>
<div>
<p><b>Updated On :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->updated_at}}</span></p>
<p><b>Updated By :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->updatedBy}}</span></p>
</div>
</div>
</div>
</div>
@endSection

View File

@ -0,0 +1,34 @@
@extends('backend.template')
@section('content')
<div class='card'>
<div class='card-header d-flex justify-content-between align-items-center'>
<h2 class="">{{ label('Add Testimonials') }}</h2>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('testimonials.index')); ?>
</div>
<div class='card-body'>
<form action="{{ route('testimonials.store') }}" id="storeCustomForm" method="POST">
@csrf
<div class="row">
{{-- <div class="col-lg-6">{{ createText('video_url', 'video_url', 'Video Url') }}
</div> --}}
<div class="col-lg-12 pb-2">
<label for="video">Choose a video:</label>
<input type="file" id="video" name="video_url" accept="video/*">
</div>
<div class="col-lg-6">{{ createText('review', 'review', 'Review') }}
</div>
<div class="col-lg-6">{{ createText('name', 'name', 'Name') }}
</div>
<div class="col-lg-6">{{ createText('designation', 'designation', 'Designation') }}
</div>
<div class="col-lg-12 pb-2">{{ createPlainTextArea('remarks', 'remarks ', 'Remarks') }}
</div> <br>
<div class="col-md-12"><?php createButton('btn-primary btn-store', '', 'Submit'); ?>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('testimonials.index')); ?>
</div>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,34 @@
@extends('backend.template')
@section('content')
<div class='card'>
<div class='card-header d-flex justify-content-between align-items-center'>
<h2 class="">{{ label('Edit Testimonials') }}</h2>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('testimonials.index')); ?>
</div>
<div class='card-body'>
<form action="{{ route('testimonials.update', [$data->testimonial_id]) }}" id="updateCustomForm" method="POST">
@csrf <input type=hidden name='testimonial_id' value='{{ $data->testimonial_id }}' />
<div class="row">
<div class="col-lg-12 pb-2">
<label for="video">Choose a video:</label>
<input type="file" id="video" name="video_url" accept="video/*">
<div>Current video URL: {{ $data->video_url }}</div>
</div>
<div class="col-lg-6">{{ createText('review', 'review', 'Review', '', $data->review) }}
</div>
<div class="col-lg-6">{{ createText('name', 'name', 'Name', '', $data->name) }}
</div>
<div class="col-lg-6">
{{ createText('designation', 'designation', 'Designation', '', $data->designation) }}
</div>
<div class="col-lg-12 pb-2">{{ createPlainTextArea('remarks', '', 'Remarks', $data->remarks) }}
</div>
<div class="col-md-12"><?php createButton('btn-primary btn-update', '', 'Submit'); ?>
<?php createButton('btn-primary btn-cancel', '', 'Cancel', route('testimonials.index')); ?>
</div>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,231 @@
@extends('backend.template')
@section('content')
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h2>{{ label("Testimonials List") }}</h2>
<a href="{{ route('testimonials.create') }}" class="btn btn-primary"><span>{{label("Create New")}}</span></a>
</div>
<div class="card-body">
<table class="table dataTable" id="tbl_testimonials" data-url="{{ route('testimonials.sort') }}">
<thead class="table-light">
<tr>
<th class="tb-col"><span class="overline-title">{{label("Sn.")}}</span></th>
<th class="tb-col"><span class="overline-title">{{ label("video_url") }}</span></th>
<th class="tb-col"><span class="overline-title">{{ label("review") }}</span></th>
<th class="tb-col"><span class="overline-title">{{ label("name") }}</span></th>
<th class="tb-col"><span class="overline-title">{{ label("designation") }}</span></th>
<th class="tb-col" data-sortable="false"><span
class="overline-title">{{ label("Action") }}</span>
</th>
</tr>
</thead>
<tbody>
@php
$i = 1;
@endphp
@foreach ($data as $item)
<tr data-id="{{$item->testimonial_id}}" data-display_order="{{$item->display_order}}" class="draggable-row <?php echo ($item->status==0)?"bg-light bg-danger":""; ?>">
<td class="tb-col">{{ $i++ }}</td><td class="tb-col">{{ $item->video_url }}</td>
<td class="tb-col">{{ $item->review }}</td>
<td class="tb-col">{{ $item->name }}</td>
<td class="tb-col">{{ $item->designation }}</td>
<td class="tb-col">
<div class="dropdown d-inline-block">
<button class="btn btn-soft-secondary btn-sm dropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="ri-more-fill align-middle"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a href="{{route('testimonials.show',[$item->testimonial_id])}}" class="dropdown-item"><i class="ri-eye-fill align-bottom me-2 text-muted"></i> {{label("View")}}</a></li>
<li><a href="{{route('testimonials.edit',[$item->testimonial_id])}}" class="dropdown-item edit-item-btn"><i class="ri-pencil-fill align-bottom me-2 text-muted"></i> {{label("Edit")}}</a></li>
<li>
<a href="{{route('testimonials.toggle',[$item->testimonial_id])}}" class="dropdown-item toggle-item-btn" onclick="confirmToggle(this.href)">
<i class="ri-article-fill align-bottom me-2 text-muted"></i> {{ ($item->status==1)?label('Unpublish'):label('Publish') }}
</a>
</li>
<li>
<a href="{{route('testimonials.destroy',[$item->testimonial_id])}}" class="dropdown-item remove-item-btn" onclick="confirmDelete(this.href)">
<i class="ri-delete-bin-fill align-bottom me-2 text-muted"></i> {{ label('Delete') }}
</a>
</li>
</ul>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endsection
@push("css")
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.5/css/dataTables.bootstrap4.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/rowreorder/1.4.0/css/rowReorder.dataTables.min.css">
@endpush
@push("js")
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.68/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.68/vfs_fonts.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.13.5/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/rowreorder/1.4.0/js/dataTables.rowReorder.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function(e) {
$('.change-alias-badge').on('click', function() {
var aliasWrapper = $(this).prev('.alias-wrapper');
var aliasSpan = aliasWrapper.find('.alias');
var aliasInput = aliasWrapper.find('.alias-input');
var isEditing = $(this).hasClass('editing');
aliasInput.toggleClass("d-none");
if (isEditing) {
// Update alias text and switch to non-editing state
var newAlias = aliasInput.val();
aliasSpan.text(newAlias);
aliasSpan.show();
aliasInput.hide();
$(this).removeClass('editing').text('Change Alias');
var articleId = $(aliasWrapper).data('id');
var ajaxUrl = "{{ route('testimonials.updatealias') }}";
var data = {
articleId: articleId,
newAlias: newAlias
};
$.ajax({
url: ajaxUrl,
type: 'POST',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
data: data,
success: function(response) {
console.log(response);
},
error: function(xhr, status, error) {
console.error(error);
}
});
} else {
// Switch to editing state
aliasSpan.hide();
aliasInput.show().focus();
$(this).addClass('editing').text('Save Alias');
}
});
var mytable = $(".dataTable").DataTable({
ordering: true,
rowReorder: {
//selector: 'tr'
},
});
var isRowReorderComplete = false;
mytable.on('row-reorder', function(e, diff, edit) {
isRowReorderComplete = true;
});
mytable.on('draw', function() {
if (isRowReorderComplete) {
var url = mytable.table().node().getAttribute('data-url');
var ids = mytable.rows().nodes().map(function(node) {
return $(node).data('id');
}).toArray();
console.log(ids);
$.ajax({
url: url,
type: "POST",
headers: {
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content')
},
data: {
id_order: ids
},
success: function(response) {
console.log(response);
},
error: function(xhr, status, error) {
console.error(error);
}
});
isRowReorderComplete=false;
}
});
});
function confirmDelete(url) {
event.preventDefault();
Swal.fire({
title: 'Are you sure?',
text: 'You will not be able to recover this item!',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Delete',
cancelButtonText: 'Cancel',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
$.ajax({
url: url,
type: 'DELETE',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
Swal.fire('Deleted!', 'The item has been deleted.', 'success');
location.reload();
},
error: function(xhr, status, error) {
Swal.fire('Error!', 'An error occurred while deleting the item.', 'error');
}
});
}
});
}
function confirmToggle(url) {
event.preventDefault();
Swal.fire({
title: 'Are you sure?',
text: 'Publish Status of Item will be changed!! if Unpublished, links will be dead!',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Proceed',
cancelButtonText: 'Cancel',
reverseButtons: true
}).then((result) => {
if (result.isConfirmed) {
$.ajax({
url: url,
type: 'GET',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
Swal.fire('Updated!', 'Publishing Status has been updated.', 'success');
location.reload();
},
error: function(xhr, status, error) {
Swal.fire('Error!', 'An error occurred.', 'error');
}
});
}
});
}
</script>
@endpush

View File

@ -0,0 +1,29 @@
@extends('backend.template')
@section('content')
<div class='card'>
<div class='card-header d-flex justify-content-between align-items-center'>
<h2><?php echo label('View Details'); ?></h2>
<?php createButton("btn-primary btn-cancel","","Back to List",route('testimonials.index')); ?>
</div>
<div class='card-body'>
<p><b>Video Url :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->video_url}}</span></p><p><b>Review :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->review}}</span></p><p><b>Name :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->name}}</span></p><p><b>Designation :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->designation}}</span></p><p><b>Display Order :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->display_order}}</span></p><p><b>Status :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span
class="{{$data->status == 1 ? 'text-success' : 'text-danger'}}">{{$data->status == 1 ? 'Active' : 'Inactive'}}</span></p><p><b>Remarks :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->remarks}}</span></p><p><b>Createdby :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->createdby}}</span></p><p><b>Updatedby :&nbsp;&nbsp;&nbsp;&nbsp;</b> <span>{{$data->updatedby}}</span></p><div class="d-flex justify-content-between">
<div>
<p><b>Created On :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->created_at}}</span></p>
<p><b>Created By :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->createdBy}}</span></p>
</div>
<div>
<p><b>Updated On :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->updated_at}}</span></p>
<p><b>Updated By :</b>&nbsp;&nbsp;&nbsp;<span>{{$data->updatedBy}}</span></p>
</div>
</div>
</div>
</div>
@endSection

View File

@ -3,11 +3,13 @@
<div class="section-content">
<div class="row">
@php
$articleTwo = $articles->where('display_order',2)->first();
@endphp
<div class="col-lg-4 col-md-12">
<div class="twm-explore-media-wrap">
<div class="twm-media">
<img src="{{asset('raffels/assets/images/gir-large.png')}}" alt="">
<img src="{{$articleTwo->thumb}}" alt="">
</div>
</div>
</div>
@ -24,11 +26,12 @@
<div class="twm-title-small">About Raffels Educare</div>
<div class="twm-title-large">
<h2>Your Trust Our Commitment </h2>
<p>Raffles Educare Associates Pvt. Ltd., established in 2005, is one of the best educational consultancy with a successful track record in the overseas education.Over the 15 years of excellence we have 97% visa success rate along with highest student satisfaction, fulfilling the career dreams of many students. Since the year of inception, we have been providing educational services of international standards and escalated to be one of the leading institutions. We have our head office located at Kathmandu, capital city of Nepal and other branches at the major cities such as Itahari, Damauli, Pokhara, and further extension in progress in the country as well as abroad. </p>
<h2>{{$articleTwo->title}}</h2>
{{-- @dd($article) --}}
<p>{!!$articleTwo->text!!}</p>
</div>
<div class="twm-upload-file">
<a class="site-button" href="tel:9821313323">Give us a call</a>
<a class="site-button" href="tel:{{$articleTwo->link}}">Give us a call</a>
</div>

View File

@ -4,23 +4,21 @@
<div class="section-content">
<div class="twm-explore-content-2">
<div class="row">
@php
$articleThree = $articles->where('display_order',3)->first();
@endphp
<div class="col-lg-8 col-md-12">
<div class="twm-explore-content-outer2">
<div class="twm-explore-top-section">
<div class="twm-title-small">Meet Our Counselor</div>
<div class="twm-title-large">
<h2>Empower, Inspire, Achieve</h2>
<p>At Raffles Educare, we take pride in introducing you to our dedicated and highly
experienced counselor who is here to guide you through your educational journey.
Our counselor is not just a professional but also a compassionate individual who
understands the unique needs and aspirations of each student.
.</p>
<h2>{{$articleThree->title}}</h2>
<p>
{!!$articleThree->text!!}
</p>
</div>
<div class="twm-read-more">
<a href="tel:9821313323" class="site-button">Call Now</a>
<a href="tel:{{$articleThree->link}}" class="site-button">Call Now</a>
</div>
</div>
@ -31,7 +29,7 @@
<div class="col-lg-4 col-md-12">
<div class="twm-explore-media-wrap2">
<div class="twm-media">
<img src="{{asset('raffels/assets/images/gir-large-2.png')}}" alt="">
<img src="{{$articleThree->thumb}}" alt="">
</div>
</div>
</div>

View File

@ -12,8 +12,11 @@
Stay connect to get upcoming events with
<span class="site-text-primary">Raffels</span>
</div>
@php
$articleOne = $articles->where('display_order',1)->first();
@endphp
<div class="twm-bnr-title-large">
Find Your Perfect <span class="site-text-white">Destinations</span> </div>
{{$articleOne->title}} <span class="site-text-white">{{$articleOne->sub_title}}</span> </div>
<div class="twm-bnr-discription">
Adding wings to Your Dreams
</div>
@ -24,7 +27,7 @@
<div class="col-xl-6 col-lg-6 col-md-12 twm-bnr-right-section">
<div class="twm-bnr-right-content">
<div class="bnr-media">
<img src="{{asset('raffels/assets/images/home-6/banner.png')}}" alt="#">
<img src="{{$articleOne->thumb}}" alt="#">
</div>
<div class="bnr-bg-circle">
<span></span>

View File

@ -1,242 +1,165 @@
<div id = "testimonials" class="section-full p-t120 p-b90 site-bg-white twm-testimonial-v-area">
<style>
<style>
.testimonials-container {
max-width: 900px;
margin: 10px auto;
line-height: 1.9;
font-family: "Roboto", sans-serif;
}
}
.testimonials-container section {
padding: 20px 0;
padding: 20px 0;
}
.testimonials-container h2 {
font-size: 40px;
line-height: 1.2;
font-family: "Poppins", sans-serif;
position: relative;
font-size: 40px;
line-height: 1.2;
font-family: "Poppins", sans-serif;
position: relative;
}
.testimonials-container h2::before {
content: "";
position: absolute;
height: 4px;
width: 60px;
background: red;
bottom: -8px;
left: 0;
content: "";
position: absolute;
height: 4px;
width: 60px;
background: red;
bottom: -8px;
left: 0;
}
section.dark h2::before {
height: 0;
height: 0;
}
.testimonials-container .logos-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
place-items: center;
padding: 32px;
box-shadow: 0 4px 40px -8px rgba(0, 0, 0, 0.1);
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
place-items: center;
padding: 32px;
box-shadow: 0 4px 40px -8px rgba(0, 0, 0, 0.1);
}
.testimonials-container .logos-container img {
height: 10px;
height: 10px;
}
.testimonials {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.testimonial video {
height: 600px;
height: 600px;
}
.testimonial {
flex: 1;
padding: 16px;
box-shadow: 0 4px 40px -8px rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
flex: 1;
padding: 16px;
box-shadow: 0 4px 40px -8px rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
}
.testimonial .video {
margin: -16px;
margin-bottom: 0;
margin: -16px;
margin-bottom: 0;
}
.testimonial .bottom {
margin-top: auto;
margin-top: auto;
}
.testimonial .name {
font-weight: bold;
font-size: 18px;
line-height: 1.2;
margin-top: 20px;
font-weight: bold;
font-size: 18px;
line-height: 1.2;
margin-top: 20px;
}
.testimonial .designation {
font-size: 14px;
opacity: 0.8;
font-size: 14px;
opacity: 0.8;
}
.testimonials-container button,
.testimonials-container a.btn {
padding: 8px 32px;
border: none;
margin: 24px 0;
font-size: 16px;
background: #003049;
color: #fff;
cursor: pointer;
padding: 8px 32px;
border: none;
margin: 24px 0;
font-size: 16px;
background: #003049;
color: #fff;
cursor: pointer;
}
.testimonials-container a.btn {
text-decoration: none;
background: #e63946;
font-size: 24px;
text-transform: uppercase;
font-weight: bold;
display: inline-block;
padding: 4px 32px;
margin-top: 8px;
text-decoration: none;
background: #e63946;
font-size: 24px;
text-transform: uppercase;
font-weight: bold;
display: inline-block;
padding: 4px 32px;
margin-top: 8px;
}
section.dark {
background: #003049;
color: #fff;
padding: 24px 32px;
text-align: center;
margin-top: 24px;
background: #003049;
color: #fff;
padding: 24px 32px;
text-align: center;
margin-top: 24px;
}
section.dark p {
margin-top: -16px;
margin-top: -16px;
}
@media (max-width: 800px) {
.testimonials-container h2 {
font-size: 28px;
padding-top: 10px;
}
.testimonials {
grid-template-columns: 1fr;
}
.testimonial video {
height: 100%;
}
.testimonial {
gap: 12px;
}
.testimonials-container .logos-container {
grid-template-columns: repeat(2, 1fr);
gap: 60px;
}
}
</style>
<div class="testimonials-container">
<section>
<h2>Testimonials</h2><br><br>
<div class="testimonials"></div>
</section>
</div>
<script>
const data = [
{
videoUrl: "videos/testimonial1.mp4",
review: "UK Visa success without IELTS/PTE in London with Raffles",
name: "Shreya Bajrayi",
designation: "UK Visa Success",
},
{
videoUrl: "videos/testimonial2.mp4",
review:
"UK Visa success without IELTS/PTE in London with Raffles",
name: "Sarita Tamang",
designation: "UK Visa Success",
},
{
videoUrl: "videos/testimonial3.mp4",
review: "Lorem ipsum dolor sit amet consectetur, adipisicing elit.",
name: "Emily Johnson",
designation: "Senior Accountant, QRS Solutions",
},
{
videoUrl: "videos/testimonial4.mp4",
review:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Alias, enim.",
name: "Sarah Thompson",
designation: "Graphic Designer, PQR Studios",
},
{
videoUrl: "videos/testimonial5.mp4",
review:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Alias, enim.",
name: "Robert Wilson",
designation: "Sales Executive, MNO Corporation",
},
];
const showMoreBtn = document.querySelector(
".testimonials-container .show-more-btn"
);
const testimonials = document.querySelector(".testimonials");
let latestTestimonialIndex = 0;
const generateTestimonial = (videoUrl, review, name, designation) => {
const htmlCode = `<div class="testimonial">
<div class="video">
<video
controls
width="100%"
src="{{asset('raffels/assets')}}/${videoUrl}"
></video>
</div>
<div class="review">
${review}
</div>
<div class="bottom">
<div class="name">${name}</div>
<div class="designation">${designation}</div>
</div>
</div>`;
return htmlCode;
};
const showTestimonial = () => {
let index = latestTestimonialIndex;
for (let i = index; i < index + 2; i++) {
if (!data[i]) {
showMoreBtn.style.display = "none";
return;
.testimonials-container h2 {
font-size: 28px;
padding-top: 10px;
}
testimonials.innerHTML += generateTestimonial(
data[i].videoUrl,
data[i].review,
data[i].name,
data[i].designation
);
.testimonials {
grid-template-columns: 1fr;
}
latestTestimonialIndex++;
.testimonial video {
height: 100%;
}
.testimonial {
gap: 12px;
}
.testimonials-container .logos-container {
grid-template-columns: repeat(2, 1fr);
gap: 60px;
}
}
};
</style>
<div class="testimonials-container">
showTestimonial();
showMoreBtn.addEventListener("click", showTestimonial);
</script>
<section>
<h2>Testimonials</h2><br><br>
<div class="testimonials">
@foreach ($testimonials as $item)
<div class="testimonial">
<div class="video">
<video controls width="100%" src="{{ asset('raffels/assets/videos') }}/{{$item->video_url}}"></video>
</div>
<div class="review">{{$item->review}}</div>
<div class="bottom">
<div class="name">{{$item->name}}</div>
<div class="designation">{{$item->designation}}</div>
</div>
</div>
@endforeach
</div>
</section>
</div>
</div>

View File

@ -14,227 +14,20 @@
<div class="owl-stage-outer">
<div class="owl-stage"
style="transform: translate3d(-1087px, 0px, 0px); transition: all 0.25s ease 0s; width: 4352px;">
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt="">
</a>
@foreach ($logos as $logo)
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{$logo->logo}}"
alt="">
</a>
</div>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item active" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item active" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item active" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo clicarousalent-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
<div class="owl-item cloned" style="width: 187.552px; margin-right: 30px;">
<div class="item">
<div class="ow-client-logo">
<div class="client-logo client-logo-media">
<a href="employer-list.html"><img
src="{{ asset('raffels/assets/images/client-logo2/Subject.png') }}"
alt=""></a>
</div>
</div>
</div>
</div>
@endforeach
</div>
</div>
<div class="owl-nav disabled"><button type="button" role="presentation"

View File

@ -0,0 +1,15 @@
<?php
use App\Http\Controllers\LogosController;
use Illuminate\Support\Facades\Route;
Route::prefix("logos")->group(function () {
Route::get('/', [LogosController::class, 'index'])->name('logos.index');
Route::get('/create', [LogosController::class, 'create'])->name('logos.create');
Route::post('/store', [LogosController::class, 'store'])->name('logos.store');
Route::post('/sort', [LogosController::class, 'sort'])->name('logos.sort');
Route::post('/updatealias', [LogosController::class, 'updatealias'])->name('logos.updatealias');
Route::get('/show/{id}', [LogosController::class, 'show'])->name('logos.show');
Route::get('/edit/{id}', [LogosController::class, 'edit'])->name('logos.edit') ;
Route::post('/update/{id}', [LogosController::class, 'update'])->name('logos.update');
Route::delete('/destroy/{id}', [LogosController::class, 'destroy'])->name('logos.destroy');
Route::get('/toggle/{id}', [LogosController::class, 'toggle'])->name('logos.toggle');
});

View File

@ -24,6 +24,8 @@ Route::middleware('auth')->group(function () {
Route::get('/registration/validate/{id}', [RegistrationsController::class, 'confirmation'])->name('registration.validate');
});
// Route::get('/testimonial/hello', [RegistrationsController::class,'getTestimonial'])->name('testimonial');
Route::get('/spin_the_wheel/reset', function () {
session()->flush();

View File

@ -0,0 +1,17 @@
<?php
use App\Http\Controllers\TestimonialsController;
use Illuminate\Support\Facades\Route;
Route::prefix("testimonials")->group(function () {
Route::get('/', [TestimonialsController::class, 'index'])->name('testimonials.index');
Route::get('/create', [TestimonialsController::class, 'create'])->name('testimonials.create');
Route::post('/store', [TestimonialsController::class, 'store'])->name('testimonials.store');
Route::post('/sort', [TestimonialsController::class, 'sort'])->name('testimonials.sort');
Route::post('/updatealias', [TestimonialsController::class, 'updatealias'])->name('testimonials.updatealias');
Route::get('/show/{id}', [TestimonialsController::class, 'show'])->name('testimonials.show');
Route::get('/edit/{id}', [TestimonialsController::class, 'edit'])->name('testimonials.edit');
Route::post('/update/{id}', [TestimonialsController::class, 'update'])->name('testimonials.update');
Route::delete('/destroy/{id}', [TestimonialsController::class, 'destroy'])->name('testimonials.destroy');
Route::get('/toggle/{id}', [TestimonialsController::class, 'toggle'])->name('testimonials.toggle');
});

View File

@ -109,7 +109,11 @@ Route::middleware('auth')->group(function () {
require __DIR__ . '/CRUDgenerated/route.offerapplications.php';
require __DIR__ . '/CRUDgenerated/route.requireddocuments.php';
require __DIR__ . '/CRUDgenerated/route.contactus.php';
require __DIR__ . '/CRUDgenerated/route.logos.php';
require __DIR__ . '/route.testimonials.php';
});
require __DIR__ . '/route.ajax.php';
require __DIR__ . '/route.client.php';

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB