Muhammad Iqbal Afandi пре 3 година
родитељ
комит
b4b565b799

+ 36
- 26
app/Http/Controllers/MemberController.php Прегледај датотеку

@@ -7,6 +7,8 @@ use App\Http\Requests\Member\UpdateMemberRequest;
7 7
 use App\Models\Member;
8 8
 use App\Models\TypeMember;
9 9
 use App\Models\TypeVehicle;
10
+use Illuminate\Database\QueryException;
11
+use Illuminate\Support\Facades\DB;
10 12
 use Inertia\Inertia;
11 13
 
12 14
 class MemberController extends Controller
@@ -29,9 +31,10 @@ class MemberController extends Controller
29 31
                     'updatedAt' => $member->updated_at,
30 32
                     'name' => $member->name,
31 33
                     'phone' => $member->phone,
32
-                    'platNumber' => $member->plat_number,
34
+                    'platNumber' => $member->vehicleDetail(),
33 35
                     'type' => $member->typeMember->type,
34 36
                     'price' => $member->typeMember->price,
37
+                    'expDate' => $member->exp_date,
35 38
                 ]),
36 39
         ]);
37 40
     }
@@ -71,29 +74,42 @@ class MemberController extends Controller
71 74
      */
72 75
     public function store(StoreMemberRequest $request)
73 76
     {
74
-        dd(request());
77
+        DB::beginTransaction();
75 78
 
76
-        $member = Member::create([
77
-            'name' => $request->name,
78
-            'phone' => $request->phone,
79
-            'exp_date' => now()->addDays(30),
80
-            'type_member_id' => $request->type_member_id,
81
-        ]);
79
+        try {
80
+            $member = Member::create([
81
+                'name' => $request->name,
82
+                'phone' => $request->phone,
83
+                'exp_date' => now()->addDays(30),
84
+                'type_member_id' => $request->type_member_id,
85
+            ]);
82 86
 
83
-        $member->topUps()->create([
84
-            'amount' => TypeMember::find($request->type_member_id)->getRawOriginal('price'),
85
-            'exp_date' => now()->addDays(30),
86
-            'user_id' => auth()->user()->id,
87
-        ]);
87
+            foreach ($request->vehicles as $vehicle) {
88
+                $member->vehicles()->create([
89
+                    'plat_number' => $vehicle['platNumber'],
90
+                    'type_vehicle_id' => $vehicle['typeVehicleId'],
91
+                ]);
92
+            }
88 93
 
89
-        foreach ($request->vehicles as $vehicle) {
90
-            $member->vehicles()->create([
91
-                'plat_number' => $vehicle['platNumber'],
92
-                'type_vehicle_id' => $vehicle['typeVehicleId'],
94
+            $topUp = $member->topUps()->create([
95
+                'amount' => TypeMember::find($request->type_member_id)->getRawOriginal('price'),
96
+                'exp_date' => now()->addDays(30),
97
+                'user_id' => auth()->user()->id,
93 98
             ]);
94
-        }
95 99
 
96
-        return back()->with('success', __('messages.success.store.member'));
100
+            $topUp->mutation()->create([
101
+                'type' => 1,
102
+                'amount' => TypeMember::find($request->type_member_id)->getRawOriginal('price'),
103
+            ]);
104
+
105
+            DB::commit();
106
+
107
+            return back()->with('success', __('messages.success.store.member'));
108
+        } catch (QueryException $e) {
109
+            DB::rollBack();
110
+
111
+            return back()->with('success', __('messages.error.store.member'));
112
+        }
97 113
     }
98 114
 
99 115
     /**
@@ -120,13 +136,7 @@ class MemberController extends Controller
120 136
                 'id' => $member->id,
121 137
                 'name' => $member->name,
122 138
                 'phone' => $member->phone,
123
-                'plat_number' => $member->plat_number,
124
-                'type_member_id' => $member->type_member_id,
125 139
             ],
126
-            'typeMembers' => TypeMember::get()->transform(fn($typeMember) => [
127
-                'label' => $typeMember->type,
128
-                'value' => $typeMember->id,
129
-            ]),
130 140
         ]);
131 141
     }
132 142
 
@@ -150,7 +160,7 @@ class MemberController extends Controller
150 160
      * @param  Member  $member
151 161
      * @return \Illuminate\Http\Response
152 162
      */
153
-    public function destroy($member)
163
+    public function destroy(Member $member)
154 164
     {
155 165
         $member->delete();
156 166
 

+ 1
- 0
app/Http/Requests/Member/StoreMemberRequest.php Прегледај датотеку

@@ -27,6 +27,7 @@ class StoreMemberRequest extends FormRequest
27 27
             'name' => 'required|string|max:50',
28 28
             'phone' => 'required|numeric|min:12|unique:members,phone',
29 29
             'type_member_id' => 'required|numeric',
30
+            'vehicles.*.platNumber' => 'unique:vehicles,plat_number',
30 31
         ];
31 32
     }
32 33
 }

+ 0
- 1
app/Http/Requests/Member/UpdateMemberRequest.php Прегледај датотеку

@@ -26,7 +26,6 @@ class UpdateMemberRequest extends FormRequest
26 26
         return [
27 27
             'name' => 'required|string|max:50',
28 28
             'phone' => 'required|numeric|min:12|unique:members,phone,' . $this->member->id,
29
-            'type_member_id' => 'required|numeric',
30 29
         ];
31 30
     }
32 31
 }

+ 14
- 0
app/Models/Member.php Прегледај датотеку

@@ -25,6 +25,13 @@ class Member extends Model
25 25
         );
26 26
     }
27 27
 
28
+    protected function expDate(): Attribute
29
+    {
30
+        return Attribute::make(
31
+            get:fn($value) => Carbon::parse($value)->translatedFormat('l d/m/Y')
32
+        );
33
+    }
34
+
28 35
     public function typeMember()
29 36
     {
30 37
         return $this->belongsTo(TypeMember::class);
@@ -40,6 +47,13 @@ class Member extends Model
40 47
         return $this->hasMany(TopUp::class);
41 48
     }
42 49
 
50
+    public function vehicleDetail()
51
+    {
52
+        $detailVehicle = $this->vehicles->transform(fn($vehicle) => $vehicle->typeVehicle->type . ': ' . $vehicle->plat_number)->toArray();
53
+
54
+        return implode(', ', $detailVehicle);
55
+    }
56
+
43 57
     public function scopeFilter($query, array $filters)
44 58
     {
45 59
         $query->when($filters['search'] ?? null, function ($query, $search) {

+ 5
- 0
app/Models/TopUp.php Прегледај датотеку

@@ -43,6 +43,11 @@ class TopUp extends Model
43 43
         return $this->belongsTo(User::class);
44 44
     }
45 45
 
46
+    public function mutation()
47
+    {
48
+        return $this->hasOne(Mutation::class);
49
+    }
50
+
46 51
     public function scopeFilter($query, array $filters)
47 52
     {
48 53
         $query->when($filters['search'] ?? null, function ($query, $search) {

+ 7
- 0
app/Models/TypeMember.php Прегледај датотеку

@@ -26,6 +26,13 @@ class TypeMember extends Model
26 26
         );
27 27
     }
28 28
 
29
+    protected function type(): Attribute
30
+    {
31
+        return Attribute::make(
32
+            set:fn($value) => ucwords($value)
33
+        );
34
+    }
35
+
29 36
     protected function price(): Attribute
30 37
     {
31 38
         return Attribute::make(

+ 7
- 0
app/Models/TypeVehicle.php Прегледај датотеку

@@ -21,4 +21,11 @@ class TypeVehicle extends Model
21 21
             get:fn($value) => Carbon::parse($value)->translatedFormat('l d/m/Y')
22 22
         );
23 23
     }
24
+
25
+    protected function type(): Attribute
26
+    {
27
+        return Attribute::make(
28
+            set:fn($value) => ucwords($value)
29
+        );
30
+    }
24 31
 }

+ 13
- 0
app/Models/Vehicle.php Прегледај датотеку

@@ -2,6 +2,7 @@
2 2
 
3 3
 namespace App\Models;
4 4
 
5
+use Illuminate\Database\Eloquent\Casts\Attribute;
5 6
 use Illuminate\Database\Eloquent\Factories\HasFactory;
6 7
 use Illuminate\Database\Eloquent\Model;
7 8
 
@@ -14,4 +15,16 @@ class Vehicle extends Model
14 15
         'member_id',
15 16
         'type_vehicle_id',
16 17
     ];
18
+
19
+    protected function platNumber(): Attribute
20
+    {
21
+        return Attribute::make(
22
+            set:fn($value) => strtoupper($value)
23
+        );
24
+    }
25
+
26
+    public function typeVehicle()
27
+    {
28
+        return $this->belongsTo(TypeVehicle::class);
29
+    }
17 30
 }

+ 1
- 1
database/migrations/2022_04_20_031728_create_top_ups_table.php Прегледај датотеку

@@ -17,7 +17,7 @@ return new class extends Migration
17 17
             $table->id();
18 18
             $table->unsignedInteger('amount');
19 19
             $table->dateTime('exp_date');
20
-            $table->foreignId('member_id')->constrained();
20
+            $table->foreignId('member_id')->constrained()->cascadeOnDelete();
21 21
             $table->foreignId('user_id')->constrained();
22 22
             $table->timestamps();
23 23
         });

+ 1
- 1
database/migrations/2022_04_23_130215_create_vehicles_table.php Прегледај датотеку

@@ -16,7 +16,7 @@ return new class extends Migration
16 16
         Schema::create('vehicles', function (Blueprint $table) {
17 17
             $table->id();
18 18
             $table->string('plat_number');
19
-            $table->foreignId('member_id')->constrained();
19
+            $table->foreignId('member_id')->constrained()->cascadeOnDelete();
20 20
             $table->foreignId('type_vehicle_id')->constrained();
21 21
             $table->timestamps();
22 22
         });

+ 1
- 1
database/migrations/2022_04_23_130216_create_mutations_table.php Прегледај датотеку

@@ -19,7 +19,7 @@ return new class extends Migration
19 19
             $table->unsignedInteger('amount');
20 20
             $table->foreignId('transaction_out')->nullable()->default(null)->constrained();
21 21
             $table->foreignId('expense_id')->nullable()->default(null)->constrained();
22
-            $table->foreignId('top_up_id')->nullable()->default(null)->constrained();
22
+            $table->foreignId('top_up_id')->nullable()->default(null)->constrained()->cascadeOnDelete();
23 23
             $table->timestamps();
24 24
         });
25 25
     }

+ 1
- 0
lang/en/messages.php Прегледај датотеку

@@ -50,6 +50,7 @@ return [
50 50
 
51 51
     'error' => [
52 52
         'store' => [
53
+            'member' => 'member failed to be added',
53 54
             'change_password' => 'Password invalid',
54 55
             'expense' => 'Expense failed to be added',
55 56
             'transaction' => 'Transaction failed to be added',

+ 1
- 0
lang/id/messages.php Прегледај датотеку

@@ -50,6 +50,7 @@ return [
50 50
 
51 51
     'error' => [
52 52
         'store' => [
53
+            'member' => 'member gagal ditambahkan',
53 54
             'change_password' => 'Password lama salah',
54 55
             'expense' => 'Pengeluaran gagal ditambahkan',
55 56
             'transaction' => 'Transaksi gagal ditambahkan',

+ 76
- 28
public/js/resources_js_pages_member_Create_vue.js Прегледај датотеку

@@ -538,39 +538,59 @@ __webpack_require__.r(__webpack_exports__);
538 538
 
539 539
     var listPlatNumberOnDelete = function listPlatNumberOnDelete(index) {
540 540
       listPlatNumber.splice(index, 1);
541
+      (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.usePage)().props.value.errors = {};
541 542
     };
542 543
 
543 544
     var addPlatNumber = function addPlatNumber() {
544
-      form.clearErrors('plat_number');
545
+      form.clearErrors('plat_number', 'type_vehicle_id');
545 546
 
546
-      if (form.plat_number) {
547
-        if (listPlatNumber.length + 1 > props.typeMember.max) {
548
-          form.setError('plat_number', 'Melibihi batas maksimal kendaraan');
549
-          return;
550
-        }
551
-
552
-        listPlatNumber.push({
553
-          platNumber: form.plat_number,
554
-          typeVehicleId: form.type_member_id
555
-        });
556
-        form.reset('plat_number');
557
-      } else {
547
+      if (!form.plat_number) {
558 548
         form.setError('plat_number', 'Plat kendaraan tidak boleh kosong');
549
+        return;
550
+      }
551
+
552
+      if (!form.type_vehicle_id) {
553
+        form.setError('type_vehicle_id', 'Tidak boleh kosong');
554
+        return;
555
+      }
556
+
557
+      var listPlatNumberExist = listPlatNumber.filter(function (val) {
558
+        return val.platNumber === form.plat_number.toUpperCase();
559
+      });
560
+
561
+      if (listPlatNumberExist.length) {
562
+        form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama');
563
+        return;
564
+      }
565
+
566
+      if (listPlatNumber.length + 1 > props.typeMember.max) {
567
+        form.setError('plat_number', 'Melibihi batas maksimal kendaraan');
568
+        return;
559 569
       }
570
+
571
+      var typeVehicleFilter = props.typeVehicles.filter(function (val) {
572
+        return val.value === form.type_vehicle_id;
573
+      })[0];
574
+      listPlatNumber.push({
575
+        platNumber: form.plat_number.toUpperCase(),
576
+        typeVehicle: typeVehicleFilter.label,
577
+        typeVehicleId: typeVehicleFilter.value
578
+      });
579
+      form.reset('plat_number', 'type_vehicle_id');
560 580
     };
561 581
 
562 582
     var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm)({
563 583
       name: null,
564 584
       phone: null,
565 585
       plat_number: null,
566
-      type_vehicle: null,
586
+      type_vehicle_id: null,
567 587
       type_member_id: null
568 588
     });
569 589
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(function () {
570 590
       return form.type_member_id;
571 591
     }, function () {
572 592
       listPlatNumberClear();
573
-      form.reset('plat_number');
593
+      form.reset('plat_number', 'type_vehicle_id');
574 594
       _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia.reload({
575 595
         only: ['typeMember'],
576 596
         data: {
@@ -584,7 +604,7 @@ __webpack_require__.r(__webpack_exports__);
584 604
         return {
585 605
           name: data.name,
586 606
           phone: data.phone,
587
-          plat_numbers: listPlatNumber,
607
+          vehicles: listPlatNumber,
588 608
           type_member_id: data.type_member_id
589 609
         };
590 610
       }).post(route('members.store'), {
@@ -1354,9 +1374,14 @@ var _hoisted_21 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElement
1354 1374
 );
1355 1375
 
1356 1376
 var _hoisted_22 = {
1357
-  "class": "flex justify-content-end"
1377
+  style: {
1378
+    "color": "#b71c1c"
1379
+  }
1358 1380
 };
1359 1381
 var _hoisted_23 = {
1382
+  "class": "flex justify-content-end"
1383
+};
1384
+var _hoisted_24 = {
1360 1385
   "class": "flex flex-column md:flex-row justify-content-end"
1361 1386
 };
1362 1387
 function render(_ctx, _cache, $props, $setup, $data, $options) {
@@ -1450,23 +1475,27 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1450 1475
             error: $setup.form.errors.plat_number
1451 1476
           }, null, 8
1452 1477
           /* PROPS */
1453
-          , ["modelValue", "disabled", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputText"], {
1454
-            modelValue: $setup.form.type_vehicle,
1478
+          , ["modelValue", "disabled", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1479
+            modelValue: $setup.form.type_vehicle_id,
1455 1480
             "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) {
1456
-              return $setup.form.type_vehicle = $event;
1481
+              return $setup.form.type_vehicle_id = $event;
1457 1482
             }),
1458 1483
             label: "Jenis Kendaraan",
1459 1484
             placeholder: "jenis kendaraan",
1460 1485
             disabled: !$setup.form.type_member_id,
1461
-            error: $setup.form.errors.type_vehicle
1486
+            options: $props.typeVehicles,
1487
+            error: $setup.form.errors.type_vehicle_id
1462 1488
           }, null, 8
1463 1489
           /* PROPS */
1464
-          , ["modelValue", "disabled", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1490
+          , ["modelValue", "disabled", "options", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1465 1491
             label: "Tambah",
1466 1492
             "class": "p-button-outlined",
1467 1493
             icon: "pi pi-car",
1494
+            disabled: !$setup.form.type_member_id,
1468 1495
             onClick: $setup.addPlatNumber
1469
-          })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [_hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1496
+          }, null, 8
1497
+          /* PROPS */
1498
+          , ["disabled"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [_hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1470 1499
             "striped-rows": "",
1471 1500
             "row-hover": "",
1472 1501
             "responsive-layout": "scroll",
@@ -1488,15 +1517,28 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1488 1517
               )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1489 1518
                 body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1490 1519
                   var index = _ref.index;
1491
-                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1520
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.$page.props.errors["vehicles.".concat(index, ".platNumber")]), 1
1521
+                  /* TEXT */
1522
+                  )];
1523
+                }),
1524
+                _: 1
1525
+                /* STABLE */
1526
+
1527
+              }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1528
+                body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref2) {
1529
+                  var index = _ref2.index,
1530
+                      data = _ref2.data;
1531
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1492 1532
                     icon: "pi pi-trash",
1493
-                    "class": "p-button-rounded p-button-text",
1533
+                    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["p-button-rounded p-button-text", {
1534
+                      'p-button-danger': _ctx.$page.props.errors["vehicles.".concat(index, ".platNumber")]
1535
+                    }]),
1494 1536
                     onClick: function onClick($event) {
1495
-                      return $setup.listPlatNumberOnDelete(index);
1537
+                      return $setup.listPlatNumberOnDelete(data.platNumber);
1496 1538
                     }
1497 1539
                   }, null, 8
1498 1540
                   /* PROPS */
1499
-                  , ["onClick"])])];
1541
+                  , ["class", "onClick"])])];
1500 1542
                 }),
1501 1543
                 _: 1
1502 1544
                 /* STABLE */
@@ -1511,7 +1553,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1511 1553
           , ["value"])])])];
1512 1554
         }),
1513 1555
         footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1514
-          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1556
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1515 1557
             label: "Simpan",
1516 1558
             icon: "pi pi-check",
1517 1559
             "class": "p-button-outlined",
@@ -1565,10 +1607,16 @@ var IndexTable = [{
1565 1607
 }, {
1566 1608
   field: 'price',
1567 1609
   header: 'Tarif Member'
1610
+}, {
1611
+  field: 'expDate',
1612
+  header: 'Berakhir'
1568 1613
 }];
1569 1614
 var PlatNumberTable = [{
1570 1615
   field: 'platNumber',
1571 1616
   header: 'Plat Kendaraan'
1617
+}, {
1618
+  field: 'typeVehicle',
1619
+  header: 'Jenis Kendaraan'
1572 1620
 }];
1573 1621
 
1574 1622
 /***/ }),

+ 11
- 273
public/js/resources_js_pages_member_Edit_vue.js Прегледај датотеку

@@ -45,97 +45,6 @@ __webpack_require__.r(__webpack_exports__);
45 45
 
46 46
 /***/ }),
47 47
 
48
-/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
49
-/*!****************************************************************************************************************************************************************************************************************!*\
50
-  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
51
-  \****************************************************************************************************************************************************************************************************************/
52
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
53
-
54
-__webpack_require__.r(__webpack_exports__);
55
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
56
-/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
57
-/* harmony export */ });
58
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
59
-
60
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
61
-  props: {
62
-    label: {
63
-      type: String,
64
-      required: true
65
-    },
66
-    optionLabel: {
67
-      type: String,
68
-      "default": 'label'
69
-    },
70
-    optionValue: {
71
-      type: String,
72
-      "default": 'value'
73
-    },
74
-    optionDisabled: {
75
-      type: String,
76
-      "default": 'disabled'
77
-    },
78
-    options: {
79
-      type: Array,
80
-      required: true
81
-    },
82
-    placeholder: {
83
-      type: String,
84
-      required: true
85
-    },
86
-    disabled: {
87
-      type: Boolean,
88
-      "default": false
89
-    },
90
-    error: {
91
-      type: String,
92
-      "default": null
93
-    },
94
-    modelValue: null
95
-  },
96
-  emits: ['update:modelValue'],
97
-  setup: function setup(__props, _ref) {
98
-    var expose = _ref.expose;
99
-    expose();
100
-    var props = __props;
101
-    var isError = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
102
-      return props.error ? true : false;
103
-    });
104
-    var forLabel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
105
-      return props.label ? props.label.toLowerCase().replace(/\s+/g, '-') : null;
106
-    });
107
-    var ariaDescribedbyLabel = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(function () {
108
-      return props.label ? props.label.toLowerCase().replace(/\s+/g, '-') + '-help' : null;
109
-    });
110
-
111
-    var selectedDropdownLabel = function selectedDropdownLabel(value) {
112
-      var result = props.options.find(function (option) {
113
-        return option[props.optionValue] == value;
114
-      });
115
-
116
-      if (result) {
117
-        return result[props.optionLabel];
118
-      }
119
-    };
120
-
121
-    var __returned__ = {
122
-      props: props,
123
-      isError: isError,
124
-      forLabel: forLabel,
125
-      ariaDescribedbyLabel: ariaDescribedbyLabel,
126
-      selectedDropdownLabel: selectedDropdownLabel,
127
-      computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed
128
-    };
129
-    Object.defineProperty(__returned__, '__isScriptSetup', {
130
-      enumerable: false,
131
-      value: true
132
-    });
133
-    return __returned__;
134
-  }
135
-});
136
-
137
-/***/ }),
138
-
139 48
 /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppInputText.vue?vue&type=script&setup=true&lang=js":
140 49
 /*!*****************************************************************************************************************************************************************************************************************!*\
141 50
   !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppInputText.vue?vue&type=script&setup=true&lang=js ***!
@@ -549,9 +458,7 @@ __webpack_require__.r(__webpack_exports__);
549 458
 /* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
550 459
 /* harmony import */ var _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/layouts/AppLayout.vue */ "./resources/js/layouts/AppLayout.vue");
551 460
 /* harmony import */ var _components_AppDialog_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/AppDialog.vue */ "./resources/js/components/AppDialog.vue");
552
-/* harmony import */ var _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppDropdown.vue */ "./resources/js/components/AppDropdown.vue");
553
-/* harmony import */ var _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/components/AppInputText.vue */ "./resources/js/components/AppInputText.vue");
554
-
461
+/* harmony import */ var _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppInputText.vue */ "./resources/js/components/AppInputText.vue");
555 462
 
556 463
 
557 464
 
@@ -560,8 +467,7 @@ __webpack_require__.r(__webpack_exports__);
560 467
 
561 468
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
562 469
   props: {
563
-    member: Object,
564
-    typeMembers: Array
470
+    member: Object
565 471
   },
566 472
   setup: function setup(__props, _ref) {
567 473
     var expose = _ref.expose;
@@ -580,7 +486,7 @@ __webpack_require__.r(__webpack_exports__);
580 486
     };
581 487
 
582 488
     var onAgree = function onAgree() {
583
-      return _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia["delete"](route('users.destroy', props.member.id));
489
+      return _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia["delete"](route('members.destroy', props.member.id));
584 490
     };
585 491
 
586 492
     var onCancel = function onCancel() {
@@ -589,9 +495,7 @@ __webpack_require__.r(__webpack_exports__);
589 495
 
590 496
     var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm)({
591 497
       name: props.member.name,
592
-      phone: props.member.phone,
593
-      plat_number: props.member.plat_number,
594
-      type_member_id: props.member.type_member_id
498
+      phone: props.member.phone
595 499
     });
596 500
 
597 501
     var submit = function submit() {
@@ -616,8 +520,7 @@ __webpack_require__.r(__webpack_exports__);
616 520
       usePage: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.usePage,
617 521
       AppLayout: _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_3__["default"],
618 522
       AppDialog: _components_AppDialog_vue__WEBPACK_IMPORTED_MODULE_4__["default"],
619
-      AppDropdown: _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_5__["default"],
620
-      AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_6__["default"]
523
+      AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_5__["default"]
621 524
     };
622 525
     Object.defineProperty(__returned__, '__isScriptSetup', {
623 526
       enumerable: false,
@@ -708,87 +611,6 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
708 611
 
709 612
 /***/ }),
710 613
 
711
-/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
712
-/*!*********************************************************************************************************************************************************************************************************************************************************************************!*\
713
-  !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
714
-  \*********************************************************************************************************************************************************************************************************************************************************************************/
715
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
716
-
717
-__webpack_require__.r(__webpack_exports__);
718
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
719
-/* harmony export */   "render": () => (/* binding */ render)
720
-/* harmony export */ });
721
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
722
-
723
-var _hoisted_1 = {
724
-  "class": "field"
725
-};
726
-var _hoisted_2 = ["for"];
727
-var _hoisted_3 = {
728
-  key: 0
729
-};
730
-var _hoisted_4 = {
731
-  key: 1
732
-};
733
-var _hoisted_5 = ["id"];
734
-function render(_ctx, _cache, $props, $setup, $data, $options) {
735
-  var _component_Dropdown = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Dropdown");
736
-
737
-  return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_1, [$props.label ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("label", {
738
-    key: 0,
739
-    "for": $setup.forLabel
740
-  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.label), 9
741
-  /* TEXT, PROPS */
742
-  , _hoisted_2)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Dropdown, {
743
-    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["w-full", {
744
-      'p-invalid': $setup.isError
745
-    }]),
746
-    id: $setup.forLabel,
747
-    "aria-describedby": $setup.ariaDescribedbyLabel,
748
-    "option-disabled": $props.optionDisabled,
749
-    "option-label": $props.optionLabel,
750
-    "option-value": $props.optionValue,
751
-    placeholder: $props.placeholder,
752
-    options: $props.options,
753
-    "model-value": $props.modelValue,
754
-    disabled: $props.disabled,
755
-    onChange: _cache[0] || (_cache[0] = function ($event) {
756
-      return _ctx.$emit('update:modelValue', $event.value);
757
-    })
758
-  }, {
759
-    value: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (slotProps) {
760
-      return [slotProps.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.selectedDropdownLabel(slotProps.value)), 1
761
-      /* TEXT */
762
-      )) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_4, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(slotProps.placeholder), 1
763
-      /* TEXT */
764
-      ))];
765
-    }),
766
-    option: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
767
-      var option = _ref.option,
768
-          index = _ref.index;
769
-      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "option", {
770
-        option: option,
771
-        index: index
772
-      })];
773
-    }),
774
-    _: 3
775
-    /* FORWARDED */
776
-
777
-  }, 8
778
-  /* PROPS */
779
-  , ["class", "id", "aria-describedby", "option-disabled", "option-label", "option-value", "placeholder", "options", "model-value", "disabled"]), $props.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("small", {
780
-    key: 1,
781
-    id: $setup.ariaDescribedbyLabel,
782
-    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)({
783
-      'p-error': $setup.isError
784
-    })
785
-  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.error), 11
786
-  /* TEXT, CLASS, PROPS */
787
-  , _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]);
788
-}
789
-
790
-/***/ }),
791
-
792 614
 /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":
793 615
 /*!*******************************************************************************************************************************************************************************************************************************************************************************!*\
794 616
   !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e ***!
@@ -1363,18 +1185,12 @@ var _hoisted_6 = {
1363 1185
   "class": "col-12 md:col-6"
1364 1186
 };
1365 1187
 var _hoisted_7 = {
1366
-  "class": "col-12 md:col-6"
1367
-};
1368
-var _hoisted_8 = {
1369
-  "class": "col-12 md:col-6"
1370
-};
1371
-var _hoisted_9 = {
1372 1188
   "class": "grid"
1373 1189
 };
1374
-var _hoisted_10 = {
1190
+var _hoisted_8 = {
1375 1191
   "class": "col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-start"
1376 1192
 };
1377
-var _hoisted_11 = {
1193
+var _hoisted_9 = {
1378 1194
   "class": "col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-end"
1379 1195
 };
1380 1196
 function render(_ctx, _cache, $props, $setup, $data, $options) {
@@ -1411,34 +1227,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1411 1227
             error: $setup.form.errors.phone
1412 1228
           }, null, 8
1413 1229
           /* PROPS */
1414
-          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputText"], {
1415
-            modelValue: $setup.form.plat_number,
1416
-            "onUpdate:modelValue": _cache[2] || (_cache[2] = function ($event) {
1417
-              return $setup.form.plat_number = $event;
1418
-            }),
1419
-            label: "Plat Kendaraan",
1420
-            placeholder: "plat kendaraan",
1421
-            error: $setup.form.errors.plat_number
1422
-          }, null, 8
1423
-          /* PROPS */
1424
-          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1425
-            label: "Jenis member",
1426
-            placeholder: "pilih satu",
1427
-            modelValue: $setup.form.type_member_id,
1428
-            "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) {
1429
-              return $setup.form.type_member_id = $event;
1430
-            }),
1431
-            options: $props.typeMembers,
1432
-            error: $setup.form.errors.type_member_id
1433
-          }, null, 8
1434
-          /* PROPS */
1435
-          , ["modelValue", "options", "error"])])])];
1230
+          , ["modelValue", "error"])])])];
1436 1231
         }),
1437 1232
         footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1438
-          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDialog"], {
1233
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDialog"], {
1439 1234
             message: "Yakin akan menghapus data ini?",
1440 1235
             visible: $setup.visibleDialog,
1441
-            "onUpdate:visible": _cache[4] || (_cache[4] = function ($event) {
1236
+            "onUpdate:visible": _cache[2] || (_cache[2] = function ($event) {
1442 1237
               return $setup.visibleDialog = $event;
1443 1238
             }),
1444 1239
             onAgree: $setup.onAgree,
@@ -1450,7 +1245,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1450 1245
             icon: "pi pi-trash",
1451 1246
             "class": "p-button-outlined p-button-danger",
1452 1247
             onClick: $setup.confirmDialog
1453
-          })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_11, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1248
+          })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1454 1249
             label: "Simpan",
1455 1250
             icon: "pi pi-check",
1456 1251
             "class": "p-button-outlined",
@@ -1611,33 +1406,6 @@ const __exports__ = /*#__PURE__*/(0,_home_dijitalcode_Projects_parkirin_node_mod
1611 1406
 if (false) {}
1612 1407
 
1613 1408
 
1614
-/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1615
-
1616
-/***/ }),
1617
-
1618
-/***/ "./resources/js/components/AppDropdown.vue":
1619
-/*!*************************************************!*\
1620
-  !*** ./resources/js/components/AppDropdown.vue ***!
1621
-  \*************************************************/
1622
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1623
-
1624
-__webpack_require__.r(__webpack_exports__);
1625
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1626
-/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1627
-/* harmony export */ });
1628
-/* harmony import */ var _AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AppDropdown.vue?vue&type=template&id=ce0d1992 */ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992");
1629
-/* harmony import */ var _AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AppDropdown.vue?vue&type=script&setup=true&lang=js */ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js");
1630
-/* harmony import */ var _home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ "./node_modules/vue-loader/dist/exportHelper.js");
1631
-
1632
-
1633
-
1634
-
1635
-;
1636
-const __exports__ = /*#__PURE__*/(0,_home_dijitalcode_Projects_parkirin_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_1__["default"], [['render',_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__.render],['__file',"resources/js/components/AppDropdown.vue"]])
1637
-/* hot reload */
1638
-if (false) {}
1639
-
1640
-
1641 1409
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1642 1410
 
1643 1411
 /***/ }),
@@ -1869,21 +1637,6 @@ __webpack_require__.r(__webpack_exports__);
1869 1637
 /* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDialog_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDialog.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=script&setup=true&lang=js");
1870 1638
  
1871 1639
 
1872
-/***/ }),
1873
-
1874
-/***/ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
1875
-/*!************************************************************************************!*\
1876
-  !*** ./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
1877
-  \************************************************************************************/
1878
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1879
-
1880
-__webpack_require__.r(__webpack_exports__);
1881
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1882
-/* harmony export */   "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__["default"])
1883
-/* harmony export */ });
1884
-/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDropdown.vue?vue&type=script&setup=true&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js");
1885
- 
1886
-
1887 1640
 /***/ }),
1888 1641
 
1889 1642
 /***/ "./resources/js/components/AppInputText.vue?vue&type=script&setup=true&lang=js":
@@ -2004,21 +1757,6 @@ __webpack_require__.r(__webpack_exports__);
2004 1757
 /* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDialog_vue_vue_type_template_id_336aa46e__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDialog.vue?vue&type=template&id=336aa46e */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDialog.vue?vue&type=template&id=336aa46e");
2005 1758
 
2006 1759
 
2007
-/***/ }),
2008
-
2009
-/***/ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
2010
-/*!*******************************************************************************!*\
2011
-  !*** ./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
2012
-  \*******************************************************************************/
2013
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2014
-
2015
-__webpack_require__.r(__webpack_exports__);
2016
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2017
-/* harmony export */   "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__.render)
2018
-/* harmony export */ });
2019
-/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_AppDropdown_vue_vue_type_template_id_ce0d1992__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./AppDropdown.vue?vue&type=template&id=ce0d1992 */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992");
2020
-
2021
-
2022 1760
 /***/ }),
2023 1761
 
2024 1762
 /***/ "./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":

+ 6
- 0
public/js/resources_js_pages_member_Index_vue.js Прегледај датотеку

@@ -1242,10 +1242,16 @@ var IndexTable = [{
1242 1242
 }, {
1243 1243
   field: 'price',
1244 1244
   header: 'Tarif Member'
1245
+}, {
1246
+  field: 'expDate',
1247
+  header: 'Berakhir'
1245 1248
 }];
1246 1249
 var PlatNumberTable = [{
1247 1250
   field: 'platNumber',
1248 1251
   header: 'Plat Kendaraan'
1252
+}, {
1253
+  field: 'typeVehicle',
1254
+  header: 'Jenis Kendaraan'
1249 1255
 }];
1250 1256
 
1251 1257
 /***/ }),

+ 6
- 0
public/js/resources_js_pages_member_TableHeader_js.js Прегледај датотеку

@@ -30,10 +30,16 @@ var IndexTable = [{
30 30
 }, {
31 31
   field: 'price',
32 32
   header: 'Tarif Member'
33
+}, {
34
+  field: 'expDate',
35
+  header: 'Berakhir'
33 36
 }];
34 37
 var PlatNumberTable = [{
35 38
   field: 'platNumber',
36 39
   header: 'Plat Kendaraan'
40
+}, {
41
+  field: 'typeVehicle',
42
+  header: 'Jenis Kendaraan'
37 43
 }];
38 44
 
39 45
 /***/ })

+ 1
- 1
public/js/vue.js Прегледај датотеку

@@ -58101,7 +58101,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
58101 58101
 /******/ 		// This function allow to reference async chunks
58102 58102
 /******/ 		__webpack_require__.u = (chunkId) => {
58103 58103
 /******/ 			// return url for filenames based on template
58104
-/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"10c6b388645ceb22","resources_js_pages_auth_ForgotPassword_vue":"5b9f0529bda25a9b","resources_js_pages_auth_Login_vue":"61b9c9ae1ae9da32","resources_js_pages_auth_ResetPassword_vue":"b091193a1e114ce8","resources_js_pages_auth_VerifyEmail_vue":"a7b9a99e5a331088","resources_js_pages_expense_Create_vue":"1772093ec9ad8e1f","resources_js_pages_expense_Index_vue":"51f7facd5c3c3ea6","resources_js_pages_expense_Show_vue":"6e60ec4571b580bb","resources_js_pages_expense_TableHeader_js":"eed3f0613f167cfd","resources_js_pages_home_Index_vue":"6cd0224828ac8129","resources_js_pages_member_Create_vue":"e560dbe95154c5fa","resources_js_pages_member_Edit_vue":"05b5081c82d41225","resources_js_pages_member_Index_vue":"80015a0d2c0ee954","resources_js_pages_member_TableHeader_js":"9e189bc69c98169d","resources_js_pages_topup_Create_vue":"9d958cbaf19eb892","resources_js_pages_topup_Edit_vue":"258c3b0746574dc0","resources_js_pages_topup_Index_vue":"5c7eced88af886fa","resources_js_pages_topup_Show_vue":"cb35ad21e9ce163f","resources_js_pages_topup_TableHeader_js":"c803a04362b71855","resources_js_pages_typemember_Create_vue":"79728a0314d12450","resources_js_pages_typemember_Edit_vue":"94fb9b5b49338c01","resources_js_pages_typemember_Index_vue":"cd93651ebf36d5a5","resources_js_pages_typemember_TableHeader_js":"de81088b132d3e90","resources_js_pages_typevehicle_Create_vue":"0f937d93865a1ea2","resources_js_pages_typevehicle_Edit_vue":"edba97a3715ba957","resources_js_pages_typevehicle_Index_vue":"53c702d33feb6196","resources_js_pages_typevehicle_TableHeader_js":"a40378918fbe74e1","resources_js_pages_user_Create_vue":"361bf2589467f820","resources_js_pages_user_Edit_vue":"fdb844cf830ec11c","resources_js_pages_user_Index_vue":"16d93eb7e5210300","resources_js_pages_user_Show_vue":"138fd92d6ae36518","resources_js_pages_user_TableHeader_js":"0d87fd422fe40491"}[chunkId] + "";
58104
+/******/ 			return "js/" + chunkId + ".js?id=" + {"node_modules_chart_js_auto_auto_esm_js":"10c6b388645ceb22","resources_js_pages_auth_ForgotPassword_vue":"5b9f0529bda25a9b","resources_js_pages_auth_Login_vue":"61b9c9ae1ae9da32","resources_js_pages_auth_ResetPassword_vue":"b091193a1e114ce8","resources_js_pages_auth_VerifyEmail_vue":"a7b9a99e5a331088","resources_js_pages_expense_Create_vue":"1772093ec9ad8e1f","resources_js_pages_expense_Index_vue":"51f7facd5c3c3ea6","resources_js_pages_expense_Show_vue":"6e60ec4571b580bb","resources_js_pages_expense_TableHeader_js":"eed3f0613f167cfd","resources_js_pages_home_Index_vue":"6cd0224828ac8129","resources_js_pages_member_Create_vue":"3ca394fe875a5c72","resources_js_pages_member_Edit_vue":"7b222567b848883e","resources_js_pages_member_Index_vue":"71a31a774bb1b571","resources_js_pages_member_TableHeader_js":"51dbf053f7ddd45c","resources_js_pages_topup_Create_vue":"9d958cbaf19eb892","resources_js_pages_topup_Edit_vue":"258c3b0746574dc0","resources_js_pages_topup_Index_vue":"5c7eced88af886fa","resources_js_pages_topup_Show_vue":"cb35ad21e9ce163f","resources_js_pages_topup_TableHeader_js":"c803a04362b71855","resources_js_pages_typemember_Create_vue":"79728a0314d12450","resources_js_pages_typemember_Edit_vue":"94fb9b5b49338c01","resources_js_pages_typemember_Index_vue":"cd93651ebf36d5a5","resources_js_pages_typemember_TableHeader_js":"de81088b132d3e90","resources_js_pages_typevehicle_Create_vue":"0f937d93865a1ea2","resources_js_pages_typevehicle_Edit_vue":"edba97a3715ba957","resources_js_pages_typevehicle_Index_vue":"53c702d33feb6196","resources_js_pages_typevehicle_TableHeader_js":"a40378918fbe74e1","resources_js_pages_user_Create_vue":"361bf2589467f820","resources_js_pages_user_Edit_vue":"fdb844cf830ec11c","resources_js_pages_user_Index_vue":"16d93eb7e5210300","resources_js_pages_user_Show_vue":"138fd92d6ae36518","resources_js_pages_user_TableHeader_js":"0d87fd422fe40491"}[chunkId] + "";
58105 58105
 /******/ 		};
58106 58106
 /******/ 	})();
58107 58107
 /******/ 	

+ 54
- 18
resources/js/pages/member/Create.vue Прегледај датотеку

@@ -28,31 +28,53 @@ const listPlatNumberClear = () => {
28 28
 
29 29
 const listPlatNumberOnDelete = (index) => {
30 30
   listPlatNumber.splice(index, 1)
31
+
32
+  usePage().props.value.errors = {}
31 33
 }
32 34
 
33 35
 const addPlatNumber = () => {
34
-  form.clearErrors('plat_number')
36
+  form.clearErrors('plat_number', 'type_vehicle_id')
35 37
 
36
-  if (form.plat_number) {
37
-    if (listPlatNumber.length + 1 > props.typeMember.max) {
38
-      form.setError('plat_number', 'Melibihi batas maksimal kendaraan')
38
+  if (!form.plat_number) {
39
+    form.setError('plat_number', 'Plat kendaraan tidak boleh kosong')
39 40
 
40
-      return
41
-    }
41
+    return
42
+  }
42 43
 
43
-    listPlatNumber.push({ platNumber: form.plat_number, typeVehicleId: form.type_member_id })
44
+  if (!form.type_vehicle_id) {
45
+    form.setError('type_vehicle_id', 'Tidak boleh kosong')
44 46
 
45
-    form.reset('plat_number')
46
-  } else {
47
-    form.setError('plat_number', 'Plat kendaraan tidak boleh kosong')
47
+    return
48
+  }
49
+
50
+  const listPlatNumberExist = listPlatNumber.filter((val) => val.platNumber === form.plat_number.toUpperCase())
51
+  if (listPlatNumberExist.length) {
52
+    form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama')
53
+
54
+    return
55
+  }
56
+
57
+  if (listPlatNumber.length + 1 > props.typeMember.max) {
58
+    form.setError('plat_number', 'Melibihi batas maksimal kendaraan')
59
+
60
+    return
48 61
   }
62
+
63
+  const typeVehicleFilter = props.typeVehicles.filter((val) => val.value === form.type_vehicle_id)[0]
64
+  listPlatNumber.push({
65
+    platNumber: form.plat_number.toUpperCase(),
66
+    typeVehicle: typeVehicleFilter.label,
67
+    typeVehicleId: typeVehicleFilter.value,
68
+  })
69
+
70
+  form.reset('plat_number', 'type_vehicle_id')
49 71
 }
50 72
 
51 73
 const form = useForm({
52 74
   name: null,
53 75
   phone: null,
54 76
   plat_number: null,
55
-  type_vehicle: null,
77
+  type_vehicle_id: null,
56 78
   type_member_id: null,
57 79
 })
58 80
 
@@ -60,7 +82,7 @@ watch(
60 82
   () => form.type_member_id,
61 83
   () => {
62 84
     listPlatNumberClear()
63
-    form.reset('plat_number')
85
+    form.reset('plat_number', 'type_vehicle_id')
64 86
 
65 87
     Inertia.reload({ only: ['typeMember'], data: { id: form.type_member_id } })
66 88
   }
@@ -71,7 +93,7 @@ const submit = () => {
71 93
     .transform((data) => ({
72 94
       name: data.name,
73 95
       phone: data.phone,
74
-      plat_numbers: listPlatNumber,
96
+      vehicles: listPlatNumber,
75 97
       type_member_id: data.type_member_id,
76 98
     }))
77 99
     .post(route('members.store'), {
@@ -156,16 +178,23 @@ const submit = () => {
156 178
                 />
157 179
               </div>
158 180
               <div class="col-12 md:col-6">
159
-                <AppInputText
160
-                  v-model="form.type_vehicle"
181
+                <AppDropdown
182
+                  v-model="form.type_vehicle_id"
161 183
                   label="Jenis Kendaraan"
162 184
                   placeholder="jenis kendaraan"
163 185
                   :disabled="!form.type_member_id"
164
-                  :error="form.errors.type_vehicle"
186
+                  :options="typeVehicles"
187
+                  :error="form.errors.type_vehicle_id"
165 188
                 />
166 189
               </div>
167 190
               <div class="col-12 flex flex-column md:flex-row md:align-items-center justify-content-end mb-3 md:mb-0">
168
-                <Button label="Tambah" class="p-button-outlined" icon="pi pi-car" @click="addPlatNumber" />
191
+                <Button
192
+                  label="Tambah"
193
+                  class="p-button-outlined"
194
+                  icon="pi pi-car"
195
+                  :disabled="!form.type_member_id"
196
+                  @click="addPlatNumber"
197
+                />
169 198
               </div>
170 199
               <div class="col-12">
171 200
                 <h1 class="text-base"><i class="pi pi-car"></i> <span class="ml-2">Daftar Plat Kendaraan</span></h1>
@@ -187,11 +216,18 @@ const submit = () => {
187 216
 
188 217
                   <Column>
189 218
                     <template #body="{ index }">
219
+                      <span style="color: #b71c1c">{{ $page.props.errors[`vehicles.${index}.platNumber`] }}</span>
220
+                    </template>
221
+                  </Column>
222
+
223
+                  <Column>
224
+                    <template #body="{ index, data }">
190 225
                       <div class="flex justify-content-end">
191 226
                         <Button
192 227
                           icon="pi pi-trash"
193 228
                           class="p-button-rounded p-button-text"
194
-                          @click="listPlatNumberOnDelete(index)"
229
+                          :class="{ 'p-button-danger': $page.props.errors[`vehicles.${index}.platNumber`] }"
230
+                          @click="listPlatNumberOnDelete(data.platNumber)"
195 231
                         />
196 232
                       </div>
197 233
                     </template>

+ 1
- 24
resources/js/pages/member/Edit.vue Прегледај датотеку

@@ -4,12 +4,10 @@ import { Inertia } from '@inertiajs/inertia'
4 4
 import { Head, useForm, usePage } from '@inertiajs/inertia-vue3'
5 5
 import AppLayout from '@/layouts/AppLayout.vue'
6 6
 import AppDialog from '@/components/AppDialog.vue'
7
-import AppDropdown from '@/components/AppDropdown.vue'
8 7
 import AppInputText from '@/components/AppInputText.vue'
9 8
 
10 9
 const props = defineProps({
11 10
   member: Object,
12
-  typeMembers: Array,
13 11
 })
14 12
 
15 13
 const errors = computed(() => usePage().props.value.errors)
@@ -24,15 +22,13 @@ const confirmDialog = () => {
24 22
   visibleDialog.value = true
25 23
 }
26 24
 
27
-const onAgree = () => Inertia.delete(route('users.destroy', props.member.id))
25
+const onAgree = () => Inertia.delete(route('members.destroy', props.member.id))
28 26
 
29 27
 const onCancel = () => (visibleDialog.value = false)
30 28
 
31 29
 const form = useForm({
32 30
   name: props.member.name,
33 31
   phone: props.member.phone,
34
-  plat_number: props.member.plat_number,
35
-  type_member_id: props.member.type_member_id,
36 32
 })
37 33
 
38 34
 const submit = () => {
@@ -57,25 +53,6 @@ const submit = () => {
57 53
               <div class="col-12 md:col-6">
58 54
                 <AppInputText v-model="form.phone" label="Nomor HP" placeholder="nomor hp" :error="form.errors.phone" />
59 55
               </div>
60
-
61
-              <div class="col-12 md:col-6">
62
-                <AppInputText
63
-                  v-model="form.plat_number"
64
-                  label="Plat Kendaraan"
65
-                  placeholder="plat kendaraan"
66
-                  :error="form.errors.plat_number"
67
-                />
68
-              </div>
69
-
70
-              <div class="col-12 md:col-6">
71
-                <AppDropdown
72
-                  label="Jenis member"
73
-                  placeholder="pilih satu"
74
-                  v-model="form.type_member_id"
75
-                  :options="typeMembers"
76
-                  :error="form.errors.type_member_id"
77
-                />
78
-              </div>
79 56
             </div>
80 57
           </template>
81 58
 

+ 5
- 1
resources/js/pages/member/TableHeader.js Прегледај датотеку

@@ -5,6 +5,10 @@ export const IndexTable = [
5 5
   { field: 'platNumber', header: 'Plat Kendaraan' },
6 6
   { field: 'type', header: 'Jenis Member' },
7 7
   { field: 'price', header: 'Tarif Member' },
8
+  { field: 'expDate', header: 'Berakhir' },
8 9
 ]
9 10
 
10
-export const PlatNumberTable = [{ field: 'platNumber', header: 'Plat Kendaraan' }]
11
+export const PlatNumberTable = [
12
+  { field: 'platNumber', header: 'Plat Kendaraan' },
13
+  { field: 'typeVehicle', header: 'Jenis Kendaraan' },
14
+]