comand-component-library 3.1.45 → 3.1.48

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 (233) hide show
  1. package/dist/comand-component-library.css +1 -1
  2. package/dist/comand-component-library.umd.min.js +1 -1
  3. package/package.json +47 -41
  4. package/src/App.vue +373 -135
  5. package/src/ComponentDocumentation.vue +156 -0
  6. package/src/ComponentLibraryHelp.vue +20 -0
  7. package/src/assets/data/accordion.json +21 -24
  8. package/src/assets/data/address-data.json +34 -0
  9. package/src/assets/data/bank-account-data.json +22 -0
  10. package/src/assets/data/box-product.json +14 -4
  11. package/src/assets/data/box-user.json +48 -22
  12. package/src/assets/data/breadcrumbs.json +11 -3
  13. package/src/assets/data/cookie-disclaimer.json +4 -4
  14. package/src/assets/data/fake-select-colors.json +4 -0
  15. package/src/assets/data/fake-select-filter-options.json +14 -0
  16. package/src/assets/data/fake-select-options-with-icons.json +6 -12
  17. package/src/assets/data/fake-select-options.json +3 -3
  18. package/src/assets/data/list-of-links-section-anchors.json +23 -0
  19. package/src/assets/data/list-of-links-top-header-navigation.json +20 -0
  20. package/src/assets/data/list-of-links.json +42 -0
  21. package/src/assets/data/main-navigation.json +48 -0
  22. package/src/assets/data/multistep-form-progress-bar.json +33 -0
  23. package/src/assets/data/select-options.json +4 -0
  24. package/src/assets/data/{share-buttons.json → share-buttons-page-by-json.json} +8 -8
  25. package/src/assets/data/share-buttons-page-by-property.json +30 -0
  26. package/src/assets/data/switch-language.json +20 -0
  27. package/src/assets/data/table-large.json +1 -1
  28. package/src/assets/data/table-small.json +1 -1
  29. package/src/assets/styles/global-styles.scss +43 -13
  30. package/src/assets/styles/transitions.scss +21 -1
  31. package/src/components/CmdAccordion.vue +43 -42
  32. package/src/components/CmdAddressData.vue +124 -56
  33. package/src/components/CmdBackToTopButton.vue +3 -3
  34. package/src/components/CmdBankAccountData.vue +104 -0
  35. package/src/components/CmdBox.vue +253 -56
  36. package/src/components/CmdBoxSiteSearch.vue +138 -39
  37. package/src/components/CmdBoxWrapper.vue +206 -0
  38. package/src/components/CmdBreadcrumbs.vue +29 -13
  39. package/src/components/CmdCompanyLogo.vue +6 -4
  40. package/src/components/CmdCookieDisclaimer.vue +99 -75
  41. package/src/components/CmdCopyrightInformation.vue +1 -1
  42. package/src/components/CmdCustomHeadline.vue +93 -0
  43. package/src/components/CmdFakeSelect.vue +285 -60
  44. package/src/components/CmdFancyBox.vue +47 -33
  45. package/src/components/CmdForm.vue +107 -0
  46. package/src/components/CmdFormElement.vue +515 -81
  47. package/src/components/CmdFormFilters.vue +25 -11
  48. package/src/components/CmdGoogleMaps.vue +9 -3
  49. package/src/components/CmdImageGallery.vue +28 -5
  50. package/src/components/CmdImageZoom.vue +9 -1
  51. package/src/components/CmdListOfLinks.vue +169 -0
  52. package/src/components/CmdLoginForm.vue +143 -63
  53. package/src/components/CmdMainNavigation.vue +140 -42
  54. package/src/components/CmdMultipleSwitch.vue +33 -2
  55. package/src/components/CmdMultistepFormProgressBar.vue +60 -10
  56. package/src/components/CmdOpeningHours.vue +36 -10
  57. package/src/components/CmdPager.vue +7 -5
  58. package/src/components/CmdProgressBar.vue +20 -3
  59. package/src/components/CmdShareButtons.vue +64 -9
  60. package/src/components/CmdSiteHeader.vue +27 -14
  61. package/src/components/CmdSlideButton.vue +5 -2
  62. package/src/components/CmdSlideshow.vue +23 -7
  63. package/src/components/CmdSwitchButton.vue +10 -3
  64. package/src/components/CmdSwitchLanguage.vue +18 -10
  65. package/src/components/CmdSystemMessage.vue +30 -17
  66. package/src/components/CmdTable.vue +15 -7
  67. package/src/components/CmdTabs.vue +43 -3
  68. package/src/components/CmdThumbnailScroller.vue +22 -6
  69. package/src/components/CmdTooltip.vue +184 -11
  70. package/src/components/CmdUploadForm.vue +198 -92
  71. package/src/components/CmdWidthLimitationWrapper.vue +9 -6
  72. package/src/composables/event.js +8 -0
  73. package/src/composables/scrollspy.js +52 -0
  74. package/src/directives/focus.js +19 -0
  75. package/src/directives/telephone.js +1 -1
  76. package/src/documentation/commonProps.js +6 -0
  77. package/src/documentation/components/ComponentCode.vue +50 -0
  78. package/src/documentation/components/ComponentProperties.vue +237 -0
  79. package/src/documentation/components/ExampleSectionWrapper.vue +46 -0
  80. package/src/documentation/components/ViewCodeData.vue +113 -0
  81. package/src/documentation/data/CmdAccordionHelp.js +22 -0
  82. package/src/documentation/data/CmdAddressDataHelp.js +17 -0
  83. package/src/documentation/data/CmdBackToTopButtonHelp.js +3 -0
  84. package/src/documentation/data/CmdBankAccountDataHelp.js +8 -0
  85. package/src/documentation/data/CmdBoxHelp.js +45 -0
  86. package/src/documentation/data/CmdBoxSiteSearchHelp.js +11 -0
  87. package/src/documentation/data/CmdBreadcrumbsHelp.js +6 -0
  88. package/src/documentation/data/CmdCompanyLogoHelp.js +8 -0
  89. package/src/documentation/data/CmdCookieDisclaimerHelp.js +9 -0
  90. package/src/documentation/data/CmdCopyrightInformation.js +2 -0
  91. package/src/documentation/data/CmdCustomHeadlineHelp.js +8 -0
  92. package/src/documentation/data/CmdFakeSelectHelp.js +60 -0
  93. package/src/documentation/data/CmdFancyBoxHelp.js +7 -0
  94. package/src/documentation/data/CmdFooterNavigationHelp.js +5 -0
  95. package/src/documentation/data/CmdFormElementHelp.js +189 -0
  96. package/src/documentation/data/CmdFormFiltersHelp.js +6 -0
  97. package/src/documentation/data/CmdFormHelp.js +10 -0
  98. package/src/documentation/data/CmdGoogleMapsHelp.js +5 -0
  99. package/src/documentation/data/CmdImageGalleryHelp.js +5 -0
  100. package/src/documentation/data/CmdImageZoomHelp.js +6 -0
  101. package/src/documentation/data/CmdListOfLinksHelp.js +24 -0
  102. package/src/documentation/data/CmdLoginFormHelp.js +6 -0
  103. package/src/documentation/data/CmdMainNavigationHelp.js +7 -0
  104. package/src/documentation/data/CmdMultistepFormProgressBarHelp.js +6 -0
  105. package/src/documentation/data/CmdOpeningHoursHelp.js +10 -0
  106. package/src/documentation/data/CmdPagerHelp.js +7 -0
  107. package/src/documentation/data/CmdProgressBarHelp.js +13 -0
  108. package/src/documentation/data/CmdShareButtonsHelp.js +13 -0
  109. package/src/documentation/data/CmdSiteHeaderHelp.js +21 -0
  110. package/src/documentation/data/CmdSlideButtonHelp.js +10 -0
  111. package/src/documentation/data/CmdSlideshowHelp.js +7 -0
  112. package/src/documentation/data/CmdSwitchLanguageHelp.js +6 -0
  113. package/src/documentation/data/CmdSystemMessageHelp.js +32 -0
  114. package/src/documentation/data/CmdTableHelp.js +14 -0
  115. package/src/documentation/data/CmdTabsHelp.js +10 -0
  116. package/src/documentation/data/CmdThumbnailScrollerHelp.js +5 -0
  117. package/src/documentation/data/CmdTooltipHelp.js +13 -0
  118. package/src/documentation/data/CmdUploadFormHelp.js +17 -0
  119. package/src/documentation/data/CmdWidthLimitationWrapperHelp.js +7 -0
  120. package/src/documentation/data/componentsDescription.json +158 -0
  121. package/src/documentation/generated/CmdAccordionPropertyDescriptions.json +57 -0
  122. package/src/documentation/generated/CmdAddressDataPropertyDescriptions.json +32 -0
  123. package/src/documentation/generated/CmdBackToTopButtonPropertyDescriptions.json +12 -0
  124. package/src/documentation/generated/CmdBankAccountDataPropertyDescriptions.json +34 -0
  125. package/src/documentation/generated/CmdBoxPropertyDescriptions.json +91 -0
  126. package/src/documentation/generated/CmdBoxSiteSearchPropertyDescriptions.json +41 -0
  127. package/src/documentation/generated/CmdBoxWrapperPropertyDescriptions.json +47 -0
  128. package/src/documentation/generated/CmdBreadcrumbsPropertyDescriptions.json +17 -0
  129. package/src/documentation/generated/CmdCompanyLogoPropertyDescriptions.json +27 -0
  130. package/src/documentation/generated/CmdCookieDisclaimerPropertyDescriptions.json +22 -0
  131. package/src/documentation/generated/CmdCustomHeadlinePropertyDescriptions.json +22 -0
  132. package/src/documentation/generated/CmdFakeSelectPropertyDescriptions.json +79 -0
  133. package/src/documentation/generated/CmdFancyBoxPropertyDescriptions.json +62 -0
  134. package/src/documentation/generated/CmdFooterNavigationPropertyDescriptions.json +17 -0
  135. package/src/documentation/generated/CmdFormElementPropertyDescriptions.json +178 -0
  136. package/src/documentation/generated/CmdFormFiltersPropertyDescriptions.json +32 -0
  137. package/src/documentation/generated/CmdFormPropertyDescriptions.json +40 -0
  138. package/src/documentation/generated/CmdGoogleMapsPropertyDescriptions.json +7 -0
  139. package/src/documentation/generated/CmdImageGalleryPropertyDescriptions.json +22 -0
  140. package/src/documentation/generated/CmdImageZoomPropertyDescriptions.json +12 -0
  141. package/src/documentation/generated/CmdListOfLinksPropertyDescriptions.json +60 -0
  142. package/src/documentation/generated/CmdLoginFormPropertyDescriptions.json +90 -0
  143. package/src/documentation/generated/CmdMainNavigationPropertyDescriptions.json +62 -0
  144. package/src/documentation/generated/CmdMultipleSwitchPropertyDescriptions.json +52 -0
  145. package/src/documentation/generated/CmdMultistepFormProgressBarPropertyDescriptions.json +17 -0
  146. package/src/documentation/generated/CmdOpeningHoursPropertyDescriptions.json +42 -0
  147. package/src/documentation/generated/CmdPagerPropertyDescriptions.json +37 -0
  148. package/src/documentation/generated/CmdProgressBarPropertyDescriptions.json +32 -0
  149. package/src/documentation/generated/CmdShareButtonsPropertyDescriptions.json +34 -0
  150. package/src/documentation/generated/CmdSiteHeaderPropertyDescriptions.json +27 -0
  151. package/src/documentation/generated/CmdSlideButtonPropertyDescriptions.json +25 -0
  152. package/src/documentation/generated/CmdSlideshowPropertyDescriptions.json +42 -0
  153. package/src/documentation/generated/CmdSwitchButtonPropertyDescriptions.json +79 -0
  154. package/src/documentation/generated/CmdSwitchLanguagePropertyDescriptions.json +7 -0
  155. package/src/documentation/generated/CmdSystemMessagePropertyDescriptions.json +40 -0
  156. package/src/documentation/generated/CmdTablePropertyDescriptions.json +62 -0
  157. package/src/documentation/generated/CmdTabsPropertyDescriptions.json +27 -0
  158. package/src/documentation/generated/CmdThumbnailScrollerPropertyDescriptions.json +32 -0
  159. package/src/documentation/generated/CmdTooltipPropertyDescriptions.json +17 -0
  160. package/src/documentation/generated/CmdUploadFormPropertyDescriptions.json +90 -0
  161. package/src/documentation/generated/CmdWidthLimitationWrapperPropertyDescriptions.json +41 -0
  162. package/src/documentation/generated/frameworkIcons.json +730 -0
  163. package/src/documentation/generated/logosIcons.json +110 -0
  164. package/src/documentation/tabs.js +46 -0
  165. package/src/documentation/views/ContainerPage.vue +237 -0
  166. package/src/documentation/views/HelpHome.vue +13 -0
  167. package/src/documentation/views/IconFont.vue +80 -0
  168. package/src/documentation/views/components/CmdAccordionHelp.vue +78 -0
  169. package/src/documentation/views/components/CmdAddressDataHelp.vue +65 -0
  170. package/src/documentation/views/components/CmdBackToTopButtonHelp.vue +62 -0
  171. package/src/documentation/views/components/CmdBankAccountDataHelp.vue +88 -0
  172. package/src/documentation/views/components/CmdBoxHelp.vue +137 -0
  173. package/src/documentation/views/components/CmdBoxSiteSearchHelp.vue +60 -0
  174. package/src/documentation/views/components/CmdBoxWrapperHelp.vue +111 -0
  175. package/src/documentation/views/components/CmdBreadcrumbsHelp.vue +51 -0
  176. package/src/documentation/views/components/CmdCompanyLogoHelp.vue +48 -0
  177. package/src/documentation/views/components/CmdCookieDisclaimerHelp.vue +105 -0
  178. package/src/documentation/views/components/CmdCustomHeadlineHelp.vue +53 -0
  179. package/src/documentation/views/components/CmdFakeSelectHelp.vue +175 -0
  180. package/src/documentation/views/components/CmdFancyBoxHelp.vue +79 -0
  181. package/src/documentation/views/components/CmdFormElementHelp.vue +412 -0
  182. package/src/documentation/views/components/CmdFormFiltersHelp.vue +69 -0
  183. package/src/documentation/views/components/CmdFormHelp.vue +41 -0
  184. package/src/documentation/views/components/CmdGoogleMapsHelp.vue +55 -0
  185. package/src/documentation/views/components/CmdImageGalleryHelp.vue +46 -0
  186. package/src/documentation/views/components/CmdImageZoomHelp.vue +34 -0
  187. package/src/documentation/views/components/CmdListOfLinksHelp.vue +64 -0
  188. package/src/documentation/views/components/CmdLoginFormHelp.vue +117 -0
  189. package/src/documentation/views/components/CmdMainNavigationHelp.vue +94 -0
  190. package/src/documentation/views/components/CmdMultistepFormProgressBarHelp.vue +49 -0
  191. package/src/documentation/views/components/CmdOpeningHoursHelp.vue +49 -0
  192. package/src/documentation/views/components/CmdPagerHelp.vue +57 -0
  193. package/src/documentation/views/components/CmdProgressBarHelp.vue +47 -0
  194. package/src/documentation/views/components/CmdShareButtonsHelp.vue +65 -0
  195. package/src/documentation/views/components/CmdSiteHeaderHelp.vue +72 -0
  196. package/src/documentation/views/components/CmdSlideButtonHelp.vue +90 -0
  197. package/src/documentation/views/components/CmdSlideshowHelp.vue +60 -0
  198. package/src/documentation/views/components/CmdSwitchLanguageHelp.vue +64 -0
  199. package/src/documentation/views/components/CmdSystemMessageHelp.vue +86 -0
  200. package/src/documentation/views/components/CmdTableHelp.vue +84 -0
  201. package/src/documentation/views/components/CmdTabsHelp.vue +52 -0
  202. package/src/documentation/views/components/CmdThumbnailScrollerHelp.vue +50 -0
  203. package/src/documentation/views/components/CmdTooltipHelp.vue +59 -0
  204. package/src/documentation/views/components/CmdUploadFormHelp.vue +59 -0
  205. package/src/documentation/views/components/CmdWidthLimitationWrapperHelp.vue +46 -0
  206. package/src/index.js +7 -3
  207. package/src/main.js +25 -15
  208. package/src/mixins/CmdAddressData/DefaultMessageProperties.js +17 -0
  209. package/src/mixins/CmdBox/DefaultMessageProperties.js +10 -0
  210. package/src/mixins/CmdFakeSelect/DefaultMessageProperties.js +9 -0
  211. package/src/mixins/CmdFormElement/DefaultMessageProperties.js +9 -0
  212. package/src/mixins/CmdImageGallery/DefaultMessageProperties.js +9 -0
  213. package/src/mixins/CmdSiteSearch/DefaultMessageProperties.js +14 -0
  214. package/src/mixins/CmdUploadForm/DefaultMessageProperties.js +5 -1
  215. package/src/mixins/FieldValidation.js +220 -0
  216. package/src/mixins/GlobalDefaultMessageProperties.js +15 -0
  217. package/src/mixins/Tooltip.js +26 -0
  218. package/src/router/index.js +67 -0
  219. package/src/utilities.js +3 -6
  220. package/src/utils/common.js +6 -0
  221. package/src/utils/dom.js +8 -0
  222. package/src/utils/globalSequence.js +13 -0
  223. package/src/utils/string.js +8 -0
  224. package/src/assets/data/address.json +0 -13
  225. package/src/assets/data/footer-navigation.json +0 -38
  226. package/src/assets/data/languages.json +0 -31
  227. package/src/assets/data/multisteps.json +0 -27
  228. package/src/assets/data/navigation.json +0 -47
  229. package/src/assets/data/pager.json +0 -11
  230. package/src/assets/data/top-header-navigation.json +0 -27
  231. package/src/components/CmdFooterNavigation.vue +0 -71
  232. package/src/components/CmdMainHeadline.vue +0 -75
  233. package/src/components/CmdTopHeaderNavigation.vue +0 -88
@@ -1,122 +1,254 @@
1
1
  <template>
2
- <div :class="[status, 'cmd-fake-select label', {color: type === 'color'}]">
3
- <span>{{ labelText }}</span>
2
+ <div
3
+ :class="[
4
+ validationStatus,
5
+ 'cmd-fake-select label',
6
+ {
7
+ color: type === 'color',
8
+ 'has-state': validationStatus && validationStatus !== 'none'
9
+ }
10
+ ]"
11
+ :aria-labelledby="labelText"
12
+ :aria-required="$attrs.required !== undefined"
13
+ ref="fakeselect"
14
+ >
15
+ <span>
16
+ <!-- begin label -->
17
+ <span>
18
+ {{ labelText }}<sup v-if="$attrs.required !== undefined">*</sup>
19
+ </span>
20
+ <!-- end label -->
21
+ <a v-if="$attrs.required || inputRequirements.length"
22
+ href="#"
23
+ @click.prevent
24
+ :class="getStatusIconClass"
25
+ :title="!useCustomTooltip ? getValidationMessage : ''"
26
+ :aria-errormessage="getValidationMessage"
27
+ aria-live="assertive"
28
+ :id="tooltipId"
29
+ :role="validationStatus === 'error' ? 'alert' : 'dialog'">
30
+ </a>
31
+ </span>
4
32
  <ul :class="{'open': showOptions}" @clickout="closeOptions">
5
33
  <li>
6
34
  <!-- begin default/selected-option -->
7
- <a href="#" @click.prevent="toggleOptions">
35
+ <a href="#" @click.prevent="toggleOptions" @blur="onBlur">
8
36
  <img v-if="type === 'country' && optionCountry" :src="pathFlag(optionCountry)" :alt="optionCountry" :class="['flag', optionCountry]"/>
9
37
  <span v-else-if="type === 'color'" :style="'background: ' + optionColor"></span>
10
38
  <span v-if="optionIcon" :class="optionIcon"></span>
11
- <span>{{ optionName }}</span>
12
- <span :class="dropdownIconClass" title="Toggle dropdown visibility"></span>
39
+ <span class="option-name" :style="limitWidthStyle">{{ optionName }}</span>
40
+ <span v-if="dropdownIcon" :class="dropdownIcon.iconClass" :title="dropdownIcon.tooltip"></span>
13
41
  </a>
14
42
  <!-- end default/selected-option-->
15
43
 
16
44
  <!-- begin default dropdown (incl. optional icon) -->
17
- <ul v-if="type === 'default' && showOptions">
18
- <li v-for="(option, index) in selectData" :key="index">
19
- <a href="#" @click.prevent="selectOption(option.value)" :class="{'active' : option.value === value}">
20
- <span v-if="option.icon?.iconClass" :class="option.icon.iconClass"></span>
45
+ <ul v-if="type === 'default' && showOptions" :aria-expanded="showOptions">
46
+ <li v-for="(option, index) in selectData" :key="index" role="option">
47
+ <!-- begin type 'href' -->
48
+ <a v-if="optionLinkType === 'href'" href="#" @click.prevent="selectOption(option.value)" :class="{'active' : option.value === modelValue}">
49
+ <span v-if="option.iconClass" :class="option.iconClass"></span>
21
50
  <span>{{ option.text }}</span>
22
51
  </a>
52
+ <!-- end type 'href' -->
53
+
54
+ <!-- begin type 'router' -->
55
+ <router-link v-if="optionLinkType === 'router'" to="#" @click.prevent="selectOption(option.value)" :class="{'active' : option.value === modelValue}">
56
+ <span v-if="option.iconClass" :class="option.iconClass"></span>
57
+ <span>{{ option.text }}</span>
58
+ </router-link>
59
+ <!-- end type 'router' -->
23
60
  </li>
24
61
  </ul>
25
62
  <!-- end default dropdown (incl. optional icon) -->
26
63
 
27
64
  <!-- begin dropdown with checkboxes -->
28
- <ul v-else-if="type !== 'default' && type !== 'content' && showOptions" :class="{'checkbox-options': type === 'checkboxOptions'}">
65
+ <ul v-else-if="type !== 'default' && type !== 'content' && showOptions" :class="{'checkbox-options': type === 'checkboxOptions'}" :aria-expanded="showOptions">
29
66
  <li v-for="(option, index) in selectData" :key="index">
30
- <label v-if="type === 'checkboxOptions'" :for="'option-' + (index + 1)" :class="{'active' : value.includes(`${option.value}`)}">
67
+ <label v-if="type === 'checkboxOptions'" :for="'option-' + (index + 1)" :class="{'active' : modelValue.includes(`${option.value}`)}">
31
68
  <input type="checkbox" :value="option.value" @change="optionSelect"
32
- :checked="value.includes(`${option.value}`)" :id="'option-' + (index + 1)"/>
69
+ :checked="modelValue.includes(`${option.value}`)" :id="'option-' + (index + 1)"/>
33
70
  <span>{{ option.text }}</span>
34
71
  </label>
35
72
 
36
73
  <a v-else-if="type === 'country'" href="#"
37
- @click.prevent="selectOption(option.value)" :class="{'active' : option.value === value}">
74
+ @click.prevent="selectOption(option.value)" :class="{'active' : option.value === modelValue}">
38
75
  <img class="flag" :src="pathFlag(option.value)"
39
76
  :alt="option.text"/>
40
77
  <span>{{ option.text }}</span>
41
78
  </a>
42
79
 
43
- <a v-else href="#" @click.prevent="selectOption(option.value)" :class="{'active' : option.value === value}">
80
+ <a v-else-if="type === 'color'" href="#" @click.prevent="selectOption(option.value)" :class="{'active' : option.value === modelValue}">
44
81
  <span class="color" :style="'background: ' + option.value"></span>
45
- <span>{{
46
- option.text
47
- }}</span>
82
+ <span>{{ option.text }}</span>
83
+ </a>
84
+ </li>
85
+ <li v-if="showSelectAllOptions && type === 'checkboxOptions'" class="select-all-options">
86
+ <a href="#" @click.prevent="toggleAllOptions">
87
+ <span :class="selectAllOptionsIcon"></span>
88
+ <span>{{ selectAllOptionsText }}</span>
48
89
  </a>
49
90
  </li>
50
91
  </ul>
51
92
  <!-- end dropdown with checkboxes -->
52
93
 
53
94
  <!-- begin dropdown with slot -->
54
- <template v-else-if="type === 'content' && showOptions">
95
+ <template v-else-if="type === 'content' && showOptions" :aria-expanded="showOptions">
55
96
  <slot></slot>
56
97
  </template>
57
98
  <!-- end dropdown with slot -->
58
99
  </li>
59
100
  </ul>
60
101
  </div>
102
+ <!-- begin CmdTooltip -->
103
+ <CmdTooltip v-if="useCustomTooltip" class="box" :class="validationStatus" :relatedId="tooltipId" :toggle-visibility-by-click="true">
104
+ <!-- begin CmdSystemMessage -->
105
+ <CmdSystemMessage
106
+ v-if="getValidationMessage"
107
+ :message="getValidationMessage"
108
+ :validatioStatus="validationStatus"
109
+ :iconClose="{show: false}"
110
+ />
111
+ <!-- end CmdSystemMessage -->
112
+
113
+ <template v-if="showRequirements && (validationStatus === '' || validationStatus === 'error')">
114
+ <!-- begin list of requirements -->
115
+ <h6>{{ getMessage("cmdfakeselect.headline.requirements_for_input") }}<br />"{{labelText}}"</h6>
116
+ <dl class="list-of-requirements">
117
+ <template v-for="(requirement, index) in inputRequirements" :key="index">
118
+ <dt aria-live="assertive" :class="requirement.valid(modelValue, $attrs) ? 'success' : 'error'">{{requirement.message}}:</dt>
119
+ <dd :class="requirement.valid(modelValue, $attrs) ? 'success' : 'error'">
120
+ <span aria-live="assertive" :class="requirement.valid(modelValue, $attrs) ? 'icon-check-circle' : 'icon-error-circle'" :title="requirement.valid(modelValue, $attrs) ? 'success' : 'error'"></span>
121
+ </dd>
122
+ </template>
123
+ </dl>
124
+ <!-- end list of requirements -->
125
+
126
+ <!-- begin helplink -->
127
+ <template v-if="helplink">
128
+ <hr v-if="helplink.show" />
129
+ <a v-if="helplink.show && helplink.url"
130
+ :href="helplink.url"
131
+ :target="helplink.target"
132
+ @click.prevent>
133
+ <span v-if="helplink.icon?.iconClass"
134
+ :class="helplink.icon?.iconClass"
135
+ :title="helplink.icon?.tooltip">
136
+ </span>
137
+ <span v-if="helplink.text">
138
+ {{ helplink.text }}
139
+ </span>
140
+ </a>
141
+ </template>
142
+ <!-- end helplink -->
143
+ </template>
144
+ </CmdTooltip>
145
+ <!-- end CmdTooltip -->
61
146
  </template>
62
147
 
63
148
  <script>
149
+ // import mixins
150
+ import I18n from "../mixins/I18n"
151
+ import DefaultMessageProperties from "../mixins/CmdBox/DefaultMessageProperties"
152
+ import FieldValidation from "../mixins/FieldValidation.js"
153
+ import Tooltip from "../mixins/Tooltip.js"
154
+
155
+ // import components
156
+ import CmdSystemMessage from "./CmdSystemMessage"
157
+ import CmdTooltip from "./CmdTooltip"
158
+
64
159
  export default {
65
160
  name: 'CmdFakeSelect',
161
+ inheritAttrs: false,
162
+ mixins: [
163
+ I18n,
164
+ DefaultMessageProperties,
165
+ FieldValidation,
166
+ Tooltip
167
+ ],
168
+ components: {
169
+ CmdSystemMessage,
170
+ CmdTooltip
171
+ },
66
172
  data() {
67
173
  return {
68
- showOptions: false
174
+ showOptions: false,
175
+ validationStatus: "",
176
+ limitWidthStyle: {}
69
177
  }
70
178
  },
71
179
  props: {
72
180
  /**
73
181
  * set different default selectbox-types for
74
182
  *
75
- * values: "(none), color, country, filterlist"
183
+ * @allowedValues: default, color, country, checkboxOptions
76
184
  */
77
185
  type: {
78
186
  type: String,
79
187
  default: "default"
80
188
  },
81
189
  /**
82
- * set default value
190
+ * set type of option-links
191
+ *
192
+ * @allowedValues: href, router
83
193
  */
84
- value: {
85
- type: [String, Array],
86
- required: false
194
+ optionLinkType: {
195
+ type: String,
196
+ default: "href"
87
197
  },
88
198
  /**
89
- * set default option name
199
+ * set default v-model (must be named modelValue in Vue3)
90
200
  */
91
- defaultOptionName: {
92
- type: String,
93
- required: false
201
+ modelValue: {
202
+ type: [String, Array],
203
+ default: ""
94
204
  },
95
205
  /**
96
206
  * list of options to select (incl. displayed names and values)
207
+ *
208
+ * type-property must be set to "checkboxOptions"
97
209
  */
98
210
  selectData: {
99
211
  type: Array,
100
212
  required: false
101
213
  },
214
+ /**
215
+ * toggles option to (de)select all options in a checkbox-list
216
+ *
217
+ * type-property must be set to "checkboxOptions"
218
+ */
219
+ showSelectAllOptions: {
220
+ type: Boolean,
221
+ default: true
222
+ },
102
223
  /**
103
224
  * status (i.e. for validation)
104
225
  *
105
- * values: "error, success, disabled"
226
+ * @allowedValues: error, success, disabled
227
+ * @affectsStyling: true
106
228
  */
107
229
  status: {
108
230
  type: String,
109
231
  required: false
110
232
  },
111
233
  /**
112
- * icon-class for dropdown icon (i.e. an angle/arrow)
234
+ * icon for dropdown-icon (i.e. an angle/arrow)
235
+ *
236
+ * @requiredForAccessibility: partial
237
+ * @defaultIcon: icon-single-arrow-down
113
238
  */
114
- dropdownIconClass: {
115
- type: String,
116
- default: "icon-single-arrow-down"
239
+ dropdownIcon: {
240
+ type: Object,
241
+ default() {
242
+ return {
243
+ iconClass: "icon-single-arrow-down",
244
+ tooltip: "Toggle dropdown visibility"
245
+ }
246
+ }
117
247
  },
118
248
  /**
119
249
  * label-text for fake-select
250
+ *
251
+ * @requiredForAccessibility: true
120
252
  */
121
253
  labelText: {
122
254
  type: String,
@@ -134,8 +266,8 @@ export default {
134
266
  // get the displayed option name
135
267
  optionName() {
136
268
  // fake a normal checkbox
137
- if (this.type !== "checkboxOptions" && this.type !== "content" && this.value) {
138
- const result = this.selectData.find(option => option.value === this.value)?.text
269
+ if (this.type !== "checkboxOptions" && this.type !== "content" && this.modelValue) {
270
+ const result = this.selectData.find(option => option.value === this.modelValue)?.text
139
271
 
140
272
  // if find() returns some data, return this data
141
273
  if (result) {
@@ -145,71 +277,149 @@ export default {
145
277
 
146
278
  // selectbox with checkbox-options
147
279
  else if (this.type === "checkboxOptions") {
148
- if (this.value.length === 1) {
149
- return this.selectData.find(option => option.value === this.value[0])?.text
150
- } else if (this.value.length > 1) {
151
- return this.value.length + " options selected"
280
+ if (this.modelValue.length === 1) {
281
+ return this.selectData.find(option => option.value === this.modelValue[0])?.text
282
+ } else if (this.modelValue.length > 1) {
283
+ return this.modelValue.length + " options selected"
152
284
  }
153
285
  }
154
286
 
155
- // if nothing is selected return the set default option name
156
- if (this.defaultOptionName) {
157
- return this.defaultOptionName
287
+ else if (this.selectData?.length) {
288
+ return this.selectData[0].text
158
289
  }
159
290
 
160
- // if nothing is selected and no default option name is set, return default text (so selectbox is not empty)
161
- return "Please select\u2026"
291
+ return "Please select"
162
292
  },
163
293
  // get the displayed icon (only available for default selectbox)
164
294
  optionIcon() {
165
295
  if (this.type === "default") {
166
296
  return this.selectData.find(option => {
167
- return option.value === this.value
297
+ return option.value === this.modelValue
168
298
  })?.icon?.iconClass
169
299
  }
170
300
  return null
171
301
  },
172
302
  optionCountry() {
173
303
  if (this.type === "country") {
174
- return this.value
304
+ return this.modelValue
175
305
  }
176
306
  return null
177
307
  },
178
308
  optionColor() {
179
309
  if (this.type === "color") {
180
- return this.value
310
+ return this.modelValue
181
311
  }
182
312
  return null
183
313
  },
184
- overflowWidth() {
185
- let outerWidth = document.querySelector(".cmd-fake-select").outerWidth()
186
- return "width: " + outerWidth + "px;"
314
+ selectAllOptionsText() {
315
+ if(Array.isArray(this.modelValue) && this.modelValue.length === this.selectData.length) {
316
+ return "Deselect all options"
317
+ }
318
+ return "Select all options"
319
+ },
320
+ selectAllOptionsIcon() {
321
+ return "icon-check"
187
322
  }
188
323
  },
324
+ mounted() {
325
+ //this.$nextTick(this.limitWidth)
326
+ //setTimeout(this.limitWidth, 250)
327
+ const hnd = setInterval(() => {
328
+ if (this.$refs.fakeselect) {
329
+ clearInterval(hnd)
330
+ this.limitWidth()
331
+ }
332
+ }, 100)
333
+ },
189
334
  methods: {
335
+ toggleAllOptions() {
336
+ this.validationStatus = "success"
337
+ const checkboxValues = []
338
+ if(this.modelValue.length === this.selectData.length) {
339
+ if(this.$attrs.required) {
340
+ this.validationStatus = "error"
341
+ }
342
+ } else {
343
+ for (let i = 0; i < this.selectData.length; i++) {
344
+ checkboxValues.push(this.selectData[i].value)
345
+ }
346
+ }
347
+
348
+ this.$emit("update:modelValue", checkboxValues)
349
+ },
350
+ limitWidth() {
351
+ if(this.$refs.fakeselect) {
352
+ const outerWidth = this.$refs.fakeselect.offsetWidth
353
+ this.limitWidthStyle = {width: outerWidth / 100 * 90 + "px"}
354
+ }
355
+ },
190
356
  toggleOptions() {
191
357
  if (this.status !== 'disabled') {
192
358
  this.showOptions = !this.showOptions
193
359
  }
194
360
  },
361
+ // check is an option is selected for default-selectbox
362
+ selectOption(optionValue) {
363
+ this.validationStatus = "success"
364
+ if(this.$attrs.required !== undefined) {
365
+ if(!optionValue) {
366
+ this.validationStatus = "error"
367
+ }
368
+ }
369
+
370
+ this.showOptions = false
371
+ this.$emit('update:modelValue', optionValue);
372
+ },
373
+ // check if a checkbox is changed for selectbox with checkboxes
195
374
  optionSelect(event) {
196
- let value = [...this.value] // copy array from props
375
+ this.validationStatus = "success"
376
+
377
+ let value = [...this.modelValue] // copy array from props
197
378
  if (event.target.checked) {
198
379
  value.push(event.target.value); // attention: value will be transformed into string!
199
380
  } else {
200
381
  value = value.filter(v => v !== event.target.value);
201
382
  }
202
- this.$emit('update:value', value);
203
- },
204
- selectOption(optionValue) {
205
- this.showOptions = false
206
- this.$emit('update:value', optionValue);
383
+ if(this.$attrs.required !== undefined && !value.length) {
384
+ this.validationStatus = "error"
385
+ }
386
+
387
+ this.$emit('update:modelValue', value);
207
388
  },
208
389
  closeOptions() {
209
390
  this.showOptions = false
210
391
  },
211
392
  pathFlag(isoCode) {
212
393
  return this.pathFlags + "/flag-" + isoCode + ".svg"
394
+ },
395
+ onBlur() {
396
+ this.validationStatus = "success"
397
+
398
+ if (this.$attrs.required !== undefined && (!this.modelValue || this.modelValue.length === 0)) {
399
+ this.validationStatus = "error"
400
+ }
401
+ },
402
+ // overwrite requirement-message form fieldValidation.js
403
+ getRequirementMessage() {
404
+ return "An option is selected"
405
+ }
406
+ },
407
+ watch: {
408
+ status: {
409
+ handler() {
410
+ this.validationStatus = this.status
411
+ },
412
+ immediate: true
413
+ },
414
+ selectData: {
415
+ handler() {
416
+ // check if given value by modelValue exists (else pre-select first option)
417
+ if(this.type === "default" && this.selectData?.length && !this.selectData.some((option) => option.value === this.modelValue)) {
418
+ this.$emit("update:modelValue", this.selectData[0].value)
419
+ }
420
+ },
421
+ immediate: true,
422
+ deep: true
213
423
  }
214
424
  }
215
425
  }
@@ -224,6 +434,18 @@ export default {
224
434
  }
225
435
 
226
436
  .cmd-fake-select {
437
+ align-self: flex-end;
438
+
439
+ & + .cmd-tooltip {
440
+ border-color: var(--status-color);
441
+ }
442
+
443
+ > span:first-child {
444
+ a {
445
+ align-self: flex-end;
446
+ }
447
+ }
448
+
227
449
  > ul {
228
450
  height: var(--input-height);
229
451
  margin: 0;
@@ -241,10 +463,9 @@ export default {
241
463
  height: inherit;
242
464
  border: var(--default-border);
243
465
 
244
- > span:not([class*="icon"]) {
466
+ .option-name {
245
467
  text-overflow: ellipsis;
246
468
  overflow: hidden;
247
- width: 95%;
248
469
  }
249
470
 
250
471
  > [class*="icon-"]:last-child {
@@ -349,6 +570,11 @@ export default {
349
570
  &.checkbox-options {
350
571
  li {
351
572
  padding: calc(var(--default-padding) / 2);
573
+
574
+ &.select-all-options {
575
+ border-top: var(--primary-border);
576
+ padding: 0;
577
+ }
352
578
  }
353
579
  }
354
580
  }
@@ -365,8 +591,7 @@ export default {
365
591
  }
366
592
 
367
593
  &:hover, &:active, &:focus {
368
- border-color: var(--error-color);
369
- background: var(--error-background);
594
+ background: var(--pure-white);
370
595
 
371
596
  span {
372
597
  color: var(--error-color);