ordering-ui-admin-external 1.43.25 → 1.43.28

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 (36) hide show
  1. package/_bundles/{ordering-ui-admin.97cdb78942482bd8cdc4.js → ordering-ui-admin.e31b8ebe0719a1ce10d5.js} +2 -2
  2. package/_modules/components/Delivery/DeliveryUsersListing/index.js +10 -6
  3. package/_modules/components/Delivery/DriversTimeDisplay/index.js +18 -3
  4. package/_modules/components/Delivery/DriversTimeDisplay/styles.js +35 -5
  5. package/_modules/components/Delivery/UserDetails/index.js +2 -1
  6. package/_modules/components/Orders/AdminsSelector/index.js +1 -2
  7. package/_modules/components/Orders/DeliveriesManager/index.js +4 -2
  8. package/_modules/components/Orders/OrderBill/index.js +4 -3
  9. package/_modules/components/Orders/OrderContactInformation/index.js +4 -3
  10. package/_modules/components/Orders/OrderDetails/index.js +7 -2
  11. package/_modules/components/Orders/OrderStatusTypeSelector/index.js +4 -2
  12. package/_modules/components/Orders/OrdersContentHeader/styles.js +1 -1
  13. package/_modules/components/Shared/InputPhoneNumber/index.js +4 -0
  14. package/_modules/components/SidebarMenu/index.js +32 -29
  15. package/_modules/components/Users/UserAddForm/index.js +9 -0
  16. package/_modules/components/Users/UserFormDetails/index.js +12 -2
  17. package/_modules/styles/MultiSelect/index.js +1 -1
  18. package/package.json +2 -2
  19. package/src/components/Delivery/DeliveryUsersListing/index.js +7 -5
  20. package/src/components/Delivery/DriversTimeDisplay/index.js +30 -3
  21. package/src/components/Delivery/DriversTimeDisplay/styles.js +141 -1
  22. package/src/components/Delivery/UserDetails/index.js +2 -1
  23. package/src/components/Orders/AdminsSelector/index.js +1 -2
  24. package/src/components/Orders/DeliveriesManager/index.js +3 -1
  25. package/src/components/Orders/OrderBill/index.js +4 -3
  26. package/src/components/Orders/OrderContactInformation/index.js +9 -6
  27. package/src/components/Orders/OrderDetails/index.js +6 -0
  28. package/src/components/Orders/OrderStatusTypeSelector/index.js +3 -1
  29. package/src/components/Orders/OrdersContentHeader/styles.js +1 -0
  30. package/src/components/Shared/InputPhoneNumber/index.js +3 -0
  31. package/src/components/SidebarMenu/index.js +92 -88
  32. package/src/components/Users/UserAddForm/index.js +6 -0
  33. package/src/components/Users/UserFormDetails/index.js +9 -3
  34. package/src/styles/MultiSelect/index.js +12 -10
  35. package/template/app.js +5 -2
  36. /package/_bundles/{ordering-ui-admin.97cdb78942482bd8cdc4.js.LICENSE.txt → ordering-ui-admin.e31b8ebe0719a1ce10d5.js.LICENSE.txt} +0 -0
@@ -54,7 +54,8 @@ export const UserDetailsUI = (props) => {
54
54
  const [isPersonalization, setIsPersonalization] = useState(false)
55
55
  const [isExpand, setIsExpand] = useState(false)
56
56
  const [{ configs }] = useConfig()
57
- const disableSchedule = configs?.allow_driver_manager_update_driver_schedule?.value === '0' && user?.level === 5
57
+ const viewOnly = user?.readOnlyAdmin || user?.readOnlyDeliveryManager
58
+ const disableSchedule = (configs?.allow_driver_manager_update_driver_schedule?.value === '0' && user?.level === 5) || viewOnly
58
59
  const isWhiteLabel = configs?.white_label_module?.value
59
60
  const expandSidebar = () => {
60
61
  const element = document.getElementById('user_lateral_bar')
@@ -63,7 +63,7 @@ export const AdminsSelector = (props) => {
63
63
 
64
64
  return (
65
65
  <>
66
- {!adminsList?.loading && adminsList?.admins?.length > 0 ? (
66
+ {!adminsList?.loading ? (
67
67
  <MultiSelect
68
68
  defaultValue={filterValues.administratorIds}
69
69
  placeholder={Placeholder}
@@ -94,4 +94,3 @@ export const AdminsSelector = (props) => {
94
94
  </>
95
95
  )
96
96
  }
97
-
@@ -32,7 +32,8 @@ const DeliveriesManagerUI = (props) => {
32
32
  numberOfOrdersBySubstatus,
33
33
  timeStatus,
34
34
  setTimeStatus,
35
- isUseQuery
35
+ isUseQuery,
36
+ adminsList
36
37
  } = props
37
38
 
38
39
  const [, t] = useLanguage()
@@ -93,6 +94,7 @@ const DeliveriesManagerUI = (props) => {
93
94
  setFilterModalOpen={setFilterModalOpen}
94
95
  setTimeStatus={setTimeStatus}
95
96
  setSlaSettingTime={setSlaSettingTime}
97
+ adminsList={adminsList}
96
98
  />
97
99
  <OrdersContent>
98
100
  <WrapItemView>
@@ -15,7 +15,8 @@ export const OrderBill = (props) => {
15
15
  order,
16
16
  actionStatus,
17
17
  handleRefundPaymentsStripe,
18
- handleOrderRefund
18
+ handleOrderRefund,
19
+ viewOnly
19
20
  } = props
20
21
 
21
22
  const isGiftCardOrder = order?.products?.[0]?.type === 'gift_card'
@@ -284,7 +285,7 @@ export const OrderBill = (props) => {
284
285
  </tbody>
285
286
  </table>
286
287
  )}
287
- {!isGiftCardOrder && (
288
+ {!isGiftCardOrder && !viewOnly && (
288
289
  <RefundToWallet
289
290
  order={order}
290
291
  actionStatus={actionStatus}
@@ -377,7 +378,7 @@ export const OrderBill = (props) => {
377
378
  </table>
378
379
  )}
379
380
 
380
- {!isGiftCardOrder && !order?.refund_data && stripePaymethods.includes(order?.paymethod?.gateway) && (
381
+ {!isGiftCardOrder && !order?.refund_data && stripePaymethods.includes(order?.paymethod?.gateway) && !viewOnly && (
381
382
  <RefundButtonWrapper>
382
383
  <Button
383
384
  color='primary'
@@ -51,6 +51,7 @@ export const OrderContactInformation = (props) => {
51
51
  const [{ optimizeImage }] = useUtils()
52
52
  const [{ configs }] = useConfig()
53
53
  const googleInputRef = useRef(null)
54
+ const readOnlyBusinessOwner = user?.readOnlyBusinessOwner
54
55
 
55
56
  const googleMapsApiKey = configs?.google_maps_api_key?.value
56
57
  const isDisableDriverCompanies = configs?.disable_companies_order_details?.value === '1'
@@ -211,10 +212,12 @@ export const OrderContactInformation = (props) => {
211
212
  </ReviewButton>
212
213
  )}
213
214
  </InfoContent>
214
- <ActionIconWrapper>
215
- <Pencil className='edit-icon' onClick={handleEdit} />
216
- <ChevronDown className='down-arrow' />
217
- </ActionIconWrapper>
215
+ {!readOnlyBusinessOwner && (
216
+ <ActionIconWrapper>
217
+ <Pencil className='edit-icon' onClick={handleEdit} />
218
+ <ChevronDown className='down-arrow' />
219
+ </ActionIconWrapper>
220
+ )}
218
221
  </CustomerInfo>
219
222
  </ContextAwareToggle>
220
223
  <Accordion.Collapse eventKey='1'>
@@ -348,7 +351,7 @@ export const OrderContactInformation = (props) => {
348
351
  </Accordion>
349
352
  {deliveryTypes.includes(order?.delivery_type) && !isServiceOrder && (
350
353
  <>
351
- {!order?.driver_id && !isDisableDriverCompanies && (
354
+ {!order?.driver_id && !isDisableDriverCompanies && !readOnlyBusinessOwner && (
352
355
  <CompanySelectorContainer>
353
356
  <p>{t('DRIVER_COMPANY', 'Driver company')}</p>
354
357
  <CompanySelector
@@ -365,7 +368,7 @@ export const OrderContactInformation = (props) => {
365
368
  />
366
369
  </CompanySelectorContainer>
367
370
  )}
368
- {!order?.driver_company_id && !commentInfoState?.open && (
371
+ {!order?.driver_company_id && !commentInfoState?.open && !readOnlyBusinessOwner && (
369
372
  <DriverSelectorContainer>
370
373
  <p>{t('DRIVER_ASSIGN', 'Driver assign')}</p>
371
374
  <DriverSelector
@@ -104,6 +104,10 @@ const OrderDetailsUI = (props) => {
104
104
  const [commentInfoState, setCommentInfostate] = useState({ open: false, driverId: null })
105
105
  const cateringTypes = [7, 8]
106
106
  const placeSpotEnabled = [3, 4]
107
+ const readOnlyBusinessOwner = user?.readOnlyBusinessOwner
108
+ const readOnlyDeliveryManager = user?.readOnlyDeliveryManager
109
+ const readOnlyAdmin = user?.readOnlyAdmin
110
+
107
111
  const {
108
112
  order,
109
113
  loading
@@ -375,6 +379,7 @@ const OrderDetailsUI = (props) => {
375
379
  deliveryType={order?.delivery_type}
376
380
  defaultValue={parseInt(order.status)}
377
381
  handleUpdateOrderStatus={handleUpdateOrderStatus}
382
+ viewOnly={(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner)}
378
383
  />
379
384
  </OrderStatusSelectorWrapper>
380
385
  </OrderStatus>
@@ -445,6 +450,7 @@ const OrderDetailsUI = (props) => {
445
450
  actionStatus={actionStatus}
446
451
  handleRefundPaymentsStripe={handleRefundPaymentsStripe}
447
452
  handleOrderRefund={handleOrderRefund}
453
+ viewOnly={(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner)}
448
454
  />
449
455
  </div>
450
456
  <DetailBottom />
@@ -20,7 +20,8 @@ export const OrderStatusTypeSelector = (props) => {
20
20
  filterValues,
21
21
  handleUpdateOrderStatus,
22
22
  handleChangeMultiOrdersStatus,
23
- handleChangeOrderStatus
23
+ handleChangeOrderStatus,
24
+ viewOnly
24
25
  } = props
25
26
 
26
27
  const [, t] = useLanguage()
@@ -551,6 +552,7 @@ export const OrderStatusTypeSelector = (props) => {
551
552
  isShowSearchBar
552
553
  searchValue={searchValue}
553
554
  handleChangeSearch={handleChangeSearch}
555
+ isDisabled={viewOnly}
554
556
  />
555
557
  ) : (
556
558
  <Select
@@ -69,6 +69,7 @@ export const TopRightSection = styled.div`
69
69
  flex-direction: column-reverse;
70
70
  flex-wrap: nowrap;
71
71
  margin: 5px 0px 10px 15px;
72
+ overflow: auto;
72
73
 
73
74
  ${({ isCustomLayout }) => !isCustomLayout && css`
74
75
  justify-content: flex-end;
@@ -21,6 +21,9 @@ export const InputPhoneNumber = (props) => {
21
21
 
22
22
  const isValidPhoneNumber = (number) => {
23
23
  if (!number) return
24
+ if (!parseInt(configs?.validation_phone_number_lib?.value ?? 1, 10)) {
25
+ return true
26
+ }
24
27
  const numberParser = parsePhoneNumber(number)
25
28
  return numberParser?.isValid()
26
29
  }
@@ -60,7 +60,9 @@ const SidebarMenuUI = (props) => {
60
60
  const windowSize = useWindowSize()
61
61
  const isPoweredByOrderingModule = configs?.powered_by_ordering_module?.value
62
62
  const isEnabledAppointmentsFeature = configs?.appointments?.value
63
-
63
+ const readOnlyBusinessOwner = sessionState?.user?.readOnlyBusinessOwner
64
+ const readOnlyDeliveryManager = sessionState?.user?.readOnlyDeliveryManager
65
+ const readOnlyAdmin = sessionState?.user?.readOnlyAdmin
64
66
  const [showMessage, setShowMessage] = useState(false)
65
67
 
66
68
  const ordersSubMenus = [
@@ -344,28 +346,28 @@ const SidebarMenuUI = (props) => {
344
346
  title: t('DRIVER_MANAGERS', 'Drivers manager'),
345
347
  pageName: 'drivers_managers',
346
348
  url: '/delivery/drivers-managers',
347
- enabled: sessionState?.user?.level === 0
349
+ enabled: sessionState?.user?.level === 0 && !(readOnlyAdmin || readOnlyDeliveryManager)
348
350
  },
349
351
  {
350
352
  id: 3,
351
353
  title: t('DELIVERY_COMPANIES', 'Delivery companies'),
352
354
  pageName: 'drivers_companies',
353
355
  url: '/delivery/drivers-companies',
354
- enabled: sessionState?.user?.level === 0
356
+ enabled: sessionState?.user?.level === 0 && !(readOnlyAdmin || readOnlyDeliveryManager)
355
357
  },
356
358
  {
357
359
  id: 4,
358
360
  title: t('DELIVERY_AUTOMATION', 'Delivery automation'),
359
361
  pageName: 'drivers_groups',
360
362
  url: '/delivery/drivers-groups',
361
- enabled: sessionState?.user?.level === 5 || sessionState?.user?.level === 0
363
+ enabled: (sessionState?.user?.level === 5 || sessionState?.user?.level === 0) && !(readOnlyAdmin || readOnlyDeliveryManager)
362
364
  },
363
365
  {
364
366
  id: 5,
365
367
  title: t('DRIVERS_TIME_DISPLAY', 'Drivers time display'),
366
368
  pageName: 'drivers_time_display',
367
369
  url: '/delivery/drivers-time-display',
368
- enabled: sessionState?.user?.level === 5 || sessionState?.user?.level === 0
370
+ enabled: (sessionState?.user?.level === 5 || sessionState?.user?.level === 0) && !(readOnlyAdmin || readOnlyDeliveryManager)
369
371
  }
370
372
  ]
371
373
 
@@ -512,7 +514,7 @@ const SidebarMenuUI = (props) => {
512
514
  </Button>
513
515
  )} */}
514
516
 
515
- {sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8 && (
517
+ {sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8 && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
516
518
  <MenuContainer>
517
519
  <ContextAwareToggle
518
520
  eventKey='0'
@@ -548,8 +550,8 @@ const SidebarMenuUI = (props) => {
548
550
  <MenuContent>
549
551
  {ordersSubMenus.map(item => (
550
552
  !(sessionState?.user?.level === 2 && item.pageName === 'drivers') &&
551
- !((sessionState?.user?.level === 2 || sessionState?.user?.level === 5) && item.pageName === 'giftCards') &&
552
- !(sessionState?.user?.level === 5 && item.pageName === 'appointments') && (
553
+ !((sessionState?.user?.level === 2 || sessionState?.user?.level === 5 || readOnlyAdmin) && item.pageName === 'giftCards') &&
554
+ !((sessionState?.user?.level === 5 || readOnlyAdmin) && item.pageName === 'appointments') && (
553
555
  item.pageName === 'appointments' ? (
554
556
  isEnabledAppointmentsFeature && (
555
557
  <SubMenu
@@ -576,7 +578,7 @@ const SidebarMenuUI = (props) => {
576
578
  </MenuContainer>
577
579
  )}
578
580
 
579
- {(sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8) && (
581
+ {(sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8) && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
580
582
  <MenuContainer>
581
583
  <ContextAwareToggle
582
584
  eventKey='2'
@@ -590,7 +592,7 @@ const SidebarMenuUI = (props) => {
590
592
  </MenuContainer>
591
593
  )}
592
594
 
593
- {(sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8) && (
595
+ {(sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8) && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
594
596
  <MenuContainer>
595
597
  <ContextAwareToggle
596
598
  eventKey='3'
@@ -619,7 +621,7 @@ const SidebarMenuUI = (props) => {
619
621
  </MenuContainer>
620
622
  )}
621
623
 
622
- {(sessionState?.user?.level === 0 || sessionState?.user?.level === 2) && (
624
+ {(sessionState?.user?.level === 0 || sessionState?.user?.level === 2) && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
623
625
  <MenuContainer>
624
626
  <ContextAwareToggle
625
627
  eventKey='4'
@@ -666,7 +668,7 @@ const SidebarMenuUI = (props) => {
666
668
  </MenuContainer>
667
669
  )}
668
670
 
669
- {(sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8) && (
671
+ {(sessionState?.user?.level !== 5 && sessionState?.user?.level !== 8) && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
670
672
  <MenuContainer>
671
673
  <ContextAwareToggle
672
674
  eventKey='5'
@@ -735,14 +737,14 @@ const SidebarMenuUI = (props) => {
735
737
  </MenuContainer>
736
738
  )}
737
739
 
738
- {sessionState?.user?.level === 0 && (
740
+ {sessionState?.user?.level === 0 && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
739
741
  <MenuContainer>
740
742
  <ContextAwareToggle
741
743
  eventKey='8'
742
744
  active={
743
745
  location.pathname === '/marketing/promotions-enterprise' ||
744
746
  location.pathname === '/marketing/campaign' ||
745
- location.pathname === '/marketing/ad-banners'||
747
+ location.pathname === '/marketing/ad-banners' ||
746
748
  location.pathname === '/loyalty/rewards-programs' ||
747
749
  location.pathname === '/loyalty/levels' ||
748
750
  location.pathname === '/loyalty/reports' ||
@@ -769,7 +771,7 @@ const SidebarMenuUI = (props) => {
769
771
  </MenuContainer>
770
772
  )}
771
773
 
772
- {/* {sessionState?.user?.level === 0 && (
774
+ {/* {sessionState?.user?.level === 0 && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
773
775
  <MenuContainer>
774
776
  <ContextAwareToggle
775
777
  eventKey='9'
@@ -798,7 +800,7 @@ const SidebarMenuUI = (props) => {
798
800
  </MenuContainer>
799
801
  )}
800
802
 
801
- {sessionState?.user?.level === 0 && (
803
+ {sessionState?.user?.level === 0 && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
802
804
  <MenuContainer>
803
805
  <ContextAwareToggle
804
806
  eventKey='10'
@@ -825,7 +827,7 @@ const SidebarMenuUI = (props) => {
825
827
  </Accordion.Collapse>
826
828
  </MenuContainer>
827
829
  )} */}
828
- {sessionState?.user?.level === 0 && (
830
+ {sessionState?.user?.level === 0 && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
829
831
  <MenuContainer>
830
832
  <span>{t('SALES_CHANNELS_AND_PRODUCTS', 'Sales channels and products')}</span>
831
833
  <ContextAwareToggle
@@ -861,77 +863,79 @@ const SidebarMenuUI = (props) => {
861
863
  )}
862
864
  </Accordion>
863
865
  </div>
864
- <div className='d-flex flex-column mt-4'>
865
- <LanguageSelectorContainer>
866
- <LanguageSelector />
867
- </LanguageSelectorContainer>
868
- {sessionState?.user?.level === 0 && (
869
- <Accordion>
870
- <MenuContainer>
871
- <ContextAwareToggle
872
- eventKey='5'
873
- active={
874
- location.pathname === '/settings/basic' ||
875
- location.pathname === '/settings/operation' ||
876
- location.pathname === '/settings/plugin' ||
877
- location.pathname === '/settings/pages' ||
878
- location.pathname === '/settings/integrations' ||
879
- location.pathname === '/settings/places' ||
880
- location.pathname === '/settings/advanced' ||
881
- location.pathname === '/settings/language' ||
882
- location.pathname === '/settings/logs'
883
- }
884
- >
885
- <GearIcon />
886
- <span>{t('SETTINGS', 'Settings')}</span>
887
- </ContextAwareToggle>
888
- <Accordion.Collapse eventKey='5'>
889
- <MenuContent>
890
- {settingsSubMenus.map(item => (
891
- <SubMenu
892
- key={item.id}
893
- active={location.pathname.includes(item.pageName) || location.pathname.includes(item?.url)}
894
- onClick={() => handleGoToPage({ page: item.pageName })}
895
- >
896
- {firstLetterCapital(item.title)}
897
- </SubMenu>
898
- ))}
899
- </MenuContent>
900
- </Accordion.Collapse>
901
- </MenuContainer>
902
- </Accordion>
903
- )}
904
- {/* {sessionState?.user?.level === 0 && (
905
- <Button
906
- className='d-flex align-items-center'
907
- variant={location.pathname === '/ordering-products' && 'primary'}
908
- onClick={() => handleGoToPage({ page: 'ordering_products' })}
909
- >
910
- <WindowDock />
911
- <span>{t('ORDERING_PRODUCTS', 'Ordering products')}</span>
912
- </Button>
913
- )} */}
914
- {sessionState?.user?.level === 0 && (
915
- <Button
916
- className='d-flex align-items-center'
917
- variant={location.pathname === '/support' && 'primary'}
918
- onClick={() => handleGoToPage({ page: 'support' })}
919
- >
920
- <HeadsetIcon />
921
- <span>{t('SUPPORT', 'Support')}</span>
922
- </Button>
923
- )}
924
- {sessionState?.user?.level === 0 && (
925
- <Button
926
- className='d-flex align-items-center'
927
- variant={false}
928
- onClick={() => handleClickBilling()}
929
- >
930
- <Cash />
931
- <span>{t('BILLING', 'Billing')}</span>
932
- </Button>
933
- )}
934
- </div>
866
+ {!(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner) && (
867
+ <div className='d-flex flex-column mt-4'>
868
+ <LanguageSelectorContainer>
869
+ <LanguageSelector />
870
+ </LanguageSelectorContainer>
871
+ {sessionState?.user?.level === 0 && (
872
+ <Accordion>
873
+ <MenuContainer>
874
+ <ContextAwareToggle
875
+ eventKey='5'
876
+ active={
877
+ location.pathname === '/settings/basic' ||
878
+ location.pathname === '/settings/operation' ||
879
+ location.pathname === '/settings/plugin' ||
880
+ location.pathname === '/settings/pages' ||
881
+ location.pathname === '/settings/integrations' ||
882
+ location.pathname === '/settings/places' ||
883
+ location.pathname === '/settings/advanced' ||
884
+ location.pathname === '/settings/language' ||
885
+ location.pathname === '/settings/logs'
886
+ }
887
+ >
888
+ <GearIcon />
889
+ <span>{t('SETTINGS', 'Settings')}</span>
890
+ </ContextAwareToggle>
891
+ <Accordion.Collapse eventKey='5'>
892
+ <MenuContent>
893
+ {settingsSubMenus.map(item => (
894
+ <SubMenu
895
+ key={item.id}
896
+ active={location.pathname.includes(item.pageName) || location.pathname.includes(item?.url)}
897
+ onClick={() => handleGoToPage({ page: item.pageName })}
898
+ >
899
+ {firstLetterCapital(item.title)}
900
+ </SubMenu>
901
+ ))}
902
+ </MenuContent>
903
+ </Accordion.Collapse>
904
+ </MenuContainer>
905
+ </Accordion>
906
+ )}
907
+ {/* {sessionState?.user?.level === 0 && (
908
+ <Button
909
+ className='d-flex align-items-center'
910
+ variant={location.pathname === '/ordering-products' && 'primary'}
911
+ onClick={() => handleGoToPage({ page: 'ordering_products' })}
912
+ >
913
+ <WindowDock />
914
+ <span>{t('ORDERING_PRODUCTS', 'Ordering products')}</span>
915
+ </Button>
916
+ )} */}
917
+ {sessionState?.user?.level === 0 && (
918
+ <Button
919
+ className='d-flex align-items-center'
920
+ variant={location.pathname === '/support' && 'primary'}
921
+ onClick={() => handleGoToPage({ page: 'support' })}
922
+ >
923
+ <HeadsetIcon />
924
+ <span>{t('SUPPORT', 'Support')}</span>
925
+ </Button>
926
+ )}
927
+ {sessionState?.user?.level === 0 && (
928
+ <Button
929
+ className='d-flex align-items-center'
930
+ variant={false}
931
+ onClick={() => handleClickBilling()}
932
+ >
933
+ <Cash />
934
+ <span>{t('BILLING', 'Billing')}</span>
935
+ </Button>
936
+ )}
937
+ </div>
938
+ )}
935
939
  </SidebarContent>
936
940
  <UserInfo
937
941
  id='user_info'
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useRef } from 'react'
2
2
  import { useForm } from 'react-hook-form'
3
3
  import {
4
4
  useLanguage,
5
+ useConfig,
5
6
  DragAndDrop,
6
7
  ExamineClick,
7
8
  UserFormDetails as UserFormDetailsController
@@ -10,6 +11,7 @@ import { Input, Button } from '../../../styles'
10
11
  import { Alert, InputPhoneNumber, Modal, ImageCrop } from '../../Shared'
11
12
  import { UserTypeSelector } from '../UserTypeSelector'
12
13
  import parsePhoneNumber from 'libphonenumber-js'
14
+ import { formatPhoneNumber } from 'react-phone-number-input'
13
15
  import { sortInputFields, bytesConverter } from '../../../utils'
14
16
  import Skeleton from 'react-loading-skeleton'
15
17
  import BiImage from '@meronex/icons/bi/BiImage'
@@ -46,6 +48,7 @@ const UserAddFormUI = (props) => {
46
48
  } = props
47
49
  const formMethods = useForm()
48
50
  const [, t] = useLanguage()
51
+ const [{ configs }] = useConfig()
49
52
 
50
53
  const [isValidPhoneNumber, setIsValidPhoneNumber] = useState(null)
51
54
  const [userPhoneNumber, setUserPhoneNumber] = useState(null)
@@ -133,6 +136,9 @@ const UserAddFormUI = (props) => {
133
136
  }
134
137
  if (isValid) {
135
138
  phoneNumberParser = parsePhoneNumber(number)
139
+ if (!parseInt(configs?.validation_phone_number_lib?.value ?? 1, 10)) {
140
+ if (phoneNumberParser?.nationalNumber) phoneNumberParser.nationalNumber = formatPhoneNumber(number)
141
+ }
136
142
  }
137
143
  if (phoneNumberParser) {
138
144
  phoneNumber = {
@@ -1,8 +1,9 @@
1
1
  import React, { useEffect, useState, useRef } from 'react'
2
2
  import Skeleton from 'react-loading-skeleton'
3
- import { useLanguage, useCustomer } from 'ordering-components-admin-external'
3
+ import { useLanguage, useCustomer, useConfig } from 'ordering-components-admin-external'
4
4
  import { useForm } from 'react-hook-form'
5
5
  import parsePhoneNumber from 'libphonenumber-js'
6
+ import { formatPhoneNumber } from 'react-phone-number-input'
6
7
  import { Alert, InputPhoneNumber, RangeCalendar } from '../../Shared'
7
8
  import { sortInputFields } from '../../../utils'
8
9
  import { Switch, Input, Button } from '../../../styles'
@@ -43,6 +44,7 @@ export const UserFormDetailsUI = (props) => {
43
44
 
44
45
  const formMethods = useForm()
45
46
  const [, t] = useLanguage()
47
+ const [{ configs }] = useConfig()
46
48
 
47
49
  const [isValidPhoneNumber, setIsValidPhoneNumber] = useState(null)
48
50
  const [userPhoneNumber, setUserPhoneNumber] = useState(null)
@@ -143,16 +145,20 @@ export const UserFormDetailsUI = (props) => {
143
145
  }
144
146
  if (isValid) {
145
147
  phoneNumberParser = parsePhoneNumber(number)
148
+
149
+ if (!parseInt(configs?.validation_phone_number_lib?.value ?? 1, 10)) {
150
+ if (phoneNumberParser?.nationalNumber) phoneNumberParser.nationalNumber = formatPhoneNumber(number)
151
+ }
146
152
  }
147
153
  if (phoneNumberParser) {
148
154
  phoneNumber = {
149
155
  country_phone_code: {
150
156
  name: 'country_phone_code',
151
- value: phoneNumberParser.countryCallingCode
157
+ value: phoneNumberParser?.countryCallingCode
152
158
  },
153
159
  cellphone: {
154
160
  name: 'cellphone',
155
- value: phoneNumberParser.nationalNumber
161
+ value: phoneNumberParser?.nationalNumber
156
162
  }
157
163
  }
158
164
  }
@@ -112,16 +112,18 @@ export const MultiSelect = (props) => {
112
112
  <React.Fragment key={selectedOption.value}>
113
113
  <MultiSelectOption>
114
114
  {selectedOption.showOnSelected || selectedOption.content}
115
- <Button
116
- circle
117
- outline
118
- color='primary'
119
- type='reset'
120
- className='remove_option'
121
- onClick={() => onChange && onChange(selectedOption.value)}
122
- >
123
- <MdClose />
124
- </Button>
115
+ {selectedOption?.value !== 'default' && (
116
+ <Button
117
+ circle
118
+ outline
119
+ color='primary'
120
+ type='reset'
121
+ className='remove_option'
122
+ onClick={() => onChange && onChange(selectedOption.value)}
123
+ >
124
+ <MdClose />
125
+ </Button>
126
+ )}
125
127
  </MultiSelectOption>
126
128
  </React.Fragment>
127
129
  ))}
package/template/app.js CHANGED
@@ -106,6 +106,9 @@ export const App = () => {
106
106
  const onlineStatus = useOnlineStatus()
107
107
  const { height } = useWindowSize()
108
108
 
109
+ const readOnlyBusinessOwner = user?.readOnlyBusinessOwner
110
+ const readOnlyDeliveryManager = user?.readOnlyDeliveryManager
111
+ const readOnlyAdmin = user?.readOnlyAdmin
109
112
  const cannyAppId = '5b05e5e2d3f6c47201694ad4'
110
113
  const isPastDue = projectStatus.project?.current_status === 'past_due'
111
114
  const showBanner = auth && isPastDue
@@ -232,7 +235,7 @@ export const App = () => {
232
235
  <Route exact path='/'>
233
236
  {
234
237
  auth
235
- ? (user?.level !== 5 && user?.level !== 8)
238
+ ? ((user?.level !== 5 && user?.level !== 8) && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner))
236
239
  ? <Redirect to='/home' />
237
240
  : user?.level === 8 ? <Redirect to='/profile' /> : <Redirect to='/orders' />
238
241
  : (queryProject && queryToken)
@@ -291,7 +294,7 @@ export const App = () => {
291
294
  <Route exact path='/home'>
292
295
  {
293
296
  auth
294
- ? (user?.level !== 5 && user?.level !== 8)
297
+ ? ((user?.level !== 5 && user?.level !== 8) && !(readOnlyAdmin || readOnlyDeliveryManager || readOnlyBusinessOwner))
295
298
  ? <Home />
296
299
  : user?.level === 8 ? <Redirect to='/profile' /> : <Redirect to='/orders' />
297
300
  : <Redirect to='/login' />