@viur/shop-components 0.1.1 → 0.1.3
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/.eslintrc.cjs +23 -0
- package/.prettierrc +11 -0
- package/package.json +1 -1
- package/src/Shop.vue +17 -9
- package/src/ShopOrderStepper.vue +22 -14
- package/src/ShopSummary.vue +49 -39
- package/src/Steps/ShopCart.vue +8 -7
- package/src/Steps/ShopOrderConfirm.vue +3 -3
- package/src/Steps/ShopUserDataGuest.vue +20 -16
- package/src/components/AddressForm.vue +10 -11
- package/src/components/AddressFormLayout.vue +10 -0
- package/src/components/CartItem.vue +90 -75
- package/src/components/CartItemSmall.vue +3 -3
- package/src/components/DiscountInput.vue +12 -7
- package/src/components/PaymentProviderUnzer.vue +8 -1
- package/src/components/StepperTab.vue +1 -1
- package/src/composables/address.js +12 -12
- package/src/composables/order.js +3 -5
- package/src/main.js +4 -1
- package/src/shop.js +6 -6
- package/src/translations/de.js +39 -11
- package/src/translations/fr.js +56 -0
package/.eslintrc.cjs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* eslint-env node */
|
|
2
|
+
require("@rushstack/eslint-patch/modern-module-resolution")
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
env: {
|
|
6
|
+
browser: true,
|
|
7
|
+
es2021: true,
|
|
8
|
+
node: true
|
|
9
|
+
},
|
|
10
|
+
root: true,
|
|
11
|
+
extends: ["plugin:vue/vue3-recommended", "plugin:prettier/recommended"],
|
|
12
|
+
plugins: ["vue", "prettier"],
|
|
13
|
+
parserOptions: {
|
|
14
|
+
ecmaVersion: "latest",
|
|
15
|
+
parser: "@typescript-eslint/parser"
|
|
16
|
+
},
|
|
17
|
+
rules: {
|
|
18
|
+
"vue/html-self-closing": 0,
|
|
19
|
+
"no-unused-vars": 1,
|
|
20
|
+
"vue/order-in-components": 0,
|
|
21
|
+
"vue/no-deprecated-slot-attribute":0,
|
|
22
|
+
}
|
|
23
|
+
}
|
package/.prettierrc
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/prettierrc",
|
|
3
|
+
"semi": false,
|
|
4
|
+
"singleQuote": false,
|
|
5
|
+
"singleAttributePerLine": true,
|
|
6
|
+
"printWidth": 120,
|
|
7
|
+
"bracketSpacing": true,
|
|
8
|
+
"bracketSameLine": false,
|
|
9
|
+
"arrowParens": "always",
|
|
10
|
+
"trailingComma": "none"
|
|
11
|
+
}
|
package/package.json
CHANGED
package/src/Shop.vue
CHANGED
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
<script setup>
|
|
63
|
-
import { onBeforeMount } from 'vue';
|
|
63
|
+
import { onBeforeMount, watch } from 'vue';
|
|
64
64
|
import ShopOrderStepper from './ShopOrderStepper.vue'
|
|
65
65
|
import ShopSummary from "./ShopSummary.vue"
|
|
66
66
|
import {useViurShopStore} from './shop'
|
|
@@ -73,6 +73,9 @@ const shopStore = useViurShopStore()
|
|
|
73
73
|
const {fetchOrder} = useOrder()
|
|
74
74
|
const {fetchCart} = useCart()
|
|
75
75
|
|
|
76
|
+
const emit = defineEmits('change')
|
|
77
|
+
|
|
78
|
+
|
|
76
79
|
const props = defineProps({
|
|
77
80
|
summary:{
|
|
78
81
|
default:false
|
|
@@ -120,14 +123,14 @@ onBeforeMount(()=>{
|
|
|
120
123
|
}else{
|
|
121
124
|
shopStore.navigateToTab('cart')
|
|
122
125
|
}
|
|
126
|
+
})
|
|
123
127
|
|
|
124
128
|
|
|
125
|
-
|
|
126
|
-
|
|
129
|
+
watch(()=>shopStore.state.currentTab, (newVal,oldVal)=>{
|
|
130
|
+
emit('change', newVal)
|
|
127
131
|
})
|
|
128
132
|
|
|
129
133
|
|
|
130
|
-
|
|
131
134
|
</script>
|
|
132
135
|
|
|
133
136
|
<style scoped>
|
|
@@ -168,24 +171,29 @@ onBeforeMount(()=>{
|
|
|
168
171
|
padding: var(--sl-spacing-medium);
|
|
169
172
|
overflow: hidden;
|
|
170
173
|
border-radius: var(--sl-border-radius-medium);
|
|
171
|
-
grid-column: auto / span var(--shop-sidebar-columns);
|
|
172
174
|
/* height has to be set or sidebar grows until infinity... */
|
|
173
175
|
height: min-content;
|
|
176
|
+
grid-column: auto / span 12;
|
|
177
|
+
order: -1;
|
|
178
|
+
& > * + * {
|
|
179
|
+
margin-top: var(--sl-spacing-small);
|
|
180
|
+
}
|
|
174
181
|
@media (min-width: 1024px) {
|
|
175
182
|
position: sticky;
|
|
176
183
|
max-height: calc(100vh - var(--viur-shop-sidebar-height-offset) - 2 * var(--padding));
|
|
177
184
|
top: var(--padding);
|
|
178
185
|
bottom: var(--padding);
|
|
186
|
+
grid-column: auto / span var(--shop-sidebar-columns);
|
|
187
|
+
order: unset;
|
|
179
188
|
}
|
|
180
189
|
}
|
|
181
190
|
|
|
182
191
|
.viur-shop-stepper-wrap {
|
|
183
192
|
display: flex;
|
|
184
193
|
flex-direction: column;
|
|
185
|
-
grid-column: auto / span
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
grid-column: auto / span 12;
|
|
194
|
+
grid-column: auto / span 12;
|
|
195
|
+
@media (min-width: 1024px) {
|
|
196
|
+
grid-column: auto / span var(--shop-main-columns);
|
|
189
197
|
}
|
|
190
198
|
|
|
191
199
|
@media (max-width: 600px) {
|
package/src/ShopOrderStepper.vue
CHANGED
|
@@ -12,25 +12,27 @@
|
|
|
12
12
|
|
|
13
13
|
<sl-tab-panel :name="name">
|
|
14
14
|
<template v-if="tab?.['loaded']">
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
|
|
16
|
+
|
|
17
17
|
<component :is="tab['component']">
|
|
18
18
|
<template #['template_'+name]>
|
|
19
|
-
<slot :name="'template_'+name"></slot>
|
|
19
|
+
<slot :name="'template_'+name"></slot>
|
|
20
20
|
</template>
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
<template v-slot="slotProps">
|
|
23
|
-
<sl-bar>
|
|
23
|
+
<sl-bar class="viur-shop-stepper-bar">
|
|
24
24
|
<div slot="right">
|
|
25
25
|
<span v-if="slotProps.hint" class="hint">{{ slotProps.hint }}</span>
|
|
26
26
|
<sl-button
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
:class="{'action-button-hint':slotProps.hint}"
|
|
28
|
+
variant="success"
|
|
29
|
+
size="large"
|
|
30
|
+
:disabled="active(slotProps)"
|
|
31
|
+
@click="nextStep(slotProps)"
|
|
32
|
+
:loading="tab['validating']"
|
|
32
33
|
>
|
|
33
34
|
{{slotProps.nextName}}
|
|
35
|
+
<sl-icon slot="suffix" name="chevron-right"></sl-icon>
|
|
34
36
|
</sl-button>
|
|
35
37
|
</div>
|
|
36
38
|
</sl-bar>
|
|
@@ -77,7 +79,7 @@ function nextStep(obj){
|
|
|
77
79
|
useTimeoutFn(() => {
|
|
78
80
|
shopStore.navigateToNext()
|
|
79
81
|
}, 300)
|
|
80
|
-
|
|
82
|
+
|
|
81
83
|
}else{
|
|
82
84
|
shopStore.state.tabs[shopStore.state.currentTab]['valid']=false
|
|
83
85
|
shopStore.state.tabs[shopStore.state.currentTab]['validating']=false
|
|
@@ -97,6 +99,10 @@ function active(obj){
|
|
|
97
99
|
|
|
98
100
|
<style scoped>
|
|
99
101
|
|
|
102
|
+
.viur-shop-stepper-bar {
|
|
103
|
+
margin-top: var(--shop-leaf-gap, var(--ignt-spacing-small))
|
|
104
|
+
}
|
|
105
|
+
|
|
100
106
|
.hint{
|
|
101
107
|
border:1px solid var(--sl-color-neutral-200);
|
|
102
108
|
border-top-left-radius: var(--sl-input-border-radius-medium);
|
|
@@ -104,11 +110,13 @@ function active(obj){
|
|
|
104
110
|
background-color: var(--sl-color-neutral-100);
|
|
105
111
|
color:var(--sl-color-neutral-800);
|
|
106
112
|
padding: 0 var(--sl-spacing-small);
|
|
107
|
-
height:
|
|
108
|
-
|
|
113
|
+
height: auto;
|
|
114
|
+
min-height: var(--sl-input-height-large);
|
|
115
|
+
font-size: var(--sl-button-font-size-large);
|
|
116
|
+
line-height: calc(var(--sl-input-height-large) - var(--sl-input-border-width)* 2);
|
|
109
117
|
}
|
|
110
118
|
.action-button-hint::part(base){
|
|
111
119
|
border-top-left-radius: 0;
|
|
112
120
|
border-bottom-left-radius: 0;
|
|
113
121
|
}
|
|
114
|
-
</style>
|
|
122
|
+
</style>
|
package/src/ShopSummary.vue
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<LoadingHandler :isLoading="
|
|
3
|
-
<h2 class="viur-shop-cart-sidebar-headline headline"
|
|
2
|
+
<LoadingHandler :isLoading="state.loading">
|
|
3
|
+
<h2 class="viur-shop-cart-sidebar-headline headline" v-html="$t('shop.summary_headline')"></h2>
|
|
4
4
|
<div class="viur-shop-cart-sidebar-summary">
|
|
5
5
|
<div class="viur-shop-cart-sidebar-summary-item" v-for="item in state.items">
|
|
6
6
|
<template v-if="(!shopStore.state.showNodes && item.skel_type === 'leaf') || shopStore.state.showNodes">
|
|
7
|
-
<div class="viur-shop-cart-sidebar-summary-item-amount" v-if="item.skel_type === 'leaf'">
|
|
7
|
+
<div class="viur-shop-cart-sidebar-summary-item-amount" v-if="item.skel_type === 'leaf'">
|
|
8
|
+
{{ item.quantity }} ×
|
|
8
9
|
</div>
|
|
9
10
|
<div class="viur-shop-cart-sidebar-summary-item-name" v-html="item.skel_type === 'node' ? item.name : item.shop_name"></div>
|
|
10
11
|
<div class="viur-shop-cart-sidebar-summary-item-price">
|
|
@@ -15,18 +16,18 @@
|
|
|
15
16
|
</template>
|
|
16
17
|
</div>
|
|
17
18
|
</div>
|
|
18
|
-
<div class="viur-shop-cart-sidebar-info
|
|
19
|
-
<span
|
|
19
|
+
<div class="viur-shop-cart-sidebar-info">
|
|
20
|
+
<span v-html="$t('shop.summary_subtotal')"></span>
|
|
20
21
|
<sl-format-number lang="de" type="currency" currency="EUR" :value="state.cartTotal">
|
|
21
22
|
</sl-format-number>
|
|
22
23
|
</div>
|
|
23
|
-
<div class="viur-shop-cart-sidebar-info
|
|
24
|
-
<span
|
|
24
|
+
<div class="viur-shop-cart-sidebar-info">
|
|
25
|
+
<span v-html="$t('shop.summary_shipping_total')"></span>
|
|
25
26
|
<sl-format-number lang="de" type="currency" currency="EUR" :value="state.shippingTotal">
|
|
26
27
|
</sl-format-number>
|
|
27
28
|
</div>
|
|
28
29
|
<div class="viur-shop-cart-shipping-item" v-if="shopStore.state.order?.cart?.dest?.shipping">
|
|
29
|
-
<span
|
|
30
|
+
<span v-html="$t('shop.summary_delivery_time')"></span>
|
|
30
31
|
<span>
|
|
31
32
|
{{
|
|
32
33
|
shopStore.state.order?.cart?.dest?.shipping?.dest?.delivery_time_range ?
|
|
@@ -35,28 +36,28 @@
|
|
|
35
36
|
}} {{ shopStore.state.order?.cart?.dest?.shipping?.dest?.delivery_time_range === 1 ? "Tag" : "Tage" }}
|
|
36
37
|
</span>
|
|
37
38
|
</div>
|
|
38
|
-
<div class="viur-shop-cart-sidebar-info
|
|
39
|
-
<span
|
|
39
|
+
<div class="viur-shop-cart-sidebar-info" v-if="shopStore.state.cartRoot.discount">
|
|
40
|
+
<span v-html="$t('shop.summary_discount')"></span>
|
|
40
41
|
<sl-format-number lang="de" type="currency" currency="EUR" :value="state.discount">
|
|
41
42
|
</sl-format-number>
|
|
42
43
|
</div>
|
|
43
44
|
<discount-input v-if="shopStore.state.currentTab!=='complete'"></discount-input>
|
|
44
|
-
<div class="viur-shop-cart-sidebar-info
|
|
45
|
+
<div class="viur-shop-cart-sidebar-info">
|
|
45
46
|
</div>
|
|
46
|
-
|
|
47
|
-
<div class="viur-shop-cart-sidebar-info-
|
|
48
|
-
<span
|
|
47
|
+
|
|
48
|
+
<div class="viur-shop-cart-sidebar-info viur-shop-cart-sidebar-info--total">
|
|
49
|
+
<span v-html="$t('shop.summary_total')"></span>
|
|
49
50
|
<sl-format-number lang="de" type="currency" currency="EUR" :value="state.total">
|
|
50
51
|
</sl-format-number>
|
|
51
52
|
</div>
|
|
52
|
-
<div class="viur-shop-cart-sidebar-info-
|
|
53
|
-
<span
|
|
54
|
-
<sl-format-number lang="de" type="currency" currency="EUR" :value="
|
|
53
|
+
<div class="viur-shop-cart-sidebar-info " v-for="vatObj in state.vat">
|
|
54
|
+
<span v-html="$t('shop.summary_vat', {'percentage':calc_percent(vatObj.percentage) })"></span>
|
|
55
|
+
<sl-format-number lang="de" type="currency" currency="EUR" :value="vatObj.value">
|
|
55
56
|
</sl-format-number>
|
|
56
57
|
</div>
|
|
57
58
|
<slot name="action-buttons" >
|
|
58
59
|
<div class="viur-shop-cart-sidebar-btn-wrap" v-if="false && !shopStore.state.order?.['is_paid']">
|
|
59
|
-
<sl-button variant="
|
|
60
|
+
<sl-button variant="success" size="large">{{ $t("shop.summary_checkout") }}</sl-button>
|
|
60
61
|
</div>
|
|
61
62
|
</slot>
|
|
62
63
|
</LoadingHandler>
|
|
@@ -74,7 +75,7 @@ const { fetchCart, addItem, state: cartState } = useCart();
|
|
|
74
75
|
|
|
75
76
|
const state = reactive({
|
|
76
77
|
items: computed(() => { return shopStore.state.cartList }),
|
|
77
|
-
cartTotal: computed(() => {
|
|
78
|
+
cartTotal: computed(() => {
|
|
78
79
|
let sum = state.items.reduce((acc,item)=>{
|
|
79
80
|
if (item.skel_type==="leaf"){
|
|
80
81
|
acc+=item.price.current *item.quantity
|
|
@@ -101,7 +102,7 @@ const state = reactive({
|
|
|
101
102
|
return shopStore.state.cartRoot.total
|
|
102
103
|
}),
|
|
103
104
|
vat:computed(()=>{
|
|
104
|
-
return shopStore.state.cartRoot.vat
|
|
105
|
+
return shopStore.state.cartRoot.vat
|
|
105
106
|
}),
|
|
106
107
|
sum:computed(()=>{
|
|
107
108
|
let sum = state.items.reduce((acc,item)=>{
|
|
@@ -112,36 +113,47 @@ const state = reactive({
|
|
|
112
113
|
return acc;
|
|
113
114
|
},0)
|
|
114
115
|
return sum
|
|
115
|
-
})
|
|
116
|
+
}),
|
|
117
|
+
loading:false
|
|
116
118
|
})
|
|
117
119
|
|
|
118
120
|
onBeforeMount(() => {
|
|
121
|
+
state.loading=true
|
|
119
122
|
if (!shopStore.state.cartList.length) {
|
|
120
|
-
fetchCart()
|
|
123
|
+
fetchCart().then(()=>state.loading=false).catch(()=>state.loading=false)
|
|
124
|
+
}else{
|
|
125
|
+
state.loading=false
|
|
121
126
|
}
|
|
122
127
|
})
|
|
128
|
+
|
|
129
|
+
function calc_percent(val){
|
|
130
|
+
return new Intl.NumberFormat("de-DE", {
|
|
131
|
+
style: "percent",
|
|
132
|
+
minimumFractionDigits: 0,
|
|
133
|
+
maximumFractionDigits: 0
|
|
134
|
+
}).format(val);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
123
138
|
</script>
|
|
124
139
|
|
|
125
140
|
<style scoped>
|
|
126
|
-
|
|
141
|
+
|
|
142
|
+
.viur-shop-cart-sidebar-info {
|
|
127
143
|
display: flex;
|
|
128
144
|
flex-direction: row;
|
|
129
145
|
flex-wrap: nowrap;
|
|
130
|
-
margin: var(--sl-spacing-2x-small) 0;
|
|
131
|
-
|
|
132
|
-
&.total {
|
|
133
|
-
font-weight: 600;
|
|
134
|
-
border-top: 1px solid var(--sl-color-neutral-300);
|
|
135
|
-
border-bottom: 1px solid var(--sl-color-neutral-300);
|
|
136
|
-
padding: var(--sl-spacing-x-small) 0;
|
|
137
|
-
margin: var(--sl-spacing-small) 0;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
146
|
span {
|
|
141
147
|
margin-right: auto;
|
|
142
148
|
}
|
|
143
149
|
}
|
|
144
150
|
|
|
151
|
+
.viur-shop-cart-sidebar-info--total {
|
|
152
|
+
font-weight: 600;
|
|
153
|
+
border-top: 1px solid var(--sl-color-neutral-300);
|
|
154
|
+
padding-top: var(--sl-spacing-x-small);
|
|
155
|
+
}
|
|
156
|
+
|
|
145
157
|
.viur-shop-cart-sidebar-btn-wrap {
|
|
146
158
|
display: flex;
|
|
147
159
|
flex-direction: column;
|
|
@@ -152,18 +164,17 @@ onBeforeMount(() => {
|
|
|
152
164
|
}
|
|
153
165
|
}
|
|
154
166
|
|
|
155
|
-
.viur-shop-cart-sidebar-headline {
|
|
156
|
-
margin: 0 0 var(--sl-spacing-large) 0;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
167
|
.viur-shop-cart-sidebar-summary {
|
|
160
168
|
display: flex;
|
|
161
169
|
flex-direction: column;
|
|
162
170
|
overflow: auto;
|
|
163
|
-
margin-bottom: var(--sl-spacing-small);
|
|
164
171
|
padding-right: 4px;
|
|
165
172
|
margin-right: -4px;
|
|
166
173
|
|
|
174
|
+
& > *:not(:empty) + *:not(:empty) {
|
|
175
|
+
margin-top: var(--sl-spacing-small);
|
|
176
|
+
}
|
|
177
|
+
|
|
167
178
|
&::-webkit-scrollbar {
|
|
168
179
|
width: 3px;
|
|
169
180
|
}
|
|
@@ -187,7 +198,6 @@ onBeforeMount(() => {
|
|
|
187
198
|
flex-direction: row;
|
|
188
199
|
flex-wrap: nowrap;
|
|
189
200
|
gap: var(--sl-spacing-medium);
|
|
190
|
-
margin-bottom: var(--sl-spacing-small);
|
|
191
201
|
}
|
|
192
202
|
|
|
193
203
|
.viur-shop-cart-sidebar-summary-item-name {
|
package/src/Steps/ShopCart.vue
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<loading-handler :isLoading="cartState.isLoading" :isUpdating="cartState.isUpdating">
|
|
3
|
-
<div class="item-wrapper" v-if="state.items.length>0">
|
|
3
|
+
<div class="viur-shop-item-wrapper" v-if="state.items.length>0">
|
|
4
4
|
<cart-item v-for="item in state.items" :item="item"
|
|
5
5
|
:edit="!shopStore.state.order?.['is_checkout_in_progress']"
|
|
6
6
|
>
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
</template>
|
|
14
14
|
</shop-alert>
|
|
15
15
|
</loading-handler>
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
<slot name="template_cart">
|
|
18
18
|
</slot>
|
|
19
19
|
|
|
20
20
|
<slot
|
|
21
|
-
nextName="
|
|
21
|
+
:nextName="$t('shop.proceed-checkout')"
|
|
22
22
|
:activefunction="()=>state.items.length>0"
|
|
23
23
|
:nextfunction="()=>true"
|
|
24
24
|
>
|
|
@@ -48,10 +48,11 @@ onBeforeMount(()=>{
|
|
|
48
48
|
|
|
49
49
|
</script>
|
|
50
50
|
<style scoped>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
|
|
52
|
+
.viur-shop-item-wrapper {
|
|
53
|
+
display:flex;
|
|
54
|
+
flex-direction: column;
|
|
55
|
+
gap: var(--shop-leaf-gap, var(--ignt-spacing-small));
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
</style>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<h2 class="viur-shop-cart-headline headline">{{ $t('shop.check_order')}}</h2>
|
|
4
4
|
<div class="viur-shop-cart-address-wrap">
|
|
5
5
|
<div class="viur-shop-cart-address">
|
|
6
|
-
<div class="viur-shop-
|
|
6
|
+
<div class="viur-shop-user-data-headline">
|
|
7
7
|
{{ $t('viur.shop.skeleton.cartnode.shipping_address') }}
|
|
8
8
|
</div>
|
|
9
9
|
<template v-if="state.shippingAddress">
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
</template>
|
|
18
18
|
</div>
|
|
19
19
|
<div class="viur-shop-cart-address">
|
|
20
|
-
<div class="viur-shop-
|
|
20
|
+
<div class="viur-shop-user-data-headline">
|
|
21
21
|
{{ $t('viur.shop.skeleton.order.billing_address') }}
|
|
22
22
|
</div>
|
|
23
23
|
<template v-if="state.billingAddress">
|
|
@@ -271,7 +271,7 @@ sl-menu-item {
|
|
|
271
271
|
margin-bottom: var(--sl-spacing-x-large);
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
-
.viur-shop-
|
|
274
|
+
.viur-shop-user-data-headline {
|
|
275
275
|
display: flex;
|
|
276
276
|
flex-direction: row;
|
|
277
277
|
flex-wrap: nowrap;
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="viur-shop-
|
|
3
|
-
{{ $t("skeleton.address.address_type.
|
|
2
|
+
<div class="viur-shop-user-data-headline">
|
|
3
|
+
{{ $t("skeleton.address.address_type.billing") }}
|
|
4
4
|
</div>
|
|
5
|
-
|
|
6
|
-
<address-form :formtype="addressState.billingIsShipping?'both':'shipping'">
|
|
5
|
+
<address-form :formtype="addressState.billingIsShipping?'both':'billing'">
|
|
7
6
|
</address-form>
|
|
8
|
-
<div>
|
|
9
|
-
<sl-switch :checked="addressState.billingIsShipping" @sl-change="switchAddresses">{{ $t('shop.use_shipping_as_billing_address') }}</sl-switch>
|
|
10
|
-
</div>
|
|
11
7
|
|
|
8
|
+
<sl-switch class="viur-shop-user-data-switch" :checked="addressState.billingIsShipping" @sl-change="switchAddresses">
|
|
9
|
+
{{ $t('shop.use_shipping_as_billing_address') }}
|
|
10
|
+
</sl-switch>
|
|
11
|
+
|
|
12
12
|
<div v-show="!addressState.billingIsShipping">
|
|
13
|
-
<div class="viur-shop-
|
|
14
|
-
{{ $t("skeleton.address.address_type.
|
|
13
|
+
<div class="viur-shop-user-data-headline">
|
|
14
|
+
{{ $t("skeleton.address.address_type.shipping") }}
|
|
15
15
|
</div>
|
|
16
|
-
<address-form formtype="
|
|
16
|
+
<address-form formtype="shipping" >
|
|
17
|
+
</address-form>
|
|
17
18
|
</div>
|
|
18
|
-
|
|
19
19
|
<slot name="template_userdata">
|
|
20
20
|
</slot>
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
<slot
|
|
23
23
|
nextName="weiter"
|
|
24
24
|
:activefunction="()=>true"
|
|
@@ -46,9 +46,13 @@ function switchAddresses(event){
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
onBeforeMount(()=>{
|
|
49
|
-
if (
|
|
49
|
+
if (!shopStore.state.order?.['billing_address']?.['dest']){
|
|
50
|
+
addressState.billingIsShipping = true //init
|
|
51
|
+
}
|
|
52
|
+
else if (shopStore.state.order?.['billing_address']?.['dest']?.['address_type']?.includes('shipping')){
|
|
50
53
|
addressState.billingIsShipping = true
|
|
51
|
-
}
|
|
54
|
+
}
|
|
55
|
+
else{
|
|
52
56
|
addressState.billingIsShipping = false
|
|
53
57
|
}
|
|
54
58
|
})
|
|
@@ -70,7 +74,7 @@ async function nextStep(){
|
|
|
70
74
|
</script>
|
|
71
75
|
|
|
72
76
|
<style scoped>
|
|
73
|
-
.viur-shop-
|
|
77
|
+
.viur-shop-user-data-headline {
|
|
74
78
|
display: flex;
|
|
75
79
|
flex-direction: row;
|
|
76
80
|
flex-wrap: nowrap;
|
|
@@ -79,4 +83,4 @@ async function nextStep(){
|
|
|
79
83
|
font-weight: 600;
|
|
80
84
|
margin-bottom: var(--sl-spacing-medium);
|
|
81
85
|
}
|
|
82
|
-
</style>
|
|
86
|
+
</style>
|
|
@@ -29,22 +29,22 @@ const {state:addressState} = useAddress();
|
|
|
29
29
|
const props = defineProps({
|
|
30
30
|
formtype:{
|
|
31
31
|
type:String,
|
|
32
|
-
default:"
|
|
32
|
+
default:"billing" // formtype: shipping, billing, both
|
|
33
33
|
}
|
|
34
34
|
})
|
|
35
35
|
|
|
36
36
|
const state = reactive({
|
|
37
37
|
formtype:computed(()=>{
|
|
38
|
-
if (['
|
|
39
|
-
return "
|
|
38
|
+
if (['billing','both'].includes(props.formtype)){
|
|
39
|
+
return "billing"
|
|
40
40
|
}
|
|
41
|
-
return '
|
|
41
|
+
return 'shipping'
|
|
42
42
|
}),
|
|
43
43
|
|
|
44
44
|
action: computed(()=>{
|
|
45
45
|
if (state.formtype ==='shipping' && shopStore.state.cartRoot?.['shipping_address']){
|
|
46
46
|
return 'edit'
|
|
47
|
-
} else if (
|
|
47
|
+
} else if (state.formtype === 'billing' && shopStore.state.order?.['billing_address']){
|
|
48
48
|
return 'edit'
|
|
49
49
|
} else {
|
|
50
50
|
return 'add'
|
|
@@ -54,7 +54,7 @@ const state = reactive({
|
|
|
54
54
|
skelkey:computed(()=>{
|
|
55
55
|
if (state.formtype === 'shipping' && shopStore.state.cartRoot?.['shipping_address']){
|
|
56
56
|
return shopStore.state.cartRoot['shipping_address']?.['dest']?.['key']
|
|
57
|
-
} else if (
|
|
57
|
+
} else if (state.formtype === 'billing' && shopStore.state.order?.['billing_address']){
|
|
58
58
|
return shopStore.state.order?.['billing_address']?.['dest']?.['key']
|
|
59
59
|
}
|
|
60
60
|
return null
|
|
@@ -78,14 +78,13 @@ function formChange(data){
|
|
|
78
78
|
|
|
79
79
|
watch(()=>addressState.billingIsShipping, (newVal,oldVal)=>{
|
|
80
80
|
if(oldVal && !newVal){
|
|
81
|
-
if(shopStore.state.
|
|
82
|
-
shopStore.state.
|
|
81
|
+
if(shopStore.state.cartRoot?.['shipping_address']){
|
|
82
|
+
shopStore.state.cartRoot['shipping_address'] = null
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
addressState[`billingForm`].state.skel = {'address_type':state.address_type, 'customer_type':'private'}
|
|
86
|
-
|
|
84
|
+
addressState[`shippingForm`].state.skel = {'address_type':state.address_type, 'customer_type':'private'}
|
|
87
85
|
}
|
|
88
86
|
|
|
87
|
+
addressState[`${state.formtype}Form`].state.skel['address_type'] = state.address_type
|
|
89
88
|
})
|
|
90
89
|
|
|
91
90
|
</script>
|
|
@@ -46,6 +46,16 @@
|
|
|
46
46
|
label="placeholder">
|
|
47
47
|
</slot>
|
|
48
48
|
|
|
49
|
+
<slot boneName="email"
|
|
50
|
+
:widget="getBoneWidget(formState.structure['email']['type'])"
|
|
51
|
+
label="placeholder">
|
|
52
|
+
</slot>
|
|
53
|
+
|
|
54
|
+
<slot boneName="phone"
|
|
55
|
+
:widget="getBoneWidget(formState.structure['phone']['type'])"
|
|
56
|
+
label="placeholder">
|
|
57
|
+
</slot>
|
|
58
|
+
|
|
49
59
|
</div>
|
|
50
60
|
</template>
|
|
51
61
|
<script setup>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="item-wrapper">
|
|
2
|
+
<div class="viur-shop-item-wrapper">
|
|
3
3
|
<sl-card horizontal class="viur-shop-cart-leaf">
|
|
4
4
|
<img
|
|
5
5
|
class="viur-shop-cart-leaf-image"
|
|
@@ -12,44 +12,48 @@
|
|
|
12
12
|
)
|
|
13
13
|
"
|
|
14
14
|
/>
|
|
15
|
+
<h5 v-if="item.shop_art_no_or_gtin" class="viur-shop-cart-leaf-artno" slot="header">
|
|
16
|
+
{{ getValue(item.shop_art_no_or_gtin) }}
|
|
17
|
+
</h5>
|
|
15
18
|
<h4
|
|
16
19
|
class="viur-shop-cart-leaf-headline headline"
|
|
17
20
|
v-html="getValue(item.shop_name)"
|
|
18
21
|
></h4>
|
|
19
|
-
<h5 class="viur-shop-cart-leaf-artno">
|
|
20
|
-
{{ getValue(item.shop_art_no_or_gtin) }}
|
|
21
|
-
</h5>
|
|
22
22
|
<div
|
|
23
23
|
class="viur-shop-cart-leaf-description"
|
|
24
24
|
v-html="getValue(item.shop_description)"
|
|
25
25
|
></div>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<sl-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
26
|
+
|
|
27
|
+
<div class="viur-shop-cart-leaf-quantity">
|
|
28
|
+
<div class="viur-shop-cart-leaf-label">{{$t('shop.quantity')}}</div>
|
|
29
|
+
<sl-input
|
|
30
|
+
:disabled="!edit"
|
|
31
|
+
class="viur-shop-cart-leaf-value viur-shop-cart-leaf-value--quantity"
|
|
32
|
+
type="number"
|
|
33
|
+
placeholder="Number"
|
|
34
|
+
min="0"
|
|
35
|
+
noSpinButtons
|
|
36
|
+
:value="item.quantity"
|
|
37
|
+
@sl-change="changeAmount($event.target.value)"
|
|
38
|
+
>
|
|
39
|
+
<dialog-Button slot="prefix" class="decent" v-if="item.quantity===1" variant="danger" outline>
|
|
40
|
+
<sl-icon name="trash"></sl-icon>
|
|
41
|
+
<template #dialog="{close}">
|
|
42
|
+
{{ $t('messages.remove_article_from_cart') }}
|
|
43
|
+
<sl-bar>
|
|
44
|
+
<sl-button slot="left" @click="close">{{$t('actions.cancel')}}</sl-button>
|
|
45
|
+
<sl-button slot="right" variant="danger" @click="removeArticle(); close()">{{ $t('actions.delete') }}</sl-button>
|
|
46
|
+
</sl-bar>
|
|
47
|
+
</template>
|
|
48
|
+
</dialog-Button>
|
|
49
|
+
<sl-button slot="prefix" v-else @click="changeAmount(item.quantity-=1)">
|
|
50
|
+
<sl-icon name="dash-lg"></sl-icon>
|
|
51
|
+
</sl-button>
|
|
52
|
+
<sl-button slot="suffix" @click="changeAmount(item.quantity+=1)">
|
|
53
|
+
<sl-icon name="plus-lg"></sl-icon>
|
|
54
|
+
</sl-button>
|
|
55
|
+
</sl-input>
|
|
56
|
+
</div>
|
|
53
57
|
|
|
54
58
|
<div class="viur-shop-cart-leaf-unitprice">
|
|
55
59
|
<div class="viur-shop-cart-leaf-label">{{$t('shop.unit_price')}}</div>
|
|
@@ -63,11 +67,13 @@
|
|
|
63
67
|
</sl-format-number>
|
|
64
68
|
</div>
|
|
65
69
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
<div class="viur-shop-cart-leaf-availability">
|
|
71
|
+
<div class="viur-shop-cart-leaf-label">{{ $t('shop.availability') }}</div>
|
|
72
|
+
<div class="availability"
|
|
73
|
+
:class="`availability--${item.shop_availability}`"
|
|
74
|
+
>
|
|
70
75
|
{{$t(item.shop_availability)}}
|
|
76
|
+
</div>
|
|
71
77
|
</div>
|
|
72
78
|
|
|
73
79
|
<div class="viur-shop-cart-leaf-price">
|
|
@@ -125,44 +131,44 @@ function removeArticle(){
|
|
|
125
131
|
@layer foundation.shop {
|
|
126
132
|
|
|
127
133
|
.availability {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
134
|
+
display: flex;
|
|
135
|
+
flex-basis: 70%;
|
|
136
|
+
font-size: .9em;
|
|
137
|
+
align-items: center;
|
|
138
|
+
justify-content: flex-start;
|
|
139
|
+
white-space: nowrap;
|
|
140
|
+
&:before {
|
|
141
|
+
content: '';
|
|
142
|
+
display: block;
|
|
143
|
+
background-color: #666;
|
|
144
|
+
width: .7em;
|
|
145
|
+
height: .7em;
|
|
146
|
+
border-radius: 50%;
|
|
147
|
+
margin-right: 5px;
|
|
148
|
+
margin-bottom: 2px;
|
|
149
|
+
}
|
|
143
150
|
}
|
|
144
|
-
|
|
145
|
-
.availability--
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
151
|
+
.availability--onrequest,
|
|
152
|
+
.availability--instock {
|
|
153
|
+
color: var(--ignt-color-success);
|
|
154
|
+
&:before {
|
|
155
|
+
background-color: var(--ignt-color-success);
|
|
156
|
+
}
|
|
150
157
|
}
|
|
151
|
-
|
|
152
|
-
.availability--
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
158
|
+
.availability--discontinued,
|
|
159
|
+
.availability--outofstock {
|
|
160
|
+
color: var(--ignt-color-danger);
|
|
161
|
+
&:before {
|
|
162
|
+
background-color: var(--ignt-color-danger);
|
|
163
|
+
}
|
|
157
164
|
}
|
|
158
|
-
|
|
159
|
-
.availability--
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
165
|
+
.availability--limited,
|
|
166
|
+
.availability--preorder {
|
|
167
|
+
color: var(--ignt-color-warning);
|
|
168
|
+
&:before {
|
|
169
|
+
background-color: var(--ignt-color-warning);
|
|
170
|
+
}
|
|
164
171
|
}
|
|
165
|
-
}
|
|
166
172
|
|
|
167
173
|
.viur-shop-cart-leaf {
|
|
168
174
|
--shop-leaf-label-color: var(--ignt-color-primary);
|
|
@@ -174,6 +180,7 @@ function removeArticle(){
|
|
|
174
180
|
&::part(base) {
|
|
175
181
|
display: flex;
|
|
176
182
|
position: relative;
|
|
183
|
+
padding-bottom: var(--shop-leaf-gap, var(--ignt-spacing-small));
|
|
177
184
|
}
|
|
178
185
|
|
|
179
186
|
&::part(header) {
|
|
@@ -189,8 +196,9 @@ function removeArticle(){
|
|
|
189
196
|
&::part(body) {
|
|
190
197
|
display: grid;
|
|
191
198
|
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
192
|
-
|
|
193
|
-
|
|
199
|
+
grid-template-rows: fit-content(20%) 1fr fit-content(20%);
|
|
200
|
+
gap: var(--shop-leaf-gap, var(--ignt-spacing-small));
|
|
201
|
+
padding: 0 var(--sl-spacing-large);
|
|
194
202
|
height: 100%;
|
|
195
203
|
}
|
|
196
204
|
|
|
@@ -201,8 +209,8 @@ function removeArticle(){
|
|
|
201
209
|
@media (max-width: 600px) {
|
|
202
210
|
&::part(body) {
|
|
203
211
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
204
|
-
gap: var(--
|
|
205
|
-
padding: var(--sl-spacing-large);
|
|
212
|
+
gap: var(--shop-leaf-gap, var(--ignt-spacing-small));
|
|
213
|
+
padding: 0 var(--sl-spacing-large);
|
|
206
214
|
height: 100%;
|
|
207
215
|
}
|
|
208
216
|
|
|
@@ -219,7 +227,6 @@ function removeArticle(){
|
|
|
219
227
|
|
|
220
228
|
.viur-shop-cart-leaf-headline {
|
|
221
229
|
grid-column: 1 / span 4;
|
|
222
|
-
order: -2;
|
|
223
230
|
margin: 0;
|
|
224
231
|
font-size: var(--shop-leaf-headline-font-size);
|
|
225
232
|
|
|
@@ -229,6 +236,7 @@ function removeArticle(){
|
|
|
229
236
|
}
|
|
230
237
|
|
|
231
238
|
.viur-shop-cart-leaf-artno {
|
|
239
|
+
font-size: .8em;
|
|
232
240
|
grid-column: 1 / span 5;
|
|
233
241
|
margin: 0;
|
|
234
242
|
|
|
@@ -284,6 +292,7 @@ function removeArticle(){
|
|
|
284
292
|
}
|
|
285
293
|
|
|
286
294
|
.viur-shop-cart-leaf-unitprice {
|
|
295
|
+
grid-column: 3 / span 1;
|
|
287
296
|
align-self: center;
|
|
288
297
|
|
|
289
298
|
@media (max-width: 600px) {
|
|
@@ -291,6 +300,12 @@ function removeArticle(){
|
|
|
291
300
|
}
|
|
292
301
|
}
|
|
293
302
|
|
|
303
|
+
.viur-shop-cart-leaf-availability {
|
|
304
|
+
grid-column: 4 / span 1;
|
|
305
|
+
align-self: center;
|
|
306
|
+
text-align: right;
|
|
307
|
+
}
|
|
308
|
+
|
|
294
309
|
.viur-shop-cart-leaf-label,
|
|
295
310
|
.viur-shop-cart-leaf-value--quantity::part(form-control-label) {
|
|
296
311
|
color: var(--shop-leaf-label-color);
|
|
@@ -317,7 +332,7 @@ function removeArticle(){
|
|
|
317
332
|
}
|
|
318
333
|
}
|
|
319
334
|
|
|
320
|
-
.item-wrapper{
|
|
335
|
+
.viur-shop-item-wrapper{
|
|
321
336
|
position: relative;
|
|
322
337
|
}
|
|
323
338
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="item-wrapper">
|
|
2
|
+
<div class="viur-shop-item-wrapper">
|
|
3
3
|
<sl-card horizontal class="viur-shop-cart-leaf-small">
|
|
4
4
|
<img
|
|
5
5
|
class="viur-shop-cart-leaf-image"
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
</sl-input>
|
|
47
47
|
|
|
48
48
|
<div class="viur-shop-cart-leaf-article-number">
|
|
49
|
-
<div class="viur-shop-cart-leaf-label">{{ $t('shop.
|
|
49
|
+
<div class="viur-shop-cart-leaf-label">{{ $t('shop.article_number') }}</div>
|
|
50
50
|
{{ getValue(item.shop_art_no_or_gtin) }}
|
|
51
51
|
</div>
|
|
52
52
|
|
|
@@ -222,7 +222,7 @@ function removeArticle(){
|
|
|
222
222
|
}
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
.item-wrapper{
|
|
225
|
+
.viur-shop-item-wrapper{
|
|
226
226
|
position: relative;
|
|
227
227
|
}
|
|
228
228
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</shop-alert>
|
|
13
13
|
|
|
14
14
|
<template v-if="shopStore.state.cartRoot.discount">
|
|
15
|
-
<div class="discount-view">
|
|
15
|
+
<div class="viur-shop-discount-view">
|
|
16
16
|
<span>Code: {{ shopStore.state.cartRoot.discount.dest.name }}</span>
|
|
17
17
|
<sl-button size="small" outline variant="danger" @click="removeDiscountAction" :loading="state.loading">
|
|
18
18
|
<sl-icon name="x-lg" slot="prefix"></sl-icon>
|
|
@@ -20,15 +20,16 @@
|
|
|
20
20
|
</sl-button>
|
|
21
21
|
</div>
|
|
22
22
|
</template>
|
|
23
|
-
<
|
|
23
|
+
<sl-button-group v-else>
|
|
24
24
|
<sl-input
|
|
25
|
-
|
|
25
|
+
class="viur-shop-discount-input"
|
|
26
|
+
:placeholder="$t('shop.add_discount_placeholder')"
|
|
26
27
|
v-model="state.code"
|
|
27
28
|
@keypress.enter="addDiscountAction()"
|
|
28
29
|
>
|
|
29
30
|
</sl-input>
|
|
30
|
-
<button @click="addDiscountAction()" :loading="state.loading">{{ $t('shop.add_discount') }}</button>
|
|
31
|
-
</
|
|
31
|
+
<sl-button @click="addDiscountAction()" :loading="state.loading">{{ $t('shop.add_discount') }}</sl-button>
|
|
32
|
+
</sl-button-group>
|
|
32
33
|
</template>
|
|
33
34
|
|
|
34
35
|
<script setup>
|
|
@@ -81,11 +82,15 @@ function removeDiscountAction(){
|
|
|
81
82
|
|
|
82
83
|
</script>
|
|
83
84
|
<style scoped>
|
|
84
|
-
.discount-view{
|
|
85
|
+
.viur-shop-discount-view{
|
|
85
86
|
font-size:0.8em;
|
|
86
87
|
display: flex;
|
|
87
88
|
align-items: center;
|
|
88
89
|
justify-content: space-between;
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
.viur-shop-discount-input {
|
|
93
|
+
flex-basis: 100%;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
</style>
|
|
@@ -198,4 +198,11 @@ onBeforeMount(()=>{
|
|
|
198
198
|
.loading{
|
|
199
199
|
font-size:3rem;
|
|
200
200
|
}
|
|
201
|
-
</style>
|
|
201
|
+
</style>
|
|
202
|
+
|
|
203
|
+
<style>
|
|
204
|
+
/* global style to overwrite UnzerCSS */
|
|
205
|
+
.unzerUI.primary.button, .unzerUI.primary.buttons .button {
|
|
206
|
+
background-color: var(--ignt-color-primary) !important;
|
|
207
|
+
}
|
|
208
|
+
</style>
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<template v-if="tab && shopStore.state.tabs[tab]">
|
|
20
20
|
{{ shopStore.state.tabIndexMap[tab] + 1 }}.
|
|
21
21
|
<span class="viur-shop-order-status-span">
|
|
22
|
-
{{ shopStore.state.tabs[tab]?.displayName }}
|
|
22
|
+
{{ $t(shopStore.state.tabs[tab]?.displayName) }}
|
|
23
23
|
</span>
|
|
24
24
|
</template>
|
|
25
25
|
<template v-else>
|
|
@@ -43,46 +43,46 @@ export const useAddress = defineStore("useAddressStore", () => {
|
|
|
43
43
|
|
|
44
44
|
})
|
|
45
45
|
|
|
46
|
-
function saveForm(type,
|
|
46
|
+
function saveForm(type,billingIsShipping=false){
|
|
47
47
|
state[`${type}IsUpdating`] = true
|
|
48
48
|
return state[`${type}Form`].sendData().then(async (resp)=>{
|
|
49
49
|
let data = await resp.json()
|
|
50
|
+
|
|
50
51
|
if (['addSuccess','editSuccess'].includes(data['action'])){
|
|
51
52
|
state[`${type}Data`] = data['values']
|
|
52
|
-
await updateAddresses(type,
|
|
53
|
+
await updateAddresses(type, billingIsShipping)
|
|
53
54
|
}
|
|
54
55
|
state[`${type}IsUpdating`] = undefined
|
|
55
56
|
return data
|
|
56
57
|
})
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
function saveAddresses(
|
|
60
|
-
if (
|
|
61
|
-
return saveForm('
|
|
60
|
+
function saveAddresses(billingIsShipping=false){
|
|
61
|
+
if (billingIsShipping) {
|
|
62
|
+
return saveForm('billing',billingIsShipping)
|
|
62
63
|
}else{
|
|
63
64
|
return new Promise((resolve, reject) => {
|
|
64
65
|
saveForm('shipping').then(()=>{
|
|
65
66
|
saveForm('billing').then(()=>{
|
|
66
|
-
resolve({'
|
|
67
|
+
resolve({'action':'editSuccess'})
|
|
67
68
|
}).catch((e)=>reject(e))
|
|
68
69
|
}).catch((e)=>reject(e))
|
|
69
70
|
})
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
async function updateAddresses(type,
|
|
74
|
+
async function updateAddresses(type, billingIsShipping=false) {
|
|
74
75
|
let key = state[`${type}Data`]['key']
|
|
75
|
-
|
|
76
76
|
if (type === 'shipping'){
|
|
77
77
|
const {updateCart} = useCart()
|
|
78
78
|
updateCart({shipping_address_key:key})
|
|
79
|
-
if(shippingIsBilling){
|
|
80
|
-
const {addOrUpdateOrder} = useOrder()
|
|
81
|
-
await addOrUpdateOrder({billing_address_key:key})
|
|
82
|
-
}
|
|
83
79
|
}else if (type === 'billing'){
|
|
84
80
|
const {addOrUpdateOrder} = useOrder()
|
|
85
81
|
await addOrUpdateOrder({billing_address_key:key})
|
|
82
|
+
if(billingIsShipping){
|
|
83
|
+
const {updateCart} = useCart()
|
|
84
|
+
updateCart({shipping_address_key:key})
|
|
85
|
+
}
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
package/src/composables/order.js
CHANGED
|
@@ -13,7 +13,7 @@ export function useOrder() {
|
|
|
13
13
|
function updateOrderState(key,data){
|
|
14
14
|
shopStore.state.order = data
|
|
15
15
|
shopStore.state.orderKey = key
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
const params = useUrlSearchParams('hash')
|
|
18
18
|
params['order'] = shopStore.state.orderKey
|
|
19
19
|
|
|
@@ -38,7 +38,6 @@ export function useOrder() {
|
|
|
38
38
|
function addOrUpdateOrder({
|
|
39
39
|
payment_provider,
|
|
40
40
|
billing_address_key,
|
|
41
|
-
email,
|
|
42
41
|
customer_key,
|
|
43
42
|
state_ordered,
|
|
44
43
|
state_paid,
|
|
@@ -49,7 +48,6 @@ export function useOrder() {
|
|
|
49
48
|
let data = {
|
|
50
49
|
payment_provider:payment_provider?payment_provider:shopStore.state.order?.['payment_provider'],
|
|
51
50
|
billing_address_key:billing_address_key?billing_address_key:shopStore.state.order?.['billing_address_key']?.['dest']?.['key'],
|
|
52
|
-
email:email?email:shopStore.state.order?.['email'],
|
|
53
51
|
customer_key:customer_key?customer_key:shopStore.state.order?.['customer_key']?.['dest']?.['key'],
|
|
54
52
|
state_ordered:state_ordered?state_ordered:shopStore.state.order?.['state_ordered'],
|
|
55
53
|
state_paid:state_paid?state_paid:shopStore.state.order?.['state_paid'],
|
|
@@ -58,7 +56,7 @@ export function useOrder() {
|
|
|
58
56
|
if (shopStore.state.orderKey){
|
|
59
57
|
url = shopStore.state.shopApiUrl+"/order_update"
|
|
60
58
|
data["order_key"] = shopStore.state.orderKey
|
|
61
|
-
|
|
59
|
+
|
|
62
60
|
}else{
|
|
63
61
|
data["cart_key"] = shopStore.state.cartRoot['key']
|
|
64
62
|
}
|
|
@@ -77,4 +75,4 @@ export function useOrder() {
|
|
|
77
75
|
fetchOrder,
|
|
78
76
|
addOrUpdateOrder
|
|
79
77
|
}
|
|
80
|
-
}
|
|
78
|
+
}
|
package/src/main.js
CHANGED
|
@@ -5,6 +5,7 @@ import { getTranslations } from "./utils";
|
|
|
5
5
|
import { de_translations, en_translations } from "@viur/vue-utils";
|
|
6
6
|
import en from "./translations/en"
|
|
7
7
|
import de from "./translations/de"
|
|
8
|
+
import fr from "./translations/fr"
|
|
8
9
|
|
|
9
10
|
export { default as ViurShop } from "./Shop.vue";
|
|
10
11
|
|
|
@@ -22,6 +23,8 @@ const ViurShopComponents = {
|
|
|
22
23
|
for(const loc of locale){
|
|
23
24
|
if (loc === 'de'){
|
|
24
25
|
messages[loc] = { ...de_translations, ...de, ...data[loc]}
|
|
26
|
+
}else if (loc === 'fr'){
|
|
27
|
+
messages[loc] = { ...fr, ...data[loc]}
|
|
25
28
|
}else if (loc === 'en'){
|
|
26
29
|
messages[loc] = {...en_translations, ...en, ...data[loc]}
|
|
27
30
|
}else{
|
|
@@ -41,4 +44,4 @@ const ViurShopComponents = {
|
|
|
41
44
|
};
|
|
42
45
|
|
|
43
46
|
// Export the plugin as default
|
|
44
|
-
export default ViurShopComponents;
|
|
47
|
+
export default ViurShopComponents;
|
package/src/shop.js
CHANGED
|
@@ -24,7 +24,7 @@ export const useViurShopStore = defineStore("viurshopStore", () => {
|
|
|
24
24
|
tabs:{
|
|
25
25
|
cart: {
|
|
26
26
|
component: shallowRef(ShopCart),
|
|
27
|
-
displayName: "
|
|
27
|
+
displayName: "shop.order_step_cart", //Warenkorb
|
|
28
28
|
icon: { name: "cart3" },
|
|
29
29
|
active:computed(()=>!state.order?.['is_checkout_in_progress'] && !state.order?.['is_ordered']), //active if no orderkey or checkout not startet
|
|
30
30
|
validating:false,
|
|
@@ -32,7 +32,7 @@ export const useViurShopStore = defineStore("viurshopStore", () => {
|
|
|
32
32
|
},
|
|
33
33
|
userdata: {
|
|
34
34
|
component: shallowRef(ShopUserDataGuest),
|
|
35
|
-
displayName: "Daten Eingeben
|
|
35
|
+
displayName: "shop.order_step_data", //Daten Eingeben
|
|
36
36
|
icon: { name: "card-list" },
|
|
37
37
|
active:computed(()=>!state.order?.['is_checkout_in_progress'] && !state.order?.['is_ordered'] && state.cartList.length>0), //active if checkout not startet and cart is not empty
|
|
38
38
|
validating:false,
|
|
@@ -40,7 +40,7 @@ export const useViurShopStore = defineStore("viurshopStore", () => {
|
|
|
40
40
|
},
|
|
41
41
|
shippingmethod: {
|
|
42
42
|
component: shallowRef(ShopShippingMethod),
|
|
43
|
-
displayName: "
|
|
43
|
+
displayName: "shop.order_step_shipping", // Versandart
|
|
44
44
|
icon: { name: "truck" },
|
|
45
45
|
active:computed(()=>!state.order?.['is_checkout_in_progress'] && !state.order?.['is_ordered'] && state.cartRoot?.['shipping_address']), // we need a shipping country
|
|
46
46
|
validating:false,
|
|
@@ -48,7 +48,7 @@ export const useViurShopStore = defineStore("viurshopStore", () => {
|
|
|
48
48
|
},
|
|
49
49
|
paymentprovider: {
|
|
50
50
|
component: shallowRef(ShopPaymentProvider),
|
|
51
|
-
displayName: "Zahlungsart auswählen
|
|
51
|
+
displayName: "shop.order_step_payment", //Zahlungsart auswählen
|
|
52
52
|
icon: { name: "credit-card" },
|
|
53
53
|
active:computed(()=>!state.order?.['is_checkout_in_progress'] && state.order && state.cartRoot?.['shipping']), // we need a active order
|
|
54
54
|
validating:false,
|
|
@@ -56,7 +56,7 @@ export const useViurShopStore = defineStore("viurshopStore", () => {
|
|
|
56
56
|
},
|
|
57
57
|
confirm: {
|
|
58
58
|
component: shallowRef(ShopOrderConfirm),
|
|
59
|
-
displayName: "Bestellung prüfen
|
|
59
|
+
displayName: "shop.order_step_verify", //Bestellung prüfen
|
|
60
60
|
icon: { name: "clipboard-check" },
|
|
61
61
|
active:computed(()=>!state.order?.['is_paid'] && state.canCheckout?.['status']), // active if canCheckout and not already paid
|
|
62
62
|
validating:false,
|
|
@@ -64,7 +64,7 @@ export const useViurShopStore = defineStore("viurshopStore", () => {
|
|
|
64
64
|
},
|
|
65
65
|
complete: {
|
|
66
66
|
component: shallowRef(ShopOrderComplete),
|
|
67
|
-
displayName: "Bestellung Abgeschlossen
|
|
67
|
+
displayName: "shop.order_step_complete", //Bestellung Abgeschlossen
|
|
68
68
|
icon: { name: "bag-check" },
|
|
69
69
|
active:computed(()=>state.order?.['is_ordered']), // active if ordered
|
|
70
70
|
validating:false,
|
package/src/translations/de.js
CHANGED
|
@@ -5,32 +5,60 @@ export default {
|
|
|
5
5
|
delete: "Löschen"
|
|
6
6
|
},
|
|
7
7
|
shop:{
|
|
8
|
-
"check_order":"
|
|
8
|
+
"check_order":"Prüfen und absenden",
|
|
9
9
|
"order_pay":"Zahlungspflichtig bestellen",
|
|
10
|
-
"order_number":"Ihre
|
|
10
|
+
"order_number":"Ihre Vorgangsnummer",
|
|
11
11
|
"order_thanks":"Vielen Dank für Ihre Bestellung",
|
|
12
|
-
"order_message":"Wir haben Ihre Bestellung erhalten und werden diese
|
|
12
|
+
"order_message":"Wir haben Ihre Bestellung erhalten und werden diese schnellstmöglich bearbeiten.<br /> Sie erhalten in wenigen Minuten eine Bestätigung per E-Mail.",
|
|
13
13
|
"order_paid":"Ihre Zahlung ist bei uns eingegangen.",
|
|
14
14
|
"order_ready_to_ship":"Ihre Bestellung ist fertig für den Versand.",
|
|
15
|
-
"cart_empty":"
|
|
15
|
+
"cart_empty":"Es befinden sich noch keine Artikel im Warenkorb.",
|
|
16
16
|
"order_summary":"Bestellzusammenfassung",
|
|
17
17
|
"deliverytime":"Lieferzeit",
|
|
18
18
|
"day": "Tag | Tage",
|
|
19
|
+
"availability": "Verfügbarkeit",
|
|
20
|
+
"quantity": "Anzahl",
|
|
19
21
|
"unit_price":"Stückpreis",
|
|
20
22
|
"total_price":"Gesamtpreis",
|
|
21
|
-
"
|
|
23
|
+
"article_number":"Artikelnummer",
|
|
22
24
|
"pay":"Bezahlen",
|
|
23
|
-
"add_discount":"
|
|
24
|
-
"
|
|
25
|
+
"add_discount":"Hinzufügen",
|
|
26
|
+
"add_discount_placeholder":"Dein Rabattcode",
|
|
27
|
+
"use_shipping_as_billing_address": "Rechnungsadresse zur Lieferungadresse",
|
|
25
28
|
"no_valid_shipping_found":"Keine passenden Versandarten gefunden.",
|
|
26
29
|
"error_message":"Eine Fehler ist aufgetreten.",
|
|
27
|
-
"free_shipping":"
|
|
30
|
+
"free_shipping":"Versandkostenfrei",
|
|
31
|
+
"proceed-checkout":"Zur Kasse gehen",
|
|
32
|
+
"summary_headline":"Zusammenfassung",
|
|
33
|
+
"summary_subtotal":"Zwischensumme",
|
|
34
|
+
"summary_shipping_total":"Versand- und Bearbeitungspauschale",
|
|
35
|
+
"summary_delivery_time":"Lieferzeit",
|
|
36
|
+
"summary_discount":"Sie sparen bei Ihrem Einkauf im Aktionszeitraum",
|
|
37
|
+
"summary_checkout":"Zur Kasse gehen",
|
|
38
|
+
"summary_total":"Gesamtbetrag",
|
|
39
|
+
"summary_vat":"inkl. {percentage} MwSt.",
|
|
40
|
+
"discount_not_found": "Dieser Rabattcode existiert nicht.",
|
|
41
|
+
"discount_not_active": "Dieser Rabattcode ist nicht aktiv.",
|
|
42
|
+
"discount_not_available": "Dieser Rabattcode ist für dieses Land nicht verfügbar.",
|
|
43
|
+
"discount_already_used": "Dieser Rabattcode wurde bereits benutzt.",
|
|
44
|
+
"discount_invalid_period": "Der Rabattzeitraum hat noch nicht begonnen oder ist bereits vorbei.",
|
|
45
|
+
"discount_minimum_not_reached": "Der Mindestbestellwert von {{minimum_order_value}} € wurde nicht erreicht.",
|
|
46
|
+
"discount_no_sale_article": "Der Rabattcode ist nicht auf bereits rabattierte Artikel anwendbar.",
|
|
47
|
+
"discount_scope_not_satisfied": "Der Rabattcode ist für diesen Warenkorb / diese Artikel nicht anwendbar.",
|
|
48
|
+
"order_step_cart":"Warenkorb",
|
|
49
|
+
"order_step_data":"Daten",
|
|
50
|
+
"order_step_shipping":"Versandart",
|
|
51
|
+
"order_step_payment":"Zahlungsart",
|
|
52
|
+
"order_step_verify":"Bestellung prüfen",
|
|
53
|
+
"order_step_complete":"Bestellung Abgeschlossen"
|
|
54
|
+
|
|
55
|
+
|
|
28
56
|
},
|
|
29
57
|
messages:{
|
|
30
58
|
loading:"Daten werden abgefragt...",
|
|
31
59
|
updating:"Daten werden aktualisiert...",
|
|
32
|
-
wait_for_payment:"
|
|
60
|
+
wait_for_payment:"Warte auf Zahlung...",
|
|
33
61
|
remove_article_from_cart:"Wollen sie den Artikel wirklich entfernen?",
|
|
34
|
-
order_check_later:"Sie können Ihre Bestellung am Ende noch einmal überprüfen."
|
|
62
|
+
order_check_later:"Sie können Ihre Bestellung am Ende noch einmal überprüfen.",
|
|
35
63
|
}
|
|
36
|
-
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
actions:{
|
|
3
|
+
add: "Hinzufügen",
|
|
4
|
+
cancel: "Abbrechen",
|
|
5
|
+
delete: "Löschen"
|
|
6
|
+
},
|
|
7
|
+
shop:{
|
|
8
|
+
"check_order":"Vérifier et envoyer",
|
|
9
|
+
"order_pay":"Valider",
|
|
10
|
+
"order_number":"N° de commande",
|
|
11
|
+
"order_thanks":"Merci pour votre commande et l’intérêt porté à notre société.",
|
|
12
|
+
"order_message":"Wir haben Ihre Bestellung erhalten und werden diese schnellstmöglich bearbeiten.<br /> Sie erhalten in wenigen Minuten eine Bestätigung per E-Mail.",
|
|
13
|
+
"order_paid":"Ihre Zahlung ist bei uns eingegangen.",
|
|
14
|
+
"order_ready_to_ship":"Ihre Bestellung ist fertig für den Versand.",
|
|
15
|
+
"cart_empty":"Votre panier est vide.",
|
|
16
|
+
"order_summary":"Envoyer la commande",
|
|
17
|
+
"deliverytime":"Délai de livraison",
|
|
18
|
+
"day": "jour | jours",
|
|
19
|
+
"availability": "Disponibilité",
|
|
20
|
+
"quantity": "Quantité",
|
|
21
|
+
"unit_price":"Prix par pièce",
|
|
22
|
+
"total_price":"Montant total",
|
|
23
|
+
"article_number":"Numéro d'article",
|
|
24
|
+
"pay":"Payer",
|
|
25
|
+
"add_discount":"Valider",
|
|
26
|
+
"add_discount_placeholder":"Votre code promo",
|
|
27
|
+
"use_shipping_as_billing_address": "Lieferung zur Rechnungsadresse",
|
|
28
|
+
"no_valid_shipping_found":"Keine passenden Versandarten gefunden.",
|
|
29
|
+
"error_message":"Eine Fehler ist aufgetreten.",
|
|
30
|
+
"free_shipping":"Livraison gratuite",
|
|
31
|
+
"proceed-checkout":"Acheter cet article",
|
|
32
|
+
"summary_headline":"Résumé",
|
|
33
|
+
"summary_subtotal":"Sous-total",
|
|
34
|
+
"summary_shipping_total":"Emballage et envoi",
|
|
35
|
+
"summary_delivery_time":"",
|
|
36
|
+
"summary_discount":"",
|
|
37
|
+
"summary_checkout":"",
|
|
38
|
+
"summary_total":"Montant total",
|
|
39
|
+
"summary_vat":"TVA incluse",
|
|
40
|
+
"discount_not_found": "Ce code promo n’existe pas.",
|
|
41
|
+
"discount_not_active": "Ce code promo n’est pas actif.",
|
|
42
|
+
"discount_not_available": "Ce code promo n’est pas valable pour ce pays.",
|
|
43
|
+
"discount_already_used": "Ce code promo a déjà été utilisé.",
|
|
44
|
+
"discount_invalid_period": "La période de ce code promo n’a encore débuté ou est déjà expirée.",
|
|
45
|
+
"discount_minimum_not_reached": "Le montant minimum de commande de {{minimum_order_value}} € n’a pas été atteint.",
|
|
46
|
+
"discount_no_sale_article": "Bon d’achat non cumulable avec d’autres promotions en cours.",
|
|
47
|
+
"discount_scope_not_satisfied": "Le code promo n’est pas applicable pour ce panier / cet ou ces article(s).",
|
|
48
|
+
},
|
|
49
|
+
messages:{
|
|
50
|
+
loading:"Daten werden abgefragt...",
|
|
51
|
+
updating:"Daten werden aktualisiert...",
|
|
52
|
+
wait_for_payment:"Warte auf Zahlung...",
|
|
53
|
+
remove_article_from_cart:"Désirez-vous vraiment supprimer cet article du panier?",
|
|
54
|
+
order_check_later:"Vous pourrez revérifier vos données avant de valider votre commande."
|
|
55
|
+
}
|
|
56
|
+
}
|