comand-component-library 4.0.18 → 4.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/comand-component-library.js +3222 -3159
  2. package/dist/comand-component-library.umd.cjs +3 -3
  3. package/dist/style.css +1 -1
  4. package/package.json +2 -2
  5. package/src/ComponentLibrary.vue +27 -0
  6. package/src/assets/fonts/iconfonts/logos-iconfont/fonts/icomoon-logos.woff +0 -0
  7. package/src/assets/fonts/iconfonts/logos-iconfont/fonts/icomoon.eot +0 -0
  8. package/src/assets/fonts/iconfonts/logos-iconfont/fonts/icomoon.svg +46 -0
  9. package/src/assets/fonts/iconfonts/logos-iconfont/fonts/icomoon.ttf +0 -0
  10. package/src/assets/fonts/iconfonts/logos-iconfont/icomoon-logos.woff +0 -0
  11. package/src/assets/fonts/iconfonts/logos-iconfont/selection.json +1 -1
  12. package/src/assets/styles/component-library-global-styles.scss +1 -41
  13. package/src/assets/styles/logos-iconfont.css +44 -33
  14. package/src/assets/styles/transitions.css +0 -6
  15. package/src/componentSettingsDataAndControls.vue +7 -7
  16. package/src/components/CmdBackToTopButton.vue +1 -1
  17. package/src/components/CmdBasicForm.vue +62 -19
  18. package/src/components/CmdBox.vue +2 -2
  19. package/src/components/CmdBoxWrapper.vue +2 -2
  20. package/src/components/CmdFakeSelect.vue +2 -2
  21. package/src/components/CmdForm.vue +13 -5
  22. package/src/components/CmdLoginForm.vue +1 -1
  23. package/src/components/CmdMainNavigation.vue +2 -2
  24. package/src/components/CmdMultistepFormProgressBar.vue +1 -1
  25. package/src/components/CmdPagination.vue +2 -2
  26. package/src/components/CmdSidebar.vue +4 -4
  27. package/src/components/CmdSiteHeader.vue +2 -2
  28. package/src/components/CmdSiteSearch.vue +2 -2
  29. package/src/components/CmdSlideButton.vue +4 -4
  30. package/src/components/CmdSlideshow.vue +8 -3
  31. package/src/components/CmdTable.vue +3 -3
  32. package/src/components/CmdThumbnailScroller.vue +2 -2
  33. package/src/documentation/generated/CmdFakeSelectPropertyDescriptions.json +1 -1
  34. package/src/index.js +1 -1
  35. package/src/mixins/CmdBasicForm/DefaultMessageProperties.js +2 -2
  36. package/src/pages/PageWrapper.vue +1 -1
  37. package/src/utils/ContactFormValidation.js +45 -0
  38. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-cn.svg +0 -26
  39. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-de.svg +0 -76
  40. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-en.svg +0 -76
  41. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-es.svg +0 -83
  42. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-fr.svg +0 -76
  43. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-it.svg +0 -76
  44. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-ru.svg +0 -76
@@ -10,6 +10,7 @@
10
10
  novalidate="novalidate"
11
11
  :textLegend="getMessage('basic_form.legend')"
12
12
  :submitButton="submitButton"
13
+ :formAction="formAction"
13
14
  >
14
15
  <div v-if="configuration.salutation" class="flex-container no-flex order-male-female">
15
16
  <!-- begin cmd-form-element -->
@@ -20,7 +21,7 @@
20
21
  :name="configuration.salutation?.name || 'salutation'"
21
22
  inputValue="m"
22
23
  :replaceInputType="configuration.salutation?.replaceInputType"
23
- v-model="formData.salutation"
24
+ v-model="formData.salutation.value"
24
25
  @validate="onValidate"
25
26
  />
26
27
  <!-- end cmd-form-element -->
@@ -33,7 +34,7 @@
33
34
  :name="configuration.salutation?.name || 'salutation'"
34
35
  inputValue="f"
35
36
  :replaceInputType="configuration.salutation?.replaceInputType"
36
- v-model="formData.salutation"
37
+ v-model="formData.salutation.value"
37
38
  @validate="onValidate"
38
39
  />
39
40
  <!-- end cmd-form-element -->
@@ -181,7 +182,7 @@
181
182
  :labelText="getMessage('basic_form.labeltext.city')"
182
183
  :placeholder="getMessage('basic_form.placeholder.city')"
183
184
  :required="configuration.city?.required"
184
- :name="configuration.city?.name || 'zip'"
185
+ :name="configuration.city?.name || 'city'"
185
186
  v-model="formData.city.value"
186
187
  :status="formData.city.error ? 'error' : ''"
187
188
  @validate="onValidate"
@@ -207,14 +208,14 @@
207
208
 
208
209
  <!-- begin cmd-form-element -->
209
210
  <CmdFormElement
210
- v-if="configuration.additionalText"
211
- :element="configuration.additionalText?.element || 'textarea'"
212
- :labelText="getMessage('basic_form.labeltext.additional_text')"
213
- :placeholder="getMessage('basic_form.placeholder.additional_text')"
214
- :required="configuration.additionalText?.required"
215
- :name="configuration.additionalText?.name || 'additional-text'"
216
- v-model="formData.additionalText.value"
217
- :status="formData.additionalText.error ? 'error' : ''"
211
+ v-if="configuration.userMessage"
212
+ :element="configuration.userMessage?.element || 'textarea'"
213
+ :labelText="getMessage('basic_form.labeltext.user_message')"
214
+ :placeholder="getMessage('basic_form.placeholder.user_message')"
215
+ :required="configuration.userMessage?.required"
216
+ :name="configuration.userMessage?.name || 'user-message'"
217
+ v-model="formData.userMessage.value"
218
+ :status="formData.userMessage.error ? 'error' : ''"
218
219
  @validate="onValidate"
219
220
  />
220
221
  <!-- end cmd-form-element -->
@@ -249,8 +250,10 @@
249
250
  import I18n from "../mixins/I18n.js"
250
251
  import DefaultMessageProperties from "../mixins/CmdBasicForm/DefaultMessageProperties.js"
251
252
  import FieldValidation from "../mixins/FieldValidation.js"
253
+ import {ContactFormValidator} from "@/utils/ContactFormValidation.js";
252
254
 
253
255
  export default {
256
+ emits: ["submit"],
254
257
  mixins: [
255
258
  I18n,
256
259
  DefaultMessageProperties,
@@ -263,8 +266,9 @@ export default {
263
266
  },
264
267
  data() {
265
268
  return {
269
+ validator: new ContactFormValidator(label => label),
266
270
  formData: {
267
- salutation: this.configuration.salutation.default,
271
+ salutation: {value: this.configuration.salutation.default},
268
272
  lastName: {value: ''},
269
273
  firstName: {value: ''},
270
274
  email: {value: ''},
@@ -275,13 +279,27 @@ export default {
275
279
  pobox: {value: ''},
276
280
  country: {value: ''},
277
281
  additionalAddressInfo: {value: ''},
278
- additionalText: {value: ''},
282
+ userMessage: {value: ''},
279
283
  acceptPrivacy: {value: false}
280
284
  },
281
285
  cityBeforeZip: this.showCityBeforeZip
282
286
  }
283
287
  },
284
288
  props: {
289
+ /**
290
+ * activate if native submit-event should be used
291
+ */
292
+ useNativeSubmit: {
293
+ type: Boolean,
294
+ default: false
295
+ },
296
+ /**
297
+ * set url for form-action
298
+ */
299
+ formAction: {
300
+ type: String,
301
+ required: false
302
+ },
285
303
  /**
286
304
  * configuration for form-elements used in form
287
305
  */
@@ -345,7 +363,7 @@ export default {
345
363
  required: false,
346
364
  type: "text"
347
365
  },
348
- additionalText: {
366
+ userMessage: {
349
367
  required: false,
350
368
  element: "textarea"
351
369
  },
@@ -406,15 +424,40 @@ export default {
406
424
  },
407
425
  methods: {
408
426
  onSubmit(event) {
409
- this.onValidate();
427
+ this.onValidate()
410
428
 
411
429
  this.formData = Object.assign({}, this.validator.validatePrivacy(this.formData));
412
- if (this.formData.error) {
413
- event.preventDefault();
414
- return;
430
+
431
+ if (this.formData.error || this.useNativeSubmit) {
432
+ if(this.formData.error) {
433
+ // prevent original event from CmdForm (to avoid submit and reload)
434
+ event.originalEvent.preventDefault()
435
+ }
436
+ return
437
+ }
438
+
439
+ // custom submit of form-data
440
+ const customSubmitFormData = new FormData()
441
+ // get keys for form-elements from configuration
442
+ const configurationEntries = Object.keys(this.configuration)
443
+
444
+ for(let i = 0; i < configurationEntries.length; i++) {
445
+ // assign formData values to form-element key
446
+ customSubmitFormData.set(configurationEntries[i], this.formData[configurationEntries[i]].value)
415
447
  }
416
448
 
417
- event.preventDefault();
449
+ fetch(this.formAction, {method: "POST", body: customSubmitFormData}).then((response) => {
450
+ if(response.ok) {
451
+ console.log("CmdBasicForm", "ok")
452
+ } else {
453
+ console.log("CmdBasicForm", "fail")
454
+ }
455
+ }).catch((error) => {
456
+ console.error(error)
457
+ })
458
+
459
+ // prevent original levent form CmdForm (to avoid submit and reload)
460
+ event.originalEvent.preventDefault()
418
461
  },
419
462
  onCountrySelect(event) {
420
463
  this.cityBeforeZip = event === 'us' || event === 'uk';
@@ -395,7 +395,7 @@ export default {
395
395
  type: Object,
396
396
  default: function () {
397
397
  return {
398
- iconClass: "icon-single-arrow-up",
398
+ iconClass: "icon-chevron-one-stripe-up",
399
399
  tooltip: "Close content",
400
400
  iconType: "auto"
401
401
  }
@@ -410,7 +410,7 @@ export default {
410
410
  type: Object,
411
411
  default: function () {
412
412
  return {
413
- iconClass: "icon-single-arrow-down",
413
+ iconClass: "icon-chevron-one-stripe-down",
414
414
  tooltip: "Show content",
415
415
  iconType: "auto"
416
416
  }
@@ -103,7 +103,7 @@ export default {
103
103
  type: Object,
104
104
  default() {
105
105
  return {
106
- iconClass: "icon-double-arrow-down",
106
+ iconClass: "icon-chevron-two-stripes-down",
107
107
  tooltip: "Collapse all boxes"
108
108
  }
109
109
  }
@@ -115,7 +115,7 @@ export default {
115
115
  type: Object,
116
116
  default() {
117
117
  return {
118
- iconClass: "icon-double-arrow-up",
118
+ iconClass: "icon-chevron-two-stripes-up",
119
119
  tooltip: "Expand all boxes"
120
120
  }
121
121
  }
@@ -279,13 +279,13 @@ export default {
279
279
  * icon for dropdown-icon (i.e. an angle/arrow)
280
280
  *
281
281
  * @requiredForAccessibility: partial
282
- * @defaultIcon: icon-single-arrow-down
282
+ * @defaultIcon: icon-chevron-one-stripe-down
283
283
  */
284
284
  iconDropdown: {
285
285
  type: Object,
286
286
  default() {
287
287
  return {
288
- iconClass: "icon-single-arrow-down",
288
+ iconClass: "icon-chevron-one-stripe-down",
289
289
  tooltip: "Toggle dropdown visibility",
290
290
  iconType: "auto"
291
291
  }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <form class="cmd-form" :data-use-validation="useValidation" @submit="onSubmit" :class="{error: errorOccurred}" :novalidate="novalidate">
2
+ <form class="cmd-form" :action="formAction" :data-use-validation="useValidation" @submit="onSubmit" :class="{error: errorOccurred}" :novalidate="novalidate">
3
3
  <template v-if="useFieldset">
4
4
  <fieldset class="flex-container">
5
5
  <legend :class="{hidden : !showLegend}">{{ textLegend }}</legend>
@@ -73,6 +73,13 @@ export default {
73
73
  }
74
74
  },
75
75
  props: {
76
+ /**
77
+ * set url for form-action
78
+ */
79
+ formAction: {
80
+ type: String,
81
+ required: false
82
+ },
76
83
  /**
77
84
  * activate if form-elements should be given by slot
78
85
  */
@@ -153,10 +160,11 @@ export default {
153
160
  submitFormData(event) {
154
161
  // fill formdata with names and value
155
162
  let formdata = {}
156
- this.formElements.forEach((element) => {
157
- formdata[element.name] = this.formValues[element.name]
158
- })
159
-
163
+ if(this.formElements) {
164
+ this.formElements.forEach((element) => {
165
+ formdata[element.name] = this.formValues[element.name]
166
+ })
167
+ }
160
168
  this.$emit("submit", {originalEvent: event, formdata: formdata})
161
169
  },
162
170
  onSubmit(event) {
@@ -323,7 +323,7 @@ export default {
323
323
  backToLoginForm: {
324
324
  icon: {
325
325
  show: true,
326
- iconClass: "icon-single-arrow-left",
326
+ iconClass: "icon-chevron-one-stripe-left",
327
327
  tooltip: ""
328
328
  },
329
329
  text: "Back to login form"
@@ -247,14 +247,14 @@ export default {
247
247
  */
248
248
  subentriesIconClass: {
249
249
  type: String,
250
- default: "icon-single-arrow-down"
250
+ default: "icon-chevron-one-stripe-down"
251
251
  },
252
252
  /**
253
253
  * icon to show if a sub-entry has further sub-entries
254
254
  */
255
255
  subSubentriesIconClass: {
256
256
  type: String,
257
- default: "icon-single-arrow-right"
257
+ default: "icon-chevron-one-stripe-right"
258
258
  }
259
259
  },
260
260
  methods: {
@@ -84,7 +84,7 @@ export default {
84
84
  separatorIconClass: {
85
85
  type: String,
86
86
  default() {
87
- return "icon-single-arrow-right"
87
+ return "icon-chevron-one-stripe-right"
88
88
  }
89
89
  },
90
90
  useGap: {
@@ -105,7 +105,7 @@ export default {
105
105
  type: Object,
106
106
  default: function () {
107
107
  return {
108
- iconClass: "icon-single-arrow-left",
108
+ iconClass: "icon-chevron-one-stripe-left",
109
109
  text: "prev",
110
110
  showText: true
111
111
  }
@@ -120,7 +120,7 @@ export default {
120
120
  type: Object,
121
121
  default: function () {
122
122
  return {
123
- iconClass: "icon-single-arrow-right",
123
+ iconClass: "icon-chevron-one-stripe-right",
124
124
  text: "next",
125
125
  showText: true
126
126
  }
@@ -94,14 +94,14 @@ export default {
94
94
  iconClassOpenCollapse() {
95
95
  if (this.collapseToLeft) {
96
96
  if (this.open) {
97
- return "icon-single-arrow-left"
97
+ return "icon-chevron-one-stripe-left"
98
98
  }
99
- return "icon-single-arrow-right"
99
+ return "icon-chevron-one-stripe-right"
100
100
  } else {
101
101
  if (this.open) {
102
- return "icon-single-arrow-right"
102
+ return "icon-chevron-one-stripe-right"
103
103
  }
104
- return "icon-single-arrow-left"
104
+ return "icon-chevron-one-stripe-left"
105
105
  }
106
106
  }
107
107
  },
@@ -257,8 +257,8 @@ export default {
257
257
  }
258
258
 
259
259
  header {
260
- padding-top: calc(var(--default-padding) * 2);
261
- padding-bottom: calc(var(--default-padding) * 2);
260
+ padding-top: var(--default-padding);
261
+ padding-bottom: var(--default-padding);
262
262
  row-gap: 0;
263
263
 
264
264
  &.has-navigation {
@@ -294,11 +294,11 @@ export default {
294
294
  default() {
295
295
  return {
296
296
  showFilters: {
297
- iconClass: "icon-single-arrow-up",
297
+ iconClass: "icon-chevron-one-stripe-up",
298
298
  type: "auto"
299
299
  },
300
300
  hideFilters: {
301
- iconClass: "icon-single-arrow-down",
301
+ iconClass: "icon-chevron-one-stripe-down",
302
302
  type: "auto"
303
303
  }
304
304
  }
@@ -39,19 +39,19 @@ export default {
39
39
  default: function() {
40
40
  return {
41
41
  prev: {
42
- iconClass: "icon-single-arrow-left",
42
+ iconClass: "icon-chevron-one-stripe-left",
43
43
  tooltip: "Previous"
44
44
  },
45
45
  next: {
46
- iconClass: "icon-single-arrow-right",
46
+ iconClass: "icon-chevron-one-stripe-right",
47
47
  tooltip: "Next"
48
48
  },
49
49
  up: {
50
- iconClass: "icon-single-arrow-up",
50
+ iconClass: "icon-chevron-one-stripe-up",
51
51
  tooltip: "Previous"
52
52
  },
53
53
  down: {
54
- iconClass: "icon-single-arrow-down",
54
+ iconClass: "icon-chevron-one-stripe-down",
55
55
  tooltip: "Next"
56
56
  }
57
57
  }
@@ -164,14 +164,14 @@ export default {
164
164
  return {
165
165
  next: {
166
166
  next: {
167
- "iconClass": "icon-single-arrow-right",
167
+ "iconClass": "icon-chevron-one-stripe-right",
168
168
  "tooltip": "Next"
169
169
  }
170
170
  },
171
171
  prev: {
172
172
  prev: {
173
173
  "type": "prev",
174
- "iconClass": "icon-single-arrow-left",
174
+ "iconClass": "icon-chevron-one-stripe-left",
175
175
  "tooltip": "Previous"
176
176
  }
177
177
  }
@@ -367,6 +367,7 @@ export default {
367
367
  justify-content: center;
368
368
 
369
369
  > a:not(.button) {
370
+ display: block;
370
371
  text-decoration: none;
371
372
 
372
373
  figcaption {
@@ -417,9 +418,9 @@ export default {
417
418
  padding: .2rem;
418
419
  list-style-type: none;
419
420
  margin: 0;
420
- border: var(--default-border-reduced-opacity);
421
421
  border-radius: var(--full-circle);
422
422
  background: var(--light-gray);
423
+ border: var(--default-border-reduced-opacity);
423
424
 
424
425
  a {
425
426
  display: block;
@@ -473,6 +474,10 @@ export default {
473
474
  background: var(--pure-white-reduced-opacity);
474
475
  }
475
476
  }
477
+
478
+ .fade-enter-from, .fade-leave-to {
479
+ position: absolute;
480
+ }
476
481
  }
477
482
 
478
483
  .edit-mode .cmd-slideshow .image-wrapper.edit-items {
@@ -141,7 +141,7 @@ export default {
141
141
  type: Object,
142
142
  default: function () {
143
143
  return {
144
- iconClass: "icon-single-arrow-down",
144
+ iconClass: "icon-chevron-one-stripe-down",
145
145
  tooltip: "Expand table"
146
146
  }
147
147
  }
@@ -155,7 +155,7 @@ export default {
155
155
  type: Object,
156
156
  default: function () {
157
157
  return {
158
- iconClass: "icon-single-arrow-up",
158
+ iconClass: "icon-chevron-one-stripe-up",
159
159
  tooltip: "Collapse table"
160
160
  }
161
161
  }
@@ -183,7 +183,7 @@ export default {
183
183
  type: Object,
184
184
  default: function () {
185
185
  return {
186
- iconClass: "icon-single-arrow-right",
186
+ iconClass: "icon-chevron-one-stripe-right",
187
187
  tooltip: "Stretch table"
188
188
  }
189
189
  }
@@ -230,14 +230,14 @@ export default {
230
230
  next: {
231
231
  next: {
232
232
  type: "next",
233
- iconClass: "icon-single-arrow-right",
233
+ iconClass: "icon-chevron-one-stripe-right",
234
234
  tooltip: "Next"
235
235
  }
236
236
  },
237
237
  prev: {
238
238
  prev: {
239
239
  type: "prev",
240
- iconClass: "icon-single-arrow-left",
240
+ iconClass: "icon-chevron-one-stripe-left",
241
241
  tooltip: "Previous"
242
242
  }
243
243
  }
@@ -60,7 +60,7 @@
60
60
  "partial"
61
61
  ],
62
62
  "defaultIcon": [
63
- "icon-single-arrow-down"
63
+ "icon-chevron-one-stripe-down"
64
64
  ]
65
65
  }
66
66
  },
package/src/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  export { default as CmdAddressData } from '@/components/CmdAddressData.vue'
3
3
  export { default as CmdBackToTopButton } from '@/components/CmdBackToTopButton.vue'
4
4
  export { default as CmdBankAccountData } from '@/components/CmdBankAccountData.vue'
5
+ export { default as CmdBasicForm } from '@/components/CmdBasicForm.vue'
5
6
  export { default as CmdBox } from '@/components/CmdBox.vue'
6
7
  export { default as CmdBoxWrapper } from '@/components/CmdBoxWrapper.vue'
7
8
  export { default as CmdBreadcrumbs } from '@/components/CmdBreadcrumbs.vue'
@@ -51,7 +52,6 @@ export { default as CmdWidthLimitationWrapper } from '@/components/CmdWidthLimit
51
52
  export { default as EditComponentWrapper } from '@/components/EditComponentWrapper.vue'
52
53
 
53
54
  // export page-components
54
- export { default as BasicForm } from '@/components/CmdBasicForm.vue'
55
55
  export { default as ContactInformation } from '@/pages/ContactInformation.vue'
56
56
  export { default as MultipleBoxWrapper } from '@/pages/MultipleBoxWrapper.vue'
57
57
  export { default as MultipleListsOfLinks } from '@/pages/MultipleListsOfLinks.vue'
@@ -24,8 +24,8 @@ export default {
24
24
  "basic_form.labeltext.country": "Country:",
25
25
  "basic_form.labeltext.additional_address_info": "Additional address information:",
26
26
  "basic_form.placeholder.additional_address_info": "Additional address information",
27
- "basic_form.labeltext.additional_text": "Additional text:",
28
- "basic_form.placeholder.additional_text": "Additional text",
27
+ "basic_form.labeltext.user_message": "Your message:",
28
+ "basic_form.placeholder.user_message": "Your message",
29
29
  "basic_form.labeltext.data_privacy": "I accept handling and saving of my personal data a mentioned in the <a href='/content/data-privacy-en.html' class='fancybox'>private policy</a>."
30
30
  }
31
31
  }
@@ -204,7 +204,7 @@ export default {
204
204
  computed: {
205
205
  iconBackToTop() {
206
206
  return {
207
- iconClass: "icon-single-arrow-up",
207
+ iconClass: "icon-chevron-one-stripe-up",
208
208
  tooltip: this.label("back_to_top_button.tooltip")
209
209
  }
210
210
  }
@@ -0,0 +1,45 @@
1
+ // noinspection CommaExpressionJS
2
+ class ContactFormValidator {
3
+ static PATTERN_SURNAME = /^[a-züöäßáéíóàèìòêîô '-]+$/i
4
+ static PATTERN_EMAIL = /^[a-z\d._%+-]+@[a-z\d._%+-]+\.[a-z]{2,}$/i
5
+ static PATTERN_MESSAGE = /^.{2,500}$/
6
+
7
+ label
8
+
9
+ constructor(label) {
10
+ this.label = label
11
+ }
12
+
13
+ validate(formData) {
14
+ [formData.lastName.error, formData.lastName.errorMessage] = this.validateRequired(
15
+ formData.lastName.value, ContactFormValidator.PATTERN_SURNAME, this.label('form_error_invalid_surname'))
16
+ [formData.email.error, formData.email.errorMessage] = this.validateRequired(
17
+ formData.email.value, ContactFormValidator.PATTERN_EMAIL, this.label('form_error_invalid_email'))
18
+ [formData.additionalText.error, formData.additionalText.errorMessage] = this.validateRequired(
19
+ formData.additionalText.value, ContactFormValidator.PATTERN_MESSAGE, this.label('form_error_invalid_message'))
20
+ formData.acceptPrivacy.error = false
21
+ formData.error = formData.lastName.error
22
+ || formData.email.error
23
+ || formData.additionalText.error
24
+ return formData
25
+ }
26
+
27
+ validatePrivacy(formData) {
28
+ formData.acceptPrivacy.error = !formData.acceptPrivacy.value
29
+ formData.acceptPrivacy.errorMessage = formData.acceptPrivacy.error ? this.label('form_error_missing_privacy_consent') : ''
30
+ formData.error = formData.error || formData.acceptPrivacy.error
31
+ return formData
32
+ }
33
+
34
+ validateRequired(value, pattern, errorMessage) {
35
+ if (!value || value.trim().length === 0) {
36
+ return [true, this.label('form_error_empty')]
37
+ }
38
+ if (pattern && !pattern.test(value)) {
39
+ return [true, errorMessage || this.label('form_error_invalid')]
40
+ }
41
+ return [false, '']
42
+ }
43
+ }
44
+
45
+ export { ContactFormValidator }
@@ -1,26 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
- <svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
- width="850.395px" height="566.929px" viewBox="0 0 850.395 566.929" enable-background="new 0 0 850.395 566.929"
6
- xml:space="preserve">
7
- <symbol id="Stern" viewBox="-80.297 -76.367 160.595 152.734">
8
- <polygon fill="#FFDE08" points="0,76.367 20.678,20.397 80.298,18.027 33.457,-18.934 49.627,-76.367 0,-43.241 -49.626,-76.367
9
- -33.457,-18.934 -80.297,18.027 -20.677,20.397 "/>
10
- </symbol>
11
- <g id="cn">
12
- <g>
13
- <rect fill="#DF2B14" width="850.395" height="566.929"/>
14
-
15
- <use xlink:href="#Stern" width="160.595" height="152.734" x="-80.297" y="-76.367" transform="matrix(1 0 0 -1 141.4941 133.5356)" overflow="visible"/>
16
-
17
- <use xlink:href="#Stern" width="160.595" height="152.734" x="-80.297" y="-76.367" transform="matrix(0.318 0.1158 0.1158 -0.318 282.7402 57.1685)" overflow="visible"/>
18
-
19
- <use xlink:href="#Stern" width="160.595" height="152.734" x="-80.297" y="-76.367" transform="matrix(0.318 -0.1158 -0.1158 -0.318 341.1777 115.0728)" overflow="visible"/>
20
-
21
- <use xlink:href="#Stern" width="160.595" height="152.734" x="-80.297" y="-76.367" transform="matrix(0.318 0.1158 0.1158 -0.318 284.2407 256.6177)" overflow="visible"/>
22
-
23
- <use xlink:href="#Stern" width="160.595" height="152.734" x="-80.297" y="-76.367" transform="matrix(0.3384 0 0 -0.3384 340.73 194.541)" overflow="visible"/>
24
- </g>
25
- </g>
26
- </svg>