From 0c6148c84dc6b4a672558a7772a836fcd4c2dd46 Mon Sep 17 00:00:00 2001 From: A1Gard Date: Fri, 14 Jun 2024 20:33:11 +0330 Subject: [PATCH] added clip controller --- app/Http/Controllers/Admin/ClipController.php | 155 ++++++++++++++++++ .../Controllers/Admin/GroupController.php | 2 +- app/Http/Requests/ClipSaveRequest.php | 32 ++++ app/Models/Clip.php | 7 +- app/Models/Gallery.php | 2 +- .../2024_05_07_124521_create_clips_table.php | 2 +- ...2024_05_07_124607_create_sliders_table.php | 2 +- .../views/admin/clips/clip-form.blade.php | 138 ++++++++++++++++ .../views/admin/clips/clip-list.blade.php | 15 ++ .../components/panel-side-navbar.blade.php | 2 +- routes/web.php | 13 ++ 11 files changed, 362 insertions(+), 8 deletions(-) create mode 100644 app/Http/Controllers/Admin/ClipController.php create mode 100644 app/Http/Requests/ClipSaveRequest.php create mode 100644 resources/views/admin/clips/clip-form.blade.php create mode 100644 resources/views/admin/clips/clip-list.blade.php diff --git a/app/Http/Controllers/Admin/ClipController.php b/app/Http/Controllers/Admin/ClipController.php new file mode 100644 index 0000000..1a09eec --- /dev/null +++ b/app/Http/Controllers/Admin/ClipController.php @@ -0,0 +1,155 @@ + + ['title' => "Edit", 'class' => 'btn-outline-primary', 'icon' => 'ri-edit-2-line'], + 'show' => + ['title' => "Detail", 'class' => 'btn-outline-light', 'icon' => 'ri-eye-line'], + 'destroy' => + ['title' => "Remove", 'class' => 'btn-outline-danger delete-confirm', 'icon' => 'ri-close-line'], + ]; + + + public function __construct() + { + parent::__construct(Clip::class, ClipSaveRequest::class); + } + + /** + * @param $clip Clip + * @param $request ClipSaveRequest + * @return Clip + */ + public function save($clip, $request) + { + + + $clip->title = $request->input('title'); + $clip->slug = $this->getSlug($clip,'slug','title'); + $clip->body = $request->input('body'); + $clip->user_id = auth()->id(); + $clip->status = $request->input('status'); +// if ($request->hasFile('clip')) { +// $name = $clip->slug . '.' . request()->clip->getClientOriginalExtension(); +// $clip->file = $name; +// $request->file('clip')->storeAs('public/clips', $name); +// } +// if ($request->hasFile('cover')) { +// $name = $clip->slug . '.' . request()->cover->getClientOriginalExtension(); +// $clip->cover = $name; +// $request->file('cover')->storeAs('public/clips', $name); +// } + if ($request->has('cover')){ + $clip->cover = $this->storeFile('cover',$clip, 'clips'); + } + if ($request->has('clip')){ + $clip->file = $this->storeFile('clip',$clip, 'clips'); + } + $clip->save(); + $tags = array_filter(explode(',,', $request->input('tags'))); + + if (count($tags) > 0){ + $clip->syncTags($tags); + } + return $clip; + + } + + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + return view($this->formView); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Clip $item) + { + // + return view($this->formView, compact('item')); + } + + public function bulk(Request $request) + { + +// dd($request->all()); + $data = explode('.', $request->input('action')); + $action = $data[0]; + $ids = $request->input('id'); + switch ($action) { + case 'delete': + $msg = __(':COUNT items deleted successfully', ['COUNT' => count($ids)]); + $this->_MODEL_::destroy($ids); + break; + /**restore*/ + case 'restore': + $msg = __(':COUNT items restored successfully', ['COUNT' => count($ids)]); + foreach ($ids as $id) { + $this->_MODEL_::withTrashed()->find($id)->restore(); + } + break; + /*restore**/ + case 'publish': + $this->_MODEL_::whereIn('id', $request->input('id'))->update(['status' => 1]); + $msg = __(':COUNT items published successfully', ['COUNT' => count($ids)]); + break; + case 'draft': + $this->_MODEL_::whereIn('id', $request->input('id'))->update(['status' => 0]); + $msg = __(':COUNT items drafted successfully', ['COUNT' => count($ids)]); + break; + default: + $msg = __('Unknown bulk action : :ACTION', ["ACTION" => $action]); + } + + return $this->do_bulk($msg, $action, $ids); + } + + public function destroy(Clip $item) + { + return parent::delete($item); + } + + + public function update(Request $request, Clip $item) + { + return $this->bringUp($request, $item); + } + + /**restore*/ + public function restore($item) + { + return parent::restoreing(Clip::withTrashed()->where('id', $item)->first()); + } + /*restore**/ +} diff --git a/app/Http/Controllers/Admin/GroupController.php b/app/Http/Controllers/Admin/GroupController.php index 0329d59..0eb93c7 100644 --- a/app/Http/Controllers/Admin/GroupController.php +++ b/app/Http/Controllers/Admin/GroupController.php @@ -18,7 +18,7 @@ class GroupController extends XController // protected $SAVE_REQUEST = GroupSaveRequest::class; protected $cols = ['name','subtitle','parent_id']; - protected $extra_cols = ['id','slug']; + protected $extra_cols = ['id','slug','image']; protected $searchable = ['name','subtitle','description']; diff --git a/app/Http/Requests/ClipSaveRequest.php b/app/Http/Requests/ClipSaveRequest.php new file mode 100644 index 0000000..ecf50b4 --- /dev/null +++ b/app/Http/Requests/ClipSaveRequest.php @@ -0,0 +1,32 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'title' => ['required', 'string', 'max:255','min:5'], + 'body' => ['nullable', 'string',], + 'active' => ['nullable', 'boolean'], + 'clip' => ['nullable', 'mimes:mp4', 'max:15728640'], + 'cover' => ['nullable', 'image', 'mimes:jpeg,png,jpg,gif,svg', 'max:2048'], + ]; + } +} diff --git a/app/Models/Clip.php b/app/Models/Clip.php index 3040cfb..a916fc5 100644 --- a/app/Models/Clip.php +++ b/app/Models/Clip.php @@ -5,11 +5,12 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Spatie\Tags\HasTags; use Spatie\Translatable\HasTranslations; class Clip extends Model { - use HasFactory, SoftDeletes, HasTranslations; + use HasFactory, SoftDeletes, HasTranslations,HasTags; public $translatable = ['title','body']; @@ -18,10 +19,10 @@ class Clip extends Model return 'slug'; } - public function coverUrl() + public function imgUrl() { if ($this->cover == null) { - return null; + return asset('assets/upload/logo.svg');; } return \Storage::url('clips/' . $this->cover); diff --git a/app/Models/Gallery.php b/app/Models/Gallery.php index e9b7c3d..f61f54a 100644 --- a/app/Models/Gallery.php +++ b/app/Models/Gallery.php @@ -51,7 +51,7 @@ class Gallery extends Model implements HasMedia if ($this->getMedia()->count() > 0) { return $this->getMedia()->first()->getUrl('gthumb'); } else { - return "no image"; + return asset('assets/upload/logo.svg'); } } diff --git a/database/migrations/2024_05_07_124521_create_clips_table.php b/database/migrations/2024_05_07_124521_create_clips_table.php index 49c1ea6..29d6597 100644 --- a/database/migrations/2024_05_07_124521_create_clips_table.php +++ b/database/migrations/2024_05_07_124521_create_clips_table.php @@ -19,7 +19,7 @@ return new class extends Migration $table->string('file', 2048)->nullable(); $table->string('cover', 2048)->nullable(); $table->unsignedBigInteger('user_id'); - $table->boolean('active')->default(true); + $table->unsignedTinyInteger('status')->default(0); $table->softDeletes(); $table->timestamps(); $table->foreign('user_id') diff --git a/database/migrations/2024_05_07_124607_create_sliders_table.php b/database/migrations/2024_05_07_124607_create_sliders_table.php index a1e3ef6..7d05130 100644 --- a/database/migrations/2024_05_07_124607_create_sliders_table.php +++ b/database/migrations/2024_05_07_124607_create_sliders_table.php @@ -17,7 +17,7 @@ return new class extends Migration $table->string('image'); $table->string('tag')->nullable(); $table->unsignedBigInteger('user_id'); - $table->boolean('active')->default(true); + $table->unsignedTinyInteger('status')->default(0); $table->json('data'); $table->timestamps(); $table->foreign('user_id') diff --git a/resources/views/admin/clips/clip-form.blade.php b/resources/views/admin/clips/clip-form.blade.php new file mode 100644 index 0000000..7871e14 --- /dev/null +++ b/resources/views/admin/clips/clip-form.blade.php @@ -0,0 +1,138 @@ +@extends('admin.templates.panel-form-template') +@section('title') + @if(isset($item)) + {{__("Edit clip")}} [{{$item->title}}] + @else + {{__("Add new clip")}} + @endif - +@endsection +@section('form') + +
+
+ + @include('components.err') +
+

+ + {{__("Tips")}} +

+
    +
  • + {{__("Add cover to better results")}} +
  • +
  • + {{__("You can create / edit clip as draft, publish it when you want")}} +
  • +
+
+ @if(isset($item)) +
+

+ + {{__("Preview")}} +

+
+ +
+
+ @endif +
+ +
+
+ +

+ @if(isset($item)) + {{__("Edit clip")}} [{{$item->title}}] + @else + {{__("Add new clip")}} + @endif +

+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+ + + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ + +
+ +
+
+
+
+@endsection diff --git a/resources/views/admin/clips/clip-list.blade.php b/resources/views/admin/clips/clip-list.blade.php new file mode 100644 index 0000000..0b18f9c --- /dev/null +++ b/resources/views/admin/clips/clip-list.blade.php @@ -0,0 +1,15 @@ +@extends('admin.templates.panel-list-template') + +@section('list-title') + + {{__("Clips list")}} +@endsection +@section('title') + {{__("Clips list")}} - +@endsection +@section('filter') + {{-- Other filters --}} +@endsection +@section('bulk') + {{-- --}} +@endsection diff --git a/resources/views/components/panel-side-navbar.blade.php b/resources/views/components/panel-side-navbar.blade.php index f6dc233..485aa57 100644 --- a/resources/views/components/panel-side-navbar.blade.php +++ b/resources/views/components/panel-side-navbar.blade.php @@ -97,7 +97,7 @@
  • - + {{__("Video clips")}} diff --git a/routes/web.php b/routes/web.php index 79619c8..d3eed1b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -65,6 +65,19 @@ Route::prefix(config('app.panel.prefix'))->name('admin.')->group( Route::post('bulk', [\App\Http\Controllers\Admin\PostController::class, "bulk"])->name('bulk'); Route::get('trashed', [\App\Http\Controllers\Admin\PostController::class, "trashed"])->name('trashed'); }); + Route::prefix('clips')->name('clip.')->group( + function () { + Route::get('', [\App\Http\Controllers\Admin\ClipController::class, 'index'])->name('index'); + Route::get('create', [\App\Http\Controllers\Admin\ClipController::class, 'create'])->name('create'); + Route::post('store', [\App\Http\Controllers\Admin\ClipController::class, 'store'])->name('store'); + Route::get('show/{item}', [\App\Http\Controllers\Admin\ClipController::class, 'show'])->name('show'); + Route::get('edit/{item}', [\App\Http\Controllers\Admin\ClipController::class, 'edit'])->name('edit'); + Route::post('update/{item}', [\App\Http\Controllers\Admin\ClipController::class, 'update'])->name('update'); + Route::get('delete/{item}', [\App\Http\Controllers\Admin\ClipController::class, 'destroy'])->name('destroy'); + Route::get('restore/{item}', [\App\Http\Controllers\Admin\ClipController::class, 'restore'])->name('restore'); + Route::post('bulk', [\App\Http\Controllers\Admin\ClipController::class, "bulk"])->name('bulk'); + Route::get('trashed', [\App\Http\Controllers\Admin\ClipController::class, "trashed"])->name('trashed'); + }); Route::prefix('galleries')->name('gallery.')->group( function () { Route::get('', [\App\Http\Controllers\Admin\GalleryController::class, 'index'])->name('index');