ordering-ui-admin-external 1.43.20 → 1.43.22

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 (35) hide show
  1. package/_bundles/{ordering-ui-admin.93ac710b95858715130d.js → ordering-ui-admin.3f67563d0aa434e9729f.js} +2 -2
  2. package/_modules/components/Delivery/DriverGroupSelectorHeader/index.js +130 -0
  3. package/_modules/components/Delivery/DriverGroupSelectorHeader/styles.js +32 -0
  4. package/_modules/components/Delivery/DriversGroupGeneralForm/index.js +14 -5
  5. package/_modules/components/Delivery/DriversTimeDisplay/DriverBlockAddForm.js +212 -0
  6. package/_modules/components/Delivery/DriversTimeDisplay/UserList.js +226 -0
  7. package/_modules/components/Delivery/DriversTimeDisplay/index.js +485 -0
  8. package/_modules/components/Delivery/DriversTimeDisplay/styles.js +198 -0
  9. package/_modules/components/Delivery/index.js +8 -1
  10. package/_modules/components/Settings/SettingsLogs/index.js +28 -16
  11. package/_modules/components/SidebarMenu/index.js +30 -24
  12. package/_modules/components/Stores/BusinessDetails/index.js +2 -0
  13. package/_modules/components/Stores/BusinessSummary/index.js +16 -1
  14. package/_modules/index.js +6 -0
  15. package/_modules/utils/index.js +4 -2
  16. package/package.json +3 -2
  17. package/src/components/Delivery/DriverGroupSelectorHeader/index.js +124 -0
  18. package/src/components/Delivery/DriverGroupSelectorHeader/styles.js +97 -0
  19. package/src/components/Delivery/DriversGroupGeneralForm/index.js +12 -2
  20. package/src/components/Delivery/DriversTimeDisplay/DriverBlockAddForm.js +271 -0
  21. package/src/components/Delivery/DriversTimeDisplay/UserList.js +292 -0
  22. package/src/components/Delivery/DriversTimeDisplay/index.js +535 -0
  23. package/src/components/Delivery/DriversTimeDisplay/styles.js +853 -0
  24. package/src/components/Delivery/index.js +2 -0
  25. package/src/components/Settings/SettingsLogs/index.js +13 -0
  26. package/src/components/SidebarMenu/index.js +9 -1
  27. package/src/components/Stores/BusinessDetails/index.js +2 -0
  28. package/src/components/Stores/BusinessSummary/index.js +29 -8
  29. package/src/index.js +2 -0
  30. package/src/utils/index.js +54 -0
  31. package/template/app.js +4 -1
  32. package/template/components/ListenPageChanges/index.js +1 -0
  33. package/template/helmetdata.json +7 -0
  34. package/template/pages/DriverTimeDisplay/index.js +12 -0
  35. /package/_bundles/{ordering-ui-admin.93ac710b95858715130d.js.LICENSE.txt → ordering-ui-admin.3f67563d0aa434e9729f.js.LICENSE.txt} +0 -0
@@ -0,0 +1,271 @@
1
+ import React from 'react'
2
+ import moment from 'moment'
3
+ import { Button, Checkbox, DefaultSelect, Switch } from '../../../styles'
4
+ import { InputPrimary, TextArea } from '../../../styles/Inputs'
5
+ import { useLanguage } from 'ordering-components-admin-external'
6
+ import { Circle, RecordCircleFill } from 'react-bootstrap-icons/dist'
7
+ import DatePicker from 'react-datepicker'
8
+ import {
9
+ FormControl,
10
+ FormWrapper,
11
+ WeekDayCheckWrapper,
12
+ RrulesItem,
13
+ RrulesListWrapper,
14
+ SelectTitle,
15
+ SelectTitleWrappre,
16
+ SelectWrapper,
17
+ ChecksWrapper,
18
+ SelectsWrapper,
19
+ ButtonsWrapper,
20
+ ShowBreakBlocksWrapper,
21
+ BlocksWrapper,
22
+ DateBlockWrapper
23
+ } from './styles'
24
+ import Skeleton from 'react-loading-skeleton'
25
+
26
+ export const DriverBlockAddFormUI = (props) => {
27
+ const {
28
+ scheduleOptions,
29
+ selectedBlock,
30
+ handleChangeScheduleTime,
31
+ setScheduleState,
32
+ rruleList,
33
+ setRuleState,
34
+ scheduleState,
35
+ ruleState,
36
+ handleChangeStartDate,
37
+ rruleDayList,
38
+ selectedDate,
39
+ selectedUntilDate,
40
+ isEdit,
41
+ handleAddBlockTime,
42
+ setOpenDeleteModal,
43
+ setShowBreakBlock,
44
+ showBreakBlock,
45
+ handleUntilDate,
46
+ setOpenEditModal,
47
+ scheduleOptionValues
48
+ } = props
49
+
50
+ const [, t] = useLanguage()
51
+
52
+ const getHourOrMinute = (block, isStart) => {
53
+ if (!block) {
54
+ return isStart ? '00:00' : '23:59'
55
+ }
56
+ const hour = moment(block).hour()
57
+ const minute = moment(block).minute()
58
+ const time = hour === 23 && minute === 59 ? `${hour}:${minute}` : `${(hour < 10 ? `0${hour}` : hour)}:${minute !== 0 ? parseInt((minute / 15) * 15) : '00'}`
59
+ return time
60
+ }
61
+
62
+ const handleChangeFrequency = (value) => {
63
+ setRuleState({ ...ruleState, freq: value })
64
+ }
65
+
66
+ const handleChangeInput = (e) => {
67
+ setScheduleState({
68
+ ...scheduleState,
69
+ state: {
70
+ ...scheduleState.state,
71
+ [e.target.name]: e.target.value || ''
72
+ }
73
+ })
74
+ }
75
+
76
+ const handleChangeDaily = (e, value) => {
77
+ if (e.target.checked) {
78
+ setRuleState({ ...ruleState, byweekday: [...ruleState.byweekday, value] })
79
+ } else {
80
+ setRuleState({ ...ruleState, byweekday: ruleState.byweekday.filter(day => day !== value) })
81
+ }
82
+ }
83
+
84
+ return (
85
+ <FormWrapper>
86
+ <span>{t('BLOCK_NAME', 'Block Name')}</span>
87
+ <InputPrimary
88
+ name='name'
89
+ placeholder={t('BLOCK_NAME_OPTIONAL', 'Block name (Optional)')}
90
+ onChange={e => handleChangeInput(e)}
91
+ defaultValue={selectedBlock?.name}
92
+ />
93
+
94
+ <span>{t('BLOCK_DESCRIPTION', 'Block Description')}</span>
95
+ <TextArea
96
+ name='description'
97
+ placeholder={t('BLOCK_DESCRIPTION_OPTIONAL', 'Block description (Optional)')}
98
+ onChange={e => handleChangeInput(e)}
99
+ defaultValue={selectedBlock?.description}
100
+ />
101
+ <BlocksWrapper>
102
+ <DateBlockWrapper>
103
+ <span>{t('BLOCK_DATE', 'Block date')}</span>
104
+ <DatePicker
105
+ selected={scheduleState?.state?.start ? selectedDate === new Date(scheduleState?.state?.start) ? new Date(scheduleState?.state?.start) : selectedDate : selectedDate}
106
+ placeholderText='mm/dd/yyyy'
107
+ className='startDate'
108
+ minDate={new Date()}
109
+ onChange={date => handleChangeStartDate(date)}
110
+ />
111
+ </DateBlockWrapper>
112
+ <ShowBreakBlocksWrapper>
113
+ <span>{t('SHOW_BREAK_BLOCK', 'Show break blocks')}</span>
114
+ <Switch
115
+ defaultChecked={showBreakBlock}
116
+ onChange={enabled => setShowBreakBlock(enabled)}
117
+ disabled={showBreakBlock && isEdit}
118
+ />
119
+ </ShowBreakBlocksWrapper>
120
+ </BlocksWrapper>
121
+ <SelectsWrapper>
122
+ <SelectTitleWrappre>
123
+ <SelectTitle>{t('START_BLOCK_DATE', 'Start block date:')}</SelectTitle>
124
+ {scheduleOptionValues.includes(getHourOrMinute(scheduleState?.state?.start ?? selectedBlock?.start, true)) ? (
125
+ <SelectWrapper>
126
+ <DefaultSelect
127
+ noSelected
128
+ options={scheduleOptions.filter(option => !['break_start', 'end', 'break_end'].includes(option?.name))}
129
+ defaultValue={getHourOrMinute(scheduleState?.state?.start ?? selectedBlock?.start, true)}
130
+ onChange={val => handleChangeScheduleTime(val, true)}
131
+ optionInnerMaxHeight='300px'
132
+ />
133
+ </SelectWrapper>
134
+ ) : (
135
+ <Skeleton
136
+ height={34}
137
+ width={95}
138
+ />
139
+ )}
140
+ </SelectTitleWrappre>
141
+ <SelectTitleWrappre>
142
+ <SelectTitle>{t('END_BLOCK_DATE', 'End block date:')}</SelectTitle>
143
+ {scheduleOptionValues.includes(getHourOrMinute(scheduleState?.state?.end ?? selectedBlock?.end, true)) ? (
144
+ <SelectWrapper>
145
+ <DefaultSelect
146
+ noSelected
147
+ options={scheduleOptions.filter(option => !['break_start', 'start', 'break_end'].includes(option?.name))}
148
+ defaultValue={getHourOrMinute(scheduleState?.state?.end ?? selectedBlock?.end)}
149
+ onChange={val => handleChangeScheduleTime(val, false)}
150
+ optionInnerMaxHeight='300px'
151
+ />
152
+ </SelectWrapper>
153
+ ) : (
154
+ <Skeleton
155
+ height={34}
156
+ width={95}
157
+ />
158
+ )}
159
+ </SelectTitleWrappre>
160
+ {showBreakBlock && (
161
+ <SelectTitleWrappre>
162
+ <SelectTitle>{t('START_BREAK_BLOCK_DATE', 'Start break block date:')}</SelectTitle>
163
+ {scheduleOptionValues.includes(getHourOrMinute(scheduleState?.state?.break_start ?? selectedBlock?.break_start, true)) ? (
164
+ <SelectWrapper>
165
+ <DefaultSelect
166
+ noSelected
167
+ options={scheduleOptions.filter(option => !['start', 'end', 'break_end'].includes(option?.name))}
168
+ defaultValue={getHourOrMinute(scheduleState?.state?.break_start ?? selectedBlock?.break_start, true)}
169
+ onChange={val => handleChangeScheduleTime(val, true, true)}
170
+ optionInnerMaxHeight='300px'
171
+ />
172
+ </SelectWrapper>
173
+ ) : (
174
+ <Skeleton
175
+ height={34}
176
+ width={95}
177
+ />
178
+ )}
179
+ </SelectTitleWrappre>
180
+ )}
181
+ {showBreakBlock && (
182
+ <SelectTitleWrappre>
183
+ <SelectTitle>{t('END_BREAK_BLOCK_DATE', 'End break block date:')}</SelectTitle>
184
+ {
185
+ scheduleOptionValues.includes(getHourOrMinute(scheduleState?.state?.break_end ?? selectedBlock?.break_end, true)) ||
186
+ getHourOrMinute(scheduleState?.state?.break_end ?? selectedBlock?.break_end) === scheduleOptionValues[scheduleOptionValues?.length - 1]
187
+ ? (
188
+ <SelectWrapper>
189
+ <DefaultSelect
190
+ noSelected
191
+ options={scheduleOptions.filter(option => !['break_start', 'end', 'start'].includes(option?.name))}
192
+ defaultValue={getHourOrMinute(scheduleState?.state?.break_end ?? selectedBlock?.break_end)}
193
+ onChange={val => handleChangeScheduleTime(val, false, true)}
194
+ optionInnerMaxHeight='300px'
195
+ />
196
+ </SelectWrapper>
197
+ ) : (
198
+ <Skeleton
199
+ height={34}
200
+ width={95}
201
+ />
202
+ )
203
+ }
204
+ </SelectTitleWrappre>
205
+ )}
206
+ </SelectsWrapper>
207
+
208
+ <FormControl>
209
+ <span>{t('FREQUENCY', 'Frequency')}</span>
210
+ <RrulesListWrapper>
211
+ {rruleList.map(rule => (
212
+ <RrulesItem key={rule.value} onClick={() => handleChangeFrequency(rule?.value)}>
213
+ {ruleState?.freq === rule.value ? <RecordCircleFill className='active' /> : <Circle />}
214
+ <span>{rule.name}</span>
215
+ </RrulesItem>
216
+ ))}
217
+ </RrulesListWrapper>
218
+ </FormControl>
219
+
220
+ {ruleState?.freq && (
221
+ <>
222
+ <span>{t('BY_WEEK_DAY', 'By week day')}</span>
223
+ <ChecksWrapper>
224
+ {rruleDayList.map(day => (
225
+ <WeekDayCheckWrapper key={day.value.weekday}>
226
+ <Checkbox
227
+ defaultChecked={ruleState.byweekday?.includes(day.value.weekday)}
228
+ onChange={e => handleChangeDaily(e, day.value.weekday)}
229
+ />
230
+ <h4>{day.name}</h4>
231
+ </WeekDayCheckWrapper>
232
+ ))}
233
+ </ChecksWrapper>
234
+ {!isEdit && (
235
+ <>
236
+ <span>{t('UNTIL_DATE', 'Until date')}</span>
237
+ <DatePicker
238
+ selected={selectedUntilDate}
239
+ placeholderText='mm/dd/yyyy'
240
+ className='endDate'
241
+ minDate={new Date()}
242
+ onChange={date => handleUntilDate(date)}
243
+ />
244
+ </>
245
+ )}
246
+ </>
247
+ )}
248
+
249
+ <ButtonsWrapper>
250
+ {isEdit && (
251
+ <Button
252
+ color='lightPrimary'
253
+ borderRadius='8px'
254
+ disabled={scheduleState.loading}
255
+ onClick={() => setOpenDeleteModal(true)}
256
+ >
257
+ {t('DELETE', 'Delete')}
258
+ </Button>
259
+ )}
260
+ <Button
261
+ color='primary'
262
+ borderRadius='8px'
263
+ disabled={scheduleState.loading || (isEdit ? false : !scheduleState?.state?.until && scheduleState.rrule)}
264
+ onClick={() => isEdit ? setOpenEditModal(true) : handleAddBlockTime()}
265
+ >
266
+ {scheduleState.loading ? t('LOADING', 'Loading') : isEdit ? t('EDIT', 'Edit') : t('ADD', 'Add')}
267
+ </Button>
268
+ </ButtonsWrapper>
269
+ </FormWrapper>
270
+ )
271
+ }
@@ -0,0 +1,292 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ import { useLanguage, useUtils, useConfig } from 'ordering-components-admin-external'
3
+ import Skeleton from 'react-loading-skeleton'
4
+ import FaUserAlt from '@meronex/icons/fa/FaUserAlt'
5
+ import { Envelope, Phone } from 'react-bootstrap-icons'
6
+ import { Pagination, ConfirmAdmin } from '../../Shared'
7
+ import { Button } from '../../../styles'
8
+ import { TwelveHours, TwentyFourHours } from '../../../utils'
9
+ import moment from 'moment'
10
+
11
+ import {
12
+ UsersListingContainer,
13
+ UsersConatiner,
14
+ UserTableWrapper,
15
+ UsersTable,
16
+ WrapperImage,
17
+ Image,
18
+ UserMainInfo,
19
+ InfoBlock,
20
+ WrapperPagination,
21
+ UsersBottomContainer,
22
+ VerifiedItemsContainer,
23
+ VerifiedItem,
24
+ UserIdWrapper,
25
+ Block,
26
+ EmptyBlock,
27
+ UserRow,
28
+ HoursHeader,
29
+ UserName,
30
+ WeekHeader,
31
+ ThId,
32
+ ThName,
33
+ ButtonWrapper
34
+ } from './styles'
35
+
36
+ export const DeliveryUsersListing = (props) => {
37
+ const {
38
+ date,
39
+ driversList,
40
+ paginationProps,
41
+ getDrivers,
42
+ handleSelectDriver,
43
+ selectedGroup,
44
+ setStackEventsState
45
+ } = props
46
+
47
+ const [, t] = useLanguage()
48
+ const [{ optimizeImage }] = useUtils()
49
+ const [{ configs }] = useConfig()
50
+ const [confirmAdmin, setConfirmAdmin] = useState({ open: false, handleOnConfirm: null })
51
+ const is12hours = configs?.general_hour_format?.value === 'hh:mma'
52
+ const hourFormat = configs?.general_hour_format?.value
53
+
54
+ const handleChangePage = (page) => {
55
+ getDrivers(page, 10, selectedGroup?.id)
56
+ }
57
+
58
+ const handleChangePageSize = (pageSize) => {
59
+ const expectedPage = Math.ceil(paginationProps.from / pageSize)
60
+ getDrivers(expectedPage, pageSize, selectedGroup?.id)
61
+ }
62
+
63
+ const getDatesInRange = (date_range) => {
64
+ const start = moment(date_range[0])
65
+ const end = moment(date_range[1])
66
+ const dates = [];
67
+
68
+ let current = start;
69
+
70
+ while (current <= end) {
71
+ dates.push(current.format('YYYY-MM-DD'))
72
+ current = current.clone().add(1, 'days')
73
+ }
74
+
75
+ return dates;
76
+ }
77
+
78
+ const handleHourBlockWidth = (block) => {
79
+ if (!block) return
80
+ let width = 0
81
+ const startHour = moment(block?.start).hour()
82
+ const endHour = moment(block?.end).hour()
83
+ const startMinutes = moment(block?.start).minutes() / 15
84
+ const endMinutes = moment(block?.end).minutes() / 15
85
+ const minutesDiff = startMinutes < endMinutes ? endMinutes - startMinutes : startMinutes - endMinutes
86
+ if (startMinutes !== endMinutes) {
87
+ width = ((startHour === 0 ? (endHour - 1 - startHour) : (endHour - startHour)) * 86) + (minutesDiff * 21.5)
88
+ } else {
89
+ width = (startHour === 0 ? (endHour - 1 - startHour) : (endHour - startHour)) * 86
90
+ }
91
+ return width
92
+ }
93
+
94
+ const handleBlockHourToShow = (block, user) => {
95
+ if (!block) return
96
+ return block.start && block.end &&
97
+ <td>
98
+ <Block
99
+ innerWidth={handleHourBlockWidth(block)}
100
+ rowPosition={moment(block?.start).hour()}
101
+ cellPosition={moment(block?.start).minutes() / 15}
102
+ cellWidth={86}
103
+ cellSections={21.5}
104
+ onClick={() => handleSelectDriver(user, block)}
105
+ >
106
+ <UserName>{`${!!user?.name ? user?.name : ''} ${!!user?.lastname ? user?.lastname : ''}`}</UserName>
107
+ <p>{moment(block.start).format(hourFormat)} - {moment(block.end).format(hourFormat)}</p>
108
+ </Block>
109
+ </td>
110
+ }
111
+
112
+ const handleBlockWeekToShow = (block, user, allBlocks, blockByDay) => {
113
+ if (!block) return
114
+ return block.start && block.end && (
115
+ blockByDay?.length === 1 ?
116
+ <Block
117
+ innerWidth={106}
118
+ rowPosition={allBlocks.indexOf(moment(block?.start).format('YYYY-MM-DD'))}
119
+ cellPosition={4}
120
+ cellWidth={160}
121
+ cellSections={6.67}
122
+ onClick={() => handleSelectDriver(user, block)}
123
+ >
124
+ <p>{moment(block.start).format(hourFormat)} - {moment(block.end).format(hourFormat)}</p>
125
+ </Block>
126
+ :
127
+ <ButtonWrapper
128
+ rowPosition={allBlocks.indexOf(moment(block?.start).format('YYYY-MM-DD'))}
129
+ cellPosition={moment(block?.start).hour()}
130
+ cellWidth={160}
131
+ cellSections={6.67}
132
+ >
133
+ <Button
134
+ color='lightPrimary'
135
+ borderRadius='8px'
136
+ onClick={() => setStackEventsState({ open: true, events: blockByDay, user: user })}
137
+ >
138
+ {blockByDay?.length} {t('BLOCKS', 'Blocks')}
139
+ </Button>
140
+ </ButtonWrapper>
141
+ )
142
+ }
143
+
144
+ const getBlocksByDate = (blocks, _date) => {
145
+ return blocks?.filter(obj => {
146
+ const objDate = moment(obj.start)
147
+ return objDate.date() === moment(_date).date()
148
+ })
149
+ }
150
+
151
+ useEffect(() => {
152
+ if (driversList.loading || driversList?.users?.length > 0 || paginationProps.totalPages <= 1) return
153
+ if (paginationProps.currentPage !== paginationProps.totalPages) {
154
+ handleChangePage(paginationProps.currentPage)
155
+ } else {
156
+ handleChangePage(paginationProps.currentPage - 1)
157
+ }
158
+ }, [driversList?.users, paginationProps])
159
+
160
+ return (
161
+ <UsersListingContainer>
162
+ <UsersConatiner>
163
+ <UserTableWrapper>
164
+ <UsersTable>
165
+ <thead>
166
+ <tr>
167
+ <ThId>{t('ID', 'ID')}</ThId>
168
+ <ThName>{t('NAME', 'Name')}</ThName>
169
+ {getDatesInRange(date).length === 1 && (is12hours ? TwelveHours : TwentyFourHours).map((hour, i) => (
170
+ <HoursHeader key={i}>{hour}</HoursHeader>
171
+ ))}
172
+ {getDatesInRange(date).length > 1 && getDatesInRange(date).map((_date, i) => (
173
+ <WeekHeader key={i}>
174
+ <span>{moment(_date).format('ddd')}</span>
175
+ <h4>{moment(_date).date()}</h4>
176
+ </WeekHeader>
177
+ ))}
178
+ </tr>
179
+ </thead>
180
+ {driversList?.loading ? (
181
+ [...Array(10).keys()].map(i => (
182
+ <tbody key={i}>
183
+ <tr>
184
+ <td>
185
+ <UserIdWrapper>
186
+ <Skeleton width={40} />
187
+ </UserIdWrapper>
188
+ </td>
189
+ <td>
190
+ <UserMainInfo>
191
+ <WrapperImage isSkeleton>
192
+ <Skeleton width={45} height={45} />
193
+ </WrapperImage>
194
+ <InfoBlock>
195
+ <p className='bold'><Skeleton width={150} /></p>
196
+ <p><Skeleton width={100} /></p>
197
+ </InfoBlock>
198
+ </UserMainInfo>
199
+ </td>
200
+ </tr>
201
+ </tbody>
202
+ ))
203
+ ) : (
204
+ driversList?.users?.map((user, i) => (
205
+ <tbody key={i}>
206
+ <UserRow>
207
+ <td>
208
+ <UserIdWrapper>
209
+ {user?.id}
210
+ </UserIdWrapper>
211
+ </td>
212
+ <td>
213
+ <UserMainInfo>
214
+ <WrapperImage>
215
+ {user?.photo ? (
216
+ <Image bgimage={optimizeImage(user?.photo, 'h_50,c_limit')} />
217
+ ) : (
218
+ <FaUserAlt />
219
+ )}
220
+ </WrapperImage>
221
+ <InfoBlock>
222
+ <span className='bold'>{`${user.name ?? ''} ${user?.lastname ?? ''}`}</span>
223
+ <span>{user?.email}</span>
224
+ </InfoBlock>
225
+ {(user?.phone_verified || user?.email_verified) && (
226
+ <VerifiedItemsContainer>
227
+ {!!user?.phone_verified && (
228
+ <VerifiedItem>
229
+ <Phone />
230
+ {t('VERIFIED', 'Verified')}
231
+ </VerifiedItem>
232
+ )}
233
+
234
+ {!!user?.email_verified && (
235
+ <VerifiedItem>
236
+ <Envelope />
237
+ {t('VERIFIED', 'Verified')}
238
+ </VerifiedItem>
239
+ )}
240
+ </VerifiedItemsContainer>
241
+ )}
242
+ </UserMainInfo>
243
+ </td>
244
+ {getDatesInRange(date)?.length === 1 && (
245
+ <>
246
+ {[...Array(24 - user?.delivery_blocks?.length).keys()].map(i => (
247
+ <td key={i}><EmptyBlock onClick={() => handleSelectDriver(user, null)} /></td>
248
+ ))}
249
+ {user?.delivery_blocks?.map((block, j) => (
250
+ <React.Fragment key={j}>{handleBlockHourToShow(block, user)}</React.Fragment>
251
+ ))}
252
+ </>
253
+ )}
254
+ {getDatesInRange(date)?.length > 1 && getDatesInRange(date).map((_date, i) => (
255
+ <React.Fragment key={i}>
256
+ <td key={i}>
257
+ {getBlocksByDate(user?.delivery_blocks, _date)?.map((block, j) => {
258
+ return j === 0 && handleBlockWeekToShow(block, user, getDatesInRange(date), getBlocksByDate(user?.delivery_blocks, _date))
259
+ })}
260
+ <EmptyBlock onClick={() => handleSelectDriver(user, null, _date)} />
261
+ </td>
262
+ </React.Fragment>
263
+ ))}
264
+ </UserRow>
265
+ </tbody>
266
+ ))
267
+ )}
268
+ </UsersTable>
269
+ </UserTableWrapper>
270
+ <UsersBottomContainer>
271
+ {driversList?.users?.length > 0 && (
272
+ <WrapperPagination>
273
+ <Pagination
274
+ currentPage={paginationProps.currentPage}
275
+ totalPages={paginationProps.totalPages}
276
+ handleChangePage={handleChangePage}
277
+ handleChangePageSize={handleChangePageSize}
278
+ defaultPageSize={paginationProps?.pageSize}
279
+ />
280
+ </WrapperPagination>
281
+ )}
282
+ </UsersBottomContainer>
283
+ </UsersConatiner>
284
+
285
+ <ConfirmAdmin
286
+ open={confirmAdmin.open}
287
+ onClose={() => setConfirmAdmin({ ...confirmAdmin, open: false })}
288
+ onConfirm={confirmAdmin.handleOnConfirm}
289
+ />
290
+ </UsersListingContainer>
291
+ )
292
+ }