Файловый менеджер - Редактировать - /home/c7lekhnath/silverray.com.au/Modules/Language/database/seeders/68334/Property.tar
Назад
lang/.gitkeep 0000644 00000000000 15012234214 0007076 0 ustar 00 module.json 0000644 00000000342 15012234214 0006715 0 ustar 00 { "name": "Property", "alias": "property", "description": "", "keywords": [], "priority": 0, "providers": [ "Modules\\Property\\app\\Providers\\PropertyServiceProvider" ], "files": [] } tests/Unit/.gitkeep 0000644 00000000000 15012234214 0010236 0 ustar 00 tests/Feature/.gitkeep 0000644 00000000000 15012234214 0010712 0 ustar 00 vite.config.js 0000644 00000001306 15012234214 0007307 0 ustar 00 import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; export default defineConfig({ build: { outDir: '../../public/build-property', emptyOutDir: true, manifest: true, }, plugins: [ laravel({ publicDirectory: '../../public', buildDirectory: 'build-property', input: [ __dirname + '/resources/assets/sass/app.scss', __dirname + '/resources/assets/js/app.js' ], refresh: true, }), ], }); //export const paths = [ // 'Modules/$STUDLY_NAME$/resources/assets/sass/app.scss', // 'Modules/$STUDLY_NAME$/resources/assets/js/app.js', //]; routes/.gitkeep 0000644 00000000000 15012234214 0007476 0 ustar 00 routes/error_log 0000644 00000000444 15012234214 0007776 0 ustar 00 [07-May-2025 13:21:27 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Support\Facades\Route" not found in /home/lekhnath/silverray.com.au/Modules/Property/routes/web.php:26 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Property/routes/web.php on line 26 routes/web.php 0000644 00000020173 15012234214 0007350 0 ustar 00 <?php use Illuminate\Support\Facades\Route; use Modules\Property\app\Http\Controllers\User\ReviewController; use Modules\Property\app\Http\Controllers\Admin\ReviewController as AdminReviewController; use Modules\Property\app\Http\Controllers\Admin\AminityController; use Modules\Property\app\Http\Controllers\Admin\PropertyController; use Modules\Property\app\Http\Controllers\Staff\PropertyController as StaffPropertyController; use Modules\Property\app\Http\Controllers\Admin\PropertyTypeController; use Modules\Property\app\Http\Controllers\Admin\NearestLocationController; use Modules\Property\app\Http\Controllers\Admin\PropertyPurposeController; use Modules\Property\app\Http\Controllers\User\PropertyController as UserPropertyController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::middleware(['auth:admin', 'translation']) ->name('admin.') ->prefix('admin') ->group(function () { Route::resource('property', PropertyController::class)->names('property'); Route::put('/property/status-update/{id}', [PropertyController::class, 'statusUpdate'])->name('property.status-update'); Route::get('agent-property', [PropertyController::class, 'agentProperty'])->name('agent-property'); Route::delete('delete-agent-property/{id}', [PropertyController::class, 'deleteAgentProperty'])->name('delete-agent-property'); Route::post('/download-property-file', [PropertyController::class, 'downloadPropertyFile'] )->name('download-property-file'); Route::get('property-delete-pdf/{id}', [PropertyController::class, 'deletePdfFile'] )->name('property-delete-pdf'); Route::controller(PropertyController::class)->group(function () { Route::get('property-slider/{property_id}', 'property_slider')->name('property-slider'); Route::put('upload-property-slider/{property_id}', 'upload_property_slider')->name('upload-property-slider'); Route::delete('delete-property-slider/{property_id}', 'delete_property_slider')->name('delete-property-slider'); }); Route::controller(PropertyController::class)->group(function () { Route::get('property-nearest-location/{property_id}', 'nearest_location')->name('property-nearest-location'); Route::post('upload-nearest-location/{property_id}', 'upload_nearest_location')->name('upload-nearest-location'); Route::delete('delete-nearest-location/{property_id}', 'delete_nearest_location')->name('delete-nearest-location'); }); Route::resource('amenity', AminityController::class)->names('amenity')->except('show'); Route::put('/aminity/status-update/{id}', [AminityController::class, 'statusUpdate'])->name('aminity.status-update'); Route::resource('nearest-location', NearestLocationController::class)->names('nearest-location')->except('show'); Route::put('/nearest-location/status-update/{id}', [NearestLocationController::class, 'statusUpdate'])->name('nearest-location.status-update'); Route::resource('property-type', PropertyTypeController::class)->names('property-type')->except('show'); Route::put('/property-type/status-update/{id}', [PropertyTypeController::class, 'statusUpdate'])->name('property-type.status-update'); Route::resource('property-purpose', PropertyPurposeController::class)->names('property-purpose')->except('show'); Route::put('/property-purpose/status-update/{id}', [PropertyPurposeController::class, 'statusUpdate'])->name('property-purpose.status-update'); Route::get( 'property-review', [AdminReviewController::class, 'index'] )->name('review'); Route::delete('review-delete/{id}', [AdminReviewController::class, 'destroy'] )->name('review.delete'); Route::put('review-status/{id}', [AdminReviewController::class, 'changeStatus'] )->name('review-status'); }); Route::group(['as' => 'user.', 'prefix' => 'user', 'middleware' => ['auth:web', 'translation', 'verified']], function () { Route::resource('property', UserPropertyController::class)->names('property'); Route::put('/property/status-update/{id}', [UserPropertyController::class, 'statusUpdate'])->name('property.status-update'); Route::get('/delete/property/{id}', [UserPropertyController::class, 'deleteProperty'])->name('delete.property'); Route::post('/download-property-file', [UserPropertyController::class, 'downloadPropertyFile'] )->name('download-property-file'); Route::get('property-delete-pdf/{id}', [UserPropertyController::class, 'deletePdfFile'] )->name('property-delete-pdf'); Route::controller(UserPropertyController::class)->group(function () { Route::get('property-slider/{property_id}', 'property_slider')->name('property-slider'); Route::put('upload-property-slider/{property_id}', 'upload_property_slider')->name('upload-property-slider'); Route::get('delete-property-slider/{property_id}', 'delete_property_slider')->name('delete-property-slider'); }); Route::controller(UserPropertyController::class)->group(function () { Route::get('property-nearest-location/{property_id}', 'nearest_location')->name('property-nearest-location'); Route::post('upload-nearest-location/{property_id}', 'upload_nearest_location')->name('upload-nearest-location'); Route::get('delete-nearest-location/{property_id}', 'delete_nearest_location')->name('delete-nearest-location'); }); Route::post('languages/update-single', [UserPropertyController::class, 'translateSingleText'])->name('languages.update.single'); Route::get('my-review', [ReviewController::class, 'myReview'] )->name('my-review'); Route::get('client-review', [ReviewController::class, 'clientReview'] )->name( 'client-review' ); Route::post('store-review', [ReviewController::class, 'storeReview'] )->name( 'store-review' ); Route::get('edit-review/{id}', [ReviewController::class, 'editReview'] )->name( 'edit-review' ); Route::post('update-review/{id}', [ReviewController::class, 'updateReview'] )->name( 'update-review' ); Route::get('delete-review/{id}', [ReviewController::class, 'deleteReview'] )->name( 'delete-review' ); }); Route::middleware(['auth:staff', 'translation']) ->name('staff.') ->prefix('staff') ->group(function () { Route::resource('property', StaffPropertyController::class)->names('property'); Route::put('/property/status-update/{id}', [StaffPropertyController::class, 'statusUpdate'])->name('property.status-update'); Route::post('/download-property-file', [StaffPropertyController::class, 'downloadPropertyFile'] )->name('download-property-file'); Route::get('property-delete-pdf/{id}', [StaffPropertyController::class, 'deletePdfFile'] )->name('property-delete-pdf'); Route::controller(StaffPropertyController::class)->group(function () { Route::get('property-slider/{property_id}', 'property_slider')->name('property-slider'); Route::put('upload-property-slider/{property_id}', 'upload_property_slider')->name('upload-property-slider'); Route::delete('delete-property-slider/{property_id}', 'delete_property_slider')->name('delete-property-slider'); }); Route::controller(StaffPropertyController::class)->group(function () { Route::get('property-nearest-location/{property_id}', 'nearest_location')->name('property-nearest-location'); Route::post('upload-nearest-location/{property_id}', 'upload_nearest_location')->name('upload-nearest-location'); Route::delete('delete-nearest-location/{property_id}', 'delete_nearest_location')->name('delete-nearest-location'); }); Route::post('languages/update-single', [StaffPropertyController::class, 'translateSingleText'])->name('languages.update.single'); }); routes/api.php 0000644 00000001235 15012234214 0007342 0 ustar 00 <?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | API Routes |-------------------------------------------------------------------------- | | Here is where you can register API routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | is assigned the "api" middleware group. Enjoy building your API! | */ Route::middleware(['auth:sanctum'])->prefix('v1')->name('api.')->group(function () { Route::get('property', fn (Request $request) => $request->user())->name('property'); }); composer.json 0000644 00000001303 15012234214 0007255 0 ustar 00 { "name": "nwidart/property", "description": "", "authors": [ { "name": "Nicolas Widart", "email": "n.widart@gmail.com" } ], "extra": { "laravel": { "providers": [], "aliases": { } } }, "autoload": { "psr-4": { "Modules\\Property\\": "", "Modules\\Property\\App\\": "app/", "Modules\\Property\\Database\\Factories\\": "database/factories/", "Modules\\Property\\Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { "psr-4": { "Modules\\Property\\Tests\\": "tests/" } } } config/config.php 0000644 00000000055 15012234214 0007761 0 ustar 00 <?php return [ 'name' => 'Property', ]; config/.gitkeep 0000644 00000000000 15012234214 0007422 0 ustar 00 package.json 0000644 00000000410 15012234214 0007017 0 ustar 00 { "private": true, "type": "module", "scripts": { "dev": "vite", "build": "vite build" }, "devDependencies": { "axios": "^1.1.2", "laravel-vite-plugin": "^0.7.5", "sass": "^1.69.5", "postcss": "^8.3.7", "vite": "^4.0.0" } } app/Http/Controllers/.gitkeep 0000644 00000000000 15012234214 0012162 0 ustar 00 app/Http/Controllers/User/ReviewController.php 0000644 00000013221 15012234214 0015476 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\User; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Rules\CustomRecaptcha; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Support\Facades\Auth; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Cache; use Modules\Property\app\Models\Property; use Modules\Property\app\Models\PropertyReview; class ReviewController extends Controller { /** * Display a listing of the resource. */ public function clientReview(){ Paginator::useBootstrap(); $user=Auth::guard('web')->user(); $clientReviews = PropertyReview::join('properties', 'properties.id', '=', 'property_reviews.property_id') ->join('users', 'users.id', '=', 'property_reviews.user_id') ->join('property_translations', 'property_translations.property_id', '=', 'properties.id') ->where('property_translations.lang_code', getSessionLanguage()) ->where('properties.user_id', $user->id) ->where('property_reviews.status', 1) ->paginate(10); return view('property::user.review.client-review',compact('clientReviews')); } public function myReview(){ Paginator::useBootstrap(); $user=Auth::guard('web')->user(); $myReviews=PropertyReview::with('property')->where(['user_id'=>$user->id,'status'=>1])->orderBy('id','desc')->paginate(10); return view('property::user.review.review',compact('myReviews')); } public function editReview($id){ $user=Auth::guard('web')->user(); $review=PropertyReview::where(['user_id'=>$user->id,'id'=>$id])->first(); if($review){ return view('property::user.review.review-edit',compact('review')); }else{ $notification=trans('Something went wrong'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->route('user.my-review')->with($notification); } } public function deleteReview($id){ $user=Auth::guard('web')->user(); $review=PropertyReview::where(['user_id'=>$user->id,'id'=>$id])->first(); if($review){ $review->delete(); $notification=trans('Deleted successfully'); $notification=array('messege'=>$notification,'alert-type'=>'success'); return redirect()->route('user.my-review')->with($notification); }else{ $notification=trans('Something went wrong'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->route('user.my-review')->with($notification); } } public function storeReview(Request $request){ $setting = Cache::get('setting'); $rules = [ 'property_id'=>'required', 'service_rating'=>'required', 'location_rating'=>'required', 'money_rating'=>'required', 'clean_rating'=>'required', 'avarage_rating'=>'required', 'comment'=>'required', 'g-recaptcha-response'=>$setting->recaptcha_status == 'active' ? ['required', new CustomRecaptcha()] : '', ]; $customMessages = [ 'comment.required' => trans('Comment field is required'), ]; $this->validate($request, $rules, $customMessages); $user=Auth::guard('web')->user(); $isExist=PropertyReview::where(['user_id'=>$user->id,'property_id'=>$request->property_id])->count(); if($isExist==0){ $review=new PropertyReview(); $review->user_id=$user->id; $review->property_id=$request->property_id; $review->service_rating=$request->service_rating; $review->location_rating=$request->location_rating; $review->money_rating=$request->money_rating; $review->clean_rating=$request->clean_rating; $review->avarage_rating=$request->avarage_rating; $review->comment=$request->comment; $review->status=0; $review->save(); $notification=trans('Review submited successfully'); $notification=array('messege'=>$notification,'alert-type'=>'success'); return redirect()->back()->with($notification); }{ $notification=trans('Review already submited'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } } public function updateReview(Request $request,$id){ $rules = [ 'property_id'=>'required', 'service_rating'=>'required', 'location_rating'=>'required', 'money_rating'=>'required', 'clean_rating'=>'required', 'avarage_rating'=>'required', 'comment'=>'required' ]; $customMessages = [ 'comment.required' => trans('Comment field is required'), ]; $this->validate($request, $rules, $customMessages); $user=Auth::guard('web')->user(); $review=PropertyReview::find($id); $review->service_rating=$request->service_rating; $review->location_rating=$request->location_rating; $review->money_rating=$request->money_rating; $review->clean_rating=$request->clean_rating; $review->avarage_rating=$request->avarage_rating; $review->comment=$request->comment; $review->save(); $notification=trans('Updated successfully'); $notification=array('messege'=>$notification,'alert-type'=>'success'); return redirect()->route('user.my-review')->with($notification); } } app/Http/Controllers/User/PropertyController.php 0000644 00000041560 15012234214 0016070 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\User; use File; use App\Models\WishList; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Support\Facades\Auth; use Illuminate\Http\RedirectResponse; use Modules\Location\app\Models\City; use Modules\Property\app\Models\Aminity; use Modules\Language\app\Models\Language; use Modules\Property\app\Models\Property; use Modules\Property\app\Models\PropertyType; use Stichoza\GoogleTranslate\GoogleTranslate; use Modules\Property\app\Models\PropertyImage; use Modules\Property\app\Models\PropertyReview; use Modules\Property\app\Models\NearestLocation; use Modules\Property\app\Models\PropertyAminity; use Modules\Property\app\Models\PropertyPurpose; use Modules\Language\app\Enums\TranslationModels; use Modules\Property\app\Models\PropertyTypeRequest; use Modules\Property\app\Http\Requests\PropertyRequest; use Modules\Property\app\Models\PropertyNearestLocation; use Modules\Subscription\app\Models\SubscriptionHistory; use Modules\Language\app\Traits\GenerateTranslationTrait; class PropertyController extends Controller { use RedirectHelperTrait, GenerateTranslationTrait; public function index() { Paginator::useBootstrap(); $user=Auth::guard('web')->user(); $properties = Property::with('translation','propertyPurpose','reviews','city')->where('user_id', $user->id)->paginate(15); return view('property::user.property.index', ['properties' => $properties]); } public function create() { $user = Auth::guard('web')->user(); $propertyTypes=PropertyType::with('translation')->where('status',1)->get(); $cities=City::where('status',1)->get(); $purposes=PropertyPurpose::with('translation')->where('status',1)->get(); $aminities=Aminity::with('translation')->where('status',1)->get(); $subscription=SubscriptionHistory::where(['user_id' => $user->id])->latest()->first(); if($subscription){ $expiration_date = date('Y-m-d', strtotime($subscription->expiration_date)); if(date('Y-m-d') <= $expiration_date && $subscription->status == 'active'){ if($subscription->number_of_property==-1){ $existFeaturedProperty=Property::where(['user_id'=>$user->id,'is_featured'=>1])->count(); $existTopProperty=Property::where(['user_id'=>$user->id,'top_property'=>1])->count(); $existUrgentProperty=Property::where(['user_id'=>$user->id,'urgent_property'=>1])->count(); return view('property::user.property.create', compact('propertyTypes','cities','purposes','aminities','subscription','existFeaturedProperty','existTopProperty','existUrgentProperty')); }else if($subscription->number_of_property > 0){ $existFeaturedProperty=Property::where(['user_id'=>$user->id,'is_featured'=>1])->count(); $existTopProperty=Property::where(['user_id'=>$user->id,'top_property'=>1])->count(); $existUrgentProperty=Property::where(['user_id'=>$user->id,'urgent_property'=>1])->count(); $existProperty=Property::where(['user_id'=>$user->id])->count(); if($subscription->number_of_property > $existProperty){ return view('property::user.property.create', compact('propertyTypes','cities','purposes','aminities','subscription','existFeaturedProperty','existTopProperty', 'existUrgentProperty')); }else{ $notification=trans('Maximum property already exist'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } }else{ $notification=trans('Maximum property already exist'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } }else{ $notification=trans('Your plan has been expired'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } }else{ $notification=trans('You have no plan. Buy the plans first'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->route('subscription.pricing.plan')->with($notification); } } public function store(PropertyRequest $request): RedirectResponse { $validated_date = $request->validated(); $user = Auth::guard('web')->user(); $subscription=SubscriptionHistory::where(['user_id' => $user->id])->latest()->first(); $validated_date = array_merge([ 'user_id' => $user->id, 'period' => $request->period ? $request->period : null, 'user_type' => 0, 'expired_date' => $subscription->expiration_date, 'property_search_id' => mt_rand(10000000,99999999), ], $validated_date); $property = Property::create($validated_date); if ($property && $request->hasFile('thumbnail_image')) { $file_name = file_upload($request->thumbnail_image, 'uploads/custom-images/', $oldFile = null); $property->thumbnail_image = $file_name; $property->save(); } if ($property && $request->hasFile('banner_image')) { $file_name = file_upload($request->banner_image, 'uploads/custom-images/', $oldFile = null); $property->banner_image = $file_name; $property->save(); } if ($property && $request->hasFile('pdf_file')) { $file_name = file_upload($request->pdf_file, 'uploads/custom-images/', $oldFile = null); $property->pdf_file = $file_name; $property->save(); } // insert aminity if($request->aminities){ foreach($request->aminities as $amnty){ $aminity= new PropertyAminity(); $aminity->property_id=$property->id; $aminity->aminity_id=$amnty; $aminity->save(); } } $this->generateTranslations( TranslationModels::Property, $property, 'property_id', $request, ); return $this->redirectWithMessage( RedirectType::CREATE->value, 'user.property.edit', [ 'property' => $property->id, 'code' => allLanguages()->first()->code, ] ); } public function show($id) { return view('property::show'); } public function edit($id) { $user = Auth::guard('web')->user(); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $property = Property::with('propertyAminities')->findOrFail($id); $propertyTypes=PropertyType::with('translation')->where('status',1)->get(); $cities=City::with('countryState')->where('status',1)->get(); $purposes=PropertyPurpose::with('translation')->where('status',1)->get(); $aminities=Aminity::with('translation')->where('status',1)->get(); $subscription=SubscriptionHistory::where(['user_id' => $user->id, 'status' => 'active'])->latest()->first(); $existFeaturedProperty=Property::where(['user_id'=>$user->id,'is_featured'=>1])->count(); $existTopProperty=Property::where(['user_id'=>$user->id,'top_property'=>1])->count(); $existUrgentProperty=Property::where(['user_id'=>$user->id,'urgent_property'=>1])->count(); $languages = allLanguages(); return view('property::user.property.edit', compact('property', 'code', 'languages','propertyTypes','cities','purposes','aminities','subscription','existFeaturedProperty','existTopProperty','existUrgentProperty')); } /** * Update the specified resource in storage. */ public function update(PropertyRequest $request, $id) { $validatedData = $request->validated(); $property = Property::findOrFail($id); if ($request->hasFile('thumbnail_image')) { $file_name = file_upload($request->thumbnail_image, 'uploads/custom-images/', $oldFile = $property->thumbnail_image); $validatedData['thumbnail_image'] = $file_name; } if ($request->hasFile('banner_image')) { $file_name = file_upload($request->banner_image, 'uploads/custom-images/', $oldFile = $property->banner_image); $validatedData['banner_image'] = $file_name; } if ($request->hasFile('pdf_file')) { $file_name = file_upload($request->pdf_file, 'uploads/custom-images/', $oldFile = $property->pdf_file); $validatedData['pdf_file'] = $file_name; } $property->update($validatedData); // for aminity $old_aminities = PropertyAminity::where('property_id', $property->id)->get(); if($request->aminities){ foreach($request->aminities as $amnty){ $aminity= new PropertyAminity(); $aminity->property_id=$property->id; $aminity->aminity_id=$amnty; $aminity->save(); } if($old_aminities->count()>0){ foreach($old_aminities as $old_aminity){ $old_aminity->delete(); } } }else{ if($old_aminities->count()>0){ foreach($old_aminities as $old_aminity){ $old_aminity->delete(); } } } $this->updateTranslations( $property, $request, $validatedData, ); return $this->redirectWithMessage( RedirectType::UPDATE->value, 'user.property.edit', ['property' => $property->id, 'code' => $request->code] ); } public function deleteProperty($id) { $property = Property::findOrFail($id); $property->translations()->each(function ($translation) { $translation->delete(); }); if ($property->thumbnail_image) { if (File::exists(public_path($property->thumbnail_image))) { unlink(public_path($property->thumbnail_image)); } } if ($property->banner_image) { if (File::exists(public_path($property->banner_image))) { unlink(public_path($property->banner_image)); } } if ($property->pdf_file) { if (File::exists(public_path($property->pdf_file))) { unlink(public_path($property->pdf_file)); } } $propertyAminities = PropertyAminity::where('property_id', $id)->get(); foreach($propertyAminities as $propertyAminity){ $propertyAminity->delete(); } $propertyNearestLocations = PropertyNearestLocation::where('property_id', $id)->get(); foreach($propertyNearestLocations as $propertyNearestLocation){ $propertyNearestLocation->delete(); } $propertyImages = PropertyImage::where('property_id', $id)->get(); foreach($propertyImages as $propertyImage){ if ($propertyImage->image) { if (File::exists(public_path($propertyImage->image))) { unlink(public_path($propertyImage->image)); } } $propertyImage->delete(); } $reviews = PropertyReview::where('property_id',$id)->get(); foreach($reviews as $review){ $review->delete(); } $wishlists = WishList::where('property_id',$id)->get(); foreach($wishlists as $wishlist){ $wishlist->delete(); } $property->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'user.property.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('property.update'); $property = Property::find($id); $status = $property->status == 1 ? 0 : 1; $property->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } public function downloadPropertyFile(Request $request){ $property = Property::findOrFail($request->id); $filepath = $property->pdf_file; // Check if the file exists if (file_exists($filepath)) { return response()->download($filepath); } $notification = trans('File not found.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } public function deletePdfFile($id){ $property=Property::find($id); $old_file= $property->pdf_file; $property->pdf_file=null; $property->save(); if(File::exists(public_path().'/'.$old_file)) unlink(public_path().'/'.$old_file); $notification=trans('Deleted successfully'); return response()->json(['success'=>$notification]); } public function property_slider($property_id){ $property = Property::findOrFail($property_id); $slider_images = PropertyImage::where(['property_id' => $property_id])->latest()->get(); return view('property::user.property.slider', compact('property','slider_images')); } public function upload_property_slider(Request $request,$property_id){ foreach ($request->file as $index => $image) { $slider_image = new PropertyImage(); $slider_image->property_id = $property_id; $file_name = file_upload($image, 'uploads/custom-images/', $oldFile = null); $slider_image->image = $file_name; $slider_image->save(); } if ($slider_image) { return response()->json([ 'message' => trans('Images Saved Successfully'), 'url' => route('user.property-slider', $property_id), ]); } else { $notification=trans('Images Saved Fail'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } } public function delete_property_slider($id){ $sliderImage = PropertyImage::findOrFail($id); if ($sliderImage->image) { if (@File::exists(public_path($sliderImage->image))) { @unlink(public_path($sliderImage->image)); } } $sliderImage->delete(); $notification=trans('Images delete successfully'); $notification=array('messege'=>$notification,'alert-type'=>'success'); return redirect()->back()->with($notification); } public function nearest_location($property_id){ $property = Property::findOrFail($property_id); $locations = NearestLocation::get(); $nearest_locations = PropertyNearestLocation::where(['property_id' => $property_id])->latest()->get(); return view('property::user.property.nearestlocation', compact('property','nearest_locations','locations')); } public function upload_nearest_location(Request $request,$property_id){ $rules = [ 'nearest_place_id' => 'required', 'distance' => 'required', ]; $customMessages = [ 'nearest_place_id.required' => __('Nearest location is required'), 'distance.required' => __('Distance is required'), ]; $this->validate($request, $rules, $customMessages); $nearest_location = new PropertyNearestLocation(); $nearest_location->property_id = $property_id; $nearest_location->nearest_place_id = $request->nearest_place_id; $nearest_location->distance = $request->distance; $nearest_location->save(); return $this->redirectWithMessage(RedirectType::CREATE->value); } public function delete_nearest_location($id){ $nearestLocation = PropertyNearestLocation::findOrFail($id); $nearestLocation->delete(); $notification=trans('Location delete successfully'); $notification=array('messege'=>$notification,'alert-type'=>'success'); return redirect()->back()->with($notification); } public function translateSingleText(Request $request) { $tr = new GoogleTranslate($request->lang); $afterTrans = $tr->translate($request->text); return response()->json($afterTrans); } } app/Http/Controllers/Admin/ReviewController.php 0000644 00000002223 15012234214 0015610 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\Admin; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Http\RedirectResponse; use Modules\Property\app\Models\PropertyReview; class ReviewController extends Controller { use RedirectHelperTrait; public function index(){ $reviews=PropertyReview::orderBy('id','desc')->paginate(15); return view('property::admin.review.review',compact('reviews')); } public function destroy($id) { $review=PropertyReview::find($id); $review->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.review'); } public function changeStatus($id){ $review=PropertyReview::find($id); if($review->status==1){ $review->status=0; }else{ $review->status=1; } $review->save(); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Controllers/Admin/PropertyPurposeController.php 0000644 00000004406 15012234214 0017556 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\Admin; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Http\RedirectResponse; use Modules\Language\app\Models\Language; use Modules\Property\app\Models\PropertyPurpose; use Modules\Language\app\Traits\GenerateTranslationTrait; use Modules\Property\app\Http\Requests\PropertyPurposeRequest; class PropertyPurposeController extends Controller { use GenerateTranslationTrait, RedirectHelperTrait; public function index() { Paginator::useBootstrap(); $propertyPurposes = PropertyPurpose::paginate(15); return view('property::admin.propertypurpose.index', ['propertyPurposes' => $propertyPurposes]); } /** * Show the form for editing the specified resource. */ public function edit($id) { $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $propertyPurpose = PropertyPurpose::findOrFail($id); $languages = allLanguages(); return view('property::admin.propertypurpose.edit', compact('propertyPurpose', 'code', 'languages')); } public function update(PropertyPurposeRequest $request, PropertyPurpose $propertyPurpose) { $validatedData = $request->validated(); $propertyPurpose->update($validatedData); $this->updateTranslations( $propertyPurpose, $request, $validatedData, ); return $this->redirectWithMessage(RedirectType::UPDATE->value, 'admin.property-purpose.edit', ['property_purpose' => $propertyPurpose->id, 'code' => $request->code]); } /** * Remove the specified resource from storage. */ public function statusUpdate($id) { $propertyPurpose = PropertyPurpose::find($id); $status = $propertyPurpose->status == 1 ? 0 : 1; $propertyPurpose->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Controllers/Admin/PropertyController.php 0000644 00000050472 15012234214 0016204 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\Admin; use Auth; use File; use App\Models\User; use App\Models\WishList; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Http\RedirectResponse; use Modules\Location\app\Models\City; use Modules\Property\app\Models\Aminity; use Modules\Language\app\Models\Language; use Modules\Property\app\Models\Property; use Modules\Property\app\Models\PropertyType; use Modules\Property\app\Models\PropertyImage; use Modules\Property\app\Models\PropertyReview; use Modules\Property\app\Models\NearestLocation; use Modules\Property\app\Models\PropertyAminity; use Modules\Property\app\Models\PropertyPurpose; use Modules\Language\app\Enums\TranslationModels; use Modules\Property\app\Models\PropertyTypeRequest; use Modules\Property\app\Http\Requests\PropertyRequest; use Modules\Property\app\Models\PropertyNearestLocation; use Modules\Subscription\app\Models\SubscriptionHistory; use Modules\Language\app\Traits\GenerateTranslationTrait; class PropertyController extends Controller { use RedirectHelperTrait, GenerateTranslationTrait; public function index(Request $request) { checkAdminHasPermissionAndThrowException('property.view'); $query = Property::query()->where('user_type', 1); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('status'), function ($q) use ($request) { $q->where('status', $request->status); }); $orderBy = $request->filled( 'order_by' ) && $request->order_by == 1 ? 'asc' : 'desc'; if ($request->filled('par-page')) { $properties = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $properties = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('property::admin.property.index', ['properties' => $properties]); } public function agentProperty(Request $request){ checkAdminHasPermissionAndThrowException('property.view'); $query = Property::query()->where('user_type', 0); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('status'), function ($q) use ($request) { $q->where('status', $request->status); }); $orderBy = $request->filled( 'order_by' ) && $request->order_by == 1 ? 'asc' : 'desc'; if ($request->filled('par-page')) { $properties = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $properties = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('property::admin.property.agent_property', ['properties' => $properties]); } public function create() { checkAdminHasPermissionAndThrowException('property.create'); $propertyTypes=PropertyType::with('translation')->where('status',1)->get(); $cities=City::where('status',1)->get(); $purposes=PropertyPurpose::with('translation')->where('status',1)->get(); $aminities=Aminity::with('translation')->where('status',1)->get(); $agents = User::where('status', 'active')->get(); return view('property::admin.property.create', compact('propertyTypes','cities','purposes','aminities','agents')); } public function store(PropertyRequest $request): RedirectResponse { checkAdminHasPermissionAndThrowException('property.store'); $validated_date = $request->validated(); $admin = Auth::guard('admin')->user(); $subscription = SubscriptionHistory::where(['user_id' => $request->agent])->latest()->first(); if($request->agent != 0 && $subscription){ $expiration_date = date('Y-m-d', strtotime($subscription->expiration_date)); if(date('Y-m-d') <= $expiration_date && $subscription->status == 'active'){ $expired_date = $expiration_date; }else{ $notification=trans('This agents plan has expired. Please renew or purchase a new plan first.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } }else{ if($request->agent == 0){ $expired_date = date('Y-m-d', strtotime('+100 years')); }else{ $notification=trans('Please assign the plans first, this agent currently has no plans.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } } $validated_date = array_merge([ 'admin_id' => $request->agent == 0 ? $admin->id : 0, 'user_id' => $request->agent == 0 ? 0 : $request->agent, 'period' => $request->period ? $request->period : null, 'user_type' => $request->agent == 0 ? 1:0, 'expired_date' => $expired_date, 'property_search_id' => mt_rand(10000000,99999999), ], $validated_date); $property = Property::create($validated_date); if ($property && $request->hasFile('thumbnail_image')) { $file_name = file_upload($request->thumbnail_image, 'uploads/custom-images/', $oldPath = null); $property->thumbnail_image = $file_name; $property->save(); } if ($property && $request->hasFile('banner_image')) { $file_name = file_upload($request->banner_image, 'uploads/custom-images/', $oldPath = null); $property->banner_image = $file_name; $property->save(); } if ($property && $request->hasFile('pdf_file')) { $file_name = file_upload($request->pdf_file, 'uploads/custom-images/', $oldPath = null); $property->pdf_file = $file_name; $property->save(); } // insert aminity if($request->aminities){ foreach($request->aminities as $amnty){ $aminity= new PropertyAminity(); $aminity->property_id=$property->id; $aminity->aminity_id=$amnty; $aminity->save(); } } $this->generateTranslations( TranslationModels::Property, $property, 'property_id', $request, ); return $this->redirectWithMessage( RedirectType::CREATE->value, 'admin.property.edit', [ 'property' => $property->id, 'code' => allLanguages()->first()->code, ] ); } public function show($id) { return view('property::show'); } public function edit($id) { checkAdminHasPermissionAndThrowException('property.edit'); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $property = Property::with('propertyAminities')->findOrFail($id); $propertyTypes=PropertyType::with('translation')->where('status',1)->get(); $cities=City::with('countryState')->where('status',1)->get(); $purposes=PropertyPurpose::with('translation')->where('status',1)->get(); $aminities=Aminity::with('translation')->where('status',1)->get(); $agents = User::where('status', 'active')->get(); $languages = allLanguages(); return view('property::admin.property.edit', compact('property', 'code', 'languages','propertyTypes','cities','purposes','aminities','agents')); } /** * Update the specified resource in storage. */ public function update(PropertyRequest $request, $id) { checkAdminHasPermissionAndThrowException('property.update'); $validatedData = $request->validated(); $admin = Auth::guard('admin')->user(); $subscription = SubscriptionHistory::where(['user_id' => $request->agent])->latest()->first(); if($request->agent != 0 && $subscription){ $expiration_date = date('Y-m-d', strtotime($subscription->expiration_date)); if(date('Y-m-d') <= $expiration_date && $subscription->status == 'active'){ $expired_date = $expiration_date; }else{ $notification=trans('This agents plan has expired. Please renew or purchase a new plan first.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } }else{ if($request->agent == 0){ $expired_date = date('Y-m-d', strtotime('+100 years')); }else{ $notification=trans('Please assign the plans first, this agent currently has no plans.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } } $property = Property::findOrFail($id); if($request->code == 'en'){ $validatedData = array_merge([ 'admin_id' => $request->agent == 0 ? $admin->id : 0, 'user_id' => $request->agent == 0 ? 0 : $request->agent, 'period' => $request->period ? $request->period : null, 'user_type' => $request->agent == 0 ? 1:0, 'expired_date' => $expired_date, ], $validatedData); } if ($request->hasFile('thumbnail_image')) { $file_name = file_upload($request->thumbnail_image, 'uploads/custom-images/', $oldFile = $property->thumbnail_image); $validatedData['thumbnail_image'] = $file_name; } if ($request->hasFile('banner_image')) { $file_name = file_upload($request->banner_image, 'uploads/custom-images/', $oldFile = $property->banner_image); $validatedData['banner_image'] = $file_name; } if ($request->hasFile('pdf_file')) { $file_name = file_upload($request->pdf_file, 'uploads/custom-images/', $oldFile = $property->pdf_file); $validatedData['pdf_file'] = $file_name; } $property->update($validatedData); // for aminity $old_aminities = PropertyAminity::where('property_id', $property->id)->get(); if($request->aminities){ foreach($request->aminities as $amnty){ $aminity= new PropertyAminity(); $aminity->property_id=$property->id; $aminity->aminity_id=$amnty; $aminity->save(); } if($old_aminities->count()>0){ foreach($old_aminities as $old_aminity){ $old_aminity->delete(); } } }else{ if($old_aminities->count()>0){ foreach($old_aminities as $old_aminity){ $old_aminity->delete(); } } } $this->updateTranslations( $property, $request, $validatedData, ); return $this->redirectWithMessage( RedirectType::UPDATE->value, 'admin.property.edit', ['property' => $property->id, 'code' => $request->code] ); } public function deleteAgentProperty($id) { checkAdminHasPermissionAndThrowException('property.delete'); $property = Property::findOrFail($id); $property->translations()->each(function ($translation) { $translation->delete(); }); if ($property->thumbnail_image) { if (File::exists(public_path($property->thumbnail_image))) { unlink(public_path($property->thumbnail_image)); } } if ($property->banner_image) { if (File::exists(public_path($property->banner_image))) { unlink(public_path($property->banner_image)); } } if ($property->pdf_file) { if (File::exists(public_path($property->pdf_file))) { unlink(public_path($property->pdf_file)); } } $propertyAminities = PropertyAminity::where('property_id', $id)->get(); foreach($propertyAminities as $propertyAminity){ $propertyAminity->delete(); } $propertyNearestLocations = PropertyNearestLocation::where('property_id', $id)->get(); foreach($propertyNearestLocations as $propertyNearestLocation){ $propertyNearestLocation->delete(); } $propertyImages = PropertyImage::where('property_id', $id)->get(); foreach($propertyImages as $propertyImage){ if ($propertyImage->image) { if (File::exists(public_path($propertyImage->image))) { unlink(public_path($propertyImage->image)); } } $propertyImage->delete(); } $property->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.agent-property'); } public function destroy($id) { checkAdminHasPermissionAndThrowException('property.delete'); $property = Property::findOrFail($id); $property->translations()->each(function ($translation) { $translation->delete(); }); if ($property->thumbnail_image) { if (File::exists(public_path($property->thumbnail_image))) { unlink(public_path($property->thumbnail_image)); } } if ($property->banner_image) { if (File::exists(public_path($property->banner_image))) { unlink(public_path($property->banner_image)); } } if ($property->pdf_file) { if (File::exists(public_path($property->pdf_file))) { unlink(public_path($property->pdf_file)); } } $propertyAminities = PropertyAminity::where('property_id', $id)->get(); foreach($propertyAminities as $propertyAminity){ $propertyAminity->delete(); } $propertyNearestLocations = PropertyNearestLocation::where('property_id', $id)->get(); foreach($propertyNearestLocations as $propertyNearestLocation){ $propertyNearestLocation->delete(); } $propertyImages = PropertyImage::where('property_id', $id)->get(); foreach($propertyImages as $propertyImage){ if ($propertyImage->image) { if (File::exists(public_path($propertyImage->image))) { unlink(public_path($propertyImage->image)); } } $propertyImage->delete(); } $reviews = PropertyReview::where('property_id',$id)->get(); foreach($reviews as $review){ $review->delete(); } $wishlists = WishList::where('property_id',$id)->get(); foreach($wishlists as $wishlist){ $wishlist->delete(); } $property->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.property.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('property.update'); $property = Property::find($id); $status = $property->status == 1 ? 0 : 1; $property->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } public function property_slider($property_id){ checkAdminHasPermissionAndThrowException('property.slider'); $property = Property::findOrFail($property_id); $slider_images = PropertyImage::where(['property_id' => $property_id])->latest()->get(); return view('property::admin.property.slider', compact('property','slider_images')); } public function upload_property_slider(Request $request,$property_id){ checkAdminHasPermissionAndThrowException('property.slider.upload'); foreach ($request->file as $index => $image) { $slider_image = new PropertyImage(); $slider_image->property_id = $property_id; $file_name = file_upload($image, 'uploads/custom-images/', $oldFile = null); $slider_image->image = $file_name; $slider_image->save(); } if ($slider_image) { return response()->json([ 'message' => trans('Images Saved Successfully'), 'url' => route('admin.property-slider', $property_id), ]); } else { return $this->redirectWithMessage(RedirectType::ERROR->value); } } public function delete_property_slider($id){ checkAdminHasPermissionAndThrowException('property.slider.delete'); $sliderImage = PropertyImage::findOrFail($id); if ($sliderImage->image) { if (@File::exists(public_path($sliderImage->image))) { @unlink(public_path($sliderImage->image)); } } $sliderImage->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value); } public function nearest_location($property_id){ checkAdminHasPermissionAndThrowException('property.nearest.location'); $property = Property::findOrFail($property_id); $locations = NearestLocation::get(); $nearest_locations = PropertyNearestLocation::where(['property_id' => $property_id])->latest()->get(); return view('property::admin.property.nearestlocation', compact('property','nearest_locations','locations')); } public function upload_nearest_location(Request $request,$property_id){ checkAdminHasPermissionAndThrowException('property.nearest.location.upload'); $rules = [ 'nearest_place_id' => 'required', 'distance' => 'required', ]; $customMessages = [ 'nearest_place_id.required' => __('Nearest location is required'), 'distance.required' => __('Distance is required'), ]; $this->validate($request, $rules, $customMessages); $nearest_location = new PropertyNearestLocation(); $nearest_location->property_id = $property_id; $nearest_location->nearest_place_id = $request->nearest_place_id; $nearest_location->distance = $request->distance; $nearest_location->save(); return $this->redirectWithMessage(RedirectType::CREATE->value); } public function delete_nearest_location($id){ checkAdminHasPermissionAndThrowException('property.nearest.location.delete'); $nearestLocation = PropertyNearestLocation::findOrFail($id); $nearestLocation->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value); } public function downloadPropertyFile(Request $request){ $property = Property::findOrFail($request->id); $filepath = $property->pdf_file; // Check if the file exists if (file_exists($filepath)) { return response()->download($filepath); } $notification = trans('File not found.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } public function deletePdfFile($id){ $property=Property::find($id); $old_file= $property->pdf_file; $property->pdf_file=null; $property->save(); if(File::exists(public_path().'/'.$old_file)) unlink(public_path().'/'.$old_file); $notification=trans('Deleted successfully'); return response()->json(['success'=>$notification]); } } app/Http/Controllers/Admin/NearestLocationController.php 0000644 00000012265 15012234214 0017450 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\Admin; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Http\RedirectResponse; use Modules\Language\app\Models\Language; use Modules\Property\app\Models\NearestLocation; use Modules\Language\app\Enums\TranslationModels; use Modules\Language\app\Traits\GenerateTranslationTrait; use Modules\Property\app\Http\Requests\NearestLocationRequest; class NearestLocationController extends Controller { use GenerateTranslationTrait, RedirectHelperTrait; public function index(Request $request) { checkAdminHasPermissionAndThrowException('nearest.location.view'); $query = NearestLocation::query(); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('status'), function ($q) use ($request) { $q->where('status', $request->status); }); $orderBy = $request->filled( 'order_by' ) && $request->order_by == 1 ? 'asc' : 'desc'; if ($request->filled('par-page')) { $nearestLocations = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $nearestLocations = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('property::admin.nearestlocation.index', ['nearestLocations' => $nearestLocations]); } public function create() { checkAdminHasPermissionAndThrowException('nearest.location.create'); return view('property::admin.nearestlocation.create'); } public function store(NearestLocationRequest $request): RedirectResponse { checkAdminHasPermissionAndThrowException('nearest.location.store'); $nearestLocation = NearestLocation::create($request->validated()); $languages = Language::all(); $this->generateTranslations( TranslationModels::NearestLocation, $nearestLocation, 'location_id', $request, ); return $this->redirectWithMessage(RedirectType::CREATE->value, 'admin.nearest-location.edit', ['nearest_location' => $nearestLocation->id, 'code' => $languages->first()->code]); } /** * Show the specified resource. */ public function show($id) { checkAdminHasPermissionAndThrowException('nearest.location.view'); return view('property::admin.nearestlocation.show'); } /** * Show the form for editing the specified resource. */ public function edit($id) { checkAdminHasPermissionAndThrowException('nearest.location.edit'); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $nearestLocation = NearestLocation::findOrFail($id); $languages = allLanguages(); return view('property::admin.nearestlocation.edit', compact('nearestLocation', 'code', 'languages')); } public function update(NearestLocationRequest $request, NearestLocation $nearestLocation) { checkAdminHasPermissionAndThrowException('nearest.location.update'); $validatedData = $request->validated(); $nearestLocation->update($validatedData); $this->updateTranslations( $nearestLocation, $request, $validatedData, ); return $this->redirectWithMessage(RedirectType::UPDATE->value, 'admin.nearest-location.edit', ['nearest_location' => $nearestLocation->id, 'code' => $request->code]); } /** * Remove the specified resource from storage. */ public function destroy(NearestLocation $nearestLocation) { checkAdminHasPermissionAndThrowException('nearest.location.delete'); if ($nearestLocation->locations()->count() > 0) { $notification = trans('You can not delete this location there are multiple property exist under this location.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } $nearestLocation->translations()->each(function ($translation) { $translation->delete(); }); $nearestLocation->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.nearest-location.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('nearest.location.update'); $nearestLocation = NearestLocation::find($id); $status = $nearestLocation->status == 1 ? 0 : 1; $nearestLocation->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Controllers/Admin/AminityController.php 0000644 00000011670 15012234214 0015767 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\Admin; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Http\RedirectResponse; use Modules\Property\app\Models\Aminity; use Modules\Language\app\Models\Language; use Modules\Language\app\Enums\TranslationModels; use Modules\Property\app\Http\Requests\AminityRequest; use Modules\Language\app\Traits\GenerateTranslationTrait; class AminityController extends Controller { use GenerateTranslationTrait, RedirectHelperTrait; public function index(Request $request) { checkAdminHasPermissionAndThrowException('property.amenity.view'); $query = Aminity::query(); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('status'), function ($q) use ($request) { $q->where('status', $request->status); }); $orderBy = $request->filled( 'order_by' ) && $request->order_by == 1 ? 'asc' : 'desc'; if ($request->filled('par-page')) { $aminities = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $aminities = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('property::admin.aminity.index', ['aminities' => $aminities]); } public function create() { checkAdminHasPermissionAndThrowException('property.amenity.create'); return view('property::admin.aminity.create'); } public function store(AminityRequest $request): RedirectResponse { checkAdminHasPermissionAndThrowException('property.amenity.store'); $aminity = Aminity::create($request->validated()); $languages = Language::all(); $this->generateTranslations( TranslationModels::Aminity, $aminity, 'aminity_id', $request, ); return $this->redirectWithMessage(RedirectType::CREATE->value, 'admin.amenity.edit', ['amenity' => $aminity->id, 'code' => $languages->first()->code]); } /** * Show the specified resource. */ public function show($id) { checkAdminHasPermissionAndThrowException('property.amenity.view'); return view('property::admin.aminity.show'); } /** * Show the form for editing the specified resource. */ public function edit($id) { checkAdminHasPermissionAndThrowException('property.amenity.edit'); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $aminity = Aminity::findOrFail($id); $languages = allLanguages(); return view('property::admin.aminity.edit', compact('aminity', 'code', 'languages')); } public function update(AminityRequest $request, $id) { checkAdminHasPermissionAndThrowException('property.amenity.update'); $validatedData = $request->validated(); $aminity = Aminity::findOrFail($id); $aminity->update($validatedData); $this->updateTranslations( $aminity, $request, $validatedData, ); return $this->redirectWithMessage(RedirectType::UPDATE->value, 'admin.amenity.edit', ['amenity' => $aminity->id, 'code' => $request->code]); } /** * Remove the specified resource from storage. */ public function destroy($id) { checkAdminHasPermissionAndThrowException('property.amenity.delete'); $aminity = Aminity::findOrFail($id); if ($aminity->propertyAminities()->count() > 0) { $notification = trans('You can not delete this aminity there are multiple property exist under this aminity.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } $aminity->translations()->each(function ($translation) { $translation->delete(); }); $aminity->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.amenity.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('property.amenity.update'); $aminity = Aminity::find($id); $status = $aminity->status == 1 ? 0 : 1; $aminity->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Controllers/Admin/PropertyTypeController.php 0000644 00000014102 15012234214 0017034 0 ustar 00 <?php namespace Modules\Property\app\Http\Controllers\Admin; use App\Enums\RedirectType; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Http\RedirectResponse; use Modules\Language\app\Models\Language; use Modules\Property\app\Models\PropertyType; use Modules\Language\app\Enums\TranslationModels; use Modules\Language\app\Traits\GenerateTranslationTrait; use Modules\Property\app\Http\Requests\PropertyTypeRequest; use File; class PropertyTypeController extends Controller { use GenerateTranslationTrait, RedirectHelperTrait; public function index(Request $request) { checkAdminHasPermissionAndThrowException('property.type.view'); Paginator::useBootstrap(); $query = PropertyType::query(); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('show_home1'), function ($q) use ($request) { $q->where('show_home1', $request->show_homepage); }); $query->when($request->filled('show_home2'), function ($q) use ($request) { $q->where('show_home2', $request->show_homepage); }); $query->when($request->filled('status'), function ($q) use ($request) { $q->where('status', $request->status); }); $orderBy = $request->filled( 'order_by' ) && $request->order_by == 1 ? 'asc' : 'desc'; if ($request->filled('par-page')) { $propertyTypes = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $propertyTypes = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('property::admin.propertytype.index', ['propertyTypes' => $propertyTypes]); } public function create() { checkAdminHasPermissionAndThrowException('property.type.create'); return view('property::admin.propertytype.create'); } public function store(PropertyTypeRequest $request): RedirectResponse { checkAdminHasPermissionAndThrowException('property.type.store'); $propertyType = PropertyType::create($request->validated()); if ($propertyType && $request->hasFile('image')) { $file_name = file_upload($request->image, 'uploads/custom-images/', $propertyType->image); $propertyType->image = $file_name; $propertyType->save(); } $languages = Language::all(); $this->generateTranslations( TranslationModels::PropertyType, $propertyType, 'property_type_id', $request, ); return $this->redirectWithMessage(RedirectType::CREATE->value, 'admin.property-type.edit', ['property_type' => $propertyType->id, 'code' => $languages->first()->code]); } /** * Show the specified resource. */ public function show($id) { checkAdminHasPermissionAndThrowException('property.type.view'); return view('property::admin.propertytype.show'); } /** * Show the form for editing the specified resource. */ public function edit($id) { checkAdminHasPermissionAndThrowException('property.type.edit'); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $propertyType = PropertyType::findOrFail($id); $languages = allLanguages(); return view('property::admin.propertytype.edit', compact('propertyType', 'code', 'languages')); } public function update(PropertyTypeRequest $request, PropertyType $propertyType) { checkAdminHasPermissionAndThrowException('property.type.update'); $validatedData = $request->validated(); if ($propertyType && $request->hasFile('image')) { $file_name = file_upload($request->image, 'uploads/custom-images/', $oldFile = $propertyType->image); $validatedData['image'] = $file_name; } $propertyType->update($validatedData); $this->updateTranslations( $propertyType, $request, $validatedData, ); return $this->redirectWithMessage(RedirectType::UPDATE->value, 'admin.property-type.edit', ['property_type' => $propertyType->id, 'code' => $request->code]); } /** * Remove the specified resource from storage. */ public function destroy(PropertyType $propertyType) { checkAdminHasPermissionAndThrowException('property.type.delete'); if ($propertyType->properties()->count() > 0) { $notification = trans('You can not delete this property type there are multiple property exist under this property type.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } $propertyType->translations()->each(function ($translation) { $translation->delete(); }); if ($propertyType->image) { if (File::exists(public_path($propertyType->image))) { unlink(public_path($propertyType->image)); } } $propertyType->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.property-type.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('property.type.update'); $propertyType = PropertyType::find($id); $status = $propertyType->status == 1 ? 0 : 1; $propertyType->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Requests/.gitkeep 0000644 00000000000 15012234214 0011467 0 ustar 00 app/Http/Requests/AminityRequest.php 0000644 00000002241 15012234214 0013543 0 ustar 00 <?php namespace Modules\Property\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Auth; class AminityRequest extends FormRequest { public function authorize(): bool { return Auth::guard('admin')->check() ? true : false; } public function rules(): array { $rules = [ 'title' => 'required|string|max:255', ]; if ($this->isMethod('put')) { $rules['code'] = 'required|string'; $rules['slug'] = 'sometimes|required|string|max:255|unique:aminities,slug,'. $this->amenity; } if ($this->isMethod('post')) { $rules['slug'] = 'required|string|max:255|unique:aminities,slug'; } return $rules; } public function messages(): array { return [ 'title.required' => __('Title is required.'), 'title.max' => __('Title must be string with a maximum length of 255 characters.'), 'slug.required' => __('Slug is required.'), 'slug.unique' => __('Slug already exist.'), 'slug.max' => __('Slug must be string with a maximum length of 255 characters.'), ]; } } app/Http/Requests/PropertyPurposeRequest.php 0000644 00000001335 15012234214 0015336 0 ustar 00 <?php namespace Modules\Property\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Auth; class PropertyPurposeRequest extends FormRequest { /** * Get the validation rules that apply to the request. */ public function authorize(): bool { return Auth::guard('admin')->check() ? true : false; } public function rules(): array { $rules = [ 'title' => 'required|string|max:255', ]; return $rules; } public function messages(): array { return [ 'title.required' => __('Title is required.'), 'title.max' => __('Title must be string with a maximum length of 255 characters.'), ]; } } app/Http/Requests/PropertyTypeRequest.php 0000644 00000003427 15012234214 0014626 0 ustar 00 <?php namespace Modules\Property\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Auth; class PropertyTypeRequest extends FormRequest { public function authorize(): bool { return Auth::guard('admin')->check() ? true : false; } public function rules(): array { $languages = allLanguages(); $rules = [ 'title' => 'required|string|max:255', 'show_home1' => 'nullable', 'show_home2' => 'nullable', ]; if ($this->isMethod('put')) { $rules['slug'] = $this->code == $languages->first()->code ? 'required|string|max:255|unique:property_types,slug,'.$this->property_type->id : ''; $rules['code'] = 'required|string'; $rules['image'] = 'image|max:2048'; $rules['status'] = $this->code == $languages->first()->code ? 'required':''; } if ($this->isMethod('post')) { $rules['slug'] = 'required|string|max:255|unique:property_types,slug'; $rules['image'] = 'required|image|max:2048'; $rules['status'] = 'required'; } return $rules; } public function messages(): array { return [ 'title.required' => __('Title is required.'), 'title.max' => __('Title must be string with a maximum length of 255 characters.'), 'slug.required' => __('Slug is required.'), 'slug.unique' => __('Slug already exist.'), 'slug.max' => __('Slug must be string with a maximum length of 255 characters.'), 'image.required' => trans('Image is required'), 'image.image' => trans('Image must be a valid image file'), 'image.max' => trans('Image can only be up to 2 megabytes in size'), ]; } } app/Http/Requests/PropertyRequest.php 0000644 00000012772 15012234214 0013767 0 ustar 00 <?php namespace Modules\Property\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Auth; class PropertyRequest extends FormRequest { public function authorize(): bool { return Auth::guard('admin')->check() || Auth::guard('web')->check() ? true : false; } public function rules(): array { $languages = allLanguages(); $rules = [ 'title'=>'required|string|max:255', 'address'=>'required', 'phone'=>'nullable', 'google_map_embed_code' => 'nullable', 'description'=>'required', 'seo_title' => 'nullable', 'seo_description' => 'nullable', 'video_link' => 'nullable', 'website' => 'nullable', 'top_property' => 'nullable', 'urgent_property' => 'nullable', 'is_featured' => 'nullable', 'aminities' => 'nullable', 'number_of_parking' => 'nullable', 'number_of_kitchen' => 'nullable', ]; if ($this->isMethod('put')) { $rules['slug'] = 'string|unique:properties,slug,'.$this->property; $rules['banner_image'] = 'image|max:2048'; $rules['thumbnail_image'] = 'image|max:2048'; $rules['property_type_id']= $this->code == $languages->first()->code ? 'required':''; $rules['city_id']= $this->code == $languages->first()->code ? 'required':''; $rules['email']= $this->code == $languages->first()->code ? 'required|email':''; $rules['property_purpose_id']= $this->code == $languages->first()->code ? 'required':''; $rules['price']= $this->code == $languages->first()->code ? 'required|numeric':''; $rules['area']= $this->code == $languages->first()->code ? 'required':''; $rules['number_of_unit']= $this->code == $languages->first()->code ? 'required':''; $rules['number_of_room']= $this->code == $languages->first()->code ? 'required':''; $rules['number_of_bedroom']= $this->code == $languages->first()->code ? 'required':''; $rules['number_of_bathroom']= $this->code == $languages->first()->code ? 'required':''; $rules['number_of_floor']= $this->code == $languages->first()->code ? 'required':''; $rules['status']= 'nullable'; $rules['pdf_file'] = $this->code == $languages->first()->code ? 'mimes:pdf|max:10000':''; $rules['period'] = $this->code == $languages->first()->code && $this->property_purpose_id == 2 ? 'required':'nullable'; } if ($this->isMethod('post')) { $rules['slug'] = 'required|unique:properties,slug'; $rules['banner_image'] = 'required|image|max:2048'; $rules['thumbnail_image'] = 'required|image|max:2048'; $rules['property_type_id']= 'required'; $rules['city_id'] = 'required'; $rules['email'] = 'required|email'; $rules['property_purpose_id'] = 'required'; $rules['price'] = 'required|numeric'; $rules['area'] = 'required'; $rules['number_of_unit'] = 'required'; $rules['number_of_room'] = 'required'; $rules['number_of_bedroom'] = 'required'; $rules['number_of_bathroom'] = 'required'; $rules['number_of_floor'] = 'required'; $rules['status']= 'nullable'; $rules['pdf_file'] = 'mimes:pdf|max:10000'; $rules['period'] = $this->property_purpose_id == 2 ? 'required':'nullable'; } return $rules; } public function messages(): array { return [ 'title.required' => __('Title is required.'), 'title.max' => __('Title must be string with a maximum length of 255 characters.'), 'slug.required' => __('Slug is required.'), 'slug.unique' => __('Slug already exist.'), 'property_type_id.required' => trans('Property type field is required'), 'city_id.required' => trans('City field is required'), 'address.required' => trans('Address field is required'), 'email.required' => trans('Email field is required'), 'property_purpose_id.required' => trans('Purpose field is required'), 'price.required' => trans('Price field is required'), 'area.required' => trans('Area field is required'), 'number_of_unit.required' => trans('Unit field is required'), 'number_of_room.required' => trans('Room field is required'), 'number_of_bedroom.required' => trans('Bedroom field is required'), 'number_of_floor.required' => trans('Floor field is required'), 'number_of_kitchen.required' => trans('Kitchen field is required'), 'description.required' => trans('Description field is required'), 'banner_image.required' => trans('Banner image is required'), 'banner_image.image' => trans('Banner image must be a valid image file'), 'banner_image.max' => trans('Banner image can only be up to 2 megabytes in size'), 'thumbnail_image.required' => trans('Thumbnail image is required'), 'thumbnail_image.image' => trans('Thumbnail image must be a valid image file'), 'thumbnail_image.max' => trans('Thumbnail image can only be up to 2 megabytes in size'), 'number_of_bathroom.required' => trans('Bathroom field is required'), 'number_of_parking.required' => trans('Parking place field is required'), ]; } } app/Http/Requests/NearestLocationRequest.php 0000644 00000002421 15012234214 0015223 0 ustar 00 <?php namespace Modules\Property\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Auth; class NearestLocationRequest extends FormRequest { /** * Get the validation rules that apply to the request. */ public function authorize(): bool { return Auth::guard('admin')->check() ? true : false; } public function rules(): array { $rules = [ 'title' => 'required|string|max:255', ]; if ($this->isMethod('put')) { $rules['code'] = 'required|string'; $rules['slug'] = 'sometimes|required|string|max:255|unique:nearest_locations,slug,'. $this->nearest_location->id; } if ($this->isMethod('post')) { $rules['slug'] = 'required|string|max:255|unique:nearest_locations,slug'; } return $rules; } public function messages(): array { return [ 'title.required' => __('Title is required.'), 'title.max' => __('Title must be string with a maximum length of 255 characters.'), 'slug.required' => __('Slug is required.'), 'slug.unique' => __('Slug already exist.'), 'slug.max' => __('Slug must be string with a maximum length of 255 characters.'), ]; } } app/Http/Middleware/.gitkeep 0000644 00000000000 15012234214 0011731 0 ustar 00 app/Models/PropertyImage.php 0000644 00000000746 15012234214 0012050 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyImageFactory; class PropertyImage extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = []; protected static function newFactory(): PropertyImageFactory { //return PropertyImageFactory::new(); } } app/Models/Property.php 0000644 00000007773 15012234214 0011114 0 ustar 00 <?php namespace Modules\Property\app\Models; use App\Models\User; use App\Models\Admin; use App\Models\WishList; use Illuminate\Support\Facades\Auth; use Modules\Location\app\Models\City; use Illuminate\Database\Eloquent\Model; use Modules\Property\app\Models\Aminity; use Modules\Property\app\Models\PropertyType; use Modules\Property\app\Models\NearestLocation; use Modules\Property\app\Models\PropertyPurpose; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\app\Models\PropertyNearestLocation; use Modules\Property\Database\factories\PropertyFactory; class Property extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = [ 'user_type', 'admin_id', 'user_id', 'property_type_id', 'city_id', 'listing_package_id', 'property_purpose_id', 'slug', 'views', 'phone', 'email', 'website', 'short_description', 'pdf_file', 'thumbnail_image', 'banner_image', 'number_of_unit', 'number_of_room', 'number_of_bedroom', 'number_of_bathroom', 'number_of_floor', 'number_of_kitchen', 'number_of_parking', 'area', 'price', 'period', 'video_link', 'is_featured', 'verified', 'status', 'seo_title', 'seo_description', 'is_popular', 'google_map_embed_code', 'urgent_property', 'top_property', 'expired_date', 'property_search_id', ]; protected static function newFactory(): PropertyFactory { //return PropertyFactory::new(); } public function getTitleAttribute(): ?string { return $this->translation->title; } public function translation(): ?HasOne { return $this->hasOne(PropertyTranslation::class)->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?PropertyTranslation { return $this->hasOne(PropertyTranslation::class)->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(PropertyTranslation::class, 'property_id'); } public function propertyType(){ return $this->belongsTo(PropertyType::class)->with('translation'); } public function propertyPurpose(){ return $this->belongsTo(PropertyPurpose::class)->with('translation'); } public function propertyAminities(){ return $this->hasMany(Aminity::class, 'id'); } public function propertyImages(){ return $this->hasMany(PropertyImage::class); } public function propertyNearestLocations(){ return $this->hasMany(PropertyNearestLocation::class)->with('nearestLocation'); } public function city(){ return $this->belongsTo(City::class); } public function admin(){ return $this->belongsTo(Admin::class); } public function user(){ return $this->belongsTo(User::class); } public function reviews(){ return $this->hasMany(PropertyReview::class); } public function wishlist(): ?HasOne { $user=Auth::guard('web')->user(); if(Auth::guard('web')->check()){ return $this->hasOne(WishList::class, 'property_id')->where(['user_id' => $user->id]); }else{ return $this->hasOne(WishList::class, 'property_id'); } } public function getThumbnailImageUrlAttribute(): ?string { if($this->thumbnail_image){ return asset($this->thumbnail_image); } return asset('backend/img/no-image.png'); } public function getBannerImageUrlAttribute(): ?string { if($this->banner_image){ return asset($this->banner_image); } return asset('backend/img/no-image.png'); } } app/Models/PropertyPurposeTranslation.php 0000644 00000001041 15012234214 0014667 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyPurposeTranslationFactory; class PropertyPurposeTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['title']; protected static function newFactory(): PropertyPurposeTranslationFactory { //return PropertyPurposeTranslationFactory::new(); } } app/Models/PropertyAminity.php 0000644 00000000756 15012234214 0012441 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyAminityFactory; class PropertyAminity extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = []; protected static function newFactory(): PropertyAminityFactory { //return PropertyAminityFactory::new(); } } app/Models/AminityTranslation.php 0000644 00000001001 15012234214 0013073 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\AminityTranslationFactory; class AminityTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['title']; protected static function newFactory(): AminityTranslationFactory { //return AminityTranslationFactory::new(); } } app/Models/PropertyType.php 0000644 00000002712 15012234214 0011742 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyTypeFactory; class PropertyType extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['slug','image','show_home1','show_home2','status']; protected static function newFactory(): PropertyTypeFactory { //return PropertyTypeFactory::new(); } public function getTitleAttribute(): ?string { return $this->translation->title; } public function translation(): ?HasOne { return $this->hasOne(PropertyTypeTranslation::class, 'property_type_id')->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?PropertyTypeTranslation { return $this->hasOne(PropertyTypeTranslation::class, 'property_type_id')->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(PropertyTypeTranslation::class, 'property_type_id'); } public function properties(){ $currentDate = date('Y-m-d'); return $this->hasMany(Property::class, 'property_type_id')->whereRaw("STR_TO_DATE(expired_date, '%Y-%m-%d') >= ?", [$currentDate]); } } app/Models/.gitkeep 0000644 00000000000 15012234214 0010160 0 ustar 00 app/Models/NearestLocation.php 0000644 00000002514 15012234214 0012346 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\NearestLocationFactory; class NearestLocation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['slug','status']; protected static function newFactory(): NearestLocationFactory { //return NearestLocationFactory::new(); } public function getTitleAttribute(): ?string { return $this->translation->title; } public function translation(): ?HasOne { return $this->hasOne(NearestLocationTranslation::class, 'location_id')->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?NearestLocationTranslation { return $this->hasOne(NearestLocationTranslation::class, 'location_id')->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(NearestLocationTranslation::class, 'location_id'); } public function locations(){ return $this->hasMany(PropertyNearestLocation::class, 'nearest_place_id'); } } app/Models/PropertyTranslation.php 0000644 00000001035 15012234214 0013314 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyTranslationFactory; class PropertyTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['title','address','description']; protected static function newFactory(): PropertyTranslationFactory { //return PropertyTranslationFactory::new(); } } app/Models/NearestLocationTranslation.php 0000644 00000001041 15012234214 0014557 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\NearestLocationTranslationFactory; class NearestLocationTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['title']; protected static function newFactory(): NearestLocationTranslationFactory { //return NearestLocationTranslationFactory::new(); } } app/Models/PropertyReview.php 0000644 00000001504 15012234214 0012260 0 ustar 00 <?php namespace Modules\Property\app\Models; use App\Models\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyReviewFactory; class PropertyReview extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['user_id','property_id','comment','service_rating','location_rating','money_rating','clean_rating','avarage_rating','status']; protected static function newFactory(): PropertyReviewFactory { //return PropertyReviewFactory::new(); } public function user() { return $this->belongsTo(User::class); } public function property() { return $this->belongsTo(Property::class)->with('translation'); } } app/Models/PropertyNearestLocation.php 0000644 00000001236 15012234214 0014113 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyNearestLocationFactory; class PropertyNearestLocation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = []; protected static function newFactory(): PropertyNearestLocationFactory { //return PropertyNearestLocationFactory::new(); } public function nearestLocation(){ return $this->belongsTo(NearestLocation::class, 'nearest_place_id')->with('translation'); } } app/Models/PropertyTypeTranslation.php 0000644 00000001025 15012234214 0014155 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyTypeTranslationFactory; class PropertyTypeTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['title']; protected static function newFactory(): PropertyTypeTranslationFactory { //return PropertyTypeTranslationFactory::new(); } } app/Models/Aminity.php 0000644 00000002435 15012234214 0010670 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\AminityFactory; class Aminity extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['slug', 'status']; protected static function newFactory(): AminityFactory { //return AminityFactory::new(); } // make a accessor for translation public function getTitleAttribute(): ?string { return $this->translation->title; } public function translation(): ?HasOne { return $this->hasOne(AminityTranslation::class, 'aminity_id')->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?AminityTranslation { return $this->hasOne(AminityTranslation::class, 'aminity_id')->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(AminityTranslation::class, 'aminity_id'); } public function propertyAminities(){ return $this->hasMany(PropertyAminity::class); } } app/Models/PropertyPurpose.php 0000644 00000002342 15012234214 0012455 0 ustar 00 <?php namespace Modules\Property\app\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Property\Database\factories\PropertyPurposeFactory; class PropertyPurpose extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = ['status']; protected static function newFactory(): PropertyPurposeFactory { //return PropertyPurposeFactory::new(); } public function getTitleAttribute(): ?string { return $this->translation->title; } public function translation(): ?HasOne { return $this->hasOne(PropertyPurposeTranslation::class, 'property_purpose_id')->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?PropertyPurposeTranslation { return $this->hasOne(PropertyPurposeTranslation::class, 'property_purpose_id')->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(PropertyPurposeTranslation::class, 'property_purpose_id'); } } app/Providers/RouteServiceProvider.php 0000644 00000002667 15012234214 0014151 0 ustar 00 <?php namespace Modules\Property\app\Providers; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider { /** * The module namespace to assume when generating URLs to actions. */ protected string $moduleNamespace = 'Modules\Property\app\Http\Controllers'; /** * Called before routes are registered. * * Register any model bindings or pattern based filters. */ public function boot(): void { parent::boot(); } /** * Define the routes for the application. */ public function map(): void { $this->mapApiRoutes(); $this->mapWebRoutes(); } /** * Define the "web" routes for the application. * * These routes all receive session state, CSRF protection, etc. */ protected function mapWebRoutes(): void { Route::middleware('web') ->namespace($this->moduleNamespace) ->group(module_path('Property', '/routes/web.php')); } /** * Define the "api" routes for the application. * * These routes are typically stateless. */ protected function mapApiRoutes(): void { Route::prefix('api') ->middleware('api') ->namespace($this->moduleNamespace) ->group(module_path('Property', '/routes/api.php')); } } app/Providers/.gitkeep 0000644 00000000000 15012234214 0010712 0 ustar 00 app/Providers/PropertyServiceProvider.php 0000644 00000006446 15012234214 0014676 0 ustar 00 <?php namespace Modules\Property\app\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class PropertyServiceProvider extends ServiceProvider { protected string $moduleName = 'Property'; protected string $moduleNameLower = 'property'; /** * Boot the application events. */ public function boot(): void { $this->registerCommands(); $this->registerCommandSchedules(); $this->registerTranslations(); $this->registerConfig(); $this->registerViews(); $this->loadMigrationsFrom(module_path($this->moduleName, 'database/migrations')); } /** * Register the service provider. */ public function register(): void { $this->app->register(RouteServiceProvider::class); } /** * Register commands in the format of Command::class */ protected function registerCommands(): void { // $this->commands([]); } /** * Register command Schedules. */ protected function registerCommandSchedules(): void { // $this->app->booted(function () { // $schedule = $this->app->make(Schedule::class); // $schedule->command('inspire')->hourly(); // }); } /** * Register translations. */ public function registerTranslations(): void { $langPath = resource_path('lang/modules/'.$this->moduleNameLower); if (is_dir($langPath)) { $this->loadTranslationsFrom($langPath, $this->moduleNameLower); $this->loadJsonTranslationsFrom($langPath); } else { $this->loadTranslationsFrom(module_path($this->moduleName, 'lang'), $this->moduleNameLower); $this->loadJsonTranslationsFrom(module_path($this->moduleName, 'lang')); } } /** * Register config. */ protected function registerConfig(): void { $this->publishes([module_path($this->moduleName, 'config/config.php') => config_path($this->moduleNameLower.'.php')], 'config'); $this->mergeConfigFrom(module_path($this->moduleName, 'config/config.php'), $this->moduleNameLower); } /** * Register views. */ public function registerViews(): void { $viewPath = resource_path('views/modules/'.$this->moduleNameLower); $sourcePath = module_path($this->moduleName, 'resources/views'); $this->publishes([$sourcePath => $viewPath], ['views', $this->moduleNameLower.'-module-views']); $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); $componentNamespace = str_replace('/', '\\', config('modules.namespace').'\\'.$this->moduleName.'\\'.config('modules.paths.generator.component-class.path')); Blade::componentNamespace($componentNamespace, $this->moduleNameLower); } /** * Get the services provided by the provider. */ public function provides(): array { return []; } private function getPublishableViewPaths(): array { $paths = []; foreach (config('view.paths') as $path) { if (is_dir($path.'/modules/'.$this->moduleNameLower)) { $paths[] = $path.'/modules/'.$this->moduleNameLower; } } return $paths; } } app/Providers/error_log 0000644 00000001320 15012234214 0011204 0 ustar 00 [16-May-2025 12:15:46 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Foundation\Support\Providers\RouteServiceProvider" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/app/Providers/RouteServiceProvider.php:8 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/app/Providers/RouteServiceProvider.php on line 8 [16-May-2025 12:29:38 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Support\ServiceProvider" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/app/Providers/PropertyServiceProvider.php:8 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/app/Providers/PropertyServiceProvider.php on line 8 database/factories/.gitkeep 0000644 00000000000 15012234214 0011700 0 ustar 00 database/migrations/2024_07_26_060526_create_property_types_table.php 0000644 00000001456 15012234214 0021105 0 ustar 00 <?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::create('property_types', function (Blueprint $table) { $table->id(); $table->string('slug')->nullable(); $table->string('image')->nullable(); $table->boolean('show_home1')->default(false); $table->boolean('show_home2')->default(false); $table->boolean('status')->default(true); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_types'); } }; database/migrations/2024_07_27_113808_create_property_images_table.php 0000644 00000001200 15012234214 0021174 0 ustar 00 <?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::create('property_images', function (Blueprint $table) { $table->id(); $table->integer('property_id'); $table->string('image')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_images'); } }; database/migrations/2024_07_26_045922_create_nearest_location_translations_table.php 0000644 00000001305 15012234214 0024123 0 ustar 00 <?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::create('nearest_location_translations', function (Blueprint $table) { $table->id(); $table->integer('location_id'); $table->string('lang_code'); $table->string('title')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('nearest_location_translations'); } }; database/migrations/.gitkeep 0000644 00000000000 15012234214 0012075 0 ustar 00 database/migrations/2024_07_26_045840_create_nearest_locations_table.php 0000644 00000001215 15012234214 0021504 0 ustar 00 <?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::create('nearest_locations', function (Blueprint $table) { $table->id(); $table->string('slug')->nullable(); $table->boolean('status')->default(true); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('nearest_locations'); } }; database/migrations/2024_07_27_104545_create_property_aminities_table.php 0000644 00000001266 15012234214 0021723 0 ustar 00 <?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::create('property_aminities', function (Blueprint $table) { $table->id(); $table->integer('property_id'); $table->integer('aminity_id'); $table->boolean('status')->default(true); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_aminities'); } }; database/migrations/2024_07_27_051058_create_properties_table.php 0000644 00000005124 15012234214 0020166 0 ustar 00 <?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::create('properties', function (Blueprint $table) { $table->id(); $table->integer('user_type')->default(1); $table->integer('admin_id')->default(0); $table->integer('user_id')->default(0); $table->integer('property_type_id')->default(0); $table->string('property_search_id')->nullable(); $table->integer('city_id')->default(0); $table->integer('listing_package_id')->default(0); $table->integer('property_purpose_id')->default(0); $table->text('slug'); $table->integer('views')->default(0); $table->text('phone')->nullable(); $table->text('email')->nullable(); $table->text('website')->nullable(); $table->text('short_description'); $table->text('pdf_file')->nullable(); $table->text('thumbnail_image')->nullable(); $table->text('banner_image')->nullable(); $table->integer('number_of_unit')->nullable(); $table->integer('number_of_room')->nullable(); $table->integer('number_of_bedroom')->nullable(); $table->integer('number_of_bathroom')->nullable(); $table->integer('number_of_floor')->nullable(); $table->integer('number_of_kitchen')->nullable(); $table->integer('number_of_parking')->nullable(); $table->double('area')->nullable(); $table->double('price')->nullable(); $table->text('period')->nullable(); $table->text('video_link')->nullable(); $table->tinyInteger('is_featured')->default(0); $table->tinyInteger('verified')->default(0); $table->tinyInteger('status')->default(0); $table->text('seo_title')->nullable(); $table->text('seo_description')->nullable(); $table->tinyInteger('is_popular')->nullable(); $table->longText('google_map_embed_code')->nullable(); $table->tinyInteger('urgent_property')->default(0); $table->tinyInteger('top_property')->default(0); $table->string('expired_date')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('properties'); } }; database/migrations/2024_07_26_081134_create_property_purposes_table.php 0000644 00000001300 15012234214 0021603 0 ustar 00 <?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::create('property_purposes', function (Blueprint $table) { $table->id(); $table->string('purpose')->nullable(); $table->string('slug')->nullable(); $table->boolean('status')->default(true); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_purposes'); } }; database/migrations/error_log 0000644 00000010170 15012234214 0012372 0 ustar 00 [16-May-2025 08:01:00 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_034029_create_aminities_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_034029_create_aminities_table.php on line 7 [16-May-2025 08:15:30 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_08_04_033508_create_property_reviews_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_08_04_033508_create_property_reviews_table.php on line 7 [16-May-2025 08:34:41 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_045922_create_nearest_location_translations_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_045922_create_nearest_location_translations_table.php on line 7 [16-May-2025 08:47:31 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_034114_create_aminity_translations_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_034114_create_aminity_translations_table.php on line 7 [16-May-2025 08:53:22 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_045840_create_nearest_locations_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_045840_create_nearest_locations_table.php on line 7 [16-May-2025 08:55:54 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_081134_create_property_purposes_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_26_081134_create_property_purposes_table.php on line 7 [16-May-2025 09:08:39 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_113808_create_property_images_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_113808_create_property_images_table.php on line 7 [16-May-2025 09:45:38 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_121140_create_property_nearest_locations_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_121140_create_property_nearest_locations_table.php on line 7 [16-May-2025 10:02:11 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_104545_create_property_aminities_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_104545_create_property_aminities_table.php on line 7 [16-May-2025 10:13:57 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Migrations\Migration" not found in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_051118_create_property_translations_table.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Property/database/migrations/2024_07_27_051118_create_property_translations_table.php on line 7 database/migrations/2024_07_26_034029_create_aminities_table.php 0000644 00000001255 15012234214 0017753 0 ustar 00 <?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::create('aminities', function (Blueprint $table) { $table->id(); $table->string('slug')->nullable(); $table->string('icon')->nullable(); $table->boolean('status')->default(true); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('aminities'); } }; database/migrations/2024_08_04_033508_create_property_reviews_table.php 0000644 00000002000 15012234214 0021404 0 ustar 00 <?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::create('property_reviews', function (Blueprint $table) { $table->id(); $table->integer('user_id'); $table->integer('property_id'); $table->text('comment')->nullable(); $table->double('service_rating')->nullable(); $table->double('location_rating')->nullable(); $table->double('money_rating')->nullable(); $table->double('clean_rating')->nullable(); $table->double('avarage_rating')->nullable(); $table->boolean('status')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_reviews'); } }; database/migrations/2024_07_27_121140_create_property_nearest_locations_table.php 0000644 00000001312 15012234214 0023433 0 ustar 00 <?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::create('property_nearest_locations', function (Blueprint $table) { $table->id(); $table->integer('property_id'); $table->integer('nearest_place_id'); $table->string('distance')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_nearest_locations'); } }; database/migrations/2024_07_27_051118_create_property_translations_table.php 0000644 00000001435 15012234214 0022455 0 ustar 00 <?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::create('property_translations', function (Blueprint $table) { $table->id(); $table->integer('property_id'); $table->string('lang_code'); $table->text('title')->nullable(); $table->text('address')->nullable(); $table->longText('description')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_translations'); } }; database/migrations/2024_07_26_060645_create_property_type_translations_table.php 0000644 00000001304 15012234214 0023515 0 ustar 00 <?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::create('property_type_translations', function (Blueprint $table) { $table->id(); $table->integer('property_type_id'); $table->string('lang_code'); $table->string('title')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_type_translations'); } }; database/migrations/2024_07_26_081203_create_property_purpose_translations_table.php 0000644 00000001315 15012234214 0024224 0 ustar 00 <?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::create('property_purpose_translations', function (Blueprint $table) { $table->id(); $table->integer('property_purpose_id'); $table->string('lang_code'); $table->string('title')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('property_purpose_translations'); } }; database/migrations/2024_07_26_034114_create_aminity_translations_table.php 0000644 00000001262 15012234214 0022235 0 ustar 00 <?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::create('aminity_translations', function (Blueprint $table) { $table->id(); $table->integer('aminity_id'); $table->string('lang_code'); $table->string('title')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('aminity_translations'); } }; database/seeders/PropertyDatabaseSeeder.php 0000644 00000002651 15012234214 0015052 0 ustar 00 <?php namespace Modules\Property\database\seeders; use Illuminate\Database\Seeder; use Modules\Property\app\Models\PropertyPurpose; use Modules\Property\app\Models\PropertyPurposeTranslation; class PropertyDatabaseSeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { $propertyPurposes = [ 'purpose' => [ 'For Sale', 'For Rent', ], 'slug' => [ 'for-sale', 'for-rent', ], 'status' => [ 1, 1, ] ]; foreach ($propertyPurposes['purpose'] as $key => $value) { $propertyPurpose = new PropertyPurpose(); $propertyPurpose->purpose = $propertyPurposes['purpose'][$key]; $propertyPurpose->slug = $propertyPurposes['slug'][$key]; $propertyPurpose->status = $propertyPurposes['status'][$key]; $propertyPurpose->save(); $languages = allLanguages(); foreach($languages as $language){ $translation = new PropertyPurposeTranslation(); $translation->property_purpose_id = $propertyPurpose->id; $translation->lang_code = $language->code; $translation->title = $propertyPurposes['purpose'][$key]; $translation->save(); } } } } database/seeders/.gitkeep 0000644 00000000000 15012234214 0011353 0 ustar 00 resources/assets/.gitkeep 0000644 00000000000 15012234214 0011471 0 ustar 00 resources/assets/js/app.js 0000644 00000000000 15012234214 0011572 0 ustar 00 resources/assets/sass/app.scss 0000644 00000000000 15012234214 0012466 0 ustar 00 resources/views/admin/sidebar.blade.php 0000644 00000005151 15012234214 0014167 0 ustar 00 @if (Module::isEnabled('Property') && Route::has('admin.property.index')) <li class="nav-item dropdown {{ isRoute(['admin.property.*','admin.amenity.*','admin.nearest-location.*','admin.property-type.*','admin.property-purpose.*','admin.property-slider','admin.property-nearest-location', 'admin.review', 'admin.agent-property'], 'active') }}"> <a href="javascript:void()" class="nav-link has-dropdown"><i class="fas fa-newspaper"></i><span>{{ __('Real Estate') }}</span></a> <ul class="dropdown-menu"> @adminCan('property.view') <li class="{{ isRoute(['admin.agent-property'], 'active') }}"> <a class="nav-link" href="{{ route('admin.agent-property') }}"> {{ __('Agent Property') }} </a> </li> @endadminCan @adminCan('property.view') <li class="{{ isRoute(['admin.property.*', 'admin.property-slider', 'admin.property-nearest-location'], 'active') }}"> <a class="nav-link" href="{{ route('admin.property.index') }}"> {{ __('My Property') }} </a> </li> @endadminCan @adminCan('property.amenity.view') <li class="{{ isRoute('admin.amenity.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.amenity.index') }}"> {{ __('Amenity List') }} </a> </li> @endadminCan @adminCan('nearest.location.view') <li class="{{ isRoute('admin.nearest-location.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.nearest-location.index') }}"> {{ __('Nearest Location') }} </a> </li> @endadminCan @adminCan('property.type.view') <li class="{{ isRoute('admin.property-type.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.property-type.index') }}"> {{ __('Property Type') }} </a> </li> @endadminCan <li class="{{ isRoute('admin.property-purpose.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.property-purpose.index') }}"> {{ __('Property Purpose') }} </a> </li> <li class="{{ isRoute('admin.review', 'active') }}"> <a class="nav-link" href="{{ route('admin.review') }}"> {{ __('Property Review') }} </a> </li> </ul> </li> @endif resources/views/admin/review/review.blade.php 0000644 00000016031 15012234214 0015357 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property Review') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <div class="section-header"> <h1>{{ __('Property Review') }}</h1> <div class="section-header-breadcrumb"> <div class="breadcrumb-item active"><a href="{{ route('admin.dashboard') }}">{{ __('Dashboard') }}</a> </div> <div class="breadcrumb-item">{{ __('Property Review') }}</div> </div> </div> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Property Review') }}</h4> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th width="5%">{{ __('Serial') }}</th> <th width="15%">{{ __('Name') }}</th> <th width="25%">{{ __('Comment') }}</th> <th width="20%">{{ __('Rating') }}</th> <th width="20%">{{ __('Property') }}</th> <th width="15%">{{ __('Status') }}</th> <th width="5%" class="text-center">{{ __('Action') }}</th> </tr> </thead> <tbody> @forelse ($reviews as $index => $review) <tr> <td>{{ $loop->index + 1 }}</td> <td><a href="{{ route('agent.show',['user_type' => '2','user_name'=>$review->user->user_name]) }}">{{ $review->user->name }}</a></td> <td >{{ $review->comment }}</td> <td> {{ __('Service') }}= {{ $review->service_rating }} <i class="fas fa-star" aria-hidden="true"></i> <br > {{ __('Location') }}= {{ $review->location_rating }} <i class="fas fa-star" aria-hidden="true"></i> <br > {{ __('Value') }}= {{ $review->money_rating }} <i class="fas fa-star" aria-hidden="true"></i> <br > {{ __('Cleanliness') }}= {{ $review->clean_rating }} <i class="fas fa-star" aria-hidden="true"></i> <br > {{ __('Avarage') }}= {{ $review->avarage_rating }} <i class="fas fa-star" aria-hidden="true"></i> </td> <td><a target="_blank" href="{{ route('property.details',$review->property->slug) }}">{{ $review->property->title }}</a></td> <td> <input onchange="changeStatus({{ $review->id }})" id="status_toggle" type="checkbox" {{ $review->status ? 'checked' : '' }} data-toggle="toggle" data-on="{{ __('Active') }}" data-off="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> <x-admin.delete-button :id="$review->id" onclick="deleteData" /> </div> </td> </tr> @empty <x-empty-table :name="__('Property Review')" route="admin.property-type.create" create="no" :message="__('No data found!')" colspan="7"></x-empty-table> @endforelse </tbody> </table> </div> <div class="float-right"> {{ $reviews->links() }} </div> </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('admin/review-delete') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/review-status/') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/admin/propertypurpose/edit.blade.php 0000644 00000024471 15012234214 0017013 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Edit Property Purpose') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Edit Property Purpose') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property Purpose') => route('admin.property-purpose.index'), __('Edit Property Purpose') => '#', ]" /> <div class="section-body row"> <div class="col-12"> <div class="card"> <div class="card-header gap-3 justify-content-between align-items-center"> <h5 class="m-0 service_card">{{ __('Available Translations') }}</h5> @if ($code !== $languages->first()->code) <x-admin.button onclick="translateAll()" id="translate-btn" :text="__('Translate')" /> @endif </div> <div class="card-body"> <div class="lang_list_top"> <ul class="lang_list"> @foreach ($languages as $language) <li><a id="{{ request('code') == $language->code ? 'selected-language' : '' }}" href="{{ route('admin.property-purpose.edit', ['property_purpose' => $propertyPurpose->id, 'code' => $language->code]) }}"><i class="fas {{ request('code') == $language->code ? 'fa-eye' : 'fa-edit' }}"></i> {{ $language->name }}</a></li> @endforeach </ul> </div> <div class="mt-2 alert alert-danger" role="alert"> @php $current_language = $languages->where('code', request()->get('code'))->first(); @endphp <p>{{ __('Your editing mode') }} : <b>{{ $current_language?->name }}</b> </p> </div> </div> </div> </div> </div> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Edit Property Purpose') }}</h4> <div> <a href="{{ route('admin.property-purpose.index') }}" class="btn btn-primary"><i class="fa fa-arrow-left"></i>{{ __('Back') }}</a> </div> </div> <div class="card-body"> <form action="{{ route('admin.property-purpose.update', ['property_purpose' => $propertyPurpose->id, 'code' => $code]) }}" method="post"> @csrf @method('PUT') <div class="row"> @if ($code == $languages->first()->code) <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="purpose" name="purpose" label="{{ __('Default Purpose') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('purpose', $propertyPurpose->purpose) }}" placeholder="{{ __('Property Purpose') }}" required="true" readonly="true" /> </div> </div> @endif <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input data-translate="true" id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title', $propertyPurpose->getTranslation($code)->title) }}" placeholder="{{ __('Enter Title') }}" required="true"/> </div> </div> <div class="text-center offset-md-2 col-md-8"> <x-admin.update-button :text="__('Update')"> </x-admin.update-button> </div> </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @if ($code != $languages->first()->code) @push('js') <script> var isTranslatingInputs = true; function translateOneByOne(inputs, index = 0) { if (index >= inputs.length) { if (isTranslatingInputs) { isTranslatingInputs = false; translateAllTextarea(); } $('#translate-btn').prop('disabled', false); $('#update-btn').prop('disabled', false); return; } var $input = $(inputs[index]); var inputValue = $input.val(); if (inputValue) { $.ajax({ url: "{{ route('admin.languages.update.single') }}", type: "POST", data: { lang: '{{ $code }}', text: inputValue, _token: '{{ csrf_token() }}' }, dataType: 'json', beforeSend: function() { $input.prop('disabled', true); iziToast.show({ timeout: false, close: true, theme: 'dark', icon: 'loader', iconUrl: 'https://hub.izmirnic.com/Files/Images/loading.gif', title: "{{ __('Translation Processing, please wait...') }}", position: 'center', }); }, success: function(response) { $input.val(response); $input.prop('disabled', false); iziToast.destroy(); toastr.success("{{ __('Translated Successfully!') }}"); translateOneByOne(inputs, index + 1); }, error: function(jqXHR, textStatus, errorThrown) { console.error(textStatus, errorThrown); iziToast.destroy(); toastr.error('Error', 'Error'); } }); } else { translateOneByOne(inputs, index + 1); } } function translateAll() { iziToast.question({ timeout: 20000, close: false, overlay: true, displayMode: 'once', id: 'question', zindex: 999, title: "{{ __('This will take a while!') }}", message: "{{ __('Are you sure?') }}", position: 'center', buttons: [ ["<button><b>{{ __('YES') }}</b></button>", function(instance, toast) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $('#translate-btn').prop('disabled', true); $('#update-btn').prop('disabled', true); instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); var inputs = $('input[data-translate="true"]').toArray(); translateOneByOne(inputs); }, true], ["<button>{{ __('NO') }}</button>", function(instance, toast) { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); }], ], onClosing: function(instance, toast, closedBy) {}, onClosed: function(instance, toast, closedBy) {} }); }; function translateAllTextarea() { var inputs = $('textarea[data-translate="true"]').toArray(); if (inputs.length === 0) { return; } translateOneByOne(inputs); } $(document).ready(function() { var selectedTranslation = $('#selected-language').text(); var btnText = "{{ __('Translate to') }}" + selectedTranslation; $('#translate-btn').text(btnText); }); </script> @endpush @endif resources/views/admin/propertypurpose/index.blade.php 0000644 00000012342 15012234214 0017167 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property Purpose') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Property Purpose') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property Purpose') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Property Purpose')" /> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th width="10%">{{ __('SN') }}</th> <th width="50%">{{ __('Title') }}</th> <th width="20%">{{ __('Status') }}</th> <th width="20%" class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($propertyPurposes as $propertyPurpose) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $propertyPurpose->title }}</td> <td> <input onchange="changeStatus({{ $propertyPurpose->id }})" id="status_toggle" type="checkbox" {{ $propertyPurpose->status ? 'checked' : '' }} data-toggle="toggle" data-on="{{ __('Active') }}" data-off="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> <x-admin.edit-button :href="route('admin.property-purpose.edit', ['property_purpose' => $propertyPurpose->id, 'code' => getSessionLanguage()])" /> </div> </td> </tr> @empty <x-empty-table :name="__('Property Purpose')" route="admin.property-purpose.create" create="no" :message="__('No data found!')" colspan="5"></x-empty-table> @endforelse </tbody> </table> </div> <div class="float-right"> {{ $propertyPurposes->links() }} </div> </div> </div> </div> </div> </div> </section> </div> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/property-purpose/') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/property-purpose/status-update') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/admin/nearestlocation/edit.blade.php 0000644 00000026037 15012234214 0016703 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Edit Nearest Location') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Edit Nearest Location') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Nearest Location') => route('admin.nearest-location.index'), __('Edit Nearest Location') => '#', ]" /> <div class="section-body row"> <div class="col-12"> <div class="card"> <div class="card-header gap-3 justify-content-between align-items-center"> <h5 class="m-0 service_card">{{ __('Available Translations') }}</h5> @adminCan('nearest.location.translate') @if ($code !== $languages->first()->code) <x-admin.button onclick="translateAll()" id="translate-btn" :text="__('Translate')" /> @endif @endadminCan </div> <div class="card-body"> <div class="lang_list_top"> <ul class="lang_list"> @foreach ($languages as $language) <li><a id="{{ request('code') == $language->code ? 'selected-language' : '' }}" href="{{ route('admin.nearest-location.edit', ['nearest_location' => $nearestLocation->id, 'code' => $language->code]) }}"><i class="fas {{ request('code') == $language->code ? 'fa-eye' : 'fa-edit' }}"></i> {{ $language->name }}</a></li> @endforeach </ul> </div> <div class="mt-2 alert alert-danger" role="alert"> @php $current_language = $languages->where('code', request()->get('code'))->first(); @endphp <p>{{ __('Your editing mode') }} : <b>{{ $current_language?->name }}</b> </p> </div> </div> </div> </div> </div> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Edit Nearest Location') }}</h4> <div> <a href="{{ route('admin.nearest-location.index') }}" class="btn btn-primary"><i class="fa fa-arrow-left"></i>{{ __('Back') }}</a> </div> </div> <div class="card-body"> <form action="{{ route('admin.nearest-location.update', ['nearest_location' => $nearestLocation->id, 'code' => $code]) }}" method="post"> @csrf @method('PUT') <div class="row"> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input data-translate="true" id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title', $nearestLocation->getTranslation($code)->title) }}" placeholder="{{ __('Enter Title') }}" required="true"/> </div> </div> @if ($code == $languages->first()->code) <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug', $nearestLocation->slug) }}" required="true"/> </div> </div> @endif @adminCan('nearest.location.update') <div class="text-center offset-md-2 col-md-8"> <x-admin.update-button :text="__('Update')"> </x-admin.update-button> </div> @endadminCan </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @if ($code == $languages->first()->code) @push('js') <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush @else @push('js') <script> var isTranslatingInputs = true; function translateOneByOne(inputs, index = 0) { if (index >= inputs.length) { if (isTranslatingInputs) { isTranslatingInputs = false; translateAllTextarea(); } $('#translate-btn').prop('disabled', false); $('#update-btn').prop('disabled', false); return; } var $input = $(inputs[index]); var inputValue = $input.val(); if (inputValue) { $.ajax({ url: "{{ route('admin.languages.update.single') }}", type: "POST", data: { lang: '{{ $code }}', text: inputValue, _token: '{{ csrf_token() }}' }, dataType: 'json', beforeSend: function() { $input.prop('disabled', true); iziToast.show({ timeout: false, close: true, theme: 'dark', icon: 'loader', iconUrl: 'https://hub.izmirnic.com/Files/Images/loading.gif', title: "{{ __('Translation Processing, please wait...') }}", position: 'center', }); }, success: function(response) { $input.val(response); $input.prop('disabled', false); iziToast.destroy(); toastr.success("{{ __('Translated Successfully!') }}"); translateOneByOne(inputs, index + 1); }, error: function(jqXHR, textStatus, errorThrown) { console.error(textStatus, errorThrown); iziToast.destroy(); toastr.error('Error', 'Error'); } }); } else { translateOneByOne(inputs, index + 1); } } function translateAll() { iziToast.question({ timeout: 20000, close: false, overlay: true, displayMode: 'once', id: 'question', zindex: 999, title: "{{ __('This will take a while!') }}", message: "{{ __('Are you sure?') }}", position: 'center', buttons: [ ["<button><b>{{ __('YES') }}</b></button>", function(instance, toast) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $('#translate-btn').prop('disabled', true); $('#update-btn').prop('disabled', true); instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); var inputs = $('input[data-translate="true"]').toArray(); translateOneByOne(inputs); }, true], ["<button>{{ __('NO') }}</button>", function(instance, toast) { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); }], ], onClosing: function(instance, toast, closedBy) {}, onClosed: function(instance, toast, closedBy) {} }); }; function translateAllTextarea() { var inputs = $('textarea[data-translate="true"]').toArray(); if (inputs.length === 0) { return; } translateOneByOne(inputs); } $(document).ready(function() { var selectedTranslation = $('#selected-language').text(); var btnText = "{{ __('Translate to') }}" + selectedTranslation; $('#translate-btn').text(btnText); }); </script> @endpush @endif resources/views/admin/nearestlocation/create.blade.php 0000644 00000006631 15012234214 0017217 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Create Nearest Location') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Create Nearest Location') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Nearest Location') => route('admin.nearest-location.index'), __('Create Nearest Location') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Create Nearest Location')" /> <div> <x-admin.back-button :href="route('admin.nearest-location.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.nearest-location.store') }}" method="post"> @csrf <div class="row"> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title') }}" required="true"/> </div> </div> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug') }}" required="true" /> </div> </div> @adminCan('nearest.location.store') <div class="text-center offset-md-2 col-md-8"> <x-admin.save-button :text="__('Save')"> </x-admin.save-button> </div> @endadminCan </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @push('js') <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush resources/views/admin/nearestlocation/index.blade.php 0000644 00000024704 15012234214 0017064 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Location List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Nearest Location') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Nearest Location') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> {{-- Search filter --}} <div class="col-12"> <div class="card"> <div class="card-body p-0"> <form action="{{ route('admin.nearest-location.index') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body"> <div class="row"> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="status" id="status" class="form-select"> <x-admin.select-option value="" text="{{ __('Select Status') }}" /> <x-admin.select-option :selected="request('status') == '1'" value="1" text="{{ __('Yes') }}" /> <x-admin.select-option :selected="request('status') == '0'" value="0" text="{{ __('No') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="order_by" id="order_by" class="form-select"> <x-admin.select-option value="" text="{{ __('Order By') }}" /> <x-admin.select-option :selected="request('order_by') == '1'" value="1" text="{{ __('ASC') }}" /> <x-admin.select-option :selected="request('order_by') == '0'" value="0" text="{{ __('DESC') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="par-page" id="par-page" class="form-select"> <x-admin.select-option value="" text="{{ __('Per Page') }}" /> <x-admin.select-option :selected="request('par-page') == '5'" value="5" text="{{ __('5') }}" /> <x-admin.select-option :selected="request('par-page') == '10'" value="10" text="{{ __('10') }}" /> <x-admin.select-option :selected="request('par-page') == '25'" value="25" text="{{ __('25') }}" /> <x-admin.select-option :selected="request('par-page') == '50'" value="50" text="{{ __('50') }}" /> <x-admin.select-option :selected="request('par-page') == '100'" value="100" text="{{ __('100') }}" /> <x-admin.select-option :selected="request('par-page') == 'all'" value="all" text="{{ __('All') }}" /> </x-admin.form-select> </div> </div> </form> </div> </div> </div> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Nearest Location')" /> <div> @adminCan('nearest.location.create') <x-admin.add-button :href="route('admin.nearest-location.create')" /> @endadminCan </div> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th>{{ __('SN') }}</th> <th>{{ __('Title') }}</th> <th>{{ __('Status') }}</th> <th class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($nearestLocations as $location) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $location->title }}</td> <td> <input onchange="changeStatus({{ $location->id }})" id="status_toggle" type="checkbox" {{ $location->status ? 'checked' : '' }} data-toggle="toggle" data-on="{{ __('Active') }}" data-off="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> @adminCan('nearest.location.edit') <x-admin.edit-button :href="route('admin.nearest-location.edit', [ 'nearest_location' => $location->id, 'code' => getSessionLanguage(), ])" /> @endadminCan @adminCan('nearest.location.delete') <x-admin.delete-button :id="$location->id" onclick="deleteData" /> @endadminCan </div> </td> </tr> @empty <x-empty-table :name="__('Location')" route="admin.nearest-location.create" create="yes" :message="__('No data found!')" colspan="5"></x-empty-table> @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $nearestLocations->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/nearest-location/') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/nearest-location/status-update') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/admin/property/nearestlocation.blade.php 0000644 00000014050 15012234214 0017632 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property Nearest Location') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Property Nearest Location') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Edit Property') => route('admin.property.edit', ['property' => $property->id, 'code' => allLanguages()->first()->code]), __('Property Nearest Location') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Upload Nearest Location')" /> <div> <x-admin.back-button :href="route('admin.property.edit', ['property' => $property->id,'code' => allLanguages()->first()->code])" /> </div> </div> <div class="card-body"> <form id="dropzoneForm" method="post" action="{{ route('admin.upload-nearest-location', $property->id) }}" enctype="multipart/form-data" method="POST"> @csrf <div class="row"> <div class="col-md-12"> <div class="form-group"> <x-admin.form-select name="nearest_place_id" class="select2" label="{{ __('Nearest Location') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select Location') }}" /> @foreach ($locations as $location) <x-admin.select-option :selected=" old('nearest_place_id')" value="{{ $location->id }}" text="{{ $location->title }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group"> <x-admin.form-input name="distance" label="{{ __('Distance') }}" tooltip="{{ __('KM') }}" value="{{ old('distance') }}" required="true"/> </div> @adminCan('property.nearest.location.upload') <x-admin.save-button :text="__('Save')"></x-admin.save-button> @endadminCan </div> </div> </form> </div> </div> <div class="card"> <div class="card-header"> <h4>{{ __('Nearest Location') }}</h4> </div> <div class="card-body"> <table class="table table-striped"> <thead> <tr> <th>{{ __('SN') }}</th> <th>{{ __('Location') }}</th> <th>{{ __('Distance') }}</th> <th class="text-center">{{ __('Action') }}</th> </tr> </thead> <tbody> @forelse ($nearest_locations as $item) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $item->nearestLocation->title }}</td> <td>{{ $item->distance }}</td> <td class="text-center"> @adminCan('property.nearest.location.delete') <div> <x-admin.delete-button :id="$item->id " onclick="deleteData" /> </div> @endadminCan </td> </tr> @empty <x-empty-table :name="__('Nearest Location')" route="admin.property.index" create="no" :message="__('No data found!')" colspan="4"> </x-empty-table> @endforelse </tbody> </table> </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script type="text/javascript"> function deleteData(id) { $("#deleteForm").attr("action", "{{ url('/admin/delete-nearest-location/') }}" + "/" + id); } </script> @endpush resources/views/admin/property/edit.blade.php 0000644 00000114071 15012234214 0015371 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Edit Property') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Edit Property') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property List') => route('admin.property.index'), __('Edit Property') => '#', ]" /> <div class="section-body row"> <div class="col-12"> <div class="card"> <div class="card-header gap-3 justify-content-between align-items-center"> <h5 class="m-0 service_card">{{ __('Available Translations') }}</h5> @adminCan('property.translate') @if ($code !== $languages->first()->code) <x-admin.button onclick="translateAll()" id="translate-btn" :text="__('Translate')" /> @endif @endadminCan </div> <div class="card-body"> <div class="lang_list_top"> <ul class="lang_list"> @foreach ($languages = allLanguages() as $language) <li><a id="{{ request('code') == $language->code ? 'selected-language' : '' }}" href="{{ route('admin.property.edit', ['property' => $property->id, 'code' => $language->code]) }}"><i class="fas {{ request('code') == $language->code ? 'fa-eye' : 'fa-edit' }}"></i> {{ $language->name }}</a></li> @endforeach </ul> </div> <div class="mt-2 alert alert-danger" role="alert"> @php $current_language = $languages->where('code', request()->get('code'))->first(); @endphp <p>{{ __('Your editing mode') }} : <b> {{ $current_language?->name }}</b></p> </div> </div> </div> </div> </div> <form action="{{ route('admin.property.update', $property->id) }}" method="POST" enctype="multipart/form-data"> @csrf @method('PUT') <input type="hidden" name="code" value="{{ $code }}"> <div class="section-body"> <div class="mt-4 row"> <div class="col-md-9"> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Basic Information') }}</h4> <div> <x-admin.back-button :href="route('admin.property.index')" /> </div> </div> <div class="card-body"> <div class="row"> @if ($code == $languages->first()->code) <div class="form-group col-md-12"> <x-admin.form-select name="agent" id="agent" class="select2" label="{{ __('Property Agent') }} " required="true"> <x-admin.select-option :selected="$property->user_id == 0" value="0" text="{{ __('Own Property') }}" /> @foreach ($agents as $agent) <x-admin.select-option :selected="$agent->id == old('agent', $property->user_id)" value="{{ $agent->id }}" text="{{ $agent->name }}" /> @endforeach </x-admin.form-select> </div> @endif <div class="form-group col-md-12 "> <x-admin.form-input data-translate="true" id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title', $property->getTranslation($code)->title) }}" placeholder="{{ __('Enter Title') }}" required="true"/> </div> @if ($code == $languages->first()->code) <div class="form-group col-md-12 "> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug', $property->slug) }}" required="true"/> </div> <div class="form-group col-md-12"> <x-admin.form-select name="property_type_id" id="property_type" class="select2" label="{{ __('Property Type') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select Property Type') }}" /> @foreach ($propertyTypes as $propertyType) <x-admin.select-option :selected="$propertyType->id == old('property_type_id', $property->property_type_id)" value="{{ $propertyType->id }}" text="{{ $propertyType->title }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group col-md-12"> <x-admin.form-select name="city_id" id="city" class="select2" label="{{ __('City') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select City') }}" /> @foreach ($cities as $city) <x-admin.select-option :selected="$city->id == old('city_id', $property->city_id)" value="{{ $city->id }}" text="{{ $city->title.', '.$city->countryState->title.', '.$city->countryState->country->title }}" /> @endforeach </x-admin.form-select> </div> @endif <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" id="address" name="address" label="{{ __('Address') }}" placeholder="{{ __('Enter Address') }}" value="{{ old('address', $property->getTranslation($code)->address) }}" placeholder="{{ __('Enter Address') }}" required="true"/> </div> @if ($code == $languages->first()->code) <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" id="phone" name="phone" label="{{ __('Phone') }}" placeholder="{{ __('Enter Phone') }}" value="{{ old('phone', $property->phone) }}" placeholder="{{ __('Enter Phone') }}"/> </div> <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" id="email" name="email" label="{{ __('Email') }}" placeholder="{{ __('Enter Email') }}" value="{{ old('email', $property->email) }}" placeholder="{{ __('Enter Email') }}" required="true"/> </div> <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" id="website" name="website" label="{{ __('Website') }}" placeholder="{{ __('Enter Website') }}" value="{{ old('website', $property->website) }}" placeholder="{{ __('Enter Website') }}"/> </div> <div class="form-group col-md-12"> <x-admin.form-select name="property_purpose_id" id="purpose" class="select2" label="{{ __('Purpose') }} " required="true"> @foreach ($purposes as $purpose) <x-admin.select-option :selected="$purpose->id == old('property_purpose_id', $property->property_purpose_id)" value="{{ $purpose->id }}" text="{{ $purpose->title }}" /> @endforeach </x-admin.form-select> </div> @if ($property->property_purpose_id==1) <div class="form-group col-md-12 d-none" id="period_box"> <x-admin.form-select name="period" id="period" label="{{ __('Period') }} " required="true"> <x-admin.select-option :selected="'Daily' == old('period')" value="Daily" text="{{ __('Daily') }}" /> <x-admin.select-option :selected="'Monthly' == old('period')" value="Monthly" text="{{ __('Monthly') }}" /> <x-admin.select-option :selected="'Yearly' == old('period')" value="Yearly" text="{{ __('Yearly') }}" /> </x-admin.form-select> </div> @endif @if ($property->property_purpose_id==2) <div class="form-group col-md-12" id="period_box"> <x-admin.form-select name="period" id="period" label="{{ __('Period') }} " required="true"> <x-admin.select-option :selected="'Daily' == old('period', $property->period )" value="Daily" text="{{ __('Daily') }}" /> <x-admin.select-option :selected="'Monthly' == old('period', $property->period )" value="Monthly" text="{{ __('Monthly') }}" /> <x-admin.select-option :selected="'Yearly' == old('period', $property->period )" value="Yearly" text="{{ __('Yearly') }}" /> </x-admin.form-select> </div> @endif <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" id="price" name="price" label="{{ __('Price') }}" placeholder="{{ __('Enter Price') }}" value="{{ old('price', $property->price) }}" placeholder="{{ __('Enter Price') }}" required="true"/> </div> @endif </div> </div> </div> @if ($code == $languages->first()->code) <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Others Information') }}</h4> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" id="area" name="area" label="{{ __('Total Area') }} ({{ __('Square Feet') }})" placeholder="{{ __('Total Area') }}" value="{{ old('price', $property->area) }}" placeholder="{{ __('Enter Area') }}" required="true"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_unit" name="number_of_unit" label="{{ __('Total Unit') }}" placeholder="{{ __('Total Unit') }}" value="{{ old('number_of_unit', $property->number_of_unit) }}" required="true"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_room" name="number_of_room" label="{{ __('Total Room') }}" placeholder="{{ __('Total Room') }}" value="{{ old('number_of_room', $property->number_of_room) }}" required="true"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_bedroom" name="number_of_bedroom" label="{{ __('Total Bedroom') }}" placeholder="{{ __('Total Bedroom') }}" value="{{ old('number_of_bedroom', $property->number_of_bedroom) }}" required="true"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_bathroom" name="number_of_bathroom" label="{{ __('Total Bathroom') }}" placeholder="{{ __('Total Bathroom') }}" value="{{ old('number_of_bathroom', $property->number_of_bathroom) }}" required="true"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_floor" name="number_of_floor" label="{{ __('Total Floor') }}" placeholder="{{ __('Total Floor') }}" value="{{ old('number_of_floor', $property->number_of_floor) }}" required="true"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_kitchen" name="number_of_kitchen" label="{{ __('Total Kitchen') }}" placeholder="{{ __('Total Kitchen') }}" value="{{ old('number_of_kitchen', $property->number_of_kitchen) }}"/> </div> <div class="form-group col-md-6"> <x-admin.form-input data-translate="true" type="number" id="number_of_parking" name="number_of_parking" label="{{ __('Total Parking Place') }}" placeholder="{{ __('Total Parking Place') }}" value="{{ old('number_of_parking', $property->number_of_parking) }}"/> </div> </div> </div> </div> @endif @if ($code == $languages->first()->code) <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('PDF and Video') }}</h4> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-12"> @if ($property->pdf_file) <div class="form-group pdf-file-col-{{ $property->id }}"> <label for="file">{{ __('Existing PDF') }}</label> <div class="my-2"> <a id="downloadLink" href="javascript:;" class="text-danger">{{ __('Download Existing File') }}</a> <br> <a onclick="deletePdfFile('{{ $property->id }}')" href="javascript:;" class="text-danger custom-delete-icon">{{ __('Delete Existing File') }} </a> </div> </div> @endif <label for="" class="w-100">{{ __('PDF File') }}</label> <input type="file" name="pdf_file" class="form-control-file"> @error('pdf_file') <span class="text-danger">{{ $message }}</span> @enderror </div> <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" type="test" id="video_link" name="video_link" label="{{ __('Youtube Video Id') }}" placeholder="{{ __('Youtube Video Id') }}" value="{{ old('video_link', $property->video_link) }}"/> </div> </div> </div> </div> @endif <div class="card"> <div class="card-header d-flex justify-content-between"> @if ($code == $languages->first()->code) <h4>{{ __('Property Details and Google Map') }}</h4> @else <h4>{{ __('Property Details') }}</h4> @endif </div> <div class="card-body"> <div class="row"> @if ($code == $languages->first()->code) <div class="form-group col-md-12"> <x-admin.form-textarea id="google_map_embed_code" name="google_map_embed_code" label="{{ __('Google Map Code') }}" placeholder="{{ __('Google Map Code') }}" data-translate="true" value="{!! old('google_map_embed_code', $property->google_map_embed_code) !!}"/> </div> @endif <div class="form-group col-md-12"> <x-admin.form-editor id="description" name="description" label="{{ __('Description') }}" placeholder="{{ __('Description') }}" data-translate="true" value="{!! old('description', $property->getTranslation($code)->description) !!}" required="true"/> </div> @if ($code == $languages->first()->code) <div class="form-group col-md-12"> <x-admin.form-input data-translate="true" type="test" id="seo_title" name="seo_title" label="{{ __('SEO Title') }}" placeholder="{{ __('SEO Title') }}" value="{{ old('seo_title', $property->seo_title) }}"/> </div> <div class="form-group col-md-12"> <x-admin.form-textarea id="seo_description" name="seo_description" label="{{ __('SEO Description') }}" placeholder="{{ __('SEO Description') }}" data-translate="true" value="{{ old('seo_description', $property->seo_description) }}"/> </div> @endif </div> </div> </div> </div> <div class="col-md-3"> @if ($code == $languages->first()->code) <div class="card sidebar_card"> <div class="card-body"> <div class="form-group"> <x-admin.form-image-preview div_id="thumbnail-image-preview" label_id="thumbnail-image-label" input_id="thumbnail-image-upload" name="thumbnail_image" label="{{ __('Thumbnail Image') }}" :image="$property->thumbnail_image" /> </div> </div> </div> <div class="card sidebar_card"> <div class="card-body"> <div class="form-group"> <x-admin.form-image-preview div_id="banner-image-preview" label_id="banner-image-label" input_id="banner-image-upload" name="banner_image" label="{{ __('Banner Image') }}" :image="$property->banner_image" /> </div> </div> </div> <div class="card"> <div class="card-header"> <h4>{{ __('Amenities') }}</h4> </div> <div class="card-body"> <div class="form-group"> @foreach ($aminities as $aminity) @php $isChecked=false; $propertyAminities = Modules\Property\app\Models\PropertyAminity::where('property_id', $property->id)->get(); @endphp @foreach ($propertyAminities as $amnty) @if ($aminity->id == $amnty->aminity_id) @php $isChecked=true; @endphp @endif @endforeach <div class="form-check"> <input value="{{ $aminity->id }}" name="aminities[]" class="form-check-input" type="checkbox" id="aminity_{{ $aminity->id }}" {{ $isChecked ? 'checked' :'' }}> <label class="form-check-label" for="aminity_{{ $aminity->id }}"> {{ $aminity->title }} </label> </div> @endforeach </div> </div> </div> @endif <div class="card"> <div class="card-body"> @if ($code == $languages->first()->code) <div class="form-group"> <label> <input type="hidden" value="0" name="is_featured" class="custom-switch-input"> <input type="checkbox" value="1" name="is_featured" class="custom-switch-input" {{ $property->is_featured == 1 ? 'checked' : '' }}> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Mark as Featured') }}</span> </label> </div> <div class="form-group"> <label> <input type="hidden" value="0" name="top_property" class="custom-switch-input"> <input type="checkbox" value="1" name="top_property" class="custom-switch-input" {{ $property->top_property == 1 ? 'checked' : '' }}> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Mark Top Property') }}</span> </label> </div> <div class="form-group"> <label> <input type="hidden" value="0" name="urgent_property" class="custom-switch-input"> <input type="checkbox" value="1" name="urgent_property" class="custom-switch-input" {{ $property->urgent_property == 1 ? 'checked' : '' }}> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Urgent Property') }}</span> </label> </div> <div class="form-group"> <label> <input type="hidden" value="0" name="status" class="custom-switch-input"> <input type="checkbox" value="1" name="status" class="custom-switch-input" {{ $property->status == 1 ? 'checked' : '' }}> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Status') }}</span> </label> </div> @endif @adminCan('property.update') <button type="submit" id="update-btn" class="btn btn-success w-100"><i class="fa fa-sync"></i> {{ __('Update Info') }}</button> @endadminCan @adminCan('property.slider') <a href="{{ route('admin.property-slider', $property->id) }}" class="btn btn-success w-100 mt-2"><i class="fa fa-images"></i> {{ __('Manage Slider') }}</a> @endadminCan @adminCan('property.nearest.location') <a href="{{ route('admin.property-nearest-location', $property->id) }}" class="btn btn-success w-100 mt-2"><i class="fas fa-map-marker-alt"></i> {{ __('Nearest Location') }}</a> @endadminCan </div> </div> </div> </div> </div> </form> </section> </div> <form id="downloadForm" action="{{ route('admin.download-property-file') }}" method="POST" style="display: none;"> @csrf <input type="hidden" name="id" value="{{ $property->id}}"> </form> @endsection @push('css') <style> .sidebar_card .image-preview, #callback-preview { width: auto !important; height: 200px !important; } </style> @endpush @if ($code == $languages->first()->code) @push('js') <script src="{{ asset('backend/js/jquery.uploadPreview.min.js') }}"></script> <script> $.uploadPreview({ input_field: "#thumbnail-image-upload", preview_box: "#thumbnail-image-preview", label_field: "#thumbnail-image-label", label_default: "{{ __('Choose Icon') }}", label_selected: "{{ __('Change Icon') }}", no_label: false, success_callback: null }); $.uploadPreview({ input_field: "#banner-image-upload", preview_box: "#banner-image-preview", label_field: "#banner-image-label", label_default: "{{ __('Choose Icon') }}", label_selected: "{{ __('Change Icon') }}", no_label: false, success_callback: null }); function deletePdfFile(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}" var demoNotify = "{{ __('This Is Demo Version. You Can Not Change Anything') }}" if (isDemo == 'DEMO') { toastr.error(demoNotify); return; } $.ajax({ type: 'GET', url: "{{ url('admin/property-delete-pdf/') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.success) $(".pdf-file-col-" + id).remove() } }, error: function(err) { console.log(err); } }); } </script> <script> (function($) { "use strict"; $(document).ready(function() { $("#purpose").on("change", function() { var purposeId = $(this).val(); if (purposeId == 2) { $("#period_box").removeClass('d-none'); } else if (purposeId == 1) { $("#period_box").addClass('d-none'); } }); $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }); $('#downloadLink').on('click', function(event) { event.preventDefault(); // Prevent the default link behavior $('#downloadForm').submit(); // Submit the form }); }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush @else @push('js') <script> "use strict"; var isTranslatingInputs = true; function translateOneByOne(inputs, index = 0) { if (index >= inputs.length) { if (isTranslatingInputs) { isTranslatingInputs = false; translateAllTextarea(); } $('#translate-btn').prop('disabled', false); $('#update-btn').prop('disabled', false); return; } var $input = $(inputs[index]); var inputValue = $input.val(); if (inputValue) { $.ajax({ url: "{{ route('admin.languages.update.single') }}", type: "POST", data: { lang: '{{ $code }}', text: inputValue, _token: '{{ csrf_token() }}' }, dataType: 'json', beforeSend: function() { $input.prop('disabled', true); iziToast.show({ timeout: false, close: true, theme: 'dark', icon: 'loader', iconUrl: 'https://hub.izmirnic.com/Files/Images/loading.gif', title: "{{ __('Translation Processing, please wait...') }}", position: 'center', }); }, success: function(response) { $input.val(response); if ($input.hasClass('summernote')) { console.log($input); var inputId = $input.attr('id'); tinymce.get(inputId).setContent(response); } $input.prop('disabled', false); iziToast.destroy(); toastr.success("{{ __('Translated Successfully') }}"); translateOneByOne(inputs, index + 1); }, error: function(jqXHR, textStatus, errorThrown) { console.error(textStatus, errorThrown); iziToast.destroy(); toastr.error('Error', 'Error'); } }); } else { translateOneByOne(inputs, index + 1); } } function translateAll() { iziToast.question({ timeout: 20000, close: false, overlay: true, displayMode: 'once', id: 'question', zindex: 999, title: "{{ __('This will take a while!') }}", message: "{{ __('Are you sure?') }}", position: 'center', buttons: [ ["<button><b>{{ __('YES') }}</b></button>", function(instance, toast) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); toastr.error( "{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $('#translate-btn').prop('disabled', true); $('#update-btn').prop('disabled', true); instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); var inputs = $('input[data-translate="true"]').toArray(); translateOneByOne(inputs); }, true], ["<button>{{ __('NO') }}</button>", function(instance, toast) { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); }], ], onClosing: function(instance, toast, closedBy) {}, onClosed: function(instance, toast, closedBy) {} }); }; function translateAllTextarea() { var inputs = $('textarea[data-translate="true"]').toArray(); if (inputs.length === 0) { return; } translateOneByOne(inputs); } $(document).ready(function() { var selectedTranslation = $('#selected-language').text(); var btnText = "{{ __('Translate to') }}" + selectedTranslation; $('#translate-btn').text(btnText); }); </script> @endpush @endif resources/views/admin/property/agent_property.blade.php 0000644 00000027541 15012234214 0017513 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Property List') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property List') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> {{-- Search filter --}} <div class="col-12"> <div class="card"> <div class="card-body p-0"> <form action="{{ route('admin.agent-property') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body"> <div class="row"> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="status" id="status" class="form-select"> <x-admin.select-option value="" text="{{ __('Select Status') }}" /> <x-admin.select-option :selected="request('status') == '1'" value="1" text="{{ __('Yes') }}" /> <x-admin.select-option :selected="request('status') == '0'" value="0" text="{{ __('No') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="order_by" id="order_by" class="form-select"> <x-admin.select-option value="" text="{{ __('Order By') }}" /> <x-admin.select-option :selected="request('order_by') == '1'" value="1" text="{{ __('ASC') }}" /> <x-admin.select-option :selected="request('order_by') == '0'" value="0" text="{{ __('DESC') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="par-page" id="par-page" class="form-select"> <x-admin.select-option value="" text="{{ __('Per Page') }}" /> <x-admin.select-option :selected="request('par-page') == '5'" value="5" text="{{ __('5') }}" /> <x-admin.select-option :selected="request('par-page') == '10'" value="10" text="{{ __('10') }}" /> <x-admin.select-option :selected="request('par-page') == '25'" value="25" text="{{ __('25') }}" /> <x-admin.select-option :selected="request('par-page') == '50'" value="50" text="{{ __('50') }}" /> <x-admin.select-option :selected="request('par-page') == '100'" value="100" text="{{ __('100') }}" /> <x-admin.select-option :selected="request('par-page') == 'all'" value="all" text="{{ __('All') }}" /> </x-admin.form-select> </div> </div> </form> </div> </div> </div> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Property List')" /> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th width="5%">{{ __('SN') }}</th> <th width="35%">{{ __('Property') }}</th> <th width="5%">{{ __('Price') }}</th> <th width="10%">{{ __('Type') }}</th> <th width="5%">{{ __('Purpose') }}</th> <th width="5%">{{ __('Views') }}</th> <th width="5%">{{ __('Status') }}</th> <th width="30%" class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($properties as $property) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $property->title }}</td> <td>{{ currency($property->price) }}</td> <td>{{ $property->propertyType->title }}</td> <td>{{ $property->propertyPurpose->purpose }}</td> <td>{{ $property->views }}</td> <td> @if ($property->status == 1) @if ($property->expired_date >= date('Y-m-d')) <span class="badge badge-pill badge-success">{{ __('Active') }}</span> @else <span class="badge badge-pill badge-danger">{{ __('Expired') }}</span> @endif @else <span class="badge badge-pill badge-danger">{{ __('Inactive') }}</span> @endif </td> <td class="text-center"> <div> <a target="__blank" href="{{ route('property.details', $property->slug) }}" class="m-1 text-white btn btn-sm btn-warning" title="Edit"> <i class="fa fa-eye"></i> </a> @adminCan('property.edit') <x-admin.edit-button :href="route('admin.property.edit', [ 'property' => $property->id, 'code' => getSessionLanguage(), ])" /> @endadminCan @adminCan('property.delete') <x-admin.delete-button :id="$property->id" onclick="deleteData" /> @endadminCan </div> </td> </tr> @empty <x-empty-table :name="__('Property')" route="admin.property.create" create="no" :message="__('No data found!')" colspan="8"></x-empty-table> @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $properties->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/delete-agent-property/') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/property/status-update') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/admin/property/slider.blade.php 0000644 00000014676 15012234214 0015740 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property Slider') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Property Slider') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Edit Property') => route('admin.property.edit', ['property' => $property->id, 'code' => allLanguages()->first()->code]), __('Property Slider') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Update Slider')" /> <div> <x-admin.back-button :href="route('admin.property.edit', ['property' => $property->id,'code' => allLanguages()->first()->code])" /> </div> </div> <div class="card-body"> <form id="dropzoneForm" method="post" action="{{ route('admin.upload-property-slider', $property->id) }}" enctype="multipart/form-data" class="dropzone"> @csrf @method('PUT') </form> <div class="mt-3 text-center"> @adminCan('property.slider.upload') <button type="button" class="btn btn-success" id="submit-all"><i class="fas fa-upload"></i> {{ __('Upload All') }} </button> @endadminCan </div> </div> </div> <div class="card"> <div class="card-header"> <x-admin.form-title :text="__('Slider Images')" /> </div> <div class="card-body"> <table class="table table-striped"> <thead> <tr> <th>{{ __('SN') }}</th> <th>{{ __('Preview') }}</th> <th class="text-center">{{ __('Action') }}</th> </tr> </thead> <tbody> @forelse ($slider_images as $item) <tr> <td>{{ $loop->index + 1 }}</td> <td> @if ($item->image) <img class="img-thumbnail" src="{{ asset($item->image) }}" alt="" height="100px" width="100px"> @endif </td> <td class="text-center"> @adminCan('property.slider.delete') <div> <x-admin.delete-button :id="$item->id " onclick="deleteData" /> </div> @endadminCan </td> </tr> @empty <x-empty-table :name="__('Slider Image')" route="admin.property.index" create="no" :message="__('No data found!')" colspan="4"> </x-empty-table> @endforelse </tbody> </table> </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('css') <link rel="stylesheet" href="{{ asset('backend/dropzone/dropzone.min.css') }}"> <style> .dropzone { background: white; border-radius: 5px; border: 2px dashed rgb(0, 135, 247); border-image: none; max-width: 805px; margin-left: auto; margin-right: auto; } </style> @endpush @push('js') <script src="{{ asset('backend/dropzone/dropzone.min.js') }}"></script> <script type="text/javascript"> function deleteData(id) { $("#deleteForm").attr("action", "{{ url('/admin/delete-property-slider/') }}" + "/" + id); } Dropzone.options.dropzoneForm = { autoProcessQueue: false, uploadMultiple: true, parallelUploads: 10, thumbnailHeight: 200, thumbnailWidth: 200, maxFilesize: 3, filesizeBase: 1000, addRemoveLinks: true, renameFile: function(file) { var dt = new Date(); var time = dt.getTime(); return time + file.name; }, acceptedFiles: ".jpeg,.jpg,.png,.gif,.webp", init: function() { myDropzone = this; $('#submit-all').on('click', function(e) { e.preventDefault(); myDropzone.processQueue(); }); this.on("complete", function() { if (this.getQueuedFiles().length == 0 && this.getUploadingFiles().length == 0) { var _this = this; _this.removeAllFiles(); } }); }, success: function(file, response) { window.location.href = response.url; toastr.success(response.message, 'Success'); }, }; </script> @endpush resources/views/admin/property/create.blade.php 0000644 00000053166 15012234214 0015716 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Create Property') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Create Property') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property List') => route('admin.property.index'), __('Create Property') => '#', ]" /> <form action="{{ route('admin.property.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="section-body"> <div class="mt-4 row"> <div class="col-md-9"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Basic Information')" /> <div> <x-admin.back-button :href="route('admin.property.index')" /> </div> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-12"> <x-admin.form-select name="agent" id="agent" class="select2" label="{{ __('Property Agent') }} " required="true"> <x-admin.select-option value="0" text="{{ __('Own Property') }}" /> @foreach ($agents as $agent) <x-admin.select-option :selected="$agent->id == old('agent')" value="{{ $agent->id }}" text="{{ $agent->name }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group col-md-12"> <x-admin.form-input id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title') }}" required="true"/> </div> <div class="form-group col-md-12 "> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug') }}" required="true" /> </div> <div class="form-group col-md-12"> <x-admin.form-select name="property_type_id" id="property_type" class="select2" label="{{ __('Property Type') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select Property Type') }}" /> @foreach ($propertyTypes as $propertyType) <x-admin.select-option :selected="$propertyType->id == old('property_type_id')" value="{{ $propertyType->id }}" text="{{ $propertyType->title }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group col-md-12"> <x-admin.form-select name="city_id" id="city" class="select2" label="{{ __('City') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select City') }}" /> @foreach ($cities as $city) <x-admin.select-option :selected="$city->id == old('city_id')" value="{{ $city->id }}" text="{{ $city->title.', '.$city->countryState->title.', '.$city->countryState->country->title }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group col-md-12"> <x-admin.form-input id="address" name="address" label="{{ __('Address') }}" placeholder="{{ __('Enter Address') }}" value="{{ old('title') }}" required="true"/> </div> <div class="form-group col-md-12"> <x-admin.form-input id="phone" name="phone" label="{{ __('Phone') }}" placeholder="{{ __('Enter Phone') }}" value="{{ old('phone') }}"/> </div> <div class="form-group col-md-12"> <x-admin.form-input id="email" type="email" name="email" label="{{ __('Email') }}" placeholder="{{ __('Enter Email') }}" value="{{ old('email') }}" required="true"/> </div> <div class="form-group col-md-12"> <x-admin.form-input id="website" type="url" name="website" label="{{ __('Website') }}" placeholder="{{ __('Enter Website') }}" value="{{ old('website') }}"/> </div> <div class="form-group col-md-12"> <x-admin.form-select name="property_purpose_id" id="purpose" class="select2" label="{{ __('Purpose') }} " required="true"> @foreach ($purposes as $purpose) <x-admin.select-option :selected="$purpose->id == old('property_purpose_id')" value="{{ $purpose->id }}" text="{{ $purpose->title }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group col-md-12 d-none" id="period_box"> <x-admin.form-select name="period" id="period" class="period" label="{{ __('Period') }} " required="true"> <x-admin.select-option :selected="old('period')" value="Daily" text="{{ __('Daily') }}" /> <x-admin.select-option :selected="old('period')" value="Monthly" text="{{ __('Monthly') }}" /> <x-admin.select-option :selected="old('period')" value="Yearly" text="{{ __('Yearly') }}" /> </x-admin.form-select> </div> <div class="form-group col-md-12"> <x-admin.form-input id="price" name="price" label="{{ __('Price') }}" placeholder="{{ __('Enter Price') }}" value="{{ old('price') }}" required="true" /> </div> </div> </div> </div> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Others Information') }}</h4> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-6"> <x-admin.form-input id="area" name="area" label="{{ __('Total Area') }}" placeholder="{{ __('Total Area') }}" value="{{ old('area') }}" required="true" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_unit" name="number_of_unit" label="{{ __('Total Unit') }}" placeholder="{{ __('Total Unit') }}" value="{{ old('number_of_unit') }}" required="true" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_room" name="number_of_room" label="{{ __('Total Room') }}" placeholder="{{ __('Total Room') }}" value="{{ old('number_of_room') }}" required="true" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_bedroom" name="number_of_bedroom" label="{{ __('Total Bedroom') }}" placeholder="{{ __('Total Bedroom') }}" value="{{ old('number_of_bedroom') }}" required="true" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_bathroom" type="number" name="number_of_bathroom" label="{{ __('Total Bathroom') }}" placeholder="{{ __('Total Bathroom') }}" value="{{ old('number_of_bathroom') }}" required="true" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_floor" type="number" name="number_of_floor" label="{{ __('Total Floor') }}" placeholder="{{ __('Total Floor') }}" value="{{ old('number_of_floor') }}" required="true" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_kitchen" type="number" name="number_of_kitchen" label="{{ __('Total Kitchen') }}" placeholder="{{ __('Total Kitchen') }}" value="{{ old('number_of_kitchen') }}" /> </div> <div class="form-group col-md-6"> <x-admin.form-input id="number_of_parking" type="number" name="number_of_parking" label="{{ __('Total Parking Place') }}" placeholder="{{ __('Total Parking Place') }}" value="{{ old('number_of_parking') }}" /> </div> </div> </div> </div> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('PDF and Video') }}</h4> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-12"> <label for="" class="w-100">{{ __('PDF File') }}</label> <input type="file" name="pdf_file" class="form-control-file"> @error('pdf_file') <span class="text-danger">{{ $message }}</span> @enderror </div> <div class="form-group col-md-12"> <x-admin.form-input id="video_link" name="video_link" label="{{ __('Youtube Video Id') }}" placeholder="{{ __('Youtube Video Id') }}" value="{{ old('video_link') }}" /> </div> </div> </div> </div> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Property Details and Google Map') }}</h4> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-12"> <x-admin.form-textarea name="google_map_embed_code" label="{{ __('Google Map Code') }}" value="{!! old('google_map_embed_code') !!}"/> </div> <div class="form-group col-md-12"> <x-admin.form-editor name="description" label="{{ __('Description') }}" value="{!! old('description') !!}" required="true" /> </div> <div class="form-group col-md-12"> <x-admin.form-input id="seo_title" name="seo_title" label="{{ __('SEO Title') }}" placeholder="{{ __('SEO Title') }}" value="{{ old('seo_title') }}" /> </div> <div class="form-group col-md-12"> <x-admin.form-textarea name="seo_description" label="{{ __('SEO Description') }}" value="{{ old('seo_description') }}" /> </div> </div> </div> </div> </div> <div class="col-md-3"> <div class="card sidebar_card"> <div class="card-body"> <div class="form-group"> <x-admin.form-image-preview div_id="thumbnail-image-preview" label_id="thumbnail-image-label" input_id="thumbnail-image-upload" name="thumbnail_image" label="{{ __('Thumbnail Image') }}" required="true" /> </div> </div> </div> <div class="card sidebar_card"> <div class="card-body"> <div class="form-group"> <x-admin.form-image-preview div_id="banner-image-preview" label_id="banner-image-label" input_id="banner-image-upload" name="banner_image" label="{{ __('Banner Image') }}" required="true" /> </div> </div> </div> <div class="card"> <div class="card-header"> <h4>{{ __('Amenities') }}</h4> </div> <div class="card-body"> <div class="form-group"> @foreach ($aminities as $aminity) <div class="form-check"> <input value="{{ $aminity->id }}" name="aminities[]" class="form-check-input" type="checkbox" id="aminity_{{ $aminity->id }}"> <label class="form-check-label" for="aminity_{{ $aminity->id }}"> {{ $aminity->title }} </label> </div> @endforeach </div> </div> </div> <div class="card"> <div class="card-body"> <div class="form-group"> <label> <input type="hidden" value="0" name="is_featured" class="custom-switch-input"> <input type="checkbox" value="1" name="is_featured" class="custom-switch-input"> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Mark as Featured') }}</span> </label> </div> <div class="form-group"> <label> <input type="hidden" value="0" name="top_property" class="custom-switch-input"> <input type="checkbox" value="1" name="top_property" class="custom-switch-input"> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Mark Top Property') }}</span> </label> </div> <div class="form-group"> <label> <input type="hidden" value="0" name="urgent_property" class="custom-switch-input"> <input type="checkbox" value="1" name="urgent_property" class="custom-switch-input"> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Urgent Property') }}</span> </label> </div> <div class="form-group"> <label> <input type="hidden" value="0" name="status" class="custom-switch-input"> <input type="checkbox" value="1" name="status" class="custom-switch-input"> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Status') }}</span> </label> </div> @adminCan('property.store') <x-admin.save-button :text="__('Save')"> </x-admin.save-button> @endadminCan </div> </div> </div> </div> </div> </form> </section> </div> @endsection @push('css') <style> .sidebar_card .image-preview, #callback-preview { width: auto !important; height: 200px !important; } </style> @endpush @push('js') <script src="{{ asset('backend/js/jquery.uploadPreview.min.js') }}"></script> <script> $.uploadPreview({ input_field: "#thumbnail-image-upload", preview_box: "#thumbnail-image-preview", label_field: "#thumbnail-image-label", label_default: "{{ __('Choose Icon') }}", label_selected: "{{ __('Change Icon') }}", no_label: false, success_callback: null }); $.uploadPreview({ input_field: "#banner-image-upload", preview_box: "#banner-image-preview", label_field: "#banner-image-label", label_default: "{{ __('Choose Icon') }}", label_selected: "{{ __('Change Icon') }}", no_label: false, success_callback: null }); </script> <script> (function($) { "use strict"; $(document).ready(function() { $("#purpose").on("change", function() { var purposeId = $(this).val(); if (purposeId == 2) { $("#period_box").removeClass('d-none'); } else if (purposeId == 1) { $("#period_box").addClass('d-none'); } }); $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush resources/views/admin/property/index.blade.php 0000644 00000026352 15012234214 0015557 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Property List') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property List') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> {{-- Search filter --}} <div class="col-12"> <div class="card"> <div class="card-body p-0"> <form action="{{ route('admin.property.index') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body"> <div class="row"> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="status" id="status" class="form-select"> <x-admin.select-option value="" text="{{ __('Select Status') }}" /> <x-admin.select-option :selected="request('status') == '1'" value="1" text="{{ __('Yes') }}" /> <x-admin.select-option :selected="request('status') == '0'" value="0" text="{{ __('No') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="order_by" id="order_by" class="form-select"> <x-admin.select-option value="" text="{{ __('Order By') }}" /> <x-admin.select-option :selected="request('order_by') == '1'" value="1" text="{{ __('ASC') }}" /> <x-admin.select-option :selected="request('order_by') == '0'" value="0" text="{{ __('DESC') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="par-page" id="par-page" class="form-select"> <x-admin.select-option value="" text="{{ __('Per Page') }}" /> <x-admin.select-option :selected="request('par-page') == '5'" value="5" text="{{ __('5') }}" /> <x-admin.select-option :selected="request('par-page') == '10'" value="10" text="{{ __('10') }}" /> <x-admin.select-option :selected="request('par-page') == '25'" value="25" text="{{ __('25') }}" /> <x-admin.select-option :selected="request('par-page') == '50'" value="50" text="{{ __('50') }}" /> <x-admin.select-option :selected="request('par-page') == '100'" value="100" text="{{ __('100') }}" /> <x-admin.select-option :selected="request('par-page') == 'all'" value="all" text="{{ __('All') }}" /> </x-admin.form-select> </div> </div> </form> </div> </div> </div> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Property List')" /> <div> @adminCan('property.create') <x-admin.add-button :href="route('admin.property.create')" /> @endadminCan </div> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th width="5%">{{ __('SN') }}</th> <th width="40%">{{ __('Property') }}</th> <th width="10%">{{ __('Price') }}</th> <th width="10%">{{ __('Type') }}</th> <th width="5%">{{ __('Purpose') }}</th> <th width="5%">{{ __('Views') }}</th> <th width="5%">{{ __('Status') }}</th> <th width="20%" class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($properties as $property) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $property->title }}</td> <td>{{ currency($property->price) }}</td> <td>{{ $property->propertyType->title }}</td> <td>{{ $property->propertyPurpose->purpose }}</td> <td>{{ $property->views }}</td> <td> <input onchange="changeStatus({{ $property->id }})" id="status_toggle" type="checkbox" {{ $property->status ? 'checked' : '' }} data-toggle="toggle" data-on="{{ __('Active') }}" data-off="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> @adminCan('property.edit') <x-admin.edit-button :href="route('admin.property.edit', [ 'property' => $property->id, 'code' => getSessionLanguage(), ])" /> @endadminCan @adminCan('property.delete') <x-admin.delete-button :id="$property->id" onclick="deleteData" /> @endadminCan </div> </td> </tr> @empty @adminCan('property.create') <x-empty-table :name="__('Property')" route="admin.property.create" create="yes" :message="__('No data found!')" colspan="8"></x-empty-table> @endadminCan @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $properties->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/property/') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/property/status-update') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/admin/propertytype/edit.blade.php 0000644 00000033441 15012234214 0016274 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Edit Property type') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Edit Property Type') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property Type') => route('admin.property-type.index'), __('Edit Property Type') => '#', ]" /> <div class="section-body row"> <div class="col-12"> <div class="card"> <div class="card-header gap-3 justify-content-between align-items-center"> <h5 class="m-0">{{ __('Available Translations') }}</h5> @adminCan('property.type.translate') @if ($code !== $languages->first()->code) <x-admin.button onclick="translateAll()" id="translate-btn" :text="__('Translate')" /> @endif @endadminCan </div> <div class="card-body"> <div class="lang_list_top"> <ul class="lang_list"> @foreach ($languages as $language) <li><a id="{{ request('code') == $language->code ? 'selected-language' : '' }}" href="{{ route('admin.property-type.edit', ['property_type' => $propertyType->id, 'code' => $language->code]) }}"><i class="fas {{ request('code') == $language->code ? 'fa-eye' : 'fa-edit' }}"></i> {{ $language->name }}</a></li> @endforeach </ul> </div> <div class="mt-2 alert alert-danger" role="alert"> @php $current_language = $languages->where('code', request()->get('code'))->first(); @endphp <p>{{ __('Your editing mode') }} : <b>{{ $current_language?->name }}</b> </p> </div> </div> </div> </div> </div> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Edit Property Type') }}</h4> <div> <a href="{{ route('admin.property-type.index') }}" class="btn btn-primary"><i class="fa fa-arrow-left"></i>{{ __('Back') }}</a> </div> </div> <div class="card-body"> <form action="{{ route('admin.property-type.update', ['property_type' => $propertyType->id, 'code' => $code]) }}" method="post" enctype="multipart/form-data"> @csrf @method('PUT') <div class="row"> @if ($code == $languages->first()->code) <div class="col-md-8 offset-md-2"> <div class="form-group"> <label>{{ __('Image') }}</label> <div id="image-preview" class="image-preview" @if ($propertyType->image ?? false) style="background-image: url({{ asset($propertyType->image) }}); background-size: cover; background-position: center center;" @endif> <label for="image-upload" id="image-label">{{ __('Image') }}</label> <input type="file" name="image" id="image-upload"> </div> @error('image') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @endif <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input data-translate="true" id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title', $propertyType->getTranslation($code)->title) }}" placeholder="{{ __('Enter Title') }}" required="true"/> </div> </div> @if ($code == $languages->first()->code) <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug', $propertyType->slug) }}" required="true"/> </div> </div> <div class="col-md-8 offset-md-2"> <div class="form-group"> <label> <input type="hidden" value="0" name="status" class="custom-switch-input"> <input {{ $propertyType->status == 1 ? 'checked' : '' }} type="checkbox" value="1" name="status" class="custom-switch-input"> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Status') }}</span> </label> </div> </div> @endif @adminCan('property.type.update') <div class="text-center offset-md-2 col-md-8"> <x-admin.update-button :text="__('Update')"> </x-admin.update-button> </div> @endadminCan </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @if ($code == $languages->first()->code) @push('js') <script src="{{ asset('backend/js/jquery.uploadPreview.min.js') }}"></script> <script> $.uploadPreview({ input_field: "#image-upload", preview_box: "#image-preview", label_field: "#image-label", label_default: "{{ __('Choose Image') }}", label_selected: "{{ __('Change Image') }}", no_label: false, success_callback: null }); </script> <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush @else @push('js') <script> var isTranslatingInputs = true; function translateOneByOne(inputs, index = 0) { if (index >= inputs.length) { if (isTranslatingInputs) { isTranslatingInputs = false; translateAllTextarea(); } $('#translate-btn').prop('disabled', false); $('#update-btn').prop('disabled', false); return; } var $input = $(inputs[index]); var inputValue = $input.val(); if (inputValue) { $.ajax({ url: "{{ route('admin.languages.update.single') }}", type: "POST", data: { lang: '{{ $code }}', text: inputValue, _token: '{{ csrf_token() }}' }, dataType: 'json', beforeSend: function() { $input.prop('disabled', true); iziToast.show({ timeout: false, close: true, theme: 'dark', icon: 'loader', iconUrl: 'https://hub.izmirnic.com/Files/Images/loading.gif', title: "{{ __('Translation Processing, please wait...') }}", position: 'center', }); }, success: function(response) { $input.val(response); $input.prop('disabled', false); iziToast.destroy(); toastr.success("{{ __('Translated Successfully!') }}"); translateOneByOne(inputs, index + 1); }, error: function(jqXHR, textStatus, errorThrown) { console.error(textStatus, errorThrown); iziToast.destroy(); toastr.error('Error', 'Error'); } }); } else { translateOneByOne(inputs, index + 1); } } function translateAll() { iziToast.question({ timeout: 20000, close: false, overlay: true, displayMode: 'once', id: 'question', zindex: 999, title: "{{ __('This will take a while!') }}", message: "{{ __('Are you sure?') }}", position: 'center', buttons: [ ["<button><b>{{ __('YES') }}</b></button>", function(instance, toast) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $('#translate-btn').prop('disabled', true); $('#update-btn').prop('disabled', true); instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); var inputs = $('input[data-translate="true"]').toArray(); translateOneByOne(inputs); }, true], ["<button>{{ __('NO') }}</button>", function(instance, toast) { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); }], ], onClosing: function(instance, toast, closedBy) {}, onClosed: function(instance, toast, closedBy) {} }); }; function translateAllTextarea() { var inputs = $('textarea[data-translate="true"]').toArray(); if (inputs.length === 0) { return; } translateOneByOne(inputs); } $(document).ready(function() { var selectedTranslation = $('#selected-language').text(); var btnText = "{{ __('Translate to') }}" + selectedTranslation; $('#translate-btn').text(btnText); }); </script> @endpush @endif resources/views/admin/propertytype/create.blade.php 0000644 00000013317 15012234214 0016612 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Create Property Type') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Create Property Type') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property Type') => route('admin.property-type.index'), __('Create Property Type') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Create Property Type')" /> <div> <x-admin.back-button :href="route('admin.property-type.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.property-type.store') }}" method="post" enctype="multipart/form-data"> @csrf <div class="row"> <div class="col-md-8 offset-md-2"> <div class="form-group"> <label>{{ __('Image') }}<span class="text-danger">*</span></label> <div id="image-preview" class="image-preview"> <label for="image-upload" id="image-label">{{ __('Image') }}</label> <input type="file" name="image" id="image-upload"> </div> @error('image') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title') }}" required="true"/> </div> </div> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug') }}" required="true" /> </div> </div> <div class="form-group col-md-8 offset-md-2"> <div class="form-group"> <label> <input type="hidden" value="0" name="status" class="custom-switch-input"> <input type="checkbox" value="1" name="status" class="custom-switch-input" {{ old('status') == 1 ? 'checked' : '' }}> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Status') }}</span> </label> </div> </div> @adminCan('property.type.store') <div class="text-center offset-md-2 col-md-8"> <x-admin.save-button :text="__('Save')"> </x-admin.save-button> </div> @endadminCan </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @push('js') <script src="{{ asset('backend/js/jquery.uploadPreview.min.js') }}"></script> <script> $.uploadPreview({ input_field: "#image-upload", preview_box: "#image-preview", label_field: "#image-label", label_default: "{{ __('Choose Image') }}", label_selected: "{{ __('Change Image') }}", no_label: false, success_callback: null }); </script> <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush resources/views/admin/propertytype/index.blade.php 0000644 00000027074 15012234214 0016463 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Property Type') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Property Type') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Property Type') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> {{-- Search filter --}} <div class="col-12"> <div class="card"> <div class="card-body p-0"> <form action="{{ route('admin.property-type.index') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body"> <div class="row"> <div class="col-lg-4 col-md-6 form-group mb-3"> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-lg-4 col-md-6 form-group mb-3"> <x-admin.form-select name="show_homepage" id="show_homepage" class="form-select"> <x-admin.select-option value="" text="{{ __('Show Homepage') }}" /> <x-admin.select-option :selected="request('show_homepage') == '1'" value="1" text="{{ __('Yes') }}" /> <x-admin.select-option :selected="request('show_homepage') == '0'" value="0" text="{{ __('No') }}" /> </x-admin.form-select> </div> <div class="col-lg-4 col-md-6 form-group mb-3"> <x-admin.form-select name="status" id="status" class="form-select"> <x-admin.select-option value="" text="{{ __('Select Status') }}" /> <x-admin.select-option :selected="request('status') == '1'" value="1" text="{{ __('Yes') }}" /> <x-admin.select-option :selected="request('status') == '0'" value="0" text="{{ __('No') }}" /> </x-admin.form-select> </div> <div class="col-lg-4 col-md-6 form-group mb-3 mb-md-0"> <x-admin.form-select name="order_by" id="order_by" class="form-select"> <x-admin.select-option value="" text="{{ __('Order By') }}" /> <x-admin.select-option :selected="request('order_by') == '1'" value="1" text="{{ __('ASC') }}" /> <x-admin.select-option :selected="request('order_by') == '0'" value="0" text="{{ __('DESC') }}" /> </x-admin.form-select> </div> <div class="col-lg-4 col-md-6 form-group mb-3 mb-md-0"> <x-admin.form-select name="par-page" id="par-page" class="form-select"> <x-admin.select-option value="" text="{{ __('Per Page') }}" /> <x-admin.select-option :selected="request('par-page') == '5'" value="5" text="{{ __('5') }}" /> <x-admin.select-option :selected="request('par-page') == '10'" value="10" text="{{ __('10') }}" /> <x-admin.select-option :selected="request('par-page') == '25'" value="25" text="{{ __('25') }}" /> <x-admin.select-option :selected="request('par-page') == '50'" value="50" text="{{ __('50') }}" /> <x-admin.select-option :selected="request('par-page') == '100'" value="100" text="{{ __('100') }}" /> <x-admin.select-option :selected="request('par-page') == 'all'" value="all" text="{{ __('All') }}" /> </x-admin.form-select> </div> </div> </form> </div> </div> </div> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Property Type')" /> <div> @adminCan('property.type.create') <x-admin.add-button :href="route('admin.property-type.create')" /> @endadminCan </div> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th width="5%">{{ __('SN') }}</th> <th width="25%">{{ __('Title') }}</th> <th width="15%">{{ __('Status') }}</th> <th width="15%" class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($propertyTypes as $propertyType) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $propertyType->title }}</td> <td> <input onchange="changeStatus({{ $propertyType->id }})" id="status_toggle" type="checkbox" {{ $propertyType->status ? 'checked' : '' }} data-toggle="toggle" data-on="{{ __('Active') }}" data-off="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> @adminCan('property.type.edit') <x-admin.edit-button :href="route('admin.property-type.edit', [ 'property_type' => $propertyType->id, 'code' => getSessionLanguage(), ])" /> @endadminCan @adminCan('property.type.delete') <x-admin.delete-button :id="$propertyType->id" onclick="deleteData" /> @endadminCan </div> </td> </tr> @empty @adminCan('property.type.create') <x-empty-table :name="__('Property Type')" route="admin.property-type.create" create="yes" :message="__('No data found!')" colspan="6"></x-empty-table> @endadminCan @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $propertyTypes->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/property-type/') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/property-type/status-update') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/admin/aminity/edit.blade.php 0000644 00000025463 15012234214 0015165 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Edit Amenity') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Edit Amenity') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Amenity') => route('admin.amenity.index'), __('Edit Amenity') => '#', ]" /> <div class="section-body row"> <div class="col-12"> <div class="card"> <div class="card-header gap-3 justify-content-between align-items-center"> <h5 class="m-0 service_card">{{ __('Available Translations') }}</h5> @adminCan('property.amenity.translate') @if ($code !== $languages->first()->code) <x-admin.button onclick="translateAll()" id="translate-btn" :text="__('Translate')" /> @endif @endadminCan </div> <div class="card-body"> <div class="lang_list_top"> <ul class="lang_list"> @foreach ($languages as $language) <li><a id="{{ request('code') == $language->code ? 'selected-language' : '' }}" href="{{ route('admin.amenity.edit', ['amenity' => $aminity->id, 'code' => $language->code]) }}"><i class="fas {{ request('code') == $language->code ? 'fa-eye' : 'fa-edit' }}"></i> {{ $language->name }}</a></li> @endforeach </ul> </div> <div class="mt-2 alert alert-danger" role="alert"> @php $current_language = $languages->where('code', request()->get('code'))->first(); @endphp <p>{{ __('Your editing mode') }} : <b>{{ $current_language?->name }}</b> </p> </div> </div> </div> </div> </div> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <h4>{{ __('Edit Amenity') }}</h4> <div> <x-admin.back-button :href="route('admin.amenity.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.amenity.update', ['amenity' => $aminity->id, 'code' => $code]) }}" method="post"> @csrf @method('PUT') <div class="row"> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input data-translate="true" id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title', $aminity->getTranslation($code)->title) }}" placeholder="{{ __('Enter Title') }}" required="true"/> </div> </div> @if ($code == $languages->first()->code) <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug', $aminity->slug) }}" required="true"/> </div> </div> @endif @adminCan('property.amenity.update') <div class="text-center offset-md-2 col-md-8"> <x-admin.update-button :text="__('Update')"> </x-admin.update-button> </div> @endadminCan </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @if ($code == $languages->first()->code) @push('js') <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush @else @push('js') <script> var isTranslatingInputs = true; function translateOneByOne(inputs, index = 0) { if (index >= inputs.length) { if (isTranslatingInputs) { isTranslatingInputs = false; translateAllTextarea(); } $('#translate-btn').prop('disabled', false); $('#update-btn').prop('disabled', false); return; } var $input = $(inputs[index]); var inputValue = $input.val(); if (inputValue) { $.ajax({ url: "{{ route('admin.languages.update.single') }}", type: "POST", data: { lang: '{{ $code }}', text: inputValue, _token: '{{ csrf_token() }}' }, dataType: 'json', beforeSend: function() { $input.prop('disabled', true); iziToast.show({ timeout: false, close: true, theme: 'dark', icon: 'loader', iconUrl: 'https://hub.izmirnic.com/Files/Images/loading.gif', title: "{{ __('Translation Processing, please wait...') }}", position: 'center', }); }, success: function(response) { $input.val(response); $input.prop('disabled', false); iziToast.destroy(); toastr.success("{{ __('Translated Successfully!') }}"); translateOneByOne(inputs, index + 1); }, error: function(jqXHR, textStatus, errorThrown) { console.error(textStatus, errorThrown); iziToast.destroy(); toastr.error('Error', 'Error'); } }); } else { translateOneByOne(inputs, index + 1); } } function translateAll() { iziToast.question({ timeout: 20000, close: false, overlay: true, displayMode: 'once', id: 'question', zindex: 999, title: "{{ __('This will take a while!') }}", message: "{{ __('Are you sure?') }}", position: 'center', buttons: [ ["<button><b>{{ __('YES') }}</b></button>", function(instance, toast) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $('#translate-btn').prop('disabled', true); $('#update-btn').prop('disabled', true); instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); var inputs = $('input[data-translate="true"]').toArray(); translateOneByOne(inputs); }, true], ["<button>{{ __('NO') }}</button>", function(instance, toast) { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); }], ], onClosing: function(instance, toast, closedBy) {}, onClosed: function(instance, toast, closedBy) {} }); }; function translateAllTextarea() { var inputs = $('textarea[data-translate="true"]').toArray(); if (inputs.length === 0) { return; } translateOneByOne(inputs); } $(document).ready(function() { var selectedTranslation = $('#selected-language').text(); var btnText = "{{ __('Translate to') }}" + selectedTranslation; $('#translate-btn').text(btnText); }); </script> @endpush @endif resources/views/admin/aminity/create.blade.php 0000644 00000006521 15012234214 0015475 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Create Amenity') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Create Amenity') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Amenity') => route('admin.amenity.index'), __('Create Amenity') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Create Amenity')" /> <div> <x-admin.back-button :href="route('admin.amenity.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.amenity.store') }}" method="post"> @csrf <div class="row"> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title') }}" required="true"/> </div> </div> <div class="col-md-8 offset-md-2"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug') }}" required="true" /> </div> </div> @adminCan('property.amenity.store') <div class="text-center offset-md-2 col-md-8"> <x-admin.save-button :text="__('Save')"> </x-admin.save-button> </div> @endadminCan </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @push('js') <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("keyup", function(e) { $("#slug").val(convertToSlug($(this).val())); }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush resources/views/admin/aminity/index.blade.php 0000644 00000024756 15012234214 0015353 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Amenity List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Amenity List') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Amenity List') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> {{-- Search filter --}} <div class="col-12"> <div class="card"> <div class="card-body p-0"> <form action="{{ route('admin.amenity.index') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body"> <div class="row"> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="status" id="status" class="form-select"> <x-admin.select-option value="" text="{{ __('Select Status') }}" /> <x-admin.select-option :selected="request('status') == '1'" value="1" text="{{ __('Yes') }}" /> <x-admin.select-option :selected="request('status') == '0'" value="0" text="{{ __('No') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="order_by" id="order_by" class="form-select"> <x-admin.select-option value="" text="{{ __('Order By') }}" /> <x-admin.select-option :selected="request('order_by') == '1'" value="1" text="{{ __('ASC') }}" /> <x-admin.select-option :selected="request('order_by') == '0'" value="0" text="{{ __('DESC') }}" /> </x-admin.form-select> </div> <div class="col-md-3 form-group mb-3 mb-md-0"> <x-admin.form-select name="par-page" id="par-page" class="form-select"> <x-admin.select-option value="" text="{{ __('Per Page') }}" /> <x-admin.select-option :selected="request('par-page') == '5'" value="5" text="{{ __('5') }}" /> <x-admin.select-option :selected="request('par-page') == '10'" value="10" text="{{ __('10') }}" /> <x-admin.select-option :selected="request('par-page') == '25'" value="25" text="{{ __('25') }}" /> <x-admin.select-option :selected="request('par-page') == '50'" value="50" text="{{ __('50') }}" /> <x-admin.select-option :selected="request('par-page') == '100'" value="100" text="{{ __('100') }}" /> <x-admin.select-option :selected="request('par-page') == 'all'" value="all" text="{{ __('All') }}" /> </x-admin.form-select> </div> </div> </form> </div> </div> </div> <div class="col-12"> <div class="card"> <div class="card-header d-flex justify-content-between"> <x-admin.form-title :text="__('Amenity List')" /> <div> @adminCan('property.amenity.create') <x-admin.add-button :href="route('admin.amenity.create')" /> @endadminCan </div> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th>{{ __('SN') }}</th> <th>{{ __('Title') }}</th> <th>{{ __('Status') }}</th> <th class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($aminities as $aminity) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $aminity->title }}</td> <td> <input onchange="changeStatus({{ $aminity->id }})" id="status_toggle" type="checkbox" {{ $aminity->status ? 'checked' : '' }} data-toggle="toggle" data-on="{{ __('Active') }}" data-off="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> @adminCan('property.amenity.edit') <x-admin.edit-button :href="route('admin.amenity.edit', [ 'amenity' => $aminity->id, 'code' => getSessionLanguage(), ])" /> @endadminCan @adminCan('property.amenity.delete') <x-admin.delete-button :id="$aminity->id" onclick="deleteData" /> @endadminCan </div> </td> </tr> @empty @adminCan('property.amenity.create') <x-empty-table :name="__('Amenity')" route="admin.amenity.create" create="yes" :message="__('No data found!')" colspan="5"></x-empty-table> @endadminCan @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $aminities->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/amenity/') }}' + "/" + id) } function changeStatus(id) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { toastr.error("{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $.ajax({ type: "put", data: { _token: '{{ csrf_token() }}', }, url: "{{ url('/admin/aminity/status-update') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.message); } else { toastr.warning(response.message); } }, error: function(err) { handleFetchError(err); } }) } </script> @endpush @push('css') <style> .dd-custom-css { position: absolute; will-change: transform; top: 0px; left: 0px; transform: translate3d(0px, -131px, 0px); } .max-h-400 { min-height: 400px; } </style> @endpush resources/views/user/review/review.blade.php 0000644 00000007040 15012234214 0015245 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('My Reviews') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <div class="wsus__dash_riview"> <h4 class="heading">{{ __('My Reviews') }}</h4> <div class="row"> <div class="col-xl-12"> <div class="wsus__dash_info p_25 pb_0 pt_0 xs_pl_15 xs_pr_15"> @foreach ($myReviews as $review) <div class="wsus__message_single"> <div class="wsus__message_img"> <img src="{{ url($review->property->thumbnail_image) }}" alt="img" class="img-fluid"> </div> <div class="wsus__message_text"> @php $avg = $review->avarage_rating; $intAvg = intval($avg); $nextVal = $intAvg + 1; $reviewPoint = $intAvg; $halfReview = false; if ($intAvg < $avg && $avg < $nextVal) { $reviewPoint = $intAvg + 0.5; $halfReview = true; } @endphp <p> @for ($i = 1; $i <= 5; $i++) @if ($i <= $reviewPoint) <i class="fas fa-star"></i> @elseif ($i > $reviewPoint) @if ($halfReview == true) <i class="fas fa-star-half-alt"></i> @php $halfReview = false; @endphp @else <i class="fal fa-star"></i> @endif @endif @endfor </p> <a href="{{ route('property.details', $review->property->slug) }}" class="ttile">{{ $review->property->title }}</a> <span>{{ $review->created_at->format('d M Y') }}</span> <p>{{ $review->comment }}</p> </div> <div class="wsus__message_icon"> <a class="del" href="{{ route('user.delete-review', $review->id) }}"><i class="fas fa-trash"></i></a> <a class="edit" href="{{ route('user.edit-review', $review->id) }}"><i class="fal fa-edit"></i></a> </div> </div> @endforeach </div> {{ $myReviews->links('custom_paginator') }} </div> </div> </div> </div> @endsection resources/views/user/review/client-review.blade.php 0000644 00000007244 15012234214 0016527 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('Client Reviews') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <div class="wsus__dash_riview"> <h4 class="heading">{{ __('Client Reviews') }}</h4> <div class="row"> <div class="col-xl-12"> <div class="wsus__dash_info client_message p_25 pb_0 pt_0 xs_pl_15 xs_pr_15"> @foreach ($clientReviews as $review) <div class="wsus__message_single"> <div class="wsus__message_img"> <img src="{{ $review->user->image ? asset($review->user->image) : asset($setting->default_avater) }}" alt="img" class="img-fluid"> </div> <div class="wsus__message_text"> @php $avg = $review->avarage_rating; $intAvg = intval($avg); $nextVal = $intAvg + 1; $reviewPoint = $intAvg; $halfReview = false; if ($intAvg < $avg && $avg < $nextVal) { $reviewPoint = $intAvg + 0.5; $halfReview = true; } @endphp <p> @for ($i = 1; $i <= 5; $i++) @if ($i <= $reviewPoint) <i class="fas fa-star"></i> @elseif ($i > $reviewPoint) @if ($halfReview == true) <i class="fas fa-star-half-alt"></i> @php $halfReview = false; @endphp @else <i class="fal fa-star"></i> @endif @endif @endfor </p> <a href="{{ route('agent.show', ['user_type' => '2', 'user_name' => $review->user->user_name]) }}" class="ttile">{{ $review->name }}</a> <span>{{ $review->created_at->format('d M Y') }}</span> <a href="{{ route('property.details', $review->slug) }}" class="sub_title">{{ $review->title }}</a> <p>{{ $review->comment }}</p> </div> <div class="wsus__message_icon"> <a class="edit" href="{{ route('property.details', $review->slug) }}"><i class="far fa-eye"></i></a> </div> </div> @endforeach </div> {{ $clientReviews->links('custom_paginator') }} </div> </div> </div> </div> @endsection resources/views/user/review/review-edit.blade.php 0000644 00000022331 15012234214 0016170 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('My Reviews') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <div class="wsus__dash_riview"> <h4 class="heading">{{ __('Edit Review') }}</h4> <div class="wsus__dash_info details_review p_25"> <form action="{{ route('user.update-review', $review->id) }}" method="POST"> @csrf <div class="row"> <div class="col-xl-7 col-md-6"> <div class="wsus__select_review"> <ul> <li><span>{{ __('Service') }} :</span> @for ($i = 1; $i <= 5; $i++) @if ($i <= $review->service_rating) <i class="service_rat fas fa-star" data-service_rating="{{ $i }}" onclick="serviceReview({{ $i }})"></i> @else <i class="service_rat fal fa-star" data-service_rating="{{ $i }}" onclick="serviceReview({{ $i }})"></i> @endif @endfor </li> <li><span>{{ __('Location') }} :</span> @for ($i = 1; $i <= 5; $i++) @if ($i <= $review->location_rating) <i class="location_rat fas fa-star" data-location_rating="{{ $i }}" onclick="locationReview({{ $i }})"></i> @else <i class="location_rat fal fa-star" data-location_rating="{{ $i }}" onclick="locationReview({{ $i }})"></i> @endif @endfor </li> <li><span>{{ __('Value for Money') }} :</span> @for ($i = 1; $i <= 5; $i++) @if ($i <= $review->money_rating) <i class="money_rat fas fa-star" data-money_rating="{{ $i }}" onclick="moneyReview({{ $i }})"></i> @else <i class="money_rat fal fa-star" data-money_rating="{{ $i }}" onclick="moneyReview({{ $i }})"></i> @endif @endfor </li> <li><span>{{ __('Cleanliness') }} :</span> @for ($i = 1; $i <= 5; $i++) @if ($i <= $review->clean_rating) <i class="clean_rat fas fa-star" data-clean_rating="{{ $i }}" onclick="cleanReview({{ $i }})"></i> @else <i class="clean_rat fal fa-star" data-clean_rating="{{ $i }}" onclick="cleanReview({{ $i }})"></i> @endif @endfor </li> </ul> </div> </div> <div class="col-xl-5 col-md-6"> <div class="wsus__total_rating"> <h3 id="avg_rating">{{ $review->avarage_rating }}</h3> <p>{{ __('Average Rating') }}</p> </div> </div> <input type="hidden" name="service_rating" id="service_rating" value="{{ $review->service_rating }}"> <input type="hidden" name="location_rating" id="location_rating" value="{{ $review->location_rating }}"> <input type="hidden" name="money_rating" id="money_rating" value="{{ $review->money_rating }}"> <input type="hidden" name="clean_rating" id="clean_rating" value="{{ $review->clean_rating }}"> <input type="hidden" name="avarage_rating" id="avarage_rating" value="{{ $review->avarage_rating }}"> <input type="hidden" name="property_id" id="property_id" value="{{ $review->property->id }}"> <div class="col-12"> <textarea cols="3" rows="5" name="comment">{{ $review->comment }}</textarea> <button type="submit" class="common_btn">{{ __('Update') }}</button> </div> </div> </form> </div> </div> </div> <script> function serviceReview(rating) { $("#service_rating").val(rating); $(".service_rat").each(function() { var service_rat = $(this).data('service_rating') if (service_rat > rating) { $(this).removeClass('fas fa-star').addClass('fal fa-star'); } else { $(this).removeClass('fal fa-star').addClass('fas fa-star'); } }) var service_rating = $("#service_rating").val(); var location_rating = $("#location_rating").val(); var money_rating = $("#money_rating").val(); var clean_rating = $("#clean_rating").val(); var avg = (service_rating * 1) + (location_rating * 1) + (money_rating * 1) + (clean_rating * 1); avg = avg / 4; $("#avarage_rating").val(avg); $("#avg_rating").text(avg) } function locationReview(rating) { $("#location_rating").val(rating); $(".location_rat").each(function() { var location_rat = $(this).data('location_rating') if (location_rat > rating) { $(this).removeClass('fas fa-star').addClass('fal fa-star'); } else { $(this).removeClass('fal fa-star').addClass('fas fa-star'); } }) var service_rating = $("#service_rating").val(); var location_rating = $("#location_rating").val(); var money_rating = $("#money_rating").val(); var clean_rating = $("#clean_rating").val(); var avg = (service_rating * 1) + (location_rating * 1) + (money_rating * 1) + (clean_rating * 1); avg = avg / 4; $("#avarage_rating").val(avg); $("#avg_rating").text(avg) } function moneyReview(rating) { $("#money_rating").val(rating); $(".money_rat").each(function() { var money_rat = $(this).data('money_rating') if (money_rat > rating) { $(this).removeClass('fas fa-star').addClass('fal fa-star'); } else { $(this).removeClass('fal fa-star').addClass('fas fa-star'); } }) var service_rating = $("#service_rating").val(); var location_rating = $("#location_rating").val(); var money_rating = $("#money_rating").val(); var clean_rating = $("#clean_rating").val(); var avg = (service_rating * 1) + (location_rating * 1) + (money_rating * 1) + (clean_rating * 1); avg = avg / 4; $("#avarage_rating").val(avg); $("#avg_rating").text(avg) } function cleanReview(rating) { $("#clean_rating").val(rating); $(".clean_rat").each(function() { var clean_rat = $(this).data('clean_rating') if (clean_rat > rating) { $(this).removeClass('fas fa-star').addClass('fal fa-star'); } else { $(this).removeClass('fal fa-star').addClass('fas fa-star'); } }) var service_rating = $("#service_rating").val(); var location_rating = $("#location_rating").val(); var money_rating = $("#money_rating").val(); var clean_rating = $("#clean_rating").val(); var avg = (service_rating * 1) + (location_rating * 1) + (money_rating * 1) + (clean_rating * 1); avg = avg / 4; $("#avarage_rating").val(avg); $("#avg_rating").text(avg) } </script> @endsection resources/views/user/property/nearestlocation.blade.php 0000644 00000010552 15012234214 0017523 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('Property Nearest Location') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <h4 class="heading">{{ __('Nearest Location') }} <a href="{{ route('user.property.edit', ['property' => $property->id, 'code' => allLanguages()->first()->code]) }}" class="btn btn-success custom-create-property"><i class="fa fa-arrow-left"></i>{{ __('Back Property Page') }}</a></h4> <div class="card"> <div class="card-body"> <form method="post" action="{{ route('user.upload-nearest-location', $property->id) }}" enctype="multipart/form-data"> @csrf <div class="row"> <div class="col-md-12"> <div class="wsus__property_input"> <label for="">{{ __('Nearest Location') }} <span class="text-danger">*</span></label> <select name="nearest_place_id" class="form-control select_2" id=""> <option value="">{{ __('Select Location') }}</option> @foreach ($locations as $location) <option value="{{ $location->id }}">{{ $location->title }}</option> @endforeach </select> @error('nearest_place_id') <span class="text-danger">{{ $message }}</span> @enderror </div> <div class="wsus__property_input"> <label for="">{{ __('Distance') }} <span data-toggle="tooltip" data-placement="top" class="fa fa-info-circle text--primary" title="{{ __('KM') }}"> <span class="text-danger">*</span></label> <input type="text" class="form-control" name="distance"> @error('distance') <span class="text-danger">{{ $message }}</span> @enderror </div> <div class="wsus__property_input"> <x-admin.save-button :text="__('Save')"></x-admin.save-button> </div> </div> </div> </form> </div> </div> <div class="wsus__my_property mt-4"> <div class="table-responsive"> <table class="table"> <tr class="d-flex"> <th class="image slider_image"> <p>{{ __('Serial') }}</p> </th> <th class="title slider_image"> <p>{{ __('Location') }}</p> </th> <th class="view slider_image"> <p>{{ __('Distance') }}</p> </th> <th class="actions slider_image"> <p>{{ __('Action') }}</p> </th> </tr> @forelse ($nearest_locations as $item) <tr class="d-flex"> <td class="image slider_image"> {{ $loop->index + 1 }} </td> <td class="title slider_image"> {{ $item->nearestLocation->title }} </td> <td class="view slider_image"> {{ $item->distance }} </td> <td class="actions slider_image"> <a class="text-danger" href="{{ route('user.delete-nearest-location', $item->id) }}" onclick="return confirm('are you sure?')"><i class="far fa-trash-alt "></i></a> </td> </tr> @endforeach </table> </div> </div> </div> @endsection resources/views/user/property/edit.blade.php 0000644 00000127300 15012234214 0015256 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('Edit Property') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <!-- language --> <div class="card my-4"> <div class="card-header py-3"> <h6 class="m-0 font-weight-bold text-primary">{{ __('Languages') }}</h6> </div> <div class="card-body"> <div class="lang_list_top"> <ul class="lang_list"> @foreach ($languages = allLanguages() as $language) <li> <a id="{{ request('code') == $language->code ? 'selected-language' : '' }}" href="{{ route('user.property.edit', ['property' => $property->id, 'code' => $language->code]) }}"><i class="fas {{ request('code') == $language->code ? 'fa-eye' : 'fa-edit' }}"></i> {{ $language->name }}</a> </li> @endforeach </ul> @if ($code !== $languages->first()->code) <button onclick="translateAll()" class="btn btn-sm btn-primary float-right" id="translate-btn">{{ __('Translate') }}</button> @endif </div> <div class="alert alert-danger" role="alert"> @php $current_language = $languages->where('code', request()->get('code'))->first(); @endphp <p>{{ __('Your editing mode') }} : <b>{{ $current_language?->name }}</b></p> </div> </div> </div> <form action="{{ route('user.property.update', $property->id) }}" method="POST" enctype="multipart/form-data"> @csrf @method('PUT') <input type="hidden" name="code" value="{{ $code }}"> <div class="wsus__add_property"> <h4 class="heading">{{ __('Edit Property') }} <a class="common_btn" href="{{ route('user.property-slider', $property->id) }}" title="Manage Slider"><i class="fa fa-images"></i> {{ __('Manage Slider') }}</a> <a class="common_btn" href="{{ route('user.property-nearest-location', $property->id) }}" title="Nearest Location"><i class="fas fa-map-marker-alt"></i> {{ __('Manage Nearest Location') }}</a> <a href="{{ route('user.property.index') }}" class="common_btn"><i class="fal fa-plus-octagon"></i> {{ __('All Properties') }}</a> </h4> <div class="wsus__dash_info p_25"> <div class="row"> <h5 class="sub_heading">{{ __('Basic Information') }}</h5> <div class="col-12 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Title') }} <span class="text-danger">*</span></label> <input type="text" data-translate="true" name="title" id="title" value="{{ $property->getTranslation($code)->title }}"> @error('title') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @if ($code == $languages->first()->code) <div class="col-12 col-md-6"> <div class="wsus__property_input"> <label for="#" for="slug">{{ __('Slug') }}<span class="text-danger">*</span></label> <input type="text" name="slug" id="slug" value="{{ $property->slug }}"> </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Property Type') }} <span class="text-danger">*</span></label> <select class="select_2" name="property_type_id" id="property_type"> <option value="">{{ __('Select Property Type') }}</option> @foreach ($propertyTypes as $propertyType) <option {{ $property->property_type_id == $propertyType->id ? 'selected' : '' }} value="{{ $propertyType->id }}"> {{ $propertyType->translation?->title }} </option> @endforeach </select> @error('property_type_id') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('City') }} <span class="text-danger">*</span></label> <select class="select_2" name="city_id"> <option value="">{{ __('Select City') }}</option> @foreach ($cities as $city) <option {{ $property->city_id == $city->id ? 'selected' : '' }} value="{{ $city->id }}"> {{ $city->title . ', ' . $city->countryState->title . ', ' . $city->countryState->country->title }} </option> @endforeach </select> @error('city_id') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @endif <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Address') }} <span class="text-danger">*</span></label> <input type="text" data-translate="true" name="address" value="{{ $property->getTranslation($code)->address }}"> @error('address') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @if ($code == $languages->first()->code) <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Phone') }}</label> <input type="text" name="phone" value="{{ $property->phone }}"> @error('phone') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Email') }} <span class="text-danger">*</span></label> <input type="email" name="email" value="{{ $property->email }}"> @error('email') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Website') }}</label> <input type="url" name="website" value="{{ $property->website }}"> @error('website') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Purpose') }} <span class="text-danger">*</span></label> <select class="select_2" name="property_purpose_id" id="purpose"> @foreach ($purposes as $purpose) <option {{ $property->property_purpose_id == $purpose->id ? 'selected' : '' }} value="{{ $purpose->id }}"> {{ $purpose->translation?->title }} </option> @endforeach </select> @error('property_purpose_id') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Price') }} <span class="text-danger">*</span></label> <input type="text" name="price" value="{{ $property->price }}"> @error('price') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @if ($property->property_purpose_id == 2) <div class="col-xl-6 col-md-6" id="period_box"> <div class="wsus__property_input"> <select class="select_2" name="period" id="period"> <option {{ $property->period == 'Daily' ? 'selected' : '' }} value="Daily"> {{ __('Daily') }}</option> <option {{ $property->period == 'Monthly' ? 'selected' : '' }} value="Monthly">{{ __('Monthly') }}</option> <option {{ $property->period == 'Yearly' ? 'selected' : '' }} value="Yearly"> {{ __('Yearly') }}</option> </select> @error('period') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @endif @if ($property->property_purpose_id == 1) <div class="col-xl-6 col-md-6 d-none" id="period_box"> <div class="wsus__property_input"> <select class="select_2" name="period" id="period"> <option {{ $property->period == 'Daily' ? 'selected' : '' }} value="Daily"> {{ __('Daily') }}</option> <option {{ $property->period == 'Monthly' ? 'selected' : '' }} value="Monthly">{{ __('Monthly') }}</option> <option {{ $property->period == 'Yearly' ? 'selected' : '' }} value="Yearly"> {{ __('Yearly') }}</option> </select> @error('period') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> @endif @endif </div> </div> @if ($code == $languages->first()->code) <div class="wsus__dash_info p_25 mt_25"> <div class="row"> <h5 class="sub_heading">{{ __('Others Information') }}</h5> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Area') }}({{ __('Square Feet') }}) <span class="text-danger">*</span></label> <input type="text" name="area" value="{{ $property->area }}"> @error('area') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Unit') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_unit" value="{{ $property->number_of_unit }}"> @error('number_of_unit') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Room') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_room" value="{{ $property->number_of_room }}"> @error('number_of_room') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Bedroom') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_bedroom" value="{{ $property->number_of_bedroom }}"> @error('number_of_bedroom') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Bathroom') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_bathroom" value="{{ $property->number_of_bathroom }}"> @error('number_of_bathroom') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Floor') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_floor" value="{{ $property->number_of_floor }}"> @error('number_of_floor') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Kitchen') }}</label> <input type="text" name="number_of_kitchen" value="{{ $property->number_of_kitchen }}"> @error('number_of_kitchen') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Parking Place') }}</label> <input type="text" name="number_of_parking" value="{{ $property->number_of_parking }}"> @error('number_of_parking') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> </div> </div> <div class="wsus__dash_info existing_item p_25 mt_25"> <div class="row justify-content-between"> <h5 class="sub_heading">{{ __('Image, PDF And Video') }}</h5> @if ($property->pdf_file) <div class="col-xl-6 col-xxl-5 col-md-6 pdf-file-col-{{ $property->id }}"> <div class="wsus__property_input file"> <label for="file">{{ __('Existing PDF') }}</label> <div class="my-2"> <a href="javascript:;" id="downloadLink" class="text-danger">{{ __('Download Existing File') }}</a> <a onclick="deletePdfFile('{{ $property->id }}')" href="javascript:;" class="text-danger custom-delete-icon"><i class="fa fa-trash " aria-hidden="true"></i> </a> </div> </div> </div> @endif <div class="col-xl-12 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('PDF File') }}</label> <input type="file" name="pdf_file"> @error('pdf_file') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label>{{ __('Existing Banner') }}</label> <img src="{{ asset($property->banner_image) }}" alt="property" class="img-fluid w-100"> <label for="#">{{ __('Banner Image') }}</label> <input type="file" name="banner_image"> @error('banner_image') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label>{{ __('Existing Thumbnail') }}</label> <img src="{{ asset($property->thumbnail_image) }}" alt="property" class="img-fluid w-100"> <label for="#">{{ __('New Thumbnail Image') }}</label> <input type="file" name="thumbnail_image"> @error('thumbnail_image') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> @if ($property->video_link) <label>{{ __('Existing Video') }}</label> <iframe width="560" height="315" src="https://www.youtube.com/embed/{{ $property->video_link }}" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> @endif <label class="mt-2" for="#">{{ __('Youtube Video Id') }}</label> <input type="text" name="video_link" value="{{ $property->video_link }}"> </div> </div> </div> </div> <div class="wsus__dash_info dash_aminities p_25 mt_25 pb_0"> <h5 class="sub_heading">{{ __('Amenities') }}</h5> <div class="row"> @foreach ($aminities as $aminity) @php $isChecked = false; $propertyAminities = Modules\Property\app\Models\PropertyAminity::where( 'property_id', $property->id, )->get(); @endphp @foreach ($propertyAminities as $amnty) @if ($aminity->id == $amnty->aminity_id) @php $isChecked = true; @endphp @endif @endforeach <div class="col-xl-4 col-sm-6 col-md-6 col-lg-4"> <div class="form-check"> <input class="form-check-input is-check" {{ $isChecked ? 'checked' : '' }} type="checkbox" name="aminities[]" id="aminityId-{{ $aminity->id }}" value="{{ $aminity->id }}"> <label class="form-check-label" for="aminityId-{{ $aminity->id }}"> {{ $aminity->translation?->title }} </label> </div> </div> @endforeach </div> </div> @php $aminityList = []; foreach ($aminities as $index => $aminity) { $aminityList[] = $aminity->id; } @endphp @endif <div class="wsus__dash_info pro_det_map p_25 mt_25"> @if ($code == $languages->first()->code) <h5 class="sub_heading">{{ __('Property Details And Google Map') }} </h5> @else <h5 class="sub_heading">{{ __('Property Details') }} </h5> @endif @if ($code == $languages->first()->code) <div class="wsus__property_input"> <label for="#">{{ __('Google Map Code') }}</label> <textarea cols="3" rows="3" name="google_map_embed_code">{{ $property->google_map_embed_code }}</textarea> @error('google_map_embed_code') <span class="text-danger">{{ $message }}</span> @enderror </div> @endif <div class="wsus__property_input"> <label for="#">{{ __('Description') }} <span class="text-danger">*</span></label> <textarea class="form-control summer_note summernote" data-translate="true" name="description">{{ $property->getTranslation($code)->description }}</textarea> @error('description') <span class="text-danger">{{ $message }}</span> @enderror </div> @if ($code != $languages->first()->code) <div class="wsus__property_input"> <button type="submit" id="update-btn" class="common_btn">{{ __('Update') }}</button> </div> @endif </div> @if ($code == $languages->first()->code) <div class="wsus__dash_info featured p_25 mt_25"> <div class="row"> @if ($subscription->is_featured) @if ($subscription->number_of_feature_property == -1) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Featured') }} <span class="text-danger">*</span></label> <select class="select_2" name="is_featured"> <option {{ $property->is_featured == 1 ? 'selected' : '' }} value="1"> {{ __('Yes') }}</option> <option {{ $property->is_featured == 0 ? 'selected' : '' }} value="0"> {{ __('No') }}</option> </select> </div> </div> @elseif($subscription->number_of_feature_property > $existFeaturedProperty) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Featured') }} <span class="text-danger">*</span></label> <select class="select_2" name="is_featured"> <option {{ $property->is_featured == 1 ? 'selected' : '' }} value="1"> {{ __('Yes') }}</option> <option {{ $property->is_featured == 0 ? 'selected' : '' }} value="0"> {{ __('No') }}</option> </select> </div> </div> @endif @endif @if ($subscription->is_top) @if ($subscription->number_of_top_property == -1) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Top Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="top_property"> <option {{ $property->top_property == 1 ? 'selected' : '' }} value="1">{{ __('Yes') }}</option> <option {{ $property->top_property == 0 ? 'selected' : '' }} value="0">{{ __('No') }}</option> </select> </div> </div> @elseif($subscription->number_of_top_property > $existTopProperty) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Top Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="top_property"> <option {{ $property->top_property == 1 ? 'selected' : '' }} value="1">{{ __('Yes') }}</option> <option {{ $property->top_property == 0 ? 'selected' : '' }} value="0">{{ __('No') }}</option> </select> </div> </div> @endif @endif @if ($subscription->is_urgent) @if ($subscription->number_of_urgent_property == -1) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Urgent Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="urgent_property"> <option {{ $property->urgent_property == 1 ? 'selected' : '' }} value="1">{{ __('Yes') }}</option> <option {{ $property->urgent_property == 0 ? 'selected' : '' }} value="0">{{ __('No') }}</option> </select> </div> </div> @elseif($subscription->number_of_urgent_property > $existUrgentProperty) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Urgent Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="urgent_property"> <option {{ $property->urgent_property == 1 ? 'selected' : '' }} value="1">{{ __('Yes') }}</option> <option {{ $property->urgent_property == 0 ? 'selected' : '' }} value="0">{{ __('No') }}</option> </select> </div> </div> @endif @endif <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('SEO Title') }}</label> <input type="text" name="seo_title" value="{{ $property->seo_title }}"> </div> </div> <div class="col-xl-12"> <div class="wsus__property_input"> <label for="#">{{ __('SEO Description') }}</label> <textarea cols="3" rows="3" name="seo_description">{{ $property->seo_description }}</textarea> </div> </div> <div class="col-12"> <button type="submit" class="common_btn">{{ __('Update') }}</button> </div> </div> </div> @endif </div> </form> </div> <form id="downloadForm" action="{{ route('user.download-property-file') }}" method="POST" style="display: none;"> @csrf <input type="hidden" name="id" value="{{ $property->id }}"> </form> @endsection @if ($code == $languages->first()->code) @push('js') <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("focusout", function(e) { $("#slug").val(convertToSlug($(this).val())); }); $("#purpose").on("change", function() { var purposeId = $(this).val() if (purposeId == 2) { $("#period_box").removeClass('d-none'); } else if (purposeId == 1) { $("#period_box").addClass('d-none'); } }); $('#downloadLink').on('click', function(event) { event.preventDefault(); // Prevent the default link behavior $('#downloadForm').submit(); // Submit the form }); tinymce.init({ selector: '.summernote', toolbar: 'undo redo | blocks fontfamily fontsize | bold italic underline strikethrough | link image media table mergetags | addcomment showcomments | spellcheckdialog a11ycheck typography | align lineheight | checklist numlist bullist indent outdent | emoticons charmap | removeformat', tinycomments_mode: 'embedded', tinycomments_author: 'Author name', mergetags_list: [{ value: 'First.Name', title: 'First Name' }, { value: 'Email', title: 'Email' }, ] }); }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } function deletePdfFile(id) { // project demo mode check var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}" var demoNotify = "{{ __('This Is Demo Version. You Can Not Change Anything') }}" if (isDemo == 'DEMO') { toastr.error(demoNotify); return; } // end $.ajax({ type: 'GET', url: "{{ url('user/property-delete-pdf/') }}" + "/" + id, success: function(response) { if (response.success) { toastr.success(response.success) $(".pdf-file-col-" + id).remove() } }, error: function(err) { console.log(err); } }); } </script> @endpush @else @push('js') <script> "use strict"; var isTranslatingInputs = true; function translateOneByOne(inputs, index = 0) { if (index >= inputs.length) { if (isTranslatingInputs) { isTranslatingInputs = false; translateAllTextarea(); } $('#translate-btn').prop('disabled', false); $('#update-btn').prop('disabled', false); return; } var $input = $(inputs[index]); var inputValue = $input.val(); if (inputValue) { $.ajax({ url: "{{ route('user.languages.update.single') }}", type: "POST", data: { lang: '{{ $code }}', text: inputValue, _token: '{{ csrf_token() }}' }, dataType: 'json', beforeSend: function() { $input.prop('disabled', true); iziToast.show({ timeout: false, close: true, theme: 'dark', icon: 'loader', iconUrl: 'https://hub.izmirnic.com/Files/Images/loading.gif', title: "{{ __('Translation Processing, please wait...') }}", position: 'center', }); }, success: function(response) { $input.val(response); if ($input.hasClass('summernote')) { console.log($input); var inputId = $input.attr('id'); tinymce.get(inputId).setContent(response); } $input.prop('disabled', false); iziToast.destroy(); toastr.success("{{ __('Translated Successfully!') }}"); translateOneByOne(inputs, index + 1); }, error: function(jqXHR, textStatus, errorThrown) { console.error(textStatus, errorThrown); iziToast.destroy(); toastr.error('Error', 'Error'); } }); } else { translateOneByOne(inputs, index + 1); } } function translateAll() { iziToast.question({ timeout: 20000, close: false, overlay: true, displayMode: 'once', id: 'question', zindex: 999, title: "{{ __('This will take a while!') }}", message: "{{ __('Are you sure?') }}", position: 'center', buttons: [ ["<button><b>{{ __('YES') }}</b></button>", function(instance, toast) { var isDemo = "{{ env('APP_MODE') ?? 'LIVE' }}"; if (isDemo == 'DEMO') { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); toastr.error( "{{ __('This Is Demo Version. You Can Not Change Anything') }}"); return; } $('#translate-btn').prop('disabled', true); $('#update-btn').prop('disabled', true); instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); var inputs = $('input[data-translate="true"]').toArray(); translateOneByOne(inputs); }, true], ["<button>{{ __('NO') }}</button>", function(instance, toast) { instance.hide({ transitionOut: 'fadeOut' }, toast, 'button'); }], ], onClosing: function(instance, toast, closedBy) {}, onClosed: function(instance, toast, closedBy) {} }); }; function translateAllTextarea() { var inputs = $('textarea[data-translate="true"]').toArray(); if (inputs.length === 0) { return; } translateOneByOne(inputs); } $(document).ready(function() { var selectedTranslation = $('#selected-language').text(); var btnText = "{{ __('Translate to') }}" + selectedTranslation; $('#translate-btn').text(btnText); }); </script> @endpush @endif resources/views/user/property/slider.blade.php 0000644 00000011627 15012234214 0015617 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('Property Slider') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <h4 class="heading">{{ __('Property Slider') }} <a href="{{ route('user.property.edit', ['property' => $property->id, 'code' => allLanguages()->first()->code]) }}" class="common_btn custom-create-property"><i class="fa fa-arrow-left"></i>{{ __('Back Property Page') }}</a> </h4> <div class="card"> <div class="card-body"> <form id="dropzoneForm" method="post" action="{{ route('user.upload-property-slider', $property->id) }}" enctype="multipart/form-data" class="dropzone"> @method('PUT') @csrf </form> <div class="mt-3 text-center"> <button type="button" class="btn btn-success" id="submit-all"><i class="fas fa-upload"></i> {{ __('Upload All') }} </button> </div> </div> </div> <div class="wsus__my_property mt-4"> <div class="row"> <div class="col-12"> <div class="table-responsive"> <table class="table"> <tr> <th class="image"> <p>{{ __('Serial') }}</p> </th> <th class="slider_image"> <p>{{ __('Preview') }}</p> </th> <th class="actions"> <p>{{ __('Action') }}</p> </th> </tr> @foreach ($slider_images as $item) <tr> <td class="image"> {{ $loop->index + 1 }} </td> <td class="title slider_image"> @if ($item->image) <img class="img-thumbnail" src="{{ asset($item->image) }}" alt="" height="100px" width="100px"> @endif </td> <td class="actions"> <a class="text-danger" href="{{ route('user.delete-property-slider', $item->id) }}" onclick="return confirm('are you sure?')"><i class="far fa-trash-alt "></i></a> </td> </tr> @endforeach </table> </div> </div> </div> </div> </div> @endsection @push('css') <link rel="stylesheet" href="{{ asset('backend/dropzone/dropzone.min.css') }}"> <style> .dropzone { background: white; border-radius: 5px; border: 2px dashed rgb(0, 135, 247); border-image: none; max-width: 805px; margin-left: auto; margin-right: auto; } </style> @endpush @push('js') <script src="{{ asset('backend/dropzone/dropzone.min.js') }}"></script> <script type="text/javascript"> function deleteData(id) { $("#deleteForm").attr("action", "{{ url('/admin/delete-property-slider/') }}" + "/" + id); } Dropzone.options.dropzoneForm = { autoProcessQueue: false, uploadMultiple: true, parallelUploads: 10, thumbnailHeight: 200, thumbnailWidth: 200, maxFilesize: 3, filesizeBase: 1000, addRemoveLinks: true, renameFile: function(file) { var dt = new Date(); var time = dt.getTime(); return time + file.name; }, acceptedFiles: ".jpeg,.jpg,.png,.gif,.webp", init: function() { myDropzone = this; $('#submit-all').on('click', function(e) { e.preventDefault(); myDropzone.processQueue(); }); this.on("complete", function() { if (this.getQueuedFiles().length == 0 && this.getUploadingFiles().length == 0) { var _this = this; _this.removeAllFiles(); } }); }, success: function(file, response) { window.location.href = response.url; toastr.success(response.message, 'Success'); }, }; </script> @endpush resources/views/user/property/create.blade.php 0000644 00000064233 15012234214 0015601 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('Create Property') }}</title> @endsection @section('user-dashboard') <form action="{{ route('user.property.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="wsus__dashboard_main_content"> <div class="wsus__add_property"> <h4 class="heading">{{ __('Create Property') }} <a href="{{ route('user.property.index') }}" class="common_btn"><i class="fal fa-plus-octagon"></i> {{ __('All Properties') }}</a> </h4> <div class="wsus__dash_info p_25 pb_0"> <div class="row"> <h5 class="sub_heading">{{ __('Basic Information') }}</h5> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label>{{ __('Title') }} <span class="text-danger">*</span></label> <input type="text" name="title" id="title" value="{{ old('title') }}"> {{-- <input type="hidden" name="expired_date" value="{{ $expired_date }}"> --}} @error('title') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#" for="slug">{{ __('Slug') }} <span class="text-danger">*</span></label> <input type="text" name="slug" id="slug" value="{{ old('slug') }}"> @error('slug') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Property Type') }} <span class="text-danger">*</span></label> <select class="select_2" name="property_type_id" id="property_type_id"> <option value="">{{ __('Select Property Type') }}</option> @foreach ($propertyTypes as $propertyType) <option {{ old('property_type_id') == $propertyType->id ? 'selected' : '' }} value="{{ $propertyType->id }}">{{ $propertyType->translation?->title }} </option> @endforeach </select> @error('property_type_id') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('City') }} <span class="text-danger">*</span></label> <select class="select_2" name="city_id"> <option value="">{{ __('Select City') }}</option> @foreach ($cities as $city) <option {{ old('city_id') == $city->id ? 'selected' : '' }} value="{{ $city->id }}">{{ $city->title }}</option> @endforeach </select> @error('city_id') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Address') }} <span class="text-danger">*</span></label> <input type="text" name="address" value="{{ old('address') }}"> @error('address') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Phone') }}</label> <input type="text" name="phone" value="{{ old('phone') }}"> @error('phone') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Email') }} <span class="text-danger">*</span></label> <input type="email" name="email" value="{{ old('email') }}"> @error('email') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Website') }}</label> <input type="url" name="website" value="{{ old('website') }}"> </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Purpose') }} <span class="text-danger">*</span></label> <select class="select_2" name="property_purpose_id" id="purpose"> @foreach ($purposes as $purpose) <option value="{{ $purpose->id }}">{{ $purpose->translation?->title }}</option> @endforeach </select> @error('property_purpose_id') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Price') }} <span class="text-danger">*</span></label> <input type="text" name="price" value="{{ old('price') }}"> @error('price') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6 d-none" id="period_box"> <div class="wsus__property_input"> <label for="#">{{ __('Period') }} <span class="text-danger">*</span></label> <select class="select_2" name="period" id="period"> <option value="Daily">{{ __('Daily') }}</option> <option value="Monthly">{{ __('Monthly') }}</option> <option value="Yearly">{{ __('Yearly') }}</option> </select> @error('period') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> </div> </div> <div class="wsus__dash_info p_25 mt_25 pb_0"> <div class="row"> <h5 class="sub_heading">{{ __('Others Information') }}</h5> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Area') }}({{ __('Square Feet') }}) <span class="text-danger">*</span></label> <input type="text" name="area" value="{{ old('area') }}"> @error('area') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Unit') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_unit" value="{{ old('number_of_unit') }}"> @error('number_of_unit') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Room') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_room" value="{{ old('number_of_room') }}"> @error('number_of_room') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Bedroom') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_bedroom" value="{{ old('number_of_bedroom') }}"> @error('number_of_bedroom') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Bathroom') }}<span class="text-danger">*</span></label> <input type="text" name="number_of_bathroom" value="{{ old('number_of_bathroom') }}"> @error('number_of_bathroom') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Floor') }} <span class="text-danger">*</span></label> <input type="text" name="number_of_floor" value="{{ old('number_of_floor') }}"> @error('number_of_floor') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Kitchen') }}</label> <input type="text" name="number_of_kitchen" value="{{ old('number_of_kitchen') }}"> @error('number_of_kitchen') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Total Parking Place') }}</label> <input type="text" name="number_of_parking" value="{{ old('number_of_parking') }}"> @error('number_of_parking') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> </div> </div> <div class="wsus__dash_info p_25 mt_25 pb_0"> <div class="row"> <h5 class="sub_heading">{{ __('Image, PDF And Video') }}</h5> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('PDF File') }}</label> <input type="file" name="pdf_file"> @error('pdf_file') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Banner Image') }} <span class="text-danger">*</span></label> <input type="file" name="banner_image"> @error('banner_image') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Thumbnail Image') }} <span class="text-danger">*</span></label> <input type="file" name="thumbnail_image"> @error('thumbnail_image') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="col-xl-6 col-md-6"> <div class="wsus__property_input"> <label for="#">{{ __('Youtube Video Id') }}</label> <input type="text" name="video_link"> @error('video_link') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> </div> </div> <div class="wsus__dash_info dash_aminities p_25 mt_25 pb_0"> <h5 class="sub_heading">{{ __('Amenities') }}</h5> <div class="row"> @foreach ($aminities as $aminity) @if (old('aminities')) @php $isChecked = false; @endphp @foreach (old('aminities') as $old_aminity) @if ($aminity->id == $old_aminity) @php $isChecked = true; @endphp @endif @endforeach <div class="col-xl-4 col-sm-6 col-lg-4"> <div class="form-check"> <input class="form-check-input" {{ $isChecked ? 'checked' : '' }} type="checkbox" name="aminities[]" id="un-aminityId-{{ $aminity->id }}" value="{{ $aminity->id }}"> <label class="form-check-label" for="un-aminityId-{{ $aminity->id }}"> {{ $aminity->translation?->title }} </label> </div> </div> @else <div class="col-xl-4 col-sm-6 col-lg-4"> <div class="form-check"> <input class="form-check-input" type="checkbox" name="aminities[]" id="un-aminityId-{{ $aminity->id }}" value="{{ $aminity->id }}"> <label class="form-check-label" for="un-aminityId-{{ $aminity->id }}"> {{ $aminity->translation?->title }} </label> </div> </div> @endif @endforeach </div> @php $aminityList = []; foreach ($aminities as $index => $aminity) { $aminityList[] = $aminity->id; } @endphp </div> <div class="wsus__dash_info pro_det_map p_25 mt_25 pb_0"> <h5 class="sub_heading">{{ __('Property Details And Google Map') }} </h5> <div class="wsus__property_input"> <label>{{ __('Google Map Code') }}</label> <textarea cols="3" rows="3" name="google_map_embed_code">{{ old('google_map_embed_code') }}</textarea> @error('google_map_embed_code') <span class="text-danger">{{ $message }}</span> @enderror </div> <div class="wsus__property_input"> <label>{{ __('Description') }} <span class="text-danger">*</span> <textarea class="form-control summer_note summernote" name="description">{{ old('description') }}</textarea> @error('description') <span class="text-danger">{{ $message }}</span> @enderror </div> </div> <div class="wsus__dash_info featured p_25 mt_25"> <div class="row"> @if ($subscription->is_featured) @if ($subscription->number_of_feature_property == -1) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Featured') }} <span class="text-danger">*</span></label> <select class="select_2" name="is_featured"> <option value="1">{{ __('Yes') }}</option> <option value="0">{{ __('No') }}</option> </select> </div> </div> @elseif($subscription->number_of_feature_property > $existFeaturedProperty) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Featured') }} <span class="text-danger">*</span></label> <select class="select_2" name="is_featured"> <option value="1">{{ __('Yes') }}</option> <option value="0">{{ __('No') }}</option> </select> </div> </div> @endif @endif @if ($subscription->is_top) @if ($subscription->number_of_top_property == -1) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Top Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="top_property"> <option value="1">{{ __('Yes') }}</option> <option value="0">{{ __('No') }}</option> </select> </div> </div> @elseif($subscription->number_of_top_property > $existTopProperty) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Top Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="top_property"> <option value="1">{{ __('Yes') }}</option> <option value="0">{{ __('No') }}</option> </select> </div> </div> @endif @endif @if ($subscription->is_urgent) @if ($subscription->number_of_urgent_property == -1) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Urgent Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="urgent_property"> <option value="1">{{ __('Yes') }}</option> <option value="0">{{ __('No') }}</option> </select> </div> </div> @elseif($subscription->number_of_urgent_property > $existUrgentProperty) <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('Urgent Property') }} <span class="text-danger">*</span></label> <select class="select_2" name="urgent_property"> <option value="1">{{ __('Yes') }}</option> <option value="0">{{ __('No') }}</option> </select> </div> </div> @endif @endif <div class="col-12"> <div class="wsus__property_input"> <label for="#">{{ __('SEO Title') }}</label> <input type="text" name="seo_title" value="{{ old('seo_title') }}"> </div> </div> <div class="col-xl-12"> <div class="wsus__property_input"> <label for="#">{{ __('SEO Description') }}</label> <textarea cols="3" rows="3" name="seo_description">{{ old('seo_description') }}</textarea> </div> </div> <div class="col-12"> <button type="submit" class="common_btn">{{ __('Save') }}</button> </div> </div> </div> </div> </form> </div> @endsection @push('js') <script> (function($) { "use strict"; $(document).ready(function() { $("#title").on("focusout", function(e) { $("#slug").val(convertToSlug($(this).val())); }) $("#purpose").on("change", function() { var purposeId = $(this).val() if (purposeId == 2) { $("#period_box").removeClass('d-none'); } else if (purposeId == 1) { $("#period_box").addClass('d-none'); } }) }); })(jQuery); function convertToSlug(Text) { return Text .toLowerCase() .replace(/[^\w ]+/g, '') .replace(/ +/g, '-'); } </script> @endpush resources/views/user/property/index.blade.php 0000644 00000020556 15012234214 0015445 0 ustar 00 @extends('user.layout') @section('title') <title>{{ __('My Properties') }}</title> @endsection @section('user-dashboard') <div class="wsus__dashboard_main_content"> <div class="wsus__my_property"> <h4 class="heading">{{ __('My Property') }} <a href="{{ route('user.property.create') }}" class="common_btn"><i class="fal fa-plus-octagon"></i> {{ __('Create New') }}</a></h4> <div class="row"> <div class="col-12"> <div class="table-responsive"> <table class="table"> <tr> <th class="image"> {{ __('Image') }} </th> <th class="title"> {{ __('Property') }} </th> <th class="purpose"> {{ __('Purpose') }} </th> <th class="status"> {{ __('Status') }} </th> <th class="actions"> {{ __('Action') }} </th> </tr> @foreach ($properties as $property) <tr> <td class="image"> <a href="{{ route('property.details', $property->slug) }}"> <img src="{{ asset($property->thumbnail_image) }}" alt="img" class="img-fluid w-100"> </a> </td> <td class="title"> <h5><a href="{{ route('property.details', $property->slug) }}">{{ $property->translation?->title }}</a> </h5> <p class="address"> {{ $property->translation?->address . ', ' . $property->city?->title }} </p> @php $total_review = $property->reviews->where('status', 1)->count(); if ($total_review > 0) { $avg_sum = $property->reviews ->where('status', 1) ->sum('avarage_rating'); $avg = $avg_sum / $total_review; $intAvg = intval($avg); $nextVal = $intAvg + 1; $reviewPoint = $intAvg; $halfReview = false; if ($intAvg < $avg && $avg < $nextVal) { $reviewPoint = $intAvg + 0.5; $halfReview = true; } } @endphp @if ($total_review > 0) <p class="rating"> <span>{{ sprintf('%.1f', $reviewPoint) }}</span> @for ($i = 1; $i <= 5; $i++) @if ($i <= $reviewPoint) <i class="fas fa-star"></i> @elseif ($i > $reviewPoint) @if ($halfReview == true) <i class="fas fa-star-half-alt"></i> @php $halfReview = false; @endphp @else <i class="fal fa-star"></i> @endif @endif @endfor <span>({{ $total_review }} {{ __('Reviews') }})</span> </p class="rating"> @else <p> <span>0.0</span> @for ($i = 1; $i <= 5; $i++) <i class="fal fa-star"></i> @endfor <span>({{ 0 }} {{ __('Reviews') }})</span> </p> @endif </td> <td class="purpose"> <p>{{ $property->propertyPurpose->translation?->title }}</p> </td> <td class="status"> @if ($property->status == 1) @if ($property->expired_date >= date('Y-m-d')) <p class="active">{{ __('Active') }}</p> @else <p>{{ __('Expired') }}</p> @endif @else <p>{{ __('Inactive') }}</p> @endif </td> <td class="actions"> <ul class="d-flex"> <li><a href="{{ route('property.details', $property->slug) }}"><i class="far fa-eye"></i></a></li> <li><a href="{{ route('user.property.edit', ['property' => $property->id, 'code' => getSessionLanguage()]) }}"><i class="fal fa-edit"></i></a></li> <li><a href="javascript:;" onclick="deleteProperty('{{ $property->id }}')"><i class="far fa-trash-alt"></i></a></li> </ul> </td> </tr> @endforeach </table> </div> </div> <div class="col-12 mt_25"> {{ $properties->links('custom_paginator') }} </div> </div> </div> </div> <script> function deleteProperty(id) { Swal.fire({ title: "{{ __('Are You Sure ?') }}", text: "{{ __('Do you want to delete this item ?') }}", icon: 'warning', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: "{{ __('Yes, Delete') }}", cancelButtonText: "{{ __('Cancel') }}", }).then((result) => { if (result.isConfirmed) { Swal.fire( "{{ __('Congratulations!') }}", "{{ __('Delete Successfully') }}", 'success' ) location.href = "{{ url('user/delete/property/') }}" + "/" + id; } }) } </script> @endsection resources/views/layouts/master.blade.php 0000644 00000001745 15012234214 0014466 0 ustar 00 <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="csrf-token" content="{{ csrf_token() }}"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Property Module - {{ config('app.name', 'Laravel') }}</title> <meta name="description" content="{{ $description ?? '' }}"> <meta name="keywords" content="{{ $keywords ?? '' }}"> <meta name="author" content="{{ $author ?? '' }}"> <!-- Fonts --> <link rel="preconnect" href="https://fonts.bunny.net"> <link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" /> {{-- Vite CSS --}} {{-- {{ module_vite('build-property', 'resources/assets/sass/app.scss') }} --}} </head> <body> @yield('content') {{-- Vite JS --}} {{-- {{ module_vite('build-property', 'resources/assets/js/app.js') }} --}} </body> resources/views/.gitkeep 0000644 00000000000 15012234214 0011324 0 ustar 00
| ver. 1.4 |
Github
|
.
| PHP 8.3.20 | Генерация страницы: 0.05 |
proxy
|
phpinfo
|
Настройка