コミット
f462fe74fd

+ 18
- 18
package-lock.json ファイルの表示

@@ -433,9 +433,9 @@
433 433
       }
434 434
     },
435 435
     "node_modules/@jridgewell/resolve-uri": {
436
-      "version": "3.0.8",
437
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
438
-      "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
436
+      "version": "3.1.0",
437
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
438
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
439 439
       "dev": true,
440 440
       "peer": true,
441 441
       "engines": {
@@ -694,9 +694,9 @@
694 694
       }
695 695
     },
696 696
     "node_modules/caniuse-lite": {
697
-      "version": "1.0.30001361",
698
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001361.tgz",
699
-      "integrity": "sha512-ybhCrjNtkFji1/Wto6SSJKkWk6kZgVQsDq5QI83SafsF6FXv2JB4df9eEdH6g8sdGgqTXrFLjAxqBGgYoU3azQ==",
697
+      "version": "1.0.30001363",
698
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz",
699
+      "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==",
700 700
       "dev": true,
701 701
       "funding": [
702 702
         {
@@ -867,9 +867,9 @@
867 867
       }
868 868
     },
869 869
     "node_modules/electron-to-chromium": {
870
-      "version": "1.4.176",
871
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.176.tgz",
872
-      "integrity": "sha512-92JdgyRlcNDwuy75MjuFSb3clt6DGJ2IXSpg0MCjKd3JV9eSmuUAIyWiGAp/EtT0z2D4rqbYqThQLV90maH3Zw==",
870
+      "version": "1.4.180",
871
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.180.tgz",
872
+      "integrity": "sha512-7at5ash3FD9U5gPa3/wPr6OdiZd/zBjvDZaaHBpcqFOFUhZiWnb7stkqk8xUFL9H9nk7Yok5vCCNK8wyC/+f8A==",
873 873
       "dev": true,
874 874
       "peer": true
875 875
     },
@@ -2392,9 +2392,9 @@
2392 2392
       }
2393 2393
     },
2394 2394
     "@jridgewell/resolve-uri": {
2395
-      "version": "3.0.8",
2396
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
2397
-      "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
2395
+      "version": "3.1.0",
2396
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
2397
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
2398 2398
       "dev": true,
2399 2399
       "peer": true
2400 2400
     },
@@ -2607,9 +2607,9 @@
2607 2607
       }
2608 2608
     },
2609 2609
     "caniuse-lite": {
2610
-      "version": "1.0.30001361",
2611
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001361.tgz",
2612
-      "integrity": "sha512-ybhCrjNtkFji1/Wto6SSJKkWk6kZgVQsDq5QI83SafsF6FXv2JB4df9eEdH6g8sdGgqTXrFLjAxqBGgYoU3azQ==",
2610
+      "version": "1.0.30001363",
2611
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz",
2612
+      "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==",
2613 2613
       "dev": true,
2614 2614
       "peer": true
2615 2615
     },
@@ -2733,9 +2733,9 @@
2733 2733
       }
2734 2734
     },
2735 2735
     "electron-to-chromium": {
2736
-      "version": "1.4.176",
2737
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.176.tgz",
2738
-      "integrity": "sha512-92JdgyRlcNDwuy75MjuFSb3clt6DGJ2IXSpg0MCjKd3JV9eSmuUAIyWiGAp/EtT0z2D4rqbYqThQLV90maH3Zw==",
2736
+      "version": "1.4.180",
2737
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.180.tgz",
2738
+      "integrity": "sha512-7at5ash3FD9U5gPa3/wPr6OdiZd/zBjvDZaaHBpcqFOFUhZiWnb7stkqk8xUFL9H9nk7Yok5vCCNK8wyC/+f8A==",
2739 2739
       "dev": true,
2740 2740
       "peer": true
2741 2741
     },

+ 30
- 6
resources/js/pages/Purchases/Components/Cart.vue ファイルの表示

@@ -1,12 +1,11 @@
1 1
 <script setup>
2
+import { ref } from 'vue'
2 3
 import { IDRCurrencyFormat } from '@/utils/currencyFormat'
4
+import AppInputNumber from '@/components/AppInputNumber.vue'
5
+import AppInputText from '@/components/AppInputText.vue'
3 6
 
4 7
 defineProps({
5 8
   title: String,
6
-  ppn: {
7
-    required: true,
8
-    type: Number,
9
-  },
10 9
   headerTable: {
11 10
     required: true,
12 11
     type: Array,
@@ -17,22 +16,28 @@ defineProps({
17 16
   },
18 17
   checkedPpn: Boolean,
19 18
 })
19
+
20
+const editingRows = ref([])
20 21
 </script>
21 22
 
22 23
 <template>
23 24
   <DataTable
24 25
     responsiveLayout="scroll"
25 26
     columnResizeMode="expand"
27
+    edit-mode="row"
28
+    data-key="number"
26 29
     :value="valueTable"
27 30
     :rowHover="true"
28 31
     :stripedRows="true"
32
+    v-model:editing-rows="editingRows"
33
+    @row-edit-save="$emit('edit', $event)"
29 34
   >
30 35
     <template #header>
31 36
       <h2 class="text-2xl font-bold">{{ title }}</h2>
32 37
 
33 38
       <div class="field-checkbox flex justify-content-end gap-2">
34 39
         <label class="text-sm" for="ppn">
35
-          Semua produk dikenakan PPN {{ ppn }}%
40
+          Semua produk dikenakan PPN {{ $page.props.ppn }}%
36 41
         </label>
37 42
         <input
38 43
           type="checkbox"
@@ -45,9 +50,9 @@ defineProps({
45 50
 
46 51
     <Column
47 52
       v-for="value in headerTable"
53
+      :key="value.field"
48 54
       :field="value.field"
49 55
       :header="value.header"
50
-      :key="value.field"
51 56
     >
52 57
       <template #body="{ data, field }">
53 58
         <template v-if="field === 'price'">
@@ -56,8 +61,27 @@ defineProps({
56 61
 
57 62
         <template v-else> {{ data[field] }} </template>
58 63
       </template>
64
+
65
+      <template #editor="{ data, field }">
66
+        <AppInputNumber
67
+          v-if="field === 'price'"
68
+          label="Harga"
69
+          placeholder="harga"
70
+          v-model="data[field]"
71
+        />
72
+
73
+        <AppInputText
74
+          v-if="field === 'qty'"
75
+          label="Kuantitas"
76
+          placeholder="kuantitas"
77
+          type="number"
78
+          v-model="data[field]"
79
+        />
80
+      </template>
59 81
     </Column>
60 82
 
83
+    <Column :row-editor="true" />
84
+
61 85
     <Column>
62 86
       <template #body="{ index }">
63 87
         <Button

+ 1
- 1
resources/js/pages/Purchases/Components/Details.vue ファイルの表示

@@ -64,7 +64,7 @@ defineProps({
64 64
         <div class="col-12">
65 65
           <div class="grid">
66 66
             <div v-if="price" class="col">
67
-              <h3 class="text-base">Harga</h3>
67
+              <h3 class="text-base">Total Harga</h3>
68 68
               <span>{{ IDRCurrencyFormat(price) }}</span>
69 69
             </div>
70 70
           </div>

+ 8
- 1
resources/js/pages/Purchases/Composables/useProductCart.js ファイルの表示

@@ -1,7 +1,7 @@
1 1
 import FormValidationError from '@/utils/FormValidationError'
2 2
 import { reactive } from 'vue'
3 3
 
4
-export function useProductCart(form) {
4
+export function useProductCart(form, initialProducts) {
5 5
   const productCart = reactive([])
6 6
 
7 7
   const productValidation = () => {
@@ -54,10 +54,17 @@ export function useProductCart(form) {
54 54
     return productPrices.reduce((prev, current) => prev + current, 0)
55 55
   }
56 56
 
57
+  const onEditProduct = (event) => {
58
+    const { newData, index } = event
59
+
60
+    productCart[index] = newData
61
+  }
62
+
57 63
   return {
58 64
     productCart,
59 65
     onAddProduct,
60 66
     onDeleteProduct,
67
+    onEditProduct,
61 68
     onClearProduct,
62 69
     totalProductPrice,
63 70
   }

+ 2
- 1
resources/js/pages/Purchases/Create.vue ファイルの表示

@@ -57,6 +57,7 @@ const {
57 57
   productCart,
58 58
   onAddProduct,
59 59
   onDeleteProduct,
60
+  onEditProduct,
60 61
   onClearProduct,
61 62
   totalProductPrice,
62 63
 } = useProductCart(form)
@@ -208,11 +209,11 @@ const { onShowCreateProduct, onShowCreateSupplier } = onShowDialog()
208 209
           <div class="col-12">
209 210
             <Cart
210 211
               title="Keranjang Produk"
211
-              :ppn="ppn"
212 212
               :value-table="productCart"
213 213
               :header-table="cartTable"
214 214
               v-model:checked-ppn="form.checkedPpn"
215 215
               @delete="onDeleteProduct"
216
+              @edit="onEditProduct"
216 217
             />
217 218
           </div>
218 219
         </div>

+ 7
- 3
resources/js/vue.js ファイルの表示

@@ -1,14 +1,14 @@
1 1
 import './bootstrap'
2
-import '../css/app.scss'
3 2
 import { createApp, h } from 'vue'
4 3
 import { createInertiaApp } from '@inertiajs/inertia-vue3'
5 4
 import { InertiaProgress } from '@inertiajs/progress'
6 5
 import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'
7 6
 
7
+import 'primeflex/primeflex.css'
8 8
 import 'primevue/resources/themes/mdc-light-indigo/theme.css'
9 9
 import 'primevue/resources/primevue.min.css'
10
-import 'primeflex/primeflex.css'
11 10
 import 'primeicons/primeicons.css'
11
+import '../css/app.scss'
12 12
 import PrimeVue from 'primevue/config'
13 13
 import StyleClass from 'primevue/styleclass'
14 14
 import AutoComplete from 'primevue/autocomplete'
@@ -18,6 +18,7 @@ import Calendar from 'primevue/calendar'
18 18
 import Card from 'primevue/card'
19 19
 import Chart from 'primevue/chart'
20 20
 import Column from 'primevue/column'
21
+import ColumnGroup from 'primevue/columngroup'
21 22
 import ConfirmationService from 'primevue/confirmationservice'
22 23
 import ConfirmDialog from 'primevue/confirmdialog'
23 24
 import DataTable from 'primevue/datatable'
@@ -30,6 +31,7 @@ import InputNumber from 'primevue/inputnumber'
30 31
 import InputText from 'primevue/inputtext'
31 32
 import Message from 'primevue/message'
32 33
 import Password from 'primevue/password'
34
+import Row from 'primevue/row'
33 35
 import TabView from 'primevue/tabview'
34 36
 import TabPanel from 'primevue/tabpanel'
35 37
 import Tooltip from 'primevue/tooltip'
@@ -43,13 +45,13 @@ createInertiaApp({
43 45
     ),
44 46
   setup({ el, App, props, plugin }) {
45 47
     createApp({ render: () => h(App, props) })
48
+      .mixin({ methods: { route } })
46 49
       .use(plugin)
47 50
       .use(PrimeVue, {
48 51
         ripple: true,
49 52
       })
50 53
       .use(ConfirmationService)
51 54
       .use(DialogService)
52
-      .mixin({ methods: { route } })
53 55
       .directive('styleclass', StyleClass)
54 56
       .directive('tooltip', Tooltip)
55 57
       .component('AutoComplete', AutoComplete)
@@ -59,6 +61,7 @@ createInertiaApp({
59 61
       .component('Calendar', Calendar)
60 62
       .component('Chart', Chart)
61 63
       .component('Column', Column)
64
+      .component('ColumnGroup', ColumnGroup)
62 65
       .component('ConfirmDialog', ConfirmDialog)
63 66
       .component('DataTable', DataTable)
64 67
       .component('Divider', Divider)
@@ -69,6 +72,7 @@ createInertiaApp({
69 72
       .component('InputText', InputText)
70 73
       .component('Message', Message)
71 74
       .component('Password', Password)
75
+      .component('Row', Row)
72 76
       .component('TabView', TabView)
73 77
       .component('TabPanel', TabPanel)
74 78
       .mount(el)