@viur/shop-components 0.0.1-dev.31 → 0.0.1-dev.32

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.
@@ -1,702 +0,0 @@
1
- <template>
2
- <sl-spinner v-if="!cartKey.length"></sl-spinner>
3
- <template v-else>
4
- <sl-dialog ref="confirm" @sl-hide="onDialogHide">
5
- <p>Möchten Sie den Artikel wirklich aus dem Warenkorb entfernen?</p>
6
- <div class="footer-wrap" slot="footer">
7
- <sl-button variant="danger" @click="confirm.hide()" size="medium">
8
- Abbrechen
9
- </sl-button>
10
- <sl-button variant="success" @click="onConfirm" size="medium">
11
- Aus Warenkorb entfernen
12
- </sl-button>
13
- </div>
14
- </sl-dialog>
15
-
16
- <div v-for="node in state.nodes">
17
- <template
18
- v-if="Object.keys(state.leaves).includes(node.key)"
19
- :key="node.key"
20
- >
21
- <CartNode :node="node"> </CartNode>
22
- <CartLeaf
23
- v-for="leaf in state.leaves[node.key]"
24
- :key="leaf.key"
25
- :leaf="leaf"
26
- :node="node"
27
- @removeItem="removeItem"
28
- @updateItem="updateItem"
29
- >
30
- </CartLeaf>
31
- </template>
32
- </div>
33
-
34
- <!-- <teleport to="#order_sidebar" v-if="sidebar"> -->
35
- <div v-if="sidebar">
36
- <h2 class="viur-shop-cart-sidebar-headline headline">Zusammenfassung</h2>
37
- <br />
38
-
39
- <sl-input label="Rabattcode eingeben"></sl-input>
40
- <br />
41
-
42
- <div class="viur-shop-cart-sidebar-info-line">
43
- <span>Zwischensumme</span> -->
44
- <!-- TODO: Preis in shop modul muss trotzdem ohne rabatt sein - extra feld für rabattierten preis und rabatt müssen ebenfalls hier sichtbar werden -->
45
- {{
46
- mode === "basket"
47
- ? cartStore.state.basketRootNode.total
48
- : cartStore.state.whishlistRootNodes[cartKey].total
49
- }}
50
-
51
- </div>
52
- <div class="viur-shop-cart-sidebar-info-line">
53
- <span>Rabatt</span>
54
- 0 €
55
- </div>
56
- <div class="viur-shop-cart-sidebar-info-line">
57
- <span>Versandkosten</span>
58
- 0 €
59
- </div>
60
- <div class="viur-shop-cart-sidebar-info-line total">
61
- <span>Gesamt:</span>
62
- {{
63
- mode === "basket"
64
- ? cartStore.state.basketRootNode.total
65
- : cartStore.state.whishlistRootNodes[cartKey].total
66
- }}
67
-
68
- </div>
69
- <div class="viur-shop-cart-sidebar-btn-wrap">
70
- <sl-button variant="info" size="small"> Jetzt Bestellen </sl-button>
71
- <sl-button size="small" variant="primary">
72
- <sl-icon name="paypal" slot="prefix"></sl-icon>
73
- Paypal
74
- </sl-button>
75
- </div>
76
- <!-- </teleport> -->
77
- </div>
78
- <!-- <pre> {{ state.leaves }}</pre> -->
79
- </template>
80
-
81
- <!-- <CartNode></CartNode>
82
- <CartLeaf></CartLeaf> -->
83
- <!-- <template v-else>
84
- <div class="bind viur-shop-cart-wrap">
85
- <sl-dialog ref="confirm" @sl-hide="onDialogHide">
86
- <p>Möchten Sie den Artikel wirklich aus dem Warenkorb entfernen?</p>
87
- <div class="footer-wrap" slot="footer">
88
- <sl-button variant="danger" @click="confirm.hide()" size="medium">
89
- Abbrechen
90
- </sl-button>
91
- <sl-button variant="success" @click="onConfirm" size="medium">
92
- Aus Warenkorb entfernen
93
- </sl-button>
94
- </div>
95
- </sl-dialog>
96
-
97
- <div class="viur-shop-cart-list">
98
- <div class="viur-shop-cart-controlbar" v-if="mode !== 'basket'">
99
- <div class="viur-shop-cart-button-list left">
100
- <sl-input
101
- ref="cartNameField"
102
- name="cart-name"
103
- placeholder="Warenkorbname"
104
- v-model="cartStore.state.carts[cartStore.state.basket].info.name"
105
- required="true"
106
- inputmode="text"
107
- class="viur-shop-cart-headline"
108
- >
109
- <sl-icon library="hsk" name="pen" slot="suffix"></sl-icon>
110
- </sl-input>
111
- </div>
112
- <sl-dropdown distance="10">
113
- <sl-icon
114
- class="dots"
115
- name="dots"
116
- library="hsk"
117
- slot="trigger"
118
- ></sl-icon>
119
- <sl-menu>
120
- <sl-menu-item @click="saveCart" title="Warenkorb speichern">
121
- <sl-icon
122
- slot="prefix"
123
- library="hsk"
124
- name="save"
125
- class="primary-icon"
126
- ></sl-icon>
127
- Warenkorb speichern
128
- </sl-menu-item>
129
- <sl-menu-item @click="saveCart" title="Zu Projekt hinzufügen">
130
- <sl-icon
131
- slot="prefix"
132
- library="hsk"
133
- name="project"
134
- class="primary-icon"
135
- ></sl-icon>
136
- Zu Projekt hinzufügen
137
- </sl-menu-item>
138
- <sl-menu-item @click="saveCart" title="Warenkorb kopieren">
139
- <sl-icon
140
- slot="prefix"
141
- library="hsk"
142
- name="clone"
143
- class="primary-icon"
144
- ></sl-icon>
145
- Warenkorb kopieren
146
- </sl-menu-item>
147
- <sl-menu-item @click="saveCart" title="Warenkorb löschen">
148
- <sl-icon
149
- slot="prefix"
150
- library="hsk"
151
- name="delete"
152
- class="delete-icon"
153
- ></sl-icon>
154
- Warenkorb löschen
155
- </sl-menu-item>
156
- </sl-menu>
157
- </sl-dropdown>
158
- </div>
159
- <sl-input
160
- v-if="mode !== 'basket'"
161
- name="cart-internalCartNo"
162
- placeholder="Freifeld (Kommission)"
163
- v-model="
164
- cartStore.state.carts[cartStore.state.basket].info.customer_comment
165
- "
166
- inputmode="text"
167
- class="viur-shop-cart-descr"
168
- >
169
- <sl-icon library="hsk" name="pen" slot="suffix"></sl-icon>
170
- </sl-input>
171
- <br />
172
- <sl-alert
173
- ref="cartActionInfo"
174
- variant="primary"
175
- duration="3000"
176
- closable
177
- >
178
- <sl-icon slot="icon" name="check"></sl-icon>
179
- <strong>Warenkorb gespeichert!</strong><br />
180
- </sl-alert>
181
- <sl-alert ref="cartErrorInfo" variant="danger" duration="3000" closable>
182
- <sl-icon slot="icon" name="error"></sl-icon>
183
- <strong>Warenkorb nicht gespeichert!</strong><br />
184
- </sl-alert>
185
-
186
-
187
- </div>
188
-
189
-
190
- </div>
191
- </template> -->
192
- </template>
193
-
194
- <script setup>
195
- import { reactive, computed, onBeforeMount, ref } from "vue";
196
- import Loader from "@viur/vue-utils/generic/Loader.vue";
197
- import { useCartStore } from "../../stores/cart.js";
198
- import CartNode from "./CartNode.vue";
199
- import CartLeaf from "./CartLeaf.vue";
200
-
201
- const props = defineProps({
202
- mode: { type: String, default: "basket" },
203
- cartKey: { type: String, required: true },
204
- sidebar: { type: Boolean, default: true },
205
- });
206
-
207
- const cartStore = useCartStore();
208
-
209
- const confirm = ref(null);
210
-
211
- const state = reactive({
212
- cartIsInit: computed(() => {
213
- return cartStore.state.basketRootNode ? true : false;
214
- }),
215
- itemsIsInit: computed(() => {
216
- return true;
217
- }),
218
- images: {},
219
- currentItem: {},
220
- currentNode: {},
221
- nodes: [],
222
- leaves: {},
223
- });
224
-
225
- const currentCartKey = computed(() => {
226
- return props.mode === "basket" ? cartStore.state.basket : props.cartKey;
227
- });
228
-
229
- // function getImage(item) {
230
- // Request.get(`/json/dk_variante/view/${item}`).then(async (resp) => {
231
- // let data = await resp.json();
232
-
233
- // data = data.values;
234
-
235
- // let imageUrl = data.dk_artikel.dest.image
236
- // ? Request.downloadUrlFor(data.dk_artikel.dest.image)
237
- // : "https://images.unsplash.com/photo-1559209172-0ff8f6d49ff7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80";
238
-
239
- // state.images[item] = imageUrl;
240
- // });
241
-
242
- // return state.images[item];
243
- // }
244
-
245
- async function onConfirm() {
246
- await cartStore.updateItem(
247
- state.currentItem.article.dest.key,
248
- state.currentNode.key,
249
- 0,
250
- );
251
- await updateCart();
252
- confirm.value.hide();
253
- }
254
-
255
- async function updateItem(e) {
256
- console.log("updateItem :", e);
257
-
258
- if (e.quantity === 0) {
259
- confirm.value.show();
260
- state.currentItem = e.item;
261
- state.currentNode = e.node;
262
- } else {
263
- await cartStore.updateItem(e.articleKey, e.node.key, e.quantity);
264
-
265
- await cartStore.init();
266
- }
267
- }
268
-
269
- function removeItem(e) {
270
- console.log("removeItem :", e);
271
-
272
- confirm.value.show();
273
- state.currentItem = e.item;
274
- state.currentNode = e.node;
275
- }
276
-
277
- async function onDialogHide() {
278
- // TODO: console error when removing items
279
- state.leaves[state.currentNode.key].forEach((item) => {
280
- if (item.key === state.currentItem.key) {
281
- item.quantity = 1;
282
- }
283
- });
284
-
285
- state.currentItem = {};
286
- state.currentNode = {};
287
- }
288
-
289
- async function updateCart() {
290
- state.nodes = [];
291
- state.leaves = {};
292
-
293
- await cartStore.init();
294
- await getChildren();
295
- }
296
-
297
- async function getChildren(parentKey = props.cartKey) {
298
- console.log("debug getChildren parentKey from comp: ", parentKey);
299
- const children = await cartStore.getChildren(parentKey);
300
- console.log("getChildren children: ", children);
301
-
302
- children.forEach(async (child) => {
303
- if (child.skel_type === "node") {
304
- state.nodes.push(child);
305
- await getChildren(child.key);
306
- } else {
307
- if (!Object.keys(state.leaves).includes(parentKey)) {
308
- state.leaves[parentKey] = [];
309
- }
310
- state.leaves[parentKey].push(child);
311
- }
312
- });
313
- }
314
-
315
- onBeforeMount(async () => {
316
- await cartStore.init();
317
- await getChildren();
318
-
319
- console.log("state.nodes", state.nodes);
320
-
321
- console.log("state.leaves", state.leaves);
322
- });
323
- </script>
324
-
325
- <style scoped>
326
- .viur-shop-cart-wrap {
327
- flex-direction: row;
328
- gap: var(--sl-spacing-x-large);
329
- align-items: flex-start;
330
- }
331
-
332
- .viur-shop-cart-sidebar-btn-wrap {
333
- display: flex;
334
- flex-direction: column;
335
- margin-top: var(--sl-spacing-large);
336
-
337
- sl-button {
338
- margin-bottom: var(--sl-spacing-x-small);
339
- }
340
- }
341
-
342
- sl-alert {
343
- margin-top: var(--sl-spacing-medium);
344
- margin-bottom: var(--sl-spacing-medium);
345
- }
346
-
347
- .viur-shop-cart-controlbar {
348
- width: 100%;
349
- display: flex;
350
- justify-content: space-between;
351
- align-items: center;
352
-
353
- sl-input {
354
- flex: 1;
355
-
356
- &::part(base) {
357
- margin-bottom: 0;
358
- }
359
- }
360
- }
361
-
362
- .viur-shop-cart-button-list {
363
- display: flex;
364
- flex-direction: row;
365
- gap: 10px;
366
-
367
- &.left {
368
- flex: 1;
369
- margin-right: 10px;
370
- }
371
- }
372
-
373
- .search {
374
- flex: 1 1 100%;
375
- margin-left: 10px;
376
- }
377
-
378
- .article-combobox {
379
- float: left;
380
- width: 75ch;
381
- }
382
-
383
- .viur-shop-cart-card-img {
384
- aspect-ratio: 1;
385
- }
386
-
387
- .viur-shop-cart-selection {
388
- flex: 1;
389
- }
390
-
391
- .cart-wrap {
392
- display: flex;
393
- flex-direction: column;
394
- width: 100%;
395
- }
396
-
397
- .soma-input {
398
- display: grid;
399
- grid-template-columns: 120px 1fr;
400
- align-items: center;
401
- }
402
-
403
- .soma-label {
404
- display: flex;
405
- flex-direction: row;
406
- align-items: center;
407
-
408
- sl-icon {
409
- margin-left: 5px;
410
- background-color: @highlightColor;
411
- color: #fff;
412
- aspect-ratio: 1;
413
- border-radius: 50%;
414
- padding: 0.3em;
415
- font-size: 0.6em;
416
- cursor: pointer;
417
- }
418
- }
419
-
420
- sl-tooltip {
421
- &::part(body) {
422
- line-height: 1.2;
423
- font-weight: 400;
424
- padding: 10px;
425
- }
426
- }
427
-
428
- .cart-tab {
429
- sl-tab {
430
- width: 25%;
431
-
432
- &::part(base) {
433
- width: 100%;
434
- height: 100%;
435
- display: flex;
436
- justify-content: center;
437
- align-items: center;
438
- position: relative;
439
- color: var(--sl-color-neutral-400);
440
- }
441
-
442
- &[aria-selected="true"]::part(base) {
443
- color: var(--ignt-color-primary) !important;
444
- }
445
- }
446
- }
447
-
448
- .cart-status-text {
449
- font-size: 0.8em;
450
- color: inherit;
451
- text-align: center;
452
- margin-top: 0.6em;
453
- white-space: initial;
454
- }
455
-
456
- .search-box {
457
- display: flex;
458
- flex-direction: row;
459
- flex-wrap: nowrap;
460
- align-items: stretch;
461
- margin-bottom: 30px;
462
-
463
- sl-button {
464
- &::part(base) {
465
- height: 100%;
466
- }
467
- }
468
-
469
- @media (--ignt-mq-max-break-medium) {
470
- flex-wrap: wrap;
471
- }
472
- }
473
-
474
- .article-combobox {
475
- flex: 1 1 100%;
476
- margin-bottom: 10px;
477
-
478
- &::part(base) {
479
- margin-bottom: 0;
480
- }
481
-
482
- @media (--ignt-mq-max-break-medium) {
483
- margin-bottom: 0;
484
- }
485
- }
486
-
487
- .comission-box {
488
- margin-right: 10px;
489
-
490
- &::part(base) {
491
- margin-bottom: 0;
492
- }
493
-
494
- @media (--ignt-mq-max-break-medium) {
495
- flex: 1;
496
- }
497
- }
498
-
499
- .search-amt {
500
- margin-right: 10px;
501
-
502
- &::part(base) {
503
- margin-bottom: 0;
504
- width: 80px;
505
- }
506
- }
507
-
508
- .viur-shop-cart-headline {
509
- &::part(base) {
510
- background-color: transparent;
511
- transition: all ease 0.3s;
512
- border-bottom: 1px solid transparent;
513
- height: auto;
514
- }
515
-
516
- :deep(.input--focused) {
517
- border-bottom: 1px solid var(--sl-color-primary-500) !important;
518
- }
519
-
520
- &::part(input) {
521
- color: var(--sl-color-primary-500);
522
- font-weight: 300;
523
- text-transform: uppercase;
524
- font-size: 1.85em;
525
- padding: 0.1em 0;
526
- height: auto;
527
- }
528
-
529
- &::part(suffix) {
530
- pointer-events: none;
531
- width: 1.5em;
532
- margin-left: -1em;
533
- font-size: 1.5em;
534
- }
535
-
536
- &:hover {
537
- &::part(base) {
538
- border-bottom: 1px solid var(--sl-color-primary-500);
539
- }
540
- }
541
- }
542
-
543
- .viur-shop-cart-descr {
544
- margin-top: 10px;
545
-
546
- &::part(base) {
547
- background-color: transparent;
548
- transition: all ease 0.3s;
549
- border-bottom: 1px solid transparent;
550
- margin-bottom: 0;
551
- }
552
-
553
- &::part(input) {
554
- padding: 0.1em 0;
555
- height: auto;
556
- color: var(--ignt-color-text);
557
- }
558
-
559
- &::part(suffix) {
560
- pointer-events: none;
561
- width: 1.5em;
562
- margin-left: -1em;
563
- font-size: 1.5em;
564
- }
565
-
566
- &:hover {
567
- &::part(base) {
568
- border-bottom: 1px solid var(--ignt-color-text);
569
- }
570
- }
571
- }
572
-
573
- sl-menu-item {
574
- &::part(base) {
575
- padding: 0.2em 0.9em 0.2em 0.8em;
576
- }
577
-
578
- &::part(checked-icon) {
579
- display: none;
580
- }
581
-
582
- &::part(prefix) {
583
- margin-right: 10px;
584
- }
585
-
586
- &::part(suffix) {
587
- margin-right: -1.5em;
588
- }
589
- }
590
-
591
- .primary-icon {
592
- color: var(--ignt-color-primary);
593
- }
594
-
595
- .delete-icon {
596
- color: @warnColor;
597
- }
598
-
599
- .dots {
600
- color: var(--ignt-color-primary);
601
- width: 1.5em;
602
- height: 100%;
603
- font-size: 1em;
604
- padding: 0.4em;
605
- }
606
-
607
- .viur-shop-cart-sidebar-info-line {
608
- display: flex;
609
- flex-direction: row;
610
- flex-wrap: nowrap;
611
- margin: var(--sl-spacing-2x-small) 0;
612
-
613
- &.total {
614
- font-weight: 600;
615
- border-top: 1px solid var(--sl-color-neutral-300);
616
- border-bottom: 1px solid var(--sl-color-neutral-300);
617
- padding: var(--sl-spacing-x-small) 0;
618
- margin: var(--sl-spacing-small) 0;
619
- }
620
-
621
- span {
622
- margin-right: auto;
623
- }
624
- }
625
-
626
- .viur-shop-cart-card {
627
- margin-bottom: var(--sl-spacing-x-large);
628
-
629
- &::part(header) {
630
- border-bottom: none;
631
- padding-top: 0;
632
- padding-right: 0;
633
- }
634
-
635
- &::part(image) {
636
- flex-basis: 25%;
637
- max-width: 250px;
638
- }
639
-
640
- &::part(body) {
641
- display: flex;
642
- flex: 1;
643
- padding-top: 0;
644
- padding-bottom: 0;
645
- padding-right: 0;
646
- }
647
-
648
- &::part(group) {
649
- padding: var(--sl-spacing-small) 0;
650
- }
651
- }
652
-
653
- .viur-shop-cart-card-body-row {
654
- display: grid;
655
- grid-template-columns: 1fr auto auto;
656
- gap: var(--sl-spacing-large);
657
- flex: 1;
658
- }
659
-
660
- .viur-shop-cart-card-body-info {
661
- display: flex;
662
- flex-direction: column;
663
- height: 100%;
664
- }
665
-
666
- .viur-shop-cart-card-descr {
667
- margin-bottom: auto;
668
- }
669
-
670
- .viur-shop-cart-card-body-footer {
671
- display: flex;
672
- flex-direction: row;
673
- gap: var(--sl-spacing-2x-small);
674
- margin-top: var(--sl-spacing-large);
675
- }
676
-
677
- .amount-input {
678
- width: 5em;
679
- }
680
-
681
- .viur-shop-cart-card-price-wrap {
682
- display: flex;
683
- flex-direction: column;
684
-
685
- .viur-shop-cart-card-small-print {
686
- font-size: 0.75em;
687
- margin-left: auto;
688
- }
689
- }
690
-
691
- .viur-shop-cart-card-price {
692
- font-size: 1.3em;
693
- }
694
-
695
- .viur-shop-cart-card-price-label {
696
- color: var(--ignt-color-primary);
697
- font-weight: 600;
698
- margin-bottom: 10px;
699
- font-size: 1em;
700
- margin-left: auto;
701
- }
702
- </style>