Update Fitur dan Improvement

dev
Aji Kamaludin 1 year ago
parent a2e26c31f3
commit 3b72278edf
No known key found for this signature in database
GPG Key ID: 19058F67F0083AD3

@ -6,6 +6,7 @@ use App\Models\Customer;
use App\Models\Product;
use App\Models\Sale;
use App\Models\SaleItem;
use App\Models\Setting;
use Carbon\Carbon;
use Illuminate\Http\Request;
@ -41,25 +42,23 @@ class GeneralController extends Controller
->orderBy('date', 'asc')
->groupBy('date')
->get();
$target = (Setting::where('key', 'target')->value('value') ?? 90000) / 30;
// $dounat = SaleItem::selectRaw('product_id, SUM(quantity) as qty')
// ->with('product.category')
// ->join('products', 'products.id', '=', 'sale_items.product_id')
// ->groupBy('sale_items.product_id')
// ->get();
$dounat = SaleItem::selectRaw('product_id, SUM(quantity) as qty')
$dounat = SaleItem::selectRaw('product_id, category_id, SUM(quantity) as qty')
->with('product.category')
->join('products', 'products.id', '=', 'sale_items.product_id')
->join('categories', 'categories.id', '=', 'products.category_id')
->join('sales', 'sales.id', '=', 'sale_items.sale_id')
->whereBetween('sales.date', [now()->startOfMonth()->format('m/d/Y'), now()->endOfMonth()->format('m/d/Y')])
->groupBy('sale_items.product_id')
->groupBy('products.category_id')
->get();
$favoriteProducts = SaleItem::selectRaw('product_id, sum(quantity) as qty')
->groupBy('product_id')
->orderBy('qty', 'desc')
->with('product')
->join('sales', 'sales.id', '=', 'sale_items.sale_id')
->whereBetween('sales.date', [now()->startOfMonth()->format('m/d/Y'), now()->endOfMonth()->format('m/d/Y')])
->orderBy('qty', 'desc')
->groupBy('product_id')
->get();
$transactionCustomers = Sale::selectRaw('customer_id, sum(total) as stotal')
@ -80,6 +79,7 @@ class GeneralController extends Controller
'list_customer' => $transactionCustomers,
'month' => now()->locale('id')->translatedFormat('F'),
'total_sale_month' => $totalSaleMonth,
'targets' => [$target, $target, $target, $target, $target, $target, $target, $target]
]);
}

@ -63,7 +63,8 @@ class SaleController extends Controller
'customer_id' => 'nullable|exists:customers,id',
'items' => 'required|array',
'items.*.id' => 'required|exists:products,id',
'items.*.qty' => 'required|numeric'
'items.*.qty' => 'required|numeric',
'note' => 'nullable|string'
]);
DB::beginTransaction();
@ -75,7 +76,8 @@ class SaleController extends Controller
'code' => $code,
'date' => $request->date,
'customer_id' => $request->customer_id,
'total' => collect($request->items)->sum(fn ($item) => $item['qty'] * $item['price'])
'total' => collect($request->items)->sum(fn ($item) => $item['qty'] * $item['price']),
'note' => $request->note,
]);
foreach ($request->items as $item) {

@ -19,7 +19,8 @@ class SettingController extends Controller
{
$request->validate([
'name' => 'required|string',
'detail' => 'required|string'
'detail' => 'required|string',
'target' => 'required|numeric|min:1'
]);
DB::beginTransaction();

@ -36,6 +36,7 @@ class HandleInertiaRequests extends Middleware
'flash' => [
'message' => fn () => $request->session()->get('message'),
],
'app_name' => env('APP_NAME', 'App Name')
]);
}
}

@ -15,6 +15,6 @@ class Product extends Model
public function category()
{
return $this->belongsTo(Category::class);
return $this->belongsTo(Category::class)->withTrashed();
}
}

@ -11,12 +11,13 @@ class Sale extends Model
'code',
'date',
'customer_id',
'total'
'total',
'note'
];
public function customer()
{
return $this->belongsTo(Customer::class);
return $this->belongsTo(Customer::class)->withTrashed();
}
public function items()

@ -14,7 +14,7 @@ class SaleItem extends Model
public function product()
{
return $this->belongsTo(Product::class);
return $this->belongsTo(Product::class)->withTrashed();
}
public function sale()

@ -8,7 +8,7 @@
"php": "^8.1.0",
"guzzlehttp/guzzle": "^7.7.0",
"inertiajs/inertia-laravel": "^0.6.9",
"laravel/framework": "^10.11.0",
"laravel/framework": "^10.12.0",
"laravel/sanctum": "^3.2.5",
"laravel/tinker": "^2.8.1",
"react/async": "^4",
@ -23,7 +23,7 @@
"mockery/mockery": "^1.5.1",
"nunomaduro/collision": "^6.4",
"phpunit/phpunit": "^9.6.8",
"spatie/laravel-ignition": "^2.1.2"
"spatie/laravel-ignition": "^2.1.3"
},
"autoload": {
"psr-4": {

140
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "148b8a6d9c79b3f2513c09b12bcdbb3b",
"content-hash": "9d05f8cdd99d092470841a038107bbf1",
"packages": [
{
"name": "brick/math",
@ -1048,16 +1048,16 @@
},
{
"name": "laravel/framework",
"version": "v10.11.0",
"version": "v10.12.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "21a5b6d9b669f32c10cc8ba776511b5f62599fea"
"reference": "9e6dcff23ab1d4b522bef56074c31625cf077576"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/21a5b6d9b669f32c10cc8ba776511b5f62599fea",
"reference": "21a5b6d9b669f32c10cc8ba776511b5f62599fea",
"url": "https://api.github.com/repos/laravel/framework/zipball/9e6dcff23ab1d4b522bef56074c31625cf077576",
"reference": "9e6dcff23ab1d4b522bef56074c31625cf077576",
"shasum": ""
},
"require": {
@ -1244,7 +1244,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2023-05-16T13:59:23+00:00"
"time": "2023-05-23T18:04:16+00:00"
},
{
"name": "laravel/sanctum",
@ -1935,16 +1935,16 @@
},
{
"name": "nesbot/carbon",
"version": "2.66.0",
"version": "2.67.0",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
"reference": "496712849902241f04902033b0441b269effe001"
"reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001",
"reference": "496712849902241f04902033b0441b269effe001",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8",
"reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8",
"shasum": ""
},
"require": {
@ -2033,7 +2033,7 @@
"type": "tidelift"
}
],
"time": "2023-01-29T18:53:47+00:00"
"time": "2023-05-25T22:09:47+00:00"
},
{
"name": "nette/schema",
@ -2767,16 +2767,16 @@
},
{
"name": "psy/psysh",
"version": "v0.11.17",
"version": "v0.11.18",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
"reference": "3dc5d4018dabd80bceb8fe1e3191ba8460569f0a"
"reference": "4f00ee9e236fa6a48f4560d1300b9c961a70a7ec"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/3dc5d4018dabd80bceb8fe1e3191ba8460569f0a",
"reference": "3dc5d4018dabd80bceb8fe1e3191ba8460569f0a",
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/4f00ee9e236fa6a48f4560d1300b9c961a70a7ec",
"reference": "4f00ee9e236fa6a48f4560d1300b9c961a70a7ec",
"shasum": ""
},
"require": {
@ -2837,9 +2837,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
"source": "https://github.com/bobthecow/psysh/tree/v0.11.17"
"source": "https://github.com/bobthecow/psysh/tree/v0.11.18"
},
"time": "2023-05-05T20:02:42+00:00"
"time": "2023-05-23T02:31:11+00:00"
},
{
"name": "ralouphie/getallheaders",
@ -3290,16 +3290,16 @@
},
{
"name": "symfony/console",
"version": "v6.2.10",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "12288d9f4500f84a4d02254d4aa968b15488476f"
"reference": "5aa03db8ef0a5457c316ec580e69562d97734c77"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/12288d9f4500f84a4d02254d4aa968b15488476f",
"reference": "12288d9f4500f84a4d02254d4aa968b15488476f",
"url": "https://api.github.com/repos/symfony/console/zipball/5aa03db8ef0a5457c316ec580e69562d97734c77",
"reference": "5aa03db8ef0a5457c316ec580e69562d97734c77",
"shasum": ""
},
"require": {
@ -3366,7 +3366,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.2.10"
"source": "https://github.com/symfony/console/tree/v6.2.11"
},
"funding": [
{
@ -3382,7 +3382,7 @@
"type": "tidelift"
}
],
"time": "2023-04-28T13:37:43+00:00"
"time": "2023-05-26T08:16:21+00:00"
},
{
"name": "symfony/css-selector",
@ -3518,16 +3518,16 @@
},
{
"name": "symfony/error-handler",
"version": "v6.2.10",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb"
"reference": "e847ba47e7a8f9708082990cb40ab4ff0440a11e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/8b7e9f124640cb0611624a9383176c3e5f7d8cfb",
"reference": "8b7e9f124640cb0611624a9383176c3e5f7d8cfb",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/e847ba47e7a8f9708082990cb40ab4ff0440a11e",
"reference": "e847ba47e7a8f9708082990cb40ab4ff0440a11e",
"shasum": ""
},
"require": {
@ -3569,7 +3569,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v6.2.10"
"source": "https://github.com/symfony/error-handler/tree/v6.2.11"
},
"funding": [
{
@ -3585,7 +3585,7 @@
"type": "tidelift"
}
],
"time": "2023-04-18T13:46:08+00:00"
"time": "2023-05-05T11:55:01+00:00"
},
{
"name": "symfony/event-dispatcher",
@ -3815,16 +3815,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v6.2.10",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc"
"reference": "df27f4191a4292d01fd062296e09cbc8b657cb57"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/49adbb92bcb4e3c2943719d2756271e8b9602acc",
"reference": "49adbb92bcb4e3c2943719d2756271e8b9602acc",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/df27f4191a4292d01fd062296e09cbc8b657cb57",
"reference": "df27f4191a4292d01fd062296e09cbc8b657cb57",
"shasum": ""
},
"require": {
@ -3873,7 +3873,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.2.10"
"source": "https://github.com/symfony/http-foundation/tree/v6.2.11"
},
"funding": [
{
@ -3889,20 +3889,20 @@
"type": "tidelift"
}
],
"time": "2023-04-18T13:46:08+00:00"
"time": "2023-05-19T12:39:53+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v6.2.10",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "81064a65a5496f17d2b6984f6519406f98864215"
"reference": "954a1a3b178309b216261eedc735c079709e4ab3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/81064a65a5496f17d2b6984f6519406f98864215",
"reference": "81064a65a5496f17d2b6984f6519406f98864215",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/954a1a3b178309b216261eedc735c079709e4ab3",
"reference": "954a1a3b178309b216261eedc735c079709e4ab3",
"shasum": ""
},
"require": {
@ -3950,6 +3950,7 @@
"symfony/translation": "^5.4|^6.0",
"symfony/translation-contracts": "^1.1|^2|^3",
"symfony/uid": "^5.4|^6.0",
"symfony/var-exporter": "^6.2",
"twig/twig": "^2.13|^3.0.4"
},
"suggest": {
@ -3984,7 +3985,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.2.10"
"source": "https://github.com/symfony/http-kernel/tree/v6.2.11"
},
"funding": [
{
@ -4000,7 +4001,7 @@
"type": "tidelift"
}
],
"time": "2023-04-28T13:50:28+00:00"
"time": "2023-05-27T21:12:52+00:00"
},
{
"name": "symfony/mailer",
@ -4824,16 +4825,16 @@
},
{
"name": "symfony/process",
"version": "v6.2.10",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e"
"reference": "97ae9721bead9d1a39b5650e2f4b7834b93b539c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e",
"reference": "b34cdbc9c5e75d45a3703e63a48ad07aafa8bf2e",
"url": "https://api.github.com/repos/symfony/process/zipball/97ae9721bead9d1a39b5650e2f4b7834b93b539c",
"reference": "97ae9721bead9d1a39b5650e2f4b7834b93b539c",
"shasum": ""
},
"require": {
@ -4865,7 +4866,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v6.2.10"
"source": "https://github.com/symfony/process/tree/v6.2.11"
},
"funding": [
{
@ -4881,7 +4882,7 @@
"type": "tidelift"
}
],
"time": "2023-04-18T13:56:57+00:00"
"time": "2023-05-19T07:42:48+00:00"
},
{
"name": "symfony/routing",
@ -5144,16 +5145,16 @@
},
{
"name": "symfony/translation",
"version": "v6.2.8",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5"
"reference": "64113df3e8b009f92fad63014f4ec647e65bc927"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/817535dbb1721df8b3a8f2489dc7e50bcd6209b5",
"reference": "817535dbb1721df8b3a8f2489dc7e50bcd6209b5",
"url": "https://api.github.com/repos/symfony/translation/zipball/64113df3e8b009f92fad63014f4ec647e65bc927",
"reference": "64113df3e8b009f92fad63014f4ec647e65bc927",
"shasum": ""
},
"require": {
@ -5222,7 +5223,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v6.2.8"
"source": "https://github.com/symfony/translation/tree/v6.2.11"
},
"funding": [
{
@ -5238,7 +5239,7 @@
"type": "tidelift"
}
],
"time": "2023-03-31T09:14:44+00:00"
"time": "2023-05-19T12:37:14+00:00"
},
{
"name": "symfony/translation-contracts",
@ -5397,16 +5398,16 @@
},
{
"name": "symfony/var-dumper",
"version": "v6.2.10",
"version": "v6.2.11",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "41a750a23412ca76fdbbf5096943b4134272c1ab"
"reference": "7d10f2a5a452bda385692fc7d38cd6eccfebe756"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/41a750a23412ca76fdbbf5096943b4134272c1ab",
"reference": "41a750a23412ca76fdbbf5096943b4134272c1ab",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/7d10f2a5a452bda385692fc7d38cd6eccfebe756",
"reference": "7d10f2a5a452bda385692fc7d38cd6eccfebe756",
"shasum": ""
},
"require": {
@ -5414,7 +5415,6 @@
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"phpunit/phpunit": "<5.4.3",
"symfony/console": "<5.4"
},
"require-dev": {
@ -5465,7 +5465,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.2.10"
"source": "https://github.com/symfony/var-dumper/tree/v6.2.11"
},
"funding": [
{
@ -5481,7 +5481,7 @@
"type": "tidelift"
}
],
"time": "2023-04-18T13:46:08+00:00"
"time": "2023-05-25T13:08:43+00:00"
},
{
"name": "tightenco/ziggy",
@ -8187,16 +8187,16 @@
},
{
"name": "spatie/ignition",
"version": "1.7.0",
"version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/ignition.git",
"reference": "f747d83c6d7cb6229b462f3ddbb3a82dc0db0f78"
"reference": "ad13a6792992411e05d3d3b293e26bdf9f9a7321"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/ignition/zipball/f747d83c6d7cb6229b462f3ddbb3a82dc0db0f78",
"reference": "f747d83c6d7cb6229b462f3ddbb3a82dc0db0f78",
"url": "https://api.github.com/repos/spatie/ignition/zipball/ad13a6792992411e05d3d3b293e26bdf9f9a7321",
"reference": "ad13a6792992411e05d3d3b293e26bdf9f9a7321",
"shasum": ""
},
"require": {
@ -8266,20 +8266,20 @@
"type": "github"
}
],
"time": "2023-05-04T13:20:26+00:00"
"time": "2023-05-25T10:19:32+00:00"
},
{
"name": "spatie/laravel-ignition",
"version": "2.1.2",
"version": "2.1.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-ignition.git",
"reference": "2f99fa6b732a6049e78ed34e4608ce589605ae54"
"reference": "35711943d4725aa80f8033e4f1cb3a6775530b25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/2f99fa6b732a6049e78ed34e4608ce589605ae54",
"reference": "2f99fa6b732a6049e78ed34e4608ce589605ae54",
"url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/35711943d4725aa80f8033e4f1cb3a6775530b25",
"reference": "35711943d4725aa80f8033e4f1cb3a6775530b25",
"shasum": ""
},
"require": {
@ -8358,7 +8358,7 @@
"type": "github"
}
],
"time": "2023-05-09T07:19:31+00:00"
"time": "2023-05-25T11:30:27+00:00"
},
{
"name": "symfony/yaml",

@ -17,6 +17,7 @@ return new class extends Migration
$table->timestamp('date')->nullable();
$table->uuid('customer_id')->nullable();
$table->decimal('total', 14, 2)->default(0);
$table->text('note')->nullable();
$table->timestamps();
$table->softDeletes();
$table->uuid('created_by')->nullable();

@ -17,23 +17,44 @@ class DummySeeder extends Seeder
*/
public function run()
{
foreach(['makanan', 'minuman'] as $cat) {
foreach (['makanan', 'minuman'] as $cat) {
$category = Category::create(['name' => $cat]);
}
foreach([
'Roti Tawar',
'Indomie',
$products = [
'Roti Tawar',
'Indomie',
'Telur Omega 3',
'Enervonche',
'Teh Olong'
] as $prod) {
'Teh Olong',
'Teh Celup',
'Bakpi',
'Multivitamin',
'Kopi Kapal Api',
'White Kopi',
'Coklat',
'Perment',
'Galon',
'Sabun',
'Jam',
'Minyak Goreng',
'Tissue',
'Tissue Basah',
'Sandal',
'Payung',
'Handwash',
'Beras',
'Kaos',
'Sepatu',
'Obat Nyamuk'
];
foreach ($products as $prod) {
Product::create([
'code' => Str::upper(Str::random(6)),
'name' => $prod,
'price' => rand(1000,10000),
'cost' => rand(1000,10000),
'stock' => rand(1,99),
'price' => rand(1000, 10000),
'cost' => rand(1000, 10000),
'stock' => rand(1, 99),
'category_id' => $category->id,
]);
}

@ -52,6 +52,8 @@ class PermissionSeeder extends Seeder
['id' => Str::uuid(), 'label' => 'Delete Sale', 'name' => 'delete-sale'],
['id' => Str::uuid(), 'label' => 'View Setting', 'name' => 'view-setting'],
['id' => Str::uuid(), 'label' => 'View Invoice', 'name' => 'view-invoice'],
];
foreach ($permissions as $permission) {

466
package-lock.json generated

@ -73,30 +73,30 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.21.7",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz",
"integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==",
"version": "7.22.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz",
"integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.21.8",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz",
"integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==",
"version": "7.22.1",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz",
"integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.21.4",
"@babel/generator": "^7.21.5",
"@babel/helper-compilation-targets": "^7.21.5",
"@babel/helper-module-transforms": "^7.21.5",
"@babel/helpers": "^7.21.5",
"@babel/parser": "^7.21.8",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.21.5",
"@babel/types": "^7.21.5",
"@babel/generator": "^7.22.0",
"@babel/helper-compilation-targets": "^7.22.1",
"@babel/helper-module-transforms": "^7.22.1",
"@babel/helpers": "^7.22.0",
"@babel/parser": "^7.22.0",
"@babel/template": "^7.21.9",
"@babel/traverse": "^7.22.1",
"@babel/types": "^7.22.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@ -112,12 +112,12 @@
}
},
"node_modules/@babel/generator": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz",
"integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==",
"version": "7.22.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz",
"integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==",
"dev": true,
"dependencies": {
"@babel/types": "^7.21.5",
"@babel/types": "^7.22.3",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@ -127,12 +127,12 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz",
"integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==",
"version": "7.22.1",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz",
"integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.21.5",
"@babel/compat-data": "^7.22.0",
"@babel/helper-validator-option": "^7.21.0",
"browserslist": "^4.21.3",
"lru-cache": "^5.1.1",
@ -146,9 +146,9 @@
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz",
"integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==",
"version": "7.22.1",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz",
"integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@ -192,19 +192,19 @@
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz",
"integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==",
"version": "7.22.1",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz",
"integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.21.5",
"@babel/helper-environment-visitor": "^7.22.1",
"@babel/helper-module-imports": "^7.21.4",
"@babel/helper-simple-access": "^7.21.5",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.21.5",
"@babel/types": "^7.21.5"
"@babel/template": "^7.21.9",
"@babel/traverse": "^7.22.1",
"@babel/types": "^7.22.0"
},
"engines": {
"node": ">=6.9.0"
@ -271,14 +271,14 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz",
"integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==",
"version": "7.22.3",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz",
"integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==",
"dev": true,
"dependencies": {
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.21.5",
"@babel/types": "^7.21.5"
"@babel/template": "^7.21.9",
"@babel/traverse": "^7.22.1",
"@babel/types": "^7.22.3"
},
"engines": {
"node": ">=6.9.0"
@ -299,9 +299,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.21.8",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz",
"integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==",
"version": "7.22.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.3.tgz",
"integrity": "sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@ -341,9 +341,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz",
"integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==",
"version": "7.22.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz",
"integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==",
"dependencies": {
"regenerator-runtime": "^0.13.11"
},
@ -352,33 +352,33 @@
}
},
"node_modules/@babel/template": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
"integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"version": "7.21.9",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz",
"integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/code-frame": "^7.21.4",
"@babel/parser": "^7.21.9",
"@babel/types": "^7.21.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz",
"integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==",
"version": "7.22.1",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.1.tgz",
"integrity": "sha512-lAWkdCoUFnmwLBhIRLciFntGYsIIoC6vIbN8zrLPqBnJmPu7Z6nzqnKd7FsxQUNAvZfVZ0x6KdNvNp8zWIOHSQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.21.4",
"@babel/generator": "^7.21.5",
"@babel/helper-environment-visitor": "^7.21.5",
"@babel/generator": "^7.22.0",
"@babel/helper-environment-visitor": "^7.22.1",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.21.5",
"@babel/types": "^7.21.5",
"@babel/parser": "^7.22.0",
"@babel/types": "^7.22.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@ -387,9 +387,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz",
"integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==",
"version": "7.22.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.3.tgz",
"integrity": "sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==",
"dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.21.5",
@ -401,9 +401,9 @@
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz",
"integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
"integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
"cpu": [
"arm"
],
@ -417,9 +417,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz",
"integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
"integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
"cpu": [
"arm64"
],
@ -433,9 +433,9 @@
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz",
"integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
"integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
"cpu": [
"x64"
],
@ -449,9 +449,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz",
"integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
"integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
"cpu": [
"arm64"
],
@ -465,9 +465,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz",
"integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
"integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
"cpu": [
"x64"
],
@ -481,9 +481,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz",
"integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
"integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
"cpu": [
"arm64"
],
@ -497,9 +497,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz",
"integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
"integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
"cpu": [
"x64"
],
@ -513,9 +513,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz",
"integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
"integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
"cpu": [
"arm"
],
@ -529,9 +529,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz",
"integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
"integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
"cpu": [
"arm64"
],
@ -545,9 +545,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz",
"integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
"integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
"cpu": [
"ia32"
],
@ -561,9 +561,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz",
"integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
"integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
"cpu": [
"loong64"
],
@ -577,9 +577,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz",
"integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
"integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
"cpu": [
"mips64el"
],
@ -593,9 +593,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz",
"integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
"integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
"cpu": [
"ppc64"
],
@ -609,9 +609,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz",
"integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
"integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
"cpu": [
"riscv64"
],
@ -625,9 +625,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz",
"integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
"integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
"cpu": [
"s390x"
],
@ -641,9 +641,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz",
"integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
"integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
"cpu": [
"x64"
],
@ -657,9 +657,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz",
"integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
"integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
"cpu": [
"x64"
],
@ -673,9 +673,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz",
"integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
"integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
"cpu": [
"x64"
],
@ -689,9 +689,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz",
"integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
"integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
"cpu": [
"x64"
],
@ -705,9 +705,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz",
"integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
"integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
"cpu": [
"arm64"
],
@ -721,9 +721,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz",
"integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
"integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
"cpu": [
"ia32"
],
@ -737,9 +737,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz",
"integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
"integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
"cpu": [
"x64"
],
@ -758,9 +758,9 @@
"integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg=="
},
"node_modules/@floating-ui/dom": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.7.tgz",
"integrity": "sha512-DyqylONj1ZaBnzj+uBnVfzdjjCkFCL2aA9ESHLyUOGSqb03RpbLMImP1ekIQXYs4KLk9jAjJfZAU8hXfWSahEg==",
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz",
"integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==",
"dependencies": {
"@floating-ui/core": "^1.2.6"
}
@ -808,9 +808,9 @@
}
},
"node_modules/@inertiajs/core": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.6.tgz",
"integrity": "sha512-l1fna4c9h2Tw8EWRGrYd8XVOsNI9rNGKLiAnTfbW+tbcpCtsoBIDmp2OZpeMsBw8tuO7qJV+V01G11nsajrJdQ==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.7.tgz",
"integrity": "sha512-hb9XP+TVNdYoI3+3dx2Myp16w/WmqDCvTMl0o8SfFG6xSAJItihytrm0BJUNkV1PnId1qp0RUswOFZ8I8u3hzg==",
"dev": true,
"dependencies": {
"axios": "^1.2.0",
@ -820,12 +820,12 @@
}
},
"node_modules/@inertiajs/react": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.0.6.tgz",
"integrity": "sha512-R7pfb93VkbXoJtN4gBddQCH10BB9DNk7VqcOlEVS5pVjVPhAU5lPJteFFFq7/WYb1fiAVczuWg+HjYvLzmDGRA==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.0.7.tgz",
"integrity": "sha512-S5/cLJx1qDg/gTx0o0dcjpEdtO3YZuDGnqBy2eH5fnu8Eul1In067jGlaTBgTLt9DipzNruUaLVv52RoUcCNRA==",
"dev": true,
"dependencies": {
"@inertiajs/core": "1.0.6",
"@inertiajs/core": "1.0.7",
"lodash.isequal": "^4.5.0"
},
"peerDependencies": {
@ -918,9 +918,9 @@
}
},
"node_modules/@popperjs/core": {
"version": "2.11.7",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz",
"integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==",
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
@ -1096,9 +1096,9 @@
}
},
"node_modules/browserslist": {
"version": "4.21.5",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
"integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
"version": "4.21.7",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz",
"integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==",
"dev": true,
"funding": [
{
@ -1108,13 +1108,17 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001449",
"electron-to-chromium": "^1.4.284",
"node-releases": "^2.0.8",
"update-browserslist-db": "^1.0.10"
"caniuse-lite": "^1.0.30001489",
"electron-to-chromium": "^1.4.411",
"node-releases": "^2.0.12",
"update-browserslist-db": "^1.0.11"
},
"bin": {
"browserslist": "cli.js"
@ -1144,9 +1148,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001486",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz",
"integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==",
"version": "1.0.30001489",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz",
"integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==",
"dev": true,
"funding": [
{
@ -1405,9 +1409,9 @@
"integrity": "sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A=="
},
"node_modules/electron-to-chromium": {
"version": "1.4.390",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.390.tgz",
"integrity": "sha512-9h6KDGTynRfpM16U40uLSCxRO3diIKcXXI0mPChKls7sfkxOlCH1sgSJ14Rb00BFomQNHY/p67gaZSu5Mu8j6w==",
"version": "1.4.411",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.411.tgz",
"integrity": "sha512-5VXLW4Qw89vM2WTICHua/y8v7fKGDRVa2VPOtBB9IpLvW316B+xd8yD1wTmLPY2ot/00P/qt87xdolj4aG/Lzg==",
"dev": true
},
"node_modules/error-stack-parser": {
@ -1419,9 +1423,9 @@
}
},
"node_modules/esbuild": {
"version": "0.17.18",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz",
"integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==",
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
"integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
"dev": true,
"hasInstallScript": true,
"bin": {
@ -1431,28 +1435,28 @@
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/android-arm": "0.17.18",
"@esbuild/android-arm64": "0.17.18",
"@esbuild/android-x64": "0.17.18",
"@esbuild/darwin-arm64": "0.17.18",
"@esbuild/darwin-x64": "0.17.18",
"@esbuild/freebsd-arm64": "0.17.18",
"@esbuild/freebsd-x64": "0.17.18",
"@esbuild/linux-arm": "0.17.18",
"@esbuild/linux-arm64": "0.17.18",
"@esbuild/linux-ia32": "0.17.18",
"@esbuild/linux-loong64": "0.17.18",
"@esbuild/linux-mips64el": "0.17.18",
"@esbuild/linux-ppc64": "0.17.18",
"@esbuild/linux-riscv64": "0.17.18",
"@esbuild/linux-s390x": "0.17.18",
"@esbuild/linux-x64": "0.17.18",
"@esbuild/netbsd-x64": "0.17.18",
"@esbuild/openbsd-x64": "0.17.18",
"@esbuild/sunos-x64": "0.17.18",
"@esbuild/win32-arm64": "0.17.18",
"@esbuild/win32-ia32": "0.17.18",
"@esbuild/win32-x64": "0.17.18"
"@esbuild/android-arm": "0.17.19",
"@esbuild/android-arm64": "0.17.19",
"@esbuild/android-x64": "0.17.19",
"@esbuild/darwin-arm64": "0.17.19",
"@esbuild/darwin-x64": "0.17.19",
"@esbuild/freebsd-arm64": "0.17.19",
"@esbuild/freebsd-x64": "0.17.19",
"@esbuild/linux-arm": "0.17.19",
"@esbuild/linux-arm64": "0.17.19",
"@esbuild/linux-ia32": "0.17.19",
"@esbuild/linux-loong64": "0.17.19",
"@esbuild/linux-mips64el": "0.17.19",
"@esbuild/linux-ppc64": "0.17.19",
"@esbuild/linux-riscv64": "0.17.19",
"@esbuild/linux-s390x": "0.17.19",
"@esbuild/linux-x64": "0.17.19",
"@esbuild/netbsd-x64": "0.17.19",
"@esbuild/openbsd-x64": "0.17.19",
"@esbuild/sunos-x64": "0.17.19",
"@esbuild/win32-arm64": "0.17.19",
"@esbuild/win32-ia32": "0.17.19",
"@esbuild/win32-x64": "0.17.19"
}
},
"node_modules/escalade": {
@ -1644,12 +1648,13 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
"integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3"
},
"funding": {
@ -1715,6 +1720,17 @@
"node": ">=4"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@ -1774,9 +1790,9 @@
}
},
"node_modules/is-core-module": {
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz",
"integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==",
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
"integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
"dependencies": {
"has": "^1.0.3"
},
@ -1854,9 +1870,9 @@
}
},
"node_modules/laravel-vite-plugin": {
"version": "0.7.6",
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.6.tgz",
"integrity": "sha512-WJ1WRqR/ZDbJD+qEEPM+biG0ZPSub0n3DywEi21+YO1jZA8amMoJGu76HiAFM16eWz5cBcCeRM/gseVXfGV4Mw==",
"version": "0.7.8",
"resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz",
"integrity": "sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg==",
"dev": true,
"dependencies": {
"picocolors": "^1.0.0",
@ -2058,9 +2074,9 @@
}
},
"node_modules/node-releases": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
"integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
"version": "2.0.12",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
"integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
"dev": true
},
"node_modules/normalize-path": {
@ -2163,9 +2179,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
"integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==",
"version": "8.4.24",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz",
"integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
"funding": [
{
"type": "opencollective",
@ -2270,9 +2286,9 @@
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.12",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz",
"integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==",
"version": "6.0.13",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@ -2303,9 +2319,9 @@
"dev": true
},
"node_modules/qs": {
"version": "6.11.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz",
"integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
"version": "6.11.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
"integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
"dependencies": {
"side-channel": "^1.0.4"
},
@ -2356,9 +2372,9 @@
}
},
"node_modules/react-datepicker": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.11.0.tgz",
"integrity": "sha512-50n93o7mQwBEhg05tbopjFKgs8qgi8VBCAOMC4VqrKut72eAjESc/wXS/k5hRtnP0oe2FCGw7MJuIwh37wuXOw==",
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.12.0.tgz",
"integrity": "sha512-czCEp4T8ctyN9NBMG6Xq6pEpOvMtoqf4U5DxFzJoTtv1/gTX3QNJaWBUwD88j//+eF8gVkNvOW8aTAqpaIJBvw==",
"dependencies": {
"@popperjs/core": "^2.9.2",
"classnames": "^2.2.6",
@ -2385,14 +2401,14 @@
}
},
"node_modules/react-fast-compare": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz",
"integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg=="
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
},
"node_modules/react-icons": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz",
"integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==",
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.9.0.tgz",
"integrity": "sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==",
"peerDependencies": {
"react": "*"
}
@ -2421,9 +2437,9 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/react-number-format": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.1.4.tgz",
"integrity": "sha512-QV7QHzHrk9ZS9V0bWkIwu6ywiXJt0www4/cXWEVEgwaNqthmOZl/Cf5O0ukEPlGZJJr06Jh3+CM4rZsvXn8cOg==",
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.2.2.tgz",
"integrity": "sha512-wCh64Z1HCwXcO2dbgkeYIaB+Rmp/fcsH8kAeRtUkc46dv1pIrgDjie2WkOqKBw8YqyqhwNdYgNFNQuuY+iGJ/g==",
"dependencies": {
"prop-types": "^15.7.2"
},
@ -2469,9 +2485,9 @@
}
},
"node_modules/react-toastify": {
"version": "9.1.2",
"resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.2.tgz",
"integrity": "sha512-PBfzXO5jMGEtdYR5jxrORlNZZe/EuOkwvwKijMatsZZm8IZwLj01YvobeJYNjFcA6uy6CVrx2fzL9GWbhWPTDA==",
"version": "9.1.3",
"resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz",
"integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==",
"dependencies": {
"clsx": "^1.1.1"
},
@ -2569,9 +2585,9 @@
}
},
"node_modules/rollup": {
"version": "3.21.6",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz",
"integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==",
"version": "3.23.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz",
"integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==",
"dev": true,
"bin": {
"rollup": "dist/bin/rollup"
@ -2879,9 +2895,9 @@
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
},
"node_modules/tslib": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz",
"integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA=="
},
"node_modules/update-browserslist-db": {
"version": "1.0.11",
@ -2919,9 +2935,9 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/vite": {
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.3.5.tgz",
"integrity": "sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==",
"version": "4.3.9",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz",
"integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==",
"dev": true,
"dependencies": {
"esbuild": "^0.17.5",
@ -2999,9 +3015,9 @@
"dev": true
},
"node_modules/yaml": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
"integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
"integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
"engines": {
"node": ">= 14"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@ -1,7 +1,10 @@
import React from 'react';
import React from 'react'
export default function ApplicationLogo({ className }) {
return (
<h1 className={className}>POS</h1>
);
<h1 className={className}>
{' '}
Sistem Informasi Penjualan PT. Maju Jaya Kreasindo
</h1>
)
}

@ -1,6 +1,15 @@
import React from "react";
import React from 'react'
export default function TextArea({ label = '', value, name, onChange, rows, error, readOnly }) {
export default function TextArea({
label = '',
value,
name,
onChange,
rows,
error,
readOnly,
placeholder,
}) {
return (
<>
{label !== '' && (
@ -8,17 +17,24 @@ export default function TextArea({ label = '', value, name, onChange, rows, erro
{label}
</label>
)}
<textarea
<textarea
rows={rows}
className={`block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border dark:bg-gray-700 dark:placeholder-gray-400 dark:text-white mb-2 ${error ? "border-red-500 dark:border-red-500 focus:ring-red-500 focus:border-red-500 dark:focus:ring-red-500 dark:focus:border-red-500" : "border-gray-300 dark:border-gray-600 focus:ring-blue-500 focus:border-blue-500 dark:focus:ring-blue-500 dark:focus:border-blue-500"}`}
className={`block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border dark:bg-gray-700 dark:placeholder-gray-400 dark:text-white mb-2 ${
error
? 'border-red-500 dark:border-red-500 focus:ring-red-500 focus:border-red-500 dark:focus:ring-red-500 dark:focus:border-red-500'
: 'border-gray-300 dark:border-gray-600 focus:ring-blue-500 focus:border-blue-500 dark:focus:ring-blue-500 dark:focus:border-blue-500'
}`}
name={name}
value={value}
onChange={onChange}
readOnly={readOnly}
placeholder={placeholder}
/>
{error && (
<p className="mb-2 text-sm text-red-600 dark:text-red-500">{error}</p>
<p className="mb-2 text-sm text-red-600 dark:text-red-500">
{error}
</p>
)}
</>
)
}
}

@ -1,13 +1,14 @@
import React from 'react';
import ApplicationLogo from '@/Components/Defaults/ApplicationLogo';
import { Link } from '@inertiajs/react';
import React from 'react'
import logo from '@/Assets/logo.jpeg'
import ApplicationLogo from '@/Components/Defaults/ApplicationLogo'
import { Link } from '@inertiajs/react'
export default function Guest({ children }) {
return (
<div className="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100 dark:bg-gray-900">
<div>
<Link href="/">
<ApplicationLogo className="w-auto h-20 fill-current text-gray-500 text-5xl font-bold" />
<img src={logo} alt="app logo" className="w-48 h-48" />
</Link>
</div>
@ -15,5 +16,5 @@ export default function Guest({ children }) {
{children}
</div>
</div>
);
)
}

@ -1,13 +1,16 @@
import React from 'react';
import { router } from '@inertiajs/react';
import { Sidebar } from 'flowbite-react';
import { HiLogout } from 'react-icons/hi';
import { filterOpenMenu } from './helpers';
import routes from './routes';
import { formatDate } from '@/utils';
import React from 'react'
import { router, usePage } from '@inertiajs/react'
import { Sidebar } from 'flowbite-react'
import { HiLogout } from 'react-icons/hi'
import { filterOpenMenu } from './helpers'
import routes from './routes'
import { formatDate } from '@/utils'
export default function SidebarNav({ user }) {
const menus = routes.filter(item => {
const {
props: { app_name },
} = usePage()
const menus = routes.filter((item) => {
item.open = false
if (!item.show) {
return null
@ -15,7 +18,7 @@ export default function SidebarNav({ user }) {
if (+user.is_superadmin === 1) {
return filterOpenMenu(user, item)
}
if(user.role.permissions.find(p => p.name === item.permission)) {
if (user.role.permissions.find((p) => p.name === item.permission)) {
return item
}
@ -26,33 +29,36 @@ export default function SidebarNav({ user }) {
<Sidebar aria-label="Sidebar with multi-level dropdown example">
<Sidebar.Items>
<Sidebar.ItemGroup>
{menus.map(item => (
{menus.map((item) => (
<div key={item.name}>
{item.items === undefined ? (
<Sidebar.Item
onClick={() => router.visit(item.route)}
icon={item.icon}
active={route().current(item.active)}
>
{item.name}
</Sidebar.Item>
<Sidebar.Item
onClick={() => router.visit(item.route)}
icon={item.icon}
active={route().current(item.active)}
>
{item.name}
</Sidebar.Item>
) : (
<Sidebar.Collapse
icon={item.icon}
label={item.name}
open={item.open}
>
{item.items.map(item => (
<Sidebar.Item
{item.items.map((item) => (
<Sidebar.Item
key={item.name}
onClick={() => router.visit(item.route)}
onClick={() =>
router.visit(item.route)
}
icon={item.icon}
active={route().current(item.active)}
active={route().current(
item.active
)}
>
{item.name}
</Sidebar.Item>
))}
</Sidebar.Collapse>
)}
</div>
@ -64,10 +70,10 @@ export default function SidebarNav({ user }) {
Logout
</Sidebar.Item>
</Sidebar.ItemGroup>
<p className='text-sm font-light text-gray-900 dark:text-gray-100 text-center bottom-4 left-4 pt-10'>
App Name &copy; {(new Date()).getFullYear()}
<p className="text-sm font-light text-gray-900 dark:text-gray-100 text-center bottom-4 left-4 pt-10">
{app_name} &copy; {new Date().getFullYear()}
</p>
</Sidebar.Items>
</Sidebar>
)
}
}

@ -27,7 +27,7 @@ export default [
permission: 'view-sale',
},
{
name: 'Kategori',
name: 'Kategori Produk',
show: true,
icon: HiViewList,
route: route('category.index'),
@ -35,7 +35,7 @@ export default [
permission: 'view-category',
},
{
name: 'Barang',
name: 'Produk',
show: true,
icon: HiViewList,
route: route('product.index'),

@ -1,14 +1,15 @@
import React, { useEffect } from "react";
import Modal from "@/Components/Modal";
import { useForm } from "@inertiajs/react";
import Button from "@/Components/Button";
import FormInput from "@/Components/FormInput";
import React, { useEffect } from 'react'
import Modal from '@/Components/Modal'
import { useForm } from '@inertiajs/react'
import Button from '@/Components/Button'
import FormInput from '@/Components/FormInput'
export default function FormModal(props) {
const { modalState } = props
const { data, setData, post, put, processing, errors, reset, clearErrors } = useForm({
name: '',
})
const { data, setData, post, put, processing, errors, reset, clearErrors } =
useForm({
name: '',
})
const handleOnChange = (event) => {
setData(event.target.name, event.target.value)
@ -27,14 +28,14 @@ export default function FormModal(props) {
const handleSubmit = () => {
const category = modalState.data
if(category !== null) {
if (category !== null) {
put(route('category.update', category), {
onSuccess: () => handleClose()
onSuccess: () => handleClose(),
})
return
}
}
post(route('category.store'), {
onSuccess: () => handleClose()
onSuccess: () => handleClose(),
})
}
@ -44,7 +45,7 @@ export default function FormModal(props) {
setData({
name: category?.name,
})
return
return
}
}, [modalState])
@ -52,7 +53,7 @@ export default function FormModal(props) {
<Modal
isOpen={modalState.isOpen}
toggle={handleClose}
title={"Kategori"}
title={'Kategori Produk'}
>
<FormInput
name="name"
@ -62,19 +63,13 @@ export default function FormModal(props) {
error={errors.name}
/>
<div className="flex items-center">
<Button
onClick={handleSubmit}
processing={processing}
>
<Button onClick={handleSubmit} processing={processing}>
Simpan
</Button>
<Button
onClick={handleClose}
type="secondary"
>
<Button onClick={handleClose} type="secondary">
Batal
</Button>
</div>
</Modal>
)
}
}

@ -61,10 +61,10 @@ export default function Category(props) {
auth={props.auth}
errors={props.errors}
flash={props.flash}
page={'Kategori'}
page={'Kategori Produk'}
action={''}
>
<Head title="Kategori" />
<Head title="Kategori Produk" />
<div>
<div className="mx-auto sm:px-6 lg:px-8 ">

@ -36,10 +36,17 @@ export default function Dashboard(props) {
favorite_categories,
month,
total_sale_month,
targets,
} = props
const options = {
responsive: true,
scales: {
x: {},
x2: {
display: false,
},
},
}
const data = {
@ -50,21 +57,20 @@ export default function Dashboard(props) {
{
label: 'Penjualan',
data: sale_days.map((item) => item.stotal),
// backgroundColor: 'rgb(87, 13, 248, 0.5)', //rgb(87, 13, 248, 0.5) //rgba(255, 99, 132, 0.5)
backgroundColor: [
// 'rgba(201, 203, 207, 1)',
// 'rgba(255, 159, 64, 1)',
'rgba(255, 205, 86, 1)',
// 'rgba(75, 192, 192, 1)',
// 'rgba(54, 162, 235, 1)',
// 'rgba(153, 102, 255, 1)',
// 'rgba(255, 99, 132, 1)',
],
backgroundColor: ['rgba(255, 205, 86, 1)'],
},
{
label: 'Target',
data: targets,
backgroundColor: ['rgba(200, 30, 30, 1)'],
xAxisID: 'x2',
},
],
}
const names = favorite_categories.map((c) => `${c.product.name} - ${c.qty}`)
const names = favorite_categories.map(
(c) => `${c.product.category.name} - ${c.qty}`
)
const count = favorite_categories.map((c) => c.qty)
const dataDounat = {
labels: names,
@ -134,7 +140,7 @@ export default function Dashboard(props) {
<Head title="Dashboard" />
<div>
<div className="mx-auto sm:px-6 lg:px-8 ">
<div className="mx-auto sm:px-6 lg:px-8">
<div className="px-2 w-full grid grid-cols-2 md:grid-cols-4 gap-2">
<div className="p-4 overflow-hidden shadow sm:rounded-lg bg-white">
<div className="text-xl">
@ -182,9 +188,10 @@ export default function Dashboard(props) {
className="max-h-96"
/>
</div>
<div className="overflow-auto bg-white p-4">
<div className="overflow-auto bg-white p-4 max-w-sm">
<div className="text-xl pb-4">
Produk Paling laku terjual
Kategori Produk yang laku Terjual pada Bulan{' '}
{month}
</div>
<Doughnut
data={dataDounat}
@ -194,7 +201,7 @@ export default function Dashboard(props) {
</div>
{/* list produk paling laris dengan jumlah penjualan */}
<div className="overflow-auto bg-white p-4 mt-4">
<div className="text-xl pb-4">Barang Terlaris</div>
<div className="text-xl pb-4">Produk Terlaris</div>
<div>
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 mb-4">
<thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
@ -203,7 +210,7 @@ export default function Dashboard(props) {
Kode
</th>
<th scope="col" className="py-3 px-6">
Barang
Produk
</th>
<th scope="col" className="py-3 px-6">
Jumlah

@ -1,24 +1,32 @@
import React, { useEffect } from "react";
import Modal from "@/Components/Modal";
import { useForm } from "@inertiajs/react";
import Button from "@/Components/Button";
import FormInput from "@/Components/FormInput";
import { isEmpty } from "lodash";
import CategorySelectionInput from '../Category/SelectionInput';
import React, { useEffect } from 'react'
import Modal from '@/Components/Modal'
import { useForm } from '@inertiajs/react'
import Button from '@/Components/Button'
import FormInput from '@/Components/FormInput'
import { isEmpty } from 'lodash'
import CategorySelectionInput from '../Category/SelectionInput'
export default function FormModal(props) {
const { modalState } = props
const { data, setData, post, put, processing, errors, reset, clearErrors } = useForm({
name: '',
price: 0,
cost: 0,
stock: 0,
category_id: null,
})
const { data, setData, post, put, processing, errors, reset, clearErrors } =
useForm({
name: '',
price: 0,
cost: 0,
stock: 0,
category_id: null,
})
const handleOnChange = (event) => {
setData(event.target.name, event.target.type === 'checkbox' ? (event.target.checked ? 1 : 0) : event.target.value);
setData(
event.target.name,
event.target.type === 'checkbox'
? event.target.checked
? 1
: 0
: event.target.value
)
}
const handleReset = () => {
@ -34,14 +42,14 @@ export default function FormModal(props) {
const handleSubmit = () => {
const product = modalState.data
if(product !== null) {
if (product !== null) {
put(route('product.update', product), {
onSuccess: () => handleClose(),
})
return
}
}
post(route('product.store'), {
onSuccess: () => handleClose()
onSuccess: () => handleClose(),
})
}
@ -55,16 +63,12 @@ export default function FormModal(props) {
stock: product.stock,
category_id: product.category_id,
})
return
return
}
}, [modalState])
return (
<Modal
isOpen={modalState.isOpen}
toggle={handleClose}
title={"Barang"}
>
<Modal isOpen={modalState.isOpen} toggle={handleClose} title={'Produk'}>
<FormInput
name="name"
value={data.name}
@ -103,19 +107,13 @@ export default function FormModal(props) {
error={errors.category_id}
/>
<div className="flex items-center">
<Button
onClick={handleSubmit}
processing={processing}
>
<Button onClick={handleSubmit} processing={processing}>
Simpan
</Button>
<Button
onClick={handleClose}
type="secondary"
>
<Button onClick={handleClose} type="secondary">
Batal
</Button>
</div>
</Modal>
)
}
}

@ -1,21 +1,24 @@
import React, { useEffect, useState } from 'react';
import { router } from '@inertiajs/react';
import { usePrevious } from 'react-use';
import { Head } from '@inertiajs/react';
import { Button, Dropdown } from 'flowbite-react';
import { HiPencil, HiTrash } from 'react-icons/hi';
import { useModalState } from '@/hooks';
import React, { useEffect, useState } from 'react'
import { router } from '@inertiajs/react'
import { usePrevious } from 'react-use'
import { Head } from '@inertiajs/react'
import { Button, Dropdown } from 'flowbite-react'
import { HiPencil, HiTrash } from 'react-icons/hi'
import { useModalState } from '@/hooks'
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import Pagination from '@/Components/Pagination';
import ModalConfirm from '@/Components/ModalConfirm';
import FormModal from './FormModal';
import SearchInput from '@/Components/SearchInput';
import { formatIDR, hasPermission } from '@/utils';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout'
import Pagination from '@/Components/Pagination'
import ModalConfirm from '@/Components/ModalConfirm'
import FormModal from './FormModal'
import SearchInput from '@/Components/SearchInput'
import { formatIDR, hasPermission } from '@/utils'
export default function Product(props) {
const { query: { links, data }, auth } = props
const {
query: { links, data },
auth,
} = props
const [search, setSearch] = useState('')
const preValue = usePrevious(search)
@ -33,7 +36,7 @@ export default function Product(props) {
}
const onDelete = () => {
if(confirmModal.data !== null) {
if (confirmModal.data !== null) {
router.delete(route('product.destroy', confirmModal.data.id))
}
}
@ -61,55 +64,87 @@ export default function Product(props) {
auth={props.auth}
errors={props.errors}
flash={props.flash}
page={'Barang'}
page={'Produk'}
action={''}
>
<Head title="Barang" />
<Head title="Produk" />
<div>
<div className="mx-auto sm:px-6 lg:px-8 ">
<div className="p-6 overflow-hidden shadow-sm sm:rounded-lg bg-gray-200 dark:bg-gray-800 space-y-4">
<div className='flex justify-between'>
<div className="flex justify-between">
{canCreate && (
<Button size="sm" onClick={() => toggleFormModal()}>Tambah</Button>
<Button
size="sm"
onClick={() => toggleFormModal()}
>
Tambah
</Button>
)}
<div className="flex items-center">
<SearchInput
onChange={e => setSearch(e.target.value)}
onChange={(e) => setSearch(e.target.value)}
value={search}
/>
</div>
</div>
<div className='overflow-auto'>
<div className="overflow-auto">
<div>
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 mb-4">
<thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Kode
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Nama
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Kategori
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Harga Jual
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Harga Beli
</th>
<th scope="col" className="py-3 px-6">
<th
scope="col"
className="py-3 px-6"
>
Stok
</th>
<th scope="col" className="py-3 px-6"/>
<th
scope="col"
className="py-3 px-6"
/>
</tr>
</thead>
<tbody>
{data.map(product => (
<tr className="bg-white border-b dark:bg-gray-800 dark:border-gray-700" key={product.id}>
<td scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
{data.map((product) => (
<tr
className="bg-white border-b dark:bg-gray-800 dark:border-gray-700"
key={product.id}
>
<td
scope="row"
className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white"
>
{product.code}
</td>
<td className="py-4 px-6">
@ -129,25 +164,41 @@ export default function Product(props) {
</td>
<td className="py-4 px-6 flex justify-end">
<Dropdown
label={"Opsi"}
label={'Opsi'}
floatingArrow={true}
arrowIcon={true}
dismissOnClick={true}
size={'sm'}
>
{canUpdate && (
<Dropdown.Item onClick={() => toggleFormModal(product)}>
<div className='flex space-x-1 items-center'>
<HiPencil/>
<div>Ubah</div>
<Dropdown.Item
onClick={() =>
toggleFormModal(
product
)
}
>
<div className="flex space-x-1 items-center">
<HiPencil />
<div>
Ubah
</div>
</div>
</Dropdown.Item>
)}
{canDelete && (
<Dropdown.Item onClick={() => handleDeleteClick(product)}>
<div className='flex space-x-1 items-center'>
<HiTrash/>
<div>Hapus</div>
<Dropdown.Item
onClick={() =>
handleDeleteClick(
product
)
}
>
<div className="flex space-x-1 items-center">
<HiTrash />
<div>
Hapus
</div>
</div>
</Dropdown.Item>
)}
@ -158,20 +209,15 @@ export default function Product(props) {
</tbody>
</table>
</div>
<div className='w-full flex items-center justify-center'>
<Pagination links={links} params={params}/>
<div className="w-full flex items-center justify-center">
<Pagination links={links} params={params} />
</div>
</div>
</div>
</div>
</div>
<ModalConfirm
modalState={confirmModal}
onConfirm={onDelete}
/>
<FormModal
modalState={formModal}
/>
<ModalConfirm modalState={confirmModal} onConfirm={onDelete} />
<FormModal modalState={formModal} />
</AuthenticatedLayout>
);
}
)
}

@ -12,6 +12,7 @@ import Pagination from '@/Components/Pagination'
import FormInput from '@/Components/FormInput'
import CustomerSelectionInput from '../Customer/SelectionInput'
import { Spinner } from 'flowbite-react'
import TextArea from '@/Components/TextArea'
export default function Sale(props) {
const {
@ -27,6 +28,7 @@ export default function Sale(props) {
date: dateToString(new Date()),
customer_id: null,
items: [],
note: '',
})
const addItem = (product) => {
@ -69,13 +71,13 @@ export default function Sale(props) {
post(route('sale.store'))
}
const params = { q: search, page: _page }
const params = { q: search }
useEffect(() => {
if (preValue) {
setLoading(true)
router.get(
route(route().current()),
{ q: search, page: _page },
{ q: search },
{
replace: true,
preserveState: true,
@ -116,7 +118,7 @@ export default function Sale(props) {
<Spinner size="xl" />
</div>
) : (
<div className="grid grid-cols-4 gap-2 text-center">
<div className="grid grid-cols-4 gap-2 text-center h-[320px]">
{products.map((item) => (
<div
className="rounded bg-gray-300 hover:bg-gray-200 shadow-lg px-4 py-2 flex flex-col justify-between"
@ -138,6 +140,16 @@ export default function Sale(props) {
<Pagination links={links} params={params} />
</div>
</div>
<div className="w-full mt-4">
<TextArea
value={data.note}
onChange={(e) =>
setData('note', e.target.value)
}
rows={4}
placeholder="Catatan"
/>
</div>
</div>
<div className="w-full md:w-5/12 flex flex-col">
<CustomerSelectionInput
@ -205,6 +217,16 @@ export default function Sale(props) {
</Button>
</div>
</div>
<div className="flex flex-row p-6 shadow-sm sm:rounded-lg bg-white w-full space-x-2 mt-2 invisible">
<div className="w-full">
<TextArea
value={data.note}
onChange={(e) => setData('note', e.target.value)}
rows={4}
label="Catatan"
/>
</div>
</div>
</div>
</AuthenticatedLayout>
)

@ -72,6 +72,7 @@ export default function Sale(props) {
const canCreate = hasPermission(auth, 'create-sale')
const canUpdate = hasPermission(auth, 'update-sale')
const canDelete = hasPermission(auth, 'delete-sale')
const canViewInvoice = hasPermission(auth, 'view-invoice')
return (
<AuthenticatedLayout
@ -177,16 +178,18 @@ export default function Sale(props) {
{formatIDR(sale.total)}
</td>
<td>
<a
href={route(
'sale.invoice',
sale
)}
target="_blank"
className="text-blue-600 underline"
>
Invoice
</a>
{canViewInvoice && (
<a
href={route(
'sale.invoice',
sale
)}
target="_blank"
className="text-blue-600 underline"
>
Invoice
</a>
)}
</td>
<td className="py-4 px-6 flex justify-end">
<Dropdown

@ -4,10 +4,11 @@ import FormInput from '@/Components/FormInput'
import Button from '@/Components/Button'
import { Head, useForm } from '@inertiajs/react'
import TextArea from '@/Components/TextArea'
import { isEmpty } from 'lodash'
const extractValue = (set, key) => {
const find = set.find((s) => s.key === key)
if (find !== null) {
if (isEmpty(find) === false) {
if (find.type === 'image') {
return find?.url
}
@ -22,6 +23,7 @@ export default function Setting(props) {
const { data, setData, post, processing, errors } = useForm({
name: extractValue(setting, 'name'),
detail: extractValue(setting, 'detail'),
target: extractValue(setting, 'target'),
})
const handleOnChange = (event) => {
@ -68,6 +70,14 @@ export default function Setting(props) {
rows={8}
error={errors.detail}
/>
<FormInput
type="number"
name="target"
value={data.target}
onChange={handleOnChange}
label="Target Bulanan"
error={errors.target}
/>
<div className="mt-2">
<Button
onClick={handleSubmit}

@ -74,7 +74,7 @@
</div>
<div class="w-1/2">
<div class="invisible">KETERANGAN</div>
<table class="border-2 border-black w-full h-[132px]">
<table class="border-2 border-black w-full h-[132px] invisible">
<tbody>
<tr>
<td class="p-1"></td>
@ -152,11 +152,11 @@
<tr>
<td class="p-2 font-bold">PESAN</td>
</tr>
<tr class="border-b border-black">
<td class="p-4"></td>
<tr>
<td class="px-2 pb-2">{{ $sale->note }}</td>
</tr>
<tr>
<td class="p-2">TERBILANG</td>
<td class="p-2"></td>
</tr>
<tr>
<td class="p-4"></td>

Loading…
Cancel
Save