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.
- package/_bundles/{ordering-ui-admin.93ac710b95858715130d.js → ordering-ui-admin.3f67563d0aa434e9729f.js} +2 -2
- package/_modules/components/Delivery/DriverGroupSelectorHeader/index.js +130 -0
- package/_modules/components/Delivery/DriverGroupSelectorHeader/styles.js +32 -0
- package/_modules/components/Delivery/DriversGroupGeneralForm/index.js +14 -5
- package/_modules/components/Delivery/DriversTimeDisplay/DriverBlockAddForm.js +212 -0
- package/_modules/components/Delivery/DriversTimeDisplay/UserList.js +226 -0
- package/_modules/components/Delivery/DriversTimeDisplay/index.js +485 -0
- package/_modules/components/Delivery/DriversTimeDisplay/styles.js +198 -0
- package/_modules/components/Delivery/index.js +8 -1
- package/_modules/components/Settings/SettingsLogs/index.js +28 -16
- package/_modules/components/SidebarMenu/index.js +30 -24
- package/_modules/components/Stores/BusinessDetails/index.js +2 -0
- package/_modules/components/Stores/BusinessSummary/index.js +16 -1
- package/_modules/index.js +6 -0
- package/_modules/utils/index.js +4 -2
- package/package.json +3 -2
- package/src/components/Delivery/DriverGroupSelectorHeader/index.js +124 -0
- package/src/components/Delivery/DriverGroupSelectorHeader/styles.js +97 -0
- package/src/components/Delivery/DriversGroupGeneralForm/index.js +12 -2
- package/src/components/Delivery/DriversTimeDisplay/DriverBlockAddForm.js +271 -0
- package/src/components/Delivery/DriversTimeDisplay/UserList.js +292 -0
- package/src/components/Delivery/DriversTimeDisplay/index.js +535 -0
- package/src/components/Delivery/DriversTimeDisplay/styles.js +853 -0
- package/src/components/Delivery/index.js +2 -0
- package/src/components/Settings/SettingsLogs/index.js +13 -0
- package/src/components/SidebarMenu/index.js +9 -1
- package/src/components/Stores/BusinessDetails/index.js +2 -0
- package/src/components/Stores/BusinessSummary/index.js +29 -8
- package/src/index.js +2 -0
- package/src/utils/index.js +54 -0
- package/template/app.js +4 -1
- package/template/components/ListenPageChanges/index.js +1 -0
- package/template/helmetdata.json +7 -0
- package/template/pages/DriverTimeDisplay/index.js +12 -0
- /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
|
+
}
|