comand-component-library 4.0.17 → 4.0.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. package/dist/comand-component-library.js +2864 -2766
  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 +28 -1
  6. package/src/assets/data/listOfComponents.json +1 -0
  7. package/src/assets/styles/component-library-global-styles.scss +1 -41
  8. package/src/assets/styles/transitions.css +0 -6
  9. package/src/{pages/BasicForm.vue → components/CmdBasicForm.vue} +71 -33
  10. package/src/components/CmdBreadcrumbs.vue +2 -2
  11. package/src/components/CmdFancyBox.vue +3 -3
  12. package/src/components/CmdForm.vue +13 -5
  13. package/src/components/CmdPageFooter.vue +36 -0
  14. package/src/components/CmdPageHeader.vue +2 -2
  15. package/src/components/CmdSiteFooter.vue +1 -3
  16. package/src/components/CmdSiteHeader.vue +0 -2
  17. package/src/components/CmdSlideshow.vue +4 -0
  18. package/src/components/CmdSwitchLanguage.vue +1 -1
  19. package/src/index.js +1 -1
  20. package/src/mixins/{pages/BasicForm → CmdBasicForm}/DefaultMessageProperties.js +2 -2
  21. package/src/pages/PageOverview.vue +1 -43
  22. package/src/utils/ContactFormValidation.js +45 -0
  23. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-cn.svg +0 -26
  24. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-de.svg +0 -76
  25. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-en.svg +0 -76
  26. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-es.svg +0 -83
  27. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-fr.svg +0 -76
  28. package/src/assets/fonts/iconfonts/logos-iconfont/images/flags/flag-it.svg +0 -76
  29. 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 -->
@@ -122,7 +123,7 @@
122
123
  v-model="formData.country.value"
123
124
  :status="formData.country.error ? 'error' : ''"
124
125
  @validate="onValidate"
125
- @change="onCountrySelect"
126
+ @update:modelValue="onCountrySelect"
126
127
  />
127
128
  <!-- end cmd-form-element -->
128
129
 
@@ -156,7 +157,7 @@
156
157
  />
157
158
  <!-- end cmd-form-element -->
158
159
 
159
- <div class="input-wrapper" :class="showCityBeforeZip ? 'order-city-zip' : 'order-zip-city'">
160
+ <div class="input-wrapper" :class="cityBeforeZip ? 'order-city-zip' : 'order-zip-city'">
160
161
  <!-- begin cmd-form-element -->
161
162
  <CmdFormElement
162
163
  v-if="configuration.zip"
@@ -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.userMessage')"
214
+ :placeholder="getMessage('basic_form.placeholder.userMessage')"
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 -->
@@ -246,11 +247,13 @@
246
247
 
247
248
  <script>
248
249
  // import mixins
249
- import I18n from "../mixins/I18n"
250
- import DefaultMessageProperties from "../mixins/pages/BasicForm/DefaultMessageProperties"
251
- import FieldValidation from "../mixins/FieldValidation"
250
+ import I18n from "../mixins/I18n.js"
251
+ import DefaultMessageProperties from "../mixins/CmdBasicForm/DefaultMessageProperties.js"
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,9 +266,9 @@ export default {
263
266
  },
264
267
  data() {
265
268
  return {
266
- //validator: new ContactFormValidator(name => this.label(name)),
269
+ validator: new ContactFormValidator(label => label),
267
270
  formData: {
268
- salutation: this.configuration.salutation.default,
271
+ salutation: {value: this.configuration.salutation.default},
269
272
  lastName: {value: ''},
270
273
  firstName: {value: ''},
271
274
  email: {value: ''},
@@ -276,13 +279,27 @@ export default {
276
279
  pobox: {value: ''},
277
280
  country: {value: ''},
278
281
  additionalAddressInfo: {value: ''},
279
- additionalText: {value: ''},
282
+ userMessage: {value: ''},
280
283
  acceptPrivacy: {value: false}
281
284
  },
282
285
  cityBeforeZip: this.showCityBeforeZip
283
286
  }
284
287
  },
285
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
+ },
286
303
  /**
287
304
  * configuration for form-elements used in form
288
305
  */
@@ -346,7 +363,7 @@ export default {
346
363
  required: false,
347
364
  type: "text"
348
365
  },
349
- additionalText: {
366
+ userMessage: {
350
367
  required: false,
351
368
  element: "textarea"
352
369
  },
@@ -400,29 +417,50 @@ export default {
400
417
  }
401
418
  },
402
419
  mounted() {
403
- this.$refs.dataPrivacy?.querySelector('.fancybox')?.addEventListener('click', event => {
420
+ this.$refs.dataPrivacy?.querySelector(".fancybox")?.addEventListener("click", event => {
404
421
  event.preventDefault()
405
- openFancyBox({url: event.target.getAttribute('href')})
422
+ openFancyBox({url: event.target.getAttribute("href")})
406
423
  })
407
424
  },
408
425
  methods: {
409
426
  onSubmit(event) {
410
- this.onValidate();
427
+ this.onValidate()
411
428
 
412
429
  this.formData = Object.assign({}, this.validator.validatePrivacy(this.formData));
413
- if (this.formData.error) {
414
- event.preventDefault();
415
- 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)
416
447
  }
417
448
 
418
- 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()
419
461
  },
420
462
  onCountrySelect(event) {
421
- alert("Country selected")
422
- console.log("country selected", event)
423
- if (event === 'us' || event === 'uk') {
424
- this.cityBeforeZip = true
425
- }
463
+ this.cityBeforeZip = event === 'us' || event === 'uk';
426
464
  },
427
465
  onValidate() {
428
466
  this.formData = Object.assign({}, this.validator.validate(this.formData));
@@ -438,7 +476,7 @@ export default {
438
476
  }
439
477
  },
440
478
  watch: {
441
- cityBeforeZip() {
479
+ showCityBeforeZip() {
442
480
  this.cityBeforeZip = this.showCityBeforeZip
443
481
  }
444
482
  }
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <ul class="cmd-breadcrumbs">
3
- <li v-if="breadcrumbLabel">{{ breadcrumbLabel }}</li>
3
+ <li v-if="breadcrumbLabel" class="breadcrumb-label">{{ breadcrumbLabel }}</li>
4
4
  <li v-for="(link, index) in breadcrumbLinks || []" :key="index">
5
5
  <!-- begin type 'href' -->
6
6
  <a v-if="link.type === 'href'" :href="link.path">
@@ -84,7 +84,7 @@ export default {
84
84
  padding: 0 calc(var(--default-padding) / 2);
85
85
  }
86
86
 
87
- &:first-child {
87
+ &.breadcrumb-label {
88
88
  margin-right: calc(var(--default-margin) / 2);
89
89
  }
90
90
 
@@ -73,7 +73,7 @@
73
73
  <!-- end CmdImage -->
74
74
  </div>
75
75
  <div v-else-if="fancyBoxContent" class="content" v-html="fancyBoxContent"></div>
76
- <div v-else-if="fancyBoxElements" class="content"></div>
76
+ <div v-else-if="fancyBoxElements" class="content" ref="elements"></div>
77
77
  <div v-else-if="fancyBoxGallery" class="content">
78
78
  <!-- begin CmdSlideButton -->
79
79
  <CmdSlideButton @click.prevent="showPrevItem" slideButtonType="prev"/>
@@ -259,7 +259,7 @@ const FancyBox = defineComponent({
259
259
  required: false
260
260
  },
261
261
  /**
262
- * list of show elements (not images)
262
+ * list of shown elements (not images)
263
263
  */
264
264
  elements: {
265
265
  type: Array,
@@ -382,7 +382,7 @@ const FancyBox = defineComponent({
382
382
  } else if (this.elements) {
383
383
  this.fancyBoxElements = this.elements.map(el => el.cloneNode(true))
384
384
  this.$nextTick(() => {
385
- this.$el.querySelector(".content").append(...this.fancyBoxElements)
385
+ this.$refs.elements.append(...this.fancyBoxElements)
386
386
  })
387
387
  }
388
388
  },
@@ -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) {
@@ -16,6 +16,7 @@
16
16
  v-if="buttonPrintView.show"
17
17
  :class="['button', {'primary': buttonPrintView.primary}]"
18
18
  :title="buttonPrintView.text ? buttonPrintView.icon?.tooltip : null"
19
+ @click="showFancyBox"
19
20
  >
20
21
  <span v-if="buttonPrintView.icon?.show" :class="buttonPrintView.icon?.iconClass"></span>
21
22
  <span v-if="buttonPrintView.text">{{buttonPrintView.text}}</span>
@@ -26,6 +27,8 @@
26
27
  </template>
27
28
 
28
29
  <script>
30
+ import { openFancyBox } from "./CmdFancyBox.vue"
31
+
29
32
  export default {
30
33
  name: "CmdPageFooter",
31
34
  props: {
@@ -60,6 +63,38 @@ export default {
60
63
  cmdSocialNetworks: {
61
64
  type: Array,
62
65
  required: false
66
+ },
67
+ /**
68
+ * properties for CmdFancyBox-component
69
+ */
70
+ cmdFancyBox: {
71
+ type: Object,
72
+ default() {
73
+ return {
74
+ showPrintButtons: true,
75
+ defaultAriaLabelText: "print-preview"
76
+ }
77
+ }
78
+ }
79
+ },
80
+ methods: {
81
+ showFancyBox() {
82
+ let elements = []
83
+ if(typeof this.cmdFancyBox.elements === "function") {
84
+ elements = this.cmdFancyBox.elements()
85
+ } else {
86
+ elements = [document.querySelector("main")]
87
+ }
88
+
89
+ openFancyBox({
90
+ elements: elements,
91
+ showPrintButtons: this.cmdFancyBox.showPrintButtons,
92
+ defaultAriaLabelText: this.cmdFancyBox.defaultAriaLabelText,
93
+ cmdHeadline: this.cmdFancyBox.cmdHeadline,
94
+ showOverlay: this.cmdFancyBox.showOverlay,
95
+ showSubmitButtons: this.cmdFancyBox.showSubmitButtons,
96
+ allowEscapeKey: this.cmdFancyBox.allowEscapeKey
97
+ })
63
98
  }
64
99
  }
65
100
  }
@@ -90,6 +125,7 @@ export default {
90
125
  justify-content: flex-end;
91
126
  margin-left: auto;
92
127
  gap: calc(var(--default-gap) / 2);
128
+ flex: none;
93
129
  }
94
130
  }
95
131
  /* end cmd-page-footer -------------------------------------------------------------------------------------------- */
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <header class="cmd-page-header flex-container">
2
+ <header v-if="cmdBreadcrumbs || cmdHeadline || $slots.default" class="cmd-page-header flex-container">
3
3
  <div v-if="cmdBreadcrumbs || cmdHeadline" class="headline-wrapper flex-container vertical">
4
4
  <!-- begin CmdBreadcrumbs -->
5
5
  <CmdBreadcrumbs v-if="cmdBreadcrumbs" v-bind="cmdBreadcrumbs" />
@@ -11,7 +11,7 @@
11
11
  </div>
12
12
 
13
13
  <!-- begin slot -->
14
- <slot></slot>
14
+ <slot v-if="$slots.default"></slot>
15
15
  <!-- end slot -->
16
16
  </header>
17
17
  </template>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="cmd-site-footer">
2
+ <div class="cmd-site-footer site-footer">
3
3
  <footer :class="['flex-container', {vertical: orientation === 'vertical'}]">
4
4
  <slot></slot>
5
5
  </footer>
@@ -31,8 +31,6 @@ export default {
31
31
  /* begin cmd-site-footer ---------------------------------------------------------------------------------------- */
32
32
  .cmd-site-footer {
33
33
  padding: var(--grid-gap) 0;
34
- border-top: var(--default-border);
35
- background: var(--default-background);
36
34
  margin-top: auto;
37
35
  flex: none;
38
36
 
@@ -184,8 +184,6 @@ export default {
184
184
  display: flex;
185
185
  flex-direction: column;
186
186
  flex: none;
187
- border-bottom: var(--default-border);
188
- background: var(--color-scheme-background);
189
187
 
190
188
  &.sticky {
191
189
  position: sticky;
@@ -473,6 +473,10 @@ export default {
473
473
  background: var(--pure-white-reduced-opacity);
474
474
  }
475
475
  }
476
+
477
+ .fade-enter-from, .fade-leave-to {
478
+ position: absolute;
479
+ }
476
480
  }
477
481
 
478
482
  .edit-mode .cmd-slideshow .image-wrapper.edit-items {
@@ -95,7 +95,7 @@ export default {
95
95
  a:not([class*="active"]) {
96
96
  filter: contrast(.5);
97
97
 
98
- &:hover, &:focus-visible, &:active, &.active {
98
+ &:hover, &:focus-visible, &:active, &.active, &.router-link-active {
99
99
  filter: none;
100
100
  padding: 0; /* overwrite default settings from frontend-framework for .active */
101
101
  background: none; /* overwrite default settings from frontend-framework for .active */
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 '@/pages/BasicForm.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
  }
@@ -1,12 +1,4 @@
1
1
  <template>
2
- <!-- begin basic-form ------------------------------------------------------------------------------------------------------------------------------------------------------->
3
- <CmdWidthLimitationWrapper>
4
- <h2 class="headline-demopage" id="section-basic-form">
5
- <span>Basic Form</span>
6
- </h2>
7
- <BasicForm :formAction="basicForm.formAction" />
8
- </CmdWidthLimitationWrapper>
9
- <!-- end basic-form ------------------------------------------------------------------------------------------------------------------------------------------------------->
10
2
 
11
3
  <!-- begin basic-form ------------------------------------------------------------------------------------------------------------------------------------------------------->
12
4
  <CmdWidthLimitationWrapper>
@@ -66,41 +58,7 @@ export default {
66
58
  faqsData,
67
59
  boxesTeamOverviewData,
68
60
  listOfDownloadsData,
69
- listOfSiteLinksData,
70
- basicForm: {
71
- configuration: {
72
- salutation: {
73
- name: "salutation",
74
- default: "m",
75
- replaceInputType: true
76
- },
77
- lastName: {
78
- name: "surname",
79
- required: true,
80
- type: "text"
81
- },
82
- firstName: {
83
- required: false,
84
- type: "text"
85
- },
86
- email: {
87
- required: true,
88
- type: "email"
89
- },
90
- phone: {
91
- required: false,
92
- type: "phone"
93
- },
94
- additionalText: {
95
- required: false,
96
- element: "textarea"
97
- },
98
- acceptPrivacy: {
99
- required: true,
100
- replaceInputType: true
101
- }
102
- }
103
- }
61
+ listOfSiteLinksData
104
62
  }
105
63
  }
106
64
  }
@@ -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>