@viur/shop-components 0.1.2 → 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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viur/shop-components",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Frontend Vue components for the shop module of ViUR",
5
5
  "repository": {
6
6
  "type": "git",
package/src/Shop.vue CHANGED
@@ -171,24 +171,29 @@ watch(()=>shopStore.state.currentTab, (newVal,oldVal)=>{
171
171
  padding: var(--sl-spacing-medium);
172
172
  overflow: hidden;
173
173
  border-radius: var(--sl-border-radius-medium);
174
- grid-column: auto / span var(--shop-sidebar-columns);
175
174
  /* height has to be set or sidebar grows until infinity... */
176
175
  height: min-content;
176
+ grid-column: auto / span 12;
177
+ order: -1;
178
+ & > * + * {
179
+ margin-top: var(--sl-spacing-small);
180
+ }
177
181
  @media (min-width: 1024px) {
178
182
  position: sticky;
179
183
  max-height: calc(100vh - var(--viur-shop-sidebar-height-offset) - 2 * var(--padding));
180
184
  top: var(--padding);
181
185
  bottom: var(--padding);
186
+ grid-column: auto / span var(--shop-sidebar-columns);
187
+ order: unset;
182
188
  }
183
189
  }
184
190
 
185
191
  .viur-shop-stepper-wrap {
186
192
  display: flex;
187
193
  flex-direction: column;
188
- grid-column: auto / span var(--shop-main-columns);
189
-
190
- @media (max-width: 1024px) {
191
- 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);
192
197
  }
193
198
 
194
199
  @media (max-width: 600px) {
@@ -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
- :class="{'action-button-hint':slotProps.hint}"
28
- variant="primary"
29
- :disabled="active(slotProps)"
30
- @click="nextStep(slotProps)"
31
- :loading="tab['validating']"
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: var(--ignt-basic-line-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>
@@ -1,10 +1,11 @@
1
1
  <template>
2
- <LoadingHandler :isLoading="!state.items.length">
3
- <h2 class="viur-shop-cart-sidebar-headline headline">Zusammenfassung</h2>
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'">{{ item.quantity }}x
7
+ <div class="viur-shop-cart-sidebar-summary-item-amount" v-if="item.skel_type === 'leaf'">
8
+ {{ item.quantity }}&nbsp;&times;
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-line">
19
- <span>Zwischensumme</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-line">
24
- <span>Versandkosten</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>Lieferzeit </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-line" v-if="shopStore.state.cartRoot.discount">
39
- <span>Rabatt</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-line">
45
+ <div class="viur-shop-cart-sidebar-info">
45
46
  </div>
46
-
47
- <div class="viur-shop-cart-sidebar-info-line total">
48
- <span>Gesamt:</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-line ">
53
- <span>inkl. MwSt:</span>
54
- <sl-format-number lang="de" type="currency" currency="EUR" :value="state.vat">
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="primary" size="medium">Bestellen</sl-button>
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?.[0].value // why is this a list
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
- .viur-shop-cart-sidebar-info-line {
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 {
@@ -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="weiter"
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
- .item-wrapper{
52
- display:flex;
53
- flex-direction: column;
54
- gap: 20px;
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-cart-address-headline">
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-cart-address-headline">
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-cart-address-headline {
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-cart-address-headline">
3
- {{ $t("skeleton.address.address_type.shipping") }}
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-cart-address-headline">
14
- {{ $t("skeleton.address.address_type.billing") }}
13
+ <div class="viur-shop-user-data-headline">
14
+ {{ $t("skeleton.address.address_type.shipping") }}
15
15
  </div>
16
- <address-form formtype="billing" ></address-form>
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 (shopStore.state.cartRoot?.['shipping_address']?.['dest']?.['address_type']?.includes('billing') || !shopStore.state.cartRoot?.['shipping_address']?.['dest']){
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
- }else{
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-cart-address-headline {
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:"shipping" // formtype: shipping, billing, both
32
+ default:"billing" // formtype: shipping, billing, both
33
33
  }
34
34
  })
35
35
 
36
36
  const state = reactive({
37
37
  formtype:computed(()=>{
38
- if (['shipping','both'].includes(props.formtype)){
39
- return "shipping"
38
+ if (['billing','both'].includes(props.formtype)){
39
+ return "billing"
40
40
  }
41
- return 'billing'
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 (props.formtype === 'billing' && shopStore.state.order?.['billing_address']){
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 (props.formtype === 'billing' && shopStore.state.order?.['billing_address']){
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.order?.['billing_address']){
82
- shopStore.state.order['billing_address'] = null
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
- <sl-input
27
- :disabled="!edit"
28
- class="viur-shop-cart-leaf-value viur-shop-cart-leaf-value--quantity"
29
- type="number"
30
- placeholder="Number"
31
- min="0"
32
- noSpinButtons
33
- :value="item.quantity"
34
- @sl-change="changeAmount($event.target.value)"
35
- >
36
- <dialog-Button slot="prefix" class="decent" v-if="item.quantity===1" variant="danger" outline>
37
- <sl-icon name="trash"></sl-icon>
38
- <template #dialog="{close}">
39
- {{ $t('messages.remove_article_from_cart') }}
40
- <sl-bar>
41
- <sl-button slot="left" @click="close">{{$t('actions.cancel')}}</sl-button>
42
- <sl-button slot="right" variant="danger" @click="removeArticle(); close()">{{ $t('actions.delete') }}</sl-button>
43
- </sl-bar>
44
- </template>
45
- </dialog-Button>
46
- <sl-button slot="prefix" v-else @click="changeAmount(item.quantity-=1)">
47
- <sl-icon name="dash-lg"></sl-icon>
48
- </sl-button>
49
- <sl-button slot="suffix" @click="changeAmount(item.quantity+=1)">
50
- <sl-icon name="plus-lg"></sl-icon>
51
- </sl-button>
52
- </sl-input>
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
- <div class="availability"
68
- :class="`availability--${item.shop_availability}`"
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
- display: flex;
129
- flex-basis: 70%;
130
- font-size: .9em;
131
- align-items: center;
132
- justify-content: flex-end;
133
- white-space: nowrap;
134
- &:before {
135
- content: '';
136
- display: block;
137
- background-color: #666;
138
- width: .7em;
139
- height: .7em;
140
- border-radius: 50%;
141
- margin-right: 5px;
142
- margin-bottom: 2px;
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--onrequest,
146
- .availability--instock {
147
- color: var(--ignt-color-success);
148
- &:before {
149
- background-color: var(--ignt-color-success);
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--discontinued,
153
- .availability--outofstock {
154
- color: var(--ignt-color-danger);
155
- &:before {
156
- background-color: var(--ignt-color-danger);
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--limited,
160
- .availability--preorder {
161
- color: var(--ignt-color-warning);
162
- &:before {
163
- background-color: var(--ignt-color-warning);
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
- gap: var(--sl-spacing-medium);
193
- padding: var(--sl-spacing-large);
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(--sl-spacing-medium);
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.articlenumber') }}</div>
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
- <template v-else>
23
+ <sl-button-group v-else>
24
24
  <sl-input
25
- placeholder="Rabattcode eingeben"
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
- </template>
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
- </style>
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,shippingIsBilling=false){
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, shippingIsBilling)
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(shippingIsBilling=false){
60
- if (shippingIsBilling) {
61
- return saveForm('shipping',shippingIsBilling)
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({'actions':'editSuccess'})
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, shippingIsBilling=false) {
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
 
@@ -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: "Warenkorb",
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: "Versandart",
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,
@@ -5,32 +5,60 @@ export default {
5
5
  delete: "Löschen"
6
6
  },
7
7
  shop:{
8
- "check_order":"Bestellung prüfen",
8
+ "check_order":"Prüfen und absenden",
9
9
  "order_pay":"Zahlungspflichtig bestellen",
10
- "order_number":"Ihre Bestellnummer",
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 schenllstmöglich bearbeiten.<br /> Sie erhalten in wenigen Minuten eine Bestätigung per E-Mail.",
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":"Der Warenkorb ist leer.",
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
- "articlenumber":"Artikelnummer",
23
+ "article_number":"Artikelnummer",
22
24
  "pay":"Bezahlen",
23
- "add_discount":"Rabattcode hinzufügen",
24
- "use_shipping_as_billing_address": "Verwende Lieferadresse als Rechnungsadresse",
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":"Kostenlos"
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:"warte auf Zahlung...",
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
+ }