@viur/shop-components 0.0.1-dev.6 → 0.0.1-dev.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.editorconfig +16 -0
  2. package/.github/workflows/npm-publish.yml +42 -0
  3. package/.gitmodules +3 -0
  4. package/LICENSE +21 -0
  5. package/README.md +13 -2
  6. package/package.json +25 -23
  7. package/src/components/ShopCart.vue +512 -0
  8. package/src/components/ShopOrderComplete.vue +73 -0
  9. package/src/components/ShopOrderConfirm.vue +291 -0
  10. package/src/components/ShopOrderStepper.vue +264 -0
  11. package/src/components/ShopUserData.vue +232 -0
  12. package/src/components/cart/CartLeaf.vue +277 -0
  13. package/src/components/cart/CartLeafModel.vue +304 -0
  14. package/src/components/cart/CartNode.vue +25 -0
  15. package/src/components/cart/CartTree.vue +54 -0
  16. package/src/components/cart/CartTreeWrapper.vue +73 -0
  17. package/src/components/cart/CartView.vue +205 -174
  18. package/src/components/cart/Discount.vue +91 -0
  19. package/src/components/lib/utils.js +0 -0
  20. package/src/components/order/OrderSidebar.vue +102 -0
  21. package/src/components/order/item/ItemView.vue +0 -1
  22. package/src/components/{cart → order/process}/ConfirmView.vue +94 -96
  23. package/src/components/order/process/ExampleUsage.vue +79 -66
  24. package/src/components/order/process/OrderTabHeader.vue +10 -1
  25. package/src/components/order/process/SelectPaymentProvider.vue +62 -0
  26. package/src/components/order/process/Shipping.vue +46 -0
  27. package/src/components/ui/ShopSummary.vue +145 -0
  28. package/src/components/ui/generic/ArticleList.vue +222 -0
  29. package/src/components/ui/generic/ExamplePagination.vue +236 -0
  30. package/src/components/ui/generic/ShopPriceFormatter.vue +41 -0
  31. package/src/components/ui/generic/alerts/ShopAlert.vue +19 -0
  32. package/src/components/ui/generic/makeData.js +39 -0
  33. package/src/components/ui/stepper/StepperItem.vue +39 -0
  34. package/src/components/ui/stepper/StepperTab.vue +133 -0
  35. package/src/components/ui/stepper/StepperTrigger.vue +35 -0
  36. package/src/components/ui/userdata/AddForm.vue +125 -0
  37. package/src/components/ui/userdata/AddressBox.vue +117 -0
  38. package/src/components/ui/userdata/BaseLayout.vue +94 -0
  39. package/src/components/ui/userdata/CustomBooleanBone.vue +58 -0
  40. package/src/components/ui/userdata/CustomSelectBone.vue +91 -0
  41. package/src/components/ui/userdata/CustomStringBone.vue +71 -0
  42. package/src/components/ui/userdata/DefaultLayout.vue +126 -0
  43. package/src/components/ui/userdata/SelectAddress.vue +21 -0
  44. package/src/components/ui/userdata/multi/ActionBar.vue +38 -0
  45. package/src/components/ui/userdata/multi/CartSelection.vue +42 -0
  46. package/src/main.js +50 -0
  47. package/src/router/index.js +1 -1
  48. package/src/stores/cart.js +267 -42
  49. package/src/style/ignite/.editorconfig +20 -0
  50. package/src/style/ignite/.github/workflows/ignite.yml +64 -0
  51. package/src/style/ignite/.github/workflows/node.yml +30 -0
  52. package/src/style/ignite/.postcssrc.cjs +25 -0
  53. package/src/style/ignite/CHANGELOG.md +244 -0
  54. package/src/style/ignite/LICENSE +21 -0
  55. package/src/style/ignite/README.md +92 -0
  56. package/src/style/ignite/dist/ignite.css +2019 -0
  57. package/src/style/ignite/dist/ignite.min.css +4 -0
  58. package/src/style/ignite/foundation/basic.css +371 -0
  59. package/src/style/ignite/foundation/color.css +323 -0
  60. package/src/style/ignite/foundation/config.css +188 -0
  61. package/src/style/ignite/foundation/grid.css +78 -0
  62. package/src/style/ignite/foundation/mediaqueries.css +71 -0
  63. package/src/style/ignite/foundation/reset.css +261 -0
  64. package/src/style/ignite/ignite.css +29 -0
  65. package/src/style/ignite/ignite.css.map +1 -0
  66. package/src/style/ignite/package-lock.json +5530 -0
  67. package/src/style/ignite/package.json +58 -0
  68. package/src/style/ignite/shoelace.css +19 -0
  69. package/src/style/ignite/themes/dark.css +12 -0
  70. package/src/style/ignite/themes/light.css +11 -0
  71. package/src/style/ignite/utilities/shoelace.css +537 -0
  72. package/src/style/ignite/utilities/utilities.css +24 -0
  73. package/vite.config.js +53 -0
  74. package/src/components/order/information/UserInfoMulti.vue +0 -427
  75. package/src/components/order/information/UserInformation.vue +0 -332
  76. package/src/components/order/process/OrderComplete.vue +0 -41
  77. package/src/components/order/process/OrderView.vue +0 -210
@@ -1,6 +1,111 @@
1
1
  <template>
2
- <Loader v-if="!state.cartIsInit"></Loader>
2
+ <sl-spinner v-if="!currentCartKey"></sl-spinner>
3
+ <h2 v-else-if="state.cartIsEmpty">Keine Artikel im Warenkorb vorhanden</h2>
4
+ <!--todo translations-->
3
5
  <template v-else>
6
+ <sl-dialog no-header ref="confirm" @sl-hide="onDialogHide">
7
+ <p>Möchten Sie den Artikel wirklich aus dem Warenkorb entfernen?</p>
8
+ <sl-bar>
9
+ <sl-button
10
+ slot="left"
11
+ variant="danger"
12
+ @click="confirm.hide()"
13
+ size="medium"
14
+ >
15
+ Abbrechen
16
+ </sl-button>
17
+ <sl-button
18
+ slot="right"
19
+ variant="success"
20
+ @click="onConfirm"
21
+ size="medium"
22
+ >
23
+ Aus Warenkorb entfernen
24
+ </sl-button>
25
+ </sl-bar>
26
+ </sl-dialog>
27
+
28
+ <div class="viur-shop-cart-node" v-for="node in state.nodes">
29
+ <template
30
+ v-if="Object.keys(state.leaves).includes(node.key)"
31
+ :key="node.key"
32
+ >
33
+ <!-- <CartNode :node="node"></CartNode> -->
34
+ <CartLeaf
35
+ v-for="leaf in state.leaves[node.key]"
36
+ :key="leaf.key"
37
+ :leaf="leaf"
38
+ :node="node"
39
+ :placeholder="placeholder"
40
+ @removeItem="removeItem"
41
+ @updateItem="updateItem"
42
+ >
43
+ </CartLeaf>
44
+ </template>
45
+ </div>
46
+ <div id="order_sidebar" v-if="standalone">
47
+ <h2 class="viur-shop-cart-sidebar-headline headline">Zusammenfassung</h2>
48
+ <br />
49
+
50
+ <div class="viur-shop-cart-sidebar-info-line">
51
+ <span>Zwischensumme</span>
52
+ <sl-format-number
53
+ type="currency"
54
+ currency="EUR"
55
+ :value="cartStore.state.basketRootNode.total"
56
+ ></sl-format-number>
57
+ </div>
58
+ <div class="viur-shop-cart-sidebar-info-line">
59
+ <span>Rabatt</span>
60
+ <sl-format-number
61
+ type="currency"
62
+ currency="EUR"
63
+ :value="
64
+ cartStore.state.basketRootNode.total -
65
+ cartStore.state.basketRootNode.total_discount_price
66
+ "
67
+ lang="de"
68
+ ></sl-format-number>
69
+ </div>
70
+ <div class="viur-shop-cart-sidebar-info-line">
71
+ <Shipping ref="shipping"></Shipping>
72
+ </div>
73
+ <div class="viur-shop-cart-sidebar-info-line total">
74
+ <span>Gesamt :</span>
75
+ <sl-format-number
76
+ type="currency"
77
+ currency="EUR"
78
+ :value="state.totalPrice"
79
+ lang="de"
80
+ ></sl-format-number>
81
+ </div>
82
+ <div class="viur-shop-cart-sidebar-btn-wrap" v-if="!props.inOrderView">
83
+ <sl-button variant="primary" size="medium"> Jetzt Bestellen </sl-button>
84
+ <Discount></Discount>
85
+
86
+ <div class="viur-shop-cart-mobile-footer">
87
+ <sl-button variant="primary" size="medium">
88
+ Jetzt Bestellen</sl-button
89
+ >
90
+ </div>
91
+ </div>
92
+ </div>
93
+ <Discount v-if="!props.inOrderConfirm"></Discount>
94
+
95
+ <div class="viur-shop-cart-mobile-footer">
96
+ <sl-button variant="primary" size="medium"> Jetzt Bestellen</sl-button>
97
+ </div>
98
+
99
+ <!-- <pre> {{ state.leaves }}</pre> -->
100
+ </template>
101
+ <shop-summary v-if="!props.sidebar">
102
+ <template #custom v-if="customComponent">
103
+ <component :is="customComponent"></component>
104
+ </template>
105
+ </shop-summary>
106
+ <!-- <CartNode></CartNode>
107
+ <CartLeaf></CartLeaf> -->
108
+ <!-- <template v-else>
4
109
  <div class="bind viur-shop-cart-wrap">
5
110
  <sl-dialog ref="confirm" @sl-hide="onDialogHide">
6
111
  <p>Möchten Sie den Artikel wirklich aus dem Warenkorb entfernen?</p>
@@ -59,11 +164,7 @@
59
164
  <sl-icon
60
165
  slot="prefix"
61
166
  library="hsk"
62
- name="clone"
63
- class="primary-icon"
64
- ></sl-icon>
65
- Warenkorb kopieren
66
- </sl-menu-item>
167
+ name="clone"cartKey
67
168
  <sl-menu-item @click="saveCart" title="Warenkorb löschen">
68
169
  <sl-icon
69
170
  slot="prefix"
@@ -103,160 +204,65 @@
103
204
  <strong>Warenkorb nicht gespeichert!</strong><br />
104
205
  </sl-alert>
105
206
 
106
- <sl-spinner v-if="!state.itemsIsInit"></sl-spinner>
107
207
 
108
- <template v-else>
109
- <sl-card
110
- horizontal
111
- class="viur-shop-cart-card"
112
- v-for="item in cartStore.state.carts[cartStore.state.basket].items"
113
- >
114
- <img
115
- class="viur-shop-cart-card-img"
116
- slot="image"
117
- src="https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80"
118
- />
119
- <div class="viur-shop-cart-card-header" slot="header">
120
- <h4 class="viur-shop-cart-card-headline headline">
121
- {{ item.article.dest.shop_name }} | 425018
122
- </h4>
123
- </div>
124
- <div class="viur-shop-cart-card-body-row">
125
- <div class="viur-shop-cart-card-body-info">
126
- <div class="viur-shop-cart-card-descr">
127
- Version: 900x900x2000 <br />
128
- Farbe: Chromoptik <br />
129
- Glasart: Klar hell mit Edelglasbeschichtung<br />
130
- Anschlag: Beidseitig variabel<br />
131
- Griff: Stangengriff Exklusiv (56)
132
- </div>
133
- <div class="viur-shop-cart-card-body-footer">
134
- <sl-button
135
- size="small"
136
- outline
137
- class="viur-shop-cart-card-add-to-favourites-btn"
138
- variant="primary"
139
- title="Add to favourites"
140
- >
141
- <sl-icon name="heart" slot="prefix"></sl-icon>
142
- </sl-button>
143
- <sl-button
144
- size="small"
145
- outline
146
- class="viur-shop-cart-card-delete-btn"
147
- variant="primary"
148
- title="Remove from cart"
149
- @click="
150
- removeItem(
151
- item,
152
- item.article.dest.key,
153
- cartStore.state.basket,
154
- )
155
- "
156
- >
157
- <sl-icon name="trash" slot="prefix"></sl-icon>
158
- </sl-button>
159
- </div>
160
- </div>
161
- <div class="viur-shop-cart-card-body-amount">
162
- <sl-input
163
- class="amount-input"
164
- type="number"
165
- label="Anzahl"
166
- placeholder="Number"
167
- min="0"
168
- v-model="item.quantity"
169
- @input="
170
- updateItem(
171
- item,
172
- item.article.dest.key,
173
- cartStore.state.basket,
174
- item.quantity,
175
- )
176
- "
177
- >
178
- </sl-input>
179
- </div>
180
- <div class="viur-shop-cart-card-price-wrap" slot="footer">
181
- <div class="viur-shop-cart-card-price-label">Preis</div>
182
- <div class="viur-shop-cart-card-price">
183
- {{ item.price.retail }}
184
-
185
- </div>
186
- <div class="viur-shop-cart-card-small-print">Brutto / Stk.</div>
187
- </div>
188
- </div>
189
- </sl-card>
190
- </template>
191
208
  </div>
192
209
 
193
- <teleport to="#order_sidebar" v-if="sidebar">
194
- <h2 class="viur-shop-cart-sidebar-headline headline">
195
- Zusammenfassung
196
- </h2>
197
- <br />
198
210
 
199
- <sl-input label="Rabattcode eingeben"></sl-input>
200
- <br />
201
-
202
- <div class="viur-shop-cart-sidebar-info-line">
203
- <span>Zwischensumme</span>
204
- <!-- TODO: Preis in shop modul muss trotzdem ohne rabatt sein - extra feld für rabattierten preis und rabatt müssen ebenfalls hier sichtbar werden -->
205
- {{ cartStore.state.carts[cartStore.state.basket].info.total }} €
206
- </div>
207
- <div class="viur-shop-cart-sidebar-info-line">
208
- <span>Rabatt</span>
209
- 0 €
210
- </div>
211
- <div class="viur-shop-cart-sidebar-info-line">
212
- <span>Versandkosten</span>
213
- 0 €
214
- </div>
215
- <div class="viur-shop-cart-sidebar-info-line total">
216
- <span>Gesamt:</span>
217
- {{ cartStore.state.carts[cartStore.state.basket].info.total }} €
218
- </div>
219
- <div class="viur-shop-cart-sidebar-btn-wrap">
220
- <sl-button variant="info" size="small"> Jetzt Bestellen </sl-button>
221
- <sl-button size="small" variant="primary">
222
- <sl-icon name="paypal" slot="prefix"></sl-icon>
223
- Paypal
224
- </sl-button>
225
- </div>
226
- </teleport>
227
211
  </div>
228
- </template>
212
+ </template> -->
229
213
  </template>
230
214
 
231
215
  <script setup>
232
216
  import { reactive, computed, onBeforeMount, ref } from "vue";
233
- import Loader from "@viur/vue-utils/generic/Loader.vue";
234
217
  import { useCartStore } from "../../stores/cart.js";
235
- import { Request } from "@viur/vue-utils";
218
+ import CartNode from "./CartNode.vue";
219
+ import CartLeaf from "./CartLeaf.vue";
220
+ import Shipping from "../order/process/Shipping.vue";
221
+ import ShopSummary from "../ui/ShopSummary.vue";
236
222
 
237
223
  const props = defineProps({
238
224
  mode: { type: String, default: "basket" },
239
- cartKey: { type: String, default: "" },
225
+ cartKey: { type: String },
240
226
  sidebar: { type: Boolean, default: true },
227
+ inOrderView: { type: Boolean, default: false },
228
+ inOrderConfirm: { type: Boolean, default: false },
229
+ customComponent: { default: undefined },
241
230
  });
242
231
 
232
+ console.log("inor",props.inOrderView)
243
233
  const cartStore = useCartStore();
244
234
 
245
235
  const confirm = ref(null);
236
+ const shipping = ref(null);
246
237
 
247
238
  const state = reactive({
248
- cartIsInit: computed(() => {
249
- return cartStore.state.basket.length ? true : false;
250
- }),
251
239
  itemsIsInit: computed(() => {
252
- return cartStore.state.carts[cartStore.state.basket].items ? true : false;
240
+ return true;
241
+ }),
242
+ cartIsEmpty: computed(() => {
243
+ return currentCartKey && state.leaves.length===0;
244
+ }),
245
+ totalPrice: computed(() => {
246
+ if (shipping.value) {
247
+ return (
248
+ cartStore.state.basketRootNode.total_discount_price +
249
+ shipping.value.getShippingCost()
250
+ );
251
+ }
252
+ return 0;
253
253
  }),
254
254
  images: {},
255
255
  currentItem: {},
256
+ currentNode: {},
257
+ nodes: [],
258
+ leaves: {},
256
259
  });
257
260
 
258
261
  const currentCartKey = computed(() => {
259
- return props.mode === "basket" ? cartStore.state.basket : props.cartKey;
262
+ console.log("compute current cartkey");
263
+ return props.mode === "basket"
264
+ ? cartStore.state.basketRootNode.key
265
+ : props.cartKey;
260
266
  });
261
267
 
262
268
  // function getImage(item) {
@@ -276,57 +282,92 @@ const currentCartKey = computed(() => {
276
282
  // }
277
283
 
278
284
  async function onConfirm() {
285
+ confirm.value.hide();
286
+
279
287
  await cartStore.updateItem(
280
288
  state.currentItem.article.dest.key,
281
- cartStore.state.basket,
289
+ state.currentNode.key,
282
290
  0,
283
291
  );
284
- confirm.value.hide();
292
+ await updateCart();
285
293
  }
286
294
 
287
- function updateItem(item, articleKey, cartKey, quantity) {
288
- if (quantity === 0) {
295
+ async function updateItem(e) {
296
+ console.log("updateItem :", e);
297
+
298
+ if (e.quantity === 0) {
289
299
  confirm.value.show();
290
- state.currentItem = item;
300
+ state.currentItem = e.item;
301
+ state.currentNode = e.node;
291
302
  } else {
292
- cartStore.updateItem(articleKey, cartKey, quantity);
303
+ await cartStore.updateItem(e.articleKey, e.node.key, e.quantity);
304
+
305
+ await cartStore.init();
293
306
  }
294
307
  }
295
308
 
296
- function removeItem(item, articleKey, cartKey) {
309
+ function removeItem(e) {
310
+ console.log("removeItem :", e);
311
+
297
312
  confirm.value.show();
298
- state.currentItem = item;
313
+ state.currentItem = e.item;
314
+ state.currentNode = e.node;
299
315
  }
300
316
 
301
- function onDialogHide() {
302
- cartStore.state.carts[cartStore.state.basket].items.forEach((item) => {
317
+ async function onDialogHide() {
318
+ // TODO: console error when removing items
319
+ state.leaves[state.currentNode.key].forEach((item) => {
303
320
  if (item.key === state.currentItem.key) {
304
321
  item.quantity = 1;
305
322
  }
306
323
  });
324
+
307
325
  state.currentItem = {};
326
+ state.currentNode = {};
327
+ }
328
+
329
+ async function updateCart() {
330
+ state.nodes = [];
331
+ state.leaves = {};
332
+
333
+ await cartStore.init();
334
+ await getChildren();
335
+ }
336
+
337
+ async function getChildren(parentKey = currentCartKey.value) {
338
+ const children = await cartStore.getChildren(parentKey);
339
+
340
+ children.forEach(async (child) => {
341
+ if (child.skel_type === "node") {
342
+ state.nodes.push(child);
343
+ await getChildren(child.key);
344
+ } else {
345
+ if (!Object.keys(state.leaves).includes(parentKey)) {
346
+ state.leaves[parentKey] = [];
347
+ }
348
+ state.leaves[parentKey].push(child);
349
+ }
350
+ });
308
351
  }
309
352
 
310
353
  onBeforeMount(async () => {
311
354
  await cartStore.init();
355
+ await getChildren();
356
+
357
+ if (props.mode === "basket") {
358
+ state.nodes.push(cartStore.state.basketRootNode);
359
+ }
360
+
361
+ console.log("state.nodes test", state.nodes);
362
+
363
+ console.log("state.leaves", state.leaves);
312
364
  });
313
365
  </script>
314
366
 
315
367
  <style scoped>
316
368
  .viur-shop-cart-wrap {
317
- flex-direction: row;
318
- gap: var(--sl-spacing-x-large);
319
- align-items: flex-start;
320
- }
321
-
322
- .viur-shop-cart-sidebar-btn-wrap {
323
- display: flex;
324
- flex-direction: column;
325
- margin-top: var(--sl-spacing-large);
326
-
327
- sl-button {
328
- margin-bottom: var(--sl-spacing-x-small);
329
- }
369
+ display: grid;
370
+ grid-template-columns: subgrid;
330
371
  }
331
372
 
332
373
  sl-alert {
@@ -378,6 +419,11 @@ sl-alert {
378
419
  flex: 1;
379
420
  }
380
421
 
422
+ .viur-shop-cart-node {
423
+ display: flex;
424
+ flex-direction: column;
425
+ }
426
+
381
427
  .cart-wrap {
382
428
  display: flex;
383
429
  flex-direction: column;
@@ -594,25 +640,6 @@ sl-menu-item {
594
640
  padding: 0.4em;
595
641
  }
596
642
 
597
- .viur-shop-cart-sidebar-info-line {
598
- display: flex;
599
- flex-direction: row;
600
- flex-wrap: nowrap;
601
- margin: var(--sl-spacing-2x-small) 0;
602
-
603
- &.total {
604
- font-weight: 600;
605
- border-top: 1px solid var(--sl-color-neutral-300);
606
- border-bottom: 1px solid var(--sl-color-neutral-300);
607
- padding: var(--sl-spacing-x-small) 0;
608
- margin: var(--sl-spacing-small) 0;
609
- }
610
-
611
- span {
612
- margin-right: auto;
613
- }
614
- }
615
-
616
643
  .viur-shop-cart-card {
617
644
  margin-bottom: var(--sl-spacing-x-large);
618
645
 
@@ -689,4 +716,8 @@ sl-menu-item {
689
716
  font-size: 1em;
690
717
  margin-left: auto;
691
718
  }
719
+
720
+ .viur-shop-cart-mobile-footer {
721
+ display: none;
722
+ }
692
723
  </style>
@@ -0,0 +1,91 @@
1
+ <template>
2
+ <div>
3
+
4
+ <span>Haben Sie noch ein Gutschein?</span><br>
5
+ <span v-if="!cartStore.state.basketRootNode.discount">Es befindet sich noch kein Gutschein im Warenkorb.</span>
6
+ <sl-button-group>
7
+ <sl-input placeholder="Rabatt Code" ref="codeInput">
8
+
9
+ </sl-input>
10
+ <sl-button @click="addDiscountCode">Einlösen</sl-button>
11
+ </sl-button-group>
12
+ <sl-alert ref="errorMessageContainer">
13
+ <sl-icon slot="icon" name="info-circle"></sl-icon>
14
+ {{ state.errorMessage }}
15
+ </sl-alert>
16
+ </div>
17
+ <div>
18
+ <div v-if="cartStore.state.basketRootNode.discount">
19
+ <!--Todo bessere texte und translations??-->
20
+ <div v-if="cartStore.state.basketRootNode.discount.dest.discount_type==='absolute'">
21
+ <span>
22
+ Sie haben einen Rabattcode im Wert von {{ cartStore.state.basketRootNode.discount.dest.absolute }} € eingegeben
23
+ </span>
24
+ <sl-icon-button name="x-lg" label="Löschen" @click="removeDiscountCode"></sl-icon-button>
25
+ </div>
26
+ <div v-if="cartStore.state.basketRootNode.discount.dest.discount_type==='percentage'">
27
+ <span>
28
+ Sie haben einen Rabattcode im Wert von {{ cartStore.state.basketRootNode.discount.dest.percentage }} % eingegeben
29
+ </span>
30
+ <sl-icon-button name="x-lg" label="Löschen" @click="removeDiscountCode"></sl-icon-button>
31
+ </div>
32
+
33
+ </div>
34
+ </div>
35
+ <sl-spinner v-show="state.isFetching"></sl-spinner>
36
+
37
+ </template>
38
+ <script setup>
39
+ import {useCartStore} from "../../stores/cart";
40
+ import {computed, reactive, ref} from "vue";
41
+
42
+ const cartStore = useCartStore();
43
+ const codeInput = ref(null);
44
+ const errorMessageContainer = ref(null);
45
+ const state = reactive({
46
+ errorMessage: "",
47
+ isFetching: false,
48
+ });
49
+
50
+ async function addDiscountCode() {
51
+ errorMessageContainer.value.hide();
52
+ const discountCode = codeInput.value.value;
53
+ if (!discountCode) {
54
+ errorMessageContainer.value.show();
55
+ state.errorMessage = "Es wurde kein Rabattcode eingegeben";
56
+ return
57
+ }
58
+ state.isFetching = true;
59
+ console.log("festch", state.isFetching)
60
+ cartStore.addDiscount(discountCode).then((res) => {
61
+ cartStore.init();//TODO muss man alles neuladen ??
62
+ state.isFetching = false;
63
+
64
+ }).catch((e) => {
65
+ console.error("Cant add key");
66
+ state.isFetching = false;
67
+ })
68
+
69
+ }
70
+
71
+ async function removeDiscountCode() {
72
+
73
+ errorMessageContainer.value.hide();
74
+ state.isFetching = true;
75
+ console.log("code ", cartStore.state.basketRootNode.discount.dest.key)
76
+ cartStore.removeDiscount(cartStore.state.basketRootNode.discount.dest.key).then((res) => {
77
+ cartStore.init();//TODO muss man alles neuladen ??
78
+ state.isFetching = false;
79
+
80
+ }).catch((e) => {
81
+ console.error("Cant remove key");
82
+ state.isFetching = false;
83
+ })
84
+
85
+ }
86
+ </script>
87
+
88
+
89
+ <style scoped>
90
+
91
+ </style>
File without changes
@@ -0,0 +1,102 @@
1
+ ,
2
+ <template>
3
+ <div class="viur-shop-sidebar">
4
+ <h2 class="viur-shop-cart-sidebar-headline headline">Zusammenfassung</h2>
5
+ <br />
6
+ <div class="viur-shop-cart-sidebar-info-line">
7
+ <span>Zwischensumme</span>
8
+ 999.99 €
9
+ </div>
10
+ <div class="viur-shop-cart-sidebar-info-line">
11
+ <span>Rabatt</span>
12
+ {{
13
+ cartStore.state.basketRootNode.total -
14
+ cartStore.state.basketRootNode.total_discount_price
15
+ }}
16
+
17
+ </div>
18
+ <div class="viur-shop-cart-sidebar-info-line">
19
+ <span>Versandkosten</span>
20
+ 0 €
21
+ </div>
22
+ <div class="viur-shop-cart-sidebar-info-line total">
23
+ <span>Gesamt:</span>
24
+ <!--{{ cartStore.state.basketRootNode }}-->
25
+
26
+ </div>
27
+ <div class="viur-shop-cart-sidebar-btn-wrap">
28
+
29
+ <!-- TODO: Placement of discount? -->
30
+ <div class="viur-shop-discount-wrap">
31
+ <Discount></Discount>
32
+ </div>
33
+
34
+ <sl-button variant="primary" size="medium"> Jetzt Bestellen</sl-button>
35
+ <sl-button size="medium" variant="info">
36
+ <sl-icon name="paypal" slot="prefix"></sl-icon>
37
+ Paypal
38
+ </sl-button>
39
+ </div>
40
+ </div>
41
+ </template>
42
+
43
+ <script setup>
44
+ import { onBeforeMount } from "vue";
45
+ import { useCartStore } from "../../stores/cart.js";
46
+ import Discount from "../cart/Discount.vue";
47
+
48
+ const cartStore = useCartStore();
49
+
50
+ onBeforeMount(() => {
51
+ cartStore.init();
52
+ });
53
+ </script>
54
+
55
+ <style>
56
+ .viur-shop-cart-sidebar-info-line {
57
+ display: flex;
58
+ flex-direction: row;
59
+ flex-wrap: nowrap;
60
+ margin: var(--sl-spacing-2x-small) 0;
61
+
62
+ &.total {
63
+ font-weight: 600;
64
+ border-top: 1px solid var(--sl-color-neutral-300);
65
+ border-bottom: 1px solid var(--sl-color-neutral-300);
66
+ padding: var(--sl-spacing-x-small) 0;
67
+ margin: var(--sl-spacing-small) 0;
68
+ }
69
+
70
+ span {
71
+ margin-right: auto;
72
+ }
73
+ }
74
+
75
+ .viur-shop-cart-sidebar-btn-wrap {
76
+ display: flex;
77
+ flex-direction: column;
78
+ margin-top: var(--sl-spacing-large);
79
+
80
+ sl-button {
81
+ margin-bottom: var(--sl-spacing-x-small);
82
+ }
83
+ }
84
+ .viur-shop-cart-sidebar-headline {
85
+ margin: 0 0 var(--sl-spacing-large) 0;
86
+ }
87
+
88
+ .viur-shop-sidebar {
89
+ display: flex;
90
+ flex-direction: column;
91
+ background-color: var(--shop-sidebar-background);
92
+ padding: var(--sl-spacing-medium);
93
+ overflow: hidden;
94
+ border-radius: var(--sl-border-radius-medium);
95
+
96
+ @media (min-width: 1024px) {
97
+ position: sticky;
98
+ top: 0;
99
+ margin-left: var(--sl-spacing-2x-large);
100
+ }
101
+ }
102
+ </style>
@@ -94,7 +94,6 @@ const state = reactive({
94
94
  });
95
95
 
96
96
  function getImage(item) {
97
- console.log("hier", item.dk_artikel);
98
97
  let imageUrl =
99
98
  "https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80";
100
99
  if (item?.dk_artikel.dest.image) {