@licklist/design 0.71.24 → 0.72.0-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 (315) hide show
  1. package/dist/affiliate/form/AffiliateForm.d.ts.map +1 -1
  2. package/dist/auth/Layout/AuthNavComponent.d.ts.map +1 -1
  3. package/dist/auth/Login/LoginComponent.d.ts.map +1 -1
  4. package/dist/auth/Login/LoginComponent.js +2 -1
  5. package/dist/auth/Login/LoginFormComponent.d.ts.map +1 -1
  6. package/dist/auth/Logout/Logout.js +1 -0
  7. package/dist/auth/Register/RegisterComponent.d.ts.map +1 -1
  8. package/dist/auth/Register/RegisterFormComponent.d.ts.map +1 -1
  9. package/dist/auth/ResetPassword/ResetPasswordFormComponent.d.ts.map +1 -1
  10. package/dist/auth/Router.d.ts.map +1 -1
  11. package/dist/auth/Router.js +2 -0
  12. package/dist/calendar/utils/index.d.ts +1 -1
  13. package/dist/calendar/utils/index.d.ts.map +1 -1
  14. package/dist/events/edit-event-modal/IntervalInput.d.ts +3 -1
  15. package/dist/events/edit-event-modal/IntervalInput.d.ts.map +1 -1
  16. package/dist/events/edit-event-modal/IntervalInput.js +11 -4
  17. package/dist/events/edit-event-modal/component/EditEventForm/EditEventForm.d.ts +3 -1
  18. package/dist/events/edit-event-modal/component/EditEventForm/EditEventForm.d.ts.map +1 -1
  19. package/dist/events/edit-event-modal/component/EditEventForm/EditEventForm.js +20 -6
  20. package/dist/events/edit-event-modal/component/SaleDeadline/SaleDeadline.d.ts.map +1 -1
  21. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.js +3 -1
  22. package/dist/events/edit-event-modal/utils/getDefaultProductSet.d.ts.map +1 -1
  23. package/dist/events/edit-event-modal/utils/getDefaultProductSet.js +0 -1
  24. package/dist/events/edit-recurrent-event-modal/EditRecurrentEventModal.d.ts +5 -1
  25. package/dist/events/edit-recurrent-event-modal/EditRecurrentEventModal.d.ts.map +1 -1
  26. package/dist/events/edit-recurrent-event-modal/EditRecurrentEventModal.js +5 -3
  27. package/dist/events/event-card/utils.d.ts.map +1 -1
  28. package/dist/events/event-statistic-modal/EventStatisticModal.d.ts +2 -1
  29. package/dist/events/event-statistic-modal/EventStatisticModal.d.ts.map +1 -1
  30. package/dist/events/event-statistic-modal/EventStatisticModal.js +2 -2
  31. package/dist/events/event-statistic-modal/hooks/useTableData.d.ts +1 -1
  32. package/dist/events/event-statistic-modal/hooks/useTableData.d.ts.map +1 -1
  33. package/dist/events/event-statistic-modal/hooks/useTableData.js +2 -1
  34. package/dist/events/event-statistic-modal/utils/index.d.ts.map +1 -1
  35. package/dist/events/event-statistic-modal/utils/index.js +3 -3
  36. package/dist/events/event-venue-map/EventVenueMap.d.ts.map +1 -1
  37. package/dist/events/event-venue-map/EventVenueMap.js +1 -0
  38. package/dist/events/event-venue-map/hooks/useCanvasSize.d.ts.map +1 -1
  39. package/dist/events/event-venue-map/hooks/useCanvasSize.js +11 -4
  40. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetForm.d.ts +18 -0
  41. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetForm.d.ts.map +1 -0
  42. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetForm.js +295 -0
  43. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetModal.d.ts +15 -0
  44. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetModal.d.ts.map +1 -0
  45. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetModal.js +90 -0
  46. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/controll/ModifierSetControll.d.ts +14 -0
  47. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/controll/ModifierSetControll.d.ts.map +1 -0
  48. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/controll/ModifierSetControll.js +404 -0
  49. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/controll/ProductControll.d.ts +10 -0
  50. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/controll/ProductControll.d.ts.map +1 -0
  51. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/controll/ProductControll.js +87 -0
  52. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/index.d.ts +2 -0
  53. package/dist/iframe/ProductWithModifierModal/ModifierSetModal/index.d.ts.map +1 -0
  54. package/dist/iframe/ProductWithModifierModal/index.d.ts +2 -0
  55. package/dist/iframe/ProductWithModifierModal/index.d.ts.map +1 -0
  56. package/dist/iframe/ProductWithModifierModal/utils.d.ts +5 -0
  57. package/dist/iframe/ProductWithModifierModal/utils.d.ts.map +1 -0
  58. package/dist/iframe/ProductWithModifierModal/utils.js +21 -0
  59. package/dist/iframe/event/ticket-description/TicketDescription.d.ts +3 -1
  60. package/dist/iframe/event/ticket-description/TicketDescription.d.ts.map +1 -1
  61. package/dist/iframe/event/ticket-description/TicketDescription.js +10 -7
  62. package/dist/iframe/order-process/components/BookingSummary/components/ProductSummary/ProductSummary.d.ts +5 -1
  63. package/dist/iframe/order-process/components/BookingSummary/components/ProductSummary/ProductSummary.d.ts.map +1 -1
  64. package/dist/iframe/order-process/components/BookingSummary/components/ProductSummary/ProductSummary.js +12 -1
  65. package/dist/iframe/order-process/components/BookingSummary/components/SummaryTotal/SummaryTotal.d.ts.map +1 -1
  66. package/dist/iframe/order-process/components/BookingSummary/components/SummaryTotal/SummaryTotal.js +3 -3
  67. package/dist/iframe/order-process/components/BookingSummary/utils/index.d.ts +4 -0
  68. package/dist/iframe/order-process/components/BookingSummary/utils/index.d.ts.map +1 -1
  69. package/dist/iframe/order-process/components/BookingSummary/utils/index.js +29 -2
  70. package/dist/iframe/order-process/components/CategoryProduct/CategoryProduct.d.ts.map +1 -1
  71. package/dist/iframe/order-process/components/CategoryProduct/CategoryProduct.js +106 -2
  72. package/dist/iframe/order-process/components/CategoryProduct/components/NumberInput/NumberInput.d.ts.map +1 -1
  73. package/dist/iframe/order-process/components/CategoryProduct/components/NumberInput/NumberInput.js +13 -0
  74. package/dist/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.d.ts +3 -1
  75. package/dist/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.d.ts.map +1 -1
  76. package/dist/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.js +95 -1
  77. package/dist/iframe/order-process/components/CategoryProduct/components/ProductWithModifier/ProductWithModifier.d.ts +23 -0
  78. package/dist/iframe/order-process/components/CategoryProduct/components/ProductWithModifier/ProductWithModifier.d.ts.map +1 -0
  79. package/dist/iframe/order-process/components/CategoryProduct/components/ProductWithModifier/ProductWithModifier.js +62 -0
  80. package/dist/iframe/order-process/components/CategoryProduct/constants.d.ts +2 -0
  81. package/dist/iframe/order-process/components/CategoryProduct/constants.d.ts.map +1 -0
  82. package/dist/iframe/order-process/components/CategoryProduct/constants.js +4 -0
  83. package/dist/iframe/order-process/components/utils/useOnWindowUnmount.d.ts +6 -0
  84. package/dist/iframe/order-process/components/utils/useOnWindowUnmount.d.ts.map +1 -0
  85. package/dist/iframe/order-process/components/utils/useOnWindowUnmount.js +18 -0
  86. package/dist/iframe/page/components/PageBody/hooks/useResizePageBody.d.ts.map +1 -1
  87. package/dist/iframe/payment/order-items-table/hooks/useTableData.d.ts.map +1 -1
  88. package/dist/iframe/payment/order-items-table/hooks/useTableData.js +83 -10
  89. package/dist/iframe/payment/order-items-table/utils/index.d.ts.map +1 -1
  90. package/dist/iframe/payment/order-items-table/utils/index.js +15 -0
  91. package/dist/iframe/payment/order-items-table/utils/paymentSummary.d.ts.map +1 -1
  92. package/dist/iframe/payment/order-items-table/utils/paymentSummary.js +2 -2
  93. package/dist/iframe/payment/payment-status-page/PaymentStatusPage.d.ts.map +1 -1
  94. package/dist/iframe/payment/payment-status-page/PaymentStatusPage.js +2 -2
  95. package/dist/iframe/ryft/RyftPaymentForm.js +1 -0
  96. package/dist/iframe/ryft/utils/ryft-form.d.ts.map +1 -1
  97. package/dist/iframe/ryft/utils/ryft-form.js +4 -5
  98. package/dist/index.js +2 -1
  99. package/dist/layout/DropDown.d.ts +2 -1
  100. package/dist/layout/DropDown.d.ts.map +1 -1
  101. package/dist/notification/email-template/card/EmailTemplateCard.d.ts.map +1 -1
  102. package/dist/notification/email-template/control/EmailTemplateControl.d.ts.map +1 -1
  103. package/dist/notification/email-template/control/EmailTemplateControl.js +3 -0
  104. package/dist/notification/sms-template/card/SmsTemplateCard.d.ts.map +1 -1
  105. package/dist/product-set/control/DateAndRecurrenceInput.d.ts.map +1 -1
  106. package/dist/product-set/control/DateInput.d.ts.map +1 -1
  107. package/dist/product-set/form/ProductSetForm.d.ts +7 -2
  108. package/dist/product-set/form/ProductSetForm.d.ts.map +1 -1
  109. package/dist/product-set/form/ProductSetForm.js +7 -5
  110. package/dist/product-set/form/ProductZonesControl.d.ts.map +1 -1
  111. package/dist/product-set/form/ProductZonesControl.js +0 -2
  112. package/dist/product-set/form/ProductsControl.d.ts.map +1 -1
  113. package/dist/product-set/form/ProductsControl.js +25 -5
  114. package/dist/product-set/form/SubProductsControl.d.ts.map +1 -1
  115. package/dist/product-set/form/SubProductsControl.js +0 -3
  116. package/dist/product-set/form/VenueMapsControl.d.ts +1 -1
  117. package/dist/product-set/form/VenueMapsControl.d.ts.map +1 -1
  118. package/dist/product-set/form/VenueMapsControl.js +0 -3
  119. package/dist/product-set/form/context.d.ts +3 -1
  120. package/dist/product-set/form/context.d.ts.map +1 -1
  121. package/dist/product-set/form/context.js +2 -1
  122. package/dist/product-set/product/ProductControl.d.ts +8 -0
  123. package/dist/product-set/product/ProductControl.d.ts.map +1 -1
  124. package/dist/product-set/product/ProductControl.js +25 -1
  125. package/dist/product-set/product/booking-management/ProductBookingManagementControl.d.ts.map +1 -1
  126. package/dist/product-set/product/booking-management/ProductBookingManagementControl.js +6 -0
  127. package/dist/product-set/product/deposit/ProductDepositControl.d.ts.map +1 -1
  128. package/dist/product-set/product/deposit/ProductDepositControl.js +3 -0
  129. package/dist/product-set/product/duration/ProductDurationControl.d.ts.map +1 -1
  130. package/dist/product-set/product/duration/ProductDurationControl.js +6 -0
  131. package/dist/product-set/product/price/ProductPriceControl.d.ts.map +1 -1
  132. package/dist/product-set/product/price/ProductPriceControl.js +3 -0
  133. package/dist/product-set/product/quantity/ProductQuantityConstantControl.d.ts.map +1 -1
  134. package/dist/product-set/product/quantity/ProductQuantityConstantControl.js +6 -0
  135. package/dist/product-set/product/quantity/ProductQuantityControl.d.ts.map +1 -1
  136. package/dist/product-set/product/quantity/ProductQuantityControl.js +6 -0
  137. package/dist/product-set/product/quantity/ProductQuantityRechargingControl.d.ts.map +1 -1
  138. package/dist/product-set/product/quantity/ProductQuantityRechargingControl.js +4 -1
  139. package/dist/product-set/product-category/ProductCategoryControl.d.ts.map +1 -1
  140. package/dist/product-set/product-category/ProductCategoryControl.js +12 -0
  141. package/dist/product-set/utils/index.d.ts +88 -0
  142. package/dist/product-set/utils/index.d.ts.map +1 -1
  143. package/dist/product-set/utils/index.js +19 -1
  144. package/dist/recurrence-input/RecurrenceEndInput.d.ts.map +1 -1
  145. package/dist/recurrence-input/RecurrenceEndInput.js +3 -0
  146. package/dist/recurrence-input/RecurrenceInput.d.ts.map +1 -1
  147. package/dist/recurrence-input/RecurrenceInput.js +7 -3
  148. package/dist/recurring-date-picker-input/RecurrenceEndInput.d.ts.map +1 -1
  149. package/dist/report/ReportRunnerModal/ReportRunnerModal.js +1 -0
  150. package/dist/resource/form/components/CapacityControl.d.ts.map +1 -1
  151. package/dist/resource/form/components/CapacityControl.js +3 -0
  152. package/dist/resource/form/components/SortControl.d.ts.map +1 -1
  153. package/dist/resource/form/components/SortControl.js +3 -0
  154. package/dist/sales/booking/results/components/ResultCard.d.ts.map +1 -1
  155. package/dist/sales/booking/results/components/ResultCard.js +0 -2
  156. package/dist/sales/coupon/control/CouponFormControl.d.ts.map +1 -1
  157. package/dist/sales/coupon/control/CouponFormControl.js +21 -0
  158. package/dist/sales/coupon/utils/index.d.ts +2 -1
  159. package/dist/sales/coupon/utils/index.d.ts.map +1 -1
  160. package/dist/sales/life-time-sales/LifeTimeSalesChart.js +1 -0
  161. package/dist/sales/manual-booking/select-event/SelectEvent.js +1 -0
  162. package/dist/sales/manual-booking/select-menu/SelectMenu.js +1 -0
  163. package/dist/sales/manual-booking/summary/ManualBookingSummary.js +1 -0
  164. package/dist/setting/admin/AdminSettingForm.d.ts.map +1 -1
  165. package/dist/setting/admin/PaymentFeeForm.d.ts.map +1 -1
  166. package/dist/setting/admin/PaymentFeeForm.js +16 -1
  167. package/dist/setting/dashboard/DashboardSettingForm.d.ts.map +1 -1
  168. package/dist/setting/dashboard/DashboardSettingForm.js +4 -1
  169. package/dist/setting/dashboard/snippet-templates/card/SnippetTemplateCard.d.ts.map +1 -1
  170. package/dist/snippet/snippet-template/preview/Preview.d.ts.map +1 -1
  171. package/dist/snippet/snippet-template/preview/Preview.js +3 -1
  172. package/dist/sortable-tree/SortableTreeItem.d.ts.map +1 -1
  173. package/dist/static/CurrencyNumberInput.d.ts.map +1 -1
  174. package/dist/static/CurrencyNumberInput.js +3 -0
  175. package/dist/static/date-range-input/utils/index.d.ts +1 -1
  176. package/dist/static/date-range-input/utils/index.d.ts.map +1 -1
  177. package/dist/static/form-number-input/FormNumberInput.d.ts.map +1 -1
  178. package/dist/static/form-number-input/FormNumberInput.js +3 -0
  179. package/dist/static/loader/FullScreenLoader.d.ts +8 -0
  180. package/dist/static/loader/FullScreenLoader.d.ts.map +1 -0
  181. package/dist/static/loader/FullScreenLoader.js +41 -0
  182. package/dist/static/loader/LoaderIndicator.d.ts +2 -3
  183. package/dist/static/loader/LoaderIndicator.d.ts.map +1 -1
  184. package/dist/static/loader/LoaderIndicator.js +4 -2
  185. package/dist/static/loader/index.d.ts +1 -0
  186. package/dist/static/loader/index.d.ts.map +1 -1
  187. package/dist/static/number-input/NumberInput.d.ts.map +1 -1
  188. package/dist/static/number-input/NumberInput.js +3 -0
  189. package/dist/styles/availability-indicator/AvailabilityIndicator.scss +1 -4
  190. package/dist/styles/date-time-button/DateTimeButton.scss +7 -0
  191. package/dist/styles/events/EditEventModal.scss +2 -0
  192. package/dist/styles/iframe-events/Calendar.scss +1 -1
  193. package/dist/styles/iframe-external-modal/IframeExternalModal.scss +2 -2
  194. package/dist/styles/iframe-page/Page.scss +16 -0
  195. package/dist/styles/iframe-page/PageBody.scss +4 -0
  196. package/dist/styles/modals/Modals.scss +16 -0
  197. package/dist/styles/product-set/EditProductSetElement.scss +1 -0
  198. package/dist/styles/product-set/ProductSetForm.scss +13 -3
  199. package/dist/styles/ryft-payment-form/RyftPaymentForm.scss +2 -4
  200. package/dist/styles/sales/BookingResults.scss +1 -1
  201. package/dist/styles/sales/ManualBooking.scss +6 -0
  202. package/dist/styles/static/Loader.scss +9 -0
  203. package/dist/styles/themes/bookedit/index.scss +19 -0
  204. package/dist/zone/form/components/GameDurationControl.d.ts.map +1 -1
  205. package/dist/zone/form/components/GameDurationControl.js +3 -0
  206. package/dist/zone/form/components/SortControl.d.ts.map +1 -1
  207. package/dist/zone/form/components/SortControl.js +3 -0
  208. package/package.json +8 -6
  209. package/src/affiliate/form/AffiliateForm.tsx +1 -0
  210. package/src/auth/Layout/AuthNavComponent.tsx +4 -0
  211. package/src/auth/Login/LoginComponent.tsx +3 -1
  212. package/src/auth/Login/LoginFormComponent.tsx +2 -0
  213. package/src/auth/Register/RegisterComponent.tsx +2 -0
  214. package/src/auth/Register/RegisterFormComponent.tsx +4 -0
  215. package/src/auth/ResetPassword/ResetPasswordFormComponent.tsx +4 -0
  216. package/src/auth/Router.tsx +2 -0
  217. package/src/calendar/Calendar.stories.tsx +2 -2
  218. package/src/calendar/utils/index.ts +1 -1
  219. package/src/events/edit-event-modal/IntervalInput.tsx +13 -3
  220. package/src/events/edit-event-modal/component/EditEventForm/EditEventForm.tsx +24 -2
  221. package/src/events/edit-event-modal/component/SaleDeadline/SaleDeadline.tsx +9 -7
  222. package/src/events/edit-event-modal/utils/getDefaultProductSet.ts +0 -1
  223. package/src/events/edit-recurrent-event-modal/EditRecurrentEventModal.tsx +9 -1
  224. package/src/events/event-card/utils.ts +10 -9
  225. package/src/events/event-statistic-modal/EventStatisticModal.tsx +3 -1
  226. package/src/events/event-statistic-modal/hooks/useTableData.tsx +2 -1
  227. package/src/events/event-statistic-modal/utils/index.ts +6 -5
  228. package/src/events/event-venue-map/EventVenueMap.tsx +1 -0
  229. package/src/events/event-venue-map/hooks/useCanvasSize.ts +5 -1
  230. package/src/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetForm.tsx +212 -0
  231. package/src/iframe/ProductWithModifierModal/ModifierSetModal/ProductWithModifierSetModal.tsx +76 -0
  232. package/src/iframe/ProductWithModifierModal/ModifierSetModal/controll/ModifierSetControll.tsx +393 -0
  233. package/src/iframe/ProductWithModifierModal/ModifierSetModal/controll/ProductControll.tsx +98 -0
  234. package/src/iframe/ProductWithModifierModal/ModifierSetModal/index.ts +1 -0
  235. package/src/iframe/ProductWithModifierModal/index.ts +1 -0
  236. package/src/iframe/ProductWithModifierModal/utils.ts +29 -0
  237. package/src/iframe/event/ticket-description/TicketDescription.tsx +11 -4
  238. package/src/iframe/order-process/components/BookingSummary/components/ProductSummary/ProductSummary.tsx +24 -2
  239. package/src/iframe/order-process/components/BookingSummary/components/SummaryTotal/SummaryTotal.tsx +13 -11
  240. package/src/iframe/order-process/components/BookingSummary/utils/index.ts +45 -4
  241. package/src/iframe/order-process/components/CategoryProduct/CategoryProduct.tsx +155 -75
  242. package/src/iframe/order-process/components/CategoryProduct/components/NumberInput/NumberInput.tsx +9 -0
  243. package/src/iframe/order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput.tsx +58 -1
  244. package/src/iframe/order-process/components/CategoryProduct/components/ProductWithModifier/ProductWithModifier.tsx +86 -0
  245. package/src/iframe/order-process/components/CategoryProduct/constants.ts +1 -0
  246. package/src/iframe/order-process/components/utils/useOnWindowUnmount.ts +25 -0
  247. package/src/iframe/page/components/PageBody/hooks/useResizePageBody.ts +1 -2
  248. package/src/iframe/payment/order-items-table/hooks/useTableData.tsx +84 -14
  249. package/src/iframe/payment/order-items-table/utils/index.ts +23 -0
  250. package/src/iframe/payment/order-items-table/utils/paymentSummary.tsx +3 -2
  251. package/src/iframe/payment/payment-status-page/PaymentStatusPage.tsx +19 -20
  252. package/src/iframe/ryft/utils/ryft-form.ts +6 -5
  253. package/src/layout/DropDown.tsx +1 -1
  254. package/src/notification/email-template/card/EmailTemplateCard.tsx +2 -0
  255. package/src/notification/email-template/control/EmailTemplateControl.tsx +1 -0
  256. package/src/notification/sms-template/card/SmsTemplateCard.tsx +2 -0
  257. package/src/product-set/control/DateAndRecurrenceInput.tsx +3 -4
  258. package/src/product-set/control/DateInput.tsx +3 -4
  259. package/src/product-set/form/ProductSetForm.tsx +17 -5
  260. package/src/product-set/form/ProductZonesControl.tsx +1 -4
  261. package/src/product-set/form/ProductsControl.tsx +33 -15
  262. package/src/product-set/form/SubProductsControl.tsx +0 -3
  263. package/src/product-set/form/VenueMapsControl.tsx +1 -4
  264. package/src/product-set/form/context.tsx +5 -0
  265. package/src/product-set/product/ProductControl.tsx +37 -2
  266. package/src/product-set/product/advanced-options/AdvancedOptions.tsx +1 -1
  267. package/src/product-set/product/booking-management/ProductBookingManagementControl.tsx +2 -0
  268. package/src/product-set/product/deposit/ProductDepositControl.tsx +1 -0
  269. package/src/product-set/product/duration/ProductDurationControl.tsx +2 -0
  270. package/src/product-set/product/price/ProductPriceControl.tsx +1 -0
  271. package/src/product-set/product/quantity/ProductQuantityConstantControl.tsx +2 -0
  272. package/src/product-set/product/quantity/ProductQuantityControl.tsx +2 -0
  273. package/src/product-set/product/quantity/ProductQuantityRechargingControl.tsx +1 -0
  274. package/src/product-set/product-category/ProductCategoryControl.tsx +4 -0
  275. package/src/product-set/product-zone/ProductZoneControl.tsx +1 -1
  276. package/src/product-set/utils/index.ts +19 -0
  277. package/src/recurrence-input/RecurrenceEndInput.tsx +1 -0
  278. package/src/recurrence-input/RecurrenceInput.tsx +9 -6
  279. package/src/recurring-date-picker-input/RecurrenceEndInput.tsx +1 -0
  280. package/src/resource/form/components/CapacityControl.tsx +1 -0
  281. package/src/resource/form/components/SortControl.tsx +1 -0
  282. package/src/sales/booking/results/components/ResultCard.tsx +0 -2
  283. package/src/sales/coupon/control/CouponFormControl.tsx +7 -0
  284. package/src/sales/coupon/utils/index.ts +5 -3
  285. package/src/setting/admin/AdminSettingForm.tsx +4 -0
  286. package/src/setting/admin/PaymentFeeForm.tsx +5 -0
  287. package/src/setting/dashboard/DashboardSettingForm.tsx +1 -0
  288. package/src/setting/dashboard/snippet-templates/card/SnippetTemplateCard.tsx +2 -0
  289. package/src/snippet/snippet-template/preview/Preview.tsx +1 -2
  290. package/src/sortable-tree/SortableTreeItem.tsx +1 -6
  291. package/src/static/CurrencyNumberInput.tsx +1 -0
  292. package/src/static/date-range-input/utils/index.ts +1 -1
  293. package/src/static/form-number-input/FormNumberInput.tsx +1 -0
  294. package/src/static/loader/FullScreenLoader.tsx +16 -0
  295. package/src/static/loader/LoaderIndicator.tsx +6 -3
  296. package/src/static/loader/index.ts +1 -0
  297. package/src/static/number-input/NumberInput.tsx +1 -0
  298. package/src/styles/availability-indicator/AvailabilityIndicator.scss +1 -4
  299. package/src/styles/date-time-button/DateTimeButton.scss +7 -0
  300. package/src/styles/events/EditEventModal.scss +2 -0
  301. package/src/styles/iframe-events/Calendar.scss +1 -1
  302. package/src/styles/iframe-external-modal/IframeExternalModal.scss +2 -2
  303. package/src/styles/iframe-page/Page.scss +16 -0
  304. package/src/styles/iframe-page/PageBody.scss +4 -0
  305. package/src/styles/modals/Modals.scss +16 -0
  306. package/src/styles/product-set/EditProductSetElement.scss +1 -0
  307. package/src/styles/product-set/ProductSetForm.scss +13 -3
  308. package/src/styles/ryft-payment-form/RyftPaymentForm.scss +2 -4
  309. package/src/styles/sales/BookingResults.scss +1 -1
  310. package/src/styles/sales/ManualBooking.scss +6 -0
  311. package/src/styles/static/Loader.scss +9 -0
  312. package/src/styles/themes/bookedit/index.scss +19 -0
  313. package/src/zone/form/components/GameDurationControl.tsx +1 -0
  314. package/src/zone/form/components/SortControl.tsx +1 -0
  315. package/yarn.lock +185 -185
@@ -10,13 +10,17 @@ export const useCanvasSize = ({
10
10
  width: componentWidth,
11
11
  height: componentHeight,
12
12
  }: CanvasSizeProps) => {
13
+ // TODO Fix often updating of width and height
13
14
  const { width, height } = useWindowDimensions()
14
15
 
16
+ // eslint-disable-next-line react-hooks/exhaustive-deps
17
+ const memoizedDimensions = useMemo(() => ({ width, height }), [width])
18
+
15
19
  const memoedComponentParameters = useMemo(() => {
16
20
  if (!componentWidth && !componentHeight) return null
17
21
 
18
22
  return { width: componentWidth, height: componentHeight }
19
23
  }, [componentWidth, componentHeight])
20
24
 
21
- return memoedComponentParameters || { width, height }
25
+ return memoedComponentParameters || memoizedDimensions
22
26
  }
@@ -0,0 +1,212 @@
1
+ import { useMemo } from 'react'
2
+ import { Controller, FormProvider, useForm } from 'react-hook-form'
3
+ import { Button, Form } from 'react-bootstrap'
4
+ import { isEmpty, uniqBy } from 'lodash'
5
+ import { useTranslation } from 'react-i18next'
6
+ import { useIntl } from 'react-intl'
7
+ import { Currency } from '@licklist/core/dist/Config'
8
+ import { MenuStep } from '@licklist/plugins/dist/types/context/sale/menuSteps'
9
+ import { OrderModifierByProduct } from '@licklist/core/dist/DataMapper/Order/OrderModifiierByProduct'
10
+ import { Product } from '@licklist/plugins/dist/types/context/sale/menuSteps'
11
+ import { OrderModifier } from '@licklist/core/dist/DataMapper/Order/OrderModifierDataMapper'
12
+ import { NumberInputHorizontal } from 'src/sales'
13
+ import clsx from 'clsx'
14
+ import { ProductCategory } from 'dist/product-set/types'
15
+ import { MAX_PRODUCT_NUMBER } from '../../order-process/components/CategoryProduct/constants'
16
+ import { FormOrderItem } from '../../order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput'
17
+ import { getOrderProductModifiersPrice } from '../../order-process/components/BookingSummary/utils'
18
+ import { ProductControl } from './controll/ProductControll'
19
+
20
+ export interface ManualBookingFormValues {
21
+ steps: MenuStep[]
22
+ }
23
+
24
+ interface ProductWithModifierSetFormProps {
25
+ onHide: () => void
26
+ product: Product
27
+ category: ProductCategory
28
+ editOrderModifier?: OrderModifierByProduct
29
+ onChange: (product: FormOrderItem) => void
30
+ }
31
+
32
+ const filteredOrderModifierSets = (
33
+ modifiersSet: OrderModifier[],
34
+ ): OrderModifier[] => {
35
+ if (!modifiersSet) return []
36
+ const orderModifier = modifiersSet
37
+ ?.flat()
38
+ .filter((modifier) => !!modifier?.quantity)
39
+
40
+ const filteredOrderModifier = uniqBy(
41
+ orderModifier,
42
+ (item) => `${item.modifierId}-${item.modifierSetId}`,
43
+ )
44
+
45
+ return filteredOrderModifier || []
46
+ }
47
+
48
+ export const ProductWithModifierSetForm = ({
49
+ product,
50
+ category,
51
+ editOrderModifier,
52
+ onChange,
53
+ }: ProductWithModifierSetFormProps) => {
54
+ const form = useForm({ mode: 'onChange' })
55
+ const { t } = useTranslation(['App', 'Sale', 'Validation'])
56
+
57
+ const {
58
+ formState: { errors, isSubmitting, isValid },
59
+ control,
60
+ trigger,
61
+ watch,
62
+ } = form
63
+ const defaultProductQuantity = editOrderModifier?.productQuantity ?? 0
64
+
65
+ const valuesOrder = watch()
66
+ const productQuantity = valuesOrder?.product?.quantity ?? defaultProductQuantity
67
+
68
+ const orderModifiersSets =
69
+ valuesOrder[`${product.id}`]?.orderProductModifiers || []
70
+
71
+ const filteredOrderModifiers = filteredOrderModifierSets(orderModifiersSets)
72
+
73
+ const orderModifierSets: OrderModifierByProduct[] = useMemo(() => [
74
+ {
75
+ productQuantity: productQuantity ?? 1,
76
+ modifiers: filteredOrderModifiers,
77
+ },
78
+ ]
79
+ , [filteredOrderModifiers, productQuantity])
80
+
81
+ const onSubmit = (event) => {
82
+ event.preventDefault()
83
+ trigger(`${product.id}`)
84
+
85
+ if (!isValid) return undefined
86
+ const productOrder: FormOrderItem = {
87
+ id: product.id,
88
+ name: product.name,
89
+ deposit: product?.deposit,
90
+ hasDeposit: category.allowDeposits && product?.deposit < product.price,
91
+ price: product.price,
92
+ productCategoryId: category.id,
93
+ quantity: productQuantity,
94
+ capacity: product?.capacity,
95
+ orderModifiersSets: orderModifierSets,
96
+ }
97
+ if (productOrder) {
98
+ return onChange(productOrder)
99
+ }
100
+ return undefined
101
+ }
102
+
103
+ const handleProductQuantityChange = (
104
+ value: number,
105
+ onChange: (val: number) => void,
106
+ ) => {
107
+ if (value < 0) {
108
+ onChange(0)
109
+ } else if (value > MAX_PRODUCT_NUMBER) {
110
+ onChange(MAX_PRODUCT_NUMBER)
111
+ } else {
112
+ onChange(value)
113
+ }
114
+ }
115
+
116
+ const disabledAddButton = useMemo(() => {
117
+ if (defaultProductQuantity) return false
118
+ return !productQuantity || !isEmpty(errors)
119
+ }, [defaultProductQuantity, productQuantity, errors])
120
+
121
+ const modifierPrice = getOrderProductModifiersPrice(orderModifierSets[0])
122
+ const productWithModifierPrice =
123
+ (product.price * productQuantity || 0) + modifierPrice
124
+ const { formatNumber } = useIntl()
125
+ const formatToCurrency = (value: number) =>
126
+ formatNumber(value, { style: 'currency', currency: Currency.GBP })
127
+
128
+ return (
129
+ <FormProvider {...form}>
130
+ <Form>
131
+ <div className='manual-booking-form'>
132
+ <ProductControl
133
+ product={product}
134
+ editOrderModifier={editOrderModifier}
135
+ />
136
+ <div className='bg-light m-2 p-2 rounded'>
137
+ <Controller
138
+ control={control}
139
+ name='product.quantity'
140
+ rules={{
141
+ min: {
142
+ value: 1,
143
+ message: t('Validation:fieldMinNumber', {
144
+ attribute: t('product'),
145
+ min: 1,
146
+ }) as string,
147
+ },
148
+ max: {
149
+ value: !product.isUnlimited
150
+ ? product.maxQuantity
151
+ : MAX_PRODUCT_NUMBER,
152
+ message: t('Validation:fieldMaxNumber', {
153
+ attribute: t('product'),
154
+ max: product.maxQuantity,
155
+ }) as string,
156
+ },
157
+ }}
158
+ render={({
159
+ field: { onChange, value, ref },
160
+ fieldState: { invalid, error },
161
+ }) => (
162
+ <div className='mb-8 d-flex flex-column'>
163
+ <div className='quantity-container-product w-100'>
164
+ <NumberInputHorizontal
165
+ ref={ref}
166
+ size='big'
167
+ onChange={(val) =>
168
+ handleProductQuantityChange(val, onChange)
169
+ }
170
+ onMinusClick={(val) =>
171
+ handleProductQuantityChange(val, onChange)
172
+ }
173
+ onPlusClick={(val) => {
174
+ handleProductQuantityChange(val, onChange)
175
+ }}
176
+ min={0}
177
+ max={100}
178
+ value={value || defaultProductQuantity}
179
+ className={clsx(invalid && 'error')}
180
+ isLoading={isSubmitting}
181
+ />
182
+ </div>
183
+ <div className=' d-flex flex-column align-items-center justify-content-center'>
184
+ <div className='modifier-price pb-4 pl-5'>
185
+ {formatToCurrency(product.price)}
186
+ </div>
187
+ {error?.message && (
188
+ <div className='d-flex justify-content-center mt-3 w-100'>
189
+ <p className='iframe-event__message-error'>
190
+ {error.message}
191
+ </p>
192
+ </div>
193
+ )}
194
+ </div>
195
+ </div>
196
+ )}
197
+ />
198
+ <Button
199
+ as='button'
200
+ variant='primary'
201
+ className='w-100'
202
+ disabled={disabledAddButton}
203
+ onClick={onSubmit}
204
+ >
205
+ {`${t('Design:add')}${modifierPrice ? ` (${formatToCurrency(productWithModifierPrice)})` : ''}`}
206
+ </Button>
207
+ </div>
208
+ </div>
209
+ </Form>
210
+ </FormProvider>
211
+ )
212
+ }
@@ -0,0 +1,76 @@
1
+ import { useDialogContext, DialogContextProvider } from 'src/modals'
2
+ import { Modal } from 'react-bootstrap'
3
+ import { OrderModifierByProduct } from '@licklist/core/dist/DataMapper/Order/OrderModifiierByProduct'
4
+ import { Product } from '@licklist/plugins/dist/types/context/sale/menuSteps'
5
+ import { TicketDescription } from 'src/iframe/event'
6
+ import clsx from 'clsx'
7
+ import { ProductCategory } from 'dist/product-set/types'
8
+ import { FormOrderItem } from '../../order-process/components/CategoryProduct/components/ProductQuantityInput/ProductQuantityInput'
9
+ import { useOnWindowUnmount } from '../../order-process/components/utils/useOnWindowUnmount'
10
+ import { ProductWithModifierSetForm } from './ProductWithModifierSetForm'
11
+
12
+ interface ProductWithModifierSetModalProps {
13
+ show: boolean
14
+ onHide: () => void
15
+ product: Product
16
+ category: ProductCategory
17
+ editOrderModifier?: OrderModifierByProduct
18
+ onChange: (product: FormOrderItem) => void
19
+ }
20
+
21
+ export const ProductWithModifierSetModal = ({
22
+ show,
23
+ onHide,
24
+ product,
25
+ category,
26
+ onChange,
27
+ editOrderModifier,
28
+ }: ProductWithModifierSetModalProps) => {
29
+ const { onBeforeUnload, onPopState } = useDialogContext()
30
+ useOnWindowUnmount({ onBeforeUnload, onPopState })
31
+
32
+ return (
33
+ <DialogContextProvider>
34
+ <Modal
35
+ onHide={onHide}
36
+ show={show}
37
+ className='m-0 manual-booking-form-modal mt-0 h-100 p-0'
38
+ dialogClassName='manual-booking-dialog mt-0'
39
+ >
40
+ <div className='close-button'>
41
+ <button
42
+ type='button'
43
+ onClick={onHide}
44
+ onKeyPress={onHide}
45
+ className='btn btn-light rounded-circle position-absolute top-0 end-0 m-2'
46
+ >
47
+ &times;
48
+ </button>
49
+ </div>
50
+ <div className='right-block' id='select-event-container'>
51
+ <div className={clsx('manual-booking-container', !product.images.length && 'tw-mt-8')}>
52
+ <div className='manual-booking-header'>
53
+ <TicketDescription
54
+ title={product.name}
55
+ description={product.description}
56
+ className={clsx('iframe-event__product-description', !product.images.length && 'mt-6')}
57
+ classNameProductModal='d-block'
58
+ images={product.images}
59
+ isRequired={product.isRequired}
60
+ canExpand
61
+ isModal
62
+ />
63
+ </div>
64
+ <ProductWithModifierSetForm
65
+ product={product}
66
+ onHide={onHide}
67
+ editOrderModifier={editOrderModifier}
68
+ onChange={onChange}
69
+ category={category}
70
+ />
71
+ </div>
72
+ </div>
73
+ </Modal>
74
+ </DialogContextProvider>
75
+ )
76
+ }
@@ -0,0 +1,393 @@
1
+ import { Col, Form } from 'react-bootstrap'
2
+ import { useTranslation } from 'react-i18next'
3
+ import { OrderModifier } from '@licklist/core/dist/DataMapper/Order/OrderModifierDataMapper'
4
+ import { Modifier } from '@licklist/core/dist/DataMapper/Product/ModifierDataMapper'
5
+ import { ModifierSet } from '@licklist/core/dist/DataMapper/Product/ModifierSetDataMapper'
6
+ import { ChangeEvent, useEffect, useMemo } from 'react'
7
+ import { useId } from '@mantine/hooks'
8
+ import { Controller, useFormContext } from 'react-hook-form'
9
+ import { xor } from 'lodash'
10
+ import clsx from 'clsx'
11
+ import { Currency } from '@licklist/core/dist/Config'
12
+ import { useIntl } from 'react-intl'
13
+ import { MAX_PRODUCT_NUMBER } from 'src/iframe/order-process/components/CategoryProduct/constants'
14
+ import { NumberInputHorizontal } from 'src/sales'
15
+ import { selectModifierType } from '../../utils'
16
+
17
+ interface ModifiersSetControllProps {
18
+ modifiers?: Modifier[]
19
+ modifierSet: ModifierSet
20
+ isLoading?: boolean
21
+ isEditMode?: boolean
22
+ productId: number
23
+ orderProductModifierSets?: OrderModifier[]
24
+ }
25
+
26
+ export const ModifiersSetControl = ({
27
+ modifierSet,
28
+ modifiers,
29
+ productId,
30
+ isLoading = false,
31
+ isEditMode = false,
32
+ orderProductModifierSets,
33
+ }: ModifiersSetControllProps) => {
34
+ const { control, watch, setValue, trigger } = useFormContext()
35
+ const { t } = useTranslation('App')
36
+
37
+ const orderModifiersSets = watch(`${productId}.orderProductModifiers`)
38
+
39
+ const { formatNumber } = useIntl()
40
+ const formatToCurrency = (value: number) =>
41
+ formatNumber(value, { style: 'currency', currency: Currency.GBP })
42
+
43
+ const currentOrderModifiersSets = useMemo(
44
+ () =>
45
+ orderProductModifierSets?.filter(
46
+ (modifier) => modifier.modifierSetId === modifierSet.id,
47
+ ) || [],
48
+ [orderProductModifierSets, modifierSet.id],
49
+ )
50
+
51
+ const onChangeModifiers = (
52
+ e: ChangeEvent<HTMLInputElement>,
53
+ type: selectModifierType,
54
+ quantity?: number,
55
+ ) => {
56
+ if (!modifiers) return
57
+
58
+ const selectedModifier = modifiers?.find(
59
+ (item) => item.id === Number(e.target.defaultValue || e.target.id),
60
+ )
61
+ const checkSelectedModifier =
62
+ orderModifiersSets?.find(
63
+ (modifier) => modifier?.modifierId === selectedModifier?.id,
64
+ )?.quantity === 1
65
+
66
+ if (selectedModifier && type === 'radio') {
67
+ modifiers.forEach((modifier) => {
68
+ const isSelected = modifier.id === selectedModifier.id
69
+ const orderModifiers: OrderModifier = {
70
+ modifierId: modifier.id,
71
+ price: modifier.price,
72
+ productId,
73
+ name: modifier.name,
74
+ quantity: isSelected ? 1 : 0,
75
+ modifierSetId: modifierSet.id,
76
+ }
77
+
78
+ setValue(
79
+ `${productId}.orderProductModifiers.${modifierSet.id}.${orderModifiers.modifierId}`,
80
+ orderModifiers,
81
+ )
82
+ })
83
+ }
84
+
85
+ if (selectedModifier && type === 'checkbox') {
86
+ const orderModifiers: OrderModifier = {
87
+ modifierId: selectedModifier.id,
88
+ price: selectedModifier.price,
89
+ productId,
90
+ name: selectedModifier.name,
91
+ quantity: checkSelectedModifier ? 0 : 1,
92
+ modifierSetId: modifierSet.id,
93
+ }
94
+ setValue(
95
+ `${productId}.orderProductModifiers.${modifierSet.id}.${selectedModifier.id}`,
96
+ orderModifiers,
97
+ )
98
+ }
99
+
100
+ if (selectedModifier && type === 'selector') {
101
+ const orderModifiers: OrderModifier = {
102
+ modifierId: selectedModifier.id,
103
+ price: selectedModifier.price,
104
+ productId,
105
+ quantity,
106
+ name: selectedModifier.name,
107
+ modifierSetId: modifierSet.id,
108
+ }
109
+ setValue(
110
+ `${productId}.orderProductModifiers.${modifierSet.id}.${selectedModifier.id}`,
111
+ orderModifiers,
112
+ )
113
+ }
114
+
115
+ trigger(`${productId}.orderProductModifiers`)
116
+ }
117
+
118
+ useEffect(() => {
119
+ if (!orderProductModifierSets?.length) return
120
+ orderProductModifierSets.forEach((orderModifier) =>
121
+ setValue(
122
+ `${productId}.orderProductModifiers.${orderModifier.modifierSetId}.${orderModifier.modifierId}`,
123
+ orderModifier,
124
+ ),
125
+ )
126
+ }, [isEditMode])
127
+
128
+ const radioButtonDefaultModifier = currentOrderModifiersSets.find((modifier) =>
129
+ modifierSet.modifiers.some((rl) => rl.id === modifier.modifierId)
130
+ )?.modifierId.toString();
131
+
132
+ return (
133
+ <>
134
+ {modifierSet?.maxItems === 1 &&
135
+ modifiers.every((modifier) => modifier.maxItems === 1) ? (
136
+ <>
137
+ <Controller
138
+ name={`${productId}.modifier`}
139
+ control={control}
140
+ rules={{
141
+ required: {
142
+ value: !!modifierSet.minItems,
143
+ message: t('Validation:fieldRequired') as string,
144
+ },
145
+ }}
146
+ render={({ field, fieldState }) => {
147
+ const onChange = (e: ChangeEvent<HTMLInputElement>) => {
148
+ onChangeModifiers(e, 'radio')
149
+ field.onChange(e.target.id)
150
+ }
151
+
152
+ return (
153
+ <>
154
+ {modifiers.map((modifier) => {
155
+ const selectedOrderModifierId = currentOrderModifiersSets
156
+ ?.find(
157
+ (orderModifier) =>
158
+ orderModifier.modifierId === modifier.id,
159
+ )
160
+ ?.modifierId?.toString()
161
+
162
+ return (
163
+ <Col key={modifier.id}>
164
+ <div className='modifier-container d-flex flex-column p-2'>
165
+ <Form.Check
166
+ className='custom-radio p-2'
167
+ inline
168
+ id={modifier.id.toString()}
169
+ defaultChecked={!!selectedOrderModifierId}
170
+ defaultValue={selectedOrderModifierId || modifier.id.toString()}
171
+ checked={field.value === modifier.id.toString()}
172
+ onChange={onChange}
173
+ type='radio'
174
+ label={modifier.name}
175
+ name={modifier.name}
176
+ />
177
+ <div className='mt-3 w-100 pl-2'>
178
+ <p>{modifier.description}</p>
179
+ <div className='modifier-price'>
180
+ + {formatToCurrency(modifier.price)}
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </Col>
185
+ )
186
+ })}
187
+ {fieldState.error && (
188
+ <div className='invalid-feedback d-block'>
189
+ {fieldState.error.message}
190
+ </div>
191
+ )}
192
+ </>
193
+ )
194
+ }}
195
+ defaultValue={radioButtonDefaultModifier}
196
+ />
197
+ </>
198
+ ) : (
199
+ <>
200
+ {modifiers?.map((modifier, index) => {
201
+ const selectedOrderModifier = currentOrderModifiersSets?.find(
202
+ (orderModifier) => orderModifier.modifierId === modifier.id,
203
+ )?.quantity
204
+
205
+ return (
206
+ <>
207
+ {modifier.maxItems === 1 ? (
208
+ <>
209
+ <Controller
210
+ name={`${productId}.${modifierSet.id}.modifiers[${index}]`}
211
+ control={control}
212
+ rules={{
213
+ required: {
214
+ value: !!modifier.minItems,
215
+ message: t('Validation:fieldRequired') as string,
216
+ },
217
+ validate: (value) => {
218
+ const { maxItems, minItems } = modifier
219
+ if (value?.length > maxItems) {
220
+ return t('Validation:quantityMaxNumberModifier', {
221
+ max: maxItems,
222
+ }) as string
223
+ }
224
+
225
+ if (value?.length < minItems) {
226
+ return t('Validation:quantityMinNumberModifier', {
227
+ min: minItems,
228
+ }) as string
229
+ }
230
+
231
+ return true
232
+ },
233
+ }}
234
+ render={({ field, fieldState: { error } }) => {
235
+ const onChange = (e: ChangeEvent<HTMLInputElement>) => {
236
+ onChangeModifiers(e, 'checkbox')
237
+ field.onChange(
238
+ xor(field.value, [Number(e.target.value)]),
239
+ )
240
+ }
241
+
242
+ return (
243
+ <Col
244
+ className='modifier-container pl-4'
245
+ key={modifier.id.toString()}
246
+ >
247
+ <div className='d-flex justify-content-between pl-2 align-items-center'>
248
+ <Checkbox
249
+ value={modifier.id}
250
+ onChange={onChange}
251
+ label={modifier.name}
252
+ defaultChecked={!!selectedOrderModifier}
253
+ />
254
+ </div>
255
+ <div className='mt-3 w-100 pl-2'>
256
+ <p>{modifier.description}</p>
257
+ <div className='modifier-price'>
258
+ + {formatToCurrency(modifier.price)}
259
+ </div>
260
+ </div>
261
+ {error?.message && (
262
+ <div className='invalid-feedback d-flex'>
263
+ {error?.message}
264
+ </div>
265
+ )}
266
+ </Col>
267
+ )
268
+ }}
269
+ />
270
+ </>
271
+ ) : (
272
+ <>
273
+ <div className='modifier-header m-0'>
274
+ <div className='title'>{modifier.name}</div>
275
+ </div>
276
+ <Controller
277
+ control={control}
278
+ name={`${productId}.${modifierSet.id}.modifiers[${index}].quantity`}
279
+ rules={{
280
+ required: {
281
+ value: !!modifier.minItems,
282
+ message: t('Validation:fieldRequired') as string,
283
+ },
284
+ validate: (value) => {
285
+ const { maxItems, minItems } = modifier
286
+ if (value > maxItems) {
287
+ return t('Validation:quantityMaxNumberModifier', {
288
+ max: maxItems,
289
+ }) as string
290
+ }
291
+
292
+ if (value < minItems) {
293
+ return t('Validation:quantityMinNumberModifier', {
294
+ min: minItems,
295
+ }) as string
296
+ }
297
+
298
+ return true
299
+ },
300
+ }}
301
+ render={({
302
+ field: { onChange, value, ref },
303
+ fieldState: { invalid, error },
304
+ }) => {
305
+ const onChangeProductQuantity = (val: number) => {
306
+ const quantity = Math.min(
307
+ MAX_PRODUCT_NUMBER,
308
+ Math.max(0, Math.ceil(val)),
309
+ )
310
+ onChange(quantity)
311
+ trigger(
312
+ `${productId}.${modifierSet.id}.modifiers[${index}].quantity`,
313
+ )
314
+ onChangeModifiers(
315
+ { target: { id: modifier.id.toString() } },
316
+ 'selector',
317
+ quantity,
318
+ )
319
+ }
320
+
321
+ return (
322
+ <div className='modifier-container'>
323
+ <div className='d-flex align-items-center column mb-8 pl-6 pt-2'>
324
+ <div className='quantity-container mb-0'>
325
+ <NumberInputHorizontal
326
+ ref={ref}
327
+ size='big'
328
+ onChange={onChangeProductQuantity}
329
+ onMinusClick={onChangeProductQuantity}
330
+ onPlusClick={onChangeProductQuantity}
331
+ min={0}
332
+ max={MAX_PRODUCT_NUMBER}
333
+ value={value ?? selectedOrderModifier ?? 0}
334
+ className={clsx(invalid && 'error')}
335
+ isLoading={isLoading}
336
+ />
337
+ </div>
338
+ </div>
339
+ <div className='p-2 mt-3 w-100 pl-4'>
340
+ <p className='pl-2'>{modifier.description}</p>
341
+ <div className='pl-2 modifier-price'>
342
+ + {formatToCurrency(modifier.price)}
343
+ </div>
344
+ {error?.message && (
345
+ <div className='d-flex mt-3 w-100'>
346
+ <p className='iframe-event__message-error'>
347
+ {error.message}
348
+ </p>
349
+ </div>
350
+ )}
351
+ </div>
352
+ </div>
353
+ )
354
+ }}
355
+ />
356
+ </>
357
+ )}
358
+ </>
359
+ )
360
+ })}
361
+ </>
362
+ )}
363
+ </>
364
+ )
365
+ }
366
+
367
+ type CheckboxProps = {
368
+ onChange: (e: ChangeEvent<HTMLInputElement>) => void
369
+ value: number
370
+ label: string
371
+ defaultChecked: boolean
372
+ }
373
+
374
+ const Checkbox = ({
375
+ onChange,
376
+ value,
377
+ label,
378
+ defaultChecked,
379
+ }: CheckboxProps) => {
380
+ const checkboxId = useId()
381
+
382
+ return (
383
+ <Form.Group controlId={checkboxId} className='custom-checkbox mt-0'>
384
+ <Form.Check
385
+ label={label}
386
+ value={value}
387
+ defaultChecked={defaultChecked}
388
+ onChange={onChange}
389
+ type='checkbox'
390
+ />
391
+ </Form.Group>
392
+ )
393
+ }