From 22c6f45111dd9c346a060aa234d19f0441d8a0c4 Mon Sep 17 00:00:00 2001 From: A1Gard Date: Mon, 10 Jun 2024 18:54:36 +0330 Subject: [PATCH] added xController store ad update form template edited menu and order migration --- app/Helpers/Helper.php | 27 ++++- app/Http/Controllers/Admin/UserController.php | 61 +++++++++- app/Http/Controllers/XController.php | 71 +++++------ app/Http/Requests/UserSaveRequest.php | 32 +++++ app/Models/Item.php | 20 ++- app/Models/Menu.php | 2 +- app/Models/MenuItem.php | 29 ----- app/Models/Order.php | 11 ++ .../{MenuItemFactory.php => OrderFactory.php} | 4 +- ...2024_05_07_124607_create_sliders_table.php | 1 + ... 2024_05_07_125601_create_items_table.php} | 4 +- ...> 2024_05_07_125917_create_advs_table.php} | 0 ...2024_05_07_130906_create_orders_table.php} | 4 +- .../{MenuItemSeeder.php => OrderSeeder.php} | 2 +- .../js/components/searchableMultiSelect.vue | 92 ++++++++++---- resources/js/panel/list-checkboxs.js | 73 ++++++----- resources/js/panel/navbar.js | 14 ++- resources/sass/panel/_breadcrumbs.scss | 6 +- resources/sass/panel/_common.scss | 27 +++++ .../templates/panel-form-template.blade.php | 40 ++++++ .../templates/panel-list-template.blade.php | 9 +- .../views/admin/users/user-form.blade.php | 114 +++++++++++++++++- .../views/admin/users/user-list.blade.php | 2 +- 23 files changed, 503 insertions(+), 142 deletions(-) create mode 100644 app/Http/Requests/UserSaveRequest.php delete mode 100644 app/Models/MenuItem.php create mode 100644 app/Models/Order.php rename database/factories/{MenuItemFactory.php => OrderFactory.php} (86%) rename database/migrations/{2024_05_07_124821_create_menu_items_table.php => 2024_05_07_125601_create_items_table.php} (91%) rename database/migrations/{2024_05_07_124917_create_advs_table.php => 2024_05_07_125917_create_advs_table.php} (100%) rename database/migrations/{2024_05_07_132601_create_items_table.php => 2024_05_07_130906_create_orders_table.php} (91%) rename database/seeders/{MenuItemSeeder.php => OrderSeeder.php} (86%) create mode 100644 resources/views/admin/templates/panel-form-template.blade.php diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index 5f001b2..09d77a4 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -92,10 +92,13 @@ function getEmojiLanguagebyCode($lang) : string * @return bool */ -function hasRoute($name,$endRoute = 'index') : bool +function hasRoute($name) : bool { // create route - $cRuote = str_replace($endRoute, $name, request()->route()->getName()); + $routes = explode('.',request()->route()->getName()); + $routes[count($routes) - 1 ] = $name; + $cRuote = implode('.',$routes); + if (\Illuminate\Support\Facades\Route::has($cRuote)) { return true; } else { @@ -107,13 +110,15 @@ function hasRoute($name,$endRoute = 'index') : bool * get named route url * @param $name string * @param $args array - * @param $endRoute string 'index' or alt list * @return string|null */ -function getRoute($name, $args = [],$endRoute = 'index') : string | null +function getRoute($name, $args = []) : string | null { // create route - $cRuote = str_replace($endRoute, $name, request()->route()->getName()); + $routes = explode('.',request()->route()->getName()); + $routes[count($routes) - 1 ] = $name; + $cRuote = implode('.',$routes); + if (\Illuminate\Support\Facades\Route::has($cRuote)) { return \route($cRuote, $args); } else { @@ -203,3 +208,15 @@ function logAdmin($method, $cls, $id) :void 'loggable_id' => $id, ]); } + + + + +function queryBuilder($except = null){ + $queries = request()->toArray(); + if ($except != null){ + unset($queries[$except]); + unset($queries['sortType']); + } + return http_build_query($queries); +} diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 87b6da1..50d1081 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers\Admin; use App\CreateOrUpdate; use App\Http\Controllers\Controller; use App\Http\Controllers\XController; +use App\Http\Requests\UserSaveRequest; +use App\Models\Access; use App\Models\Item; use App\Models\User; use App\SafeController; @@ -19,6 +21,9 @@ class UserController extends XController protected $searchable = ['name','mobile','email']; + + protected const request = UserSaveRequest::class; + protected $buttons = [ 'edit' => ['title' => "Edit", 'class' => 'btn-outline-primary', 'icon' => 'ri-edit-2-line'], @@ -30,12 +35,58 @@ class UserController extends XController ['title' => "Remove", 'class' => 'btn-outline-danger delete-confirm', 'icon' => 'ri-close-line'], ]; - public function createOrUpdate( $item, $request) + public function save($user, $request) { + $user->name = $request->input('name'); + $user->email = $request->input('email'); + if (trim($request->input('password')) != '') { + $user->password = bcrypt($request->input('password')); + } + $user->mobile = $request->input('mobile'); + $user->role = $request->input('role'); + $user->syncRoles($request->input('role')); + $user->save(); + if ($request->has('acl')) { + $user->accesses()->delete(); + foreach ($request->input('acl', []) as $route) { + $a = new Access(); + $a->route = $route; + $a->user_id = $user->id; + $a->save(); + $routes = explode('.', $route); + if ($routes[2] == 'store' || $routes[2] == 'update') { + $routes[2] = $routes[2] == 'store' ? 'create' : 'edit'; + $a = new Access(); + $a->route = implode('.', $routes); + $a->user_id = $user->id; + $a->save(); + } + } + } + return $user; } + + /** + * 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(User $item) + { + // + return view($this->formView,compact('item')); + } + public function bulk(Request $request){ // dd($request->all()); @@ -45,12 +96,12 @@ class UserController extends XController switch ($action) { case 'delete': $msg = __(':COUNT items deleted successfully',['COUNT' => count($ids)]); - $this->model::destroy($ids); + self::_MODEL_::destroy($ids); break; case 'restore': $msg = __(':COUNT items restored successfully',['COUNT' => count($ids)]); foreach ($ids as $id) { - $this->model::withTrashed()->find($id)->restore(); + self::_MODEL_::withTrashed()->find($id)->restore(); } break; case 'role': @@ -74,6 +125,10 @@ class UserController extends XController return parent::delete($item); } + + public function update(Request $request,User $item ){ + return $this->bringUp($request, $item); + } public function restore($item) { diff --git a/app/Http/Controllers/XController.php b/app/Http/Controllers/XController.php index d1bd6e8..314ff47 100644 --- a/app/Http/Controllers/XController.php +++ b/app/Http/Controllers/XController.php @@ -2,15 +2,15 @@ namespace App\Http\Controllers; +use App\Http\Requests\UserSaveRequest; use App\Models\User; -use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; abstract class XController extends Controller { - protected $model = User::class; - protected $name = "User"; + protected const _MODEL_ = User::class; + protected const SAVE_REQUEST = UserSaveRequest::class; protected $cols = []; protected $extra_cols = ['id']; protected $listView = 'admin.users.user-list'; @@ -28,7 +28,7 @@ abstract class XController extends Controller ]; - public function createOrUpdate($item, $request) + public function save($user, $request) { } @@ -37,7 +37,7 @@ abstract class XController extends Controller { - if (hasRoute('trashed')){ + if (hasRoute('trashed')) { $this->extra_cols[] = 'deleted_at'; } $items = $query->paginate(config('app.panel.page_count'), @@ -52,9 +52,9 @@ abstract class XController extends Controller if (!\request()->has('sort') || !in_array(\request('sort'), $this->cols)) { - $query = $this->model::orderByDesc('id'); + $query = self::_MODEL_::orderByDesc('id'); } else { - $query = $this->model::orderBy(\request('sort'), \request('sortType', 'asc')); + $query = self::_MODEL_::orderBy(\request('sort'), \request('sortType', 'asc')); } foreach (\request()->input('filter', []) as $col => $filter) { @@ -95,14 +95,7 @@ abstract class XController extends Controller } - /** - * Show the form for creating a new resource. - */ - public function create() - { - // - } /** * Store a newly created resource in storage. @@ -110,14 +103,18 @@ abstract class XController extends Controller public function store(Request $request) { // - $item = new $this->model(); - $item = $this->create($item,$request); - logAdmin(__METHOD__, $this->model , $item->id); - - if ($request->ajax()){ - return ['OK' => true,]; - }else{ - return redirect()->route('admin.'.$this->model.'.index')->with(['message' => __('As you wished created successfully')]); + + $validatedRequest = app()->make(self::SAVE_REQUEST)->merge($request->all()); + + $item = new (self::_MODEL_)(); + $item = $this->save($item, $request); + logAdmin(__METHOD__, self::_MODEL_, $item->id); + + if ($request->ajax()) { + return ['OK' => true, __('As you wished created successfully')]; + } else { + return redirect(getRoute('edit', $item->{$item->getRouteKeyName()})) + ->with(['message' => __('As you wished created successfully')]); } } @@ -129,20 +126,24 @@ abstract class XController extends Controller // } - /** - * Show the form for editing the specified resource. - */ - public function edit($user) - { - // - } /** * Update the specified resource in storage. */ - public function update(Request $request, $user) + public function bringUp(Request $request, $item) { // + + $validatedRequest = app()->make(self::SAVE_REQUEST)->merge($request->all()); + $item = $this->save($item, $request); + logAdmin(__METHOD__, self::_MODEL_, $item->id); + + if ($request->ajax()) { + return ['OK' => true, __('As you wished updated successfully')]; + } else { + return redirect(getRoute('edit', $item->{$item->getRouteKeyName()})) + ->with(['message' => __('As you wished updated successfully')]); + } } /** @@ -151,7 +152,7 @@ abstract class XController extends Controller public function delete($item) { // - logAdmin(__METHOD__, $this->model , $item->id); + logAdmin(__METHOD__, self::_MODEL_, $item->id); $item->delete(); return redirect()->back()->with(['message' => __('As you wished removed successfully')]); } @@ -162,7 +163,7 @@ abstract class XController extends Controller public function restoreing($item) { // - logAdmin(__METHOD__, $this->model , $item->id); + logAdmin(__METHOD__, self::_MODEL_, $item->id); $item->restore(); return redirect()->back()->with(['message' => __('As you wished restored successfully')]); } @@ -177,9 +178,11 @@ abstract class XController extends Controller return $this->showList($query); } - protected function do_bulk($msg,$action,$ids) + protected function do_bulk($msg, $action, $ids) { - logAdminBatch(__METHOD__ . '.' . $action, $this->model, $ids); + logAdminBatch(__METHOD__ . '.' . $action, self::_MODEL_, $ids); return redirect()->back()->with(['message' => $msg]); } + + } diff --git a/app/Http/Requests/UserSaveRequest.php b/app/Http/Requests/UserSaveRequest.php new file mode 100644 index 0000000..d7b116d --- /dev/null +++ b/app/Http/Requests/UserSaveRequest.php @@ -0,0 +1,32 @@ +check() and auth()->user()->hasRole('developer|admin'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255'], + 'mobile' => ['required', 'string', 'min:10'], + 'role' => ['required', 'string'], + 'email' => ['required', 'string', 'email', 'max:255', "unique:users,email,".$this->id], + 'password' => ['string', 'min:8', 'confirmed','nullable'], + ]; + } +} diff --git a/app/Models/Item.php b/app/Models/Item.php index 4fd06a6..070ad7a 100644 --- a/app/Models/Item.php +++ b/app/Models/Item.php @@ -4,8 +4,26 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Spatie\Translatable\HasTranslations; class Item extends Model { - use HasFactory; + use HasFactory,HasTranslations; + + public $translatable = ['title']; + + public function menu() + { + return $this->belongsTo(Menu::class, 'menu_id', 'id'); + } + + public function parent() + { + return $this->belongsTo(MenuItem::class, 'parent'); + } + + public function children() + { + return $this->hasMany(MenuItem::class, 'parent'); + } } diff --git a/app/Models/Menu.php b/app/Models/Menu.php index 6988928..2e16ffa 100644 --- a/app/Models/Menu.php +++ b/app/Models/Menu.php @@ -12,6 +12,6 @@ class Menu extends Model public function menuItems() { - return $this->hasMany(MenuItem::class, 'menu_id', 'id'); + return $this->hasMany(Item::class); } } diff --git a/app/Models/MenuItem.php b/app/Models/MenuItem.php deleted file mode 100644 index b623448..0000000 --- a/app/Models/MenuItem.php +++ /dev/null @@ -1,29 +0,0 @@ -belongsTo(Menu::class, 'menu_id', 'id'); - } - - public function parent() - { - return $this->belongsTo(MenuItem::class, 'parent'); - } - - public function children() - { - return $this->hasMany(MenuItem::class, 'parent'); - } -} diff --git a/app/Models/Order.php b/app/Models/Order.php new file mode 100644 index 0000000..70b5c62 --- /dev/null +++ b/app/Models/Order.php @@ -0,0 +1,11 @@ + + * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Order> */ -class MenuItemFactory extends Factory +class OrderFactory extends Factory { /** * Define the model's default state. 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 8e2a7ed..a1e3ef6 100644 --- a/database/migrations/2024_05_07_124607_create_sliders_table.php +++ b/database/migrations/2024_05_07_124607_create_sliders_table.php @@ -18,6 +18,7 @@ return new class extends Migration $table->string('tag')->nullable(); $table->unsignedBigInteger('user_id'); $table->boolean('active')->default(true); + $table->json('data'); $table->timestamps(); $table->foreign('user_id') ->references('id')->on('users'); diff --git a/database/migrations/2024_05_07_124821_create_menu_items_table.php b/database/migrations/2024_05_07_125601_create_items_table.php similarity index 91% rename from database/migrations/2024_05_07_124821_create_menu_items_table.php rename to database/migrations/2024_05_07_125601_create_items_table.php index 5f99448..4188de9 100644 --- a/database/migrations/2024_05_07_124821_create_menu_items_table.php +++ b/database/migrations/2024_05_07_125601_create_items_table.php @@ -11,7 +11,7 @@ return new class extends Migration */ public function up(): void { - Schema::create('menu_items', function (Blueprint $table) { + Schema::create('items', function (Blueprint $table) { $table->id(); $table->text('title'); // $table->morphs('menuable')->nullable();; @@ -37,6 +37,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('menu_items'); + Schema::dropIfExists('items'); } }; diff --git a/database/migrations/2024_05_07_124917_create_advs_table.php b/database/migrations/2024_05_07_125917_create_advs_table.php similarity index 100% rename from database/migrations/2024_05_07_124917_create_advs_table.php rename to database/migrations/2024_05_07_125917_create_advs_table.php diff --git a/database/migrations/2024_05_07_132601_create_items_table.php b/database/migrations/2024_05_07_130906_create_orders_table.php similarity index 91% rename from database/migrations/2024_05_07_132601_create_items_table.php rename to database/migrations/2024_05_07_130906_create_orders_table.php index 219e48c..ca64160 100644 --- a/database/migrations/2024_05_07_132601_create_items_table.php +++ b/database/migrations/2024_05_07_130906_create_orders_table.php @@ -11,7 +11,7 @@ return new class extends Migration */ public function up(): void { - Schema::create('items', function (Blueprint $table) { + Schema::create('orders', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('invoice_id'); $table->unsignedBigInteger('product_id'); @@ -34,6 +34,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('items'); + Schema::dropIfExists('orders'); } }; diff --git a/database/seeders/MenuItemSeeder.php b/database/seeders/OrderSeeder.php similarity index 86% rename from database/seeders/MenuItemSeeder.php rename to database/seeders/OrderSeeder.php index 152d676..aa29f8e 100644 --- a/database/seeders/MenuItemSeeder.php +++ b/database/seeders/OrderSeeder.php @@ -5,7 +5,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; -class MenuItemSeeder extends Seeder +class OrderSeeder extends Seeder { /** * Run the database seeds. diff --git a/resources/js/components/searchableMultiSelect.vue b/resources/js/components/searchableMultiSelect.vue index 38ad4ef..c602eef 100644 --- a/resources/js/components/searchableMultiSelect.vue +++ b/resources/js/components/searchableMultiSelect.vue @@ -1,17 +1,18 @@