comand-component-library 4.0.14 → 4.0.16
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/comand-component-library.js +1759 -1667
- package/dist/comand-component-library.umd.cjs +3 -3
- package/dist/style.css +1 -1
- package/package.json +2 -2
- package/src/ComponentLibrary.vue +73 -99
- package/src/assets/data/listOfComponents.json +39 -0
- package/src/componentSettingsDataAndControls.vue +5 -0
- package/src/components/CmdBox.vue +2 -3
- package/src/components/CmdCompanyLogo.vue +6 -3
- package/src/components/CmdFancyBox.vue +2 -1
- package/src/components/CmdForm.vue +16 -2
- package/src/components/CmdFormElement.vue +1 -8
- package/src/components/CmdImage.vue +4 -1
- package/src/components/CmdMainNavigation.vue +3 -3
- package/src/components/CmdOpeningHours.vue +29 -26
- package/src/components/CmdPageHeader.vue +1 -1
- package/src/components/CmdSiteHeader.vue +100 -10
- package/src/components/ComponentSettings.vue +0 -1
- package/src/pages/BasicForm.vue +23 -20
- package/src/pages/ContactInformation.vue +13 -4
- package/src/pages/PageOverview.vue +33 -2
- package/src/App.vue +0 -2117
@@ -1,6 +1,14 @@
|
|
1
1
|
<template>
|
2
2
|
<div
|
3
|
-
|
3
|
+
ref="site-header"
|
4
|
+
:class="[
|
5
|
+
'cmd-site-header site-header',
|
6
|
+
{
|
7
|
+
sticky: sticky,
|
8
|
+
'navigation-inline': navigationInline,
|
9
|
+
'off-canvas-right': cmdMainNavigation?.offcanvasPosition === 'right'
|
10
|
+
}
|
11
|
+
]"
|
4
12
|
role="banner">
|
5
13
|
<!-- begin slot for elements above header -->
|
6
14
|
<div v-if="$slots.topheader" class="top-header">
|
@@ -8,6 +16,7 @@
|
|
8
16
|
</div>
|
9
17
|
<!-- end slot for elements above header -->
|
10
18
|
|
19
|
+
<!-- begin (inner) header -->
|
11
20
|
<header
|
12
21
|
:class="[
|
13
22
|
useGrid ? 'grid-container-create-columns': 'flex-container',
|
@@ -27,6 +36,7 @@
|
|
27
36
|
<CmdCompanyLogo
|
28
37
|
v-if="cmdCompanyLogo"
|
29
38
|
v-bind="cmdCompanyLogo"
|
39
|
+
@image-loaded="onImageLoaded"
|
30
40
|
/>
|
31
41
|
<!-- end CmdCompanyLogo -->
|
32
42
|
|
@@ -43,6 +53,7 @@
|
|
43
53
|
</template>
|
44
54
|
<!-- end content given by data -->
|
45
55
|
</header>
|
56
|
+
<!-- end (inner) header -->
|
46
57
|
|
47
58
|
<!-- begin CmdMainNavigation -->
|
48
59
|
<CmdMainNavigation
|
@@ -61,6 +72,11 @@
|
|
61
72
|
export default {
|
62
73
|
name: "CmdSiteHeader",
|
63
74
|
emits: ["offcanvas"],
|
75
|
+
data() {
|
76
|
+
return {
|
77
|
+
defaultLogoHeight: ""
|
78
|
+
}
|
79
|
+
},
|
64
80
|
props: {
|
65
81
|
/**
|
66
82
|
* use only if default-button of inner navigation-component should not be used
|
@@ -85,6 +101,24 @@ export default {
|
|
85
101
|
type: Boolean,
|
86
102
|
default: false
|
87
103
|
},
|
104
|
+
/**
|
105
|
+
* set if header (incl. logo) should be resized if user scrolls page
|
106
|
+
*
|
107
|
+
* scrollContainerToResizeHeader-property must be defined
|
108
|
+
*/
|
109
|
+
resizeHeaderOnScroll: {
|
110
|
+
type: Boolean,
|
111
|
+
default: true
|
112
|
+
},
|
113
|
+
/**
|
114
|
+
* set selector the user scrolls to resize header
|
115
|
+
*
|
116
|
+
* resizeHeaderOnScroll-property must be activated
|
117
|
+
*/
|
118
|
+
scrollContainerToResizeHeader: {
|
119
|
+
type: String,
|
120
|
+
default: "#page-wrapper"
|
121
|
+
},
|
88
122
|
/**
|
89
123
|
* use a grid for positioning of inner-elements (else a flex-container will be used)
|
90
124
|
*
|
@@ -109,10 +143,34 @@ export default {
|
|
109
143
|
required: false
|
110
144
|
}
|
111
145
|
},
|
146
|
+
mounted() {
|
147
|
+
if (this.resizeHeaderOnScroll) {
|
148
|
+
const scrollContainer = document.querySelector(this.scrollContainerToResizeHeader);
|
149
|
+
|
150
|
+
scrollContainer.addEventListener("scroll", function () {
|
151
|
+
const header = document.querySelector(".cmd-site-header > header");
|
152
|
+
|
153
|
+
if (scrollContainer.scrollTop > 0) {
|
154
|
+
header.classList.add("resize-on-scroll");
|
155
|
+
} else {
|
156
|
+
header.classList.remove("resize-on-scroll");
|
157
|
+
}
|
158
|
+
});
|
159
|
+
}
|
160
|
+
},
|
112
161
|
methods: {
|
162
|
+
onImageLoaded(event) {
|
163
|
+
this.defaultLogoHeight = (event.target.height / 10) + "rem"
|
164
|
+
},
|
113
165
|
emitOffcanvasStatus(event) {
|
114
166
|
this.$emit("offcanvas", event)
|
115
167
|
}
|
168
|
+
},
|
169
|
+
watch: {
|
170
|
+
defaultLogoHeight() {
|
171
|
+
const logo = this.$refs["site-header"].querySelector(".cmd-company-logo img")
|
172
|
+
logo.style.height = this.defaultLogoHeight
|
173
|
+
}
|
116
174
|
}
|
117
175
|
}
|
118
176
|
</script>
|
@@ -130,6 +188,36 @@ export default {
|
|
130
188
|
&.sticky {
|
131
189
|
position: sticky;
|
132
190
|
z-index: 300;
|
191
|
+
|
192
|
+
header {
|
193
|
+
--header-scroll-animation: var(--default-transition);
|
194
|
+
transition: var(--header-scroll-animation);
|
195
|
+
|
196
|
+
.cmd-company-logo {
|
197
|
+
figure {
|
198
|
+
img {
|
199
|
+
transform-origin: top left;
|
200
|
+
transition: var(--header-scroll-animation);
|
201
|
+
margin: 0;
|
202
|
+
}
|
203
|
+
}
|
204
|
+
}
|
205
|
+
|
206
|
+
&.resize-on-scroll {
|
207
|
+
padding-top: var(--default-padding);
|
208
|
+
padding-bottom: var(--default-padding);
|
209
|
+
transition: var(--header-scroll-animation);
|
210
|
+
|
211
|
+
.cmd-company-logo {
|
212
|
+
figure {
|
213
|
+
img {
|
214
|
+
transition: var(--header-scroll-animation);
|
215
|
+
height: 5rem;
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
133
221
|
}
|
134
222
|
|
135
223
|
header, .cmd-main-navigation nav, .cmd-list-of-links {
|
@@ -150,12 +238,12 @@ export default {
|
|
150
238
|
}
|
151
239
|
}
|
152
240
|
|
153
|
-
|
241
|
+
.main-navigation-wrapper {
|
154
242
|
grid-column: span var(--grid-columns);
|
155
243
|
border-bottom: 0;
|
156
244
|
}
|
157
245
|
|
158
|
-
& +
|
246
|
+
& + .main-navigation-wrapper {
|
159
247
|
nav {
|
160
248
|
border-left: 0;
|
161
249
|
border-right: 0;
|
@@ -163,7 +251,7 @@ export default {
|
|
163
251
|
}
|
164
252
|
|
165
253
|
/* use id to ensure high specificity */
|
166
|
-
> .cmd-main-navigation
|
254
|
+
> .cmd-main-navigation.main-navigation-wrapper:last-child {
|
167
255
|
border-bottom: 0;
|
168
256
|
}
|
169
257
|
|
@@ -211,7 +299,7 @@ export default {
|
|
211
299
|
grid-column: span var(--grid-small-span);
|
212
300
|
}
|
213
301
|
|
214
|
-
|
302
|
+
.main-navigation-wrapper {
|
215
303
|
grid-area: main-navigation;
|
216
304
|
display: flex;
|
217
305
|
align-items: center;
|
@@ -245,26 +333,28 @@ export default {
|
|
245
333
|
header {
|
246
334
|
grid-auto-rows: auto; /* items should be as large as their content */
|
247
335
|
|
248
|
-
.cmd-main-navigation
|
336
|
+
.cmd-main-navigation.main-navigation-wrapper {
|
249
337
|
&:not(.persist-on-mobile) {
|
250
338
|
padding: 0;
|
251
339
|
}
|
252
340
|
}
|
253
341
|
|
254
|
-
|
342
|
+
/* main-navigation below logo */
|
343
|
+
& + .cmd-main-navigation.main-navigation-wrapper {
|
255
344
|
padding-bottom: var(--default-padding);
|
256
345
|
}
|
257
346
|
}
|
258
347
|
|
348
|
+
/* main-navigation inline with logo */
|
259
349
|
&.navigation-inline {
|
260
|
-
.cmd-main-navigation
|
350
|
+
.cmd-main-navigation.main-navigation-wrapper {
|
261
351
|
&:not(.persist-on-mobile) {
|
262
352
|
padding-left: var(--default-padding);
|
263
353
|
}
|
264
354
|
}
|
265
355
|
|
266
356
|
&.off-canvas-right {
|
267
|
-
.cmd-main-navigation
|
357
|
+
.cmd-main-navigation.main-navigation-wrapper {
|
268
358
|
&:not(.persist-on-mobile) {
|
269
359
|
padding: 0;
|
270
360
|
}
|
@@ -290,7 +380,7 @@ export default {
|
|
290
380
|
|
291
381
|
&.navigation-inline {
|
292
382
|
header {
|
293
|
-
.cmd-company-logo,
|
383
|
+
.cmd-company-logo, .main-navigation-wrapper {
|
294
384
|
grid-column: span calc(var(--grid-small-span) / 2);
|
295
385
|
}
|
296
386
|
}
|
@@ -4,7 +4,6 @@
|
|
4
4
|
:collapsible="true"
|
5
5
|
:cmdHeadline="{headlineText: readableName(componentName), headlineLevel: 4, headlineIcon: {iconClass: 'icon-settings-template'}}"
|
6
6
|
:openCollapsedBox="true"
|
7
|
-
:allowContentToScroll="true"
|
8
7
|
boxBodyClass="settings-body"
|
9
8
|
>
|
10
9
|
<template v-slot:body>
|
package/src/pages/BasicForm.vue
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
<template>
|
2
2
|
<div class="cmd-pages-basic-form">
|
3
3
|
<!-- being CmdForm -->
|
4
|
-
<CmdForm
|
5
|
-
@submit="onSubmit"
|
4
|
+
<CmdForm @submit="onSubmit"
|
6
5
|
novalidate="novalidate"
|
7
6
|
:textLegend="getMessage('basic_form.legend')"
|
8
7
|
:submitButton="submitButton"
|
9
8
|
>
|
10
|
-
<div class="flex-container no-flex">
|
9
|
+
<div v-if="configuration.salutation" class="flex-container no-flex">
|
11
10
|
<!-- begin cmd-form-element -->
|
12
11
|
<CmdFormElement
|
13
12
|
element="input"
|
@@ -39,7 +38,7 @@
|
|
39
38
|
<slot name="top"></slot>
|
40
39
|
<!-- end slot (top) -->
|
41
40
|
|
42
|
-
<div class="flex-container">
|
41
|
+
<div v-if="configuration.lastName || configuration.firstName" class="flex-container">
|
43
42
|
<!-- begin cmd-form-element -->
|
44
43
|
<CmdFormElement
|
45
44
|
v-if="configuration.lastName"
|
@@ -47,7 +46,6 @@
|
|
47
46
|
:type="configuration.lastName?.type || 'text'"
|
48
47
|
iconClass="icon-user-profile"
|
49
48
|
:labelText="getMessage('basic_form.labeltext.last_name')"
|
50
|
-
:tooltipText="formData.lastName.error ? formData.lastName.errorMessage : 'Type your surname!'"
|
51
49
|
:required="configuration.lastName?.required"
|
52
50
|
:name="configuration.lastName?.name || 'last-name'"
|
53
51
|
:placeholder="getMessage('basic_form.placeholder.last_name')"
|
@@ -64,7 +62,6 @@
|
|
64
62
|
:type="configuration.firstName?.type || 'text'"
|
65
63
|
iconClass="icon-user-profile"
|
66
64
|
:labelText="getMessage('basic_form.labeltext.first_name')"
|
67
|
-
:tooltipText="formData.firstName.error ? formData.firstName.errorMessage : 'Type your first name!'"
|
68
65
|
:placeholder="getMessage('basic_form.placeholder.first_name')"
|
69
66
|
:required="configuration.firstName?.required"
|
70
67
|
:name="configuration.firstName?.name || 'first-name'"
|
@@ -87,7 +84,6 @@
|
|
87
84
|
:name="configuration.email?.name || 'email'"
|
88
85
|
v-model="formData.email.value"
|
89
86
|
:status="formData.email.error ? 'error' : ''"
|
90
|
-
:tooltipText="formData.email.error ? formData.email.errorMessage : 'Type your email!'"
|
91
87
|
@validate="onValidate"
|
92
88
|
/>
|
93
89
|
<!-- end cmd-form-element -->
|
@@ -104,15 +100,15 @@
|
|
104
100
|
:required="configuration.phone?.required"
|
105
101
|
:name="configuration.phone?.name || 'phone'"
|
106
102
|
:status="formData.phone.error ? 'error' : ''"
|
107
|
-
:tooltipText="formData.phone.error ? formData.phone.errorMessage : 'Type your phone number!'"
|
108
103
|
@validate="onValidate"
|
109
104
|
/>
|
110
105
|
<!-- end cmd-form-element -->
|
111
106
|
</div>
|
112
107
|
|
113
|
-
<div class="flex-container">
|
108
|
+
<div v-if="configuration.streetNo || configuration.zip || configuration.city" class="flex-container">
|
114
109
|
<!-- begin cmd-form-element -->
|
115
110
|
<CmdFormElement
|
111
|
+
v-if="configuration.streetNo"
|
116
112
|
element="input"
|
117
113
|
:type="configuration.streetNo?.type || 'text'"
|
118
114
|
:labelText="getMessage('basic_form.labeltext.street_no')"
|
@@ -121,7 +117,6 @@
|
|
121
117
|
:name="configuration.streetNo?.name || 'street-no'"
|
122
118
|
v-model="formData.streetNo.value"
|
123
119
|
:status="formData.streetNo.error ? 'error' : ''"
|
124
|
-
:tooltipText="formData.streetNo.error ? formData.streetNo.errorMessage : 'Type your street and number!'"
|
125
120
|
@validate="onValidate"
|
126
121
|
/>
|
127
122
|
<!-- end cmd-form-element -->
|
@@ -129,6 +124,7 @@
|
|
129
124
|
<div class="input-wrapper">
|
130
125
|
<!-- begin cmd-form-element -->
|
131
126
|
<CmdFormElement
|
127
|
+
v-if="configuration.zip"
|
132
128
|
element="input"
|
133
129
|
:type="configuration.zip?.type || 'number'"
|
134
130
|
:labelText="getMessage('basic_form.labeltext.zip')"
|
@@ -137,12 +133,13 @@
|
|
137
133
|
:name="configuration.zip?.name || 'zip'"
|
138
134
|
v-model="formData.zip.value"
|
139
135
|
:status="formData.zip.error ? 'error' : ''"
|
140
|
-
:tooltipText="formData.zip.error ? formData.zip.errorMessage : 'Type your zip/postal code!'"
|
141
136
|
@validate="onValidate"
|
142
137
|
/>
|
143
138
|
<!-- end cmd-form-element -->
|
139
|
+
|
144
140
|
<!-- begin cmd-form-element -->
|
145
141
|
<CmdFormElement
|
142
|
+
v-if="configuration.city"
|
146
143
|
element="input"
|
147
144
|
:type="configuration.city?.type || 'text'"
|
148
145
|
:labelText="getMessage('basic_form.labeltext.city')"
|
@@ -151,7 +148,6 @@
|
|
151
148
|
:name="configuration.city?.name || 'zip'"
|
152
149
|
v-model="formData.city.value"
|
153
150
|
:status="formData.city.error ? 'error' : ''"
|
154
|
-
:tooltipText="formData.city.error ? formData.city.errorMessage : 'Type your city!'"
|
155
151
|
@validate="onValidate"
|
156
152
|
/>
|
157
153
|
<!-- end cmd-form-element -->
|
@@ -159,6 +155,7 @@
|
|
159
155
|
|
160
156
|
<!-- begin cmd-form-element -->
|
161
157
|
<CmdFormElement
|
158
|
+
v-if="configuration.additionalAddressInfo"
|
162
159
|
element="input"
|
163
160
|
:type="configuration.additionalAddressInfo?.type || 'text'"
|
164
161
|
:labelText="getMessage('basic_form.labeltext.additional_address_info')"
|
@@ -167,7 +164,6 @@
|
|
167
164
|
:name="configuration.additionalAddressInfo?.name || 'additional-address-info'"
|
168
165
|
v-model="formData.additionalAddressInfo.value"
|
169
166
|
:status="formData.additionalAddressInfo.error ? 'error' : ''"
|
170
|
-
:tooltipText="formData.additionalAddressInfo.error ? formData.additionalAddressInfo.errorMessage : 'Type additional address information!'"
|
171
167
|
@validate="onValidate"
|
172
168
|
/>
|
173
169
|
<!-- end cmd-form-element -->
|
@@ -175,7 +171,8 @@
|
|
175
171
|
|
176
172
|
<!-- begin cmd-form-element -->
|
177
173
|
<CmdFormElement
|
178
|
-
|
174
|
+
v-if="configuration.additionalText"
|
175
|
+
:element="configuration.additionalText?.element || 'textarea'"
|
179
176
|
:labelText="getMessage('basic_form.labeltext.additional_text')"
|
180
177
|
:placeholder="getMessage('basic_form.placeholder.additional_text')"
|
181
178
|
:required="configuration.additionalText?.required"
|
@@ -192,6 +189,7 @@
|
|
192
189
|
|
193
190
|
<!-- begin cmd-form-element -->
|
194
191
|
<CmdFormElement
|
192
|
+
v-if="configuration.acceptPrivacy"
|
195
193
|
element="input"
|
196
194
|
type="checkbox"
|
197
195
|
:required="configuration.acceptPrivacy?.required"
|
@@ -254,6 +252,9 @@ export default {
|
|
254
252
|
}
|
255
253
|
},
|
256
254
|
props: {
|
255
|
+
/**
|
256
|
+
* configuration for form-elements used in form
|
257
|
+
*/
|
257
258
|
configuration: {
|
258
259
|
type: Object,
|
259
260
|
default() {
|
@@ -298,7 +299,7 @@ export default {
|
|
298
299
|
},
|
299
300
|
additionalText: {
|
300
301
|
required: false,
|
301
|
-
|
302
|
+
element: "textarea"
|
302
303
|
},
|
303
304
|
acceptPrivacy: {
|
304
305
|
required: true,
|
@@ -307,14 +308,16 @@ export default {
|
|
307
308
|
}
|
308
309
|
}
|
309
310
|
},
|
311
|
+
/**
|
312
|
+
* receiver e-mail-address the form is sent to
|
313
|
+
*/
|
310
314
|
receiverEmailAddress: {
|
311
315
|
type: String,
|
312
316
|
default: ""
|
313
317
|
},
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
},
|
318
|
+
/**
|
319
|
+
* submit-button to submit all form-data
|
320
|
+
*/
|
318
321
|
submitButton: {
|
319
322
|
type: Object,
|
320
323
|
default() {
|
@@ -322,6 +325,7 @@ export default {
|
|
322
325
|
iconClass: "icon-message-send",
|
323
326
|
text: "Send mail",
|
324
327
|
type: "submit",
|
328
|
+
position: "belowFieldset",
|
325
329
|
primary: true
|
326
330
|
}
|
327
331
|
}
|
@@ -333,7 +337,6 @@ export default {
|
|
333
337
|
openFancyBox({url: event.target.getAttribute('href')})
|
334
338
|
})
|
335
339
|
},
|
336
|
-
|
337
340
|
methods: {
|
338
341
|
onSubmit(event) {
|
339
342
|
this.onValidate();
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<template>
|
2
|
-
<!-- begin
|
2
|
+
<!-- begin basicForm -->
|
3
3
|
<BasicForm v-if="contactFormOnly" v-bind="basicForm" />
|
4
|
-
<!-- end
|
4
|
+
<!-- end basicForm -->
|
5
5
|
|
6
6
|
<div v-else class="flex-container">
|
7
|
-
<!-- begin
|
7
|
+
<!-- begin basicForm -->
|
8
8
|
<BasicForm v-bind="basicForm" />
|
9
|
-
<!-- end
|
9
|
+
<!-- end basicForm -->
|
10
10
|
|
11
11
|
<!-- begin additional-columns -->
|
12
12
|
<div class="flex-container vertical">
|
@@ -30,14 +30,23 @@
|
|
30
30
|
export default {
|
31
31
|
name: "ContactInformation",
|
32
32
|
props: {
|
33
|
+
/**
|
34
|
+
* properties for basicForm-component
|
35
|
+
*/
|
33
36
|
basicForm: {
|
34
37
|
type: Object,
|
35
38
|
default: null
|
36
39
|
},
|
40
|
+
/**
|
41
|
+
* properties for CmdAddressData-component
|
42
|
+
*/
|
37
43
|
cmdAddressData: {
|
38
44
|
type: Object,
|
39
45
|
default: null
|
40
46
|
},
|
47
|
+
/**
|
48
|
+
* properties for CmdGoogleMaps-component
|
49
|
+
*/
|
41
50
|
cmdGoogleMaps: {
|
42
51
|
type: Object,
|
43
52
|
default: null
|
@@ -14,7 +14,7 @@
|
|
14
14
|
<span>Contact Information</span>
|
15
15
|
</h2>
|
16
16
|
<ContactInformation
|
17
|
-
:
|
17
|
+
:basicForm="basicForm"
|
18
18
|
:cmdAddressData="{}"
|
19
19
|
:cmdGoogleMaps="{}">
|
20
20
|
<template v-slot:additional-info>
|
@@ -68,7 +68,38 @@ export default {
|
|
68
68
|
listOfDownloadsData,
|
69
69
|
listOfSiteLinksData,
|
70
70
|
basicForm: {
|
71
|
-
|
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
|
+
}
|
72
103
|
}
|
73
104
|
}
|
74
105
|
}
|