From 81841810beb231427615dfc2dbe7b7a0682a682e Mon Sep 17 00:00:00 2001 From: Femi Novia Lina <77434812+FemiNoviaLina@users.noreply.github.com> Date: Sun, 5 Jun 2022 16:57:17 +0700 Subject: [PATCH] complete admin dashboard and some other features --- app/Events/MessageSent.php | 40 +++ app/Http/Controllers/AdminController.php | 168 +++++++++++- app/Http/Controllers/ChatsController.php | 57 ++++ app/Models/Message.php | 13 + composer.json | 3 +- composer.lock | 199 +++++++++++++- config/broadcasting.php | 2 +- ...022_06_04_174102_create_messages_table.php | 34 +++ package-lock.json | 44 +++ package.json | 4 + public/css/app.css | 256 ++++++++++-------- public/js/app.js.LICENSE.txt | 8 + public/js/chat_script.js | 61 +++++ public/js/chats_dashboard_script.js | 62 +++++ public/js/customers_dashboard_script.js | 49 ++++ public/js/dashboard_modal_script.js | 73 +---- public/js/orders_dashboard_script.js | 72 +++++ public/js/update_vehicle_script.js | 29 ++ public/js/vehicles_dashboard_script.js | 44 +++ public/mix-manifest.json | 7 +- resources/js/chat_script.js | 94 +++++++ resources/js/chats_dashboard_script.js | 96 +++++++ resources/js/customers_dashboard_script.js | 52 ++++ ...l_script.js => orders_dashboard_script.js} | 12 +- resources/js/update_vehicle_script.js | 24 ++ resources/js/vehicles_dashboard_script.js | 41 +++ resources/views/about.blade.php | 15 + resources/views/components/navbar.blade.php | 2 +- resources/views/dashboard/chats.blade.php | 38 +++ resources/views/dashboard/customers.blade.php | 209 +++++++++----- resources/views/dashboard/orders.blade.php | 82 ++++-- .../dashboard/update-vehicle-form.blade.php | 119 ++++++++ resources/views/dashboard/vehicles.blade.php | 184 ++++++++----- resources/views/help.blade.php | 104 +++++++ resources/views/rules.blade.php | 61 +++++ resources/views/user-profile.blade.php | 7 +- routes/channels.php | 5 + routes/web.php | 11 + webpack.mix.js | 10 +- 39 files changed, 2018 insertions(+), 373 deletions(-) create mode 100644 app/Events/MessageSent.php create mode 100644 app/Http/Controllers/ChatsController.php create mode 100644 app/Models/Message.php create mode 100644 database/migrations/2022_06_04_174102_create_messages_table.php create mode 100644 public/js/app.js.LICENSE.txt create mode 100644 public/js/chat_script.js create mode 100644 public/js/chats_dashboard_script.js create mode 100644 public/js/customers_dashboard_script.js create mode 100644 public/js/orders_dashboard_script.js create mode 100644 public/js/update_vehicle_script.js create mode 100644 public/js/vehicles_dashboard_script.js create mode 100644 resources/js/chat_script.js create mode 100644 resources/js/chats_dashboard_script.js create mode 100644 resources/js/customers_dashboard_script.js rename resources/js/{dashboard_modal_script.js => orders_dashboard_script.js} (96%) create mode 100644 resources/js/update_vehicle_script.js create mode 100644 resources/js/vehicles_dashboard_script.js create mode 100644 resources/views/about.blade.php create mode 100644 resources/views/dashboard/chats.blade.php create mode 100644 resources/views/dashboard/update-vehicle-form.blade.php create mode 100644 resources/views/help.blade.php create mode 100644 resources/views/rules.blade.php diff --git a/app/Events/MessageSent.php b/app/Events/MessageSent.php new file mode 100644 index 0000000..3c961c0 --- /dev/null +++ b/app/Events/MessageSent.php @@ -0,0 +1,40 @@ +message = $message; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + $channel = $this->message->from_id != -1 ? 'channel-'. $this->message->from_id : 'channel-'. $this->message->to_id; + return new Channel($channel); + } +} diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index c15f4eb..93a870f 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -3,37 +3,67 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Storage; +use App\Models\User; use App\Models\Order; use App\Models\Vehicle; +use App\Models\Message; class AdminController extends Controller { public function getCustomersDashboard() { - return view('dashboard.customers'); + $take = request()->input('take') ? request()->input('take') : 10; + $page = request()->input('page') ? request()->input('page') : 1; + + $customers = User::where('role', '=', 'user') + ->select('id', 'name', 'email', 'phone_1', 'phone_2', + \DB::raw("case when (phone_1 IS NOT NULL AND phone_2 IS NOT NULL + AND address_id IS NOT NULL AND address_mlg IS NOT NULL) + then 'true' else 'false' end as completed")) + ->take($take) + ->skip(($page - 1) * $take) + ->get(); + + $total_data = User::where('role', '=', 'user')->count(); + + return view('dashboard.customers', ['customers' => $customers, 'take' => $take, 'total_data' => $total_data, 'page' => $page]); } public function getVehiclesDashboardCar() { + $take = request()->take ? request()->take : 10; + $page = request()->page ? request()->page : 1; + $vehicles = Vehicle::where('type', '=', 'car') - ->take(10) + ->take($take) + ->skip(($page - 1) * $take) ->get(); - return view('dashboard.vehicles', ['type' => 'Car', 'vehicles' => $vehicles]); + + $total_data = Vehicle::where('type', '=', 'car')->count(); + return view('dashboard.vehicles', ['type' => 'Car', 'vehicles' => $vehicles, 'take' => $take, 'total_data' => $total_data, 'page' => $page]); } public function getVehiclesDashboardMotor() { + $take = request()->take ? request()->take : 10; + $page = request()->page ? request()->page : 1; + $vehicles = Vehicle::where('type', '=', 'motor') - ->take(10) + ->take($take) + ->skip(($page - 1) * $take) ->get(); - return view('dashboard.vehicles', ['type' => 'Motor', 'vehicles' => $vehicles]); + + $total_data = Vehicle::where('type', '=', 'motor')->count(); + return view('dashboard.vehicles', ['type' => 'Motor', 'vehicles' => $vehicles, 'take' => $take, 'total_data' => $total_data, 'page' => $page]); } public function getOrdersDashboard() { $selected = request()->input('selected') ? request()->input('selected') : 'All order'; $take = request()->input('take') ? request()->input('take') : 10; + $page = request()->input('page') ? request()->input('page') : 1; $orders = Order::join('users', 'orders.user_id', '=', 'users.id') ->join('vehicles', 'orders.vehicle_id', '=', 'vehicles.id') @@ -42,10 +72,52 @@ public function getOrdersDashboard() 'users.id as user_id', 'users.name as user_name', 'users.email', 'vehicles.name as vehicle_name', 'vehicles.id as vehicle_id') ->orderBy('orders.id', 'desc') + ->when($selected == 'New order', function($query) { + $query->Where('orders.order_status', 'PENDING'); + }) + ->when($selected == 'On process', function($query) { + $query->Where('orders.order_status', 'WAITING_FOR_PAYMENT'); + }) + ->when($selected == 'On rent', function($query) { + $query->Where('orders.order_status', 'PAYMENT_DONE'); + }) + ->when($selected == 'Completed', function($query) { + $query->Where('orders.order_status', 'COMPLETED'); + }) + ->when($selected == 'Canceled', function($query) { + $query->Where('orders.order_status', 'CANCELED'); + }) ->take($take) + ->skip(($page - 1) * $take) ->get(); - return view('dashboard.orders', ['selected' => $selected, 'orders' => $orders]); + $total_data = Order::when($selected == 'New order', function($query) { + $query->Where('orders.order_status', 'PENDING'); + }) + ->when($selected == 'On process', function($query) { + $query->Where('orders.order_status', 'WAITING_FOR_PAYMENT'); + }) + ->when($selected == 'On rent', function($query) { + $query->Where('orders.order_status', 'PAYMENT_DONE'); + }) + ->when($selected == 'Completed', function($query) { + $query->Where('orders.order_status', 'COMPLETED'); + }) + ->when($selected == 'Canceled', function($query) { + $query->Where('orders.order_status', 'CANCELED'); + }) + ->count(); + + return view('dashboard.orders', ['selected' => $selected, 'orders' => $orders, 'take' => $take, 'total_data' => $total_data, 'page' => $page]); + } + + public function getChatsDashboard() { + $chatList = Message::join('users', 'messages.from_id', '=', 'users.id') + ->select('users.id as user_id', 'users.name as user_name') + ->distinct() + ->get(); + + return view('dashboard.chats', ['chatList' => $chatList]); } public function acceptOrder($id) { @@ -65,8 +137,6 @@ public function rejectOrder($id) { } public function doneVehicle() { - $id = request()->input('order_id'); - $order = Order::find($id); $order->order_status = 'COMPLETED'; $order->save(); @@ -126,4 +196,86 @@ public function getOrderDetails($id) { return response()->json($orders); } + + public function getCustomerDetails($id) { + $customer = User::select('id', 'name', 'email', 'phone_1', 'phone_2', 'address_id', 'address_mlg') + ->where('id', '=', $id) + ->first(); + + $orders = Order::join('vehicles', 'orders.vehicle_id', '=', 'vehicles.id') + ->select('orders.id as order_id', 'orders.order_status', 'vehicles.name as vehicle_name') + ->where('orders.user_id', '=', $id) + ->orderBy('orders.id', 'desc') + ->get(); + + return response()->json(['customer' => $customer, 'orders' => $orders]); + } + + public function deleteVehicle() { + try { + $ids = request()->input('ids'); + + $vehicles = Vehicle::whereIn('id', $ids)->get(); + + foreach($vehicles as $vehicle) { + $deleted = Storage::delete('images/'.$vehicle->photo); + if($deleted) $vehicle->delete(); + } + return response()->json(['success' => true, 'type' => 'car']); + } catch (\Throwable $th) { + return response()->json(['success' => false, 'type' => 'car']); + } + } + + public function updateMotorForm($id) { + $vehicle = Vehicle::find($id); + + return view('dashboard.update-vehicle-form', ['vehicle' => $vehicle, 'type' => 'Motor']); + } + + public function updateCarForm($id) { + $vehicle = Vehicle::find($id); + + return view('dashboard.update-vehicle-form', ['vehicle' => $vehicle, 'type' => 'Car']); + } + + public function updateVehicle($id) { + $request = request()->input(); + + $vehicle = Vehicle::find($id); + + $vehicle->name = $request['name']; + $vehicle->brand = $request['brand']; + $vehicle->price = $request['price']; + $vehicle->available_unit = $request['available_unit']; + $vehicle->fuel = $request['fuel']; + $vehicle->transmission = $request['transmission']; + $vehicle->cc = $request['cc']; + $vehicle->year = $request['year']; + + $vehicle->save(); + return redirect()->route('vehicles-dashboard-'. request()->input('type')); + } + + public function updateVehicleImage($id) { + try { + $request = request()->input(); + + $vehicle = Vehicle::find($id); + + $deleted = Storage::delete('images/'.$vehicle->photo); + if(!$deleted) throw new \Exception('Failed to delete old image'); + + $photo_filename = $vehicle->name. '.' . request()->file('photo')->extension(); + $photo = request()->file('photo')->storeAs('images', $photo_filename, 'local'); + + $vehicle->photo = $photo_filename; + $vehicle->save(); + + return redirect()->route('update-'. $vehicle->type, ['id' => $id]); + } catch(e) { + Session::flash('error', 'Failed to update vehicle image'); + return redirect()->route('update'. $vehicle->type); + } + } } diff --git a/app/Http/Controllers/ChatsController.php b/app/Http/Controllers/ChatsController.php new file mode 100644 index 0000000..18af7a5 --- /dev/null +++ b/app/Http/Controllers/ChatsController.php @@ -0,0 +1,57 @@ +middleware('auth'); + } + + public function fetchMessage() { + + $messages = Message::where('from_id', '=', auth()->user()->id) + ->orWhere('to_id', '=', auth()->user()->id) + ->orderBy('created_at', 'asc') + ->get(); + + return response()->json([ + 'messages' => $messages, + 'success' => true + ]); + } + + public function fetchAdminMessage($id) { + $messages = Message::where('from_id', '=', $id) + ->orWhere('to_id', '=', $id) + ->orderBy('created_at', 'asc') + ->get(); + + return response()->json([ + 'messages' => $messages, + 'success' => true + ]); + } + + public function sendMessage() { + $message = new Message(); + $message->from_id = request()->from_id ? request()->from_id : auth()->user()->id; + $message->to_id = request()->to_id; + $message->message = request()->message; + $message->save(); + + broadcast(new MessageSent($message))->toOthers(); + + return response()->json([ + 'messages' => $message, + 'success' => true + ]); + } +} diff --git a/app/Models/Message.php b/app/Models/Message.php new file mode 100644 index 0000000..3789bac --- /dev/null +++ b/app/Models/Message.php @@ -0,0 +1,13 @@ += 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "paragonie/sodium_compat", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/paragonie/sodium_compat.git", + "reference": "ac994053faac18d386328c91c7900f930acadf1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/ac994053faac18d386328c91c7900f930acadf1e", + "reference": "ac994053faac18d386328c91c7900f930acadf1e", + "shasum": "" + }, + "require": { + "paragonie/random_compat": ">=1", + "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" + }, + "suggest": { + "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", + "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." + }, + "type": "library", + "autoload": { + "files": [ + "autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com" + }, + { + "name": "Frank Denis", + "email": "jedisct1@pureftpd.org" + } + ], + "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", + "keywords": [ + "Authentication", + "BLAKE2b", + "ChaCha20", + "ChaCha20-Poly1305", + "Chapoly", + "Curve25519", + "Ed25519", + "EdDSA", + "Edwards-curve Digital Signature Algorithm", + "Elliptic Curve Diffie-Hellman", + "Poly1305", + "Pure-PHP cryptography", + "RFC 7748", + "RFC 8032", + "Salpoly", + "Salsa20", + "X25519", + "XChaCha20-Poly1305", + "XSalsa20-Poly1305", + "Xchacha20", + "Xsalsa20", + "aead", + "cryptography", + "ecdh", + "elliptic curve", + "elliptic curve cryptography", + "encryption", + "libsodium", + "php", + "public-key cryptography", + "secret-key cryptography", + "side-channel resistant" + ], + "support": { + "issues": "https://github.com/paragonie/sodium_compat/issues", + "source": "https://github.com/paragonie/sodium_compat/tree/v1.17.1" + }, + "time": "2022-03-23T19:32:04+00:00" + }, { "name": "phpoption/phpoption", "version": "1.8.1", @@ -2508,6 +2644,67 @@ }, "time": "2022-05-06T12:49:14+00:00" }, + { + "name": "pusher/pusher-php-server", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/pusher/pusher-http-php.git", + "reference": "af3eeaefc0c7959f5b3852f0a4dd5547245d33df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/af3eeaefc0c7959f5b3852f0a4dd5547245d33df", + "reference": "af3eeaefc0c7959f5b3852f0a4dd5547245d33df", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.2", + "paragonie/sodium_compat": "^1.6", + "php": "^7.3|^8.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "overtrue/phplint": "^2.3", + "phpunit/phpunit": "^8.5|^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Pusher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Library for interacting with the Pusher REST API", + "keywords": [ + "events", + "messaging", + "php-pusher-server", + "publish", + "push", + "pusher", + "real time", + "real-time", + "realtime", + "rest", + "trigger" + ], + "support": { + "issues": "https://github.com/pusher/pusher-http-php/issues", + "source": "https://github.com/pusher/pusher-http-php/tree/7.0.2" + }, + "time": "2021-12-07T13:09:00+00:00" + }, { "name": "ralouphie/getallheaders", "version": "3.0.3", diff --git a/config/broadcasting.php b/config/broadcasting.php index 67fcbbd..d9a8a0e 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -15,7 +15,7 @@ | */ - 'default' => env('BROADCAST_DRIVER', 'null'), + 'default' => env('BROADCAST_DRIVER', 'pusher'), /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2022_06_04_174102_create_messages_table.php b/database/migrations/2022_06_04_174102_create_messages_table.php new file mode 100644 index 0000000..5a9785d --- /dev/null +++ b/database/migrations/2022_06_04_174102_create_messages_table.php @@ -0,0 +1,34 @@ +id(); + $table->integer('from_id')->unsigned(); + $table->integer('to_id'); + $table->text('message'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('messages'); + } +}; diff --git a/package-lock.json b/package-lock.json index 46a73c8..96da15d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "requires": true, "packages": { "": { + "hasInstallScript": true, + "dependencies": { + "laravel-echo": "^1.11.7", + "pusher-js": "^7.1.1-beta" + }, "devDependencies": { "@tailwindcss/forms": "^0.4.0", "alpinejs": "^3.4.2", @@ -5573,6 +5578,14 @@ "node": ">= 8" } }, + "node_modules/laravel-echo": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.11.7.tgz", + "integrity": "sha512-LhEZp/RbdtdMlhptJyn452+aXfz+A1UW2bhJM7NROgXhnNgj+6P9BkG9JcPCBMernp5TGkOGI6A0NPbkAWYWGg==", + "engines": { + "node": ">=10" + } + }, "node_modules/laravel-mix": { "version": "6.0.43", "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.43.tgz", @@ -7234,6 +7247,14 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "node_modules/pusher-js": { + "version": "7.1.1-beta", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-7.1.1-beta.tgz", + "integrity": "sha512-4aGhQFMOfHDmlc8hOS/wYf2f7wcKGJeUGUmLq5hDjRWlwYWBErPrGoTE5OdHJY9yRIsfwcBQzibvdyEXZ5ke6g==", + "dependencies": { + "tweetnacl": "^1.0.3" + } + }, "node_modules/qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -8485,6 +8506,11 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -13490,6 +13516,11 @@ "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true }, + "laravel-echo": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.11.7.tgz", + "integrity": "sha512-LhEZp/RbdtdMlhptJyn452+aXfz+A1UW2bhJM7NROgXhnNgj+6P9BkG9JcPCBMernp5TGkOGI6A0NPbkAWYWGg==" + }, "laravel-mix": { "version": "6.0.43", "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.43.tgz", @@ -14674,6 +14705,14 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "pusher-js": { + "version": "7.1.1-beta", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-7.1.1-beta.tgz", + "integrity": "sha512-4aGhQFMOfHDmlc8hOS/wYf2f7wcKGJeUGUmLq5hDjRWlwYWBErPrGoTE5OdHJY9yRIsfwcBQzibvdyEXZ5ke6g==", + "requires": { + "tweetnacl": "^1.0.3" + } + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -15637,6 +15676,11 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", diff --git a/package.json b/package.json index ad076c0..44400d6 100644 --- a/package.json +++ b/package.json @@ -20,5 +20,9 @@ "postcss": "^8.4.13", "postcss-import": "^14.0.2", "tailwindcss": "^3.0.24" + }, + "dependencies": { + "laravel-echo": "^1.11.7", + "pusher-js": "^7.1.1-beta" } } diff --git a/public/css/app.css b/public/css/app.css index e3ed6b3..397cc1e 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -681,6 +681,9 @@ select { .m-10 { margin: 2.5rem; } +.m-4 { + margin: 1rem; +} .mx-20 { margin-left: 5rem; margin-right: 5rem; @@ -717,6 +720,18 @@ select { margin-top: 1rem; margin-bottom: 1rem; } +.my-5 { + margin-top: 1.25rem; + margin-bottom: 1.25rem; +} +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} +.my-52 { + margin-top: 13rem; + margin-bottom: 13rem; +} .my-10 { margin-top: 2.5rem; margin-bottom: 2.5rem; @@ -725,10 +740,6 @@ select { margin-left: 0.25rem; margin-right: 0.25rem; } -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} .mx-5 { margin-left: 1.25rem; margin-right: 1.25rem; @@ -737,10 +748,6 @@ select { margin-left: 2rem; margin-right: 2rem; } -.my-5 { - margin-top: 1.25rem; - margin-bottom: 1.25rem; -} .ml-3 { margin-left: 0.75rem; } @@ -780,12 +787,6 @@ select { .mr-6 { margin-right: 1.5rem; } -.mb-4 { - margin-bottom: 1rem; -} -.mt-1 { - margin-top: 0.25rem; -} .mt-24 { margin-top: 6rem; } @@ -801,6 +802,12 @@ select { .ml-4 { margin-left: 1rem; } +.mb-4 { + margin-bottom: 1rem; +} +.mt-1 { + margin-top: 0.25rem; +} .ml-1 { margin-left: 0.25rem; } @@ -810,6 +817,9 @@ select { .-mt-px { margin-top: -1px; } +.ml-auto { + margin-left: auto; +} .-mr-2 { margin-right: -0.5rem; } @@ -822,9 +832,6 @@ select { .mb-32 { margin-bottom: 8rem; } -.ml-auto { - margin-left: auto; -} .ml-20 { margin-left: 5rem; } @@ -906,26 +913,26 @@ select { .h-4 { height: 1rem; } -.h-20 { - height: 5rem; -} .h-8 { height: 2rem; } +.h-20 { + height: 5rem; +} .h-16 { height: 4rem; } .h-6 { height: 1.5rem; } -.h-10 { - height: 2.5rem; +.h-full { + height: 100%; } .h-96 { height: 24rem; } -.h-full { - height: 100%; +.h-10 { + height: 2.5rem; } .h-40 { height: 10rem; @@ -948,6 +955,9 @@ select { .h-4\/5 { height: 80%; } +.max-h-0 { + max-height: 0px; +} .min-h-screen { min-height: 100vh; } @@ -987,15 +997,15 @@ select { .w-auto { width: auto; } +.w-80 { + width: 20rem; +} .w-4 { width: 1rem; } .w-32 { width: 8rem; } -.w-80 { - width: 20rem; -} .w-8\/12 { width: 66.666667%; } @@ -1029,9 +1039,6 @@ select { .w-1 { width: 0.25rem; } -.min-w-full { - min-width: 100%; -} .min-w-fit { min-width: -webkit-fit-content; min-width: -moz-fit-content; @@ -1046,15 +1053,15 @@ select { .max-w-6xl { max-width: 72rem; } -.max-w-2xl { - max-width: 42rem; -} .max-w-3xl { max-width: 48rem; } .max-w-5xl { max-width: 64rem; } +.max-w-2xl { + max-width: 42rem; +} .max-w-md { max-width: 28rem; } @@ -1082,6 +1089,9 @@ select { .basis-3\/12 { flex-basis: 25%; } +.basis-2\/4 { + flex-basis: 50%; +} .table-auto { table-layout: auto; } @@ -1157,9 +1167,15 @@ select { .items-start { align-items: flex-start; } +.items-end { + align-items: flex-end; +} .items-center { align-items: center; } +.justify-start { + justify-content: flex-start; +} .justify-end { justify-content: flex-end; } @@ -1178,6 +1194,9 @@ select { .gap-2 { gap: 0.5rem; } +.gap-10 { + gap: 2.5rem; +} .gap-5 { gap: 1.25rem; } @@ -1200,16 +1219,6 @@ select { .gap-y-2 { row-gap: 0.5rem; } -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} .space-y-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); @@ -1225,6 +1234,16 @@ select { margin-right: calc(0.25rem * var(--tw-space-x-reverse)); margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); } +.space-x-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(2rem * var(--tw-space-x-reverse)); + margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); +} +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} .overflow-hidden { overflow: hidden; } @@ -1237,6 +1256,9 @@ select { .overflow-x-hidden { overflow-x: hidden; } +.overflow-y-scroll { + overflow-y: scroll; +} .text-ellipsis { text-overflow: ellipsis; } @@ -1258,12 +1280,12 @@ select { .rounded-full { border-radius: 9999px; } -.rounded-sm { - border-radius: 0.125rem; -} .rounded-xl { border-radius: 0.75rem; } +.rounded-sm { + border-radius: 0.125rem; +} .rounded-2xl { border-radius: 1rem; } @@ -1361,10 +1383,25 @@ select { --tw-bg-opacity: 1; background-color: rgb(226 226 226 / var(--tw-bg-opacity)); } +.bg-lilac-400 { + --tw-bg-opacity: 1; + background-color: rgb(221 222 245 / var(--tw-bg-opacity)); +} +.bg-light-red { + --tw-bg-opacity: 1; + background-color: rgb(253 212 212 / var(--tw-bg-opacity)); +} +.bg-transparent { + background-color: transparent; +} .bg-mint-100 { --tw-bg-opacity: 1; background-color: rgb(37 222 141 / var(--tw-bg-opacity)); } +.bg-red { + --tw-bg-opacity: 1; + background-color: rgb(255 80 80 / var(--tw-bg-opacity)); +} .bg-lilac-300 { --tw-bg-opacity: 1; background-color: rgb(169 169 231 / var(--tw-bg-opacity)); @@ -1373,29 +1410,14 @@ select { --tw-bg-opacity: 1; background-color: rgb(147 149 222 / var(--tw-bg-opacity)); } -.bg-lilac-400 { - --tw-bg-opacity: 1; - background-color: rgb(221 222 245 / var(--tw-bg-opacity)); -} .bg-yellow-200 { --tw-bg-opacity: 1; background-color: rgb(250 253 212 / var(--tw-bg-opacity)); } -.bg-light-red { - --tw-bg-opacity: 1; - background-color: rgb(253 212 212 / var(--tw-bg-opacity)); -} .bg-mint-300 { --tw-bg-opacity: 1; background-color: rgb(166 241 208 / var(--tw-bg-opacity)); } -.bg-red { - --tw-bg-opacity: 1; - background-color: rgb(255 80 80 / var(--tw-bg-opacity)); -} -.bg-transparent { - background-color: transparent; -} .bg-opacity-75 { --tw-bg-opacity: 0.75; } @@ -1408,12 +1430,12 @@ select { .fill-current { fill: currentColor; } -.fill-white { - fill: #FFFFFF; -} .fill-lilac-100 { fill: #7C7DDC; } +.fill-white { + fill: #FFFFFF; +} .stroke-lilac-100 { stroke: #7C7DDC; } @@ -1442,12 +1464,12 @@ select { .p-1 { padding: 0.25rem; } -.p-8 { - padding: 2rem; -} .p-1\.5 { padding: 0.375rem; } +.p-8 { + padding: 2rem; +} .px-4 { padding-left: 1rem; padding-right: 1rem; @@ -1488,6 +1510,14 @@ select { padding-left: 2.5rem; padding-right: 2.5rem; } +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} +.py-px { + padding-top: 1px; + padding-bottom: 1px; +} .px-8 { padding-left: 2rem; padding-right: 2rem; @@ -1500,14 +1530,6 @@ select { padding-top: 1.5rem; padding-bottom: 1.5rem; } -.py-3 { - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} -.py-px { - padding-top: 1px; - padding-bottom: 1px; -} .px-12 { padding-left: 3rem; padding-right: 3rem; @@ -1516,6 +1538,18 @@ select { padding-left: 0px; padding-right: 0px; } +.py-36 { + padding-top: 9rem; + padding-bottom: 9rem; +} +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} +.py-60 { + padding-top: 15rem; + padding-bottom: 15rem; +} .px-1 { padding-left: 0.25rem; padding-right: 0.25rem; @@ -1568,6 +1602,12 @@ select { .pt-44 { padding-top: 11rem; } +.pt-0 { + padding-top: 0px; +} +.pb-5 { + padding-bottom: 1.25rem; +} .pl-4 { padding-left: 1rem; } @@ -1577,6 +1617,9 @@ select { .text-center { text-align: center; } +.text-justify { + text-align: justify; +} .font-sans { font-family: Poppins, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } @@ -1608,14 +1651,14 @@ select { font-size: 2.25rem; line-height: 2.5rem; } -.text-5xl { - font-size: 3rem; - line-height: 1; -} .text-2xl { font-size: 1.5rem; line-height: 2rem; } +.text-5xl { + font-size: 3rem; + line-height: 1; +} .font-medium { font-weight: 500; } @@ -1628,12 +1671,12 @@ select { .font-semibold { font-weight: 600; } -.font-light { - font-weight: 300; -} .font-extrabold { font-weight: 800; } +.font-light { + font-weight: 300; +} .uppercase { text-transform: uppercase; } @@ -1646,6 +1689,9 @@ select { .leading-7 { line-height: 1.75rem; } +.leading-6 { + line-height: 1.5rem; +} .tracking-wider { letter-spacing: 0.05em; } @@ -1672,6 +1718,10 @@ select { --tw-text-opacity: 1; color: rgb(243 244 248 / var(--tw-text-opacity)); } +.text-red { + --tw-text-opacity: 1; + color: rgb(255 80 80 / var(--tw-text-opacity)); +} .text-lilac-200 { --tw-text-opacity: 1; color: rgb(147 149 222 / var(--tw-text-opacity)); @@ -1680,21 +1730,17 @@ select { --tw-text-opacity: 1; color: rgb(172 157 22 / var(--tw-text-opacity)); } -.text-red { - --tw-text-opacity: 1; - color: rgb(255 80 80 / var(--tw-text-opacity)); -} -.text-mint-100 { +.text-mint-50 { --tw-text-opacity: 1; - color: rgb(37 222 141 / var(--tw-text-opacity)); + color: rgb(27 206 127 / var(--tw-text-opacity)); } .text-lilac-300 { --tw-text-opacity: 1; color: rgb(169 169 231 / var(--tw-text-opacity)); } -.text-mint-50 { +.text-mint-100 { --tw-text-opacity: 1; - color: rgb(27 206 127 / var(--tw-text-opacity)); + color: rgb(37 222 141 / var(--tw-text-opacity)); } .underline { -webkit-text-decoration-line: underline; @@ -1880,13 +1926,16 @@ select { --tw-bg-opacity: 1; background-color: rgb(226 226 226 / var(--tw-bg-opacity)); } +.hover\:bg-gray-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 248 / var(--tw-bg-opacity)); +} .hover\:bg-mint-200:hover { --tw-bg-opacity: 1; background-color: rgb(131 238 191 / var(--tw-bg-opacity)); } -.hover\:bg-gray-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(243 244 248 / var(--tw-bg-opacity)); +.hover\:bg-opacity-80:hover { + --tw-bg-opacity: 0.8; } .hover\:text-white:hover { --tw-text-opacity: 1; @@ -1936,13 +1985,11 @@ select { --tw-bg-opacity: 1; background-color: rgb(226 226 226 / var(--tw-bg-opacity)); } +.disabled\:bg-opacity-80:disabled { + --tw-bg-opacity: 0.8; +} @media (min-width: 640px) { - .sm\:-mx-6 { - margin-left: -1.5rem; - margin-right: -1.5rem; - } - .sm\:-my-px { margin-top: -1px; margin-bottom: -1px; @@ -2066,11 +2113,6 @@ select { } @media (min-width: 1024px) { - .lg\:-mx-8 { - margin-left: -2rem; - margin-right: -2rem; - } - .lg\:mt-0 { margin-top: 0px; } @@ -2107,6 +2149,10 @@ select { grid-template-rows: repeat(5, minmax(0, 1fr)); } + .lg\:grid-rows-3 { + grid-template-rows: repeat(3, minmax(0, 1fr)); + } + .lg\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)); } @@ -2115,10 +2161,6 @@ select { grid-template-rows: repeat(1, minmax(0, 1fr)); } - .lg\:grid-rows-3 { - grid-template-rows: repeat(3, minmax(0, 1fr)); - } - .lg\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)); } diff --git a/public/js/app.js.LICENSE.txt b/public/js/app.js.LICENSE.txt new file mode 100644 index 0000000..b1121f5 --- /dev/null +++ b/public/js/app.js.LICENSE.txt @@ -0,0 +1,8 @@ +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ diff --git a/public/js/chat_script.js b/public/js/chat_script.js new file mode 100644 index 0000000..ab0098f --- /dev/null +++ b/public/js/chat_script.js @@ -0,0 +1,61 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!*************************************!*\ + !*** ./resources/js/chat_script.js ***! + \*************************************/ +var fetchMessage = function fetchMessage() { + var url = $("input[name='fetch_link']").val(); + var messages = []; + $.ajax({ + type: "GET", + url: url, + success: function success(data) { + if (data.success) { + console.log(data.messages); + data.messages.forEach(function (message) { + if (message.from_id == -1) { + $("#message-area").append("\n
\n
\n

".concat(message.message, "

\n
\n
\n ")); + } else { + $("#message-area").append("\n
\n
\n

".concat(message.message, "

\n
\n
\n ")); + } + }); + } else { + alert("Can't fetch messages"); + } + } + }); +}; + +$("#send-form").submit(function (event) { + event.preventDefault(); + var form = $("#send-form"); + var url = form.attr('action'); + console.log(url); + $.ajax({ + type: "POST", + url: url, + data: form.serialize(), + success: function success(data) { + console.log(data); + + if (data.success) { + $("#message-area").append("\n
\n
\n

".concat(data.messages.message, "

\n
\n
\n ")); + } else { + alert("Can't send message"); + } + } + }); +}); +var id = document.getElementById("user-id").value; +var channelName = 'channel-' + id; +console.log(channelName); +window.Echo.channel(channelName).listen('MessageSent', function (event) { + console.log(event); + + if (event.message.from_id == -1) { + $("#message-area").append("\n
\n
\n

".concat(event.message.message, "

\n
\n
\n ")); + } +}); +fetchMessage(); +/******/ })() +; \ No newline at end of file diff --git a/public/js/chats_dashboard_script.js b/public/js/chats_dashboard_script.js new file mode 100644 index 0000000..4ec9ea4 --- /dev/null +++ b/public/js/chats_dashboard_script.js @@ -0,0 +1,62 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!************************************************!*\ + !*** ./resources/js/chats_dashboard_script.js ***! + \************************************************/ +var chatLists = document.querySelectorAll(".chat-list"); +var channelName = 'channel'; +chatLists.forEach(function (chat) { + chat.addEventListener("click", function () { + var id = chat.parentElement.querySelector(".chat_id").value; + var url = chat.parentElement.querySelector(".chat_url").value; + var formIdInput = document.querySelector('[name="to_id"]'); + formIdInput.value = id; + channelName = 'channel-' + id; + window.Echo.channel(channelName).listen('MessageSent', function (event) { + if (event.message.from_id != -1) { + $("#chat-body").append("\n
\n
\n

".concat(event.message.message, "

\n
\n
\n ")); + } + }); + console.log(url); + $.ajax({ + type: "GET", + url: url, + success: function success(data) { + if (data.success) { + console.log(data.messages); + data.messages.forEach(function (message) { + if (message.from_id == -1) { + $("#chat-body").append("\n
\n
\n

".concat(message.message, "

\n
\n
\n ")); + } else { + $("#chat-body").append("\n
\n
\n

".concat(message.message, "

\n
\n
\n ")); + } + }); + } else { + alert("Can't fetch message"); + } + } + }); + }); +}); +$("#chat-form").submit(function (event) { + event.preventDefault(); + var form = $("#chat-form"); + var url = form.attr('action'); + console.log(form.serialize()); + $.ajax({ + type: "POST", + url: url, + data: form.serialize(), + success: function success(data) { + console.log(data); + + if (data.success) { + $("#chat-body").append("\n
\n
\n

".concat(data.messages.message, "

\n
\n
\n ")); + } else { + alert("Can't send message"); + } + } + }); +}); +/******/ })() +; \ No newline at end of file diff --git a/public/js/customers_dashboard_script.js b/public/js/customers_dashboard_script.js new file mode 100644 index 0000000..876936d --- /dev/null +++ b/public/js/customers_dashboard_script.js @@ -0,0 +1,49 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!****************************************************!*\ + !*** ./resources/js/customers_dashboard_script.js ***! + \****************************************************/ +$("#table-body").on("click", "tr", function () { + var row = $(event.target).closest("tr"); + $.get(row.children()[0].value, function (data) { + console.log(data); + $("#selected-user-name").html(data.customer.name); + $("#selected-user-email").html(data.customer.email); + $("#selected-user-phone-1").html(data.customer.phone_1); + $("#selected-user-phone-2").html(data.customer.phone_2); + $("#selected-user-address-id").html(data.customer.address_id); + $("#selected-user-address-mlg").html(data.customer.address_mlg); + $.each(data.orders, function (key, order) { + var color = "text-red"; + + if (order.order_status == "PENDING") { + color = "text-lilac-100"; + } else if (order.order_status == "WAITING_FOR_PAYMENT") { + color = "text-yellow-100"; + } else if (order.order_status == "PAYMENT_DONE" || order.order_status == "COMPLETED") { + color = "text-mint-100"; + } + + $("#order").append("
\n

").concat(order.order_status, "

\n

").concat(order.vehicle_name, "

\n

ID Order : ").concat(order.order_id, "

\n
")); + }); + $("order").css('display', 'block'); + }); + $("#modal").css('display', 'flex'); +}); +$("#close").on("click", function () { + $("#modal").css('display', 'none'); +}); +$("#customer-tab").on("click", function () { + $("#customer-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#order-tab").css("border-bottom", "none"); + $("#customer").css("display", "block"); + $("#order").css("display", "none"); +}); +$("#order-tab").on("click", function () { + $("#customer-tab").css("border-bottom", "none"); + $("#order-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#customer").css("display", "none"); + $("#order").css("display", "block"); +}); +/******/ })() +; \ No newline at end of file diff --git a/public/js/dashboard_modal_script.js b/public/js/dashboard_modal_script.js index 3689228..697d5c2 100644 --- a/public/js/dashboard_modal_script.js +++ b/public/js/dashboard_modal_script.js @@ -1,73 +1,6 @@ /******/ (() => { // webpackBootstrap -var __webpack_exports__ = {}; -/*!************************************************!*\ - !*** ./resources/js/dashboard_modal_script.js ***! - \************************************************/ -$("#table-body").on("click", "tr:not(:first-child)", function () { - var row = $(event.target).closest("tr"); - ; - $.get(row.children()[0].value, function (data) { - console.log(data); - $("#selected-id").html(data[0].id); - $("#selected-transaction-id").html(data[0].transaction_id ? data[0].transaction_id : "N/A"); - $("#selected-application-date").html(data[0].created_at); - $("#selected-total-price").html("IDR " + data[0].total_price); - $("#selected-payment-expiry-time").html(data[0].payment_expiry_time ? data[0].payment_expiry_time : "N/A"); - $("#selected-payment-method").html(data[0].payment_method ? data[0].payment_method : "N/A"); - $("#selected-pickup-time").html(data[0].pickup_date + " " + data[0].pickup_time); - $("#selected-dropoff-time").html(data[0].dropoff_date + " " + data[0].dropoff_time); - $("#selected-pickup-location").html(data[0].pickup_address); - $("#selected-dropoff-location").html(data[0].dropoff_address); - $("#selected-note").html(data[0].note); - $("#selected-user-name").html(data[0].user_name); - $("#selected-user-email").html(data[0].email); - $("#selected-user-phone-1").html(data[0].phone_1); - $("#selected-user-phone-2").html(data[0].phone_2); - $("#selected-user-address-id").html(data[0].address_id); - $("#selected-user-address-mlg").html(data[0].address_mlg); - $("#selected-id-card-1").attr("src", "/storage/id-card/" + data[0].id_card); - $("#selected-id-card-2").attr("src", "/storage/id-card/" + data[0].id_card_2); - $("#selected-driver-license").attr("src", "/storage/driver-license/" + data[0].driver_license); - $("#selected-vehicle-id").html(data[0].vehicles_id); - $("#selected-vehicle-type").html(data[0].type); - $("#selected-vehicle-name").html(data[0].vehicle_name); - $("#selected-vehicle-price").html(data[0].price); - $("#selected-vehicle-fuel").html(data[0].fuel); - $("#selected-vehicle-cc").html(data[0].cc); - $("#selected-vehicle-transmission").html(data[0].transmission); - $("#selected-vehicle-year").html(data[0].year); - $("#selected-vehicle-unit").html(data[0].available_unit); - $("#selected-vehicle-year").html(data[0].year); - $("#selected-vehicle-image").attr("src", "/storage/images/" + data[0].photo); - }); - $("#modal").css('display', 'flex'); -}); -$("#close").on("click", function () { - $("#modal").css('display', 'none'); -}); -$("#customer-tab").on("click", function () { - $("#customer-tab").css("border-bottom", "4px solid #7C7DDC"); - $("#order-tab").css("border-bottom", "none"); - $("#vehicle-tab").css("border-bottom", "none"); - $("#customer").css("display", "block"); - $("#order").css("display", "none"); - $("#vehicle").css("display", "none"); -}); -$("#order-tab").on("click", function () { - $("#order-tab").css("border-bottom", "4px solid #7C7DDC"); - $("#customer-tab").css("border-bottom", "none"); - $("#vehicle-tab").css("border-bottom", "none"); - $("#order").css("display", "block"); - $("#customer").css("display", "none"); - $("#vehicle").css("display", "none"); -}); -$("#vehicle-tab").on("click", function () { - $("#vehicle-tab").css("border-bottom", "4px solid #7C7DDC"); - $("#order-tab").css("border-bottom", "none"); - $("#customer-tab").css("border-bottom", "none"); - $("#vehicle").css("display", "block"); - $("#order").css("display", "none"); - $("#customer").css("display", "none"); -}); +/******/ "use strict"; +/******/ +/******/ /******/ })() ; \ No newline at end of file diff --git a/public/js/orders_dashboard_script.js b/public/js/orders_dashboard_script.js new file mode 100644 index 0000000..24316e7 --- /dev/null +++ b/public/js/orders_dashboard_script.js @@ -0,0 +1,72 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!*************************************************!*\ + !*** ./resources/js/orders_dashboard_script.js ***! + \*************************************************/ +$("#table-body").on("click", "tr", function () { + var row = $(event.target).closest("tr"); + $.get(row.children()[0].value, function (data) { + console.log(data); + $("#selected-id").html(data[0].id); + $("#selected-transaction-id").html(data[0].transaction_id ? data[0].transaction_id : "N/A"); + $("#selected-application-date").html(data[0].created_at); + $("#selected-total-price").html("IDR " + data[0].total_price); + $("#selected-payment-expiry-time").html(data[0].payment_expiry_time ? data[0].payment_expiry_time : "N/A"); + $("#selected-payment-method").html(data[0].payment_method ? data[0].payment_method : "N/A"); + $("#selected-pickup-time").html(data[0].pickup_date + " " + data[0].pickup_time); + $("#selected-dropoff-time").html(data[0].dropoff_date + " " + data[0].dropoff_time); + $("#selected-pickup-location").html(data[0].pickup_address); + $("#selected-dropoff-location").html(data[0].dropoff_address); + $("#selected-note").html(data[0].note); + $("#selected-user-name").html(data[0].user_name); + $("#selected-user-email").html(data[0].email); + $("#selected-user-phone-1").html(data[0].phone_1); + $("#selected-user-phone-2").html(data[0].phone_2); + $("#selected-user-address-id").html(data[0].address_id); + $("#selected-user-address-mlg").html(data[0].address_mlg); + $("#selected-id-card-1").attr("src", "/storage/id-card/" + data[0].id_card); + $("#selected-id-card-2").attr("src", "/storage/id-card/" + data[0].id_card_2); + $("#selected-driver-license").attr("src", "/storage/driver-license/" + data[0].driver_license); + $("#selected-vehicle-id").html(data[0].vehicles_id); + $("#selected-vehicle-type").html(data[0].type); + $("#selected-vehicle-name").html(data[0].vehicle_name); + $("#selected-vehicle-price").html(data[0].price); + $("#selected-vehicle-fuel").html(data[0].fuel); + $("#selected-vehicle-cc").html(data[0].cc); + $("#selected-vehicle-transmission").html(data[0].transmission); + $("#selected-vehicle-year").html(data[0].year); + $("#selected-vehicle-unit").html(data[0].available_unit); + $("#selected-vehicle-year").html(data[0].year); + $("#selected-vehicle-image").attr("src", "/storage/images/" + data[0].photo); + }); + $("#modal").css('display', 'flex'); +}); +$("#close").on("click", function () { + $("#modal").css('display', 'none'); +}); +$("#customer-tab").on("click", function () { + $("#customer-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#order-tab").css("border-bottom", "none"); + $("#vehicle-tab").css("border-bottom", "none"); + $("#customer").css("display", "block"); + $("#order").css("display", "none"); + $("#vehicle").css("display", "none"); +}); +$("#order-tab").on("click", function () { + $("#order-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#customer-tab").css("border-bottom", "none"); + $("#vehicle-tab").css("border-bottom", "none"); + $("#order").css("display", "block"); + $("#customer").css("display", "none"); + $("#vehicle").css("display", "none"); +}); +$("#vehicle-tab").on("click", function () { + $("#vehicle-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#order-tab").css("border-bottom", "none"); + $("#customer-tab").css("border-bottom", "none"); + $("#vehicle").css("display", "block"); + $("#order").css("display", "none"); + $("#customer").css("display", "none"); +}); +/******/ })() +; \ No newline at end of file diff --git a/public/js/update_vehicle_script.js b/public/js/update_vehicle_script.js new file mode 100644 index 0000000..7ac516f --- /dev/null +++ b/public/js/update_vehicle_script.js @@ -0,0 +1,29 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!***********************************************!*\ + !*** ./resources/js/update_vehicle_script.js ***! + \***********************************************/ +var viewButton = document.getElementById('view-image'); +var updateButton = document.getElementById('update-image'); +var modal = document.getElementById('modal'); +var lightbox = document.getElementById('lightbox'); +viewButton.addEventListener('click', function () { + lightbox.style.display = 'flex'; +}); +updateButton.addEventListener('click', function () { + modal.style.display = 'flex'; +}); + +window.onclick = function (event) { + if (event.target == modal) { + modal.style.display = "none"; + } else if (event.target == lightbox) { + lightbox.style.display = "none"; + } +}; + +$("#close").on("click", function () { + $("#modal").css('display', 'none'); +}); +/******/ })() +; \ No newline at end of file diff --git a/public/js/vehicles_dashboard_script.js b/public/js/vehicles_dashboard_script.js new file mode 100644 index 0000000..ab8e1c0 --- /dev/null +++ b/public/js/vehicles_dashboard_script.js @@ -0,0 +1,44 @@ +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!***************************************************!*\ + !*** ./resources/js/vehicles_dashboard_script.js ***! + \***************************************************/ +$("#check-all").on("click", function () { + if ($("#check-all").prop("checked")) { + $("input[type=checkbox]").prop("checked", true); + } else { + $("input[type=checkbox]").prop("checked", false); + } +}); +$('input[type="checkbox"]').change(function () { + if ($('input[type=checkbox]').is(":checked")) { + $("#delete-button").prop('disabled', false); + } else { + $("#delete-button").prop('disabled', true); + } +}); +$('#delete-button').on('click', function () { + var link = $("input[name=delete_link]").val(); + var token = $("input[name=_token]").val(); + var ids = []; + $('input[type="checkbox"]:checked').each(function () { + ids.push($(this).val()); + }); + $.ajax({ + type: "POST", + url: link, + data: { + "_token": token, + "ids": ids + }, + success: function success(data) { + if (data.success) { + window.location.href = "/dashboard/vehicles/" + data.type; + } else { + alert("Can't delete this vehicle"); + } + } + }); +}); +/******/ })() +; \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 13ac643..bd9fc47 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,6 +1,11 @@ { "/js/app.js": "/js/app.js", "/js/navbar_script.js": "/js/navbar_script.js", - "/js/dashboard_modal_script.js": "/js/dashboard_modal_script.js", + "/js/orders_dashboard_script.js": "/js/orders_dashboard_script.js", + "/js/customers_dashboard_script.js": "/js/customers_dashboard_script.js", + "/js/vehicles_dashboard_script.js": "/js/vehicles_dashboard_script.js", + "/js/chat_script.js": "/js/chat_script.js", + "/js/chats_dashboard_script.js": "/js/chats_dashboard_script.js", + "/js/update_vehicle_script.js": "/js/update_vehicle_script.js", "/css/app.css": "/css/app.css" } diff --git a/resources/js/chat_script.js b/resources/js/chat_script.js new file mode 100644 index 0000000..444d82e --- /dev/null +++ b/resources/js/chat_script.js @@ -0,0 +1,94 @@ +const fetchMessage = () => { + let url = $("input[name='fetch_link']").val(); + let messages = []; + $.ajax( + { + type: "GET", + url, + success: function (data) { + if (data.success) { + console.log(data.messages) + data.messages.forEach(message => { + if(message.from_id == -1) { + $("#message-area").append( + ` +
+
+

${message.message}

+
+
+ ` + ) + } else { + $("#message-area").append( + ` +
+
+

${message.message}

+
+
+ ` + ) + } + }); + } else { + alert("Can't fetch messages"); + } + } + } + ) +} + +$("#send-form").submit((event) => { + event.preventDefault(); + + let form = $("#send-form"); + let url = form.attr('action'); + + console.log(url); + + $.ajax( + { + type: "POST", + url, + data: form.serialize(), + success: function (data) { + console.log(data) + if(data.success) { + $("#message-area").append( + ` +
+
+

${data.messages.message}

+
+
+ ` + ) + } else { + alert("Can't send message"); + } + } + } + ) +}) + +let id = document.getElementById("user-id").value; +let channelName = 'channel-' + id; +console.log(channelName); + +window.Echo.channel(channelName).listen('MessageSent', (event) => { + console.log(event); + if(event.message.from_id == -1) { + $("#message-area").append( + ` +
+
+

${event.message.message}

+
+
+ ` + ) + } +}); + +fetchMessage(); \ No newline at end of file diff --git a/resources/js/chats_dashboard_script.js b/resources/js/chats_dashboard_script.js new file mode 100644 index 0000000..af4e487 --- /dev/null +++ b/resources/js/chats_dashboard_script.js @@ -0,0 +1,96 @@ +const chatLists = document.querySelectorAll(".chat-list"); +let channelName = 'channel' + +chatLists.forEach((chat) => { + chat.addEventListener("click", () => { + const id = chat.parentElement.querySelector(".chat_id").value; + const url = chat.parentElement.querySelector(".chat_url").value; + const formIdInput = document.querySelector('[name="to_id"]'); + formIdInput.value = id; + channelName = 'channel-' + id; + window.Echo.channel(channelName).listen('MessageSent', (event) => { + if(event.message.from_id != -1) { + $("#chat-body").append( + ` +
+
+

${event.message.message}

+
+
+ ` + ) + } + }); + console.log(url); + $.ajax( + { + type: "GET", + url, + success: (data) => { + if (data.success) { + console.log(data.messages) + data.messages.forEach(message => { + if(message.from_id == -1) { + $("#chat-body").append( + ` +
+
+

${message.message}

+
+
+ ` + ) + } else { + $("#chat-body").append( + ` +
+
+

${message.message}

+
+
+ ` + ) + } + }); + } else { + alert("Can't fetch message") + } + } + } + ) + }); +}); + +$("#chat-form").submit((event) => { + event.preventDefault(); + + let form = $("#chat-form"); + let url = form.attr('action'); + + console.log(form.serialize()); + + $.ajax( + { + type: "POST", + url, + data: form.serialize(), + success: function (data) { + console.log(data) + if(data.success) { + $("#chat-body").append( + ` +
+
+

${data.messages.message}

+
+
+ ` + ) + } else { + alert("Can't send message"); + } + } + } + ) +}) + diff --git a/resources/js/customers_dashboard_script.js b/resources/js/customers_dashboard_script.js new file mode 100644 index 0000000..20489df --- /dev/null +++ b/resources/js/customers_dashboard_script.js @@ -0,0 +1,52 @@ +$("#table-body").on("click", "tr", () => { + let row = $(event.target).closest("tr"); + $.get(row.children()[0].value, + (data) => { + console.log(data) + $("#selected-user-name").html(data.customer.name); + $("#selected-user-email").html(data.customer.email); + $("#selected-user-phone-1").html(data.customer.phone_1); + $("#selected-user-phone-2").html(data.customer.phone_2); + $("#selected-user-address-id").html(data.customer.address_id); + $("#selected-user-address-mlg").html(data.customer.address_mlg); + + $.each( data.orders, function( key, order ) { + var color = "text-red"; + if(order.order_status == "PENDING"){ + color = "text-lilac-100"; + } else if(order.order_status == "WAITING_FOR_PAYMENT") { + color = "text-yellow-100" + } else if(order.order_status == "PAYMENT_DONE" || order.order_status == "COMPLETED") { + color = "text-mint-100" + } + + $("#order").append( + `
+

${order.order_status}

+

${order.vehicle_name}

+

ID Order : ${order.order_id}

+
` + ) + }); + $("order").css('display', 'block') + }) + $("#modal").css('display','flex'); +}); + +$("#close").on("click", () => { + $("#modal").css('display','none'); +}); + +$("#customer-tab").on("click", () => { + $("#customer-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#order-tab").css("border-bottom", "none"); + $("#customer").css("display", "block"); + $("#order").css("display", "none"); +}); + +$("#order-tab").on("click", () => { + $("#customer-tab").css("border-bottom", "none"); + $("#order-tab").css("border-bottom", "4px solid #7C7DDC"); + $("#customer").css("display", "none"); + $("#order").css("display", "block"); +}); \ No newline at end of file diff --git a/resources/js/dashboard_modal_script.js b/resources/js/orders_dashboard_script.js similarity index 96% rename from resources/js/dashboard_modal_script.js rename to resources/js/orders_dashboard_script.js index f5dac6e..4cc322c 100644 --- a/resources/js/dashboard_modal_script.js +++ b/resources/js/orders_dashboard_script.js @@ -1,5 +1,5 @@ -$("#table-body").on("click", "tr:not(:first-child)", () => { - let row = $(event.target).closest("tr");; +$("#table-body").on("click", "tr", () => { + let row = $(event.target).closest("tr"); $.get(row.children()[0].value, (data) => { console.log(data) @@ -40,7 +40,7 @@ $("#table-body").on("click", "tr:not(:first-child)", () => { $("#close").on("click", () => { $("#modal").css('display','none'); -}) +}); $("#customer-tab").on("click", () => { $("#customer-tab").css("border-bottom", "4px solid #7C7DDC"); @@ -49,7 +49,7 @@ $("#customer-tab").on("click", () => { $("#customer").css("display", "block"); $("#order").css("display", "none"); $("#vehicle").css("display", "none"); -}) +}); $("#order-tab").on("click", () => { $("#order-tab").css("border-bottom", "4px solid #7C7DDC"); @@ -58,7 +58,7 @@ $("#order-tab").on("click", () => { $("#order").css("display", "block"); $("#customer").css("display", "none"); $("#vehicle").css("display", "none"); -}) +}); $("#vehicle-tab").on("click", () => { $("#vehicle-tab").css("border-bottom", "4px solid #7C7DDC"); @@ -67,4 +67,4 @@ $("#vehicle-tab").on("click", () => { $("#vehicle").css("display", "block"); $("#order").css("display", "none"); $("#customer").css("display", "none"); -}) \ No newline at end of file +}); diff --git a/resources/js/update_vehicle_script.js b/resources/js/update_vehicle_script.js new file mode 100644 index 0000000..d428ecd --- /dev/null +++ b/resources/js/update_vehicle_script.js @@ -0,0 +1,24 @@ +const viewButton = document.getElementById('view-image'); +const updateButton = document.getElementById('update-image'); +const modal = document.getElementById('modal'); +const lightbox = document.getElementById('lightbox'); + +viewButton.addEventListener('click', () => { + lightbox.style.display = 'flex'; +}) + +updateButton.addEventListener('click', () => { + modal.style.display = 'flex'; +}) + +window.onclick = function(event) { + if (event.target == modal) { + modal.style.display = "none"; + } else if (event.target == lightbox) { + lightbox.style.display = "none"; + } +} + +$("#close").on("click", () => { + $("#modal").css('display','none'); +}); diff --git a/resources/js/vehicles_dashboard_script.js b/resources/js/vehicles_dashboard_script.js new file mode 100644 index 0000000..daa60db --- /dev/null +++ b/resources/js/vehicles_dashboard_script.js @@ -0,0 +1,41 @@ +$("#check-all").on("click", () => { + if ($("#check-all").prop("checked")) { + $("input[type=checkbox]").prop("checked", true); + } else { + $("input[type=checkbox]").prop("checked", false); + } +}); + +$('input[type="checkbox"]').change(function(){ + if ($('input[type=checkbox]').is(":checked")) { + $("#delete-button").prop('disabled', false); + } + else { + $("#delete-button").prop('disabled', true); + } +}); + +$('#delete-button').on('click', function() { + const link = $("input[name=delete_link]").val(); + const token = $("input[name=_token]").val(); + let ids = []; + $('input[type="checkbox"]:checked').each(function() { + ids.push($(this).val()); + }); + + $.ajax({ + type: "POST", + url: link, + data: { + "_token": token, + "ids": ids + }, + success: function(data) { + if (data.success) { + window.location.href = "/dashboard/vehicles/" + data.type; + } else { + alert("Can't delete this vehicle"); + } + } + }); +}); \ No newline at end of file diff --git a/resources/views/about.blade.php b/resources/views/about.blade.php new file mode 100644 index 0000000..2d3719b --- /dev/null +++ b/resources/views/about.blade.php @@ -0,0 +1,15 @@ + + +
+

Rent.ly, the Best Vehicles Rent Since 2016

+
+ Rent.ly Office +
+

Rent.ly's story dates back to 1954, when the company was founded in Indonesia to assist tourists and most students who going to study at Malang, as we know Malang is a city with thousands of students . Ever since then our business concept has notably developed. Nowadays we are proud to offer our customers a comprehensive service, including car and motorcycle rent.

+
+

We make sure that our customers are well catered for, therefore we cooperate closely with the major vehicle suppliers, from trusted sellers of used vehicles to new vehicles such as Honda, Yamaha, Toyota, and many others. The customer's satisfaction stands at the core of our business at all times. Our highly-trained reservations team operates from Monday to Sunday to provide you with the best service before, during and after the booking process whilst ensuring that you always receive the best condition of vehicles when renting a vehicle with us.

+
+
+
+
+
\ No newline at end of file diff --git a/resources/views/components/navbar.blade.php b/resources/views/components/navbar.blade.php index 445db6c..53133dd 100644 --- a/resources/views/components/navbar.blade.php +++ b/resources/views/components/navbar.blade.php @@ -11,7 +11,7 @@ @if(auth()->user()->hasRole('user')) 'rent', 'My order' => 'me/orders', 'Guide' => 'guide', 'Help' => 'help', 'About' => 'about'); ?> @else - 'dashboard/orders', 'Product' => 'dashboard/vehicles', 'Customer' => 'dashboard/customers') ?> + 'dashboard/orders', 'Product' => 'dashboard/vehicles', 'Customer' => 'dashboard/customers', 'Chat' => 'dashboard/chats') ?> @endif @endauth @foreach($values as $key => $value) diff --git a/resources/views/dashboard/chats.blade.php b/resources/views/dashboard/chats.blade.php new file mode 100644 index 0000000..0835f24 --- /dev/null +++ b/resources/views/dashboard/chats.blade.php @@ -0,0 +1,38 @@ + + +
+
+
+
+

Chat-list

+
+ @foreach($chatList as $chat) +
+ + +

{{ $chat['user_name'] }}

+
+ @endforeach +
+
+
+

Customer

+
+
+
+
+
+ @csrf + + + + Send + +
+
+
+
+ + +
+
\ No newline at end of file diff --git a/resources/views/dashboard/customers.blade.php b/resources/views/dashboard/customers.blade.php index 94701d7..ff80fdb 100644 --- a/resources/views/dashboard/customers.blade.php +++ b/resources/views/dashboard/customers.blade.php @@ -14,88 +14,147 @@
-

Showing result 1-10 Result

+

Showing {{ count($customers) }} results from {{ $total_data }} records

Item per page

- +
+ +
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - Order ID - - Vehicle - - Pick up time - - Drop off time - - Customer - - Status - - Total price - - Action -
- - - - - - - - - - - - - - - - - -
+ +
+
+
+ + + + + + + + + + + + + + @foreach($customers as $customer) + + + + + + + + + + @endforeach + +
Customer IDNameEmailPhone Number 1Phone Number 2Profile Status
+ {{ $customer->id }} + + {{ $customer->name }} + + {{ $customer->email }} + + {{ $customer->phone_1 ? $customer->phone_1 : '-' }} + + {{ $customer->phone_2 ? $customer->phone_2 : '-' }} + + @if($customer->completed == 'true') +
Complete
+ @else +
Incomplete
+ @endif +
+
+
+
+ @if($page != 1) +
+ + + Previous +
+ @endif +
+ @php $total_page = ceil($total_data / $take) @endphp + @for ($i = 1; $i <= $total_page; $i++) + @if($i == $page) +
{{ $i }}
+ @else +
+ + +
{{ $i }}
+
+ @endif + @endfor +
+ @if($page != $total_page) +
+ + +

Next

+
+ @endif
+
+
+ + diff --git a/resources/views/dashboard/orders.blade.php b/resources/views/dashboard/orders.blade.php index aa8d590..a6aa6cd 100644 --- a/resources/views/dashboard/orders.blade.php +++ b/resources/views/dashboard/orders.blade.php @@ -1,6 +1,6 @@ -
+
@@ -27,34 +27,34 @@
-

Showing result 1-10 Result

+

Showing {{ count($orders) }} results from {{ $total_data }} records

Item per page

- + + + +
- + @if(count($orders) > 0)
- - - - - - - + + + + + + @@ -62,9 +62,6 @@ @foreach($orders as $order) - @@ -92,7 +89,7 @@ @endif
- - Order ID VehiclePick up timeDrop off timeCustomerStatusTotal priceActionPick up timeDrop off timeCustomerStatusTotal priceAction
- - {{ $order->id }} - {{ $order->total_price }} + IDR {{ $order->total_price }} @if($order->order_status == 'PENDING') @@ -121,16 +118,45 @@
- Previous -
-
1
-
2
-
- Next + @if($page != 1) +
+ + + Previous +
+ @endif +
+ @php $total_page = ceil($total_data / $take) @endphp + @for ($i = 1; $i <= $total_page; $i++) + @if($i == $page) +
{{ $i }}
+ @else +
+ + +
{{ $i }}
+
+ @endif + @endfor +
+ @if($page != $total_page) +
+ + +

Next

+
+ @endif
+ + @else +
+
+

No Data

+ @endif + - + diff --git a/resources/views/dashboard/update-vehicle-form.blade.php b/resources/views/dashboard/update-vehicle-form.blade.php new file mode 100644 index 0000000..586f9ca --- /dev/null +++ b/resources/views/dashboard/update-vehicle-form.blade.php @@ -0,0 +1,119 @@ + + +
+

Edit {{ $type }}

+
+
+ {{ $vehicle['name'] }} +
+
+ View Image +
+
+ Update Image +
+
+
+
+ @csrf +
+
+ + +
+
+ + @if($type == 'Motor') + + @else + + @endif + +
+
+ + + +
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + Update {{ $type }} + +
+
+
+
+
+ + + + + + +
+
\ No newline at end of file diff --git a/resources/views/dashboard/vehicles.blade.php b/resources/views/dashboard/vehicles.blade.php index fa266a2..f73ca92 100644 --- a/resources/views/dashboard/vehicles.blade.php +++ b/resources/views/dashboard/vehicles.blade.php @@ -14,91 +14,131 @@ -
+
+
+
+ + + +
+
-

Showing result 1-10 Result

+

Showing {{ count($vehicles) }} results from {{ $total_data }} records

Item per page

- +
+ +
-
-
-
-
- - - - - - - - - - - - - - - @foreach($vehicles as $vehicle) - - - - - - - - - - - @endforeach - -
- - - Vehicle ID - - Vehicle - - Transmission - - CC - - Fuel Type - - Rent Price - - Total Unit -
- - - {{ $vehicle-> id }} - - {{ $vehicle-> name }} - - {{ $vehicle-> transmission }} - - {{ $vehicle-> cc }} - - {{ $vehicle-> fuel }} - - {{ $vehicle-> price }} - - {{ $vehicle-> available_unit }} -
-
+ +
+
+
+ + + + + + + + + + + + + + + + @foreach($vehicles as $vehicle) + @php + $routeName ="'" .route('update-' .strtolower($type), [$vehicle->id]). "'"; + @endphp + + + + + + + + + + + @endforeach + +
+ + Vehicle IDVehicleTransmissionCCFuel TypeRent PriceTotal Unit
+ + + {{ $vehicle->id }} + + {{ $vehicle->name }} + + {{ $vehicle->transmission }} + + {{ $vehicle->cc }} CC + + {{ $vehicle->fuel }} + + IDR {{ $vehicle->price }} + + {{ $vehicle->available_unit }} +
+
+
+
+ @if($page != 1) +
+ + + Previous +
+ @endif +
+ @php $total_page = ceil($total_data / $take) @endphp + @for ($i = 1; $i <= $total_page; $i++) + @if($i == $page) +
{{ $i }}
+ @else +
+ + +
{{ $i }}
+
+ @endif + @endfor +
+ @if($page != $total_page) +
+ + +

Next

+
+ @endif
+ + diff --git a/resources/views/help.blade.php b/resources/views/help.blade.php new file mode 100644 index 0000000..bfcbb2b --- /dev/null +++ b/resources/views/help.blade.php @@ -0,0 +1,104 @@ + + +
+
+

Frequently Asked Question

+
+
+

Where is Rent.ly office?

+

+

+
+
+

+ We're currently operating in Malang, East Java. You can find Rent.ly office near Malang Station, Jl. Trunojoyo No.3, Kiduldalem, Kec. Klojen, Malang city. +

+
+
+
+
+

How does Rent.ly work?

+

+

+
+
+

+ Enter your delivery and return dates and times, choose your vehicle, complete a short verification and payment process, sit back and we deliver and pick up your vehicle to your door! You can return the car at any address in our service area. +

+
+
+
+
+

Do I need to refuel the vehicle before my return?

+

+

+
+
+

+ Regarding to our rules, the amount of fuel at the end of use / at the time of return must be the same as the fuel at the beginning of use. + But actually you may return the vehicle at any fuel level. If it is below the fuel level at the start of the trip, we will refuel it for you and charge you at local market rates! If you received a vehicle lower than full, we only charge up to that level. +

+
+
+
+
+

What payment methods does Rent.ly accept?

+

+

+
+
+

+ We accept all major bank transfers and e-wallet transfers. + We do not accept cash or any debit card payments for the booking cost. +

+
+
+
+
+ @auth +
+
+

Rent.ly Admin

+
+
+ +
+
+ +
+ @csrf + + + Send + +
+
+ @endauth + @guest +
+

Do you have more questions?

+

Login to ask us via chat, or

+ + + +
+ @endguest +
+
+ + + +
+
+ \ No newline at end of file diff --git a/resources/views/rules.blade.php b/resources/views/rules.blade.php new file mode 100644 index 0000000..4403e80 --- /dev/null +++ b/resources/views/rules.blade.php @@ -0,0 +1,61 @@ + + + +
+
    +
  1. +
    1
    +

    Must have SIM C (for motorbike rental) or SIM A (for car rental) which is still valid and can show it when handing over the vehicle.

    +
  2. +
  3. +
    2
    +

    Must comply with all applicable vehicle rental procedures.

    +
  4. +
  5. +
    3
    +

    Must be willing to be photographed with the rental vehicle, for data collection purposes.

    +
  6. +
  7. +
    4
    +

    Delivery and pick-up service hours are 06.00 - 21.00 WIB. Outside of service hours you can subject to postage of Rp. 50.000,-.

    +
  8. +
  9. +
    5
    +

    The amount of fuel at the end of use / at the time of return must be the same as the fuel at the beginning of use.

    +
  10. +
  11. +
    6
    +

    It is not allowed to rent a motorbike to be taken out of the Malang area, inform Rent.ly and if you violate the provisions, you will be subject to a fine of Rp. 150.000,-

    +
  12. +
  13. +
    7
    +

    All crimes will be reported to the police and will be dealt with strictly according to applicable law.

    +
  14. +
  15. +
    8
    +

    Overtime is valid only for the first 1 hour and is charged Rp. 10,000,-. If it is more than 1 hour, the rate will be charged for the next day.

    +
  16. +
+
+
+
\ No newline at end of file diff --git a/resources/views/user-profile.blade.php b/resources/views/user-profile.blade.php index df81cd0..13399a7 100644 --- a/resources/views/user-profile.blade.php +++ b/resources/views/user-profile.blade.php @@ -22,7 +22,7 @@
- +
@@ -34,5 +34,10 @@ @csrf
+ + \ No newline at end of file diff --git a/routes/channels.php b/routes/channels.php index 5d451e1..b72161f 100644 --- a/routes/channels.php +++ b/routes/channels.php @@ -16,3 +16,8 @@ Broadcast::channel('App.Models.User.{id}', function ($user, $id) { return (int) $user->id === (int) $id; }); + + +Broadcast::channel('rent.ly-development', function ($user) { + return Auth::check(); + }); diff --git a/routes/web.php b/routes/web.php index 84c33c9..9edcf3b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,7 @@ use App\Http\Controllers\RentController; use App\Http\Controllers\UserController; use App\Http\Controllers\AdminController; +use App\Http\Controllers\ChatsController; use Illuminate\Support\Facades\Storage; use Illuminate\Http\Request; @@ -64,12 +65,15 @@ Route::get('/me/order/{id}/va', [RentController::class, 'getVirtualAccount'])->name('get-virtual-account'); Route::get('/me/order/{id}/confirm', [RentController::class, 'getConfirmPayment'])->name('confirm-payment'); Route::get('/me/order/{id}/check', [RentController::class, 'checkPayment'])->name('check-payment'); + Route::get('/message', [ChatsController::class, 'fetchMessage'])->name('fetch-message'); + Route::post('/message', [ChatsController::class, 'sendMessage'])->name('send-message'); }); Route::middleware(['auth', 'admin.authenticated'])-> group(function () { Route::get('/dashboard/customers', [AdminController::class, 'getCustomersDashboard'])->name('customers-dahboard'); Route::get('/dashboard/orders', [AdminController::class, 'getOrdersDashboard'])->name('orders-dashboard'); Route::get('/order-details/{id}', [AdminController::class, 'getOrderDetails'])->name('order-details'); + Route::get('/customer-details/{id}', [AdminController::class, 'getCustomerDetails'])->name('customer-details'); Route::post('/dashboard/orders/acceptance/{id}', [AdminController::class, 'acceptOrder'])->name('accept-order'); Route::post('/dashboard/orders/rejection/{id}', [AdminController::class, 'rejectOrder'])->name('reject-order'); Route::get('/dashboard/vehicles/car', [AdminController::class, 'getVehiclesDashboardCar'])->name('vehicles-dashboard-car'); @@ -77,7 +81,14 @@ Route::post('/dashboard/vehicles/car/done', [AdminController::class, 'doneVehicle'])->name('done-vehicle'); Route::get('/dashboard/vehicles/car/new', [AdminController::class, 'getNewCarForm'])->name('add-car'); Route::get('/dashboard/vehicles/motor/new', [AdminController::class, 'getNewMotorForm'])->name('add-motor'); + Route::get('/dashboard/vehicles/motor/{id}', [AdminController::class, 'updateMotorForm'])->name('update-motor'); + Route::get('/dashboard/vehicles/car/{id}', [AdminController::class, 'updateCarForm'])->name('update-car'); Route::post('/dashboard/vehicles/{type}/new', [AdminController::class, 'addVehicle'])->name('add-vehicle')->where('type', '\b(car|motor)\b'); + Route::post('/dashboard/vehicles/{type}/delete', [AdminController::class, 'deleteVehicle'])->name('delete-vehicle')->where('type', '\b(car|motor)\b'); + Route::get('/dashboard/chats', [AdminController::class, 'getChatsDashboard'])->name('chats-dashboard')->name('chat-dashboard'); + Route::get('/dashboard/chats/get/{id}', [ChatsController::class, 'fetchAdminMessage'])->name('fetch-admin-message'); + Route::post('/dashboard/vehicles/{id}/update', [AdminController::class, 'updateVehicle'])->name('update-vehicle'); + Route::post('/dashboard/vehicles/{id}/update/image', [AdminController::class, 'updateVehicleImage'])->name('update-vehicle-image'); }); Route::get('/test-up', function() { diff --git a/webpack.mix.js b/webpack.mix.js index 987216e..00dab86 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -11,7 +11,15 @@ const mix = require('laravel-mix'); | */ -mix.js('resources/js/app.js', 'public/js').js('resources/js/navbar_script.js', 'public/js').js('resources/js/dashboard_modal_script.js', 'public/js').postCss('resources/css/app.css', 'public/css', [ +mix.js('resources/js/app.js', 'public/js') + .js('resources/js/navbar_script.js', 'public/js') + .js('resources/js/orders_dashboard_script.js', 'public/js') + .js('resources/js/customers_dashboard_script.js', 'public/js') + .js('resources/js/vehicles_dashboard_script.js', 'public/js') + .js('resources/js/chat_script.js', 'public/js') + .js('resources/js/chats_dashboard_script.js', 'public/js') + .js('resources/js/update_vehicle_script.js', 'public/js') + .postCss('resources/css/app.css', 'public/css', [ require('postcss-import'), require('tailwindcss'), require('autoprefixer'),