comand-component-library 3.1.84 → 3.1.87

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "comand-component-library",
3
- "version": "3.1.84",
3
+ "version": "3.1.87",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
package/src/App.vue CHANGED
@@ -50,6 +50,7 @@
50
50
  <li><a href="#section-tabs">Tabs</a></li>
51
51
  <li><a href="#section-thumbnail-scroller">Thumbnail-Scroller</a></li>
52
52
  <li><a href="#section-toggle-darkmode">ToggleDarkMode</a></li>
53
+ <li><a href="#section-tooltip">Tooltip</a></li>
53
54
  <li><a href="#section-upload-form">Upload-Form</a></li>
54
55
  </ul>
55
56
  </div>
@@ -459,10 +460,14 @@
459
460
  checkbox with boolean: {{ checkboxValue }}<br/>
460
461
  checkboxes with values: {{ checkboxValues }}
461
462
  </p>
463
+
462
464
  <h3>Toggle Dark-Mode</h3>
463
465
  <a id="section-toggle-darkmode"></a>
466
+ <h4>Toggle Dark-Mode (with label, not styled)</h4>
464
467
  <CmdToggleDarkMode :showLabel="true"/>
468
+ <h4>Toggle Dark-Mode (without label, styled)</h4>
465
469
  <CmdToggleDarkMode :showLabel="false" :use-styled-layout="true" />
470
+
466
471
  <h2>Checkboxes and Radiobuttons</h2>
467
472
  <h3>Checkboxes [native]</h3>
468
473
  <div class="label inline">
@@ -494,6 +499,17 @@
494
499
  :status="validationStatus"
495
500
  :disabled="disabledStatus"
496
501
  />
502
+ <CmdFormElement element="input"
503
+ v-model="checkboxValues"
504
+ inputValue="checkboxValue3"
505
+ type="checkbox"
506
+ id="checkbox-with-value-3"
507
+ :status="validationStatus"
508
+ :disabled="disabledStatus">
509
+ <template v-slot:labeltext>
510
+ Labeltext with <a href="#">link</a> given by slot
511
+ </template>
512
+ </CmdFormElement>
497
513
  </div>
498
514
  </div>
499
515
  <h3>Checkboxes (replaced)</h3>
@@ -1132,9 +1148,7 @@
1132
1148
  :cmdHeadline="{headlineText: 'List of links', headlineLevel: 6}"
1133
1149
  />
1134
1150
  <CmdOpeningHours :openingHours="openingHoursData"
1135
- :closed="true"
1136
1151
  :cmdHeadline="{headlineText: 'Opening hours', headlineLevel: 6}"
1137
- textOpenClosed="Closed right now!"
1138
1152
  textHolidaysClosed="Closed on holidays"
1139
1153
  textMiscInfo="Miscellaneous information"
1140
1154
  />
@@ -1243,6 +1257,8 @@ import {openFancyBox} from "@/components/CmdFancyBox"
1243
1257
  // import external functions
1244
1258
  import * as functions from "@/mixins/FieldValidation.js"
1245
1259
 
1260
+ import {localizedTime} from "./components/CmdOpeningHours"
1261
+
1246
1262
  export default {
1247
1263
  name: "App",
1248
1264
  components: {
@@ -1417,6 +1433,9 @@ export default {
1417
1433
  }
1418
1434
  },
1419
1435
  methods: {
1436
+ localizedTime(language) {
1437
+ return (h, m) => (localizedTime(language))(h, m).toLowerCase()
1438
+ },
1420
1439
  closeCookieDisclaimer(event) {
1421
1440
  this.fancyBoxCookieDisclaimer = false
1422
1441
  alert(event.join(", "))
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "company": {
3
- "iconClass": "icon-home",
3
+ "iconClass": "icon-company",
4
4
  "value": "Your company name"
5
5
  },
6
6
  "address": {
@@ -8,6 +8,7 @@
8
8
  "streetNo": "Your Street/No",
9
9
  "zip": "Your zip",
10
10
  "city": "Your city",
11
+ "miscInfo": "",
11
12
  "country": "Your country",
12
13
  "longitude": "0.0",
13
14
  "latitude": "0.0",
@@ -1,29 +1,29 @@
1
1
  [
2
2
  {
3
3
  "day": "Mo",
4
- "fromTime": "08:00h",
5
- "tillTime": "17:00h"
4
+ "fromTime": "08:00",
5
+ "tillTime": "17:00"
6
6
  },
7
7
  {
8
8
  "day": "Tu",
9
- "fromTime": "08:00h",
10
- "tillTime": "17:00h"
9
+ "fromTime": "08:00",
10
+ "tillTime": "17:00"
11
11
  },
12
12
  {
13
13
  "day": "We",
14
- "fromTime": "08:00h",
15
- "tillTime": "17:30h"
14
+ "fromTime": "08:00",
15
+ "tillTime": "17:30"
16
16
  },
17
17
 
18
18
  {
19
19
  "day": "Th",
20
- "fromTime": "08:00h",
21
- "tillTime": "17:00h"
20
+ "fromTime": "08:00",
21
+ "tillTime": "17:00"
22
22
  },
23
23
  {
24
24
  "day": "Fr",
25
- "fromTime": "08:00h",
26
- "tillTime": "15:00h"
25
+ "fromTime": "08:00",
26
+ "tillTime": "15:00"
27
27
  }
28
28
  ]
29
29
 
@@ -271,7 +271,7 @@ html {
271
271
  --color-scheme-background-inverted: var(--light-mode-background-color);
272
272
  --default-background-color-lightness: 20%;
273
273
 
274
- :where(label, .label) .label-text [class*="icon"] {
274
+ :where(label, .label) .label-text > [class*="icon"] {
275
275
  background: var(--dark-gray);
276
276
  }
277
277
  }
@@ -17,25 +17,28 @@
17
17
  <!-- end company -->
18
18
 
19
19
  <!-- begin address -->
20
- <dt v-if="addressData.address && addressData.address.length">
21
- <span v-if="addressData.address.iconClass && showLabelIcons" :class="addressData.address.iconClass" :title="getMessage('cmdaddressdata.labeltext.address')"></span>
22
- <span v-if="showLabelTexts">{{ getMessage('cmdaddressdata.labeltext.address')}}</span>
23
- </dt>
24
- <dd v-if="addressData.address">
25
- <a v-if="linkGoogleMaps" :href="locateAddress" target="google-maps"
26
- :title="getMessage('cmdaddressdata.title.open_address_on_google_maps')">
27
- <span v-if="addressData.address.streetNo" class="street-address">{{ addressData.address.streetNo }}</span><br/>
28
- <span v-if="addressData.address.zip" class="postal-code">{{ addressData.address.zip }}&nbsp;</span>
29
- <span v-if="addressData.address.city" class="locality">{{ addressData.address.city }}</span><br/>
30
- <span v-if="addressData.address.country" class="country-name">{{ addressData.address.country }}</span>
31
- </a>
32
- <template v-else>
33
- <span v-if="addressData.address.streetNo" class="street-address">{{addressData.address.streetNo }}</span><br/>
34
- <span v-if="addressData.address.zip" class="postal-code">{{ addressData.address.zip }} </span>
35
- <span v-if="addressData.address.city" class="locality">{{ addressData.address.city }}</span><br/>
36
- <span v-if="addressData.address.country" class="country-name">{{ addressData.address.country }}</span>
37
- </template>
38
- </dd>
20
+ <template v-if="addressData.address && addressData.address !== undefined">
21
+ <dt class="address">
22
+ <span v-if="addressData.address.iconClass && showLabelIcons" :class="addressData.address.iconClass" :title="getMessage('cmdaddressdata.labeltext.address')"></span>
23
+ <span v-if="showLabelTexts">{{ getMessage('cmdaddressdata.labeltext.address')}}</span>
24
+ </dt>
25
+ <dd v-if="addressData.address">
26
+ <a v-if="linkGoogleMaps" :href="locateAddress" target="google-maps" :title="getMessage('cmdaddressdata.title.open_address_on_google_maps')">
27
+ <span v-if="addressData.address.streetNo" class="street-address">{{ addressData.address.streetNo }}</span><br/>
28
+ <span v-if="addressData.address.zip" class="postal-code">{{ addressData.address.zip }}&nbsp;</span>
29
+ <span v-if="addressData.address.city" class="locality">{{ addressData.address.city }}</span><br/>
30
+ <span v-if="addressData.address.miscInfo">{{ addressData.address.miscInfo }}</span><br/>
31
+ <span v-if="addressData.address.country" class="country-name">{{ addressData.address.country }}</span>
32
+ </a>
33
+ <template v-else>
34
+ <span v-if="addressData.address.streetNo" class="street-address">{{addressData.address.streetNo }}</span><br/>
35
+ <span v-if="addressData.address.zip" class="postal-code">{{ addressData.address.zip }}&nbsp;</span>
36
+ <span v-if="addressData.address.city" class="locality">{{ addressData.address.city }}</span><br/>
37
+ <span v-if="addressData.address.miscInfo">{{ addressData.address.miscInfo }}</span><br/>
38
+ <span v-if="addressData.address.country" class="country-name">{{ addressData.address.country }}</span>
39
+ </template>
40
+ </dd>
41
+ </template>
39
42
  <!-- end address -->
40
43
 
41
44
  <!-- begin telephone -->
@@ -84,18 +87,19 @@
84
87
  <span class="org">{{ addressData.company.value }}</span>
85
88
  </li>
86
89
  <li>
87
- <a :href="locateAddress" target="google-maps" v-if="linkGoogleMaps"
88
- :title="getMessage('cmdaddressdata.title.open_address_on_google_maps')">
89
- <span class="street-address" v-if="addressData.address.streetNo">{{ addressData.address.streetNo }}</span><br/>
90
- <span class="postal-code" v-if="addressData.address.zip">{{ addressData.address.zip }} </span>
91
- <span class="locality" v-if="addressData.address.city">{{ addressData.address.city }}</span><br/>
92
- <span class="country-name" v-if="addressData.address.country">{{ addressData.address.country }}</span>
90
+ <a v-if="linkGoogleMaps" :href="locateAddress" target="google-maps" :title="getMessage('cmdaddressdata.title.open_address_on_google_maps')">
91
+ <span v-if="addressData.address.streetNo" class="street-address">{{ addressData.address.streetNo }}</span><br/>
92
+ <span v-if="addressData.address.zip" class="postal-code">{{ addressData.address.zip }}&nbsp;</span>
93
+ <span v-if="addressData.address.city" class="locality">{{ addressData.address.city }}</span><br/>
94
+ <span v-if="addressData.address.miscInfo">{{ addressData.address.miscInfo }}</span><br/>
95
+ <span v-if="addressData.address.country" class="country-name">{{ addressData.address.country }}</span>
93
96
  </a>
94
97
  <template v-else>
95
- <span class="street-address" v-if="addressData.address.streetNo">{{ addressData.address.streetNo }}</span><br/>
96
- <span class="postal-code" v-if="addressData.address.zip">{{ addressData.address.zip }} </span>
97
- <span class="locality" v-if="addressData.address.city">{{ addressData.address.city }}</span><br/>
98
- <span class="country-name" v-if="addressData.address.country">{{ addressData.address.country }}</span>
98
+ <span v-if="addressData.address.streetNo" class="street-address">{{ addressData.address.streetNo }}</span><br/>
99
+ <span v-if="addressData.address.zip" class="postal-code">{{ addressData.address.zip }}&nbsp;</span>
100
+ <span v-if="addressData.address.city" class="locality">{{ addressData.address.city }}</span><br/>
101
+ <span v-if="addressData.address.miscInfo">{{ addressData.address.miscInfo }}</span><br/>
102
+ <span v-if="addressData.address.country" class="country-name">{{ addressData.address.country }}</span>
99
103
  </template>
100
104
  </li>
101
105
  <li v-if="addressData.telephone?.value">
@@ -189,6 +193,10 @@ export default {
189
193
  dt {
190
194
  display: flex;
191
195
  align-items: center;
196
+
197
+ &.address {
198
+ align-items: flex-start;
199
+ }
192
200
  }
193
201
  }
194
202
 
@@ -23,15 +23,11 @@
23
23
  <CmdTooltipForInputElements
24
24
  v-if="useCustomTooltip && (validationStatus === '' || validationStatus === 'error')"
25
25
  ref="tooltip"
26
- :showRequirements="showRequirements"
27
- :inputRequirements="inputRequirements"
28
26
  :validationStatus="validationStatus"
29
27
  :validationMessage="getValidationMessage"
30
28
  :validationTooltip="validationTooltip"
31
- :inputAttributes="$attrs"
32
- :inputModelValue="modelValue"
33
- :helplink="helplink"
34
29
  :relatedId="tooltipId"
30
+ :cmdListOfRequirements="listOfRequirements"
35
31
  />
36
32
  <!-- end CmdTooltipForInputElements -->
37
33
 
@@ -478,6 +474,10 @@ export default {
478
474
  margin-left: auto;
479
475
  font-size: 1rem;
480
476
  }
477
+
478
+ &:hover, &:active, &:focus {
479
+ background: var(--primary-color);
480
+ }
481
481
  }
482
482
  }
483
483
  }
@@ -605,7 +605,7 @@ export default {
605
605
  }
606
606
 
607
607
  &:hover, &:active, &:focus {
608
- background: var(--pure-white);
608
+ background: var(--color-scheme-background-color);
609
609
 
610
610
  span {
611
611
  color: var(--status-color);
@@ -22,23 +22,23 @@
22
22
  <!-- begin label-text (+ required asterisk) -->
23
23
  <span v-if="(labelText || $slots.labeltext) && $attrs.type !== 'checkbox' && $attrs.type !== 'radio'"
24
24
  :class="['label-text', !showLabel ? 'hidden' : undefined]">
25
- <span v-if="labelText">{{ labelText }}<sup v-if="$attrs.required">*</sup></span>
26
- <slot name="labeltext" />
25
+ <span>
26
+ <template v-if="labelText">{{ labelText }}</template>
27
+ <!-- begin slot 'labeltext' -->
28
+ <slot v-else name="labeltext" />
29
+ <!-- end slot 'labeltext' -->
30
+ <sup v-if="$attrs.required">*</sup>
31
+ </span>
27
32
 
28
33
  <!-- begin CmdTooltipForInputElements -->
29
34
  <CmdTooltipForInputElements
30
35
  v-if="useCustomTooltip && (validationStatus === '' || validationStatus === 'error')"
31
36
  ref="tooltip"
32
- :showRequirements="showRequirements"
33
- :inputRequirements="inputRequirements"
34
37
  :validationStatus="validationStatus"
35
38
  :validationMessage="getValidationMessage"
36
39
  :validationTooltip="validationTooltip"
37
- :inputAttributes="$attrs"
38
- :inputModelValue="modelValue"
39
- :helplink="helplink"
40
40
  :relatedId="tooltipId"
41
- :labelText="labelText"
41
+ :cmdListOfRequirements="listOfRequirements"
42
42
  />
43
43
  <!-- end CmdTooltipForInputElements -->
44
44
 
@@ -102,18 +102,26 @@
102
102
  <!-- begin checkbox and radiobutton -->
103
103
  <template v-else-if="element === 'input' && ($attrs.type === 'checkbox' || $attrs.type === 'radio')">
104
104
  <template v-if="!(onLabel && offLabel)">
105
- <input
106
- v-bind="elementAttributes"
107
- @change="onChange"
108
- @blur="onBlur"
109
- :checked="isChecked"
110
- :value="inputValue"
111
- :class="[inputClass, validationStatus, toggleSwitchIconClass, { 'replace-input-type': replaceInputType, 'toggle-switch': toggleSwitch }]"
112
- :id="labelId"
113
- :disabled="$attrs.disabled"
114
- :aria-invalid="validationStatus === 'error'"
115
- />
116
- <span v-if="labelText" :class="['label-text', { hidden: !showLabel }]"><span>{{ labelText }}<sup v-if="$attrs.required">*</sup></span></span>
105
+ <input
106
+ v-bind="elementAttributes"
107
+ @change="onChange"
108
+ @blur="onBlur"
109
+ :checked="isChecked"
110
+ :value="inputValue"
111
+ :class="[inputClass, validationStatus, toggleSwitchIconClass, { 'replace-input-type': replaceInputType, 'toggle-switch': toggleSwitch }]"
112
+ :id="labelId"
113
+ :disabled="$attrs.disabled"
114
+ :aria-invalid="validationStatus === 'error'"
115
+ />
116
+ <span v-if="labelText || $slots.labeltext" :class="['label-text', { hidden: !showLabel }]">
117
+ <span>
118
+ <template v-if="labelText">{{ labelText }}</template>
119
+ <!-- begin slot 'labeltext' -->
120
+ <slot v-else name="labeltext" />
121
+ <!-- end slot 'labeltext' -->
122
+ <sup v-if="$attrs.required">*</sup>
123
+ </span>
124
+ </span>
117
125
  </template>
118
126
 
119
127
  <!-- begin labels for toggle-switch with switch-label -->
@@ -479,7 +487,7 @@ export default {
479
487
  * icon for error-validated items in list-of-requirements
480
488
  *
481
489
  * element-property must me set to 'input'
482
- * showRequirements-property must be set to 'true'
490
+ * showRequirements-subproperty (of CmdListOfRequirements) must be set to 'true'
483
491
  *
484
492
  */
485
493
  iconHasStateError: {
@@ -496,7 +504,7 @@ export default {
496
504
  * icon for warning-validated items in list-of-requirements
497
505
  *
498
506
  * element-property must me set to 'input'
499
- * showRequirements-property must be set to 'true'
507
+ * showRequirements-subproperty (of CmdListOfRequirements) must be set to 'true'
500
508
  *
501
509
  */
502
510
  iconHasStateWarning: {
@@ -513,7 +521,7 @@ export default {
513
521
  * icon for success-validated items in list-of-requirements
514
522
  *
515
523
  * element-property must me set to 'input'
516
- * showRequirements-property must be set to 'true'
524
+ * showRequirements-subproperty (of CmdListOfRequirements) must be set to 'true'
517
525
  *
518
526
  */
519
527
  iconHasStateSuccess: {
@@ -530,7 +538,7 @@ export default {
530
538
  * icon for info-validated items in list-of-requirements
531
539
  *
532
540
  * element-property must me set to 'input'
533
- * showRequirements-property must be set to 'true'
541
+ * showRequirements-subproperty (of CmdListOfRequirements) must be set to 'true'
534
542
  *
535
543
  */
536
544
  iconHasStateInfo: {
@@ -788,7 +796,9 @@ export default {
788
796
  },
789
797
  closeTooltipOnBlur() {
790
798
  // close tooltip by calling function from CmdTooltipForInputElements using $refs
791
- this.$refs.tooltip.hideTooltip()
799
+ if(this.$refs.tooltip) {
800
+ this.$refs.tooltip.hideTooltip()
801
+ }
792
802
  }
793
803
  },
794
804
  watch: {
@@ -135,7 +135,7 @@ export default {
135
135
  type: Object,
136
136
  default() {
137
137
  return {
138
- headlineLevel: 4
138
+ headlineLevel: 6
139
139
  }
140
140
  }
141
141
  }
@@ -1,6 +1,5 @@
1
1
  <template>
2
2
  <div
3
- v-if="navigationEntries.length"
4
3
  :class="[
5
4
  'cmd-main-navigation main-navigation-wrapper',
6
5
  {
@@ -20,7 +19,7 @@
20
19
  </a>
21
20
  </li>
22
21
  <li v-for="(navigationEntry, index) in navigationEntries" :key="index"
23
- :class="{'open' : navigationEntry.open, 'has-subentries': navigationEntry.subentries}">
22
+ :class="{'active' : navigationEntry.active, 'open' : navigationEntry.open, 'has-subentries': navigationEntry?.subentries?.length}">
24
23
  <!-- begin type === href -->
25
24
  <a
26
25
  v-if="navigationEntry.type === 'href'"
@@ -31,7 +30,7 @@
31
30
  >
32
31
  <span v-if="navigationEntry.iconClass" :class="navigationEntry.iconClass"></span>
33
32
  <span v-if="navigationEntry.text">{{ navigationEntry.text }}</span>
34
- <span v-if="navigationEntry.subentries && navigationEntry.subentries.length > 0"
33
+ <span v-if="navigationEntry?.subentries?.length"
35
34
  :class="subentriesIconClass"
36
35
  ></span>
37
36
  </a>
@@ -53,7 +52,7 @@
53
52
  <!-- end type === router -->
54
53
 
55
54
  <!-- begin sub-level 1 -->
56
- <ul v-if="navigationEntry.subentries" aria-expanded="true">
55
+ <ul v-if="navigationEntry?.subentries?.length" aria-expanded="true">
57
56
  <li v-for="(navigationSubEntry, subindex) in navigationEntry.subentries" :key="subindex"
58
57
  :class="{'open' : navigationSubEntry.open}">
59
58
  <!-- begin type === href -->
@@ -227,14 +226,16 @@ export default {
227
226
  methods: {
228
227
  executeLink(event, navigationEntry) {
229
228
  if (navigationEntry.target || (navigationEntry.path.length > 1)) {
229
+ this.showOffcanvas = false
230
230
  return true
231
231
  }
232
232
  if (navigationEntry.path === '#' || navigationEntry.path === '') {
233
233
  event.preventDefault()
234
+ this.showOffcanvas = false
234
235
  this.$emit('click', navigationEntry.path)
235
236
 
236
237
  }
237
- if (!(navigationEntry.subentries && navigationEntry.subentries.length > 0)) {
238
+ if (!(navigationEntry?.subentries?.length)) {
238
239
  this.showOffcanvas = false
239
240
  } else {
240
241
  // add entry "open" to navigationEntry-object (will be watched by vue3 automatically)
@@ -439,7 +440,7 @@ export default {
439
440
  > a {
440
441
  span {
441
442
  + span[class*="icon"]::before {
442
- transform: rotate(90deg);
443
+
443
444
  }
444
445
  }
445
446
  }
@@ -448,7 +449,7 @@ export default {
448
449
  > a {
449
450
  span {
450
451
  + span[class*="icon"]::before {
451
- transform: rotate(-90deg);
452
+
452
453
  }
453
454
  }
454
455
  }
@@ -6,21 +6,21 @@
6
6
 
7
7
  <!-- begin opening-status with link to detail-page -->
8
8
  <template v-if="link && link?.path && link?.show">
9
- <a v-if="link.type === 'href'" :href="link.path" :class="{closed: closed}">{{ textOpenClosed }}</a>
10
- <router-link v-if="link.type === 'router'" :to="link.path" :class="{closed: closed}">{{ textOpenClosed }}</router-link>
11
- <button v-if="link.type === 'button'" :class="['button', {closed: closed}]">{{ textOpenClosed }}</button>
9
+ <a v-if="link.type === 'href'" :href="link.path" :class="{closed: isClosed}">{{ textOpenClosed }}</a>
10
+ <router-link v-if="link.type === 'router'" :to="link.path" :class="{closed: isClosed}">{{ textOpenClosed }}</router-link>
11
+ <button v-if="link.type === 'button'" :class="['button', {closed: isClosed}]">{{ textOpenClosed }}</button>
12
12
  </template>
13
13
  <!-- end opening-status with link to detail-page -->
14
14
 
15
15
  <!-- begin opening-status (without link) -->
16
- <span v-else :class="{'closed': closed}">{{ textOpenClosed }}</span>
16
+ <span v-else :class="{'closed': isClosed}">{{ textOpenClosed }}</span>
17
17
  <!-- end opening-status (without link) -->
18
18
 
19
19
  <!-- begin opening-days and -hours -->
20
20
  <dl>
21
- <template v-for="day in openingHours" :key="day.day">
21
+ <template v-for="day in openingHoursFormatted" :key="day.day">
22
22
  <dt>{{ day.day }}:</dt>
23
- <dd>{{ day.fromTime }}&ndash;{{ day.tillTime }}</dd>
23
+ <dd>{{ getTime(day.fromTime)}}&ndash;{{ getTime(day.tillTime)}}</dd>
24
24
  </template>
25
25
  </dl>
26
26
  <!-- end opening-days and -hours -->
@@ -40,6 +40,36 @@
40
40
  // import components
41
41
  import CmdHeadline from "./CmdHeadline"
42
42
 
43
+ export function localizedTime(language) {
44
+ return (hour, minute) => {
45
+ const now = new Date()
46
+ now.setHours(hour, minute, 0, 0)
47
+ return new Intl.DateTimeFormat(language, {timeStyle: "short"}).format(now)
48
+ }
49
+ }
50
+
51
+ export function timeFormatting(separator, suffix1, suffix2, hoursLeadingZero = true) {
52
+ function addLeadingZero(time, addLeadingZero) {
53
+ if(addLeadingZero && time < 10) {
54
+ return "0" + time
55
+ }
56
+ return time
57
+ }
58
+
59
+ return (hour, minute) => {
60
+ if(suffix2) {
61
+ let hour12 = hour
62
+ let currentSuffix = suffix1
63
+ if(hour12 > 12) {
64
+ hour12 -= 12
65
+ currentSuffix = suffix2
66
+ }
67
+ return addLeadingZero(hour12, hoursLeadingZero) + separator + addLeadingZero(minute, true) + currentSuffix
68
+ }
69
+ return addLeadingZero(hour, hoursLeadingZero) + separator + addLeadingZero(minute, true) + suffix1
70
+ }
71
+ }
72
+
43
73
  export default {
44
74
  name: "CmdOpeningHours",
45
75
  components: {
@@ -63,11 +93,18 @@ export default {
63
93
  default: false
64
94
  },
65
95
  /**
66
- * text for open/closed-information
96
+ * text for 'open'-information
67
97
  */
68
- textOpenClosed: {
98
+ textOpen: {
69
99
  type: String,
70
- required: true
100
+ default: "Open right now!"
101
+ },
102
+ /**
103
+ * text for 'closed'-information
104
+ */
105
+ textClosed: {
106
+ type: String,
107
+ default: "Closed right now!"
71
108
  },
72
109
  /**
73
110
  * list of opening-hours
@@ -96,6 +133,77 @@ export default {
96
133
  cmdHeadline: {
97
134
  type: Object,
98
135
  required: false
136
+ },
137
+ timeFormatter: {
138
+ type: Function,
139
+ required: false
140
+ },
141
+ componentHandlesClosedStatus: {
142
+ type: Boolean,
143
+ default: true
144
+ }
145
+ },
146
+ computed: {
147
+ textOpenClosed() {
148
+ return this.isClosed ? this.textClosed : this.textOpen
149
+ },
150
+ openingHoursFormatted() {
151
+ const weekdays = []
152
+ for(let i = 0; i < this.openingHours.length; i++) {
153
+ const openingHours = {}
154
+ const splitFromTime = this.openingHours[i].fromTime.split(/[:.]/)
155
+ const splitTillTime = this.openingHours[i].tillTime.split(/[:.]/)
156
+
157
+ openingHours.day = this.openingHours[i].day
158
+ openingHours.fromTime = {
159
+ hours: parseInt(splitFromTime[0]),
160
+ mins: parseInt(splitFromTime[1])
161
+ }
162
+ openingHours.tillTime = {
163
+ hours: parseInt(splitTillTime[0]),
164
+ mins: parseInt(splitTillTime[1])
165
+ }
166
+ weekdays.push(openingHours)
167
+ }
168
+ return weekdays
169
+ },
170
+ isClosed() {
171
+ if(!this.componentHandlesClosedStatus) {
172
+ return this.closed
173
+ }
174
+
175
+ const currentDate = new Date()
176
+ let currentDay = currentDate.getDay()
177
+
178
+ // fix order and check if currentDay equals 0 === sunday. Data are expected to start with monday
179
+ if (currentDay === 0){
180
+ currentDay = 6
181
+ } else {
182
+ currentDay -= 1
183
+ }
184
+
185
+ const openingHours = this.openingHoursFormatted[currentDay]
186
+
187
+ if(this.openingHoursFormatted[currentDay]) {
188
+ const openingHoursFrom = new Date()
189
+ openingHoursFrom.setHours(openingHours.fromTime.hours, openingHours.fromTime.mins)
190
+
191
+ const openingHoursTill = new Date()
192
+ openingHoursTill.setHours(openingHours.tillTime.hours, openingHours.tillTime.mins)
193
+
194
+ if (openingHoursFrom <= currentDate && currentDate <= openingHoursTill) {
195
+ return false
196
+ }
197
+ }
198
+ return true
199
+ }
200
+ },
201
+ methods: {
202
+ getTime(time) {
203
+ if(this.timeFormatter) {
204
+ return this.timeFormatter(time.hours, time.mins)
205
+ }
206
+ return timeFormatting(":", " hrs", "", false)(time.hours, time.mins)
99
207
  }
100
208
  }
101
209
  }