@licklist/design 0.69.6 → 0.69.7-dev.0

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 (156) hide show
  1. package/dist/affiliate/form/AffiliateForm.d.ts.map +1 -1
  2. package/dist/auth/Login/LoginComponent.js +2 -1
  3. package/dist/calendar/utils/index.d.ts +8 -2
  4. package/dist/calendar/utils/index.d.ts.map +1 -1
  5. package/dist/calendar/utils/index.js +9 -21
  6. package/dist/date-time-button/DateContent.d.ts.map +1 -1
  7. package/dist/date-time-button/DateContent.js +3 -3
  8. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.d.ts.map +1 -1
  9. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.js +6 -6
  10. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.js +2 -1
  11. package/dist/events/edit-event-modal/utils/getDefaultProductSet.d.ts.map +1 -1
  12. package/dist/events/edit-event-modal/utils/getDefaultProductSet.js +0 -1
  13. package/dist/events/event-card/EventCard.js +2 -2
  14. package/dist/events/event-card/utils.d.ts +3 -2
  15. package/dist/events/event-card/utils.d.ts.map +1 -1
  16. package/dist/events/event-card/utils.js +14 -14
  17. package/dist/iframe/activity-card/ActivityCard.d.ts +3 -1
  18. package/dist/iframe/activity-card/ActivityCard.d.ts.map +1 -1
  19. package/dist/iframe/activity-card/ActivityCard.js +8 -1
  20. package/dist/iframe/order-process/components/CategoryProduct/components/NumberInput/NumberInput.d.ts.map +1 -1
  21. package/dist/iframe/order-process/components/CategoryProduct/components/NumberInput/NumberInput.js +13 -0
  22. package/dist/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.d.ts.map +1 -1
  23. package/dist/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.js +2 -0
  24. package/dist/iframe/payment/order-items-table/utils/paymentSummary.d.ts.map +1 -1
  25. package/dist/iframe/ryft/RyftPaymentForm.d.ts.map +1 -1
  26. package/dist/iframe/ryft/utils/ryft-form.d.ts.map +1 -1
  27. package/dist/iframe/ryft/utils/ryft-form.js +3 -3
  28. package/dist/layout/DropDown.d.ts +2 -1
  29. package/dist/layout/DropDown.d.ts.map +1 -1
  30. package/dist/notification/email-template/control/EmailTemplateControl.d.ts.map +1 -1
  31. package/dist/notification/email-template/control/EmailTemplateControl.js +3 -0
  32. package/dist/product-set/control/DateInput.d.ts.map +1 -1
  33. package/dist/product-set/control/DateInput.js +6 -5
  34. package/dist/product-set/form/ProductCategoriesControl.d.ts.map +1 -1
  35. package/dist/product-set/form/ProductCategoriesControl.js +48 -2
  36. package/dist/product-set/form/ProductSetForm.d.ts +4 -1
  37. package/dist/product-set/form/ProductSetForm.d.ts.map +1 -1
  38. package/dist/product-set/form/ProductSetForm.js +57 -2
  39. package/dist/product-set/form/ProductZonesControl.d.ts.map +1 -1
  40. package/dist/product-set/form/ProductZonesControl.js +0 -2
  41. package/dist/product-set/form/ProductsControl.js +1 -0
  42. package/dist/product-set/form/SelectCategoryModal.d.ts +12 -0
  43. package/dist/product-set/form/SelectCategoryModal.d.ts.map +1 -1
  44. package/dist/product-set/form/SelectCategoryModal.js +1 -1
  45. package/dist/product-set/form/SubProductsControl.d.ts.map +1 -1
  46. package/dist/product-set/form/SubProductsControl.js +0 -3
  47. package/dist/product-set/form/VenueMapsControl.d.ts.map +1 -1
  48. package/dist/product-set/form/VenueMapsControl.js +0 -3
  49. package/dist/product-set/product/ProductControl.d.ts.map +1 -1
  50. package/dist/product-set/product/booking-management/ProductBookingManagementControl.d.ts.map +1 -1
  51. package/dist/product-set/product/booking-management/ProductBookingManagementControl.js +6 -0
  52. package/dist/product-set/product/deposit/ProductDepositControl.d.ts.map +1 -1
  53. package/dist/product-set/product/deposit/ProductDepositControl.js +3 -0
  54. package/dist/product-set/product/duration/ProductDurationControl.d.ts.map +1 -1
  55. package/dist/product-set/product/duration/ProductDurationControl.js +6 -0
  56. package/dist/product-set/product/price/ProductPriceControl.d.ts.map +1 -1
  57. package/dist/product-set/product/price/ProductPriceControl.js +3 -0
  58. package/dist/product-set/product/quantity/ProductQuantityConstantControl.d.ts.map +1 -1
  59. package/dist/product-set/product/quantity/ProductQuantityConstantControl.js +6 -0
  60. package/dist/product-set/product/quantity/ProductQuantityControl.d.ts.map +1 -1
  61. package/dist/product-set/product/quantity/ProductQuantityControl.js +6 -0
  62. package/dist/product-set/product/quantity/ProductQuantityRechargingControl.d.ts.map +1 -1
  63. package/dist/product-set/product/quantity/ProductQuantityRechargingControl.js +4 -1
  64. package/dist/product-set/product-category/ProductCategoryControl.d.ts.map +1 -1
  65. package/dist/product-set/product-category/ProductCategoryControl.js +12 -0
  66. package/dist/recurrence-input/RecurrenceEndInput.d.ts.map +1 -1
  67. package/dist/recurrence-input/RecurrenceEndInput.js +3 -0
  68. package/dist/recurring-date-picker-input/RecurrenceEndInput.d.ts.map +1 -1
  69. package/dist/resource/form/components/CapacityControl.d.ts.map +1 -1
  70. package/dist/resource/form/components/CapacityControl.js +3 -0
  71. package/dist/resource/form/components/SortControl.d.ts.map +1 -1
  72. package/dist/resource/form/components/SortControl.js +3 -0
  73. package/dist/sales/booking/results/components/ResultCard.d.ts.map +1 -1
  74. package/dist/sales/booking/results/components/ResultCard.js +0 -2
  75. package/dist/sales/coupon/control/CouponFormControl.d.ts.map +1 -1
  76. package/dist/sales/coupon/control/CouponFormControl.js +21 -0
  77. package/dist/setting/admin/PaymentFeeForm.d.ts.map +1 -1
  78. package/dist/setting/admin/PaymentFeeForm.js +16 -1
  79. package/dist/setting/dashboard/DashboardSettingForm.d.ts.map +1 -1
  80. package/dist/setting/dashboard/DashboardSettingForm.js +4 -1
  81. package/dist/snippet/snippet-template/preview/Preview.d.ts.map +1 -1
  82. package/dist/snippet/snippet-template/preview/Preview.js +6 -0
  83. package/dist/sortable-tree/SortableTreeItem.d.ts +2 -1
  84. package/dist/sortable-tree/SortableTreeItem.d.ts.map +1 -1
  85. package/dist/sortable-tree/SortableTreeItem.js +10 -4
  86. package/dist/static/CurrencyNumberInput.d.ts.map +1 -1
  87. package/dist/static/CurrencyNumberInput.js +3 -0
  88. package/dist/static/form-number-input/FormNumberInput.d.ts.map +1 -1
  89. package/dist/static/form-number-input/FormNumberInput.js +3 -0
  90. package/dist/static/number-input/NumberInput.d.ts.map +1 -1
  91. package/dist/static/number-input/NumberInput.js +3 -0
  92. package/dist/styles/availability-indicator/AvailabilityIndicator.scss +9 -0
  93. package/dist/styles/iframe-external-modal/IframeExternalModal.scss +2 -2
  94. package/dist/styles/product-set/ProductSetForm.scss +22 -0
  95. package/dist/styles/ryft-payment-form/RyftPaymentForm.scss +1 -3
  96. package/dist/styles/sales/BookingResults.scss +1 -1
  97. package/dist/zone/form/components/GameDurationControl.d.ts.map +1 -1
  98. package/dist/zone/form/components/GameDurationControl.js +3 -0
  99. package/dist/zone/form/components/SortControl.d.ts.map +1 -1
  100. package/dist/zone/form/components/SortControl.js +3 -0
  101. package/package.json +8 -6
  102. package/src/affiliate/form/AffiliateForm.tsx +1 -0
  103. package/src/auth/Login/LoginComponent.tsx +1 -1
  104. package/src/calendar/utils/index.ts +17 -26
  105. package/src/date-time-button/DateContent.tsx +3 -3
  106. package/src/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.tsx +12 -10
  107. package/src/events/edit-event-modal/utils/getDefaultProductSet.ts +0 -1
  108. package/src/events/event-card/EventCard.tsx +2 -2
  109. package/src/events/event-card/utils.ts +16 -21
  110. package/src/iframe/activity-card/ActivityCard.tsx +6 -0
  111. package/src/iframe/order-process/components/CategoryProduct/components/NumberInput/NumberInput.tsx +9 -0
  112. package/src/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.tsx +1 -0
  113. package/src/iframe/payment/order-items-table/utils/paymentSummary.tsx +1 -0
  114. package/src/iframe/ryft/RyftPaymentForm.tsx +2 -5
  115. package/src/iframe/ryft/utils/ryft-form.ts +5 -3
  116. package/src/layout/DropDown.tsx +1 -1
  117. package/src/notification/email-template/control/EmailTemplateControl.tsx +1 -0
  118. package/src/product-set/control/DateInput.tsx +5 -2
  119. package/src/product-set/form/ProductCategoriesControl.tsx +37 -1
  120. package/src/product-set/form/ProductSetForm.tsx +15 -3
  121. package/src/product-set/form/ProductZonesControl.tsx +1 -4
  122. package/src/product-set/form/SelectCategoryModal.tsx +2 -2
  123. package/src/product-set/form/SubProductsControl.tsx +0 -3
  124. package/src/product-set/form/VenueMapsControl.tsx +0 -3
  125. package/src/product-set/product/ProductControl.tsx +0 -1
  126. package/src/product-set/product/advanced-options/AdvancedOptions.tsx +1 -1
  127. package/src/product-set/product/booking-management/ProductBookingManagementControl.tsx +2 -0
  128. package/src/product-set/product/deposit/ProductDepositControl.tsx +1 -0
  129. package/src/product-set/product/duration/ProductDurationControl.tsx +2 -0
  130. package/src/product-set/product/price/ProductPriceControl.tsx +1 -0
  131. package/src/product-set/product/quantity/ProductQuantityConstantControl.tsx +2 -0
  132. package/src/product-set/product/quantity/ProductQuantityControl.tsx +2 -0
  133. package/src/product-set/product/quantity/ProductQuantityRechargingControl.tsx +1 -0
  134. package/src/product-set/product-category/ProductCategoryControl.tsx +4 -0
  135. package/src/product-set/product-zone/ProductZoneControl.tsx +1 -1
  136. package/src/recurrence-input/RecurrenceEndInput.tsx +1 -0
  137. package/src/recurring-date-picker-input/RecurrenceEndInput.tsx +1 -0
  138. package/src/resource/form/components/CapacityControl.tsx +1 -0
  139. package/src/resource/form/components/SortControl.tsx +1 -0
  140. package/src/sales/booking/results/components/ResultCard.tsx +0 -2
  141. package/src/sales/coupon/control/CouponFormControl.tsx +7 -0
  142. package/src/setting/admin/PaymentFeeForm.tsx +5 -0
  143. package/src/setting/dashboard/DashboardSettingForm.tsx +1 -0
  144. package/src/snippet/snippet-template/preview/Preview.tsx +6 -0
  145. package/src/sortable-tree/SortableTreeItem.tsx +6 -0
  146. package/src/static/CurrencyNumberInput.tsx +1 -0
  147. package/src/static/form-number-input/FormNumberInput.tsx +1 -0
  148. package/src/static/number-input/NumberInput.tsx +1 -0
  149. package/src/styles/availability-indicator/AvailabilityIndicator.scss +9 -0
  150. package/src/styles/iframe-external-modal/IframeExternalModal.scss +2 -2
  151. package/src/styles/product-set/ProductSetForm.scss +22 -0
  152. package/src/styles/ryft-payment-form/RyftPaymentForm.scss +1 -3
  153. package/src/styles/sales/BookingResults.scss +1 -1
  154. package/src/zone/form/components/GameDurationControl.tsx +1 -0
  155. package/src/zone/form/components/SortControl.tsx +1 -0
  156. package/yarn.lock +31 -50
@@ -6,9 +6,9 @@ import {
6
6
  } from '@licklist/core/dist/Config'
7
7
  import { getDayWithOrdinal } from '@licklist/plugins/dist/utils/formatDate'
8
8
  import clsx from 'clsx'
9
- import { isToday, isTomorrow } from 'date-fns'
10
9
  import { DateTime } from 'luxon'
11
10
  import { useTranslation } from 'react-i18next'
11
+ import { isToday, isTomorrow } from '@licklist/plugins/dist'
12
12
  import { DateTimeButtonProps, Variant } from './DateTimeButton'
13
13
 
14
14
  type DateContentProps = Pick<
@@ -55,9 +55,9 @@ export const DateContent = ({
55
55
  }
56
56
 
57
57
  const getDate = (date: DateTime): string => {
58
- if (isToday(date.toJSDate())) return 'today'
58
+ if (isToday(date)) return 'today'
59
59
 
60
- if (isTomorrow(date.toJSDate())) return 'tomorrow'
60
+ if (isTomorrow(date)) return 'tomorrow'
61
61
 
62
62
  return date.toFormat(DAY_OF_WEEK)
63
63
  }
@@ -5,6 +5,7 @@ import { useId } from '@react-aria/utils'
5
5
  import { Controller, useFormContext } from 'react-hook-form'
6
6
  import { HasPermissionProp } from '@licklist/plugins/dist/types/permission/Permission'
7
7
  import { ProductSet } from '@licklist/core/dist/DataMapper/Product/ProductSetDataMapper'
8
+ import { uniqBy } from 'lodash'
8
9
  import { getTypeHeadItemsFromMenus } from '../../../../product-set/utils'
9
10
  import { ConfirmModal } from '../../../../modals/confirmation/ConfirmModal'
10
11
  import { EditEventFormValues } from '../EditEventForm/EditEventForm'
@@ -52,16 +53,17 @@ export const SelectEventProductSet = ({
52
53
  const productSetId = watch('productSetId')
53
54
  const editedProductSet = watch('editedProductSet')
54
55
 
55
- const typeheadValues = getTypeHeadItemsFromMenus(
56
- editedProductSet
57
- ? productSets.map((productSet) => {
58
- if (productSet.id === editedProductSet.id) {
59
- return editedProductSet
60
- }
61
-
62
- return productSet
63
- })
64
- : productSets,
56
+ const typeheadValues = uniqBy(
57
+ getTypeHeadItemsFromMenus(
58
+ editedProductSet
59
+ ? productSets.map((productSet) =>
60
+ productSet.id === editedProductSet.id
61
+ ? editedProductSet
62
+ : productSet,
63
+ )
64
+ : productSets,
65
+ ),
66
+ (item) => item.id,
65
67
  )
66
68
  const selectedProductSetTypeheadValue = productSetId
67
69
  ? typeheadValues?.find((typeheadValue) => typeheadValue.id === productSetId)
@@ -39,7 +39,6 @@ export const getDefaultValues = (
39
39
  ...product,
40
40
  subProducts: subProducts?.map(({ ...subProducts }) => ({
41
41
  ...subProducts,
42
- originalProductId: null,
43
42
  productCategoryId: undefined,
44
43
  })),
45
44
  productCategoryId: undefined,
@@ -23,7 +23,7 @@ import { Sale } from '../../types/bookings'
23
23
  import { TipTapEditor } from '../../tiptap-editor/TipTapEditor'
24
24
  import {
25
25
  EVENT_DESCRIPTION_SIZE,
26
- formatContentWithoutTags,
26
+ formatContent,
27
27
  getStatisticInfo,
28
28
  } from './utils'
29
29
  import { ReactComponent as ChartBarIcon } from '../../assets/dashboard/chartBar.svg'
@@ -66,7 +66,7 @@ export function EventCard({
66
66
  const { formatNumber, formatDate } = useIntl()
67
67
  const { totalViews, ...statistics } = getStatisticInfo(eventStatistic, date)
68
68
  const memoedContent = useMemo(
69
- () => formatContentWithoutTags(description, EVENT_DESCRIPTION_SIZE),
69
+ () => formatContent(description, EVENT_DESCRIPTION_SIZE),
70
70
  [description],
71
71
  )
72
72
 
@@ -2,30 +2,25 @@ import { DATE_FORMAT, DATE_TIME_FULL_FORMAT } from '@licklist/core/dist/Config'
2
2
  import { EventStatistic } from '@licklist/core/dist/DataMapper/Provider/EventStatisticDataMapper'
3
3
  import { DateTime } from 'luxon'
4
4
 
5
- export function formatContent(content, maxSymbols) {
6
- if (!content) return ''
7
- if (content.length > maxSymbols) return `${content.slice(0, maxSymbols)}...`
8
- return content
9
- }
5
+ export const MIN_EVENT_DESCRIPTION_SIZE = 150;
6
+ export const EVENT_DESCRIPTION_SIZE = 350;
7
+ export const EMOJI_REGEX = /<span data-emoji-replacer=""><img[^>]*alt="([^"]+)"[^>]*><\/span>/g;
10
8
 
11
- export const formatContentWithoutTags = (
12
- content,
13
- maxLength = EVENT_DESCRIPTION_SIZE,
14
- ) => {
15
- if (!content) return ''
16
- if (content < maxLength) return content
17
- const text = content.replace(/<[^>]*>/g, '')
18
- const trimmedText = text
19
- .trim()
20
- .replace(/&nbsp;|[^a-zA-Z0-9\s]/g, '')
21
- .replace(/\s\s+/g, ' ')
9
+ export const formatContent = (content, maxLength = EVENT_DESCRIPTION_SIZE) => {
10
+ if (!content) return '';
22
11
 
23
- const words = trimmedText.slice(0, maxLength).split(' ')
24
- const index = String(content).indexOf(words[words.length - 2])
25
- return content.slice(0, index).concat('...')
26
- }
12
+ const replacedContent = replaceEmojiImagesWithText(content);
13
+
14
+ if (replacedContent.length <= maxLength) {
15
+ return replacedContent;
16
+ }
27
17
 
28
- export const EVENT_DESCRIPTION_SIZE = 350
18
+ return replacedContent.slice(0, maxLength).concat('...');
19
+ };
20
+
21
+ function replaceEmojiImagesWithText(text) {
22
+ return text.replace(EMOJI_REGEX, (_, emojiText) => emojiText);
23
+ }
29
24
 
30
25
  /**
31
26
  * Calculate the total number of views from the given dates and event statistic.
@@ -1,6 +1,8 @@
1
1
  import { ReactNode } from 'react'
2
2
  import clsx from 'clsx'
3
3
  import { Image } from '@licklist/core/dist/DataMapper/Media/ImageDataMapper'
4
+ import { ZoneResourcesAvailability } from '@licklist/core/dist/DataMapper/Order/ZoneResourcesAvailabilityDataMapper'
5
+ import { AvailabilityIndicator } from '../../availability-indicator'
4
6
 
5
7
  export const LAYOUT_GRID = 'grid'
6
8
  export const LAYOUT_LIST = 'list'
@@ -15,6 +17,7 @@ export type ActivityCardProps = {
15
17
  layout?: typeof LAYOUT_GRID | typeof LAYOUT_LIST
16
18
  availableTimes?: string | null
17
19
  image?: Image | null
20
+ resources?: ZoneResourcesAvailability
18
21
  }
19
22
 
20
23
  export const ActivityCard = ({
@@ -27,6 +30,7 @@ export const ActivityCard = ({
27
30
  onSelect,
28
31
  isSelected,
29
32
  layout = LAYOUT_GRID,
33
+ resources,
30
34
  }: ActivityCardProps) => {
31
35
  if (layout === LAYOUT_GRID) {
32
36
  return (
@@ -46,6 +50,7 @@ export const ActivityCard = ({
46
50
  {description && (
47
51
  <div className='mt-2 activity-card-description'>{description}</div>
48
52
  )}
53
+ {resources && <AvailabilityIndicator resources={resources} />}
49
54
  </div>
50
55
  </button>
51
56
  )
@@ -71,6 +76,7 @@ export const ActivityCard = ({
71
76
  {description && (
72
77
  <div className='mt-2 activity-card-description'>{description}</div>
73
78
  )}
79
+ {resources && <AvailabilityIndicator resources={resources} />}
74
80
  </div>
75
81
 
76
82
  <hr className='list-activity-card-hr' />
@@ -89,6 +89,7 @@ export const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(
89
89
  <FormControl
90
90
  type='number'
91
91
  onChange={(e) => handleChangeValue(Number(e.target.value))}
92
+ onWheel={(event) => event.currentTarget.blur()}
92
93
  value={value}
93
94
  min={0}
94
95
  max={max}
@@ -101,6 +102,14 @@ export const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(
101
102
  <button
102
103
  type='button'
103
104
  onClick={handleArrowUpClick}
105
+ onWheel={(event) => event.currentTarget.blur()}
106
+ onFocus={(event) =>
107
+ event.target.addEventListener(
108
+ 'wheel',
109
+ (event) => event.preventDefault(),
110
+ { passive: false },
111
+ )
112
+ }
104
113
  className={`payment-number-input__btn-up ${
105
114
  plusButtonGreyedOut && 'disabled-number-input-button'
106
115
  }`}
@@ -51,6 +51,7 @@ export const ProductQuantityInput = ({
51
51
  hasDeposit: category.allowDeposits && product?.deposit < product.price,
52
52
  price: product.price,
53
53
  productCategoryId: category.id,
54
+ zoneId: category.zone?.id,
54
55
  quantity,
55
56
  capacity: product?.capacity,
56
57
  })
@@ -61,6 +61,7 @@ const processedPaymentSummary = ({
61
61
  const total = calculateTotalPrice(order, externalPaymentDetail)
62
62
 
63
63
  const totalDiscount = calculateTotalDiscount(order.payments)
64
+
64
65
  let summaryItems: SummaryItem[] = [
65
66
  {
66
67
  translateKey: AMOUNT_TOTAL,
@@ -219,12 +219,9 @@ export const RyftPaymentForm = ({
219
219
  onSubmit={methods.handleSubmit(handleSubmit)}
220
220
  className='ryft-payment-form'
221
221
  >
222
- <div className='form-disable-box' id="form-disable-box"/>
222
+ <div className='form-disable-box' id='form-disable-box' />
223
223
  <div className='submit-button-wrapper mt-4 p-1'>
224
- <Button
225
- type='submit'
226
- disabled={isBtnDisabled || !isValid}
227
- >
224
+ <Button type='submit' disabled={isBtnDisabled || !isValid}>
228
225
  {isBtnDisabled && <ButtonLoader />}
229
226
  {t('Design:buyNow')}
230
227
  </Button>
@@ -61,17 +61,19 @@ export const injectComponentsInRyftForm = ({
61
61
  divider.id = 'mobile-pay-divider'
62
62
  container.id = 'mobile-pay-divider-container'
63
63
  container.append(dividerText, divider)
64
- const payIframe = document.getElementById("ryft-pay-iframe");
64
+ const payIframe = document.getElementById('ryft-pay-iframe')
65
65
  if (payIframe) {
66
66
  const formBox = document.getElementById('form-disable-box')
67
67
  if (formBox) {
68
- formBox.style.display = isDisableButton ? "block" : "none"
68
+ formBox.style.display = isDisableButton ? 'block' : 'none'
69
69
  }
70
70
 
71
71
  const googleButton = document.getElementById(
72
72
  'gpay-button-online-api-id',
73
73
  ) as HTMLButtonElement
74
- const appleButton =document.getElementById("ryft-pay-apple-pay-button") as HTMLButtonElement
74
+ const appleButton = document.getElementById(
75
+ 'ryft-pay-apple-pay-button',
76
+ ) as HTMLButtonElement
75
77
  if (googleButton) {
76
78
  googleButton.disabled = isDisableButton
77
79
  googleButton.style.opacity = isDisableButton ? '1' : '0.6'
@@ -1,4 +1,4 @@
1
- import { forwardRef } from 'react'
1
+ import React, { forwardRef } from 'react'
2
2
 
3
3
  interface Props {
4
4
  children?: React.ReactNode | React.ReactNode[]
@@ -434,6 +434,7 @@ export const EmailTemplateControl = forwardRef(
434
434
  `templateOptionValues.${option?.id}.value`,
435
435
  )}
436
436
  type='number'
437
+ onWheel={(event) => event.currentTarget.blur()}
437
438
  placeholder={t(`Design:${option.name}`)}
438
439
  id={option.name + option.id}
439
440
  defaultValue={option.selectedValue || ''}
@@ -195,6 +195,8 @@ export const DateInput = ({
195
195
  }, 100)
196
196
  }
197
197
 
198
+ const errorMessage = errors.menuRecurrences?.message || errors.menuRecurrences?.root?.message
199
+
198
200
  return (
199
201
  <Form.Group>
200
202
  <Form.Label>
@@ -247,7 +249,8 @@ export const DateInput = ({
247
249
  menuRecurrence={menuRecurrence}
248
250
  onEdit={() => handleOnEdit(menuRecurrence, index)}
249
251
  errorMessage={
250
- errors?.menuRecurrences?.[`${index}`]?.availableTimes?.message
252
+ errors?.menuRecurrences?.[`${index}`]?.availableTimes
253
+ ?.message || errors?.menuRecurrences?.[`${index}`]?.message
251
254
  }
252
255
  />
253
256
  ))}
@@ -282,7 +285,7 @@ export const DateInput = ({
282
285
  />
283
286
 
284
287
  <div className='manual-form-error'>
285
- {errors.menuRecurrences?.message}
288
+ {errorMessage}
286
289
  </div>
287
290
  </div>
288
291
  </OverlayTrigger>
@@ -8,6 +8,7 @@ import {
8
8
  useFormContext,
9
9
  useWatch,
10
10
  } from 'react-hook-form'
11
+ import { FaBars, FaBowlingBall, FaCalendar, FaTicketAlt } from 'react-icons/fa'
11
12
  import { useTranslation } from 'react-i18next'
12
13
  import { useSensor, MouseSensor } from '@dnd-kit/core'
13
14
  import {
@@ -25,7 +26,11 @@ import { ProductCategoryControl } from '../product-category'
25
26
  import { ProductCategory } from '../types'
26
27
  import { ProductsControl } from './ProductsControl'
27
28
  import { ProductSetFormValues, WithIsLoading } from './ProductSetForm'
28
- import { SelectCategoryModal } from './SelectCategoryModal'
29
+ import {
30
+ SelectCategoryModal,
31
+ CATEGORY_TYPES_NAMES,
32
+ CategoryConfig,
33
+ } from './SelectCategoryModal'
29
34
  import { ProductSetLoadingContext } from './context'
30
35
  import { VenueMapSetModal } from './VenueMapSetModal'
31
36
  import { moveArrayElements, sortArrayByIndex } from '../utils'
@@ -33,6 +38,29 @@ import { useSortableTreeFunctions } from '../hooks/useSortableTreeFunctions'
33
38
  // @TODO not for first release
34
39
  // import Popover from "./ProductSetFormPopover";
35
40
 
41
+ const CATEGORIES_TYPE: Partial<Record<CategoryType, CategoryConfig>> = {
42
+ [CATEGORY_TYPES_NAMES.tickets]: {
43
+ label: 'tickets',
44
+ icon: <FaTicketAlt color='#0e8ce2' size={10} />,
45
+ },
46
+ [CATEGORY_TYPES_NAMES.bookings]: {
47
+ label: 'bookings',
48
+ icon: <FaCalendar color='#0e8ce2' size={10} />,
49
+ },
50
+ [CATEGORY_TYPES_NAMES.menuItems]: {
51
+ label: 'menuItems',
52
+ icon: <FaBars color='#0e8ce2' size={10} />,
53
+ },
54
+ [CATEGORY_TYPES_NAMES.game]: {
55
+ label: 'game',
56
+ icon: <FaBowlingBall color='#0e8ce2' size={10} />,
57
+ },
58
+ [CATEGORY_TYPES_NAMES.fixedDuration]: {
59
+ label: 'fixedDuration',
60
+ icon: <FaCalendar color='#0e8ce2' size={10} />,
61
+ },
62
+ }
63
+
36
64
  interface ProductCategoriesControlProps extends WithIsLoading {
37
65
  stepIndex: number
38
66
  isOverrides?: boolean
@@ -228,6 +256,8 @@ export function ProductCategoriesControl({
228
256
  setIsExpanded(productCategoryId)
229
257
  }
230
258
 
259
+ const categoryType = CATEGORIES_TYPE[productCategory.type]
260
+
231
261
  return (
232
262
  <Controller
233
263
  key={`product-category-${productCategory._id}`}
@@ -272,6 +302,12 @@ export function ProductCategoriesControl({
272
302
  )}
273
303
  modalClass={ProductSetModalClasses.category}
274
304
  isNewAdded={showCategoryModal}
305
+ itemButton={
306
+ <div className='btn-outline-primary item-icon sm border border-primary rounded-sm'>
307
+ {categoryType.icon}
308
+ <span className='ml-2'>{t(categoryType.label)}</span>
309
+ </div>
310
+ }
275
311
  body={
276
312
  <ProductCategoryControl
277
313
  isLoading={isLoading}
@@ -1,4 +1,4 @@
1
- import { useEffect } from 'react'
1
+ import { useEffect, useState } from 'react'
2
2
  import { FormValues } from '@licklist/plugins/dist/types/services/Form/hook-form-service'
3
3
  import { Button, Form, Col, Row } from 'react-bootstrap'
4
4
  import { FormProvider, useForm } from 'react-hook-form'
@@ -12,7 +12,7 @@ import { isEqual } from 'lodash'
12
12
  import { ProviderBookingManagementSetting } from '@licklist/core/dist/DataMapper/Provider/ProviderBookingManagementSettingDataMapper'
13
13
  import { Zone } from '@licklist/core/dist/DataMapper/Provider/ZoneDataMapper'
14
14
  import { WorkHour } from '@licklist/core/dist/DataMapper/Provider/WorkHourDataMapper'
15
- import { transformErrorToMessage } from '@licklist/plugins'
15
+ import { transformErrorToMessage } from '@licklist/plugins/dist/utils/error'
16
16
  import { Dialog, useDialogContext } from '../../modals/dialog'
17
17
  import {
18
18
  ProductSetControl,
@@ -23,16 +23,21 @@ import { Step } from '../types'
23
23
  import { ProductSetContextProvider, ProductSetLoadingContext } from './context'
24
24
  import { SelectItem } from '../../types/generic/SelectItem'
25
25
  import { checkAvailableTimesErrors, getFilteredTemplates } from '../utils'
26
+ import { ErrorModal } from '../../iframe/order-process/components/ErrorModal'
26
27
 
27
28
  export interface WithIsLoading {
28
29
  isLoading: boolean
29
30
  }
31
+ export interface WithIdOptional {
32
+ id?: number
33
+ }
34
+
30
35
  export interface WithId {
31
36
  id: number
32
37
  }
33
38
  export interface ProductSetFormValues
34
39
  extends FormValues,
35
- WithId,
40
+ WithIdOptional,
36
41
  ProductSetControlValues {
37
42
  steps: Step[]
38
43
  isOverrides?: boolean
@@ -85,6 +90,7 @@ export function ProductSetForm({
85
90
  onApproveDialog,
86
91
  onDeclineDialog,
87
92
  } = useDialogContext()
93
+ const [errorMessage, setErrorMessage] = useState('')
88
94
 
89
95
  const form = useForm<ProductSetFormValues>({
90
96
  defaultValues,
@@ -166,6 +172,12 @@ export function ProductSetForm({
166
172
  onDecline={onDeclineDialog}
167
173
  />
168
174
 
175
+ <ErrorModal
176
+ message={errorMessage}
177
+ isOpen={!!errorMessage}
178
+ onClose={() => setErrorMessage('')}
179
+ />
180
+
169
181
  <FormProvider {...form}>
170
182
  <Form onSubmit={form.handleSubmit(submitHandler(onSubmitAndRedirect))}>
171
183
  <ProductSetLoadingContext.Consumer>
@@ -1,7 +1,4 @@
1
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
- // @ts-nocheck
3
- import React, { useContext, useState } from 'react'
4
-
1
+ import { useContext, useState } from 'react'
5
2
  import {
6
3
  ArrayPath,
7
4
  Controller,
@@ -25,7 +25,7 @@ import {
25
25
  } from 'react-icons/fa'
26
26
  import { ProductSetLoadingContext } from './context'
27
27
 
28
- const CATEGORY_TYPES_NAMES = {
28
+ export const CATEGORY_TYPES_NAMES = {
29
29
  menuItems: CATEGORY_TYPE_MENU_ITEMS,
30
30
  tickets: CATEGORY_TYPE_TICKETS,
31
31
  bookings: CATEGORY_TYPE_BOOKINGS,
@@ -33,7 +33,7 @@ const CATEGORY_TYPES_NAMES = {
33
33
  fixedDuration: CATEGORY_TYPE_FIXED_DURATION,
34
34
  } as const
35
35
 
36
- type CategoryConfig = { label: string; icon: ReactElement }
36
+ export type CategoryConfig = { label: string; icon: ReactElement }
37
37
 
38
38
  const MAIN_CATEGORIES: Partial<Record<CategoryType, CategoryConfig>> = {
39
39
  [CATEGORY_TYPES_NAMES.tickets]: {
@@ -70,9 +70,6 @@ export function SubProductsControl({
70
70
  images: subProducts[index]?.images as Image[],
71
71
  }
72
72
  // @ts-expect-error TS2345
73
- // @TODO fix prod type error
74
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
75
- // @ts-ignore
76
73
  append(subProductCopy)
77
74
  }}
78
75
  />
@@ -46,9 +46,6 @@ export const VenueMapsControl = ({
46
46
  url={image.url}
47
47
  name={name}
48
48
  points={points}
49
- // @TODO fix prod type error
50
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
51
- // @ts-ignore
52
49
  products={products}
53
50
  pointProducts={pointProducts}
54
51
  onPointProductsChange={onPointProductsChange}
@@ -34,7 +34,6 @@ import {
34
34
  } from 'react-hook-form'
35
35
  import { useTranslation } from 'react-i18next'
36
36
  import { useImages } from '@licklist/plugins/dist/hooks/Media/useImages'
37
-
38
37
  import {
39
38
  Image,
40
39
  IMAGE_TYPE_IMAGE,
@@ -1,4 +1,4 @@
1
- import React, { useContext } from 'react'
1
+ import { useContext } from 'react'
2
2
  import { Col, Form } from 'react-bootstrap'
3
3
  import { Controller, Path, useFormContext } from 'react-hook-form'
4
4
  import { HookFormService } from '@licklist/plugins'
@@ -86,6 +86,7 @@ export function ProductBookingManagementControl<T extends FormValues>(
86
86
  <Form.Control
87
87
  ref={ref}
88
88
  type='number'
89
+ onWheel={(event) => event.currentTarget.blur()}
89
90
  min={0}
90
91
  step={1}
91
92
  value={value as string}
@@ -129,6 +130,7 @@ export function ProductBookingManagementControl<T extends FormValues>(
129
130
  <Form.Control
130
131
  ref={ref}
131
132
  type='number'
133
+ onWheel={(event) => event.currentTarget.blur()}
132
134
  min='0'
133
135
  step='1'
134
136
  value={value as string}
@@ -50,6 +50,7 @@ export function ProductDepositControl<T extends FormValues>(
50
50
  <Form.Control
51
51
  ref={ref}
52
52
  type='number'
53
+ onWheel={(event) => event.currentTarget.blur()}
53
54
  min={0}
54
55
  max={Number(totalPrice)}
55
56
  step='0.01'
@@ -91,6 +91,7 @@ export const ProductDurationControl = <T,>({
91
91
  <Form.Control
92
92
  type='number'
93
93
  min={0}
94
+ onWheel={(event) => event.currentTarget.blur()}
94
95
  step={1}
95
96
  value={durationHours}
96
97
  disabled={disabled}
@@ -127,6 +128,7 @@ export const ProductDurationControl = <T,>({
127
128
  type='number'
128
129
  min={0}
129
130
  step={1}
131
+ onWheel={(event) => event.currentTarget.blur()}
130
132
  disabled={disabled}
131
133
  value={durationMinutes}
132
134
  isInvalid={isInvalid}
@@ -59,6 +59,7 @@ export function ProductPriceControl<T extends FormValues>({
59
59
  ref={ref}
60
60
  type='number'
61
61
  min={0}
62
+ onWheel={(event) => event.currentTarget.blur()}
62
63
  max={999999.99}
63
64
  step='0.01'
64
65
  value={value as string}
@@ -111,6 +111,7 @@ export function ProductQuantityConstantControl<T extends FormValues>(
111
111
  type='number'
112
112
  min={0}
113
113
  step={1}
114
+ onWheel={(event) => event.currentTarget.blur()}
114
115
  value={value as string}
115
116
  isInvalid={HookFormService.isInvalid<T>(
116
117
  `${fieldNamePrefix}.totalQuantity` as Path<T>,
@@ -165,6 +166,7 @@ export function ProductQuantityConstantControl<T extends FormValues>(
165
166
  type='number'
166
167
  min={0}
167
168
  step={1}
169
+ onWheel={(event) => event.currentTarget.blur()}
168
170
  value={value as string}
169
171
  onChange={onChange}
170
172
  onFocus={onFocus}
@@ -85,6 +85,7 @@ export function ProductQuantityControl<T extends FormValues>(
85
85
  type='number'
86
86
  min={0}
87
87
  step={1}
88
+ onWheel={(event) => event.currentTarget.blur()}
88
89
  value={value as string}
89
90
  onChange={onChange}
90
91
  onFocus={onFocus}
@@ -143,6 +144,7 @@ export function ProductQuantityControl<T extends FormValues>(
143
144
  type='number'
144
145
  min={0}
145
146
  step={1}
147
+ onWheel={(event) => event.currentTarget.blur()}
146
148
  value={value && (value as string)}
147
149
  onFocus={onFocus}
148
150
  onChange={onChange}
@@ -69,6 +69,7 @@ export function ProductQuantityRechargingControl<T extends FormValues>(
69
69
  type='number'
70
70
  min={0}
71
71
  step={1}
72
+ onWheel={(event) => event.currentTarget.blur()}
72
73
  {...register(`${fieldNamePrefix}.totalQuantity` as Path<T>, {
73
74
  validate: (value) => {
74
75
  if (unlimited) return true
@@ -216,6 +216,7 @@ export function ProductCategoryControl({
216
216
  step={1}
217
217
  value={value === null ? '' : value}
218
218
  onChange={onChange}
219
+ onWheel={(event) => event.currentTarget.blur()}
219
220
  isInvalid={HookFormService.isInvalid<ProductSetFormValues>(
220
221
  `${fieldNamePrefix}.minSubItems` as const,
221
222
  errors,
@@ -288,6 +289,7 @@ export function ProductCategoryControl({
288
289
  name={name}
289
290
  value={value === null ? '' : value}
290
291
  onChange={onChange}
292
+ onWheel={(event) => event.currentTarget.blur()}
291
293
  isInvalid={HookFormService.isInvalid<ProductSetFormValues>(
292
294
  `${fieldNamePrefix}.maxSubItems` as const,
293
295
  errors,
@@ -348,6 +350,7 @@ export function ProductCategoryControl({
348
350
  min={0}
349
351
  step={1}
350
352
  type='number'
353
+ onWheel={(event) => event.currentTarget.blur()}
351
354
  disabled={isOverride}
352
355
  isInvalid={HookFormService.isInvalid<ProductSetFormValues>(
353
356
  `${fieldNamePrefix}.overallQuantity`,
@@ -530,6 +533,7 @@ export function ProductCategoryControl({
530
533
  step={1}
531
534
  value={value}
532
535
  onChange={onChange}
536
+ onWheel={(event) => event.currentTarget.blur()}
533
537
  isInvalid={HookFormService.isInvalid<ProductSetFormValues>(
534
538
  `${fieldNamePrefix}.remainderExpireAfter` as const,
535
539
  errors,
@@ -1,4 +1,4 @@
1
- import React, { useContext, useEffect, useMemo } from 'react'
1
+ import { useContext, useEffect, useMemo } from 'react'
2
2
  import { Col, Form, Row } from 'react-bootstrap'
3
3
  import {
4
4
  ArrayPath,
@@ -109,6 +109,7 @@ function RecurrenceEndInput({
109
109
  type='number'
110
110
  min={1}
111
111
  max={500}
112
+ onWheel={(event) => event.currentTarget.blur()}
112
113
  disabled={disabled || !count || count === 500}
113
114
  aria-label='Occurrence count'
114
115
  value={count ?? defaultOccurrences[frequency]}
@@ -91,6 +91,7 @@ function RecurrenceEndInput({
91
91
  type='number'
92
92
  min={1}
93
93
  max={500}
94
+ onWheel={(event) => event.currentTarget.blur()}
94
95
  disabled={disabled || !count || count === 500}
95
96
  aria-label='Occurrence count'
96
97
  value={count ?? defaultOccurrences[frequency]}