From 67956ef5e65d94d4de3b3eeac4e205c77d7328ea Mon Sep 17 00:00:00 2001 From: Arif Rahman M <arifrm28@gmail.com> Date: Wed, 7 Jun 2023 09:51:51 +0700 Subject: [PATCH] select multi toko --- app/Http/Controllers/Auth/LoginController.php | 2 +- .../Owner/CompleteProfileController.php | 48 +--- .../Controllers/Owner/DashboardController.php | 28 +- .../Owner/Products/ProductBrandController.php | 4 +- .../Products/ProductsCategoryController.php | 8 +- .../Owner/Settings/StoreController.php | 179 +++++++++++++ app/Http/Requests/Owner/CategoryValidate.php | 2 - .../Owner/CompleteProfileValidate.php | 2 - app/Http/Requests/Owner/StoreValidate.php | 44 ++++ ..._05_16_143659_create_shop_models_table.php | 2 - database/seeders/menuSeeder.php | 14 +- .../fill-profile/form/business.blade.php | 26 -- resources/views/page/owner/index.blade.php | 50 +++- .../owner/products-category/index.blade.php | 24 +- .../owner/settings/store/add-edit.blade.php | 247 ++++++++++++++++++ .../page/owner/settings/store/index.blade.php | 221 ++++++++++++++++ routes/owner.php | 16 +- 17 files changed, 815 insertions(+), 102 deletions(-) create mode 100644 app/Http/Controllers/Owner/Settings/StoreController.php create mode 100644 app/Http/Requests/Owner/StoreValidate.php create mode 100644 resources/views/page/owner/settings/store/add-edit.blade.php create mode 100644 resources/views/page/owner/settings/store/index.blade.php diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 9e66df8..74c877d 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -73,7 +73,7 @@ public function handleGoogleCallback(Request $request) Auth::login($newUser); - return redirect()->intended(route('owner.complete-profile')); + return redirect()->intended(route('owner.complete-profile.index')); } catch (Exception $th) { DB::rollBack(); Log::error("Error when store data to databases in user registration with socialite, the error is: " . $th); diff --git a/app/Http/Controllers/Owner/CompleteProfileController.php b/app/Http/Controllers/Owner/CompleteProfileController.php index 96f5548..273299d 100644 --- a/app/Http/Controllers/Owner/CompleteProfileController.php +++ b/app/Http/Controllers/Owner/CompleteProfileController.php @@ -61,49 +61,6 @@ public function getVillage(Request $request) } } - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\Response - */ - public function create() - { - // - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) - { - // - } - - /** - * Show the form for editing the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function edit($id) - { - // - } - /** * Update the specified resource in storage. * @@ -135,9 +92,7 @@ public function update(CompleteProfileValidate $request, $idEncrypt) ShopModel::create([ 'name' => $request->nameBusiness, 'description' => $request->descriptionBusiness, - 'email' => $request->emailBusiness, 'user_id' => $userProfile->user_id, - 'contact' => $request->contactBusiness, 'province' => $provinceName, 'regency' => $regencyName, 'district' => $districtName, @@ -149,7 +104,6 @@ public function update(CompleteProfileValidate $request, $idEncrypt) } catch (\Throwable $th) { //throw $th; DB::rollBack(); - dd($th); return back(); } return redirect(route('owner.dashboard'))->with('success', 'Success complete your profile'); @@ -165,4 +119,4 @@ public function destroy($id) { // } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Owner/DashboardController.php b/app/Http/Controllers/Owner/DashboardController.php index 7692025..734547a 100644 --- a/app/Http/Controllers/Owner/DashboardController.php +++ b/app/Http/Controllers/Owner/DashboardController.php @@ -3,13 +3,39 @@ namespace App\Http\Controllers\Owner; use App\Http\Controllers\Controller; +use App\Models\ShopModel; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Facades\Session; class DashboardController extends Controller { // public function index() { - return view('page.owner.index'); + $userId = Auth::user()->id; + $shops = ShopModel::where([['user_id', $userId], ['isActive', true]])->orderBy('created_at', 'desc'); + if (Session::has('active')) { + $id = Crypt::decrypt(Session::get('active')); + return view('page.owner.index', [ + 'shop' => $shops->where(['id' => $id])->first() + ]); + } + return view('page.owner.index', [ + 'shops' => $shops->get() + ]); + } + + public function setSession($id) + { + Session::put('active', $id); + return redirect(route('owner.dashboard')); + } + + public function deleteSession() + { + Session::forget('active'); + return redirect(route('owner.dashboard')); } } diff --git a/app/Http/Controllers/Owner/Products/ProductBrandController.php b/app/Http/Controllers/Owner/Products/ProductBrandController.php index 7a675df..ff6718d 100644 --- a/app/Http/Controllers/Owner/Products/ProductBrandController.php +++ b/app/Http/Controllers/Owner/Products/ProductBrandController.php @@ -116,9 +116,9 @@ public function update(BrandValidate $request, $id) 'image' => $filename, ]); } catch (\Throwable $th) { - return back(); + return back()->with(['type' => 'error', 'error' => 'Something wrong']); } - return redirect(route('owner.products.brand.index')); + return redirect(route('owner.products.brand.index'))->with(['type' => 'success', 'success' => 'Success change brand']); } /** diff --git a/app/Http/Controllers/Owner/Products/ProductsCategoryController.php b/app/Http/Controllers/Owner/Products/ProductsCategoryController.php index e9ae978..b62a211 100644 --- a/app/Http/Controllers/Owner/Products/ProductsCategoryController.php +++ b/app/Http/Controllers/Owner/Products/ProductsCategoryController.php @@ -55,9 +55,9 @@ public function store(CategoryValidate $request) 'images' => $filename, ]); } catch (\Throwable $th) { - return back(); + return back()->with(['type' => 'error', 'error' => 'Something wrong']); } - return redirect(route('owner.products.category.index'))->with('success', "Success saving data ✅"); + return redirect(route('owner.products.category.index'))->with(['success' => "Success saving data ✅", 'type' => 'success']); } /** @@ -116,9 +116,9 @@ public function update(CategoryValidate $request, $id) 'image' => $filename, ]); } catch (\Throwable $th) { - return back()->with('error', 'Error when submit to system'); + return back()->with(['error' => 'Error when submit to system'], ['type' => 'error']); } - return redirect(route('owner.products.category.index'))->with('success', 'Success saving data 😎'); + return redirect(route('owner.products.category.index'))->with(['success' => 'Success saving data 😎', 'type' => 'success']); } /** diff --git a/app/Http/Controllers/Owner/Settings/StoreController.php b/app/Http/Controllers/Owner/Settings/StoreController.php new file mode 100644 index 0000000..0e775ce --- /dev/null +++ b/app/Http/Controllers/Owner/Settings/StoreController.php @@ -0,0 +1,179 @@ +<?php + +namespace App\Http\Controllers\Owner\Settings; + +use App\Http\Controllers\Controller; +use App\Http\Requests\Owner\StoreValidate; +use App\Models\District; +use App\Models\Province; +use App\Models\Regency; +use App\Models\ShopModel; +use App\Models\Village; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Crypt; + +class StoreController extends Controller +{ + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $userId = Auth::user()->id; + $deletedStore = ShopModel::where([ + ['user_id', $userId], + ['isActive', false] + ])->get(); + $storeUser = ShopModel::where([ + ['user_id', $userId], + ['isActive', true] + ])->get(); + return view('page.owner.settings.store.index', [ + 'stores' => $storeUser, + 'deletedStores' => $deletedStore + ]); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $provinces = Province::all(); + + return view('page.owner.settings.store.add-edit', [ + 'provinces' => $provinces + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(StoreValidate $request) + { + $request['province'] = Province::where('id', $request->province)->first()->name; + $request['regency'] = Regency::where('id', $request->regency)->first()->name; + $request['district'] = District::where('id', $request->district)->first()->name; + $request['village'] = Village::where('id', $request->village)->first()->name; + $request['user_id'] = Auth::user()->id; + // dd($request); + try { + ShopModel::create([ + 'name' => $request->name, + 'description' => $request->description, + 'user_id' => $request->user_id, + 'province' => $request->province, + 'regency' => $request->regency, + 'district' => $request->district, + 'village' => $request->village, + 'address' => $request->address, + ]); + // ShopModel::create([ + // 'name' => + // ]); + } catch (\Throwable $e) { + # code... + return back()->with('error', 'Something wrong'); + } + return redirect(route('owner.settings.store.index'))->with(['success' => 'Success make new store', 'type' => 'success']); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + $id = Crypt::decrypt($id); + $data = ShopModel::where(['id' => $id])->first(); + $provinces = Province::all(); + + return view('page.owner.settings.store.add-edit', [ + 'data' => $data, + 'provinces' => $provinces + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(StoreValidate $request, $id) + { + $id = Crypt::decrypt($id); + $dataStore = ShopModel::findOrFail($id); + if ($request->province || $request->regency || $request->district || $request->village) { + $request->validate([ + 'province' => 'required', + 'regency' => 'required', + 'district' => 'required', + 'village' => 'required', + ]); + // dd($request->province, $request->regency, $request->district, $request->village, $request); + } + $request['province'] = (Province::where(['id' => $request->province])->first()->name) ?? $dataStore->province; + $request['regency'] = (Regency::where(['id' => $request->regency])->first()->name) ?? $dataStore->regency; + $request['district'] = (District::where(['id' => $request->district])->first()->name) ?? $dataStore->district; + $request['village'] = (Village::where(['id' => $request->village])->first()->name) ?? $dataStore->village; + // dd($request); + try { + $dataStore->update([ + 'name' => $request->name, + 'description' => $request->description, + 'province' => $request->province, + 'regency' => $request->regency, + 'district' => $request->district, + 'village' => $request->village, + 'address' => $request->address, + ]); + } catch (\Throwable $e) { + return back()->with(['type' => 'error', 'error' => 'Something wrong']); + } + return redirect(route('owner.settings.store.index'))->with(['type' => 'success', 'success' => 'Successfully changed data']); + // dd($request, $id, $dataStore, gettype($request->province)); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $id = Crypt::decrypt($id); + $store = ShopModel::findOrFail($id); + try { + $store->update([ + 'isActive' => false + ]); + } catch (\Throwable $e) { + return response()->json(['status' => 'error']); + } + return response()->json(['status' => 'success']); + } +} \ No newline at end of file diff --git a/app/Http/Requests/Owner/CategoryValidate.php b/app/Http/Requests/Owner/CategoryValidate.php index 70b0962..aab56ff 100644 --- a/app/Http/Requests/Owner/CategoryValidate.php +++ b/app/Http/Requests/Owner/CategoryValidate.php @@ -2,8 +2,6 @@ namespace App\Http\Requests\Owner; -use App\Constants\RequestRuleConstant; -use Google\Service\ServiceControl\Request; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Route; diff --git a/app/Http/Requests/Owner/CompleteProfileValidate.php b/app/Http/Requests/Owner/CompleteProfileValidate.php index 32ce3a4..27346cf 100644 --- a/app/Http/Requests/Owner/CompleteProfileValidate.php +++ b/app/Http/Requests/Owner/CompleteProfileValidate.php @@ -33,8 +33,6 @@ public function rules() 'address' => '', 'nameBusiness' => 'required', - 'emailBusiness' => 'required|email:dns', - 'contactBusiness' => 'required|numeric|min_digits:8', 'provinceBusiness' => 'required', 'regencyBusiness' => 'required', 'districtBusiness' => 'required', diff --git a/app/Http/Requests/Owner/StoreValidate.php b/app/Http/Requests/Owner/StoreValidate.php new file mode 100644 index 0000000..9063f97 --- /dev/null +++ b/app/Http/Requests/Owner/StoreValidate.php @@ -0,0 +1,44 @@ +<?php + +namespace App\Http\Requests\Owner; + +use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Route; + +class StoreValidate extends FormRequest +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array<string, mixed> + */ + public function rules() + { + if (Route::is('owner.settings.store.store')) { + + return [ + 'name' => 'required', + 'description' => 'required', + 'province' => 'required', + 'regency' => 'required', + 'district' => 'required', + 'village' => 'required', + ]; + } else if (Route::is('owner.settings.store.update')) { + return [ + 'name' => 'required', + 'description' => 'required', + ]; + } + } +} \ No newline at end of file diff --git a/database/migrations/2023_05_16_143659_create_shop_models_table.php b/database/migrations/2023_05_16_143659_create_shop_models_table.php index 141a062..4830eba 100644 --- a/database/migrations/2023_05_16_143659_create_shop_models_table.php +++ b/database/migrations/2023_05_16_143659_create_shop_models_table.php @@ -18,8 +18,6 @@ public function up() $table->string('name'); $table->string('description'); $table->unsignedBigInteger('user_id'); - $table->string('email'); - $table->string('contact'); $table->string('province'); $table->string('regency'); $table->string('district'); diff --git a/database/seeders/menuSeeder.php b/database/seeders/menuSeeder.php index cfb2fe9..57c30bd 100644 --- a/database/seeders/menuSeeder.php +++ b/database/seeders/menuSeeder.php @@ -183,7 +183,7 @@ public function run() 'url' => 'owner/purchases/order', 'status' => 1 ]); - + //submenu report SubMenuModel::create([ 'menu_id' => $owreport->id, @@ -197,7 +197,7 @@ public function run() 'url' => 'owner/report/inventory', 'status' => 1 ]); - + //submenu Settings SubMenuModel::create([ 'menu_id' => $owsettings->id, @@ -205,6 +205,12 @@ public function run() 'url' => 'owner/settings/profile', 'status' => 1 ]); + SubMenuModel::create([ + 'menu_id' => $owsettings->id, + 'name' => 'My Store', + 'url' => 'owner/settings/store', + 'status' => 1 + ]); //RoleMenu Table //Superadmin @@ -233,7 +239,7 @@ public function run() ]); //Owner - + RoleMenuModel::create([ 'role_id' => 2, 'menu_id' => $owdashboard->id, @@ -265,4 +271,4 @@ public function run() 'subscribe' => 0, ]); } -} +} \ No newline at end of file diff --git a/resources/views/page/owner/fill-profile/form/business.blade.php b/resources/views/page/owner/fill-profile/form/business.blade.php index 71851f8..81da537 100644 --- a/resources/views/page/owner/fill-profile/form/business.blade.php +++ b/resources/views/page/owner/fill-profile/form/business.blade.php @@ -30,32 +30,6 @@ class="form-control @error('descriptionBusiness') is-invalid @enderror" autofocu @enderror </div> </div> - <div class="col-lg-4 col-md-6"> - <div class="mb-3"> - <label for="emailBusiness" class="form-label">Email</label> - <input type="text" name="emailBusiness" id="emailBusiness" - class="form-control @error('emailBusiness') is-invalid @enderror" required - value="{{ old('emailBusiness') }}"> - @error('emailBusiness') - <div class="invalid-feedback"> - {{ $message }} - </div> - @enderror - </div> - </div> - <div class="col-lg-4 col-md-6"> - <div class="mb-3"> - <label for="contactBusiness" class="form-label">Contact</label> - <input type="text" name="contactBusiness" id="contactBusiness" - class="form-control @error('contactBusiness') is-invalid @enderror" required - value="{{ old('contactBusiness') }}"> - @error('contactBusiness') - <div class="invalid-feedback"> - {{ $message }} - </div> - @enderror - </div> - </div> <div class="col-lg-4 col-md-6"> <div class="mb-3"> <label for="provinceBusiness" class="form-label">Province</label> diff --git a/resources/views/page/owner/index.blade.php b/resources/views/page/owner/index.blade.php index 9e97723..0649025 100644 --- a/resources/views/page/owner/index.blade.php +++ b/resources/views/page/owner/index.blade.php @@ -21,19 +21,55 @@ <li class="breadcrumb-item active"> @yield('title') </li> </ul> </h6> + @if (Session::has('active')) + <a href="{{ route('owner.deleteSession') }}" class="btn btn-secondary mt-2"> + Back to select the store you want to manage</a> + @endif </div> </div> + @dump(Session::all()) {{-- Body Start --}} - <div class="row"> - <div class="col-sm-12"> - <section class="comp-section"> - <div class="card-body"> + @if (Session::has('active')) + <div class="row"> + <div class="col-12"> + <section class="comp-section"> + <div class="row d-flex"> + <h4>{{ $shop->name }}</h4> + </div> + </section> + </div> + </div> + @else + <div class="row"> + <div class="col-12"> + <section class="comp-section"> + <div class="row d-flex"> + @foreach ($shops as $shop) + <div class="col-sm-12 col-md-6 col-lg-4"> + <div class="card flex-fill bg-white"> + <div class="card-header d-flex justify-content-between"> + <h5 class="card-title mb-0">{{ $shop->name }}</h5> + <div + class="status-toggle d-flex justify-content-between align-items-center"> + <input type="checkbox" id="user3" class="check" checked=""> + <label for="user3" class="checktoggle">checkbox</label> + </div> + </div> + <div class="card-body"> + <p class="card-text">{{ $shop->description }}</p> + <a class="btn btn-primary" + href="{{ route('owner.setSession', Crypt::encrypt($shop->id)) }}">Manage</a> + </div> + </div> + </div> + @endforeach - </div> - </section> + </div> + </section> + </div> </div> - </div> + @endif </div> </div> diff --git a/resources/views/page/owner/products-category/index.blade.php b/resources/views/page/owner/products-category/index.blade.php index 06432cd..32c4554 100644 --- a/resources/views/page/owner/products-category/index.blade.php +++ b/resources/views/page/owner/products-category/index.blade.php @@ -97,6 +97,12 @@ </div> @endsection +<?php +$title = e($__env->yieldContent('title')); +$type = Session::get('type'); +$msg = Session::get($type); +// dd($type); +?> @section('forscript') {{-- Toast import js --}} @@ -104,15 +110,27 @@ <script src="{{ URL::asset('/assets/plugins/toastr/toastr.js') }}"></script> <script> - @if (Session::has('success')) + let type = {!! json_encode($type) !!}; + let msg = {!! json_encode($msg) !!}; + const title = {!! json_encode($title) !!}; + @if (Session::has($type)) { - toastr.success("{!! Session::get('success') !!}", "Category", { + toastr[type](msg, title, { closeButton: !0, tapToDismiss: !1, positionClass: 'toast-top-center', - }); + }) } @endif + // @if (Session::has('success')) + // { + // toastr.success("{!! Session::get('success') !!}", "Category", { + // closeButton: !0, + // tapToDismiss: !1, + // positionClass: 'toast-top-center', + // }); + // } + // @endif </script> <script> $(document).on('click', '#confirm-delete', function(event) { diff --git a/resources/views/page/owner/settings/store/add-edit.blade.php b/resources/views/page/owner/settings/store/add-edit.blade.php new file mode 100644 index 0000000..8152cce --- /dev/null +++ b/resources/views/page/owner/settings/store/add-edit.blade.php @@ -0,0 +1,247 @@ +<?php $page = 'menus'; ?> +@extends('layout.mainlayout') + +@section('title', isset($data) ? 'Edit Store' : 'Add Store') + +@section('forhead') + {{-- Toastr Style --}} + <link rel="stylesheet" href="{{ url('assets/plugins/toastr/toatr.css') }}"> + <meta name="csrf-token" content="{{ csrf_token() }}"> +@endsection + +@section('content') + <div class="page-wrapper pagehead"> + <div class="content"> + <div class="page-header"> + <div class="page-title"> + <h4>@yield('title')</h4> + <h6> + <ul class="breadcrumb"> + <li class="breadcrumb-item"><a href="{{ url('owner/dashboard') }}">Dashboard</a></li> + <li class="breadcrumb-item"><a href="{{ url('owner/settings/store') }}">Store</a></li> + <li class="breadcrumb-item active"> @yield('title') </li> + </ul> + </h6> + </div> + </div> + + {{-- Body Start --}} + <div class="row"> + <div class="col-sm-12"> + <section class="comp-section"> + <div class="card-body"> + <form + action="{{ isset($data) ? route('owner.settings.store.update', Crypt::encrypt($data->id)) : route('owner.settings.store.store') }}" + method="post"> + @csrf + @if (isset($data)) + {{ method_field('put') }} + @endif + <div class="row"> + <div class="col-lg-3 col-sm-6 col-12"> + <div class="form-group"> + <label>Store Name</label> + <input id="name" name="name" type="text" + class="form-control @error('name') is-invalid @enderror" + value="{{ old('name') ?? ($data->name ?? null) }}" autofocus required> + @error('name') + <div class="invalid-feedback">{{ $message }}</div> + @enderror + </div> + </div> + <div class="col-lg-3 col-sm-6 col-12"> + <div class="form-group"> + <label>Store Description</label> + <input id="description" name="description" type="text" + class="form-control @error('description') + is-invalid + @enderror" + value="{{ old('description') ?? ($data->description ?? null) }}" required> + @error('description') + <div class="invalid-feedback">{{ $message }}</div> + @enderror + </div> + </div> + <div class="col-lg-3 col-sm-6 col-12"> + <div class="form-group"> + <label>Store Province</label> + <select name="province" id="province" + class="select @error('province') is-invalid @enderror"> + <option value="null" selected disabled>-- Select --</option> + @foreach ($provinces as $province) + <option value="{{ $province->id }}" + {{ old('province') === $province->id ? 'selected' : '' }}> + {{ $province->name }}</option> + @endforeach + </select> + @error('province') + <div class="invalid-feedback"> + {{ $message }} + </div> + @enderror + </div> + </div> + <div class="col-lg-3 col-sm-6 col-12"> + <div class="form-group"> + <label>Store Regency</label> + <select name="regency" id="regency" + class="select @error('regency') is-invalid @enderror"> + <option value="null" selected disabled>-- Select --</option> + </select> + @error('regency') + <div class="invalid-feedback"> + {{ $message }} + </div> + @enderror + </div> + </div> + <div class="col-lg-3 col-sm-6 col-12"> + <div class="form-group"> + <label>Store District</label> + <select name="district" id="district" + class="select @error('district') is-invalid @enderror"> + <option value="null" selected disabled>-- Select --</option> + </select> + @error('district') + <div class="invalid-feedback"> + {{ $message }} + </div> + @enderror + </div> + </div> + <div class="col-lg-3 col-sm-6 col-12"> + <div class="form-group"> + <label>Store Village</label> + <select name="village" id="village" + class="select @error('village') is-invalid @enderror"> + <option value="null" selected disabled>-- Select --</option> + </select> + @error('village') + <div class="invalid-feedback"> + {{ $message }} + </div> + @enderror + </div> + </div> + + <div class="col-lg-12"> + <div class="form-group"> + <label>Address <span class="text-muted">(optional)</span></label> + <textarea id="address" name="address" class="form-control">{{ old('address') ?? ($data->address ?? null) }}</textarea> + </div> + </div> + <div class="col-lg-12"> + <button type="submit" class="btn btn-submit me-2">Submit</button> + <a href="{{ URL::previous() }}" class="btn btn-cancel">Cancel</a> + </div> + </div> + </form> + </div> + </section> + </div> + </div> + </div> + </div> + +@endsection + +<?php +$title = e($__env->yieldContent('title')); +$type = Session::get('type'); +$msg = Session::get($type); +// dd($type); +?> + +@section('forscript') + {{-- Toast import js --}} + <script src="{{ URL::asset('/assets/plugins/toastr/toastr.min.js') }}"></script> + <script src="{{ URL::asset('/assets/plugins/toastr/toastr.js') }}"></script> + + <script> + $(function() { + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + } + }) + }) + + // get and display kabupaten + $(function() { + $('#province').on('change', function() { + let idProvince = $('#province').val(); + + $.ajax({ + type: 'POST', + url: '{{ route('owner.complete-profile.getRegencies') }}', + data: { + id_province: idProvince + }, + cache: false, + success: function(regency) { + $('#regency').html(regency) + }, + }) + }) + }) + + // get and display kecamatan + $(function() { + $('#regency').on('change', function() { + let idRegency = $('#regency').val(); + + $.ajax({ + type: 'POST', + url: '{{ route('owner.complete-profile.getDistrict') }}', + data: { + id_regency: idRegency + }, + cache: false, + success: function(district) { + $('#district').html(district) + }, + }) + }) + }) + + // get and display desa + $(function() { + $('#district').on('change', function() { + let idDistrict = $('#district').val(); + + $.ajax({ + type: 'POST', + url: '{{ route('owner.complete-profile.getVillage') }}', + data: { + id_district: idDistrict + }, + cache: false, + success: function(villages) { + $('#village').html(villages) + } + }) + }) + }) + </script> + <script> + $(document).ready(function() { + $('.select').select2({ + tags: true + }) + }) + + let type = {!! json_encode($type) !!}; + let msg = {!! json_encode($msg) !!}; + const title = {!! json_encode($title) !!}; + + @if (Session::has($type)) + { + toastr[type](msg, title, { + closeButton: !0, + tapToDismiss: !1, + positionClass: 'toast-top-center', + }) + } + @endif + </script> +@endsection diff --git a/resources/views/page/owner/settings/store/index.blade.php b/resources/views/page/owner/settings/store/index.blade.php new file mode 100644 index 0000000..1b72c11 --- /dev/null +++ b/resources/views/page/owner/settings/store/index.blade.php @@ -0,0 +1,221 @@ +<?php $page = 'menus'; ?> +@extends('layout.mainlayout') + +@section('title', 'My Store') + +@section('forhead') + {{-- Toastr Style --}} + <link rel="stylesheet" href="{{ url('assets/plugins/toastr/toatr.css') }}"> + <meta name="csrf-token" content="{{ csrf_token() }}"> +@endsection + +@section('content') + <div class="page-wrapper pagehead"> + <div class="content"> + <div class="page-header"> + <div class="page-title"> + <h4>@yield('title')</h4> + <h6> + <ul class="breadcrumb"> + <li class="breadcrumb-item"><a href="{{ url('owner/dashboard') }}">Dashboard</a></li> + <li class="breadcrumb-item active"> @yield('title') </li> + </ul> + </h6> + </div> + <div class="page-btn"> + <a href="{{ route('owner.settings.store.add') }}" class="btn btn-added"> + <img src="{{ URL::asset('assets/img/icons/plus.svg') }}" class="me-1" alt="img">Add Store + </a> + </div> + </div> + + {{-- Body Start --}} + <div class="row"> + <div class="col-sm-12 my-5"> + <section class="comp-section"> + <div class="table-responsive"> + <table class="table datanew"> + <thead> + <tr> + <th class="col-0"> + <label class="checkboxs"> + <input type="checkbox" id="select-all" /> + <span class="checkmarks"></span> + </label> + </th> + <th class="col-2">Name</th> + <th class="col-2">Description</th> + <th class="col-5">Address</th> + <th class="col-2">Status</th> + <th class="col-1">Action</th> + </tr> + </thead> + <tbody> + @foreach ($stores as $store) + <tr> + <td> + <label class="checkboxs"> + <input type="checkbox" /> + <span class="checkmarks"></span> + </label> + </td> + <td>{{ $store->name }}</td> + <td>{{ $store->description }}</td> + <td> + {{ $store?->address ? $store->address . ', ' . $store->village . ', ' . $store->district . ', ' . $store->regency . ', ' . $store->province : $store->village . ', ' . $store->district . ', ' . $store->regency . ', ' . $store->province }} + </td> + <td>{{ $store->isActive }}</td> + <td> + <a class="me-3" + href="{{ route('owner.settings.store.edit', ['id' => Crypt::encrypt($store->id)]) }}"> + <img src="{{ URL::asset('assets/img/icons/edit.svg') }}" + alt="img" /> + </a> + <a class="me-3" id="confirm-delete" + data-action="{{ route('owner.settings.store.delete', ['id' => Crypt::encrypt($store->id)]) }}"> + <img src="{{ URL::asset('assets/img/icons/delete.svg') }}" + alt="img" /> + </a> + </td> + </tr> + @endforeach + </tbody> + </table> + </div> + </section> + </div> + @if ($deletedStores) + <div class="col-sm-12"> + <div> + <h3 class="text-center">Deleted Store</h3> + </div> + <section class="comp-section"> + <div class="table-responsive"> + <table class="table datanew"> + <thead> + <tr> + <th class="col-0"> + <label class="checkboxs"> + <input type="checkbox" id="select-all" /> + <span class="checkmarks"></span> + </label> + </th> + <th class="col-2">Name</th> + <th class="col-2">Description</th> + <th class="col-5">Address</th> + <th class="col-2">Status</th> + <th class="col-1">Action</th> + </tr> + </thead> + <tbody> + @foreach ($deletedStores as $store) + @dump() + <tr> + <td> + <label class="checkboxs"> + <input type="checkbox" /> + <span class="checkmarks"></span> + </label> + </td> + <td>{{ $store->name }}</td> + <td>{{ $store->description }}</td> + <td> + {{ $store?->address ? $store->address . ', ' . $store->village . ', ' . $store->district . ', ' . $store->regency . ', ' . $store->province : $store->village . ', ' . $store->district . ', ' . $store->regency . ', ' . $store->province }} + </td> + <td>{{ $store->isActive }}</td> + <td> + <a class="me-3" + href="{{ route('owner.settings.store.edit', ['id' => Crypt::encrypt($store->id)]) }}"> + <img src="{{ URL::asset('assets/img/icons/edit.svg') }}" + alt="img" /> + </a> + <a class="me-3" id="confirm-delete" + data-action="{{ route('owner.settings.store.delete', ['id' => Crypt::encrypt($store->id)]) }}"> + <img src="{{ URL::asset('assets/img/icons/delete.svg') }}" + alt="img" /> + </a> + </td> + </tr> + @endforeach + </tbody> + </table> + </div> + </section> + </div> + @endif + </div> + </div> + </div> + +@endsection +<?php +$title = e($__env->yieldContent('title')); +$type = Session::get('type'); +$msg = Session::get($type); +// dd($type); +?> + +@section('forscript') + {{-- Toast import js --}} + <script src="{{ URL::asset('/assets/plugins/toastr/toastr.min.js') }}"></script> + <script src="{{ URL::asset('/assets/plugins/toastr/toastr.js') }}"></script> + + <script> + let type = {!! json_encode($type) !!}; + let msg = {!! json_encode($msg) !!}; + const title = {!! json_encode($title) !!}; + @if (Session::has($type)) + { + toastr[type](msg, title, { + closeButton: !0, + tapToDismiss: !1, + positionClass: 'toast-top-center', + }) + } + @endif + </script> + <script> + $(document).on('click', '#confirm-delete', function(event) { + event.preventDefault(); + const url = $(this).data('action'); + + Swal.fire({ + title: 'Are you sure?', + text: "You won't be able to revert this!", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#dc3545', + cancelButtonColor: '#6c757d', + confirmButtonText: 'Yes, delete it!' + }).then((result) => { + if (result.isConfirmed) { + $.ajax({ + url, + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + }, + type: 'GET', + success: function(data) { + Swal.fire({ + title: 'Deleted!', + text: 'Your file has been deleted.', + icon: 'success', + timer: 1500, + showConfirmButton: false + }); + location.reload(); + }, + error: function(data) { + Swal.fire({ + title: 'Oops...', + text: 'Something went wrong!', + icon: 'error', + confirmButtonColor: '#dc3545' + }) + } + }); + } + }); + }); + </script> +@endsection diff --git a/routes/owner.php b/routes/owner.php index 2050f41..87afbd3 100644 --- a/routes/owner.php +++ b/routes/owner.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Owner\DashboardController; use App\Http\Controllers\Owner\Products\ProductBrandController; use App\Http\Controllers\Owner\Products\ProductsCategoryController; +use App\Http\Controllers\Owner\Settings\StoreController; use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'owner', 'as' => 'owner.', 'middleware' => ['auth', 'role:owner']], function () { @@ -19,8 +20,10 @@ Route::group(['middleware' => ['hasStore']], function () { Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard'); + Route::get('{id}', [DashboardController::class, 'setSession'])->name('setSession'); + Route::get('', [DashboardController::class, 'deleteSession'])->name('deleteSession'); - Route::group(['prefix' => 'products', 'as' => 'products.', 'middleware' => ['hasShop']], function () { + Route::group(['prefix' => 'products', 'as' => 'products.'], function () { Route::get('', []); // untuk products Route::group(['prefix' => 'category', 'as' => 'category.'], function () { Route::get('', [ProductsCategoryController::class, 'index'])->name('index'); @@ -39,5 +42,16 @@ Route::get('{id}', [ProductBrandController::class, 'destroy'])->name('delete'); }); }); + + Route::group(['prefix' => 'settings', 'as' => 'settings.'], function () { + Route::group(['prefix' => 'store', 'as' => 'store.'], function () { + Route::get('', [StoreController::class, 'index'])->name('index'); + Route::get('add', [StoreController::class, 'create'])->name('add'); + Route::post('', [StoreController::class, 'store'])->name('store'); + Route::get('{id}/edit', [StoreController::class, 'edit'])->name('edit'); + Route::put('{id}', [StoreController::class, 'update'])->name('update'); + Route::get('{id}', [StoreController::class, 'destroy'])->name('delete'); + }); + }); }); }); -- GitLab