diff --git a/app/Http/Controllers/WarehouseManagement/ProductCategoriesController.php b/app/Http/Controllers/WarehouseManagement/ProductCategoriesController.php
new file mode 100644
index 0000000..221e5c0
--- /dev/null
+++ b/app/Http/Controllers/WarehouseManagement/ProductCategoriesController.php
@@ -0,0 +1,124 @@
+first();
+ if($request->ajax()){
+ $data = ProductCategory::query();
+ return DataTables::of($data)
+ ->addIndexColumn()
+ ->addColumn('action', function ($row) use ($menu) {
+ $btn = '';
+
+ if (Auth::user()->can('delete', $menu)) {
+ $btn .= '';
+ }
+
+ if (Auth::user()->can('update', $menu)) {
+ $btn .= '';
+ }
+
+ return $btn;
+ })
+ ->rawColumns(['action'])
+ ->make(true);
+ }
+ return view('warehouse_management.product_categories.index');
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(Request $request)
+ {
+ $validated = $request->validate([
+ 'name' => 'required|string|max:255',
+ ]);
+ ProductCategory::create($validated);
+ return response()->json(['success' => true, 'message' => 'Kategori berhasil ditambahkan.']);
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function show($id)
+ {
+ //
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function edit($id)
+ {
+ $category = ProductCategory::findOrFail($id);
+ return response()->json($category);
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request, $id)
+ {
+ $validated = $request->validate([
+ 'name' => 'required|string|max:255',
+ ]);
+
+ $category = ProductCategory::findOrFail($id);
+ $category->update($validated);
+
+ return response()->json(['success' => true, 'message' => 'Kategori berhasil diperbarui.']);
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy($id)
+ {
+ ProductCategory::findOrFail($id)->delete();
+ return response()->json(['success' => true, 'message' => 'Kategorii berhasil dihapus.']);
+ }
+}
diff --git a/app/Http/Controllers/WarehouseManagement/ProductsController.php b/app/Http/Controllers/WarehouseManagement/ProductsController.php
new file mode 100644
index 0000000..1766b4f
--- /dev/null
+++ b/app/Http/Controllers/WarehouseManagement/ProductsController.php
@@ -0,0 +1,120 @@
+first();
+ if($request->ajax()){
+ $data = Product::with(['category','dealers']);
+ return DataTables::of($data)
+ ->addIndexColumn()
+ ->addColumn('category_name', function ($row) {
+ return $row->category ? $row->category->name : '-';
+ })
+ ->addColumn('total_stock', function ($row){
+ return $row->dealers->sum(function($dealer){
+ return $dealer->pivot->quantity ?? 0;
+ });
+ })
+ ->addColumn('action', function ($row) use ($menu) {
+ $btn = '';
+
+ if (Auth::user()->can('delete', $menu)) {
+ $btn .= '';
+ }
+
+ if (Auth::user()->can('update', $menu)) {
+ $btn .= '';
+ }
+
+ return $btn;
+ })
+ ->rawColumns(['action'])
+ ->make(true);
+ }
+ return view('warehouse_management.products.index');
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(Request $request)
+ {
+ //
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function show($id)
+ {
+ //
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function edit($id)
+ {
+ //
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request, $id)
+ {
+ //
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy($id)
+ {
+ //
+ }
+}
diff --git a/app/Models/Dealer.php b/app/Models/Dealer.php
index f97b0e0..9e985d5 100644
--- a/app/Models/Dealer.php
+++ b/app/Models/Dealer.php
@@ -22,4 +22,10 @@ class Dealer extends Model
{
return $this->hasMany(Transaction::class, 'dealer_id', 'id');
}
+
+ public function products(){
+ return $this->belongsToMany(Product::class, 'stock')
+ ->withPivot('quantity')
+ ->withTimestamps();
+ }
}
diff --git a/app/Models/Product.php b/app/Models/Product.php
new file mode 100644
index 0000000..eb7392f
--- /dev/null
+++ b/app/Models/Product.php
@@ -0,0 +1,24 @@
+belongsTo(ProductCategory::class, 'product_category_id');
+ }
+
+ public function dealers(){
+ return $this->belongsToMany(Dealer::class, 'stock')
+ ->withPivot('quantity')
+ ->withTimestamps();
+ }
+}
diff --git a/app/Models/ProductCategory.php b/app/Models/ProductCategory.php
new file mode 100644
index 0000000..4d271ea
--- /dev/null
+++ b/app/Models/ProductCategory.php
@@ -0,0 +1,18 @@
+hasMany(Product::class, 'product_category_id');
+ }
+}
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 3f9906b..2a9c4d4 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -3,6 +3,7 @@
namespace App\Providers;
use App\Models\Menu;
+use Carbon\Carbon;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
@@ -25,7 +26,8 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
- View::composer(['layouts.partials.sidebarMenu', 'dashboard', 'dealer_recap', 'back.*'], function ($view) {
+ Carbon::setLocale('id');
+ View::composer(['layouts.partials.sidebarMenu', 'dashboard', 'dealer_recap', 'back.*', 'warehouse_management.*'], function ($view) {
$menuQuery = Menu::all();
$menus = [];
foreach($menuQuery as $menu) {
diff --git a/composer.json b/composer.json
index cefcec1..fc6546d 100644
--- a/composer.json
+++ b/composer.json
@@ -14,6 +14,7 @@
"laravel/tinker": "^2.5",
"laravel/ui": "^3.4",
"maatwebsite/excel": "^3.1",
+ "nesbot/carbon": "^2.73",
"yajra/laravel-datatables-oracle": "^9.20"
},
"require-dev": {
diff --git a/composer.lock b/composer.lock
index 1b92a5e..e0ec070 100644
--- a/composer.lock
+++ b/composer.lock
@@ -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": "f96a1847e52c9eb29681f0fb8fea48c2",
+ "content-hash": "3e3b47389d4bce664f705134cae65b49",
"packages": [
{
"name": "asm89/stack-cors",
@@ -122,6 +122,75 @@
],
"time": "2021-08-15T20:50:18+00:00"
},
+ {
+ "name": "carbonphp/carbon-doctrine-types",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
+ "reference": "3c430083d0b41ceed84ecccf9dac613241d7305d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/3c430083d0b41ceed84ecccf9dac613241d7305d",
+ "reference": "3c430083d0b41ceed84ecccf9dac613241d7305d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.8 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/dbal": ">=3.7.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": ">=2.0.0",
+ "nesbot/carbon": "^2.71.0 || ^3.0.0",
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KyleKatarn",
+ "email": "kylekatarnls@gmail.com"
+ }
+ ],
+ "description": "Types to use Carbon in Doctrine",
+ "keywords": [
+ "carbon",
+ "date",
+ "datetime",
+ "doctrine",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/1.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-01T12:35:29+00:00"
+ },
{
"name": "dflydev/dot-access-data",
"version": "v3.0.1",
@@ -2537,35 +2606,41 @@
},
{
"name": "nesbot/carbon",
- "version": "2.58.0",
+ "version": "2.73.0",
"source": {
"type": "git",
- "url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055"
+ "url": "https://github.com/CarbonPHP/carbon.git",
+ "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/97a34af22bde8d0ac20ab34b29d7bfe360902055",
- "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075",
+ "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075",
"shasum": ""
},
"require": {
+ "carbonphp/carbon-doctrine-types": "*",
"ext-json": "*",
"php": "^7.1.8 || ^8.0",
+ "psr/clock": "^1.0",
"symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
},
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
"require-dev": {
- "doctrine/dbal": "^2.0 || ^3.0",
- "doctrine/orm": "^2.7",
+ "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0",
+ "doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
+ "ondrejmirtes/better-reflection": "<6",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^0.12.54 || ^1.0",
- "phpunit/php-file-iterator": "^2.0.5",
- "phpunit/phpunit": "^7.5.20 || ^8.5.23",
+ "phpstan/phpstan": "^0.12.99 || ^1.7.14",
+ "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
"squizlabs/php_codesniffer": "^3.4"
},
"bin": [
@@ -2573,10 +2648,6 @@
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-3.x": "3.x-dev",
- "dev-master": "2.x-dev"
- },
"laravel": {
"providers": [
"Carbon\\Laravel\\ServiceProvider"
@@ -2586,6 +2657,10 @@
"includes": [
"extension.neon"
]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
}
},
"autoload": {
@@ -2622,15 +2697,19 @@
},
"funding": [
{
- "url": "https://opencollective.com/Carbon",
- "type": "open_collective"
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
},
{
- "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
"type": "tidelift"
}
],
- "time": "2022-04-25T19:31:17+00:00"
+ "time": "2025-01-08T20:10:23+00:00"
},
{
"name": "nette/schema",
@@ -3124,6 +3203,54 @@
},
"time": "2016-08-06T20:24:11+00:00"
},
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
+ },
{
"name": "psr/container",
"version": "1.1.2",
@@ -8917,12 +9044,12 @@
],
"aliases": [],
"minimum-stability": "dev",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^7.3|^8.0"
},
- "platform-dev": [],
- "plugin-api-version": "2.1.0"
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
}
diff --git a/database/migrations/2025_05_28_113228_create_product_categories_table.php b/database/migrations/2025_05_28_113228_create_product_categories_table.php
new file mode 100644
index 0000000..b1af6fb
--- /dev/null
+++ b/database/migrations/2025_05_28_113228_create_product_categories_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->string('name');
+ $table->softDeletes();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('product_categories');
+ }
+}
diff --git a/database/migrations/2025_05_28_113324_create_products_table.php b/database/migrations/2025_05_28_113324_create_products_table.php
new file mode 100644
index 0000000..5f48680
--- /dev/null
+++ b/database/migrations/2025_05_28_113324_create_products_table.php
@@ -0,0 +1,36 @@
+id();
+ $table->string('code')->unique();
+ $table->string('name');
+ $table->text('description')->nullable();
+ $table->foreignId('product_category_id')->constrained()->onDelete('cascade');
+ $table->softDeletes();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('products');
+ }
+}
diff --git a/database/migrations/2025_05_28_175140_create_stock_table.php b/database/migrations/2025_05_28_175140_create_stock_table.php
new file mode 100644
index 0000000..fca5bd7
--- /dev/null
+++ b/database/migrations/2025_05_28_175140_create_stock_table.php
@@ -0,0 +1,36 @@
+id();
+ $table->foreignId('product_id')->constrained()->onDelete('cascade');
+ $table->foreignId('dealer_id')->constrained()->onDelete('cascade');
+ $table->integer('quantity')->default(0);
+ $table->timestamps();
+
+ $table->unique(['product_id','dealer_id']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('stock');
+ }
+}
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index 57b73b5..39ad4be 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -14,5 +14,10 @@ class DatabaseSeeder extends Seeder
public function run()
{
// \App\Models\User::factory(10)->create();
+ $this->call([
+ MenuSeeder::class,
+ ProductAndCategorySeeder::class,
+ UserRoleAndPrivilegesSeeder::class
+ ]);
}
}
diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php
new file mode 100644
index 0000000..8c67eaf
--- /dev/null
+++ b/database/seeders/MenuSeeder.php
@@ -0,0 +1,39 @@
+ 'Produk',
+ 'link' => 'products.index'
+ ],
+ [
+ 'name' => 'Kategori Produk',
+ 'link' => 'product_categories.index'
+ ]
+ ];
+
+ foreach ($menus as $menu){
+ Menu::updateOrInsert(
+ ['link' => $menu['link']],
+ [
+ 'name' => $menu['name'],
+ 'created_at' => now(),
+ 'updated_at' => now()
+ ]
+ );
+ }
+ }
+}
diff --git a/database/seeders/ProductAndCategorySeeder.php b/database/seeders/ProductAndCategorySeeder.php
new file mode 100644
index 0000000..b6b5ab9
--- /dev/null
+++ b/database/seeders/ProductAndCategorySeeder.php
@@ -0,0 +1,52 @@
+ [
+ ['code' => 'OLI001', 'name' => 'Oli Mesin 10W-40'],
+ ['code' => 'OLI002', 'name' => 'Oli Gardan'],
+ ],
+ 'Aki & Kelistrikan' => [
+ ['code' => 'AKI001', 'name' => 'Aki Kering 12V'],
+ ['code' => 'AKI002', 'name' => 'Regulator Rectifier'],
+ ],
+ 'Rem' => [
+ ['code' => 'REM001', 'name' => 'Kampas Rem Belakang'],
+ ['code' => 'REM002', 'name' => 'Cakram Depan'],
+ ],
+ ];
+
+
+ foreach ($categories as $categoryName => $products) {
+ $category = ProductCategory::firstOrCreate(
+ ['name' => $categoryName],
+ ['created_at' => now(), 'updated_at' => now()]
+ );
+
+ foreach ($products as $product) {
+ Product::updateOrCreate(
+ ['code' => $product['code']],
+ [
+ 'name' => $product['name'],
+ 'description' => $product['name'],
+ 'product_category_id' => $category->id
+ ]
+ );
+ }
+ }
+ }
+}
diff --git a/database/seeders/UserRoleAndPrivilegesSeeder.php b/database/seeders/UserRoleAndPrivilegesSeeder.php
new file mode 100644
index 0000000..22e8da6
--- /dev/null
+++ b/database/seeders/UserRoleAndPrivilegesSeeder.php
@@ -0,0 +1,37 @@
+ 'admin']);
+
+ $menus = Menu::all();
+ foreach ($menus as $menu) {
+ Privilege::updateOrCreate(
+ [
+ 'role_id' => $role->id,
+ 'menu_id' => $menu->id
+ ],
+ [
+ 'create' => 1,
+ 'update' => 1,
+ 'delete' => 1,
+ 'view' => 1
+ ]
+ );
+ }
+ }
+}
diff --git a/public/js/index.js b/public/js/index.js
new file mode 100644
index 0000000..f66c527
--- /dev/null
+++ b/public/js/index.js
@@ -0,0 +1,32 @@
+/*
+ * ATTENTION: An "eval-source-map" devtool has been used.
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./resources/js/warehouse_management/product_categories/index.js":
+/*!***********************************************************************!*\
+ !*** ./resources/js/warehouse_management/product_categories/index.js ***!
+ \***********************************************************************/
+/***/ (() => {
+
+eval("$(function () {\n $('#product-categories-table').DataTable({\n processing: true,\n serverSide: true,\n ajax: '{{ route(\"product_categories.index\") }}',\n columns: [{\n data: 'DT_RowIndex',\n name: 'DT_RowIndex',\n orderable: false,\n searchable: false\n }, {\n data: 'name',\n name: 'name'\n }, {\n data: 'created_at',\n name: 'created_at'\n }, {\n data: 'action',\n name: 'action',\n orderable: false,\n searchable: false\n }]\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdF9jYXRlZ29yaWVzL2luZGV4LmpzLmpzIiwibmFtZXMiOlsiJCIsIkRhdGFUYWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsImNvbHVtbnMiLCJkYXRhIiwibmFtZSIsIm9yZGVyYWJsZSIsInNlYXJjaGFibGUiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9wcm9kdWN0X2NhdGVnb3JpZXMvaW5kZXguanM/ZmM4NCJdLCJzb3VyY2VzQ29udGVudCI6WyIkKGZ1bmN0aW9uICgpIHtcbiAgJCgnI3Byb2R1Y3QtY2F0ZWdvcmllcy10YWJsZScpLkRhdGFUYWJsZSh7XG4gICAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgICAgc2VydmVyU2lkZTogdHJ1ZSxcbiAgICAgIGFqYXg6ICd7eyByb3V0ZShcInByb2R1Y3RfY2F0ZWdvcmllcy5pbmRleFwiKSB9fScsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgeyBkYXRhOiAnRFRfUm93SW5kZXgnLCBuYW1lOiAnRFRfUm93SW5kZXgnLCBvcmRlcmFibGU6IGZhbHNlLCBzZWFyY2hhYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgZGF0YTogJ25hbWUnLCBuYW1lOiAnbmFtZScgfSxcbiAgICAgICAgICB7IGRhdGE6ICdjcmVhdGVkX2F0JywgbmFtZTogJ2NyZWF0ZWRfYXQnIH0sXG4gICAgICAgICAgeyBkYXRhOiAnYWN0aW9uJywgbmFtZTogJ2FjdGlvbicsIG9yZGVyYWJsZTogZmFsc2UsIHNlYXJjaGFibGU6IGZhbHNlIH1cbiAgICAgIF1cbiAgfSk7XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBQSxDQUFDLENBQUMsWUFBWTtFQUNaQSxDQUFDLENBQUMsMkJBQUQsQ0FBRCxDQUErQkMsU0FBL0IsQ0FBeUM7SUFDckNDLFVBQVUsRUFBRSxJQUR5QjtJQUVyQ0MsVUFBVSxFQUFFLElBRnlCO0lBR3JDQyxJQUFJLEVBQUUseUNBSCtCO0lBSXJDQyxPQUFPLEVBQUUsQ0FDTDtNQUFFQyxJQUFJLEVBQUUsYUFBUjtNQUF1QkMsSUFBSSxFQUFFLGFBQTdCO01BQTRDQyxTQUFTLEVBQUUsS0FBdkQ7TUFBOERDLFVBQVUsRUFBRTtJQUExRSxDQURLLEVBRUw7TUFBRUgsSUFBSSxFQUFFLE1BQVI7TUFBZ0JDLElBQUksRUFBRTtJQUF0QixDQUZLLEVBR0w7TUFBRUQsSUFBSSxFQUFFLFlBQVI7TUFBc0JDLElBQUksRUFBRTtJQUE1QixDQUhLLEVBSUw7TUFBRUQsSUFBSSxFQUFFLFFBQVI7TUFBa0JDLElBQUksRUFBRSxRQUF4QjtNQUFrQ0MsU0FBUyxFQUFFLEtBQTdDO01BQW9EQyxVQUFVLEVBQUU7SUFBaEUsQ0FKSztFQUo0QixDQUF6QztBQVdELENBWkEsQ0FBRCJ9\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/product_categories/index.js\n");
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/
+/******/ // startup
+/******/ // Load entry module and return exports
+/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
+/******/ var __webpack_exports__ = {};
+/******/ __webpack_modules__["./resources/js/warehouse_management/product_categories/index.js"]();
+/******/
+/******/ })()
+;
\ No newline at end of file
diff --git a/public/js/warehouse_management/product_categories/index.js b/public/js/warehouse_management/product_categories/index.js
new file mode 100644
index 0000000..55359c2
--- /dev/null
+++ b/public/js/warehouse_management/product_categories/index.js
@@ -0,0 +1,32 @@
+/*
+ * ATTENTION: An "eval-source-map" devtool has been used.
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./resources/js/warehouse_management/product_categories/index.js":
+/*!***********************************************************************!*\
+ !*** ./resources/js/warehouse_management/product_categories/index.js ***!
+ \***********************************************************************/
+/***/ (() => {
+
+eval("function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n$.ajaxSetup({\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\")\n }\n});\nvar tableContainer = $(\"#product-categories-table\");\nvar url = tableContainer.data(\"url\");\nvar table = $(\"#product-categories-table\").DataTable({\n processing: true,\n serverSide: true,\n ajax: url,\n columns: [{\n data: \"DT_RowIndex\",\n name: \"DT_RowIndex\",\n orderable: false,\n searchable: false\n }, {\n data: \"name\",\n name: \"name\"\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }]\n});\n$(document).ready(function () {\n $(\"#addProductCategory\").click(function () {\n $(\"#productCategoryForm\")[0].reset();\n $(\"#category_id\").val(\"\");\n $(\"#modalTitle\").text(\"Tambah Kategori\");\n $(\"#productCategoryModal\").modal(\"show\");\n }); // Submit form (baik tambah maupun edit)\n\n $(\"#productCategoryForm\").submit(function (e) {\n e.preventDefault();\n var id = $(\"#category_id\").val();\n var url = id ? \"/warehouse/product_categories/\".concat(id) : \"/warehouse/product_categories\";\n var method = id ? \"PUT\" : \"POST\";\n $.ajax({\n url: url,\n method: method,\n data: _objectSpread({\n name: $(\"#name\").val(),\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n }, id && {\n _method: \"PUT\"\n }),\n success: function success() {\n $(\"#productCategoryModal\").modal(\"hide\");\n $(\"#product-categories-table\").DataTable().ajax.reload();\n },\n error: function error(xhr) {\n alert(\"Gagal menyimpan data\");\n console.error(xhr.responseText);\n }\n });\n });\n});\n$(document).on(\"click\", \".btn-edit-product-category\", function () {\n var id = $(this).data(\"id\");\n var url = $(this).data(\"url\");\n $.ajax({\n url: url,\n method: \"GET\",\n success: function success(response) {\n $(\"#category_id\").val(response.id);\n $(\"#name\").val(response.name);\n $(\"#modalTitle\").text(\"Edit Kategori\");\n $(\"#productCategoryModal\").modal(\"show\");\n },\n error: function error(xhr) {\n alert(\"Gagal mengambil data\");\n console.error(xhr.responseText);\n }\n });\n});\n$(document).on(\"click\", \".btn-destroy-product-category\", function () {\n var _this = this;\n\n Swal.fire({\n title: \"Hapus nama kategori?\",\n text: \"Anda tidak akan bisa mengembalikannya!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Hapus\"\n }).then(function (result) {\n if (result.value) {\n var _url = $(_this).data(\"action\");\n\n $.ajax({\n url: _url,\n method: \"POST\",\n data: {\n _method: \"DELETE\",\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success() {\n alert(\"Kategori berhasil dihapus.\");\n $(\"#product-categories-table\").DataTable().ajax.reload();\n },\n error: function error(xhr) {\n alert(\"Gagal menghapus kategori.\");\n console.error(xhr.responseText);\n }\n });\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdF9jYXRlZ29yaWVzL2luZGV4LmpzLmpzIiwibmFtZXMiOlsiJCIsImFqYXhTZXR1cCIsImhlYWRlcnMiLCJhdHRyIiwidGFibGVDb250YWluZXIiLCJ1cmwiLCJkYXRhIiwidGFibGUiLCJEYXRhVGFibGUiLCJwcm9jZXNzaW5nIiwic2VydmVyU2lkZSIsImFqYXgiLCJjb2x1bW5zIiwibmFtZSIsIm9yZGVyYWJsZSIsInNlYXJjaGFibGUiLCJkb2N1bWVudCIsInJlYWR5IiwiY2xpY2siLCJyZXNldCIsInZhbCIsInRleHQiLCJtb2RhbCIsInN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImlkIiwibWV0aG9kIiwiX3Rva2VuIiwiX21ldGhvZCIsInN1Y2Nlc3MiLCJyZWxvYWQiLCJlcnJvciIsInhociIsImFsZXJ0IiwiY29uc29sZSIsInJlc3BvbnNlVGV4dCIsIm9uIiwicmVzcG9uc2UiLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwic2hvd0NhbmNlbEJ1dHRvbiIsImNvbmZpcm1CdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvbkNvbG9yIiwiY29uZmlybUJ1dHRvblRleHQiLCJ0aGVuIiwicmVzdWx0IiwidmFsdWUiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93YXJlaG91c2VfbWFuYWdlbWVudC9wcm9kdWN0X2NhdGVnb3JpZXMvaW5kZXguanM/ZmM4NCJdLCJzb3VyY2VzQ29udGVudCI6WyIkLmFqYXhTZXR1cCh7XG4gICAgaGVhZGVyczoge1xuICAgICAgICBcIlgtQ1NSRi1UT0tFTlwiOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcImNvbnRlbnRcIiksXG4gICAgfSxcbn0pO1xubGV0IHRhYmxlQ29udGFpbmVyID0gJChcIiNwcm9kdWN0LWNhdGVnb3JpZXMtdGFibGVcIik7XG5sZXQgdXJsID0gdGFibGVDb250YWluZXIuZGF0YShcInVybFwiKTtcbmxldCB0YWJsZSA9ICQoXCIjcHJvZHVjdC1jYXRlZ29yaWVzLXRhYmxlXCIpLkRhdGFUYWJsZSh7XG4gICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICBzZXJ2ZXJTaWRlOiB0cnVlLFxuICAgIGFqYXg6IHVybCxcbiAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGE6IFwiRFRfUm93SW5kZXhcIixcbiAgICAgICAgICAgIG5hbWU6IFwiRFRfUm93SW5kZXhcIixcbiAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBkYXRhOiBcIm5hbWVcIiwgbmFtZTogXCJuYW1lXCIgfSxcbiAgICAgICAgeyBkYXRhOiBcImFjdGlvblwiLCBuYW1lOiBcImFjdGlvblwiLCBvcmRlcmFibGU6IGZhbHNlLCBzZWFyY2hhYmxlOiBmYWxzZSB9LFxuICAgIF0sXG59KTtcblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICQoXCIjYWRkUHJvZHVjdENhdGVnb3J5XCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJChcIiNwcm9kdWN0Q2F0ZWdvcnlGb3JtXCIpWzBdLnJlc2V0KCk7XG4gICAgICAgICQoXCIjY2F0ZWdvcnlfaWRcIikudmFsKFwiXCIpO1xuICAgICAgICAkKFwiI21vZGFsVGl0bGVcIikudGV4dChcIlRhbWJhaCBLYXRlZ29yaVwiKTtcbiAgICAgICAgJChcIiNwcm9kdWN0Q2F0ZWdvcnlNb2RhbFwiKS5tb2RhbChcInNob3dcIik7XG4gICAgfSk7XG5cbiAgICAvLyBTdWJtaXQgZm9ybSAoYmFpayB0YW1iYWggbWF1cHVuIGVkaXQpXG4gICAgJChcIiNwcm9kdWN0Q2F0ZWdvcnlGb3JtXCIpLnN1Ym1pdChmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgbGV0IGlkID0gJChcIiNjYXRlZ29yeV9pZFwiKS52YWwoKTtcbiAgICAgICAgbGV0IHVybCA9IGlkXG4gICAgICAgICAgICA/IGAvd2FyZWhvdXNlL3Byb2R1Y3RfY2F0ZWdvcmllcy8ke2lkfWBcbiAgICAgICAgICAgIDogYC93YXJlaG91c2UvcHJvZHVjdF9jYXRlZ29yaWVzYDtcbiAgICAgICAgbGV0IG1ldGhvZCA9IGlkID8gXCJQVVRcIiA6IFwiUE9TVFwiO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIG5hbWU6ICQoXCIjbmFtZVwiKS52YWwoKSxcbiAgICAgICAgICAgICAgICBfdG9rZW46ICQoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5hdHRyKFwiY29udGVudFwiKSxcbiAgICAgICAgICAgICAgICAuLi4oaWQgJiYgeyBfbWV0aG9kOiBcIlBVVFwiIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKFwiI3Byb2R1Y3RDYXRlZ29yeU1vZGFsXCIpLm1vZGFsKFwiaGlkZVwiKTtcbiAgICAgICAgICAgICAgICAkKFwiI3Byb2R1Y3QtY2F0ZWdvcmllcy10YWJsZVwiKS5EYXRhVGFibGUoKS5hamF4LnJlbG9hZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoXCJHYWdhbCBtZW55aW1wYW4gZGF0YVwiKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuYnRuLWVkaXQtcHJvZHVjdC1jYXRlZ29yeVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaWQgPSAkKHRoaXMpLmRhdGEoXCJpZFwiKTtcbiAgICBjb25zdCB1cmwgPSAkKHRoaXMpLmRhdGEoXCJ1cmxcIik7XG4gICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAkKFwiI2NhdGVnb3J5X2lkXCIpLnZhbChyZXNwb25zZS5pZCk7XG4gICAgICAgICAgICAkKFwiI25hbWVcIikudmFsKHJlc3BvbnNlLm5hbWUpO1xuICAgICAgICAgICAgJChcIiNtb2RhbFRpdGxlXCIpLnRleHQoXCJFZGl0IEthdGVnb3JpXCIpO1xuICAgICAgICAgICAgJChcIiNwcm9kdWN0Q2F0ZWdvcnlNb2RhbFwiKS5tb2RhbChcInNob3dcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyKSB7XG4gICAgICAgICAgICBhbGVydChcIkdhZ2FsIG1lbmdhbWJpbCBkYXRhXCIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn0pO1xuXG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1kZXN0cm95LXByb2R1Y3QtY2F0ZWdvcnlcIiwgZnVuY3Rpb24gKCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIkhhcHVzIG5hbWEga2F0ZWdvcmk/XCIsXG4gICAgICAgIHRleHQ6IFwiQW5kYSB0aWRhayBha2FuIGJpc2EgbWVuZ2VtYmFsaWthbm55YSFcIixcbiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiNkMzNcIixcbiAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2RlZGVkZVwiLFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJIYXB1c1wiLFxuICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSAkKHRoaXMpLmRhdGEoXCJhY3Rpb25cIik7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBfbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgICAgICAgICBfdG9rZW46ICQoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5hdHRyKFwiY29udGVudFwiKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJLYXRlZ29yaSBiZXJoYXNpbCBkaWhhcHVzLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0LWNhdGVnb3JpZXMtdGFibGVcIikuRGF0YVRhYmxlKCkuYWpheC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiR2FnYWwgbWVuZ2hhcHVzIGthdGVnb3JpLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQUEsQ0FBQyxDQUFDQyxTQUFGLENBQVk7RUFDUkMsT0FBTyxFQUFFO0lBQ0wsZ0JBQWdCRixDQUFDLENBQUMseUJB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\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/product_categories/index.js\n");
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/
+/******/ // startup
+/******/ // Load entry module and return exports
+/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
+/******/ var __webpack_exports__ = {};
+/******/ __webpack_modules__["./resources/js/warehouse_management/product_categories/index.js"]();
+/******/
+/******/ })()
+;
\ No newline at end of file
diff --git a/public/js/warehouse_management/products/index.js b/public/js/warehouse_management/products/index.js
new file mode 100644
index 0000000..bb95efa
--- /dev/null
+++ b/public/js/warehouse_management/products/index.js
@@ -0,0 +1,32 @@
+/*
+ * ATTENTION: An "eval-source-map" devtool has been used.
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./resources/js/warehouse_management/products/index.js":
+/*!*************************************************************!*\
+ !*** ./resources/js/warehouse_management/products/index.js ***!
+ \*************************************************************/
+/***/ (() => {
+
+eval("function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n$.ajaxSetup({\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\")\n }\n});\nvar tableContainer = $(\"#products-table\");\nvar url = tableContainer.data(\"url\");\nvar table = $(\"#products-table\").DataTable({\n processing: true,\n serverSide: true,\n ajax: url,\n columns: [{\n data: \"DT_RowIndex\",\n name: \"DT_RowIndex\",\n orderable: false,\n searchable: false\n }, {\n data: \"code\",\n name: \"code\"\n }, {\n data: \"name\",\n name: \"name\"\n }, {\n data: \"category_name\",\n name: \"category.name\"\n }, {\n data: \"total_stock\",\n name: \"total_stock\"\n }, {\n data: \"action\",\n name: \"action\",\n orderable: false,\n searchable: false\n }]\n});\n$(document).ready(function () {\n $(\"#addProductCategory\").click(function () {\n $(\"#productCategoryForm\")[0].reset();\n $(\"#category_id\").val(\"\");\n $(\"#modalTitle\").text(\"Tambah Kategori\");\n $(\"#productCategoryModal\").modal(\"show\");\n }); // Submit form (baik tambah maupun edit)\n\n $(\"#productCategoryForm\").submit(function (e) {\n e.preventDefault();\n var id = $(\"#category_id\").val();\n var url = id ? \"/warehouse/product_categories/\".concat(id) : \"/warehouse/product_categories\";\n var method = id ? \"PUT\" : \"POST\";\n $.ajax({\n url: url,\n method: method,\n data: _objectSpread({\n name: $(\"#name\").val(),\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n }, id && {\n _method: \"PUT\"\n }),\n success: function success() {\n $(\"#productCategoryModal\").modal(\"hide\");\n $(\"#product-categories-table\").DataTable().ajax.reload();\n },\n error: function error(xhr) {\n alert(\"Gagal menyimpan data\");\n console.error(xhr.responseText);\n }\n });\n });\n});\n$(document).on(\"click\", \".btn-edit-product-category\", function () {\n var id = $(this).data(\"id\");\n var url = $(this).data(\"url\");\n $.ajax({\n url: url,\n method: \"GET\",\n success: function success(response) {\n $(\"#category_id\").val(response.id);\n $(\"#name\").val(response.name);\n $(\"#modalTitle\").text(\"Edit Kategori\");\n $(\"#productCategoryModal\").modal(\"show\");\n },\n error: function error(xhr) {\n alert(\"Gagal mengambil data\");\n console.error(xhr.responseText);\n }\n });\n});\n$(document).on(\"click\", \".btn-destroy-product-category\", function () {\n var _this = this;\n\n Swal.fire({\n title: \"Hapus nama kategori?\",\n text: \"Anda tidak akan bisa mengembalikannya!\",\n showCancelButton: true,\n confirmButtonColor: \"#d33\",\n cancelButtonColor: \"#dedede\",\n confirmButtonText: \"Hapus\"\n }).then(function (result) {\n if (result.value) {\n var _url = $(_this).data(\"action\");\n\n $.ajax({\n url: _url,\n method: \"POST\",\n data: {\n _method: \"DELETE\",\n _token: $('meta[name=\"csrf-token\"]').attr(\"content\")\n },\n success: function success() {\n alert(\"Kategori berhasil dihapus.\");\n $(\"#product-categories-table\").DataTable().ajax.reload();\n },\n error: function error(xhr) {\n alert(\"Gagal menghapus kategori.\");\n console.error(xhr.responseText);\n }\n });\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2FyZWhvdXNlX21hbmFnZW1lbnQvcHJvZHVjdHMvaW5kZXguanMuanMiLCJuYW1lcyI6WyIkIiwiYWpheFNldHVwIiwiaGVhZGVycyIsImF0dHIiLCJ0YWJsZUNvbnRhaW5lciIsInVybCIsImRhdGEiLCJ0YWJsZSIsIkRhdGFUYWJsZSIsInByb2Nlc3NpbmciLCJzZXJ2ZXJTaWRlIiwiYWpheCIsImNvbHVtbnMiLCJuYW1lIiwib3JkZXJhYmxlIiwic2VhcmNoYWJsZSIsImRvY3VtZW50IiwicmVhZHkiLCJjbGljayIsInJlc2V0IiwidmFsIiwidGV4dCIsIm1vZGFsIiwic3VibWl0IiwiZSIsInByZXZlbnREZWZhdWx0IiwiaWQiLCJtZXRob2QiLCJfdG9rZW4iLCJfbWV0aG9kIiwic3VjY2VzcyIsInJlbG9hZCIsImVycm9yIiwieGhyIiwiYWxlcnQiLCJjb25zb2xlIiwicmVzcG9uc2VUZXh0Iiwib24iLCJyZXNwb25zZSIsIlN3YWwiLCJmaXJlIiwidGl0bGUiLCJzaG93Q2FuY2VsQnV0dG9uIiwiY29uZmlybUJ1dHRvbkNvbG9yIiwiY2FuY2VsQnV0dG9uQ29sb3IiLCJjb25maXJtQnV0dG9uVGV4dCIsInRoZW4iLCJyZXN1bHQiLCJ2YWx1ZSJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3dhcmVob3VzZV9tYW5hZ2VtZW50L3Byb2R1Y3RzL2luZGV4LmpzP2ZjZDYiXSwic291cmNlc0NvbnRlbnQiOlsiJC5hamF4U2V0dXAoe1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJYLUNTUkYtVE9LRU5cIjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXCJjb250ZW50XCIpLFxuICAgIH0sXG59KTtcbmxldCB0YWJsZUNvbnRhaW5lciA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIik7XG5sZXQgdXJsID0gdGFibGVDb250YWluZXIuZGF0YShcInVybFwiKTtcbmxldCB0YWJsZSA9ICQoXCIjcHJvZHVjdHMtdGFibGVcIikuRGF0YVRhYmxlKHtcbiAgICBwcm9jZXNzaW5nOiB0cnVlLFxuICAgIHNlcnZlclNpZGU6IHRydWUsXG4gICAgYWpheDogdXJsLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YTogXCJEVF9Sb3dJbmRleFwiLFxuICAgICAgICAgICAgbmFtZTogXCJEVF9Sb3dJbmRleFwiLFxuICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7IGRhdGE6IFwiY29kZVwiLCBuYW1lOiBcImNvZGVcIiB9LFxuICAgICAgICB7IGRhdGE6IFwibmFtZVwiLCBuYW1lOiBcIm5hbWVcIiB9LFxuICAgICAgICB7IGRhdGE6IFwiY2F0ZWdvcnlfbmFtZVwiLCBuYW1lOiBcImNhdGVnb3J5Lm5hbWVcIiB9LFxuICAgICAgICB7IGRhdGE6IFwidG90YWxfc3RvY2tcIiwgbmFtZTogXCJ0b3RhbF9zdG9ja1wiIH0sXG4gICAgICAgIHsgZGF0YTogXCJhY3Rpb25cIiwgbmFtZTogXCJhY3Rpb25cIiwgb3JkZXJhYmxlOiBmYWxzZSwgc2VhcmNoYWJsZTogZmFsc2UgfSxcbiAgICBdLFxufSk7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAkKFwiI2FkZFByb2R1Y3RDYXRlZ29yeVwiKS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoXCIjcHJvZHVjdENhdGVnb3J5Rm9ybVwiKVswXS5yZXNldCgpO1xuICAgICAgICAkKFwiI2NhdGVnb3J5X2lkXCIpLnZhbChcIlwiKTtcbiAgICAgICAgJChcIiNtb2RhbFRpdGxlXCIpLnRleHQoXCJUYW1iYWggS2F0ZWdvcmlcIik7XG4gICAgICAgICQoXCIjcHJvZHVjdENhdGVnb3J5TW9kYWxcIikubW9kYWwoXCJzaG93XCIpO1xuICAgIH0pO1xuXG4gICAgLy8gU3VibWl0IGZvcm0gKGJhaWsgdGFtYmFoIG1hdXB1biBlZGl0KVxuICAgICQoXCIjcHJvZHVjdENhdGVnb3J5Rm9ybVwiKS5zdWJtaXQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGxldCBpZCA9ICQoXCIjY2F0ZWdvcnlfaWRcIikudmFsKCk7XG4gICAgICAgIGxldCB1cmwgPSBpZFxuICAgICAgICAgICAgPyBgL3dhcmVob3VzZS9wcm9kdWN0X2NhdGVnb3JpZXMvJHtpZH1gXG4gICAgICAgICAgICA6IGAvd2FyZWhvdXNlL3Byb2R1Y3RfY2F0ZWdvcmllc2A7XG4gICAgICAgIGxldCBtZXRob2QgPSBpZCA/IFwiUFVUXCIgOiBcIlBPU1RcIjtcblxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAkKFwiI25hbWVcIikudmFsKCksXG4gICAgICAgICAgICAgICAgX3Rva2VuOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcImNvbnRlbnRcIiksXG4gICAgICAgICAgICAgICAgLi4uKGlkICYmIHsgX21ldGhvZDogXCJQVVRcIiB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0Q2F0ZWdvcnlNb2RhbFwiKS5tb2RhbChcImhpZGVcIik7XG4gICAgICAgICAgICAgICAgJChcIiNwcm9kdWN0LWNhdGVnb3JpZXMtdGFibGVcIikuRGF0YVRhYmxlKCkuYWpheC5yZWxvYWQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhocikge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiR2FnYWwgbWVueWltcGFuIGRhdGFcIik7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4kKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmJ0bi1lZGl0LXByb2R1Y3QtY2F0ZWdvcnlcIiwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlkID0gJCh0aGlzKS5kYXRhKFwiaWRcIik7XG4gICAgY29uc3QgdXJsID0gJCh0aGlzKS5kYXRhKFwidXJsXCIpO1xuICAgICQuYWpheCh7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgJChcIiNjYXRlZ29yeV9pZFwiKS52YWwocmVzcG9uc2UuaWQpO1xuICAgICAgICAgICAgJChcIiNuYW1lXCIpLnZhbChyZXNwb25zZS5uYW1lKTtcbiAgICAgICAgICAgICQoXCIjbW9kYWxUaXRsZVwiKS50ZXh0KFwiRWRpdCBLYXRlZ29yaVwiKTtcbiAgICAgICAgICAgICQoXCIjcHJvZHVjdENhdGVnb3J5TW9kYWxcIikubW9kYWwoXCJzaG93XCIpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhocikge1xuICAgICAgICAgICAgYWxlcnQoXCJHYWdhbCBtZW5nYW1iaWwgZGF0YVwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59KTtcblxuJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5idG4tZGVzdHJveS1wcm9kdWN0LWNhdGVnb3J5XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBTd2FsLmZpcmUoe1xuICAgICAgICB0aXRsZTogXCJIYXB1cyBuYW1hIGthdGVnb3JpP1wiLFxuICAgICAgICB0ZXh0OiBcIkFuZGEgdGlkYWsgYWthbiBiaXNhIG1lbmdlbWJhbGlrYW5ueWEhXCIsXG4gICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjZDMzXCIsXG4gICAgICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiBcIiNkZWRlZGVcIixcbiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiSGFwdXNcIixcbiAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gJCh0aGlzKS5kYXRhKFwiYWN0aW9uXCIpO1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgX21ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgICAgICAgICAgICAgX3Rva2VuOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcImNvbnRlbnRcIiksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiS2F0ZWdvcmkgYmVyaGFzaWwgZGloYXB1cy5cIik7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjcHJvZHVjdC1jYXRlZ29yaWVzLXRhYmxlXCIpLkRhdGFUYWJsZSgpLmFqYXgucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHhocikge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIkdhZ2FsIG1lbmdoYXB1cyBrYXRlZ29yaS5cIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAg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\n//# sourceURL=webpack-internal:///./resources/js/warehouse_management/products/index.js\n");
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/
+/******/ // startup
+/******/ // Load entry module and return exports
+/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
+/******/ var __webpack_exports__ = {};
+/******/ __webpack_modules__["./resources/js/warehouse_management/products/index.js"]();
+/******/
+/******/ })()
+;
\ No newline at end of file
diff --git a/public/mix-manifest.json b/public/mix-manifest.json
index 2d60117..8f1a7ab 100644
--- a/public/mix-manifest.json
+++ b/public/mix-manifest.json
@@ -1,4 +1,6 @@
{
"/js/app.js": "/js/app.js",
+ "/js/warehouse_management/product_categories/index.js": "/js/warehouse_management/product_categories/index.js",
+ "/js/warehouse_management/products/index.js": "/js/warehouse_management/products/index.js",
"/css/app.css": "/css/app.css"
}
diff --git a/resources/js/warehouse_management/product_categories/index.js b/resources/js/warehouse_management/product_categories/index.js
new file mode 100644
index 0000000..2a5b455
--- /dev/null
+++ b/resources/js/warehouse_management/product_categories/index.js
@@ -0,0 +1,109 @@
+$.ajaxSetup({
+ headers: {
+ "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"),
+ },
+});
+let tableContainer = $("#product-categories-table");
+let url = tableContainer.data("url");
+let table = $("#product-categories-table").DataTable({
+ processing: true,
+ serverSide: true,
+ ajax: url,
+ columns: [
+ {
+ data: "DT_RowIndex",
+ name: "DT_RowIndex",
+ orderable: false,
+ searchable: false,
+ },
+ { data: "name", name: "name" },
+ { data: "action", name: "action", orderable: false, searchable: false },
+ ],
+});
+
+$(document).ready(function () {
+ $("#addProductCategory").click(function () {
+ $("#productCategoryForm")[0].reset();
+ $("#category_id").val("");
+ $("#modalTitle").text("Tambah Kategori");
+ $("#productCategoryModal").modal("show");
+ });
+
+ // Submit form (baik tambah maupun edit)
+ $("#productCategoryForm").submit(function (e) {
+ e.preventDefault();
+
+ let id = $("#category_id").val();
+ let url = id
+ ? `/warehouse/product_categories/${id}`
+ : `/warehouse/product_categories`;
+ let method = id ? "PUT" : "POST";
+
+ $.ajax({
+ url: url,
+ method: method,
+ data: {
+ name: $("#name").val(),
+ _token: $('meta[name="csrf-token"]').attr("content"),
+ ...(id && { _method: "PUT" }),
+ },
+ success: function () {
+ $("#productCategoryModal").modal("hide");
+ $("#product-categories-table").DataTable().ajax.reload();
+ },
+ error: function (xhr) {
+ alert("Gagal menyimpan data");
+ console.error(xhr.responseText);
+ },
+ });
+ });
+});
+$(document).on("click", ".btn-edit-product-category", function () {
+ const id = $(this).data("id");
+ const url = $(this).data("url");
+ $.ajax({
+ url: url,
+ method: "GET",
+ success: function (response) {
+ $("#category_id").val(response.id);
+ $("#name").val(response.name);
+ $("#modalTitle").text("Edit Kategori");
+ $("#productCategoryModal").modal("show");
+ },
+ error: function (xhr) {
+ alert("Gagal mengambil data");
+ console.error(xhr.responseText);
+ },
+ });
+});
+
+$(document).on("click", ".btn-destroy-product-category", function () {
+ Swal.fire({
+ title: "Hapus nama kategori?",
+ text: "Anda tidak akan bisa mengembalikannya!",
+ showCancelButton: true,
+ confirmButtonColor: "#d33",
+ cancelButtonColor: "#dedede",
+ confirmButtonText: "Hapus",
+ }).then((result) => {
+ if (result.value) {
+ const url = $(this).data("action");
+ $.ajax({
+ url: url,
+ method: "POST",
+ data: {
+ _method: "DELETE",
+ _token: $('meta[name="csrf-token"]').attr("content"),
+ },
+ success: function () {
+ alert("Kategori berhasil dihapus.");
+ $("#product-categories-table").DataTable().ajax.reload();
+ },
+ error: function (xhr) {
+ alert("Gagal menghapus kategori.");
+ console.error(xhr.responseText);
+ },
+ });
+ }
+ });
+});
diff --git a/resources/js/warehouse_management/products/index.js b/resources/js/warehouse_management/products/index.js
new file mode 100644
index 0000000..f36ac28
--- /dev/null
+++ b/resources/js/warehouse_management/products/index.js
@@ -0,0 +1,112 @@
+$.ajaxSetup({
+ headers: {
+ "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"),
+ },
+});
+let tableContainer = $("#products-table");
+let url = tableContainer.data("url");
+let table = $("#products-table").DataTable({
+ processing: true,
+ serverSide: true,
+ ajax: url,
+ columns: [
+ {
+ data: "DT_RowIndex",
+ name: "DT_RowIndex",
+ orderable: false,
+ searchable: false,
+ },
+ { data: "code", name: "code" },
+ { data: "name", name: "name" },
+ { data: "category_name", name: "category.name" },
+ { data: "total_stock", name: "total_stock" },
+ { data: "action", name: "action", orderable: false, searchable: false },
+ ],
+});
+
+$(document).ready(function () {
+ $("#addProductCategory").click(function () {
+ $("#productCategoryForm")[0].reset();
+ $("#category_id").val("");
+ $("#modalTitle").text("Tambah Kategori");
+ $("#productCategoryModal").modal("show");
+ });
+
+ // Submit form (baik tambah maupun edit)
+ $("#productCategoryForm").submit(function (e) {
+ e.preventDefault();
+
+ let id = $("#category_id").val();
+ let url = id
+ ? `/warehouse/product_categories/${id}`
+ : `/warehouse/product_categories`;
+ let method = id ? "PUT" : "POST";
+
+ $.ajax({
+ url: url,
+ method: method,
+ data: {
+ name: $("#name").val(),
+ _token: $('meta[name="csrf-token"]').attr("content"),
+ ...(id && { _method: "PUT" }),
+ },
+ success: function () {
+ $("#productCategoryModal").modal("hide");
+ $("#product-categories-table").DataTable().ajax.reload();
+ },
+ error: function (xhr) {
+ alert("Gagal menyimpan data");
+ console.error(xhr.responseText);
+ },
+ });
+ });
+});
+$(document).on("click", ".btn-edit-product-category", function () {
+ const id = $(this).data("id");
+ const url = $(this).data("url");
+ $.ajax({
+ url: url,
+ method: "GET",
+ success: function (response) {
+ $("#category_id").val(response.id);
+ $("#name").val(response.name);
+ $("#modalTitle").text("Edit Kategori");
+ $("#productCategoryModal").modal("show");
+ },
+ error: function (xhr) {
+ alert("Gagal mengambil data");
+ console.error(xhr.responseText);
+ },
+ });
+});
+
+$(document).on("click", ".btn-destroy-product-category", function () {
+ Swal.fire({
+ title: "Hapus nama kategori?",
+ text: "Anda tidak akan bisa mengembalikannya!",
+ showCancelButton: true,
+ confirmButtonColor: "#d33",
+ cancelButtonColor: "#dedede",
+ confirmButtonText: "Hapus",
+ }).then((result) => {
+ if (result.value) {
+ const url = $(this).data("action");
+ $.ajax({
+ url: url,
+ method: "POST",
+ data: {
+ _method: "DELETE",
+ _token: $('meta[name="csrf-token"]').attr("content"),
+ },
+ success: function () {
+ alert("Kategori berhasil dihapus.");
+ $("#product-categories-table").DataTable().ajax.reload();
+ },
+ error: function (xhr) {
+ alert("Gagal menghapus kategori.");
+ console.error(xhr.responseText);
+ },
+ });
+ }
+ });
+});
diff --git a/resources/views/layouts/backapp.blade.php b/resources/views/layouts/backapp.blade.php
index cf534b1..76968c4 100644
--- a/resources/views/layouts/backapp.blade.php
+++ b/resources/views/layouts/backapp.blade.php
@@ -114,7 +114,7 @@ License: You must have a valid license purchased only from themeforest(the above
-
+
@yield('javascripts')