@bytebrand/fe-ui-core 4.8.109 → 4.8.110

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 (198) hide show
  1. package/media/locales/de/promoSlider.json +0 -1
  2. package/media/locales/en/promoSlider.json +0 -1
  3. package/package.json +5 -3
  4. package/source/components/AccordionWidget/AccordionWidget.styl +1 -13
  5. package/source/components/AccordionWidget/AccordionWidget.tsx +8 -49
  6. package/source/components/OfferPanel/OfferCheckboxGroup/CheckboxContainer.tsx +2 -2
  7. package/source/components/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.styl +0 -24
  8. package/source/components/OfferPanel/OfferCheckboxGroup/OfferCheckboxGroup.tsx +2 -1
  9. package/source/components/OfferPanel/OfferPanel.tsx +1 -1
  10. package/source/components/VehicleDetailedSidebar/VehicleDetailedSidebar.tsx +11 -23
  11. package/source/components/VehicleDetailedSidebar/partials/Properties.styl +0 -5
  12. package/source/components/VehicleDetailedSidebar/partials/Properties.tsx +18 -56
  13. package/source/components/VehicleDetailedSlider/VehicleDetailedSlider.tsx +6 -2
  14. package/source/components/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.styl +0 -42
  15. package/source/components/VehicleSmallCard/VehicleData/VechiclePriceItem/VechiclePriceItem.tsx +11 -23
  16. package/source/components/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.styl +5 -60
  17. package/source/components/VehicleSmallCard/VehicleData/VehicleInfo/VehicleInfo.tsx +12 -36
  18. package/source/components/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.styl +2 -3
  19. package/source/components/VehicleSmallCard/VehicleData/VehiclePrice/VehiclePrice.tsx +7 -18
  20. package/source/components/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.styl +1 -4
  21. package/source/components/VehicleSmallCard/VehicleData/VehicleProperty/VehicleProperty.tsx +2 -3
  22. package/source/components/VehicleSmallCard/VehicleData/VehicleTitle/VehicleTitle.tsx +1 -1
  23. package/source/components/VehicleSmallCard/VehicleSmallCard.styl +2 -67
  24. package/source/components/VehicleSmallCard/VehicleSmallCard.tsx +3 -49
  25. package/source/components/_common/MaterialAccordionGroup/MaterialAccordionGroup.styled.tsx +1 -4
  26. package/source/components/_common/MaterialTooltip/MaterialTooltip.tsx +3 -4
  27. package/source/components/_common/withStats/withStats.styl +0 -10
  28. package/source/framework/DataTransformers.ts +0 -2
  29. package/source/framework/constants/common.ts +4 -8
  30. package/source/framework/types/types.ts +0 -1
  31. package/source/framework/vehiclesProps/decoratedLightProps.tsx +18 -109
  32. package/source/framework/vehiclesProps/decoratedProps.tsx +9 -68
  33. package/source/framework/vehiclesProps/vehicleDetails.ts +1 -3
  34. package/source/locales/data.ts +3 -13
  35. package/.husky/pre-push +0 -4
  36. package/.storybook/addons.js +0 -4
  37. package/.storybook/config.js +0 -64
  38. package/.storybook/postcss.config.js +0 -6
  39. package/.storybook/preview-head.html +0 -10
  40. package/.storybook/webpack.config.js +0 -130
  41. package/__tests__/components/Checkout/OrderOverviewItem/OrderOverviewItem.test.tsx +0 -42
  42. package/__tests__/components/Checkout/PaymentTypeCard/PaymentTypeCard.test.tsx +0 -50
  43. package/__tests__/components/Checkout/RadioGroup.test.tsx +0 -95
  44. package/__tests__/components/Checkout/ServiceCardWrapper.test.tsx +0 -53
  45. package/__tests__/components/Checkout/Switcher.test.tsx +0 -43
  46. package/__tests__/components/UserDasboardPage/sections/CheckoutSection/CheckoutSection.test.tsx +0 -613
  47. package/__tests__/components/UserDasboardPage/sections/FavoriteSection/FavoriteSection.test.tsx +0 -335
  48. package/__tests__/components/UserDasboardPage/sections/OrderStatusSection/AdditionalOrderInfo.test.tsx +0 -127
  49. package/__tests__/components/UserDasboardPage/sections/OrderStatusSection/OrderStatusCar.test.tsx +0 -58
  50. package/__tests__/components/UserDasboardPage/sections/OrderStatusSection/OrderStatusCard.test.tsx +0 -74
  51. package/__tests__/components/UserDasboardPage/sections/OrderStatusSection/OrderStatusSection.test.tsx +0 -62
  52. package/__tests__/components/UserDasboardPage/sections/RequestedCarsSection/RequestedCarsSection.test.tsx +0 -117
  53. package/__tests__/components/Vehicle/VehicleFormattedPrice/VehicleFormattedPrice.test.tsx +0 -58
  54. package/__tests__/components/VehicleSmallCard/VehicleInfo.test.tsx +0 -88
  55. package/__tests__/components/VehicleSmallCard/VehicleTitle.test.tsx +0 -91
  56. package/__tests__/components/_common/Badge/Badge.test.tsx +0 -15
  57. package/__tests__/components/_common/IconSVG/IconSVG.test.tsx +0 -23
  58. package/__tests__/components/_common/Image/Image.test.tsx +0 -82
  59. package/__tests__/components/_common/MaterialAutocomplete/MaterialAutocomplete.test.tsx +0 -49
  60. package/__tests__/components/_common/MaterialDatePicker/MaterialDatePicker.test.tsx +0 -54
  61. package/__tests__/components/_common/MaterialField/MaterialField.test.tsx +0 -58
  62. package/__tests__/components/_common/StarButton/StarButton.test.tsx +0 -46
  63. package/__tests__/mockedData/financingConfig.js +0 -202
  64. package/__tests__/mockedData/mockedPendingRequestedCar.js +0 -69
  65. package/__tests__/utils/CommonUtils/addPrefixToKeys.test.ts +0 -18
  66. package/__tests__/utils/CommonUtils/arrToObj.test.js +0 -32
  67. package/__tests__/utils/CommonUtils/checkRangeValuesOnEqual.test.ts +0 -17
  68. package/__tests__/utils/CommonUtils/fixNumber.test.ts +0 -20
  69. package/__tests__/utils/CommonUtils/formatMileage.test.ts +0 -8
  70. package/__tests__/utils/CommonUtils/getChipFilterValue.test.ts +0 -22
  71. package/__tests__/utils/CommonUtils/getFormattedNumber.test.ts +0 -19
  72. package/__tests__/utils/CommonUtils/getFormattedPrice.test.ts +0 -19
  73. package/__tests__/utils/CommonUtils/getGroupValuesForQuery.test.ts +0 -51
  74. package/__tests__/utils/CommonUtils/getOfferSliders.test.ts +0 -64
  75. package/__tests__/utils/CommonUtils/getPriceRating.test.ts +0 -26
  76. package/__tests__/utils/CommonUtils/getPriceRatingConfig.test.ts +0 -33
  77. package/__tests__/utils/CommonUtils/preloadNearbyImages.test.ts +0 -9
  78. package/__tests__/utils/CommonUtils/sliceLessThan.test.ts +0 -23
  79. package/__tests__/utils/CommonUtils/sliceMoreThan.test.ts +0 -23
  80. package/package.json.bak +0 -118
  81. package/source/components/AdvantageItem/AdvantageItem.story.js +0 -23
  82. package/source/components/Alternative/Dealer.story.js +0 -32
  83. package/source/components/Alternative/Dealer.story.styl +0 -3
  84. package/source/components/Breadcrumbs/Breadcrumbs.story.js +0 -40
  85. package/source/components/Breadcrumbs/FirstInfoBlock/FirstInfoBlock.story.js +0 -45
  86. package/source/components/Checkout/OrderOverviewItem/OrderOverviewItem.story.js +0 -243
  87. package/source/components/Checkout/OrderOverviewItem/OrderOverviewItem.story.styl +0 -21
  88. package/source/components/Checkout/RadioCards/RadioGroupCheckout.story.js +0 -105
  89. package/source/components/Checkout/RadioCards/RadioGroupCheckout.story.styl +0 -37
  90. package/source/components/Checkout/Switcher/Switcher.story.js +0 -41
  91. package/source/components/Checkout/Switcher/Switcher.story.styl +0 -2
  92. package/source/components/CompactSearchWidget/CompactSearchWidget.story.js +0 -187
  93. package/source/components/ContactForm/ContactForm.story.js +0 -94
  94. package/source/components/ContactForm/ContactForm.story.styl +0 -0
  95. package/source/components/ContactInfo/ContactInfo.story.js +0 -58
  96. package/source/components/CustomerQuote/CustomerQuote.story.js +0 -41
  97. package/source/components/CustomerQuotesSlider/CustomerQuotesSlider.story.js +0 -73
  98. package/source/components/CustomerQuotesSlider/CustomerQuotesSlider.story.styl +0 -5
  99. package/source/components/FormattedNumber/FormattedNumber.story.js +0 -114
  100. package/source/components/InfoBlocks/InfoBlockWrapper.story.js +0 -101
  101. package/source/components/InfoBlocks/InfoBlockWrapper.story.styl +0 -46
  102. package/source/components/OfferPanel/AboAccordion/AboFaq/AboFaq.story.js +0 -97
  103. package/source/components/OfferPanel/OfferPanel.story.js +0 -139
  104. package/source/components/OfferPanel/RangeGroup/RangeGroup.story.js +0 -35
  105. package/source/components/OfferPanel/RangeGroup/RangeGroup.story.styl +0 -3
  106. package/source/components/PriceRating/PriceRating.story.js +0 -39
  107. package/source/components/PriceRating/PriceRating.story.styl +0 -2
  108. package/source/components/PriceRatingDetailed/PriceRatingDetailed.story.js +0 -78
  109. package/source/components/PriceRatingDetailed/PriceRatingDetailed.story.styl +0 -11
  110. package/source/components/RateSearchValue/RateSearchValue.story.js +0 -78
  111. package/source/components/RateSearchValue/RateSearchValue.story.styl +0 -2
  112. package/source/components/RateSearchWidget/RateSearchWidget.story.js +0 -57
  113. package/source/components/RateSearchWidget/RateSearchWidget.story.styl +0 -12
  114. package/source/components/SearchFilters/FiltersFactory.story.js +0 -273
  115. package/source/components/SearchPage/Filters/MakeModel/MakeModel.story.js +0 -12
  116. package/source/components/SearchWidget/BasicDataWidget/BasicDataWidget.story.js +0 -834
  117. package/source/components/SearchWidget/BasicDataWidget/BasicDataWidget.story.styl +0 -40
  118. package/source/components/SearchWidget/SearchWidget.story.js +0 -191
  119. package/source/components/SearchWidget/SearchWidget.story.styl +0 -6
  120. package/source/components/Stepper/Stepper.story.js +0 -119
  121. package/source/components/Stepper/Stepper.story.styl +0 -41
  122. package/source/components/Theme.story.js +0 -36
  123. package/source/components/Theme.story.styl +0 -85
  124. package/source/components/TickerText/TickerText.story.js +0 -17
  125. package/source/components/UserDashboardPage/sections/OrderStatusSection/OrderStatusSection.story.js +0 -95
  126. package/source/components/UserDashboardPage/sections/RequestedCarsSection/RequestedCarsSection.story.js +0 -97
  127. package/source/components/Vehicle/VehicleConsumption/VehicleConsumption.story.js +0 -31
  128. package/source/components/Vehicle/VehicleFormattedPrice/VehicleFormattedPrice.story.js +0 -247
  129. package/source/components/VehicleCompared/CompareGeneral/CompareGeneral.story.js +0 -30
  130. package/source/components/VehicleCompared/ComparePrice/ComparePrice.story.js +0 -18
  131. package/source/components/VehicleCompared/CompareTitle/CompareTitle.story.js +0 -19
  132. package/source/components/VehicleDetailedSidebar/VehicleDetailedSidebar.story.js +0 -44
  133. package/source/components/VehicleDetailedSlider/VehicleDetailedSlider.story.js +0 -120
  134. package/source/components/VehiclePromoSlider/VehiclePromoInfo/VehiclePromoInfo.story.js +0 -42
  135. package/source/components/VehiclePromoSlider/VehiclePromoSlide/VehiclePromoSlide.story.js +0 -62
  136. package/source/components/VehiclePromoSlider/VehiclePromoSlider.story.js +0 -42
  137. package/source/components/VehicleSmallCard/VehicleSmallCard.story.js +0 -412
  138. package/source/components/VehicleSmallCard/VehicleSmallCard.story.styl +0 -56
  139. package/source/components/VehicleSmallCardForDealerships/VehicleSmallCardForDealerships.story.js +0 -199
  140. package/source/components/VehicleSmallCardForDealerships/VehicleSmallCardForDealerships.story.styl +0 -40
  141. package/source/components/_common/Accordion/Accordion.story.js +0 -36
  142. package/source/components/_common/Badge/Badge.story.js +0 -27
  143. package/source/components/_common/Badge/Badge.story.styl +0 -5
  144. package/source/components/_common/Bubble/Bubble.story.js +0 -52
  145. package/source/components/_common/Button/Button.story.js +0 -52
  146. package/source/components/_common/Button/Button.story.styl +0 -5
  147. package/source/components/_common/ButtonOld/Button.story.js +0 -54
  148. package/source/components/_common/ButtonOld/Button.story.styl +0 -5
  149. package/source/components/_common/Checkbox/Checkbox.story.js +0 -85
  150. package/source/components/_common/Checkbox/Checkbox.story.styl +0 -14
  151. package/source/components/_common/CheckboxMaterial/CheckboxMaterial.story.js +0 -126
  152. package/source/components/_common/CheckboxMaterial/CheckboxMaterial.story.styl +0 -14
  153. package/source/components/_common/Chip/Chip.story.js +0 -43
  154. package/source/components/_common/ChipList/ChipList.story.js +0 -36
  155. package/source/components/_common/DropDown/DropDown.story.js +0 -35
  156. package/source/components/_common/ExpandablePanel/ExpandablePanel.story.js +0 -41
  157. package/source/components/_common/Histogram/Histogram.story.js +0 -51
  158. package/source/components/_common/IconSVG/IconSVG.story.js +0 -21
  159. package/source/components/_common/IconSVG/IconSVG.story.styl +0 -25
  160. package/source/components/_common/Image/Image.story.js +0 -142
  161. package/source/components/_common/Image/Image.story.styl +0 -18
  162. package/source/components/_common/ImagesSet/ImagesSet.story.js +0 -34
  163. package/source/components/_common/ImagesSet/ImagesSet.story.styl +0 -4
  164. package/source/components/_common/Loader/Loader.story.js +0 -21
  165. package/source/components/_common/MaterialAccordionGroup/MaterialAccordionGroup.story.js +0 -49
  166. package/source/components/_common/MaterialDatePicker/MaterialDatePicker.story.js +0 -45
  167. package/source/components/_common/MaterialDatePicker/MaterialDatePicker.story.styl +0 -6
  168. package/source/components/_common/MaterialField/MaterialField.story.js +0 -87
  169. package/source/components/_common/MaterialField/MaterialField.story.styl +0 -34
  170. package/source/components/_common/MaterialSelect/MaterialSelect.story.js +0 -52
  171. package/source/components/_common/MaterialSelect/MaterialSelect.story.styl +0 -6
  172. package/source/components/_common/MaterialStepButton/MaterialStepButton.story.js +0 -47
  173. package/source/components/_common/MaterialStepButton/MaterialStepButton.story.styl +0 -6
  174. package/source/components/_common/MaterialSwitch/MaterialSwitch.story.js +0 -17
  175. package/source/components/_common/MaterialTooltip/MaterialTooltip.story.js +0 -10
  176. package/source/components/_common/Modal/Modal.story.js +0 -37
  177. package/source/components/_common/MuiGroupedSelect/MuiGroupedSelect.story.js +0 -21
  178. package/source/components/_common/PropertySelector/PSGroup.story.js +0 -93
  179. package/source/components/_common/PropertySelector/PSGroup.story.styl +0 -25
  180. package/source/components/_common/PropertySelector/ProperySelector.story.js +0 -83
  181. package/source/components/_common/Radio/FormRadioGroup.story.js +0 -28
  182. package/source/components/_common/Radio/FormRadioGroup.story.styl +0 -2
  183. package/source/components/_common/Radio/Radio.story.js +0 -54
  184. package/source/components/_common/Radio/RadioGroup.story.js +0 -90
  185. package/source/components/_common/Radio/RadioGroup.story.styl +0 -39
  186. package/source/components/_common/Range/Range.story.js +0 -46
  187. package/source/components/_common/Range/Range.story.styl +0 -5
  188. package/source/components/_common/SliderArrow/SliderArrow.story.js +0 -18
  189. package/source/components/_common/Tabs/Tabs.story.js +0 -56
  190. package/source/components/_common/TimePicker/TimePicker.story.js +0 -37
  191. package/source/components/_common/Tooltip/Tooltip.story.js +0 -28
  192. package/source/components/_common/UserMenu/MaterialMenu.story.js +0 -73
  193. package/source/components/_common/VehicleSlider/VehicleSlider.story.js +0 -99
  194. package/source/components/_common/VehicleSlider/VehicleSlider.story.styl +0 -0
  195. package/source/components/_common/withLabel/withLabel.story.js +0 -62
  196. package/source/components/_common/withPopover/withPopover.story.js +0 -48
  197. package/source/components/_common/withPopover/withPopover.story.styl +0 -54
  198. package/source/components/_common/withStats/withStats.story.js +0 -75
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "consumptionCombined": "{{consumptionCombined}}l/100km (komb)*",
3
3
  "co2": "{{co2}}g CO2/km (komb)*",
4
- "co2Class": "CO2-Klasse {{class}} (komb)",
5
4
  "weDeliverMagdeburg": "Wir liefern Ihr Auto zu Ihnen nach Magdeburg!",
6
5
  "weDeliverToYou": "Wir liefern Ihr Auto zu Ihnen!",
7
6
  "withoutDeposit": "ohne Anzahlung",
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "consumptionCombined": "{{consumptionCombined}}/100km (comb)*",
3
3
  "co2": "{{co2}}g CO2/km (comb)*",
4
- "co2Class": "CO2-class {{class}} (comb)",
5
4
  "weDeliverMagdeburg": "We will deliver your car to Magdeburg!",
6
5
  "weDeliverToYou": "We deliver your car to you!",
7
6
  "withoutDeposit": "Without Deposit",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytebrand/fe-ui-core",
3
- "version": "4.8.109",
3
+ "version": "4.8.110",
4
4
  "description": "UI components for the auto.de project",
5
5
  "main": "index.ts",
6
6
  "module": "dist/common.js",
@@ -14,7 +14,7 @@
14
14
  "@babel/preset-typescript": "^7.21.0",
15
15
  "@bytebrand/car-schema-selectors": "^2.0.7",
16
16
  "@bytebrand/fe-histoslider": "3.0.0",
17
- "@bytebrand/i18n-dictionaries": "^0.7.5",
17
+ "@bytebrand/i18n-dictionaries": "^1.5.2",
18
18
  "@emotion/react": "^11.9.3",
19
19
  "@emotion/styled": "^11.9.3",
20
20
  "@mui/material": "^5.9.0",
@@ -104,7 +104,9 @@
104
104
  "@types/react": "^16.8.3"
105
105
  },
106
106
  "scripts": {
107
- "prepare": "node -e 0",
107
+ "build": "true",
108
+ "prepublishOnly": "npm run build",
109
+ "prepare": "npm run build",
108
110
  "storybook": "start-storybook -p 6006",
109
111
  "clean": "rm -rf ./dist/*.*",
110
112
  "build:lib": "yarn clean && webpack --config ./webpack.config.js --progress",
@@ -191,7 +191,6 @@
191
191
  height: 45px
192
192
  border-bottom 1px solid $grey-e
193
193
  text-transform: none
194
- font-size: 11px
195
194
 
196
195
  +media-tablet-landscape-down()
197
196
  padding-top: 7px;
@@ -200,20 +199,9 @@
200
199
  color: rgba(0,0,0,.63);
201
200
  word-break: break-word;
202
201
 
203
- // ADV-88: consumption/CO2 line spans the full overview grid width on its own row.
204
- .accordionVehiclePropFull
205
- grid-column: 1 / -1
206
- height: auto
207
- align-items: flex-start
208
- line-height: 1.45
209
- padding: 10px 7.5px
210
- span
211
- font-size: 10px
212
- word-break: break-word
213
-
214
202
  .propertyIcon
215
203
  flex-shrink: 0;
216
-
204
+
217
205
  .longTitle
218
206
  max-width: 157px
219
207
 
@@ -31,16 +31,13 @@ class AccordionWidget extends React.Component<IAccardionSectionProps> {
31
31
  return (
32
32
  <div className={styles.propertyContainer}>
33
33
  {data.map((prop, i) => {
34
- // ADV-88: the consumption/CO2 line is long for (plug-in) hybrids — let it span the
35
- // full grid width on its own row instead of being squeezed into one fixed-height cell.
36
- const isFullWidth = (prop as any).fullWidth;
37
34
  return (
38
35
  <VehicleProperty
39
36
  key={i}
40
37
  description={prop.description}
41
38
  classNameIcon={styles.propertyIcon}
42
- icon={prop.icon === '' ? '' : (prop.icon || 'no-image')}
43
- className={classnames(styles.accordionVehicleProp, isFullWidth ? styles.accordionVehiclePropFull : '')}
39
+ icon={prop.icon || 'no-image'}
40
+ className={styles.accordionVehicleProp}
44
41
  />
45
42
  );
46
43
  })}
@@ -48,42 +45,14 @@ class AccordionWidget extends React.Component<IAccardionSectionProps> {
48
45
  );
49
46
  };
50
47
 
51
- // ADV-70: in the "Vehicle Details" section completely hide a spec row when its value is
52
- // "N/A", a zero ("0 mm", "0 kWh", "0 g CO2/km", ...), null or empty. The Overview section
53
- // keeps "N/A" and is rendered separately (renderOverview/renderPropsBlock), so it is unaffected.
54
- isHiddenSpecValue = (value: any): boolean => {
55
- if (value === null || value === undefined) return true;
56
- if (typeof value !== 'string') return false; // JSX / non-string content → always keep
57
- const trimmed = value.trim();
58
- if (trimmed === '' || trimmed === this.props.t('vehicleProps:value.na')) return true;
59
- // Detect a zero numeric value regardless of unit/locale: de-DE uses "." as thousands
60
- // separator and "," as decimal. Only a leading-zero magnitude normalises to exactly 0,
61
- // so non-zero values (incl. codes like HSN "0588") are never hidden by mistake.
62
- const numeric = parseFloat(trimmed.replace(/\./g, '').replace(',', '.'));
63
- return numeric === 0;
64
- };
65
-
66
48
  renderTable = (decoratedProps: IDecoratedProps, propsList: string[] = [], header: string): React.ReactNode => {
67
- const visibleProps = propsList.filter((prop) => {
68
- const decoratedProp = decoratedProps[prop];
69
- if (!decoratedProp) return false;
70
- const { value, isVisible = true } = decoratedProp;
71
- // ADV-70 exception: the CO2 emission fields must ALWAYS be shown — even when 0 — because
72
- // 0 g CO2/km is a real, legally-relevant value, so they bypass the N/A/0 hide rule.
73
- // NOTE: the environment table's prop key is 'c02' (with a ZERO, see vehicleDetails.ts), not 'co2'.
74
- const alwaysShow = prop === 'co2' || prop === 'c02' || prop === 'wltpCo2';
75
- return isVisible && (alwaysShow || !this.isHiddenSpecValue(value));
76
- });
77
-
78
- if (visibleProps.length === 0) return null;
79
-
80
49
  return (
81
50
  <>
82
51
  <div className={styles.table}>
83
52
  <h3 className={styles.tableName}>{header}</h3>
84
- {visibleProps.map((prop, i) => {
85
- const { title, subTitle, value, isLongTitle = false, valueDescription = '' } = decoratedProps[prop];
86
- return (
53
+ {propsList.map((prop, i) => {
54
+ const { title, subTitle, value, isVisible = true, isLongTitle = false, valueDescription = '' } = decoratedProps[prop];
55
+ return isVisible && (
87
56
  <div key={i} className={title ? styles.tr : ''}>
88
57
  {title && <div className={classnames(styles.th, isLongTitle ? styles.longTitle : '')}>
89
58
  <span className={styles.title}>{title}</span>
@@ -131,20 +100,10 @@ class AccordionWidget extends React.Component<IAccardionSectionProps> {
131
100
  const { car } = this.props;
132
101
  const autoDeId = car.metaData && car.metaData.vehicleId;
133
102
  const { consumption } = car;
134
- // ADV-88: ANY plug-in hybrid (new or used) gets the long weighted+discharged line and the
135
- // full-width treatment. Gated on hybridPlugin only, no condition check.
136
- // ADV-88: "is a hybrid car" is determined by fuel type (hybrid electric + diesel/petrol), not hybridPlugin.
137
- const isPluginHybrid = consumption.fuel === 'selector_fuel_hybridElectricalDiesel'
138
- || consumption.fuel === 'selector_fuel_hybridElectricalPetrol';
139
103
  const mainPropertiesList = getOverviewDetails(consumption.fuel);
140
- const mainProperties = mainPropertiesList.map((prop: string) => {
141
- const isConsumptionAlternateView = prop.startsWith('consumption') && prop.endsWith('AlternateView');
142
- return {
143
- icon: isConsumptionAlternateView ? '' : this.props.decoratedProps[prop].icon,
144
- description: this.props.decoratedProps[prop].value,
145
- fullWidth: isConsumptionAlternateView && isPluginHybrid
146
- };
147
- });
104
+ const mainProperties = mainPropertiesList.map((prop: string) => (
105
+ { icon: this.props.decoratedProps[prop].icon, description: this.props.decoratedProps[prop].value })
106
+ );
148
107
  return (
149
108
  <div>
150
109
  {this.renderPropsBlock(mainProperties)}
@@ -21,7 +21,7 @@ export interface ICheckboxProps {
21
21
  checkboxClassName?: string;
22
22
  labelClassName?: string;
23
23
  labelPlacement?: 'end' | 'start' | 'top' | 'bottom';
24
- tooltipDescription?: React.ReactNode;
24
+ tooltipDescription?: string;
25
25
  checkboxPriceValue: any;
26
26
  tooltipPosX?: string;
27
27
  error?: boolean;
@@ -128,7 +128,7 @@ class CheckboxContainer extends React.Component<ICheckboxProps, {}> {
128
128
  {description ? (
129
129
  <span className={styles.labelContent}>
130
130
  {description}
131
- {tooltipDescription && <MaterialTooltip zindex={10000} disablePortal={false} text={tooltipDescription} className={styles.tooltipCheckbox} icon='InfoTransparent' />}
131
+ {tooltipDescription && <MaterialTooltip zindex={10000} text={tooltipDescription} className={styles.tooltipCheckbox} icon='InfoTransparent' />}
132
132
  </span>
133
133
  ) : false}
134
134
  </label>
@@ -111,30 +111,6 @@
111
111
  max-height: inherit;
112
112
  width: inherit !important
113
113
 
114
- :global
115
- .MuiTooltip-tooltip
116
- max-width: 360px !important
117
- font-size: 11px
118
- line-height: 1.45
119
- color: #4C4E64AD
120
- text-align: left
121
-
122
- b
123
- display: block
124
- margin-bottom: 6px
125
- font-size: 12px
126
- color: #1a1a1a
127
-
128
- p
129
- margin: 0 0 6px
130
-
131
- ul
132
- margin: 4px 0 0
133
- padding-left: 16px
134
-
135
- li
136
- margin-bottom: 3px
137
-
138
114
  .checkboxPrice
139
115
  align-self: center;
140
116
  color: rgba(#000000, .63);
@@ -11,11 +11,12 @@ interface IOfferPeriod {
11
11
  transferInstallments?: any;
12
12
  }
13
13
 
14
- const OfferCheckboxGroup: FC<IOfferPeriod> = ({ additionalService, isAboAccordionExpanded0 = true, priceTabIndex }) => {
14
+ const OfferCheckboxGroup: FC<IOfferPeriod> = ({ additionalService, transferInstallments, isAboAccordionExpanded0 = true, priceTabIndex }) => {
15
15
  const offerGroupClass = classNames(styles.checkboxWrapped, { [styles.checkBoxGroup]: priceTabIndex !== THREE });
16
16
  return (
17
17
  <div className={offerGroupClass}>
18
18
  {isAboAccordionExpanded0 && <CheckboxContainer {...additionalService } />}
19
+ <CheckboxContainer {...{ ...transferInstallments, isAboAccordionExpanded0 }} />
19
20
  </div>
20
21
  );
21
22
  };
@@ -71,7 +71,7 @@ const OfferPanel: FC<IFinancingPanel> = ({
71
71
 
72
72
  {priceTabIndex === THREE
73
73
  ? <div className={styles.aboAccordionWrapper}><AboAccordion /></div>
74
- : <div className={styles.offerCheckboxGroup}><OfferCheckboxGroup {...{ transferInstallments, additionalService, priceTabIndex }} /></div>}
74
+ : <div className={styles.offerCheckboxGroup}><OfferCheckboxGroup {...{ transferInstallments, additionalService }} /></div>}
75
75
  </>
76
76
  }
77
77
  </form>
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect, useRef, FunctionComponent } from 'react';
1
+ import React, { useState, useEffect, FunctionComponent } from 'react';
2
2
  import _get from 'lodash/get';
3
3
  import { Hidden } from 'react-grid-system';
4
4
  import PriceContent from './partials/PriceContent';
@@ -104,31 +104,19 @@ const VehicleDetailedSidebar: FunctionComponent<IVehicleDetailedSidebarProps> =
104
104
  }
105
105
  ];
106
106
 
107
- const initialDefaultAppliedForPath = useRef<string | null>(null);
108
-
109
107
  useEffect(() => {
110
108
  const getlocalStorageActiveTabCDP = localStorage.getItem('activeTabCDP');
111
- if (getlocalStorageActiveTabCDP) {
112
- const activeTab = tabsTitles.findIndex(({ title }: { title: string }) => {
113
- return title === getlocalStorageActiveTabCDP;
114
- });
115
- if (activeTab === -1) {
116
- setActiveTab(null, 0);
117
- } else {
118
- setActiveTab(null, activeTab);
119
- }
120
- localStorage.removeItem('activeTabCDP');
121
- initialDefaultAppliedForPath.current = pathname;
122
- return;
123
- }
124
- if (
125
- initialDefaultAppliedForPath.current !== pathname
126
- && _get(price, 'leasing.isActive', false)
127
- ) {
128
- setActiveTab(null, 1);
129
- initialDefaultAppliedForPath.current = pathname;
109
+ if (!getlocalStorageActiveTabCDP) return;
110
+ const activeTab = tabsTitles.findIndex(({ title }: { title: string }) => {
111
+ return title === getlocalStorageActiveTabCDP;
112
+ });
113
+ if (activeTab === -1) {
114
+ setActiveTab(null, 0);
115
+ } else {
116
+ setActiveTab(null, activeTab);
130
117
  }
131
- }, [pathname, activeTab, price]); // tslint:disable-line:align
118
+ localStorage.removeItem('activeTabCDP');
119
+ }, [pathname, activeTab]); // tslint:disable-line:align
132
120
 
133
121
  const priceProps = {
134
122
  tabsTitles,
@@ -15,11 +15,6 @@
15
15
  &:nth-child(2)
16
16
  border-top-color: transparent;
17
17
 
18
- // ADV-70: full-width consumption/CO2 row in the sidebar Overview tab.
19
- .propertyFull
20
- flex-basis: 100%
21
- width: 100%
22
-
23
18
  .details
24
19
  display: flex
25
20
  flex-direction: row
@@ -1,5 +1,4 @@
1
1
  import React, { useState } from 'react';
2
- import classNames from 'classnames';
3
2
  import _get from 'lodash/get';
4
3
  import { IPropertiesProps, ICarPropElement } from '../../../framework/types/types';
5
4
  import { getActualHighlights } from '../../../framework/constants/highlights';
@@ -41,19 +40,18 @@ const Properties: React.FunctionComponent<IPropertiesProps> = ({ t, car, decorat
41
40
  : <div className={styles.empty}>{t(`sidebar.empty`)}</div>;
42
41
  };
43
42
 
44
- // ADV-70: hide a spec line whose value is "N/A", a zero ("0 mm", "0 kWh", "0 g CO2/km", ...),
45
- // null or empty — mirrors AccordionWidget.isHiddenSpecValue. de-DE thousands "." / decimal ","
46
- // are normalised so only a true zero magnitude hides; codes like HSN "0588" stay visible.
47
- const isHiddenSpecValue = (value: any): boolean => {
48
- if (value === null || value === undefined) return true;
49
- if (typeof value !== 'string') return false; // JSX / non-string content → always keep
50
- const trimmed = value.trim();
51
- if (trimmed === '' || trimmed === t('vehicleProps:value.na')) return true;
52
- const numeric = parseFloat(trimmed.replace(/\./g, '').replace(',', '.'));
53
- return numeric === 0;
54
- };
55
-
56
43
  const renderDetails = (): React.ReactNode => {
44
+ const sectionNames = [
45
+ t(`sidebar.dataEngine`),
46
+ t(`sidebar.dimensions`),
47
+ t(`sidebar.generalData`),
48
+ t(`sidebar.equipments`)
49
+ ];
50
+ const detailPropertiesList = ['cubicCapacity', 'torque', 'length', 'width', 'doors', 'fuel'];
51
+ const detailProperties = detailPropertiesList.map(
52
+ (prop: string) => (`${decoratedProps[prop].title}: ${decoratedProps[prop].value}`)
53
+ );
54
+
57
55
  const equipmentsObj = {
58
56
  ...addPrefixToKeys(car.lights, 'lights'),
59
57
  ...addPrefixToKeys(car.multimedia, 'multimedia'),
@@ -65,41 +63,14 @@ const Properties: React.FunctionComponent<IPropertiesProps> = ({ t, car, decorat
65
63
  .slice(0, 2)
66
64
  .map(prop => t(`cbd:${prop}`));
67
65
 
68
- // ADV-70: build each section's visible lines, dropping N/A/0 values. A section that loses
69
- // all its lines (e.g. "Maße & Abmessungen" when length+width are both N/A) is removed and
70
- // the next section flows up so there is no gap in the 2-column grid.
71
- const sectionsConfig: Array<{ title: string; props?: string[]; lines?: string[] }> = [
72
- { title: t(`sidebar.dataEngine`), props: ['cubicCapacity', 'torque'] },
73
- { title: t(`sidebar.dimensions`), props: ['length', 'width'] },
74
- { title: t(`sidebar.generalData`), props: ['doors', 'fuel'] },
75
- { title: t(`sidebar.equipments`), lines: equipmentsArr.length ? [equipmentsArr.join(', ')] : [] }
76
- ];
77
-
78
- const visibleSections = sectionsConfig
79
- .map(({ title, props, lines }) => ({
80
- title,
81
- lines: props
82
- ? props
83
- .filter(prop => decoratedProps[prop] && !isHiddenSpecValue(decoratedProps[prop].value))
84
- .map(prop => `${decoratedProps[prop].title}: ${decoratedProps[prop].value}`)
85
- : (lines || [])
86
- }))
87
- .filter(section => section.lines.length > 0);
88
-
89
- if (!visibleSections.length) return null;
90
-
91
- // Class by VISIBLE position, not original index: the first two sections form the top row
92
- // (detailsItemFirstLine — padding-top 7px), the rest the bottom row (detailsItemLastLine —
93
- // padding-top 20px). So a section promoted into the top row drops its 20px top padding,
94
- // while a section that stays in the bottom row keeps it.
66
+ detailProperties.push(equipmentsArr.join(', '));
95
67
  return (
96
68
  <div className={styles.details}>
97
- {visibleSections.map(({ title, lines }, i) => (
69
+ {sectionNames.map((title, i) => (
98
70
  <div key={i} className={i > 1 ? styles.detailsItemLastLine : styles.detailsItemFirstLine}>
99
71
  <h4 className={styles.detailsTitle}>{title}</h4>
100
- {lines.map((line, j) => (
101
- <span key={j} className={styles.detailsContent}>{line}</span>
102
- ))}
72
+ <span className={styles.detailsContent}>{detailProperties[0 + i * 2]}</span>
73
+ <span className={styles.detailsContent}>{detailProperties[1 + i * 2]}</span>
103
74
  </div>
104
75
  ))}
105
76
  </div>
@@ -107,24 +78,15 @@ const Properties: React.FunctionComponent<IPropertiesProps> = ({ t, car, decorat
107
78
  };
108
79
 
109
80
  const mainPropertiesList = getOverviewDetails(car.consumption.fuel);
110
- // ADV-70: the consumption/CO2 line is long let it span the full sidebar width on its own
111
- // row (and drop the fuel icon) instead of being squeezed into one 50% column.
112
- const mainProperties = mainPropertiesList.map((prop: string) => {
113
- const isConsumptionAlternateView = prop.startsWith('consumption') && prop.endsWith('AlternateView');
114
- return {
115
- icon: isConsumptionAlternateView ? '' : decoratedProps[prop].icon,
116
- description: decoratedProps[prop].value,
117
- fullWidth: isConsumptionAlternateView
118
- };
119
- });
81
+ const mainProperties = mainPropertiesList.map((prop: string) => ({ icon: decoratedProps[prop].icon, description: decoratedProps[prop].value }));
120
82
 
121
83
  const tabsTitles = [
122
84
  {
123
85
  title: `${t(`sidebar.overview`)}`,
124
86
  children: (
125
87
  <div className={`${styles.tabContentPadding} ${styles.tabContentOverviewPadding}`}>
126
- {mainProperties.map(({ fullWidth, ...property }: any, index: number) => (
127
- <VehicleProperty {...property} className={classNames(styles.property, fullWidth ? styles.propertyFull : '')} key={index} />
88
+ {mainProperties.map((property: any, index: number) => (
89
+ <VehicleProperty {...property} className={styles.property} key={index} />
128
90
  ))}
129
91
  </div>
130
92
  )
@@ -46,6 +46,8 @@ interface IProps {
46
46
  showDownPayment: boolean;
47
47
  financingFirstInstallment?: number | null;
48
48
  leasingFirstInstallment?: number | null;
49
+ sliderFinancingFirstInstallment?: number | null;
50
+ sliderLeasingFirstInstallment?: number | null;
49
51
  handleSentryInit?: () => void;
50
52
  }
51
53
 
@@ -312,11 +314,12 @@ class VehicleDetailedSlider extends Component<IProps, IState> {
312
314
  showDownPayment,
313
315
  financingFirstInstallment,
314
316
  leasingFirstInstallment,
317
+ sliderFinancingFirstInstallment,
318
+ sliderLeasingFirstInstallment,
315
319
  subModel,
316
320
  powerKW,
317
321
  powerPS,
318
322
  activeTab,
319
- financingConfig,
320
323
  onCarFavorite
321
324
  } = this.props;
322
325
  const { activeSlide } = this.state;
@@ -338,11 +341,12 @@ class VehicleDetailedSlider extends Component<IProps, IState> {
338
341
 
339
342
  const priceProps = {
340
343
  t,
341
- financingConfig,
342
344
  showNewLabel,
343
345
  showDownPayment,
344
346
  financingFirstInstallment,
345
347
  leasingFirstInstallment,
348
+ sliderFinancingFirstInstallment,
349
+ sliderLeasingFirstInstallment,
346
350
  historyPriceDifference: price ? price.historyPriceDifference : 0,
347
351
  historyPriceDifferencePerCent: price ? price.historyPriceDifferencePerCent : 0,
348
352
  activeTab
@@ -70,11 +70,6 @@
70
70
  +media-tablet-landscape-up()
71
71
  font-size: 9px;
72
72
 
73
- &.priceItemCategoryLanding,
74
- &.priceItemCategoryMain
75
- +media-tablet-landscape-up()
76
- font-size: 10px;
77
-
78
73
  & > span:hover
79
74
  background: rgba(196, 196, 196, 0.6);
80
75
 
@@ -127,43 +122,6 @@
127
122
  &.priceMtlActive
128
123
  transform: translateX(6px);
129
124
 
130
- // ADV-70: monthly label rendered before the rate (small, top-left of the number).
131
- .priceCurrentWrap
132
- display: inline-flex
133
- align-items: flex-start
134
-
135
- .priceMtlPrefix
136
- font-size: 10px
137
- line-height: 1.2
138
- margin-right: 3px
139
- color: rgba(76, 78, 100, 0.6)
140
- align-self: flex-start
141
- white-space: nowrap
142
-
143
- // ADV-88 (Marco): the monthly "mtl."/"mth." label sits INLINE to the LEFT of the rate (top-
144
- // aligned), not stacked above. NOTE: on the narrowest 4-up landing/main card (~256px) the
145
- // inline label can graze the card edge at full font; the wide comparable/CDP card fits with
146
- // room. (Marco asked to keep the rate/category fonts untouched — only the label moved.)
147
- .priceItemComparable
148
- .priceCurrentWrap
149
- flex-direction: row
150
- align-items: flex-start
151
- .priceMtlPrefix
152
- font-size: 8px
153
- line-height: 1
154
- margin-right: 2px
155
- align-self: flex-start
156
-
157
- // landing (/angebot): on desktop the cards are a narrow 4-up grid where the inline label would
158
- // overflow the price column — stack "mtl."/"mth." above the rate there (mobile stays inline above).
159
- .priceItemLanding
160
- +media-tablet-landscape-up()
161
- .priceCurrentWrap
162
- flex-direction: column
163
- align-items: flex-end
164
- .priceMtlPrefix
165
- margin-right: 0
166
-
167
125
  .priceNewBlock
168
126
  flex-shrink: 0;
169
127
  width: 18px
@@ -39,10 +39,7 @@ export interface IVehiclePriceItemProps {
39
39
  isMarge?: boolean;
40
40
  }
41
41
  class VehiclePriceItem extends React.Component<IVehiclePriceItemProps> {
42
- routeToActiveTab = () => {
43
- const { priceTitle } = this.props;
44
- localStorage.setItem('activeTabCDP', priceTitle);
45
- }
42
+ routeToActiveTab = () => {}
46
43
 
47
44
  render(): React.ReactNode {
48
45
  const {
@@ -81,9 +78,6 @@ class VehiclePriceItem extends React.Component<IVehiclePriceItemProps> {
81
78
  { [styles.priceItemSearch]: vehicleComponentName === 'search' },
82
79
  { [styles.priceItemRecently]: vehicleComponentName === 'recently' },
83
80
  { [styles.priceItemComparable]: vehicleComponentName === 'comparable' || vehicleComponentName === 'landing' || vehicleComponentName === 'main' },
84
- // landing (/angebot) cards are a narrow 4-up grid on desktop where the inline monthly
85
- // label would overflow — keep it stacked there, inline only on the wide single-column mobile.
86
- { [styles.priceItemLanding]: vehicleComponentName === 'landing' },
87
81
  { [styles.priceItemDisable]: isPriceDisable },
88
82
  { [styles.priceItemBuy]: isTotal }
89
83
  );
@@ -91,9 +85,7 @@ class VehiclePriceItem extends React.Component<IVehiclePriceItemProps> {
91
85
  const priceItemCategoryClassName = classnames(
92
86
  styles.priceItemCategory,
93
87
  { [styles.priceItemCategorySearch]: vehicleComponentName === 'search' || vehicleComponentName === 'myVehicles' },
94
- { [styles.priceItemCategoryComparable]: vehicleComponentName === 'comparable' },
95
- { [styles.priceItemCategoryLanding]: vehicleComponentName === 'landing' },
96
- { [styles.priceItemCategoryMain]: vehicleComponentName === 'main' }
88
+ { [styles.priceItemCategoryComparable]: vehicleComponentName === 'comparable' || vehicleComponentName === 'landing' || vehicleComponentName === 'main' }
97
89
  );
98
90
 
99
91
  return (
@@ -142,19 +134,15 @@ class VehiclePriceItem extends React.Component<IVehiclePriceItemProps> {
142
134
  )}
143
135
 
144
136
  {perMonthCurrent && (
145
- <span className={styles.priceCurrentWrap}>
146
- {/* ADV-70 (design): monthly label ("mtl."/"mth.") now sits BEFORE the rate
147
- instead of as a "/mtl." suffix after it. */}
148
- {priceSub && <span className={styles.priceMtlPrefix}>{priceSub.replace(/^\//, '')}</span>}
149
- <VehicleFormattedPrice
150
- numbersAfterDot={0}
151
- price={perMonthCurrent}
152
- postfix={postfix}
153
- className={styles.priceMtl}
154
- isNew={isStrikeShown}
155
- size='semimedium'
156
- />
157
- </span>
137
+ <VehicleFormattedPrice
138
+ numbersAfterDot={0}
139
+ price={perMonthCurrent}
140
+ postfix={postfix}
141
+ className={classnames(styles.priceMtl, { [styles.priceMtlActive]: !!priceSub })}
142
+ isNew={isStrikeShown}
143
+ size='semimedium'
144
+ sub={priceSub}
145
+ />
158
146
  )}
159
147
  </>
160
148
  ) : (