ordering-ui-admin-external 1.28.1 → 1.29.3

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 (190) hide show
  1. package/_bundles/main.css +294 -26
  2. package/_bundles/{ordering-ui-admin.d6c72a98321193c34fe9.js → ordering-ui-admin.e0348521ef103574aa53.js} +2 -2
  3. package/_bundles/{ordering-ui-admin.d6c72a98321193c34fe9.js.LICENSE.txt → ordering-ui-admin.e0348521ef103574aa53.js.LICENSE.txt} +12 -18
  4. package/_modules/components/Delivery/AddressForm/styles.js +2 -2
  5. package/_modules/components/Delivery/AddressList/index.js +9 -56
  6. package/_modules/components/Delivery/AddressList/styles.js +1 -1
  7. package/_modules/components/Delivery/DeliveryUsersListing/index.js +45 -7
  8. package/_modules/components/Delivery/DriversGroupLogs/index.js +5 -2
  9. package/_modules/components/Delivery/UsersList/index.js +17 -4
  10. package/_modules/components/Delivery/UsersList/styles.js +9 -4
  11. package/_modules/components/Home/HomePage/index.js +5 -1
  12. package/_modules/components/MyProducts/OrderingWebsite/index.js +5 -1
  13. package/_modules/components/OrderingProducts/SiteTheme/index.js +1 -1
  14. package/_modules/components/Orders/CompanySelector/index.js +2 -2
  15. package/_modules/components/Orders/CompanySelector/styles.js +1 -1
  16. package/_modules/components/Orders/CreateCustomOrder/CardForm/index.js +96 -0
  17. package/_modules/components/Orders/CreateCustomOrder/CardForm/styles.js +35 -0
  18. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/cardUtils.js +102 -0
  19. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/index.js +148 -0
  20. package/_modules/components/Orders/CreateCustomOrder/CardFormCustom/styles.js +16 -0
  21. package/_modules/components/Orders/CreateCustomOrder/CartBill/index.js +275 -0
  22. package/_modules/components/Orders/CreateCustomOrder/CartBill/styles.js +23 -0
  23. package/_modules/components/Orders/CreateCustomOrder/Checkout/index.js +498 -0
  24. package/_modules/components/Orders/CreateCustomOrder/Checkout/styles.js +31 -0
  25. package/_modules/components/Orders/CreateCustomOrder/CouponControl/index.js +100 -0
  26. package/_modules/components/Orders/CreateCustomOrder/CouponControl/styles.js +17 -0
  27. package/_modules/components/Orders/CreateCustomOrder/CustomOrderDetails/index.js +139 -0
  28. package/_modules/components/Orders/CreateCustomOrder/CustomOrderDetails/styles.js +17 -0
  29. package/_modules/components/Orders/CreateCustomOrder/DriverTips/index.js +101 -0
  30. package/_modules/components/Orders/CreateCustomOrder/DriverTips/styles.js +37 -0
  31. package/_modules/components/Orders/CreateCustomOrder/Map/index.js +131 -0
  32. package/_modules/components/Orders/CreateCustomOrder/Map/styles.js +12 -0
  33. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCard/index.js +83 -0
  34. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCash/index.js +81 -0
  35. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionCash/styles.js +23 -0
  36. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionPaypal/index.js +45 -0
  37. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionPaypal/styles.js +12 -0
  38. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionSquare/index.js +112 -0
  39. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionSquare/styles.js +21 -0
  40. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionStripe/index.js +259 -0
  41. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionStripe/styles.js +66 -0
  42. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionWallet/index.js +173 -0
  43. package/_modules/components/Orders/CreateCustomOrder/PaymentOptionWallet/styles.js +26 -0
  44. package/_modules/components/Orders/CreateCustomOrder/PaymentOptions/index.js +400 -0
  45. package/_modules/components/Orders/CreateCustomOrder/PaymentOptions/styles.js +40 -0
  46. package/_modules/components/Orders/CreateCustomOrder/ProductForm/index.js +613 -0
  47. package/_modules/components/Orders/CreateCustomOrder/ProductForm/styles.js +109 -0
  48. package/_modules/components/Orders/CreateCustomOrder/ProductIngredient/index.js +39 -0
  49. package/_modules/components/Orders/CreateCustomOrder/ProductIngredient/styles.js +23 -0
  50. package/_modules/components/Orders/CreateCustomOrder/ProductOption/index.js +51 -0
  51. package/_modules/components/Orders/CreateCustomOrder/ProductOption/styles.js +29 -0
  52. package/_modules/components/Orders/CreateCustomOrder/ProductOptionSubOption/index.js +148 -0
  53. package/_modules/components/Orders/CreateCustomOrder/ProductOptionSubOption/styles.js +79 -0
  54. package/_modules/components/Orders/CreateCustomOrder/SelectBusinesses/index.js +82 -0
  55. package/_modules/components/Orders/CreateCustomOrder/SelectBusinesses/styles.js +21 -0
  56. package/_modules/components/Orders/CreateCustomOrder/SelectCustomer/index.js +192 -0
  57. package/_modules/components/Orders/CreateCustomOrder/SelectCustomer/styles.js +68 -0
  58. package/_modules/components/Orders/CreateCustomOrder/SelectProducts/index.js +234 -0
  59. package/_modules/components/Orders/CreateCustomOrder/SelectProducts/styles.js +54 -0
  60. package/_modules/components/Orders/CreateCustomOrder/SingleProductCard/index.js +99 -0
  61. package/_modules/components/Orders/CreateCustomOrder/SingleProductCard/styles.js +131 -0
  62. package/_modules/components/Orders/CreateCustomOrder/StripeElementsForm/index.js +73 -0
  63. package/_modules/components/Orders/CreateCustomOrder/StripeElementsForm/styles.js +17 -0
  64. package/_modules/components/Orders/CreateCustomOrder/StripeMethodForm/index.js +124 -0
  65. package/_modules/components/Orders/CreateCustomOrder/StripeMethodForm/styles.js +12 -0
  66. package/_modules/components/Orders/CreateCustomOrder/StripeRedirectForm/index.js +83 -0
  67. package/_modules/components/Orders/CreateCustomOrder/StripeRedirectForm/styles.js +21 -0
  68. package/_modules/components/Orders/CreateCustomOrder/TaxInformation/index.js +48 -0
  69. package/_modules/components/Orders/CreateCustomOrder/TaxInformation/styles.js +14 -0
  70. package/_modules/components/Orders/CreateCustomOrder/index.js +59 -0
  71. package/_modules/components/Orders/DriverSelector/index.js +2 -2
  72. package/_modules/components/Orders/DriverSelector/styles.js +1 -1
  73. package/_modules/components/Orders/OrderContactInformation/styles.js +1 -1
  74. package/_modules/components/Orders/OrderDetails/styles.js +1 -1
  75. package/_modules/components/Orders/OrderStatusTypeSelector/styles.js +1 -1
  76. package/_modules/components/Orders/OrderToPrintTicket/index.js +2 -2
  77. package/_modules/components/Orders/OrdersContentHeader/index.js +6 -4
  78. package/_modules/components/Orders/OrdersContentHeader/styles.js +13 -7
  79. package/_modules/components/Orders/OrdersDashboardControls/index.js +6 -2
  80. package/_modules/components/Orders/OrdersDashboardControls/styles.js +3 -3
  81. package/_modules/components/Orders/OrdersExportCSV/styles.js +14 -8
  82. package/_modules/components/Orders/OrdersManager/index.js +7 -5
  83. package/_modules/components/Orders/OrdersManager/styles.js +1 -1
  84. package/_modules/components/Shared/AutoScroll/index.js +1 -0
  85. package/_modules/components/Shared/LinkableText/index.js +22 -0
  86. package/_modules/components/Shared/Tabs/index.js +32 -0
  87. package/_modules/components/Shared/index.js +20 -0
  88. package/_modules/components/SidebarMenu/index.js +2 -1
  89. package/_modules/components/Stores/BusinessProductsListing/index.js +7 -3
  90. package/_modules/components/Stores/BusinessQRCodeOption/index.js +6 -2
  91. package/_modules/components/Stores/BusinessSummary/index.js +7 -3
  92. package/_modules/components/Users/UserAddForm/index.js +15 -6
  93. package/_modules/components/Users/UserAddForm/styles.js +1 -1
  94. package/_modules/styles/Selects/index.js +1 -1
  95. package/_modules/utils/index.js +9 -2
  96. package/index-template.js +1 -1
  97. package/package.json +6 -4
  98. package/src/components/Delivery/AddressForm/styles.js +3 -3
  99. package/src/components/Delivery/AddressList/index.js +6 -61
  100. package/src/components/Delivery/AddressList/styles.js +1 -1
  101. package/src/components/Delivery/DeliveryUsersListing/index.js +26 -3
  102. package/src/components/Delivery/DriversGroupLogs/index.js +8 -2
  103. package/src/components/Delivery/UsersList/index.js +27 -12
  104. package/src/components/Delivery/UsersList/styles.js +16 -0
  105. package/src/components/Home/HomePage/index.js +3 -2
  106. package/src/components/MyProducts/OrderingWebsite/index.js +9 -8
  107. package/src/components/OrderingProducts/SiteTheme/index.js +1 -1
  108. package/src/components/Orders/CompanySelector/index.js +4 -6
  109. package/src/components/Orders/CompanySelector/styles.js +10 -0
  110. package/src/components/Orders/CreateCustomOrder/CardForm/index.js +135 -0
  111. package/src/components/Orders/CreateCustomOrder/CardForm/styles.js +135 -0
  112. package/src/components/Orders/CreateCustomOrder/CardFormCustom/cardUtils.js +111 -0
  113. package/src/components/Orders/CreateCustomOrder/CardFormCustom/index.js +161 -0
  114. package/src/components/Orders/CreateCustomOrder/CardFormCustom/styles.js +20 -0
  115. package/src/components/Orders/CreateCustomOrder/CartBill/index.js +267 -0
  116. package/src/components/Orders/CreateCustomOrder/CartBill/styles.js +67 -0
  117. package/src/components/Orders/CreateCustomOrder/Checkout/index.js +519 -0
  118. package/src/components/Orders/CreateCustomOrder/Checkout/styles.js +85 -0
  119. package/src/components/Orders/CreateCustomOrder/CouponControl/index.js +90 -0
  120. package/src/components/Orders/CreateCustomOrder/CouponControl/styles.js +22 -0
  121. package/src/components/Orders/CreateCustomOrder/CustomOrderDetails/index.js +132 -0
  122. package/src/components/Orders/CreateCustomOrder/CustomOrderDetails/styles.js +28 -0
  123. package/src/components/Orders/CreateCustomOrder/DriverTips/index.js +113 -0
  124. package/src/components/Orders/CreateCustomOrder/DriverTips/styles.js +91 -0
  125. package/src/components/Orders/CreateCustomOrder/Map/index.js +115 -0
  126. package/src/components/Orders/CreateCustomOrder/Map/styles.js +10 -0
  127. package/src/components/Orders/CreateCustomOrder/PaymentOptionCard/index.js +70 -0
  128. package/src/components/Orders/CreateCustomOrder/PaymentOptionCash/index.js +83 -0
  129. package/src/components/Orders/CreateCustomOrder/PaymentOptionCash/styles.js +50 -0
  130. package/src/components/Orders/CreateCustomOrder/PaymentOptionPaypal/index.js +43 -0
  131. package/src/components/Orders/CreateCustomOrder/PaymentOptionPaypal/styles.js +5 -0
  132. package/src/components/Orders/CreateCustomOrder/PaymentOptionSquare/index.js +105 -0
  133. package/src/components/Orders/CreateCustomOrder/PaymentOptionSquare/styles.js +27 -0
  134. package/src/components/Orders/CreateCustomOrder/PaymentOptionStripe/index.js +261 -0
  135. package/src/components/Orders/CreateCustomOrder/PaymentOptionStripe/styles.js +159 -0
  136. package/src/components/Orders/CreateCustomOrder/PaymentOptionWallet/index.js +172 -0
  137. package/src/components/Orders/CreateCustomOrder/PaymentOptionWallet/styles.js +33 -0
  138. package/src/components/Orders/CreateCustomOrder/PaymentOptions/index.js +440 -0
  139. package/src/components/Orders/CreateCustomOrder/PaymentOptions/styles.js +132 -0
  140. package/src/components/Orders/CreateCustomOrder/ProductForm/index.js +701 -0
  141. package/src/components/Orders/CreateCustomOrder/ProductForm/styles.js +540 -0
  142. package/src/components/Orders/CreateCustomOrder/ProductIngredient/index.js +43 -0
  143. package/src/components/Orders/CreateCustomOrder/ProductIngredient/styles.js +29 -0
  144. package/src/components/Orders/CreateCustomOrder/ProductOption/index.js +58 -0
  145. package/src/components/Orders/CreateCustomOrder/ProductOption/styles.js +76 -0
  146. package/src/components/Orders/CreateCustomOrder/ProductOptionSubOption/index.js +182 -0
  147. package/src/components/Orders/CreateCustomOrder/ProductOptionSubOption/styles.js +195 -0
  148. package/src/components/Orders/CreateCustomOrder/SelectBusinesses/index.js +67 -0
  149. package/src/components/Orders/CreateCustomOrder/SelectBusinesses/styles.js +63 -0
  150. package/src/components/Orders/CreateCustomOrder/SelectCustomer/index.js +242 -0
  151. package/src/components/Orders/CreateCustomOrder/SelectCustomer/styles.js +235 -0
  152. package/src/components/Orders/CreateCustomOrder/SelectProducts/index.js +237 -0
  153. package/src/components/Orders/CreateCustomOrder/SelectProducts/styles.js +161 -0
  154. package/src/components/Orders/CreateCustomOrder/SingleProductCard/index.js +105 -0
  155. package/src/components/Orders/CreateCustomOrder/SingleProductCard/styles.js +314 -0
  156. package/src/components/Orders/CreateCustomOrder/StripeElementsForm/index.js +71 -0
  157. package/src/components/Orders/CreateCustomOrder/StripeElementsForm/styles.js +13 -0
  158. package/src/components/Orders/CreateCustomOrder/StripeMethodForm/index.js +90 -0
  159. package/src/components/Orders/CreateCustomOrder/StripeMethodForm/styles.js +9 -0
  160. package/src/components/Orders/CreateCustomOrder/StripeRedirectForm/index.js +96 -0
  161. package/src/components/Orders/CreateCustomOrder/StripeRedirectForm/styles.js +73 -0
  162. package/src/components/Orders/CreateCustomOrder/TaxInformation/index.js +69 -0
  163. package/src/components/Orders/CreateCustomOrder/TaxInformation/styles.js +25 -0
  164. package/src/components/Orders/CreateCustomOrder/index.js +45 -0
  165. package/src/components/Orders/DriverSelector/index.js +2 -2
  166. package/src/components/Orders/DriverSelector/styles.js +10 -0
  167. package/src/components/Orders/OrderContactInformation/index.js +32 -32
  168. package/src/components/Orders/OrderContactInformation/styles.js +0 -5
  169. package/src/components/Orders/OrderDetails/styles.js +7 -2
  170. package/src/components/Orders/OrderStatusTypeSelector/styles.js +9 -0
  171. package/src/components/Orders/OrderToPrintTicket/index.js +1 -1
  172. package/src/components/Orders/OrdersContentHeader/index.js +4 -4
  173. package/src/components/Orders/OrdersContentHeader/styles.js +7 -2
  174. package/src/components/Orders/OrdersDashboardControls/index.js +4 -1
  175. package/src/components/Orders/OrdersDashboardControls/styles.js +13 -11
  176. package/src/components/Orders/OrdersExportCSV/styles.js +16 -0
  177. package/src/components/Orders/OrdersManager/index.js +6 -2
  178. package/src/components/Orders/OrdersManager/styles.js +2 -0
  179. package/src/components/Shared/AutoScroll/index.js +1 -0
  180. package/src/components/Shared/LinkableText/index.js +17 -0
  181. package/src/components/Shared/Tabs/index.js +28 -0
  182. package/src/components/Shared/index.js +5 -0
  183. package/src/components/SidebarMenu/index.js +1 -1
  184. package/src/components/Stores/BusinessProductsListing/index.js +6 -3
  185. package/src/components/Stores/BusinessQRCodeOption/index.js +5 -3
  186. package/src/components/Stores/BusinessSummary/index.js +6 -4
  187. package/src/components/Users/UserAddForm/index.js +21 -9
  188. package/src/components/Users/UserAddForm/styles.js +2 -2
  189. package/src/styles/Selects/index.js +1 -1
  190. package/src/utils/index.js +5 -0
@@ -0,0 +1,242 @@
1
+ import React, { useState } from 'react'
2
+ import { useLanguage, useUtils, useConfig, useCustomer } from 'ordering-components-admin-external'
3
+ import { UserAddForm } from '../../../Users'
4
+ import { AddressList } from '../../../Delivery'
5
+ import { findExitingCountryPhoneCode } from '../../../../utils'
6
+ import { Dot, HouseDoor } from 'react-bootstrap-icons'
7
+ import FaUserAlt from '@meronex/icons/fa/FaUserAlt'
8
+ import CgSpinnerTwoAlt from '@meronex/icons/cg/CgSpinnerTwoAlt'
9
+ import { SideBar } from '../../../Shared'
10
+ import { Button, Input, LinkButton } from '../../../../styles'
11
+ import {
12
+ SectionContainer,
13
+ SearchBarContainer,
14
+ SearchBarWrapper,
15
+ OptionsToSelectContainer,
16
+ SelectOption,
17
+ WrapperImage,
18
+ SelectedUserWrapper,
19
+ CustomerAddressWrapper,
20
+ SavedPlaces,
21
+ AddressListWrapper
22
+ } from './styles'
23
+
24
+ export const SelectCustomer = (props) => {
25
+ const {
26
+ phone,
27
+ customersPhones,
28
+ selectedUser,
29
+ setSelectedUser,
30
+ onChangeNumber,
31
+ handleParentSidebarMove,
32
+ customerAddress
33
+ } = props
34
+
35
+ const [, t] = useLanguage()
36
+ const [{ optimizeImage }] = useUtils()
37
+ const [{ configs }] = useConfig()
38
+ const [, { setUserCustomer }] = useCustomer()
39
+
40
+ const [searchInputFocus, setSearchInputFocus] = useState(false)
41
+ const [showSearchbar, setShowSearchbar] = useState(true)
42
+ const [openSidebar, setOpenSidebar] = useState(null)
43
+ const [openExtraAdddress, setOpenExtraAddress] = useState(false)
44
+
45
+ let timeout = null
46
+ const onInputChange = (inputValue) => {
47
+ if (inputValue && inputValue.length > 10) {
48
+ return
49
+ }
50
+ clearTimeout(timeout)
51
+ timeout = setTimeout(function () {
52
+ onChangeNumber(inputValue)
53
+ }, 750)
54
+ }
55
+
56
+ const onSelectUser = (user) => {
57
+ setUserCustomer(user, true)
58
+ setSelectedUser(user)
59
+ setShowSearchbar(false)
60
+ }
61
+
62
+ const handleOpenAddForm = () => {
63
+ setOpenSidebar('user_add_form')
64
+ handleParentSidebarMove(500)
65
+ }
66
+
67
+ const handleCloseSidebar = () => {
68
+ setOpenSidebar(null)
69
+ handleParentSidebarMove(0)
70
+ }
71
+
72
+ const onPhoneNumberPaste = (event) => {
73
+ event.preventDefault()
74
+ const pastedValue = event.clipboardData.getData('text/plain')
75
+ const trimmedValue = pastedValue.replace(/\D/g, '')
76
+ document.execCommand('insertText', false, trimmedValue)
77
+ onChangeNumber(trimmedValue)
78
+ }
79
+
80
+ return (
81
+ <>
82
+ <SectionContainer>
83
+ <h3>{t('CUSTOMER', 'Customer')}</h3>
84
+ <p>{t('SEARCH_WITH_PHONE_FOR_CUSTOM_ORDER', 'Search with the phone the customer who will assign the custom order.')}</p>
85
+ <SearchBarContainer>
86
+ {showSearchbar ? (
87
+ <SearchBarWrapper>
88
+ <Input
89
+ placeholder={t('PHONE_NUMBER', 'Phone number')}
90
+ onChange={e => onInputChange(e.target.value)}
91
+ defaultValue={phone}
92
+ onKeyPress={(e) => {
93
+ if (!/^[0-9]$/.test(e.key) || e.target.value.length >= 10) {
94
+ e.preventDefault()
95
+ }
96
+ }}
97
+ onFocus={() => setSearchInputFocus(true)}
98
+ onBlur={() => {
99
+ setTimeout(() => {
100
+ setSearchInputFocus(false)
101
+ }, 300)
102
+ }}
103
+ onPaste={(event) => onPhoneNumberPaste(event)}
104
+ />
105
+ {customersPhones.loading && (
106
+ <span className='loading'>
107
+ <CgSpinnerTwoAlt />
108
+ </span>
109
+ )}
110
+ {searchInputFocus && (
111
+ <OptionsToSelectContainer>
112
+ {customersPhones?.users?.length > 0 ? (
113
+ <>
114
+ {customersPhones?.users?.map(user => (
115
+ <SelectOption
116
+ key={user.id}
117
+ onClick={() => onSelectUser(user)}
118
+ >
119
+ <span>{user?.cellphone || user?.phone}</span>
120
+ <Dot />
121
+ <WrapperImage>
122
+ {user?.photo ? (
123
+ <img src={optimizeImage(user?.photo, 'h_50,c_limit')} alt='' />
124
+ ) : (
125
+ <FaUserAlt />
126
+ )}
127
+ </WrapperImage>
128
+ <span className='name'>{user?.name} {user?.lastname}</span>
129
+ </SelectOption>
130
+ ))}
131
+ </>
132
+ ) : (
133
+ <p>
134
+ {
135
+ customersPhones.loading
136
+ ? t('LOADING', 'Loading')
137
+ : phone?.length > 6 ? t('NO_OPTIONS', 'No options') : t('TYPE_AT_LEAST_NUMBER_SUGGEST', 'Type at least 7 numbers for suggesstions')
138
+ }
139
+ </p>
140
+ )}
141
+ </OptionsToSelectContainer>
142
+ )}
143
+ </SearchBarWrapper>
144
+ ) : (
145
+ <>
146
+ <SelectedUserWrapper>
147
+ <SelectOption
148
+ onClick={() => setShowSearchbar(true)}
149
+ >
150
+ <span>{selectedUser?.cellphone || selectedUser?.phone}</span>
151
+ <Dot />
152
+ <WrapperImage>
153
+ {selectedUser?.photo ? (
154
+ <img src={optimizeImage(selectedUser?.photo, 'h_50,c_limit')} alt='' />
155
+ ) : (
156
+ <FaUserAlt />
157
+ )}
158
+ </WrapperImage>
159
+ <span className='name'>{selectedUser?.name} {selectedUser?.lastname}</span>
160
+ </SelectOption>
161
+ </SelectedUserWrapper>
162
+ </>
163
+ )}
164
+ <Button
165
+ borderRadius='8px'
166
+ color='primary'
167
+ disabled={openSidebar === 'user_add_form'}
168
+ onClick={() => handleOpenAddForm()}
169
+ >
170
+ {t('USERS_REGISTER', 'New user')}
171
+ </Button>
172
+ </SearchBarContainer>
173
+ {selectedUser && (
174
+ <CustomerAddressWrapper>
175
+ {customerAddress?.address && (
176
+ <div>
177
+ <HouseDoor />
178
+ <span>{customerAddress?.address}</span>
179
+ </div>
180
+ )}
181
+ <LinkButton
182
+ onClick={() => {
183
+ setOpenSidebar('address_list')
184
+ handleParentSidebarMove(500)
185
+ }}
186
+ >
187
+ {customerAddress?.address ? t('CHANGE', 'Change') : t('ADD_NEW_ADDRESS', 'Add new address')}
188
+ </LinkButton>
189
+ </CustomerAddressWrapper>
190
+ )}
191
+ </SectionContainer>
192
+
193
+ {openSidebar === 'user_add_form' && (
194
+ <SideBar
195
+ isBorderShow
196
+ sidebarId='user_add_form'
197
+ open={openSidebar === 'user_add_form'}
198
+ onClose={() => handleCloseSidebar()}
199
+ >
200
+ <UserAddForm
201
+ isFromCustomOrder
202
+ hideUserTypeSelector
203
+ // defaultPhoneNumber={
204
+ // findExitingCountryPhoneCode(configs?.default_country_code?.value?.toUpperCase())
205
+ // ? `+${findExitingCountryPhoneCode(configs?.default_country_code?.value?.toUpperCase())} ${selectedUser?.cellphone || selectedUser?.phone || phone}`
206
+ // : `+1 ${selectedUser?.cellphone || selectedUser?.phone || phone}`
207
+ // }
208
+ handleSuccessAdd={onSelectUser}
209
+ onClose={() => handleCloseSidebar()}
210
+ />
211
+ </SideBar>
212
+ )}
213
+ {openSidebar === 'address_list' && (
214
+ <SideBar
215
+ isBorderShow={!openExtraAdddress}
216
+ sidebarId='address_list'
217
+ defaultSideBarWidth={openExtraAdddress ? 1000 : 500}
218
+ moveDistance={openExtraAdddress ? 500 : 0}
219
+ open={openSidebar === 'address_list'}
220
+ onClose={() => handleCloseSidebar()}
221
+ >
222
+ <SavedPlaces>
223
+ <h2>{selectedUser?.name} {selectedUser?.lastname}</h2>
224
+ <p>{t('SELECT_CUSTOMER_ADDRESS', 'Select customer address')}</p>
225
+ <AddressListWrapper>
226
+ <AddressList
227
+ isSeletectedUserAddresses
228
+ userId={selectedUser?.id}
229
+ addresses={selectedUser?.addresses}
230
+ userState={{
231
+ user: selectedUser
232
+ }}
233
+ setExtraOpen={setOpenExtraAddress}
234
+ handleSuccessUpdate={setSelectedUser}
235
+ />
236
+ </AddressListWrapper>
237
+ </SavedPlaces>
238
+ </SideBar>
239
+ )}
240
+ </>
241
+ )
242
+ }
@@ -0,0 +1,235 @@
1
+ import styled, { css } from 'styled-components'
2
+
3
+ export const SectionContainer = styled.div`
4
+ margin-bottom: 50px;
5
+
6
+ > p {
7
+ font-size: 14px;
8
+ line-height: 24px;
9
+ margin-top: 0;
10
+ margin-bottom: 24px;
11
+ }
12
+ `
13
+ export const SearchBarContainer = styled.div`
14
+ display: flex;
15
+ align-items: center;
16
+
17
+ > button {
18
+ height: 44px;
19
+ white-space: nowrap;
20
+ }
21
+ `
22
+ export const SearchBarWrapper = styled.div`
23
+ position: relative;
24
+ flex: 1;
25
+
26
+ ${props => props.theme?.rtl ? css`
27
+ margin-left: 13px;
28
+ ` : css`
29
+ margin-right: 13px;
30
+ `}
31
+
32
+ > input {
33
+ width: 100%;
34
+ height: 44px;
35
+ ${props => props.theme?.rtl ? css`
36
+ padding-left: 40px;
37
+ ` : css`
38
+ padding-right: 40px;
39
+ `}
40
+ }
41
+
42
+ span.loading {
43
+ position: absolute;
44
+ top: 10px;
45
+ ${props => props.theme?.rtl ? css`
46
+ left: 10px;
47
+ ` : css`
48
+ right: 10px;
49
+ `}
50
+
51
+ @keyframes spinner-content {
52
+ 0% { transform: rotate(0) }
53
+ 100% { transform: rotate(360deg) }
54
+ }
55
+
56
+ svg {
57
+ animation: spinner-content 1.85s linear infinite;
58
+ color: ${props => props.theme.colors.headingColor};
59
+ }
60
+ }
61
+ `
62
+ export const OptionsToSelectContainer = styled.div`
63
+ position: absolute;
64
+ top: 50px;
65
+ left: 0;
66
+ width: 100%;
67
+ max-height: 300px;
68
+ overflow-x: hidden;
69
+ border-radius: 8px;
70
+ border: 1px solid ${props => props.theme.colors.borderColor};
71
+ background-color: ${props => props.theme.colors.backgroundPage};
72
+ padding: 9px 0;
73
+
74
+ > p {
75
+ font-size: 12px;
76
+ margin: 0 16px;
77
+ }
78
+ `
79
+ export const SelectOption = styled.div`
80
+ cursor: pointer;
81
+ width: 100%;
82
+ padding: 9px 16px;
83
+ display: flex;
84
+ align-items: center;
85
+
86
+ &:hover {
87
+ background-color: ${props => props.theme.colors.secundary};
88
+ }
89
+ span {
90
+ font-size: 14px;
91
+ &.name {
92
+ overflow: hidden;
93
+ text-overflow: ellipsis;
94
+ white-space: nowrap;
95
+ }
96
+ }
97
+ `
98
+
99
+ export const WrapperImage = styled.div`
100
+ position: relative;
101
+ max-width: 24px;
102
+ max-height: 24px;
103
+ height: 24px;
104
+ width: 24px;
105
+ box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.1);
106
+ border-radius: 8px;
107
+ margin: 0 6px;
108
+
109
+ svg {
110
+ width: 100%;
111
+ height: 100%;
112
+ padding: 3px;
113
+ box-sizing: border-box;
114
+ border-radius: 50%;
115
+ }
116
+
117
+ img {
118
+ width: 100%;
119
+ height: 100%;
120
+ border-radius: 8px;
121
+ object-fit: cover;
122
+ }
123
+ `
124
+ export const SelectedUserWrapper = styled.div`
125
+ border-radius: 8px;
126
+ border: 1px solid ${props => props.theme.colors.borderColor};
127
+ height: 44px;
128
+ display: flex;
129
+ align-items: center;
130
+ flex: 1;
131
+
132
+ ${props => props.theme?.rtl ? css`
133
+ margin-left: 13px;
134
+ ` : css`
135
+ margin-right: 13px;
136
+ `}
137
+ `
138
+ export const CustomerAddressWrapper = styled.div`
139
+ margin-top: 21px;
140
+ > div {
141
+ display: flex;
142
+ align-items: center;
143
+ svg {
144
+ color: ${props => props.theme.colors.secundaryLight};
145
+ font-size: 14px;
146
+ }
147
+
148
+ span {
149
+ flex: 1;
150
+ font-size: 14px;
151
+ line-height: 24px;
152
+ ${props => props.theme?.rtl ? css`
153
+ margin-right: 15px;
154
+ ` : css`
155
+ margin-left: 15px;
156
+ `}
157
+ }
158
+ }
159
+
160
+ a {
161
+ ${props => props.theme?.rtl ? css`
162
+ margin-left: 30px;
163
+ ` : css`
164
+ margin-left: 30px;
165
+ `}
166
+ font-size: 12px;
167
+ }
168
+ `
169
+ export const SavedPlaces = styled.div`
170
+ width: 100%;
171
+ padding: 25px 20px;
172
+ overflow: auto;
173
+
174
+ > h2 {
175
+ font-size: 20px;
176
+ font-weight: 700;
177
+ margin-top: 0;
178
+ margin-bottom: 25px;
179
+
180
+ ${props => props.theme?.rtl ? css`
181
+ margin-left: 40px;
182
+ ` : css`
183
+ margin-right: 40px;
184
+ `}
185
+ }
186
+
187
+ > p {
188
+ font-size: 16px;
189
+ line-height: 24px;
190
+ font-weight: 600;
191
+ margin-top: 0;
192
+ margin-bottom: 25px;
193
+ }
194
+ `
195
+ export const AddressListWrapper = styled.div`
196
+ display: flex;
197
+ height: calc(100% - 120px);
198
+ > div:first-child {
199
+ position: relative;
200
+ display: flex;
201
+ box-sizing: border-box;
202
+ flex: 1;
203
+
204
+ > button{
205
+ width: auto;
206
+ align-self: center;
207
+ position: absolute;
208
+ bottom: 0px;
209
+
210
+ ${props => props.theme?.rtl ? css`
211
+ right: 0px;
212
+ ` : css`
213
+ left: 0px;
214
+ `}
215
+ }
216
+
217
+ > ul {
218
+ margin-top: 0px;
219
+ max-height: calc(100% - 70px);
220
+ overflow: auto;
221
+ }
222
+ }
223
+
224
+
225
+ @media (min-width: 768px){
226
+ ul{
227
+ width: 100%;
228
+ }
229
+ >div {
230
+ > button {
231
+ width: 65%;
232
+ }
233
+ }
234
+ }
235
+ `
@@ -0,0 +1,237 @@
1
+ import React, { useState, useRef, useEffect } from 'react'
2
+ import { useLanguage, useUtils, useOrder } from 'ordering-components-admin-external'
3
+ import { Input, IconButton } from '../../../../styles'
4
+ import { DashCircle, PlusCircle, Pencil, Trash } from 'react-bootstrap-icons'
5
+ import CgSpinnerTwoAlt from '@meronex/icons/cg/CgSpinnerTwoAlt'
6
+ import BiImage from '@meronex/icons/bi/BiImage'
7
+ import { Modal, Confirm } from '../../../Shared'
8
+ import { ProductForm } from '../ProductForm'
9
+
10
+ import {
11
+ Container,
12
+ SearchProductsWrapper,
13
+ OptionsToSelectContainer,
14
+ SelectOption,
15
+ WrapperImage,
16
+ CartProductsWrapper,
17
+ ProductQuantityActionsContainer,
18
+ CartProductsConatiner,
19
+ ProductEditDeleteActions
20
+ } from './styles'
21
+
22
+ export const SelectProducts = (props) => {
23
+ const {
24
+ productList,
25
+ getProducts,
26
+ handeUpdateProductCart,
27
+ cart,
28
+ business
29
+ } = props
30
+
31
+ const [, t] = useLanguage()
32
+ const [{ optimizeImage }] = useUtils()
33
+ const [, { removeProduct }] = useOrder()
34
+
35
+ const searchInputRef = useRef(null)
36
+ const [searchInputFocus, setSearchInputFocus] = useState(false)
37
+ const [openProduct, setOpenProduct] = useState(false)
38
+ const [curProduct, setCurProduct] = useState(null)
39
+ const [selectedProductCart, setSelectedProductCart] = useState(null)
40
+ const [isCartProduct, setIsCartProduct] = useState(false)
41
+ const [confirm, setConfirm] = useState({ open: false, content: null, handleOnAccept: null })
42
+
43
+ let timeout = null
44
+ const onInputChange = (inputValue) => {
45
+ clearTimeout(timeout)
46
+ timeout = setTimeout(function () {
47
+ getProducts(inputValue)
48
+ }, 750)
49
+ }
50
+
51
+ const handleSelectProduct = (product) => {
52
+ setIsCartProduct(false)
53
+ setSelectedProductCart(null)
54
+ setCurProduct(product)
55
+ setOpenProduct(true)
56
+ }
57
+
58
+ const handleEditProduct = (product) => {
59
+ setIsCartProduct(true)
60
+ setCurProduct(null)
61
+ setSelectedProductCart(product)
62
+ setOpenProduct(true)
63
+ }
64
+
65
+ const closeModalProductForm = () => {
66
+ setCurProduct(null)
67
+ setOpenProduct(false)
68
+ }
69
+
70
+ const handleDeleteClick = (product) => {
71
+ setConfirm({
72
+ open: true,
73
+ content: t('QUESTION_DELETE_PRODUCT', 'Are you sure that you want to delete the product?'),
74
+ handleOnAccept: () => {
75
+ removeProduct(product, cart)
76
+ setConfirm({ ...confirm, open: false })
77
+ }
78
+ })
79
+ }
80
+
81
+ useEffect(() => {
82
+ if (business?.id) {
83
+ searchInputRef.current.value = ''
84
+ }
85
+ }, [business?.id])
86
+
87
+ useEffect(() => {
88
+ if (!searchInputFocus || !productList?.products?.length) return
89
+ const el = document.querySelector('.custom-order-content')
90
+ if (el) {
91
+ el.scrollTo({
92
+ top: 300,
93
+ behavior: 'smooth'
94
+ })
95
+ }
96
+ }, [searchInputFocus, productList?.products])
97
+
98
+ return (
99
+ <Container>
100
+ <h3>{t('WAHT_WANT_TO_BUY', 'What do you want us to buy?')}</h3>
101
+ <SearchProductsWrapper>
102
+ <Input
103
+ ref={searchInputRef}
104
+ placeholder={t('SEARCH_PRODUCTOS', 'Search products')}
105
+ onChange={e => onInputChange(e.target.value)}
106
+ onFocus={() => setSearchInputFocus(true)}
107
+ onBlur={() => {
108
+ setTimeout(() => {
109
+ setSearchInputFocus(false)
110
+ }, 300)
111
+ }}
112
+ />
113
+ {productList.loading && (
114
+ <span className='loading'>
115
+ <CgSpinnerTwoAlt />
116
+ </span>
117
+ )}
118
+ {searchInputFocus && (
119
+ <OptionsToSelectContainer>
120
+ {productList?.products?.length > 0 ? (
121
+ <>
122
+ {productList?.products?.map(product => (
123
+ <SelectOption
124
+ key={product.id}
125
+ onClick={() => handleSelectProduct(product)}
126
+ >
127
+ <WrapperImage>
128
+ {product?.images ? (
129
+ <img src={optimizeImage(product?.images, 'h_50,c_limit')} alt='' />
130
+ ) : (
131
+ <BiImage />
132
+ )}
133
+ </WrapperImage>
134
+ <span className='name'>{product?.name}</span>
135
+ </SelectOption>
136
+ ))}
137
+ </>
138
+ ) : (
139
+ <p>
140
+ {
141
+ productList.loading
142
+ ? t('LOADING', 'Loading')
143
+ : t('SEARCH_PRODUCTOS', 'Search products')
144
+ }
145
+ </p>
146
+ )}
147
+ </OptionsToSelectContainer>
148
+ )}
149
+ </SearchProductsWrapper>
150
+ <CartProductsConatiner>
151
+ {cart?.products?.map((product, index) => (
152
+ <CartProductsWrapper key={`${product.id}_${index}`}>
153
+ <SelectOption>
154
+ <WrapperImage>
155
+ {product?.images ? (
156
+ <img src={optimizeImage(product?.images, 'h_50,c_limit')} alt='' />
157
+ ) : (
158
+ <BiImage />
159
+ )}
160
+ </WrapperImage>
161
+ <span className='name'>{product?.name}</span>
162
+ </SelectOption>
163
+ <ProductQuantityActionsContainer>
164
+ <IconButton
165
+ color='black'
166
+ disabled={product?.quantity === 1}
167
+ onClick={() => handeUpdateProductCart(product, false)}
168
+ >
169
+ <DashCircle />
170
+ </IconButton>
171
+ <Input
172
+ type='number'
173
+ disabled
174
+ max={product?.maximum_per_order}
175
+ value={product?.quantity}
176
+ />
177
+ <IconButton
178
+ color='black'
179
+ disabled={product?.maximum_per_order === product?.quantity}
180
+ onClick={() => handeUpdateProductCart(product, true)}
181
+ >
182
+ <PlusCircle />
183
+ </IconButton>
184
+ </ProductQuantityActionsContainer>
185
+ <ProductEditDeleteActions>
186
+ <IconButton
187
+ color='black'
188
+ onClick={() => handleEditProduct(product)}
189
+ >
190
+ <Pencil />
191
+ </IconButton>
192
+ <IconButton
193
+ color='black'
194
+ onClick={() => handleDeleteClick(product)}
195
+ >
196
+ <Trash />
197
+ </IconButton>
198
+ </ProductEditDeleteActions>
199
+ </CartProductsWrapper>
200
+ ))}
201
+ </CartProductsConatiner>
202
+
203
+ <Modal
204
+ width='760px'
205
+ open={openProduct}
206
+ closeOnBackdrop
207
+ onClose={() => closeModalProductForm()}
208
+ padding='0'
209
+ isProductForm
210
+ disableOverflowX
211
+ >
212
+ <ProductForm
213
+ isCartProduct={isCartProduct}
214
+ product={curProduct}
215
+ productCart={selectedProductCart}
216
+ businessSlug={business?.slug}
217
+ businessId={business?.id}
218
+ categoryId={curProduct?.category_id || selectedProductCart?.category_id}
219
+ productId={curProduct?.id || selectedProductCart?.id}
220
+ onSave={() => setOpenProduct(false)}
221
+ productAddedToCartLength={cart?.products?.reduce((productsLength, Cproduct) => { return productsLength + (Cproduct?.id === curProduct?.id ? Cproduct?.quantity : 0) }, 0) || 0}
222
+ />
223
+ </Modal>
224
+
225
+ <Confirm
226
+ title={t('PRODUCT', 'Product')}
227
+ content={confirm.content}
228
+ acceptText={t('ACCEPT', 'Accept')}
229
+ open={confirm.open}
230
+ onClose={() => setConfirm({ ...confirm, open: false })}
231
+ onCancel={() => setConfirm({ ...confirm, open: false })}
232
+ onAccept={confirm.handleOnAccept}
233
+ closeOnBackdrop={false}
234
+ />
235
+ </Container>
236
+ )
237
+ }