@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.
- package/.editorconfig +16 -0
- package/.github/workflows/npm-publish.yml +42 -0
- package/.gitmodules +3 -0
- package/LICENSE +21 -0
- package/README.md +13 -2
- package/package.json +25 -23
- package/src/components/ShopCart.vue +512 -0
- package/src/components/ShopOrderComplete.vue +73 -0
- package/src/components/ShopOrderConfirm.vue +291 -0
- package/src/components/ShopOrderStepper.vue +264 -0
- package/src/components/ShopUserData.vue +232 -0
- package/src/components/cart/CartLeaf.vue +277 -0
- package/src/components/cart/CartLeafModel.vue +304 -0
- package/src/components/cart/CartNode.vue +25 -0
- package/src/components/cart/CartTree.vue +54 -0
- package/src/components/cart/CartTreeWrapper.vue +73 -0
- package/src/components/cart/CartView.vue +205 -174
- package/src/components/cart/Discount.vue +91 -0
- package/src/components/lib/utils.js +0 -0
- package/src/components/order/OrderSidebar.vue +102 -0
- package/src/components/order/item/ItemView.vue +0 -1
- package/src/components/{cart → order/process}/ConfirmView.vue +94 -96
- package/src/components/order/process/ExampleUsage.vue +79 -66
- package/src/components/order/process/OrderTabHeader.vue +10 -1
- package/src/components/order/process/SelectPaymentProvider.vue +62 -0
- package/src/components/order/process/Shipping.vue +46 -0
- package/src/components/ui/ShopSummary.vue +145 -0
- package/src/components/ui/generic/ArticleList.vue +222 -0
- package/src/components/ui/generic/ExamplePagination.vue +236 -0
- package/src/components/ui/generic/ShopPriceFormatter.vue +41 -0
- package/src/components/ui/generic/alerts/ShopAlert.vue +19 -0
- package/src/components/ui/generic/makeData.js +39 -0
- package/src/components/ui/stepper/StepperItem.vue +39 -0
- package/src/components/ui/stepper/StepperTab.vue +133 -0
- package/src/components/ui/stepper/StepperTrigger.vue +35 -0
- package/src/components/ui/userdata/AddForm.vue +125 -0
- package/src/components/ui/userdata/AddressBox.vue +117 -0
- package/src/components/ui/userdata/BaseLayout.vue +94 -0
- package/src/components/ui/userdata/CustomBooleanBone.vue +58 -0
- package/src/components/ui/userdata/CustomSelectBone.vue +91 -0
- package/src/components/ui/userdata/CustomStringBone.vue +71 -0
- package/src/components/ui/userdata/DefaultLayout.vue +126 -0
- package/src/components/ui/userdata/SelectAddress.vue +21 -0
- package/src/components/ui/userdata/multi/ActionBar.vue +38 -0
- package/src/components/ui/userdata/multi/CartSelection.vue +42 -0
- package/src/main.js +50 -0
- package/src/router/index.js +1 -1
- package/src/stores/cart.js +267 -42
- package/src/style/ignite/.editorconfig +20 -0
- package/src/style/ignite/.github/workflows/ignite.yml +64 -0
- package/src/style/ignite/.github/workflows/node.yml +30 -0
- package/src/style/ignite/.postcssrc.cjs +25 -0
- package/src/style/ignite/CHANGELOG.md +244 -0
- package/src/style/ignite/LICENSE +21 -0
- package/src/style/ignite/README.md +92 -0
- package/src/style/ignite/dist/ignite.css +2019 -0
- package/src/style/ignite/dist/ignite.min.css +4 -0
- package/src/style/ignite/foundation/basic.css +371 -0
- package/src/style/ignite/foundation/color.css +323 -0
- package/src/style/ignite/foundation/config.css +188 -0
- package/src/style/ignite/foundation/grid.css +78 -0
- package/src/style/ignite/foundation/mediaqueries.css +71 -0
- package/src/style/ignite/foundation/reset.css +261 -0
- package/src/style/ignite/ignite.css +29 -0
- package/src/style/ignite/ignite.css.map +1 -0
- package/src/style/ignite/package-lock.json +5530 -0
- package/src/style/ignite/package.json +58 -0
- package/src/style/ignite/shoelace.css +19 -0
- package/src/style/ignite/themes/dark.css +12 -0
- package/src/style/ignite/themes/light.css +11 -0
- package/src/style/ignite/utilities/shoelace.css +537 -0
- package/src/style/ignite/utilities/utilities.css +24 -0
- package/vite.config.js +53 -0
- package/src/components/order/information/UserInfoMulti.vue +0 -427
- package/src/components/order/information/UserInformation.vue +0 -332
- package/src/components/order/process/OrderComplete.vue +0 -41
- package/src/components/order/process/OrderView.vue +0 -210
|
@@ -1,6 +1,111 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
289
|
+
state.currentNode.key,
|
|
282
290
|
0,
|
|
283
291
|
);
|
|
284
|
-
|
|
292
|
+
await updateCart();
|
|
285
293
|
}
|
|
286
294
|
|
|
287
|
-
function updateItem(
|
|
288
|
-
|
|
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,
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
318
|
-
|
|
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) {
|