瀏覽代碼

fix: master member

Muhammad Iqbal Afandi 3 年之前
父節點
當前提交
6e42c0b6b8

+ 78
- 11
app/Http/Controllers/MemberController.php 查看文件

@@ -59,7 +59,8 @@ class MemberController extends Controller
59 59
                     'maxVehicles' => $typeMember->fresh()->maxVehicles->transform(fn($maxVehicle) => [
60 60
                         'value' => $maxVehicle->id,
61 61
                         'label' => $maxVehicle->typeVehicle->type,
62
-                        'max' => $maxVehicle->max,
62
+                        'maxVehicle' => $maxVehicle->max,
63
+                        'typeVehicleId' => $maxVehicle->typeVehicle->id,
63 64
                     ]),
64 65
                 ])->first()
65 66
             ),
@@ -105,10 +106,10 @@ class MemberController extends Controller
105 106
             DB::commit();
106 107
 
107 108
             return back()->with('success', __('messages.success.store.member'));
108
-        } catch (QueryException $e) {
109
+        } catch (QueryException $qe) {
109 110
             DB::rollBack();
110 111
 
111
-            return back()->with('success', __('messages.error.store.member'));
112
+            return back()->with('error', __('messages.error.store.member'));
112 113
         }
113 114
     }
114 115
 
@@ -131,11 +132,45 @@ class MemberController extends Controller
131 132
      */
132 133
     public function edit(Member $member)
133 134
     {
135
+        if (request('id')) {
136
+            $typeMember = $member->typeMember->filter(request('id'))->first();
137
+        } else {
138
+            $typeMember = $member->typeMember;
139
+        }
140
+
134 141
         return inertia('member/Edit', [
135 142
             'member' => [
136 143
                 'id' => $member->id,
137 144
                 'name' => $member->name,
138 145
                 'phone' => $member->phone,
146
+                'typeMemberId' => $member->type_member_id,
147
+                'vehicles' => $member->vehicles->transform(fn($vehicle) => [
148
+                    'platNumber' => $vehicle->plat_number,
149
+                    'typeVehicle' => $vehicle->typeVehicle->type,
150
+                    'typeVehicleId' => $vehicle->typeVehicle->id,
151
+                    'maxVehicleId' => $member->typeMember->maxVehicles
152
+                        ->where('type_vehicle_id', $vehicle->typeVehicle->id)
153
+                        ->pluck('id')[0],
154
+                    'maxVehicle' => $member->typeMember->maxVehicles
155
+                        ->where('type_vehicle_id', $vehicle->typeVehicle->id)
156
+                        ->pluck('max')[0],
157
+                ]),
158
+            ],
159
+            'typeMembers' => TypeMember::get()->transform(fn($typeMember) => [
160
+                'label' => $typeMember->type,
161
+                'value' => $typeMember->id,
162
+            ]),
163
+            'typeMember' => [
164
+                'type' => $typeMember->type,
165
+                'description' => $typeMember->description,
166
+                'price' => $typeMember->price,
167
+                'max' => $typeMember->maxVehicleDetail(),
168
+                'maxVehicles' => $typeMember->fresh()->maxVehicles->transform(fn($maxVehicle) => [
169
+                    'value' => $maxVehicle->id,
170
+                    'label' => $maxVehicle->typeVehicle->type,
171
+                    'maxVehicle' => $maxVehicle->max,
172
+                    'typeVehicleId' => $maxVehicle->typeVehicle->id,
173
+                ]),
139 174
             ],
140 175
         ]);
141 176
     }
@@ -149,21 +184,53 @@ class MemberController extends Controller
149 184
      */
150 185
     public function update(UpdateMemberRequest $request, Member $member)
151 186
     {
152
-        $member->update($request->validated());
153
-
154
-        return back()->with('success', __('messages.success.update.member'));
187
+        dd($request);
188
+        // DB::beginTransaction();
189
+
190
+        // try {
191
+        //     $member->update([
192
+        //         'name' => $request->name,
193
+        //         'phone' => $request->phone,
194
+        //         'exp_date' => now()->addDays(30),
195
+        //         'type_member_id' => $request->type_member_id,
196
+        //     ]);
197
+
198
+        //     foreach ($request->vehicles as $vehicle) {
199
+        //         $member->vehicles()->create([
200
+        //             'plat_number' => $vehicle['platNumber'],
201
+        //             'type_vehicle_id' => $vehicle['typeVehicleId'],
202
+        //         ]);
203
+        //     }
204
+
205
+        //     $topUp = $member->topUps()->create([
206
+        //         'amount' => TypeMember::find($request->type_member_id)->getRawOriginal('price'),
207
+        //         'exp_date' => now()->addDays(30),
208
+        //         'user_id' => auth()->user()->id,
209
+        //     ]);
210
+
211
+        //     $topUp->mutation()->create([
212
+        //         'type' => 1,
213
+        //         'amount' => TypeMember::find($request->type_member_id)->getRawOriginal('price'),
214
+        //     ]);
215
+
216
+        //     DB::commit();
217
+
218
+        //     return back()->with('success', __('messages.success.update.member'));
219
+        // } catch (QueryException $qe) {
220
+        //     DB::rollBack();
221
+
222
+        //     return back()->with('error', __('messages.error.update'));
223
+        // }
155 224
     }
156 225
 
157 226
     /**
158 227
      * Remove the specified resource from storage.
159 228
      *
160
-     * @param  Member  $member
229
+     * @param  int  $id
161 230
      * @return \Illuminate\Http\Response
162 231
      */
163
-    public function destroy(Member $member)
232
+    public function destroy($id)
164 233
     {
165
-        $member->delete();
166
-
167
-        return to_route('members.index')->with('success', __('messages.success.destroy.member'));
234
+        //
168 235
     }
169 236
 }

+ 2
- 0
app/Http/Requests/Member/UpdateMemberRequest.php 查看文件

@@ -26,6 +26,8 @@ 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
+            'vehicles.*.platNumber' => 'unique:vehicles,plat_number',
29 31
         ];
30 32
     }
31 33
 }

+ 101
- 776
composer.lock
文件差異過大導致無法顯示
查看文件


+ 1
- 0
lang/en/messages.php 查看文件

@@ -59,6 +59,7 @@ return [
59 59
         ],
60 60
         'update' => [
61 61
             'type_member' => 'Type member failed to be changed',
62
+            'member' => 'Member failed to be changed',
62 63
         ],
63 64
     ],
64 65
 ];

+ 1
- 0
lang/id/messages.php 查看文件

@@ -59,6 +59,7 @@ return [
59 59
         ],
60 60
         'update' => [
61 61
             'type_member' => 'Jenis member gagal diubah',
62
+            'member' => 'Member gagal diubah',
62 63
         ],
63 64
     ],
64 65
 ];

+ 356
- 395
package-lock.json
文件差異過大導致無法顯示
查看文件


+ 84
- 65
public/js/resources_js_pages_member_Create_vue.js 查看文件

@@ -517,7 +517,6 @@ __webpack_require__.r(__webpack_exports__);
517 517
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
518 518
   props: {
519 519
     typeMembers: Array,
520
-    typeVehicles: Array,
521 520
     typeMember: Object
522 521
   },
523 522
   setup: function setup(__props, _ref) {
@@ -542,45 +541,63 @@ __webpack_require__.r(__webpack_exports__);
542 541
     };
543 542
 
544 543
     var addPlatNumber = function addPlatNumber() {
545
-      console.log(props.typeMember.maxVehicles); //   form.clearErrors('plat_number', 'type_vehicle_id')
546
-      //   if (!form.plat_number) {
547
-      //     form.setError('plat_number', 'Plat kendaraan tidak boleh kosong')
548
-      //     return
549
-      //   }
550
-      //   if (!form.type_vehicle_id) {
551
-      //     form.setError('type_vehicle_id', 'Tidak boleh kosong')
552
-      //     return
553
-      //   }
554
-      //   const listPlatNumberExist = listPlatNumber.filter((val) => val.platNumber === form.plat_number.toUpperCase())
555
-      //   if (listPlatNumberExist.length) {
556
-      //     form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama')
557
-      //     return
558
-      //   }
559
-      //   if (listPlatNumber.length + 1 > props.typeMember.max) {
560
-      //     form.setError('plat_number', 'Melibihi batas maksimal kendaraan')
561
-      //     return
562
-      //   }
563
-      //   const typeVehicleFilter = props.typeVehicles.filter((val) => val.value === form.type_vehicle_id)[0]
564
-      //   listPlatNumber.push({
565
-      //     platNumber: form.plat_number.toUpperCase(),
566
-      //     typeVehicle: typeVehicleFilter.label,
567
-      //     typeVehicleId: typeVehicleFilter.value,
568
-      //   })
569
-      //   form.reset('plat_number', 'type_vehicle_id')
544
+      form.clearErrors('plat_number', 'max_vehicle_id');
545
+
546
+      if (!form.plat_number) {
547
+        form.setError('plat_number', 'Plat kendaraan tidak boleh kosong');
548
+        return;
549
+      }
550
+
551
+      if (!form.max_vehicle_id) {
552
+        form.setError('max_vehicle_id', 'Tidak boleh kosong');
553
+        return;
554
+      }
555
+
556
+      var listPlatNumberExist = listPlatNumber.filter(function (val) {
557
+        return val.platNumber === form.plat_number.toUpperCase();
558
+      });
559
+
560
+      if (listPlatNumberExist.length) {
561
+        form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama');
562
+        return;
563
+      }
564
+
565
+      var maxVehicles = listPlatNumber.filter(function (val) {
566
+        return val.maxVehicleId === form.max_vehicle_id;
567
+      });
568
+
569
+      if (maxVehicles.length) {
570
+        if (maxVehicles.length + 1 > maxVehicles[0].maxVehicle) {
571
+          form.setError('plat_number', 'Melibihi batas maksimal kendaraan');
572
+          return;
573
+        }
574
+      }
575
+
576
+      var typeVehicle = props.typeMember.maxVehicles.filter(function (val) {
577
+        return val.value === form.max_vehicle_id;
578
+      })[0];
579
+      listPlatNumber.push({
580
+        platNumber: form.plat_number.toUpperCase(),
581
+        typeVehicle: typeVehicle.label,
582
+        typeVehicleId: typeVehicle.typeVehicleId,
583
+        maxVehicleId: typeVehicle.value,
584
+        maxVehicle: typeVehicle.maxVehicle
585
+      });
586
+      form.reset('plat_number', 'max_vehicle_id');
570 587
     };
571 588
 
572 589
     var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm)({
573 590
       name: null,
574 591
       phone: null,
575 592
       plat_number: null,
576
-      type_vehicle_id: null,
593
+      max_vehicle_id: null,
577 594
       type_member_id: null
578 595
     });
579 596
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(function () {
580 597
       return form.type_member_id;
581 598
     }, function () {
582 599
       listPlatNumberClear();
583
-      form.reset('plat_number', 'type_vehicle_id');
600
+      form.reset('plat_number', 'max_vehicle_id');
584 601
       _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia.reload({
585 602
         only: ['typeMember'],
586 603
         data: {
@@ -1302,69 +1319,72 @@ var _hoisted_7 = {
1302 1319
   "class": "col-12 md:col-6"
1303 1320
 };
1304 1321
 var _hoisted_8 = {
1305
-  "class": "col-12 md:col-4"
1322
+  "class": "gri"
1323
+};
1324
+var _hoisted_9 = {
1325
+  "class": "col-12 md:col-8"
1306 1326
 };
1307 1327
 
1308
-var _hoisted_9 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)("Detail Harga");
1328
+var _hoisted_10 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)("Detail Harga");
1309 1329
 
1310
-var _hoisted_10 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1330
+var _hoisted_11 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1311 1331
   "class": "text-base font-bold mb-0"
1312 1332
 }, "Jenis Member", -1
1313 1333
 /* HOISTED */
1314 1334
 );
1315 1335
 
1316
-var _hoisted_11 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1336
+var _hoisted_12 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1317 1337
   "class": "text-base font-bold mb-0"
1318 1338
 }, "Batas Maksimal Kendaraan", -1
1319 1339
 /* HOISTED */
1320 1340
 );
1321 1341
 
1322
-var _hoisted_12 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1342
+var _hoisted_13 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1323 1343
   "class": "text-base font-bold mb-0"
1324 1344
 }, "Keterangan", -1
1325 1345
 /* HOISTED */
1326 1346
 );
1327 1347
 
1328
-var _hoisted_13 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1348
+var _hoisted_14 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1329 1349
   "class": "text-base font-bold mb-0"
1330 1350
 }, "Tarif Member", -1
1331 1351
 /* HOISTED */
1332 1352
 );
1333 1353
 
1334
-var _hoisted_14 = {
1354
+var _hoisted_15 = {
1335 1355
   key: 0,
1336 1356
   "class": "grid"
1337 1357
 };
1338
-var _hoisted_15 = {
1339
-  "class": "col-12 md:col-8"
1340
-};
1341 1358
 var _hoisted_16 = {
1342
-  "class": "grid"
1359
+  "class": "col-12 md:col-8"
1343 1360
 };
1344 1361
 var _hoisted_17 = {
1345
-  "class": "col-12 md:col-6"
1362
+  "class": "grid"
1346 1363
 };
1347 1364
 var _hoisted_18 = {
1348 1365
   "class": "col-12 md:col-6"
1349 1366
 };
1350 1367
 var _hoisted_19 = {
1351
-  "class": "col-12 mb-3 md:mb-0"
1368
+  "class": "col-12 md:col-6"
1352 1369
 };
1353 1370
 var _hoisted_20 = {
1354
-  "class": "flex flex-column md:flex-row md:align-items-center justify-content-end"
1371
+  "class": "col-12 mb-3 md:mb-0"
1355 1372
 };
1356 1373
 var _hoisted_21 = {
1357
-  "class": "col-12"
1374
+  "class": "flex flex-column md:flex-row md:align-items-center justify-content-end"
1358 1375
 };
1359 1376
 var _hoisted_22 = {
1377
+  "class": "col-12"
1378
+};
1379
+var _hoisted_23 = {
1360 1380
   style: {
1361 1381
     "color": "#b71c1c"
1362 1382
   }
1363 1383
 };
1364
-var _hoisted_23 = {
1384
+var _hoisted_24 = {
1365 1385
   "class": "flex justify-content-end"
1366 1386
 };
1367
-var _hoisted_24 = {
1387
+var _hoisted_25 = {
1368 1388
   "class": "flex flex-column md:flex-row justify-content-end"
1369 1389
 };
1370 1390
 function render(_ctx, _cache, $props, $setup, $data, $options) {
@@ -1421,11 +1441,11 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1421 1441
         _: 1
1422 1442
         /* STABLE */
1423 1443
 
1424
-      })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, {
1444
+      })])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, {
1425 1445
         "class": "bg-primary"
1426 1446
       }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createSlots)({
1427 1447
         title: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1428
-          return [_hoisted_9];
1448
+          return [_hoisted_10];
1429 1449
         }),
1430 1450
         _: 2
1431 1451
         /* DYNAMIC */
@@ -1433,21 +1453,21 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1433 1453
       }, [$props.typeMember ? {
1434 1454
         name: "content",
1435 1455
         fn: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1436
-          return [_hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.type), 1
1456
+          return [_hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.type), 1
1437 1457
           /* TEXT */
1438
-          ), _hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.max), 1
1458
+          ), _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.max), 1
1439 1459
           /* TEXT */
1440
-          ), _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.description), 1
1460
+          ), _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.description), 1
1441 1461
           /* TEXT */
1442
-          ), _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.price), 1
1462
+          ), _hoisted_14, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.price), 1
1443 1463
           /* TEXT */
1444 1464
           )];
1445 1465
         })
1446 1466
       } : undefined]), 1024
1447 1467
       /* DYNAMIC_SLOTS */
1448
-      )])]), $props.typeMember ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, null, {
1468
+      )])]), $props.typeMember ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, null, {
1449 1469
         content: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1450
-          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputText"], {
1470
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputText"], {
1451 1471
             modelValue: $setup.form.plat_number,
1452 1472
             "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) {
1453 1473
               return $setup.form.plat_number = $event;
@@ -1458,19 +1478,19 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1458 1478
             error: $setup.form.errors.plat_number
1459 1479
           }, null, 8
1460 1480
           /* PROPS */
1461
-          , ["modelValue", "disabled", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1462
-            modelValue: $setup.form.type_vehicle_id,
1481
+          , ["modelValue", "disabled", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1482
+            modelValue: $setup.form.max_vehicle_id,
1463 1483
             "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) {
1464
-              return $setup.form.type_vehicle_id = $event;
1484
+              return $setup.form.max_vehicle_id = $event;
1465 1485
             }),
1466 1486
             label: "Jenis Kendaraan",
1467 1487
             placeholder: "jenis kendaraan",
1468 1488
             disabled: !$setup.form.type_member_id,
1469 1489
             options: $props.typeMember.maxVehicles,
1470
-            error: $setup.form.errors.type_vehicle_id
1490
+            error: $setup.form.errors.max_vehicle_id
1471 1491
           }, null, 8
1472 1492
           /* PROPS */
1473
-          , ["modelValue", "disabled", "options", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1493
+          , ["modelValue", "disabled", "options", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1474 1494
             label: "Tambah",
1475 1495
             "class": "p-button-outlined",
1476 1496
             icon: "pi pi-car",
@@ -1478,7 +1498,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1478 1498
             onClick: $setup.addPlatNumber
1479 1499
           }, null, 8
1480 1500
           /* PROPS */
1481
-          , ["disabled"])])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1501
+          , ["disabled"])])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1482 1502
             "striped-rows": "",
1483 1503
             "row-hover": "",
1484 1504
             "responsive-layout": "scroll",
@@ -1500,7 +1520,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1500 1520
               )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1501 1521
                 body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1502 1522
                   var index = _ref.index;
1503
-                  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
1523
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_23, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.$page.props.errors["vehicles.".concat(index, ".platNumber")]), 1
1504 1524
                   /* TEXT */
1505 1525
                   )];
1506 1526
                 }),
@@ -1509,15 +1529,14 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1509 1529
 
1510 1530
               }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1511 1531
                 body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref2) {
1512
-                  var index = _ref2.index,
1513
-                      data = _ref2.data;
1514
-                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1532
+                  var index = _ref2.index;
1533
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1515 1534
                     icon: "pi pi-trash",
1516 1535
                     "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["p-button-rounded p-button-text", {
1517 1536
                       'p-button-danger': _ctx.$page.props.errors["vehicles.".concat(index, ".platNumber")]
1518 1537
                     }]),
1519 1538
                     onClick: function onClick($event) {
1520
-                      return $setup.listPlatNumberOnDelete(data.platNumber);
1539
+                      return $setup.listPlatNumberOnDelete(index);
1521 1540
                     }
1522 1541
                   }, null, 8
1523 1542
                   /* PROPS */
@@ -1536,7 +1555,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1536 1555
           , ["value"])])])];
1537 1556
         }),
1538 1557
         footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1539
-          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1558
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1540 1559
             label: "Simpan",
1541 1560
             icon: "pi pi-check",
1542 1561
             "class": "p-button-outlined",

+ 577
- 25
public/js/resources_js_pages_member_Edit_vue.js 查看文件

@@ -45,6 +45,97 @@ __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
+
48 139
 /***/ "./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":
49 140
 /*!*****************************************************************************************************************************************************************************************************************!*\
50 141
   !*** ./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 ***!
@@ -458,7 +549,11 @@ __webpack_require__.r(__webpack_exports__);
458 549
 /* harmony import */ var _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @inertiajs/inertia-vue3 */ "./node_modules/@inertiajs/inertia-vue3/dist/index.js");
459 550
 /* harmony import */ var _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/layouts/AppLayout.vue */ "./resources/js/layouts/AppLayout.vue");
460 551
 /* harmony import */ var _components_AppDialog_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/AppDialog.vue */ "./resources/js/components/AppDialog.vue");
461
-/* harmony import */ var _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/AppInputText.vue */ "./resources/js/components/AppInputText.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
+/* harmony import */ var _TableHeader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TableHeader */ "./resources/js/pages/member/TableHeader.js");
555
+
556
+
462 557
 
463 558
 
464 559
 
@@ -467,7 +562,9 @@ __webpack_require__.r(__webpack_exports__);
467 562
 
468 563
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
469 564
   props: {
470
-    member: Object
565
+    member: Object,
566
+    typeMembers: Array,
567
+    typeMember: Object
471 568
   },
472 569
   setup: function setup(__props, _ref) {
473 570
     var expose = _ref.expose;
@@ -479,6 +576,68 @@ __webpack_require__.r(__webpack_exports__);
479 576
     (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(errors, function () {
480 577
       form.clearErrors();
481 578
     });
579
+    (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(function () {
580
+      props.member.vehicles.forEach(function (val) {
581
+        return listPlatNumber.push(val);
582
+      });
583
+    });
584
+    var listPlatNumber = (0,vue__WEBPACK_IMPORTED_MODULE_0__.reactive)([]);
585
+
586
+    var listPlatNumberClear = function listPlatNumberClear() {
587
+      listPlatNumber.splice(0);
588
+    };
589
+
590
+    var listPlatNumberOnDelete = function listPlatNumberOnDelete(index) {
591
+      listPlatNumber.splice(index, 1);
592
+      (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.usePage)().props.value.errors = {};
593
+    };
594
+
595
+    var addPlatNumber = function addPlatNumber() {
596
+      form.clearErrors('plat_number', 'max_vehicle_id');
597
+
598
+      if (!form.plat_number) {
599
+        form.setError('plat_number', 'Plat kendaraan tidak boleh kosong');
600
+        return;
601
+      }
602
+
603
+      if (!form.max_vehicle_id) {
604
+        form.setError('max_vehicle_id', 'Tidak boleh kosong');
605
+        return;
606
+      }
607
+
608
+      var listPlatNumberExist = listPlatNumber.filter(function (val) {
609
+        return val.platNumber === form.plat_number.toUpperCase();
610
+      });
611
+
612
+      if (listPlatNumberExist.length) {
613
+        form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama');
614
+        return;
615
+      }
616
+
617
+      var maxVehicles = listPlatNumber.filter(function (val) {
618
+        return val.maxVehicleId === form.max_vehicle_id;
619
+      });
620
+
621
+      if (maxVehicles.length) {
622
+        if (maxVehicles.length + 1 > maxVehicles[0].maxVehicle) {
623
+          form.setError('plat_number', 'Melibihi batas maksimal kendaraan');
624
+          return;
625
+        }
626
+      }
627
+
628
+      var typeVehicle = props.typeMember.maxVehicles.filter(function (val) {
629
+        return val.value === form.max_vehicle_id;
630
+      })[0];
631
+      listPlatNumber.push({
632
+        platNumber: form.plat_number.toUpperCase(),
633
+        typeVehicle: typeVehicle.label,
634
+        typeVehicleId: typeVehicle.typeVehicleId,
635
+        maxVehicleId: typeVehicle.value,
636
+        maxVehicle: typeVehicle.maxVehicle
637
+      });
638
+      form.reset('plat_number', 'max_vehicle_id');
639
+    };
640
+
482 641
     var visibleDialog = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);
483 642
 
484 643
     var confirmDialog = function confirmDialog() {
@@ -495,16 +654,42 @@ __webpack_require__.r(__webpack_exports__);
495 654
 
496 655
     var form = (0,_inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm)({
497 656
       name: props.member.name,
498
-      phone: props.member.phone
657
+      phone: props.member.phone,
658
+      plat_number: null,
659
+      max_vehicle_id: null,
660
+      type_member_id: props.member.typeMemberId
661
+    });
662
+    (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(function () {
663
+      return form.type_member_id;
664
+    }, function () {
665
+      listPlatNumberClear();
666
+      form.reset('plat_number', 'max_vehicle_id');
667
+      _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia.reload({
668
+        only: ['typeMember'],
669
+        data: {
670
+          id: form.type_member_id
671
+        }
672
+      });
499 673
     });
500 674
 
501 675
     var submit = function submit() {
502
-      form.put(route('members.update', props.member.id));
676
+      form.transform(function (data) {
677
+        return {
678
+          name: data.name,
679
+          phone: data.phone,
680
+          vehicles: listPlatNumber,
681
+          type_member_id: data.type_member_id
682
+        };
683
+      }).put(route('members.update', props.member.id));
503 684
     };
504 685
 
505 686
     var __returned__ = {
506 687
       props: props,
507 688
       errors: errors,
689
+      listPlatNumber: listPlatNumber,
690
+      listPlatNumberClear: listPlatNumberClear,
691
+      listPlatNumberOnDelete: listPlatNumberOnDelete,
692
+      addPlatNumber: addPlatNumber,
508 693
       visibleDialog: visibleDialog,
509 694
       confirmDialog: confirmDialog,
510 695
       onAgree: onAgree,
@@ -514,13 +699,17 @@ __webpack_require__.r(__webpack_exports__);
514 699
       computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed,
515 700
       watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,
516 701
       ref: vue__WEBPACK_IMPORTED_MODULE_0__.ref,
702
+      reactive: vue__WEBPACK_IMPORTED_MODULE_0__.reactive,
703
+      onMounted: vue__WEBPACK_IMPORTED_MODULE_0__.onMounted,
517 704
       Inertia: _inertiajs_inertia__WEBPACK_IMPORTED_MODULE_1__.Inertia,
518 705
       Head: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.Head,
519 706
       useForm: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.useForm,
520 707
       usePage: _inertiajs_inertia_vue3__WEBPACK_IMPORTED_MODULE_2__.usePage,
521 708
       AppLayout: _layouts_AppLayout_vue__WEBPACK_IMPORTED_MODULE_3__["default"],
522 709
       AppDialog: _components_AppDialog_vue__WEBPACK_IMPORTED_MODULE_4__["default"],
523
-      AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_5__["default"]
710
+      AppDropdown: _components_AppDropdown_vue__WEBPACK_IMPORTED_MODULE_5__["default"],
711
+      AppInputText: _components_AppInputText_vue__WEBPACK_IMPORTED_MODULE_6__["default"],
712
+      PlatNumberTable: _TableHeader__WEBPACK_IMPORTED_MODULE_7__.PlatNumberTable
524 713
     };
525 714
     Object.defineProperty(__returned__, '__isScriptSetup', {
526 715
       enumerable: false,
@@ -611,6 +800,87 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
611 800
 
612 801
 /***/ }),
613 802
 
803
+/***/ "./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":
804
+/*!*********************************************************************************************************************************************************************************************************************************************************************************!*\
805
+  !*** ./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 ***!
806
+  \*********************************************************************************************************************************************************************************************************************************************************************************/
807
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
808
+
809
+__webpack_require__.r(__webpack_exports__);
810
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
811
+/* harmony export */   "render": () => (/* binding */ render)
812
+/* harmony export */ });
813
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
814
+
815
+var _hoisted_1 = {
816
+  "class": "field"
817
+};
818
+var _hoisted_2 = ["for"];
819
+var _hoisted_3 = {
820
+  key: 0
821
+};
822
+var _hoisted_4 = {
823
+  key: 1
824
+};
825
+var _hoisted_5 = ["id"];
826
+function render(_ctx, _cache, $props, $setup, $data, $options) {
827
+  var _component_Dropdown = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Dropdown");
828
+
829
+  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", {
830
+    key: 0,
831
+    "for": $setup.forLabel
832
+  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.label), 9
833
+  /* TEXT, PROPS */
834
+  , _hoisted_2)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Dropdown, {
835
+    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["w-full", {
836
+      'p-invalid': $setup.isError
837
+    }]),
838
+    id: $setup.forLabel,
839
+    "aria-describedby": $setup.ariaDescribedbyLabel,
840
+    "option-disabled": $props.optionDisabled,
841
+    "option-label": $props.optionLabel,
842
+    "option-value": $props.optionValue,
843
+    placeholder: $props.placeholder,
844
+    options: $props.options,
845
+    "model-value": $props.modelValue,
846
+    disabled: $props.disabled,
847
+    onChange: _cache[0] || (_cache[0] = function ($event) {
848
+      return _ctx.$emit('update:modelValue', $event.value);
849
+    })
850
+  }, {
851
+    value: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (slotProps) {
852
+      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
853
+      /* TEXT */
854
+      )) : ((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
855
+      /* TEXT */
856
+      ))];
857
+    }),
858
+    option: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
859
+      var option = _ref.option,
860
+          index = _ref.index;
861
+      return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "option", {
862
+        option: option,
863
+        index: index
864
+      })];
865
+    }),
866
+    _: 3
867
+    /* FORWARDED */
868
+
869
+  }, 8
870
+  /* PROPS */
871
+  , ["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", {
872
+    key: 1,
873
+    id: $setup.ariaDescribedbyLabel,
874
+    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)({
875
+      'p-error': $setup.isError
876
+    })
877
+  }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.error), 11
878
+  /* TEXT, CLASS, PROPS */
879
+  , _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)]);
880
+}
881
+
882
+/***/ }),
883
+
614 884
 /***/ "./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":
615 885
 /*!*******************************************************************************************************************************************************************************************************************************************************************************!*\
616 886
   !*** ./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 ***!
@@ -1185,18 +1455,88 @@ var _hoisted_6 = {
1185 1455
   "class": "col-12 md:col-6"
1186 1456
 };
1187 1457
 var _hoisted_7 = {
1188
-  "class": "grid"
1458
+  "class": "col-12 md:col-6"
1189 1459
 };
1190 1460
 var _hoisted_8 = {
1191
-  "class": "col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-start"
1461
+  "class": "grid"
1192 1462
 };
1193 1463
 var _hoisted_9 = {
1194
-  "class": "col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-end"
1464
+  "class": "col-12 md:col-8"
1465
+};
1466
+
1467
+var _hoisted_10 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)("Detail Harga");
1468
+
1469
+var _hoisted_11 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1470
+  "class": "text-base font-bold mb-0"
1471
+}, "Jenis Member", -1
1472
+/* HOISTED */
1473
+);
1474
+
1475
+var _hoisted_12 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1476
+  "class": "text-base font-bold mb-0"
1477
+}, "Batas Maksimal Kendaraan", -1
1478
+/* HOISTED */
1479
+);
1480
+
1481
+var _hoisted_13 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1482
+  "class": "text-base font-bold mb-0"
1483
+}, "Keterangan", -1
1484
+/* HOISTED */
1485
+);
1486
+
1487
+var _hoisted_14 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", {
1488
+  "class": "text-base font-bold mb-0"
1489
+}, "Tarif Member", -1
1490
+/* HOISTED */
1491
+);
1492
+
1493
+var _hoisted_15 = {
1494
+  key: 0,
1495
+  "class": "grid"
1496
+};
1497
+var _hoisted_16 = {
1498
+  "class": "col-12 md:col-8"
1499
+};
1500
+var _hoisted_17 = {
1501
+  "class": "grid"
1502
+};
1503
+var _hoisted_18 = {
1504
+  "class": "col-12 md:col-6"
1505
+};
1506
+var _hoisted_19 = {
1507
+  "class": "col-12 md:col-6"
1508
+};
1509
+var _hoisted_20 = {
1510
+  "class": "col-12 mb-3 md:mb-0"
1511
+};
1512
+var _hoisted_21 = {
1513
+  "class": "flex flex-column md:flex-row md:align-items-center justify-content-end"
1514
+};
1515
+var _hoisted_22 = {
1516
+  "class": "col-12"
1517
+};
1518
+var _hoisted_23 = {
1519
+  style: {
1520
+    "color": "#b71c1c"
1521
+  }
1522
+};
1523
+var _hoisted_24 = {
1524
+  "class": "flex justify-content-end"
1525
+};
1526
+var _hoisted_25 = {
1527
+  "class": "grid"
1528
+};
1529
+var _hoisted_26 = {
1530
+  "class": "col-12 flex flex-column md:flex-row justify-content-center md:justify-content-end"
1195 1531
 };
1196 1532
 function render(_ctx, _cache, $props, $setup, $data, $options) {
1533
+  var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card");
1534
+
1197 1535
   var _component_Button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Button");
1198 1536
 
1199
-  var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card");
1537
+  var _component_Column = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Column");
1538
+
1539
+  var _component_DataTable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("DataTable");
1200 1540
 
1201 1541
   return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["Head"], {
1202 1542
     title: "Ubah Member"
@@ -1227,25 +1567,137 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1227 1567
             error: $setup.form.errors.phone
1228 1568
           }, null, 8
1229 1569
           /* PROPS */
1230
-          , ["modelValue", "error"])])])];
1570
+          , ["modelValue", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1571
+            label: "Jenis member",
1572
+            placeholder: "pilih satu",
1573
+            modelValue: $setup.form.type_member_id,
1574
+            "onUpdate:modelValue": _cache[2] || (_cache[2] = function ($event) {
1575
+              return $setup.form.type_member_id = $event;
1576
+            }),
1577
+            options: $props.typeMembers,
1578
+            error: $setup.form.errors.type_member_id
1579
+          }, null, 8
1580
+          /* PROPS */
1581
+          , ["modelValue", "options", "error"])])])];
1231 1582
         }),
1232
-        footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
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"], {
1234
-            message: "Yakin akan menghapus data ini?",
1235
-            visible: $setup.visibleDialog,
1236
-            "onUpdate:visible": _cache[2] || (_cache[2] = function ($event) {
1237
-              return $setup.visibleDialog = $event;
1583
+        _: 1
1584
+        /* STABLE */
1585
+
1586
+      })])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, {
1587
+        "class": "bg-primary"
1588
+      }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createSlots)({
1589
+        title: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1590
+          return [_hoisted_10];
1591
+        }),
1592
+        _: 2
1593
+        /* DYNAMIC */
1594
+
1595
+      }, [$props.typeMember ? {
1596
+        name: "content",
1597
+        fn: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1598
+          return [_hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.type), 1
1599
+          /* TEXT */
1600
+          ), _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.max), 1
1601
+          /* TEXT */
1602
+          ), _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.description), 1
1603
+          /* TEXT */
1604
+          ), _hoisted_14, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.typeMember.price), 1
1605
+          /* TEXT */
1606
+          )];
1607
+        })
1608
+      } : undefined]), 1024
1609
+      /* DYNAMIC_SLOTS */
1610
+      )])]), $props.typeMember ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, null, {
1611
+        content: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1612
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppInputText"], {
1613
+            modelValue: $setup.form.plat_number,
1614
+            "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) {
1615
+              return $setup.form.plat_number = $event;
1616
+            }),
1617
+            label: "Plat Kendaraan",
1618
+            placeholder: "plat kendaraan",
1619
+            disabled: !$setup.form.type_member_id,
1620
+            error: $setup.form.errors.plat_number
1621
+          }, null, 8
1622
+          /* PROPS */
1623
+          , ["modelValue", "disabled", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup["AppDropdown"], {
1624
+            modelValue: $setup.form.max_vehicle_id,
1625
+            "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) {
1626
+              return $setup.form.max_vehicle_id = $event;
1238 1627
             }),
1239
-            onAgree: $setup.onAgree,
1240
-            onCancel: $setup.onCancel
1628
+            label: "Jenis Kendaraan",
1629
+            placeholder: "jenis kendaraan",
1630
+            disabled: !$setup.form.type_member_id,
1631
+            options: $props.typeMember.maxVehicles,
1632
+            error: $setup.form.errors.max_vehicle_id
1241 1633
           }, null, 8
1242 1634
           /* PROPS */
1243
-          , ["visible"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1244
-            label: "Hapus",
1245
-            icon: "pi pi-trash",
1246
-            "class": "p-button-outlined p-button-danger",
1247
-            onClick: $setup.confirmDialog
1248
-          })]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1635
+          , ["modelValue", "disabled", "options", "error"])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1636
+            label: "Tambah",
1637
+            "class": "p-button-outlined",
1638
+            icon: "pi pi-car",
1639
+            disabled: !$setup.form.type_member_id,
1640
+            onClick: $setup.addPlatNumber
1641
+          }, null, 8
1642
+          /* PROPS */
1643
+          , ["disabled"])])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_DataTable, {
1644
+            "striped-rows": "",
1645
+            "row-hover": "",
1646
+            "responsive-layout": "scroll",
1647
+            "column-resize-mode": "expand",
1648
+            "edit-mode": "cell",
1649
+            value: $setup.listPlatNumber
1650
+          }, {
1651
+            "default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1652
+              return [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.PlatNumberTable, function (platNumberTable) {
1653
+                return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_Column, {
1654
+                  field: platNumberTable.field,
1655
+                  header: platNumberTable.header,
1656
+                  key: platNumberTable.field
1657
+                }, null, 8
1658
+                /* PROPS */
1659
+                , ["field", "header"]);
1660
+              }), 128
1661
+              /* KEYED_FRAGMENT */
1662
+              )), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1663
+                body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref) {
1664
+                  var index = _ref.index;
1665
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_23, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.$page.props.errors["vehicles.".concat(index, ".platNumber")]), 1
1666
+                  /* TEXT */
1667
+                  )];
1668
+                }),
1669
+                _: 1
1670
+                /* STABLE */
1671
+
1672
+              }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Column, null, {
1673
+                body: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function (_ref2) {
1674
+                  var index = _ref2.index;
1675
+                  return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1676
+                    icon: "pi pi-trash",
1677
+                    "class": (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(["p-button-rounded p-button-text", {
1678
+                      'p-button-danger': _ctx.$page.props.errors["vehicles.".concat(index, ".platNumber")]
1679
+                    }]),
1680
+                    onClick: function onClick($event) {
1681
+                      return $setup.listPlatNumberOnDelete(index);
1682
+                    }
1683
+                  }, null, 8
1684
+                  /* PROPS */
1685
+                  , ["class", "onClick"])])];
1686
+                }),
1687
+                _: 1
1688
+                /* STABLE */
1689
+
1690
+              })];
1691
+            }),
1692
+            _: 1
1693
+            /* STABLE */
1694
+
1695
+          }, 8
1696
+          /* PROPS */
1697
+          , ["value"])])])];
1698
+        }),
1699
+        footer: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
1700
+          return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_26, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Button, {
1249 1701
             label: "Simpan",
1250 1702
             icon: "pi pi-check",
1251 1703
             "class": "p-button-outlined",
@@ -1258,7 +1710,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1258 1710
         _: 1
1259 1711
         /* STABLE */
1260 1712
 
1261
-      })])])];
1713
+      })])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true)];
1262 1714
     }),
1263 1715
     _: 1
1264 1716
     /* STABLE */
@@ -1270,6 +1722,49 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1270 1722
 
1271 1723
 /***/ }),
1272 1724
 
1725
+/***/ "./resources/js/pages/member/TableHeader.js":
1726
+/*!**************************************************!*\
1727
+  !*** ./resources/js/pages/member/TableHeader.js ***!
1728
+  \**************************************************/
1729
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1730
+
1731
+__webpack_require__.r(__webpack_exports__);
1732
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1733
+/* harmony export */   "IndexTable": () => (/* binding */ IndexTable),
1734
+/* harmony export */   "PlatNumberTable": () => (/* binding */ PlatNumberTable)
1735
+/* harmony export */ });
1736
+var IndexTable = [{
1737
+  field: 'updatedAt',
1738
+  header: 'Diperbaharui'
1739
+}, {
1740
+  field: 'name',
1741
+  header: 'Nama'
1742
+}, {
1743
+  field: 'phone',
1744
+  header: 'Nomor HP'
1745
+}, {
1746
+  field: 'platNumber',
1747
+  header: 'Plat Kendaraan'
1748
+}, {
1749
+  field: 'type',
1750
+  header: 'Jenis Member'
1751
+}, {
1752
+  field: 'price',
1753
+  header: 'Tarif Member'
1754
+}, {
1755
+  field: 'expDate',
1756
+  header: 'Berakhir'
1757
+}];
1758
+var PlatNumberTable = [{
1759
+  field: 'platNumber',
1760
+  header: 'Plat Kendaraan'
1761
+}, {
1762
+  field: 'typeVehicle',
1763
+  header: 'Jenis Kendaraan'
1764
+}];
1765
+
1766
+/***/ }),
1767
+
1273 1768
 /***/ "./resources/js/utils/menu.js":
1274 1769
 /*!************************************!*\
1275 1770
   !*** ./resources/js/utils/menu.js ***!
@@ -1406,6 +1901,33 @@ const __exports__ = /*#__PURE__*/(0,_home_dijitalcode_Projects_parkirin_node_mod
1406 1901
 if (false) {}
1407 1902
 
1408 1903
 
1904
+/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1905
+
1906
+/***/ }),
1907
+
1908
+/***/ "./resources/js/components/AppDropdown.vue":
1909
+/*!*************************************************!*\
1910
+  !*** ./resources/js/components/AppDropdown.vue ***!
1911
+  \*************************************************/
1912
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1913
+
1914
+__webpack_require__.r(__webpack_exports__);
1915
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
1916
+/* harmony export */   "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1917
+/* harmony export */ });
1918
+/* 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");
1919
+/* 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");
1920
+/* 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");
1921
+
1922
+
1923
+
1924
+
1925
+;
1926
+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"]])
1927
+/* hot reload */
1928
+if (false) {}
1929
+
1930
+
1409 1931
 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
1410 1932
 
1411 1933
 /***/ }),
@@ -1637,6 +2159,21 @@ __webpack_require__.r(__webpack_exports__);
1637 2159
 /* 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");
1638 2160
  
1639 2161
 
2162
+/***/ }),
2163
+
2164
+/***/ "./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js":
2165
+/*!************************************************************************************!*\
2166
+  !*** ./resources/js/components/AppDropdown.vue?vue&type=script&setup=true&lang=js ***!
2167
+  \************************************************************************************/
2168
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2169
+
2170
+__webpack_require__.r(__webpack_exports__);
2171
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2172
+/* 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"])
2173
+/* harmony export */ });
2174
+/* 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");
2175
+ 
2176
+
1640 2177
 /***/ }),
1641 2178
 
1642 2179
 /***/ "./resources/js/components/AppInputText.vue?vue&type=script&setup=true&lang=js":
@@ -1757,6 +2294,21 @@ __webpack_require__.r(__webpack_exports__);
1757 2294
 /* 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");
1758 2295
 
1759 2296
 
2297
+/***/ }),
2298
+
2299
+/***/ "./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992":
2300
+/*!*******************************************************************************!*\
2301
+  !*** ./resources/js/components/AppDropdown.vue?vue&type=template&id=ce0d1992 ***!
2302
+  \*******************************************************************************/
2303
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2304
+
2305
+__webpack_require__.r(__webpack_exports__);
2306
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
2307
+/* 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)
2308
+/* harmony export */ });
2309
+/* 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");
2310
+
2311
+
1760 2312
 /***/ }),
1761 2313
 
1762 2314
 /***/ "./resources/js/components/AppFooter.vue?vue&type=template&id=4ab6097e":

+ 25
- 6
public/js/vue.js
文件差異過大導致無法顯示
查看文件


+ 45
- 35
resources/js/pages/member/Create.vue 查看文件

@@ -10,7 +10,6 @@ import { PlatNumberTable } from './TableHeader'
10 10
 
11 11
 const props = defineProps({
12 12
   typeMembers: Array,
13
-  typeVehicles: Array,
14 13
   typeMember: Object,
15 14
 })
16 15
 
@@ -33,40 +32,49 @@ const listPlatNumberOnDelete = (index) => {
33 32
 }
34 33
 
35 34
 const addPlatNumber = () => {
36
-  console.log(props.typeMember.maxVehicles)
37
-
38
-  //   form.clearErrors('plat_number', 'type_vehicle_id')
39
-  //   if (!form.plat_number) {
40
-  //     form.setError('plat_number', 'Plat kendaraan tidak boleh kosong')
41
-  //     return
42
-  //   }
43
-  //   if (!form.type_vehicle_id) {
44
-  //     form.setError('type_vehicle_id', 'Tidak boleh kosong')
45
-  //     return
46
-  //   }
47
-  //   const listPlatNumberExist = listPlatNumber.filter((val) => val.platNumber === form.plat_number.toUpperCase())
48
-  //   if (listPlatNumberExist.length) {
49
-  //     form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama')
50
-  //     return
51
-  //   }
52
-  //   if (listPlatNumber.length + 1 > props.typeMember.max) {
53
-  //     form.setError('plat_number', 'Melibihi batas maksimal kendaraan')
54
-  //     return
55
-  //   }
56
-  //   const typeVehicleFilter = props.typeVehicles.filter((val) => val.value === form.type_vehicle_id)[0]
57
-  //   listPlatNumber.push({
58
-  //     platNumber: form.plat_number.toUpperCase(),
59
-  //     typeVehicle: typeVehicleFilter.label,
60
-  //     typeVehicleId: typeVehicleFilter.value,
61
-  //   })
62
-  //   form.reset('plat_number', 'type_vehicle_id')
35
+  form.clearErrors('plat_number', 'max_vehicle_id')
36
+
37
+  if (!form.plat_number) {
38
+    form.setError('plat_number', 'Plat kendaraan tidak boleh kosong')
39
+    return
40
+  }
41
+
42
+  if (!form.max_vehicle_id) {
43
+    form.setError('max_vehicle_id', 'Tidak boleh kosong')
44
+    return
45
+  }
46
+
47
+  const listPlatNumberExist = listPlatNumber.filter((val) => val.platNumber === form.plat_number.toUpperCase())
48
+  if (listPlatNumberExist.length) {
49
+    form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama')
50
+    return
51
+  }
52
+
53
+  const maxVehicles = listPlatNumber.filter((val) => val.maxVehicleId === form.max_vehicle_id)
54
+  if (maxVehicles.length) {
55
+    if (maxVehicles.length + 1 > maxVehicles[0].maxVehicle) {
56
+      form.setError('plat_number', 'Melibihi batas maksimal kendaraan')
57
+      return
58
+    }
59
+  }
60
+
61
+  const typeVehicle = props.typeMember.maxVehicles.filter((val) => val.value === form.max_vehicle_id)[0]
62
+  listPlatNumber.push({
63
+    platNumber: form.plat_number.toUpperCase(),
64
+    typeVehicle: typeVehicle.label,
65
+    typeVehicleId: typeVehicle.typeVehicleId,
66
+    maxVehicleId: typeVehicle.value,
67
+    maxVehicle: typeVehicle.maxVehicle,
68
+  })
69
+
70
+  form.reset('plat_number', 'max_vehicle_id')
63 71
 }
64 72
 
65 73
 const form = useForm({
66 74
   name: null,
67 75
   phone: null,
68 76
   plat_number: null,
69
-  type_vehicle_id: null,
77
+  max_vehicle_id: null,
70 78
   type_member_id: null,
71 79
 })
72 80
 
@@ -74,7 +82,7 @@ watch(
74 82
   () => form.type_member_id,
75 83
   () => {
76 84
     listPlatNumberClear()
77
-    form.reset('plat_number', 'type_vehicle_id')
85
+    form.reset('plat_number', 'max_vehicle_id')
78 86
 
79 87
     Inertia.reload({ only: ['typeMember'], data: { id: form.type_member_id } })
80 88
   }
@@ -132,8 +140,10 @@ const submit = () => {
132 140
           </template>
133 141
         </Card>
134 142
       </div>
143
+    </div>
135 144
 
136
-      <div class="col-12 md:col-4">
145
+    <div class="gri">
146
+      <div class="col-12 md:col-8">
137 147
         <Card class="bg-primary">
138 148
           <template #title>Detail Harga</template>
139 149
           <template v-if="typeMember" #content>
@@ -171,12 +181,12 @@ const submit = () => {
171 181
               </div>
172 182
               <div class="col-12 md:col-6">
173 183
                 <AppDropdown
174
-                  v-model="form.type_vehicle_id"
184
+                  v-model="form.max_vehicle_id"
175 185
                   label="Jenis Kendaraan"
176 186
                   placeholder="jenis kendaraan"
177 187
                   :disabled="!form.type_member_id"
178 188
                   :options="typeMember.maxVehicles"
179
-                  :error="form.errors.type_vehicle_id"
189
+                  :error="form.errors.max_vehicle_id"
180 190
                 />
181 191
               </div>
182 192
               <div class="col-12 mb-3 md:mb-0">
@@ -213,13 +223,13 @@ const submit = () => {
213 223
                   </Column>
214 224
 
215 225
                   <Column>
216
-                    <template #body="{ index, data }">
226
+                    <template #body="{ index }">
217 227
                       <div class="flex justify-content-end">
218 228
                         <Button
219 229
                           icon="pi pi-trash"
220 230
                           class="p-button-rounded p-button-text"
221 231
                           :class="{ 'p-button-danger': $page.props.errors[`vehicles.${index}.platNumber`] }"
222
-                          @click="listPlatNumberOnDelete(data.platNumber)"
232
+                          @click="listPlatNumberOnDelete(index)"
223 233
                         />
224 234
                       </div>
225 235
                     </template>

+ 189
- 16
resources/js/pages/member/Edit.vue 查看文件

@@ -1,13 +1,18 @@
1 1
 <script setup>
2
-import { computed, watch, ref } from 'vue'
2
+import { computed, watch, ref, reactive, onMounted } from 'vue'
3 3
 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'
7 8
 import AppInputText from '@/components/AppInputText.vue'
8 9
 
10
+import { PlatNumberTable } from './TableHeader'
11
+
9 12
 const props = defineProps({
10 13
   member: Object,
14
+  typeMembers: Array,
15
+  typeMember: Object,
11 16
 })
12 17
 
13 18
 const errors = computed(() => usePage().props.value.errors)
@@ -16,6 +21,61 @@ watch(errors, () => {
16 21
   form.clearErrors()
17 22
 })
18 23
 
24
+onMounted(() => {
25
+  props.member.vehicles.forEach((val) => listPlatNumber.push(val))
26
+})
27
+
28
+const listPlatNumber = reactive([])
29
+
30
+const listPlatNumberClear = () => {
31
+  listPlatNumber.splice(0)
32
+}
33
+
34
+const listPlatNumberOnDelete = (index) => {
35
+  listPlatNumber.splice(index, 1)
36
+
37
+  usePage().props.value.errors = {}
38
+}
39
+
40
+const addPlatNumber = () => {
41
+  form.clearErrors('plat_number', 'max_vehicle_id')
42
+
43
+  if (!form.plat_number) {
44
+    form.setError('plat_number', 'Plat kendaraan tidak boleh kosong')
45
+    return
46
+  }
47
+
48
+  if (!form.max_vehicle_id) {
49
+    form.setError('max_vehicle_id', 'Tidak boleh kosong')
50
+    return
51
+  }
52
+
53
+  const listPlatNumberExist = listPlatNumber.filter((val) => val.platNumber === form.plat_number.toUpperCase())
54
+  if (listPlatNumberExist.length) {
55
+    form.setError('plat_number', 'Nomor plat kendaraan tidak boleh sama')
56
+    return
57
+  }
58
+
59
+  const maxVehicles = listPlatNumber.filter((val) => val.maxVehicleId === form.max_vehicle_id)
60
+  if (maxVehicles.length) {
61
+    if (maxVehicles.length + 1 > maxVehicles[0].maxVehicle) {
62
+      form.setError('plat_number', 'Melibihi batas maksimal kendaraan')
63
+      return
64
+    }
65
+  }
66
+
67
+  const typeVehicle = props.typeMember.maxVehicles.filter((val) => val.value === form.max_vehicle_id)[0]
68
+  listPlatNumber.push({
69
+    platNumber: form.plat_number.toUpperCase(),
70
+    typeVehicle: typeVehicle.label,
71
+    typeVehicleId: typeVehicle.typeVehicleId,
72
+    maxVehicleId: typeVehicle.value,
73
+    maxVehicle: typeVehicle.maxVehicle,
74
+  })
75
+
76
+  form.reset('plat_number', 'max_vehicle_id')
77
+}
78
+
19 79
 const visibleDialog = ref(false)
20 80
 
21 81
 const confirmDialog = () => {
@@ -29,10 +89,30 @@ const onCancel = () => (visibleDialog.value = false)
29 89
 const form = useForm({
30 90
   name: props.member.name,
31 91
   phone: props.member.phone,
92
+  plat_number: null,
93
+  max_vehicle_id: null,
94
+  type_member_id: props.member.typeMemberId,
32 95
 })
33 96
 
97
+watch(
98
+  () => form.type_member_id,
99
+  () => {
100
+    listPlatNumberClear()
101
+    form.reset('plat_number', 'max_vehicle_id')
102
+
103
+    Inertia.reload({ only: ['typeMember'], data: { id: form.type_member_id } })
104
+  }
105
+)
106
+
34 107
 const submit = () => {
35
-  form.put(route('members.update', props.member.id))
108
+  form
109
+    .transform((data) => ({
110
+      name: data.name,
111
+      phone: data.phone,
112
+      vehicles: listPlatNumber,
113
+      type_member_id: data.type_member_id,
114
+    }))
115
+    .put(route('members.update', props.member.id))
36 116
 }
37 117
 </script>
38 118
 
@@ -53,28 +133,121 @@ const submit = () => {
53 133
               <div class="col-12 md:col-6">
54 134
                 <AppInputText v-model="form.phone" label="Nomor HP" placeholder="nomor hp" :error="form.errors.phone" />
55 135
               </div>
136
+
137
+              <div class="col-12 md:col-6">
138
+                <AppDropdown
139
+                  label="Jenis member"
140
+                  placeholder="pilih satu"
141
+                  v-model="form.type_member_id"
142
+                  :options="typeMembers"
143
+                  :error="form.errors.type_member_id"
144
+                />
145
+              </div>
56 146
             </div>
57 147
           </template>
148
+        </Card>
149
+      </div>
150
+    </div>
151
+
152
+    <div class="grid">
153
+      <div class="col-12 md:col-8">
154
+        <Card class="bg-primary">
155
+          <template #title>Detail Harga</template>
156
+          <template v-if="typeMember" #content>
157
+            <h3 class="text-base font-bold mb-0">Jenis Member</h3>
158
+            <p>{{ typeMember.type }}</p>
159
+
160
+            <h3 class="text-base font-bold mb-0">Batas Maksimal Kendaraan</h3>
161
+            <p>{{ typeMember.max }}</p>
162
+
163
+            <h3 class="text-base font-bold mb-0">Keterangan</h3>
164
+            <p>
165
+              {{ typeMember.description }}
166
+            </p>
167
+
168
+            <h3 class="text-base font-bold mb-0">Tarif Member</h3>
169
+            <p>{{ typeMember.price }}</p>
170
+          </template>
171
+        </Card>
172
+      </div>
173
+    </div>
58 174
 
59
-          <template #footer>
175
+    <div v-if="typeMember" class="grid">
176
+      <div class="col-12 md:col-8">
177
+        <Card>
178
+          <template #content>
60 179
             <div class="grid">
61
-              <div class="col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-start">
62
-                <AppDialog
63
-                  message="Yakin akan menghapus data ini?"
64
-                  v-model:visible="visibleDialog"
65
-                  @agree="onAgree"
66
-                  @cancel="onCancel"
180
+              <div class="col-12 md:col-6">
181
+                <AppInputText
182
+                  v-model="form.plat_number"
183
+                  label="Plat Kendaraan"
184
+                  placeholder="plat kendaraan"
185
+                  :disabled="!form.type_member_id"
186
+                  :error="form.errors.plat_number"
67 187
                 />
68
-
69
-                <Button
70
-                  label="Hapus"
71
-                  icon="pi pi-trash"
72
-                  class="p-button-outlined p-button-danger"
73
-                  @click="confirmDialog"
188
+              </div>
189
+              <div class="col-12 md:col-6">
190
+                <AppDropdown
191
+                  v-model="form.max_vehicle_id"
192
+                  label="Jenis Kendaraan"
193
+                  placeholder="jenis kendaraan"
194
+                  :disabled="!form.type_member_id"
195
+                  :options="typeMember.maxVehicles"
196
+                  :error="form.errors.max_vehicle_id"
74 197
                 />
75 198
               </div>
199
+              <div class="col-12 mb-3 md:mb-0">
200
+                <div class="flex flex-column md:flex-row md:align-items-center justify-content-end">
201
+                  <Button
202
+                    label="Tambah"
203
+                    class="p-button-outlined"
204
+                    icon="pi pi-car"
205
+                    :disabled="!form.type_member_id"
206
+                    @click="addPlatNumber"
207
+                  />
208
+                </div>
209
+              </div>
210
+              <div class="col-12">
211
+                <DataTable
212
+                  striped-rows
213
+                  row-hover
214
+                  responsive-layout="scroll"
215
+                  column-resize-mode="expand"
216
+                  edit-mode="cell"
217
+                  :value="listPlatNumber"
218
+                >
219
+                  <Column
220
+                    v-for="platNumberTable in PlatNumberTable"
221
+                    :field="platNumberTable.field"
222
+                    :header="platNumberTable.header"
223
+                    :key="platNumberTable.field"
224
+                  />
76 225
 
77
-              <div class="col-12 md:col-6 flex flex-column md:flex-row justify-content-center md:justify-content-end">
226
+                  <Column>
227
+                    <template #body="{ index }">
228
+                      <span style="color: #b71c1c">{{ $page.props.errors[`vehicles.${index}.platNumber`] }}</span>
229
+                    </template>
230
+                  </Column>
231
+
232
+                  <Column>
233
+                    <template #body="{ index }">
234
+                      <div class="flex justify-content-end">
235
+                        <Button
236
+                          icon="pi pi-trash"
237
+                          class="p-button-rounded p-button-text"
238
+                          :class="{ 'p-button-danger': $page.props.errors[`vehicles.${index}.platNumber`] }"
239
+                          @click="listPlatNumberOnDelete(index)"
240
+                        />
241
+                      </div>
242
+                    </template>
243
+                  </Column>
244
+                </DataTable>
245
+              </div>
246
+            </div>
247
+          </template>
248
+          <template #footer>
249
+            <div class="grid">
250
+              <div class="col-12 flex flex-column md:flex-row justify-content-center md:justify-content-end">
78 251
                 <Button
79 252
                   label="Simpan"
80 253
                   icon="pi pi-check"