Файловый менеджер - Редактировать - /home/c7lekhnath/silverray.com.au/Modules/Language/database/seeders/68334/Blog.tar
Назад
lang/.gitkeep 0000644 00000000000 15012236064 0007103 0 ustar 00 module.json 0000644 00000000322 15012236064 0006720 0 ustar 00 { "name": "Blog", "alias": "blog", "description": "", "keywords": [], "priority": 0, "providers": [ "Modules\\Blog\\app\\Providers\\BlogServiceProvider" ], "files": [] } tests/Unit/.gitkeep 0000644 00000000000 15012236064 0010243 0 ustar 00 tests/Feature/.gitkeep 0000644 00000000000 15012236064 0010717 0 ustar 00 vite.config.js 0000644 00000001276 15012236064 0007322 0 ustar 00 import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; export default defineConfig({ build: { outDir: '../../public/build-blog', emptyOutDir: true, manifest: true, }, plugins: [ laravel({ publicDirectory: '../../public', buildDirectory: 'build-blog', 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', //]; wsus.json 0000644 00000000613 15012236064 0006437 0 ustar 00 { "name": "Blog Addon", "is_default": true, "description": "This is Blog Addon", "author": { "name": "Websolutionsus", "email": "websolutionus1@gmail.com", "website": "https://websolutionus.com" }, "license": "Proprietary", "url": "", "options" : { "route" : "home" }, "last_update": "2024-03-31", "version": "1.0.0" } routes/.gitkeep 0000644 00000000000 15012236064 0007503 0 ustar 00 routes/error_log 0000644 00000001064 15012236064 0010002 0 ustar 00 [07-May-2025 13:53:41 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Support\Facades\Route" not found in /home/lekhnath/silverray.com.au/Modules/Blog/routes/api.php:5 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/routes/api.php on line 5 [07-May-2025 13:57:46 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Support\Facades\Route" not found in /home/lekhnath/silverray.com.au/Modules/Blog/routes/web.php:8 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/routes/web.php on line 8 routes/web.php 0000644 00000002222 15012236064 0007350 0 ustar 00 <?php use Illuminate\Support\Facades\Route; use Modules\Blog\app\Http\Controllers\BlogCategoryController; use Modules\Blog\app\Http\Controllers\BlogCommentController; use Modules\Blog\app\Http\Controllers\BlogController; Route::middleware(['auth:admin', 'translation']) ->name('admin.') ->prefix('admin') ->group(function () { Route::resource('blogs', BlogController::class)->names('blogs'); Route::put('/blogs/status-update/{id}', [BlogController::class, 'statusUpdate'])->name('blogs.status-update'); Route::get('popular-blogs', [BlogController::class, 'popularBlogs'])->name('popular-blogs'); Route::resource('blog-category', BlogCategoryController::class)->names('blog-category')->except('show'); Route::put('/blog-category/status-update/{id}', [BlogCategoryController::class, 'statusUpdate'])->name('blog-category.status-update'); Route::resource('blog-comment', BlogCommentController::class)->names('blog-comment')->only(['index', 'show', 'destroy']); Route::put('/blog-comment/status-update/{id}', [BlogCommentController::class, 'statusUpdate'])->name('blog-comment.status-update'); }); routes/api.php 0000644 00000000214 15012236064 0007343 0 ustar 00 <?php use Illuminate\Support\Facades\Route; Route::middleware(['auth:sanctum'])->prefix('v1')->name('api.')->group(function () { }); composer.json 0000644 00000001253 15012236064 0007266 0 ustar 00 { "name": "nwidart/blog", "description": "", "authors": [ { "name": "Nicolas Widart", "email": "n.widart@gmail.com" } ], "extra": { "laravel": { "providers": [], "aliases": { } } }, "autoload": { "psr-4": { "Modules\\Blog\\": "", "Modules\\Blog\\App\\": "app/", "Modules\\Blog\\Database\\Factories\\": "database/factories/", "Modules\\Blog\\Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { "psr-4": { "Modules\\Blog\\Tests\\": "tests/" } } } config/config.php 0000644 00000000051 15012236064 0007762 0 ustar 00 <?php return [ 'name' => 'Blog', ]; config/.gitkeep 0000644 00000000000 15012236064 0007427 0 ustar 00 package.json 0000644 00000000410 15012236064 0007024 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 15012236064 0012167 0 ustar 00 app/Http/Controllers/BlogCategoryController.php 0000644 00000011713 15012236064 0015711 0 ustar 00 <?php namespace Modules\Blog\app\Http\Controllers; use App\Enums\RedirectType; use Illuminate\Http\Request; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Pagination\Paginator; use Illuminate\Http\RedirectResponse; use Modules\Blog\app\Models\BlogCategory; use Modules\Language\app\Models\Language; use Modules\Language\app\Enums\TranslationModels; use Modules\Blog\app\Http\Requests\CategoryRequest; use Modules\Language\app\Traits\GenerateTranslationTrait; class BlogCategoryController extends Controller { use GenerateTranslationTrait, RedirectHelperTrait; public function index(Request $request) { checkAdminHasPermissionAndThrowException('blog.category.view'); $query = BlogCategory::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')) { $categories = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $categories = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('blog::Category.index', ['categories' => $categories]); } public function create() { checkAdminHasPermissionAndThrowException('blog.category.create'); return view('blog::Category.create'); } public function store(CategoryRequest $request): RedirectResponse { checkAdminHasPermissionAndThrowException('blog.category.store'); $category = BlogCategory::create($request->validated()); $languages = Language::all(); $this->generateTranslations( TranslationModels::BlogCategory, $category, 'blog_category_id', $request, ); return $this->redirectWithMessage(RedirectType::CREATE->value, 'admin.blog-category.edit', ['blog_category' => $category->id, 'code' => $languages->first()->code]); } /** * Show the specified resource. */ public function show($id) { checkAdminHasPermissionAndThrowException('blog.category.view'); return view('blog::Category.show'); } /** * Show the form for editing the specified resource. */ public function edit($id) { checkAdminHasPermissionAndThrowException('blog.category.edit'); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $category = BlogCategory::findOrFail($id); $languages = allLanguages(); return view('blog::Category.edit', compact('category', 'code', 'languages')); } public function update(CategoryRequest $request, BlogCategory $blog_category) { checkAdminHasPermissionAndThrowException('blog.category.update'); $validatedData = $request->validated(); $blog_category->update($validatedData); $this->updateTranslations( $blog_category, $request, $validatedData, ); return $this->redirectWithMessage(RedirectType::UPDATE->value, 'admin.blog-category.edit', ['blog_category' => $blog_category->id, 'code' => $request->code]); } /** * Remove the specified resource from storage. */ public function destroy(BlogCategory $blogCategory) { checkAdminHasPermissionAndThrowException('blog.category.delete'); if ($blogCategory->posts()->count() > 0) { $notification = trans('You can not delete this category type there are multiple blog post exist under this category.'); $notification=array('messege'=>$notification,'alert-type'=>'error'); return redirect()->back()->with($notification); } $blogCategory->translations()->each(function ($translation) { $translation->category()->dissociate(); $translation->delete(); }); $blogCategory->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.blog-category.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('blog.category.update'); $blogCategory = BlogCategory::find($id); $status = $blogCategory->status == 1 ? 0 : 1; $blogCategory->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Controllers/error_log 0000644 00000001254 15012236064 0012467 0 ustar 00 [13-May-2025 20:57:10 UTC] PHP Fatal error: Uncaught Error: Class "App\Http\Controllers\Controller" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Http/Controllers/BlogController.php:20 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Http/Controllers/BlogController.php on line 20 [14-May-2025 20:23:09 UTC] PHP Fatal error: Uncaught Error: Class "App\Http\Controllers\Controller" not found in /home/c7lekhnath/silverray.com.au/Modules/Blog/app/Http/Controllers/BlogCommentController.php:11 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Blog/app/Http/Controllers/BlogCommentController.php on line 11 app/Http/Controllers/BlogController.php 0000644 00000015541 15012236064 0014216 0 ustar 00 <?php namespace Modules\Blog\app\Http\Controllers; use App\Enums\RedirectType; use Illuminate\Http\Request; use Modules\Blog\app\Models\Blog; use App\Traits\RedirectHelperTrait; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\File; use Illuminate\Http\RedirectResponse; use Modules\Blog\app\Models\BlogComment; use Modules\Blog\app\Models\BlogCategory; use Modules\Language\app\Models\Language; use Modules\Blog\app\Http\Requests\PostRequest; use Modules\Language\app\Enums\TranslationModels; use Modules\Language\app\Traits\GenerateTranslationTrait; class BlogController extends Controller { use GenerateTranslationTrait, RedirectHelperTrait; public function index(Request $request) { checkAdminHasPermissionAndThrowException('blog.view'); $query = Blog::query(); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); $q->orWhere('description', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('show_homepage'), function ($q) use ($request) { $q->where('show_homepage', $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')) { $posts = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $posts = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('blog::Post.index', compact('posts')); } public function popularBlogs(Request $request) { checkAdminHasPermissionAndThrowException('blog.view'); $query = Blog::query()->where('is_popular', 1); $query->when($request->filled('keyword'), function ($qa) use ($request) { $qa->whereHas('translations', function ($q) use ($request) { $q->where('title', 'like', '%'.$request->keyword.'%'); $q->orWhere('description', 'like', '%'.$request->keyword.'%'); }); }); $query->when($request->filled('show_homepage'), function ($q) use ($request) { $q->where('show_homepage', $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')) { $posts = $request->get('par-page') == 'all' ? $query->orderBy( 'id', $orderBy )->get() : $query->orderBy( 'id', $orderBy )->paginate($request->get('par-page'))->withQueryString(); } else { $posts = $query->orderBy( 'id', $orderBy )->paginate()->withQueryString(); } return view('blog::Post.popular_blog', compact('posts')); } /** * Show the form for creating a new resource. */ public function create() { checkAdminHasPermissionAndThrowException('blog.create'); $categories = BlogCategory::all(); return view('blog::Post.create', ['categories' => $categories]); } public function store(PostRequest $request): RedirectResponse { checkAdminHasPermissionAndThrowException('blog.store'); $blog = Blog::create(array_merge(['admin_id' => Auth::guard('admin')->user()->id], $request->validated())); if ($blog && $request->hasFile('image')) { $file_name = file_upload($request->image, 'uploads/custom-images/', $blog->image); $blog->image = $file_name; $blog->save(); } $this->generateTranslations( TranslationModels::Blog, $blog, 'blog_id', $request, ); return $this->redirectWithMessage( RedirectType::CREATE->value, 'admin.blogs.edit', [ 'blog' => $blog->id, 'code' => allLanguages()->first()->code, ] ); } public function edit($id) { checkAdminHasPermissionAndThrowException('blog.edit'); $code = request('code') ?? getSessionLanguage(); if (! Language::where('code', $code)->exists()) { abort(404); } $blog = Blog::findOrFail($id); $categories = BlogCategory::all(); $languages = allLanguages(); return view('blog::Post.edit', compact('blog', 'code', 'categories', 'languages')); } /** * Update the specified resource in storage. */ public function update(PostRequest $request, $id) { checkAdminHasPermissionAndThrowException('blog.update'); $validatedData = $request->validated(); $blog = Blog::findOrFail($id); if ($blog && ! empty($request->image)) { $file_name = file_upload($request->image, 'uploads/custom-images/', $blog->image); $blog->image = $file_name; $blog->save(); } $blog->update($validatedData); $this->updateTranslations( $blog, $request, $validatedData, ); return $this->redirectWithMessage( RedirectType::UPDATE->value, 'admin.blogs.edit', ['blog' => $blog->id, 'code' => $request->code] ); } public function destroy($id) { checkAdminHasPermissionAndThrowException('blog.delete'); $blog = Blog::findOrFail($id); $blog->translations()->each(function ($translation) { $translation->post()->dissociate(); $translation->delete(); }); if ($blog->image) { if (File::exists(public_path($blog->image))) { unlink(public_path($blog->image)); } } $blogComments = BlogComment::where('blog_id', $id)->get(); foreach($blogComments as $comment){ $comment->delete(); } $blog->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.blogs.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('blog.update'); $blog = Blog::find($id); $status = $blog->status == 1 ? 0 : 1; $blog->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } } app/Http/Controllers/BlogCommentController.php 0000644 00000003313 15012236064 0015533 0 ustar 00 <?php namespace Modules\Blog\app\Http\Controllers; use App\Enums\RedirectType; use App\Http\Controllers\Controller; use App\Traits\RedirectHelperTrait; use Illuminate\Pagination\Paginator; use Modules\Blog\app\Models\BlogComment; class BlogCommentController extends Controller { use RedirectHelperTrait; public function index() { checkAdminHasPermissionAndThrowException('blog.comment.view'); Paginator::useBootstrap(); $comments = BlogComment::latest()->paginate(15); return view('blog::Comment.index', compact('comments')); } public function show($id) { checkAdminHasPermissionAndThrowException('blog.comment.view'); $comments = BlogComment::where('blog_id', $id)->paginate(20); return view('blog::Comment.show', compact('comments')); } public function destroy($id) { checkAdminHasPermissionAndThrowException('blog.comment.delete'); BlogComment::findOrFail($id)?->delete(); return $this->redirectWithMessage(RedirectType::DELETE->value, 'admin.blog-comment.index'); } public function statusUpdate($id) { checkAdminHasPermissionAndThrowException('blog.comment.update'); $blogCategory = BlogComment::find($id); if ($blogCategory) { $status = $blogCategory->status == 1 ? 0 : 1; $blogCategory->update(['status' => $status]); $notification = __('Updated Successfully'); return response()->json([ 'success' => true, 'message' => $notification, ]); } return response()->json([ 'success' => false, 'message' => __('Failed!'), ]); } } app/Http/Requests/.gitkeep 0000644 00000000000 15012236064 0011474 0 ustar 00 app/Http/Requests/PostRequest.php 0000644 00000006474 15012236064 0013077 0 ustar 00 <?php namespace Modules\Blog\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Auth; class PostRequest extends FormRequest { public function authorize(): bool { return Auth::guard('admin')->check() ? true : false; } public function rules(): array { $rules = [ 'blog_category_id' => 'sometimes|required|exists:blog_categories,id', 'seo_title' => 'nullable|string|max:1000', 'seo_description' => 'nullable|string|max:2000', 'show_homepage' => 'nullable', 'status' => 'nullable', 'is_popular' => 'nullable', 'short_description' => 'required', 'description' => 'required', ]; if ($this->isMethod('put')) { $rules['code'] = 'required|exists:languages,code'; $rules['title'] = 'required|string|max:255'; $rules['slug'] = 'sometimes|string|max:255|unique:blogs,slug,'.$this->blog; // $rules['image'] = 'nullable|image|max:2048'; $rules['image'] = 'nullable'; } if ($this->isMethod('post')) { // $rules['image'] = 'required|image|max:2048'; $rules['image'] = 'required'; $rules['slug'] = 'required|string|max:255|unique:blogs,slug'; $rules['title'] = 'required|string|max:255|unique:blog_translations,title'; } return $rules; } public function messages(): array { return [ 'blog_category_id.required' => __('Category is required.'), 'blog_category_id.exists' => __('The selected category is invalid.'), 'code.required' => __('Language is required and must be a string.'), 'code.exists' => __('The selected language is invalid.'), 'seo_title.max' => __('SEO title must be a string with a maximum length of 1000 characters.'), 'seo_description.max' => __('SEO description must be a string with a maximum length of 2000 characters.'), 'tags.max' => __('Tags must be a string with a maximum length of 255 characters.'), 'seo_title.string' => __('SEO title must be a string with a maximum length of 1000 characters.'), 'seo_description.string' => __('SEO description must be a string with a maximum length of 2000 characters.'), 'tags.string' => __('Tags must be a string with a maximum length of 255 characters.'), 'image.required' => __('The image is required'), 'image.image' => __('The image must be an image file with a maximum size of 2048 kilobytes (2 MB).'), 'image.max' => __('The image must be an image file with a maximum size of 2048 kilobytes (2 MB).'), 'title.required' => __('Title is required'), 'slug.required' => __('Slug is required'), 'title.max' => __('Maximum length of slug should be 255 characters'), 'slug.max' => __('Maximum length of slug should be 255 characters'), 'title.string' => __('Title must be string'), 'slug.unique' => __('Slug must be unique'), 'title.unique' => __('Title must be unique'), 'short_description.required' => __('Description is required'), 'description.required' => __('Description is required'), ]; } } app/Http/Requests/error_log 0000644 00000001224 15012236065 0011772 0 ustar 00 [13-May-2025 16:33:44 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Foundation\Http\FormRequest" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Http/Requests/CategoryRequest.php:8 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Http/Requests/CategoryRequest.php on line 8 [13-May-2025 20:57:01 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Foundation\Http\FormRequest" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Http/Requests/PostRequest.php:8 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Http/Requests/PostRequest.php on line 8 app/Http/Requests/CategoryRequest.php 0000644 00000002634 15012236065 0013722 0 ustar 00 <?php namespace Modules\Blog\app\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Auth; class CategoryRequest 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:blog_categories,slug,'.$this->blog_category->id; } if ($this->isMethod('post')) { $rules['slug'] = 'required|string|max:255|unique:blog_categories,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.max' => __('Slug must be string with a maximum length of 255 characters.'), 'slug.unique' => __('Slug already exists.'), 'short_description.string' => __('Short description must be a string.'), 'short_description.max' => __('Short description must be string with a maximum length of 255 characters.'), ]; } } app/Http/Middleware/.gitkeep 0000644 00000000000 15012236065 0011737 0 ustar 00 app/Models/BlogCategoryTranslation.php 0000644 00000001101 15012236065 0014051 0 ustar 00 <?php namespace Modules\Blog\app\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class BlogCategoryTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = [ 'blog_id', 'lang_code', 'title', 'short_description', ]; public function category(): ?BelongsTo { return $this->belongsTo(BlogCategory::class, 'blog_category_id'); } } app/Models/BlogCategory.php 0000644 00000002261 15012236065 0011642 0 ustar 00 <?php namespace Modules\Blog\app\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; class BlogCategory extends Model { use HasFactory; protected $fillable = ['slug', 'status']; // make a accessor for translation public function getTitleAttribute(): ?string { return $this->translation->title; } public function getShortDescriptionAttribute(): ?string { return $this->translation->short_description; } public function translation(): ?HasOne { return $this->hasOne(BlogCategoryTranslation::class)->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?BlogCategoryTranslation { return $this->hasOne(BlogCategoryTranslation::class)->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(BlogCategoryTranslation::class, 'blog_category_id'); } public function posts() { return $this->hasMany(Blog::class, 'blog_category_id'); } } app/Models/BlogTranslation.php 0000644 00000001153 15012236065 0012362 0 ustar 00 <?php namespace Modules\Blog\app\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class BlogTranslation extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = [ 'blog_id', 'lang_code', 'title', 'short_description', 'description', 'seo_title', 'seo_description', ]; public function post(): ?BelongsTo { return $this->belongsTo(Blog::class, 'blog_id'); } } app/Models/.gitkeep 0000644 00000000000 15012236065 0010166 0 ustar 00 app/Models/Blog.php 0000644 00000003420 15012236065 0010142 0 ustar 00 <?php namespace Modules\Blog\app\Models; use App\Models\Admin; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Factories\HasFactory; class Blog extends Model { use HasFactory; protected $fillable = [ 'admin_id', 'blog_category_id', 'slug', 'views', 'show_homepage', 'is_popular', 'tags', 'status', ]; public function getTitleAttribute(): ?string { return $this->translation->title; } public function getDescriptionAttribute(): ?string { return $this->translation->description; } public function getSeoTitleAttribute(): ?string { return $this->translation->seo_title; } public function getSeoDescriptionAttribute(): ?string { return $this->translation->seo_description; } public function category(): ?BelongsTo { return $this->belongsTo(BlogCategory::class, 'blog_category_id')->with('translation'); } public function translation(): ?HasOne { return $this->hasOne(BlogTranslation::class)->where('lang_code', getSessionLanguage()); } public function getTranslation($code): ?BlogTranslation { return $this->hasOne(BlogTranslation::class)->where('lang_code', $code)->first(); } public function translations(): ?HasMany { return $this->hasMany(BlogTranslation::class, 'blog_id'); } public function comments(): ?HasMany { return $this->hasMany(BlogComment::class, 'blog_id'); } public function admin(){ return $this->belongsTo(Admin::class); } } app/Models/error_log 0000644 00000002350 15012236065 0010464 0 ustar 00 [13-May-2025 20:56:47 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Eloquent\Model" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/BlogCategoryTranslation.php:9 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/BlogCategoryTranslation.php on line 9 [13-May-2025 20:56:50 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Eloquent\Model" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/BlogCategory.php:10 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/BlogCategory.php on line 10 [13-May-2025 20:56:56 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Eloquent\Model" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/Blog.php:12 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/Blog.php on line 12 [13-May-2025 20:56:59 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Eloquent\Model" not found in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/BlogTranslation.php:9 Stack trace: #0 {main} thrown in /home/lekhnath/silverray.com.au/Modules/Blog/app/Models/BlogTranslation.php on line 9 app/Models/BlogComment.php 0000644 00000001043 15012236065 0011464 0 ustar 00 <?php namespace Modules\Blog\app\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class BlogComment extends Model { use HasFactory; /** * The attributes that are mass assignable. */ protected $fillable = [ 'comment', 'name', 'blog_id', 'email', 'status', ]; public function post(): ?BelongsTo { return $this->belongsTo(Blog::class, 'blog_id'); } } app/Providers/RouteServiceProvider.php 0000644 00000002647 15012236065 0014155 0 ustar 00 <?php namespace Modules\Blog\app\Providers; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { /** * The module namespace to assume when generating URLs to actions. */ protected string $moduleNamespace = 'Modules\Blog\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('Blog', '/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('Blog', '/routes/api.php')); } } app/Providers/.gitkeep 0000644 00000000000 15012236065 0010720 0 ustar 00 app/Providers/BlogServiceProvider.php 0000644 00000006426 15012236065 0013741 0 ustar 00 <?php namespace Modules\Blog\app\Providers; use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class BlogServiceProvider extends ServiceProvider { protected string $moduleName = 'Blog'; protected string $moduleNameLower = 'blog'; /** * 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 00000001270 15012236065 0011216 0 ustar 00 [16-May-2025 06:24:04 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Foundation\Support\Providers\RouteServiceProvider" not found in /home/c7lekhnath/silverray.com.au/Modules/Blog/app/Providers/RouteServiceProvider.php:8 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Blog/app/Providers/RouteServiceProvider.php on line 8 [16-May-2025 06:24:05 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Support\ServiceProvider" not found in /home/c7lekhnath/silverray.com.au/Modules/Blog/app/Providers/BlogServiceProvider.php:8 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Blog/app/Providers/BlogServiceProvider.php on line 8 database/factories/.gitkeep 0000644 00000000000 15012236065 0011706 0 ustar 00 database/migrations/2023_11_07_104336_create_blogs_table.php 0000644 00000001755 15012236065 0017102 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('blogs', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('admin_id')->default(0); $table->unsignedBigInteger('blog_category_id'); $table->text('slug'); $table->string('image')->nullable(); $table->bigInteger('views')->default(0); $table->boolean('show_homepage')->default(false); $table->boolean('is_popular')->default(false); $table->text('tags')->nullable(); $table->boolean('status')->default(0); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('blogs'); } }; database/migrations/.gitkeep 0000644 00000000000 15012236065 0012103 0 ustar 00 database/migrations/2023_11_07_104328_create_blog_category_translations_table.php 0000644 00000001505 15012236065 0023407 0 ustar 00 <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use Modules\Blog\app\Models\BlogCategory; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('blog_category_translations', function (Blueprint $table) { $table->id(); $table->foreignIdFor(BlogCategory::class)->constrained('blog_categories'); $table->string('lang_code'); $table->string('title'); $table->string('short_description')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('blog_category_translations'); } }; database/migrations/2023_11_07_104546_create_blog_comments_table.php 0000644 00000001500 15012236065 0020613 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('blog_comments', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('blog_id'); $table->string('name')->nullable(); $table->string('email')->nullable(); $table->string('phone')->nullable(); $table->text('comment'); $table->boolean('status')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('blog_comments'); } }; database/migrations/2023_11_07_104315_create_blog_categories_table.php 0000644 00000001366 15012236065 0021117 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('blog_categories', function (Blueprint $table) { $table->id(); $table->string('slug'); $table->integer('position')->default(0); $table->string('parent_id')->nullable()->default(null); $table->boolean('status')->default(true); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('blog_categories'); } }; database/migrations/2023_11_07_104343_create_blog_translations_table.php 0000644 00000001560 15012236065 0021510 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('blog_translations', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('blog_id'); $table->string('lang_code'); $table->string('title'); $table->text('short_description'); $table->longText('description'); $table->text('seo_title')->nullable(); $table->text('seo_description')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('blog_translations'); } }; database/seeders/.gitkeep 0000644 00000000000 15012236065 0011361 0 ustar 00 database/seeders/BlogDatabaseSeeder.php 0000644 00000000365 15012236065 0014117 0 ustar 00 <?php namespace Modules\Blog\database\seeders; use Illuminate\Database\Seeder; class BlogDatabaseSeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { // $this->call([]); } } database/seeders/error_log 0000644 00000000512 15012236065 0011655 0 ustar 00 [14-May-2025 16:39:30 UTC] PHP Fatal error: Uncaught Error: Class "Illuminate\Database\Seeder" not found in /home/c7lekhnath/silverray.com.au/Modules/Blog/database/seeders/BlogDatabaseSeeder.php:7 Stack trace: #0 {main} thrown in /home/c7lekhnath/silverray.com.au/Modules/Blog/database/seeders/BlogDatabaseSeeder.php on line 7 resources/assets/.gitkeep 0000644 00000000000 15012236065 0011477 0 ustar 00 resources/assets/js/app.js 0000644 00000000000 15012236065 0011600 0 ustar 00 resources/assets/sass/app.scss 0000644 00000000000 15012236065 0012474 0 ustar 00 resources/views/sidebar.blade.php 0000644 00000003165 15012236065 0013110 0 ustar 00 @if (Module::isEnabled('Blog') && Route::has('admin.blogs.index')) <li class="nav-item dropdown {{ isRoute(['admin.blogs.*', 'admin.popular-blogs', 'admin.blog-category.*', 'admin.blog-comment.*'], 'active') }}"> <a href="javascript:void()" class="nav-link has-dropdown"><i class="fas fa-newspaper"></i><span>{{ __('Manage Blogs') }}</span></a> <ul class="dropdown-menu"> @adminCan('blog.category.view') <li class="{{ isRoute('admin.blog-category.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.blog-category.index') }}"> {{ __('Category List') }} </a> </li> @endadminCan @adminCan('blog.view') <li class="{{ isRoute('admin.blogs.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.blogs.index') }}"> {{ __('Post List') }} </a> </li> @endadminCan @adminCan('blog.view') <li class="{{ isRoute('admin.popular-blogs', 'active') }}"> <a class="nav-link" href="{{ route('admin.popular-blogs') }}"> {{ __('Popular Post') }} </a> </li> @endadminCan @adminCan('blog.comment.view') <li class="{{ isRoute('admin.blog-comment.*', 'active') }}"> <a class="nav-link" href="{{ route('admin.blog-comment.index') }}"> {{ __('Post Comments') }} </a> </li> @endadminCan </ul> </li> @endif resources/views/Post/popular_blog.blade.php 0000644 00000026634 15012236065 0015117 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Popular Post') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('Popular Post') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Popular Post') => '#', ]" /> <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.popular-blogs') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body pb-1"> <div class="row"> <div class="col-md-6 col-lg-4 form-group mb-3"> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-md-6 col-lg-4 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-md-6 col-lg-4 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-md-6 col-lg-4 form-group mb-3"> <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-6 col-lg-4 form-group mb-3"> <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="__('Popular Post')" /> <div> <x-admin.add-button :href="route('admin.blogs.create')" /> </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="30%">{{ __('Title') }}</th> <th width="15%">{{ __('Category') }}</th> <th width="10%">{{ __('Show Homepage') }}</th> <th width="15%">{{ __('Status') }}</th> <th width="15%">{{ __('Action') }}</th> </tr> </thead> <tbody> @forelse ($posts as $blog) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $blog->title }}</td> <td>{{ $blog?->category?->title }}</td> <td> @if ($blog->show_homepage == 1) <span class="badge bg-success">{{ __('Yes') }}</span> @else <span class="badge bg-danger">{{ __('No') }}</span> @endif </td> <td> <input onchange="changeStatus({{ $blog->id }})" id="status_toggle" type="checkbox" {{ $blog->status ? 'checked' : '' }} data-toggle="toggle" data-onlabel="{{ __('Active') }}" data-offlabel="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td> <x-admin.edit-button :href="route('admin.blogs.edit', [ 'blog' => $blog->id, 'code' => getSessionLanguage(), ])" /> <x-admin.delete-button :id="$blog->id" onclick="deleteData" /> </tr> @empty <x-empty-table :name="__('Post')" route="admin.blogs.create" create="yes" :message="__('No data found!')" colspan="7" /> @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $posts->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> "use strict" function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/blogs/') }}' + "/" + id) } "use strict" 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/blogs/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/Post/edit.blade.php 0000644 00000040022 15012236065 0013342 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Edit Post') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Edit Post') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Blog List') => route('admin.blogs.index'), __('Edit Post') => '#', ]" /> <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('blog.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.blogs.edit', ['blog' => $blog->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"> <x-admin.form-title :text="__('Edit Post')" /> <div> <x-admin.back-button :href="route('admin.blogs.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.blogs.update', [ 'blog' => $blog->id, 'code' => $code, ]) }}" method="POST" enctype="multipart/form-data"> @csrf @method('PUT') <div class="row"> <div class="form-group col-md-12"> <x-admin.form-input id="title" data-translate="true" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ $blog->getTranslation($code)->title }}" required="true" /> </div> @if ($code == $languages->first()->code) <div class="form-group col-md-8"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ $blog->slug }}" required="true" /> </div> <div class="form-group col-md-4"> <x-admin.form-select name="blog_category_id" id="blog_category_id" class="select2" label="{{ __('Category') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select Category') }}" /> @foreach ($categories as $category) <x-admin.select-option :selected="$category->id == old('blog_category_id', $blog->blog_category_id)" value="{{ $category->id }}" text="{{ $category->title }}" /> @endforeach </x-admin.form-select> </div> @endif <div class="form-group col-md-12"> <x-admin.form-textarea id="short_description" name="short_description" label="{{ __('Short Description') }}" placeholder="{{ __('Enter Short Description') }}" data-translate="true" value="{{ $blog->getTranslation($code)->short_description }}" maxlength="2000" required="true"/> </div> <div class="form-group col-md-12"> <x-admin.form-editor id="description" data-translate="true" name="description" label="{{ __('Description') }}" value="{!! $blog->getTranslation($code)->description !!}" required="true" /> </div> @if ($code == $languages->first()->code) <div class="form-group col-md-4"> <x-admin.form-switch name="show_homepage" label="{{ __('Show on homepage') }}" :checked="$blog->show_homepage == 1" /> </div> <div class="form-group col-md-4"> <x-admin.form-switch name="is_popular" label="{{ __('Mark as Popular') }}" :checked="$blog->is_popular == 1" /> </div> <div class="form-group col-md-4"> <x-admin.form-switch name="status" label="{{ __('Status') }}" :checked="$blog->status == 1" /> </div> @endif <div class="form-group col-md-12"> <x-admin.form-input id="seo_title" name="seo_title" label="{{ __('SEO Title') }}" placeholder="{{ __('Enter SEO Title') }}" data-translate="true" value="{{ $blog->getTranslation($code)->seo_title }}" /> </div> <div class="form-group col-md-12"> <x-admin.form-textarea id="seo_description" name="seo_description" label="{{ __('SEO Description') }}" placeholder="{{ __('Enter SEO Description') }}" data-translate="true" value="{{ $blog->getTranslation($code)->seo_description }}" maxlength="2000" /> </div> @if ($code == $languages->first()->code) <div class="form-group col-md-12"> <x-admin.form-image-preview :image="$blog->image" /> </div> @endif </div> <div class="row"> <div class="col-md-12"> <x-admin.update-button :text="__('Update')" /> </div> </div> </form> </div> </div> </div> </div> </div> </section> </div> @endsection @push('js') @if ($code == $languages->first()->code) <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> @else <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); 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> @endif @endpush resources/views/Post/create.blade.php 0000644 00000015044 15012236065 0013666 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Create Post') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> <x-admin.breadcrumb title="{{ __('Create Post') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Blog List') => route('admin.blogs.index'), __('Create Post') => '#', ]" /> <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 Post')" /> <div> <x-admin.back-button :href="route('admin.blogs.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.blogs.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="row"> <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-8"> <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-4"> <x-admin.form-select name="blog_category_id" id="blog_category_id" class="select2" label="{{ __('Category') }} " required="true"> <x-admin.select-option value="" text="{{ __('Select Category') }}" /> @foreach ($categories as $category) <x-admin.select-option :selected="$category->id == old('blog_category_id')" value="{{ $category->id }}" text="{{ $category->title }}" /> @endforeach </x-admin.form-select> </div> <div class="form-group col-md-12"> <x-admin.form-textarea id="short_description" name="short_description" label="{{ __('Short Description') }}" placeholder="{{ __('Enter Short Description') }}" value="{{ old('short_description') }}" maxlength="2000" required="true"/> </div> <div class="form-group col-md-12"> <x-admin.form-editor id="description" name="description" label="{{ __('Description') }}" value="{!! old('description') !!}" required="true"/> </div> <div class="form-group col-md-4"> <x-admin.form-switch name="show_homepage" label="{{ __('Show on homepage') }}" :checked="old('show_homepage') == 1"/> </div> <div class="form-group col-md-4"> <x-admin.form-switch name="is_popular" label="{{ __('Mark as Popular') }}" :checked="old('is_popular') == 1"/> </div> <div class="form-group col-md-4"> <x-admin.form-switch name="status" label="{{ __('Status') }}" :checked="old('status') == 1"/> </div> <div class="form-group col-md-12"> <x-admin.form-input id="seo_title" name="seo_title" label="{{ __('SEO Title') }}" placeholder="{{ __('Enter SEO Title') }}" value="{{ old('seo_title') }}"/> </div> <div class="form-group col-md-12"> <x-admin.form-textarea id="seo_description" name="seo_description" label="{{ __('SEO Description') }}" placeholder="{{ __('Enter SEO Description') }}" value="{{ old('seo_description') }}" maxlength="2000" /> </div> <div class="form-group col-md-12"> <x-admin.form-image-preview required="true"/> </div> </div> <div class="row"> <div class="col-md-12"> <x-admin.save-button :text="__('Save')" /> </div> </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/Post/index.blade.php 0000644 00000026617 15012236065 0013542 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Post List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('Post List') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Post 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.blogs.index') }}" method="GET" onchange="$(this).trigger('submit')" class="card-body pb-1"> <div class="row"> <div class="col-md-6 col-xl-4 form-group mb-3 "> <x-admin.form-input name="keyword" placeholder="{{ __('Search') }}" value="{{ request()->get('keyword') }}" /> </div> <div class="col-md-6 col-xl-4 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-md-6 col-xl-4 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-md-6 col-xl-4 form-group mb-3"> <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-6 col-xl-4 form-group mb-3"> <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="__('Post List')" /> <div> <x-admin.add-button :href="route('admin.blogs.create')" /> </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="30%">{{ __('Title') }}</th> <th width="15%">{{ __('Category') }}</th> <th width="10%">{{ __('Show Homepage') }}</th> <th width="15%">{{ __('Status') }}</th> <th width="15%">{{ __('Action') }}</th> </tr> </thead> <tbody> @forelse ($posts as $blog) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $blog->title }}</td> <td>{{ $blog?->category?->title }}</td> <td> @if ($blog->show_homepage == 1) <span class="badge bg-success">{{ __('Yes') }}</span> @else <span class="badge bg-danger">{{ __('No') }}</span> @endif </td> <td> <input onchange="changeStatus({{ $blog->id }})" id="status_toggle" type="checkbox" {{ $blog->status ? 'checked' : '' }} data-toggle="toggle" data-onlabel="{{ __('Active') }}" data-offlabel="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td> <x-admin.edit-button :href="route('admin.blogs.edit', [ 'blog' => $blog->id, 'code' => getSessionLanguage(), ])" /> <x-admin.delete-button :id="$blog->id" onclick="deleteData" /> </tr> @empty <x-empty-table :name="__('Post')" route="admin.blogs.create" create="yes" :message="__('No data found!')" colspan="7" /> @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $posts->onEachSide(0)->links() }} </div> @endif </div> </div> </div> </div> </div> </section> </div> <x-admin.delete-modal /> @endsection @push('js') <script> "use strict" function deleteData(id) { $("#deleteForm").attr("action", '{{ url('/admin/blogs/') }}' + "/" + id) } "use strict" 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/blogs/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/Comment/show.blade.php 0000644 00000007541 15012236065 0014063 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Post Comments') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('All Comments') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Post Comments') => route('admin.blog-comment.index'), __('All Comments') => '#', ]" /> <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="__('Post Comments')" /> <div> <x-admin.back-button :href="route('admin.blog-comment.index')" /> </div> </div> <div class="card-body"> <div class="card-body"> <ul class="list-unstyled list-unstyled-border list-unstyled-noborder"> @foreach ($comments as $comment) <li class="media"> <img alt="image" class="me-3 rounded-circle" width="70" src="{{ asset($setting->default_avatar) }}"> <div class="media-body"> <div class="media-right"> @if ($comment->status == 1) <div class="text-primary">{{ __('Approved') }}</div> @else <div class="text-warning">{{ __('Pending') }}</div> @endif </div> <div class="mb-1 media-title">{{ $comment->name }}</div> <div class="text-time">{{ formattedDateTime($comment?->created_at) }} </div> <div class="media-description text-muted"> {!! $comment->comment !!} </div> <div class="media-links"> <div class="bullet"></div> <a href="javascript:;" data-bs-toggle="modal" data-bs-target="#deleteModal" onclick="deleteData({{ $comment->id }})" class="text-danger">{{ __('Trash') }}</a> </div> </div> </li> @endforeach </ul> </div> <div class="float-right"> {{ $comments->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/blog-comment/") }}' + "/" + id) } </script> @endpush resources/views/Comment/index.blade.php 0000644 00000016673 15012236065 0014220 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Post Comments') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('Post Comments') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Post Comments') => '#', ]" /> <div class="section-body"> <div class="mt-4 row"> <div class="col-12"> <div class="card"> <div class="card-body"> <form onchange="$(this).trigger('submit')" action="{{ route('admin.update-general-setting') }}" method="POST"> @csrf @method('PUT') <label class="d-flex align-items-center mb-0"> <input type="hidden" value="inactive" name="comments_auto_approved" class="custom-switch-input"> <input {{ $setting->comments_auto_approved == 'active' ? 'checked' : '' }} type="checkbox" value="active" name="comments_auto_approved" class="custom-switch-input"> <span class="custom-switch-indicator"></span> <span class="custom-switch-description">{{ __('Comments Auto Approved') }}</span> </label> </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="__('Post Comments')" /> </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="30%">{{ __('Comment') }}</th> <th width="15%">{{ __('Post') }}</th> <th width="10%">{{ __('Author') }}</th> <th width="10%">{{ __('Email') }}</th> <th width="15%">{{ __('Status') }}</th> <th width="15%">{{ __('Action') }}</th> </tr> </thead> <tbody> @forelse ($comments as $comment) <tr> <td>{{ $loop->index + 1 }}</td> <td> {{ $comment->comment }} </td> <td>{{ $comment?->post?->title }}</td> <td> {{ $comment->name }} </td> <td> {{ $comment->email }} </td> <td> <input onchange="changeStatus({{ $comment->id }})" id="status_toggle" type="checkbox" {{ $comment->status ? 'checked' : '' }} data-toggle="toggle" data-onlabel="{{ __('Active') }}" data-offlabel="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td> <a href="{{ route('admin.blog-comment.show', $comment?->post?->id) }}" class="btn btn-success btn-sm"><i class="fa fa-eye" aria-hidden="true"></i></a> <x-admin.delete-button :id="$comment->id" onclick="deleteData" /> </tr> @empty <x-empty-table :name="__('Post Comments')" route="admin.blog-comment.index" create="no" :message="__('No data found!')" colspan="7"></x-empty-table> @endforelse </tbody> </table> </div> <div class="float-right"> {{ $comments->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/blog-comment/') }}' + "/" + 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/blog-comment/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/Category/edit.blade.php 0000644 00000025240 15012236065 0014177 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Category List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('Edit Category') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Category List') => route('admin.blog-category.index'), __('Edit Category') => '#', ]" /> <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('blog.category.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.blog-category.edit', ['blog_category' => $category->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"> <x-admin.form-title :text="__('Edit Category')" /> <div> <x-admin.back-button :href="route('admin.blog-category.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.blog-category.update', ['blog_category' => $category->id, 'code' => $code]) }}" method="post"> @csrf @method('PUT') <div class="row"> <div class="col-md-6"> <div class="form-group"> <x-admin.form-input data-translate="true" id="title" name="title" label="{{ __('Title') }}" placeholder="{{ __('Enter Title') }}" value="{{ old('title', $category->getTranslation($code)->title) }}" placeholder="{{ __('Enter Title') }}" required="true"/> </div> </div> @if ($code == $languages->first()->code) <div class="col-md-6"> <div class="form-group"> <x-admin.form-input id="slug" name="slug" label="{{ __('Slug') }}" placeholder="{{ __('Enter Slug') }}" value="{{ old('slug', $category->slug) }}" required="true"/> </div> </div> @endif <div class="col-md-12"> <x-admin.update-button :text="__('Update')" /> </div> </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/Category/create.blade.php 0000644 00000006367 15012236065 0014526 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Category List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('Add Category') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Category List') => route('admin.blog-category.index'), __('Add Category') => '#', ]" /> <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="__('Add Category')" /> <div> <x-admin.back-button :href="route('admin.blog-category.index')" /> </div> </div> <div class="card-body"> <form action="{{ route('admin.blog-category.store') }}" method="post"> @csrf <div class="row"> <div class="col-md-6"> <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-6"> <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="col-12"> <x-admin.save-button :text="__('Save')" /> </div> </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/Category/index.blade.php 0000644 00000024031 15012236065 0014356 0 ustar 00 @extends('admin.master_layout') @section('title') <title>{{ __('Category List') }}</title> @endsection @section('admin-content') <div class="main-content"> <section class="section"> {{-- Breadcrumb --}} <x-admin.breadcrumb title="{{ __('Category List') }}" :list="[ __('Dashboard') => route('admin.dashboard'), __('Category 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.blog-category.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="__('Category List')" /> <div> <x-admin.add-button :href="route('admin.blog-category.create')" /> </div> </div> <div class="card-body"> <div class="table-responsive max-h-400"> <table class="table table-striped"> <thead> <tr> <th>{{ __('SN') }}</th> <th>{{ __('Name') }}</th> <th>{{ __('Status') }}</th> <th class="text-center">{{ __('Actions') }}</th> </tr> </thead> <tbody> @forelse ($categories as $category) <tr> <td>{{ $loop->index + 1 }}</td> <td>{{ $category->title }}</td> <td> <input onchange="changeStatus({{ $category->id }})" id="status_toggle" type="checkbox" {{ $category->status ? 'checked' : '' }} data-toggle="toggle" data-onlabel="{{ __('Active') }}" data-offlabel="{{ __('Inactive') }}" data-onstyle="success" data-offstyle="danger"> </td> <td class="text-center"> <div> <x-admin.edit-button :href="route('admin.blog-category.edit', [ 'blog_category' => $category->id, 'code' => getSessionLanguage(), ])" /> <x-admin.delete-button :id="$category->id" onclick="deleteData" /> </div> </td> </tr> @empty <x-empty-table :name="__('Category')" route="admin.blog-category.create" create="yes" :message="__('No data found!')" colspan="5" /> @endforelse </tbody> </table> </div> @if (request()->get('par-page') !== 'all') <div class="float-right"> {{ $categories->onEachSide(3)->onEachSide(3)->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/blog-category/') }}' + "/" + 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/blog-category/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
| ver. 1.4 |
Github
|
.
| PHP 8.3.20 | Генерация страницы: 0.03 |
proxy
|
phpinfo
|
Настройка