diff --git a/app/Http/Controllers/Admin/PostController.php b/app/Http/Controllers/Admin/PostController.php index 71baf96..91aa1ef 100644 --- a/app/Http/Controllers/Admin/PostController.php +++ b/app/Http/Controllers/Admin/PostController.php @@ -123,6 +123,7 @@ class PostController extends XController $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)]); @@ -131,7 +132,6 @@ class PostController extends XController $this->_MODEL_::whereIn('id', $request->input('id'))->update(['status' => 0]); $msg = __(':COUNT items drafted successfully', ['COUNT' => count($ids)]); break; - /*restore**/ default: $msg = __('Unknown bulk action : :ACTION', ["ACTION" => $action]); } diff --git a/app/Http/Controllers/Admin/SliderController.php b/app/Http/Controllers/Admin/SliderController.php new file mode 100644 index 0000000..2c24400 --- /dev/null +++ b/app/Http/Controllers/Admin/SliderController.php @@ -0,0 +1,128 @@ + + ['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(Slider::class, SliderSaveRequest::class); + } + + /** + * @param $slider Slider + * @param $request SliderSaveRequest + * @return Slider + */ + public function save($slider, $request) + { + + $slider->body = $request->input('body', ''); + $slider->status = $request->input('status'); + $slider->data = $request->input('data'); + $slider->user_id = auth()->id(); + if ($request->hasFile('cover')) { + $name = time() . '.' . request()->cover->getClientOriginalExtension(); + $slider->image = $name; + $request->file('cover')->storeAs('public/sliders', $name); + } + + if ($request->has('cover')){ + $slider->image = $this->storeFile('cover',$slider, 'sliders'); + } + $slider->save(); + return $slider; + + } + + + /** + * 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(Slider $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; + 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(Slider $item) + { + return parent::delete($item); + } + + + public function update(Request $request, Slider $item) + { + return $this->bringUp($request, $item); + } + + +} diff --git a/app/Http/Requests/SliderSaveRequest.php b/app/Http/Requests/SliderSaveRequest.php new file mode 100644 index 0000000..337232d --- /dev/null +++ b/app/Http/Requests/SliderSaveRequest.php @@ -0,0 +1,31 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'body' => ['required', 'string','min:1'], + 'status' => ['required', 'boolean'], + 'data'=> ['nullable'], + 'cover' => ['nullable', 'image', 'mimes:jpeg,png,jpg,gif,svg', 'max:4096'], + ]; + } +} 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 7d05130..d1ca8bc 100644 --- a/database/migrations/2024_05_07_124607_create_sliders_table.php +++ b/database/migrations/2024_05_07_124607_create_sliders_table.php @@ -18,7 +18,7 @@ return new class extends Migration $table->string('tag')->nullable(); $table->unsignedBigInteger('user_id'); $table->unsignedTinyInteger('status')->default(0); - $table->json('data'); + $table->json('data')->nullable(); $table->timestamps(); $table->foreign('user_id') ->references('id')->on('users'); diff --git a/resources/js/app.js b/resources/js/app.js index 0893946..111718d 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -52,7 +52,7 @@ app.component('vue-date-range-picker-input', vueDateRangePicker); import SearchableSelect from "./components/SearchableSelect.vue"; app.component('searchable-select', SearchableSelect); -import SearchableMultiSelect from "./components/searchableMultiSelect.vue"; +import SearchableMultiSelect from "./components/SearchableMultiSelect.vue"; app.component('searchable-multi-select', SearchableMultiSelect); import Increment from "./components/Increment.vue"; @@ -60,6 +60,9 @@ app.component('increment', Increment); import TagInput from "./components/TagInput.vue"; app.component('tag-input', TagInput); + +import SliderData from "./components/SliderData.vue"; +app.component('slider-data', SliderData); /** * The following block of code may be used to automatically register your * Vue components. It will recursively scan this directory for the Vue diff --git a/resources/js/components/ExampleComponent.vue b/resources/js/components/ExampleComponent.vue index 20ebdcc..73a9d59 100644 --- a/resources/js/components/ExampleComponent.vue +++ b/resources/js/components/ExampleComponent.vue @@ -58,7 +58,7 @@ import CurrencyInput from "./CurrencyInput.vue"; import fontAwesomeIconPicker from "./FontAwesomeIconPicker.vue"; import remixIconPicker from "./RemixIconPicker.vue"; import searchableSelect from "./SearchableSelect.vue"; -import searchableMultiSelect from "./searchableMultiSelect.vue"; +import SearchableMultiSelect from "./SearchableMultiSelect.vue"; import vueDateTimePicker from "./vueDateTimePicker.vue"; import vueDateRangePicker from "./vueDateRangePicker.vue"; import Increment from "./Increment.vue"; @@ -66,7 +66,7 @@ export default { name: "example", components: { CurrencyInput, fontAwesomeIconPicker, remixIconPicker,Increment, - searchableSelect, searchableMultiSelect, vueDateRangePicker, vueDateTimePicker + searchableSelect, SearchableMultiSelect, vueDateRangePicker, vueDateTimePicker }, data: () => { return { diff --git a/resources/js/components/searchableMultiSelect.vue b/resources/js/components/SearchableMultiSelect.vue similarity index 100% rename from resources/js/components/searchableMultiSelect.vue rename to resources/js/components/SearchableMultiSelect.vue diff --git a/resources/js/components/SliderData.vue b/resources/js/components/SliderData.vue new file mode 100644 index 0000000..48aaa6e --- /dev/null +++ b/resources/js/components/SliderData.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/resources/views/admin/clips/clip-list.blade.php b/resources/views/admin/clips/clip-list.blade.php index 0b18f9c..c861bde 100644 --- a/resources/views/admin/clips/clip-list.blade.php +++ b/resources/views/admin/clips/clip-list.blade.php @@ -11,5 +11,6 @@ {{-- Other filters --}} @endsection @section('bulk') - {{-- --}} + + @endsection diff --git a/resources/views/admin/sliders/slider-form.blade.php b/resources/views/admin/sliders/slider-form.blade.php new file mode 100644 index 0000000..cc3c66f --- /dev/null +++ b/resources/views/admin/sliders/slider-form.blade.php @@ -0,0 +1,104 @@ +@extends('admin.templates.panel-form-template') +@section('title') + @if(isset($item)) + {{__("Edit slider")}} [{{$item->id}}] + @else + {{__("Add new slider")}} + @endif - +@endsection +@section('form') + +
+
+ + @include('components.err') +
+

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

+
    +
  • + {{__("Recommends")}} +
  • +
+
+ @if(isset($item)) +
+

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

+
+ image +
+
+ @endif +
+

+ + {{__("Slider data")}} +

+
+ +
+
+
+
+
+ +

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

+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ + +
+ +
+ +
+
+
+@endsection diff --git a/resources/views/admin/sliders/slider-list.blade.php b/resources/views/admin/sliders/slider-list.blade.php new file mode 100644 index 0000000..b7d0cb2 --- /dev/null +++ b/resources/views/admin/sliders/slider-list.blade.php @@ -0,0 +1,17 @@ +@extends('admin.templates.panel-list-template') + +@section('list-title') + + {{__("Sliders list")}} +@endsection +@section('title') + {{__("Sliders list")}} - +@endsection +@section('filter') + {{-- Other filters --}} +@endsection +@section('bulk') + {{-- --}} + + +@endsection diff --git a/resources/views/admin/templates/panel-list-template.blade.php b/resources/views/admin/templates/panel-list-template.blade.php index cb25b4f..5206f5c 100644 --- a/resources/views/admin/templates/panel-list-template.blade.php +++ b/resources/views/admin/templates/panel-list-template.blade.php @@ -157,7 +157,9 @@ @if(isset($item) && method_exists($item,'imgUrl')) + + @endif @foreach($cols as $k => $col) @@ -165,7 +167,7 @@ - {{$item?->{$cols[0]} }} + {{strip_tags($item?->{$cols[0]}) }} diff --git a/resources/views/components/panel-side-navbar.blade.php b/resources/views/components/panel-side-navbar.blade.php index 485aa57..8fc8047 100644 --- a/resources/views/components/panel-side-navbar.blade.php +++ b/resources/views/components/panel-side-navbar.blade.php @@ -123,7 +123,7 @@
  • - + {{__("Slider")}} diff --git a/routes/web.php b/routes/web.php index d3eed1b..74604bc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -90,5 +90,17 @@ Route::prefix(config('app.panel.prefix'))->name('admin.')->group( Route::get('delete/{item}', [\App\Http\Controllers\Admin\GalleryController::class, 'destroy'])->name('destroy'); Route::post('bulk', [\App\Http\Controllers\Admin\GalleryController::class, "bulk"])->name('bulk'); }); + Route::prefix('sliders')->name('slider.')->group( + function () { + Route::get('', [\App\Http\Controllers\Admin\SliderController::class, 'index'])->name('index'); + Route::get('create', [\App\Http\Controllers\Admin\SliderController::class, 'create'])->name('create'); + Route::post('store', [\App\Http\Controllers\Admin\SliderController::class, 'store'])->name('store'); + Route::get('show/{item}', [\App\Http\Controllers\Admin\SliderController::class, 'show'])->name('show'); + Route::post('title/update', [\App\Http\Controllers\Admin\SliderController::class, 'updateTitle'])->name('title'); + Route::get('edit/{item}', [\App\Http\Controllers\Admin\SliderController::class, 'edit'])->name('edit'); + Route::post('update/{item}', [\App\Http\Controllers\Admin\SliderController::class, 'update'])->name('update'); + Route::get('delete/{item}', [\App\Http\Controllers\Admin\SliderController::class, 'destroy'])->name('destroy'); + Route::post('bulk', [\App\Http\Controllers\Admin\SliderController::class, "bulk"])->name('bulk'); + }); }); });