{"version":3,"sources":["components/map/map.tsx","components/loader/Loader.tsx","components/link/index.tsx","components/modal/Modal.tsx","components/skeleton/Header.tsx","components/skeleton/Footer.tsx","components/side-nav/index.tsx","components/page-title/PageTitle.tsx","components/skeleton/Page.tsx","components/page-title/PageTitleWithBack.tsx","components/skeleton/Logo.tsx","images/vetcher-logo-small-compressed.png","components/map/mapStyles.ts","components/map/customInfoWindow.tsx","helpers/resize.ts","authConfig.ts","appInsightsConfig.ts","pages/dvms/dvm-details.tsx","services/appinsights.ts","helpers/axios.ts","helpers/local-storage.ts","helpers/token.ts","helpers/format.ts","helpers/download.ts","helpers/util.tsx","helpers/errors.ts","fetch/fetch.ts","fetch/dvms.ts","fetch/lookups.ts","components/file/multi-image-upload.tsx","components/table/TablePaginationActions.tsx","components/table/Pagination.tsx","components/table/Table.tsx","fetch/files.ts","fetch/license.ts","pages/dvms/license-info.tsx","fetch/insurance.ts","pages/dvms/insurance-info.tsx","components/icon-heading/IconHeading.tsx","fetch/admin.ts","fetch/holidays.ts","fetch/locations.ts","fetch/markets.ts","fetch/maps.ts","fetch/schedule.ts","fetch/shift-requests.ts","fetch/configured-shifts.ts","pages/dvms/dvm-update-email.tsx","pages/dvms/dvm-profile.tsx","pages/dvms/cancel-schedule-modal.tsx","images/coin-incentive.png","components/icons/coin.tsx","pages/dvms/dvm-schedule.tsx","pages/dvms/cancel-request-modal.tsx","pages/dvms/dvm-requests.tsx","components/input/date-range.tsx","pages/dvms/dvm-request-history.tsx","pages/locations/locations.tsx","components/table/MobileTable.tsx","pages/holidays/add-edit-holiday-modal.tsx","pages/holidays/holidays.tsx","pages/locations/location-table.tsx","pages/locations/add-edit-market-modal.tsx","pages/locations/markets-table.tsx","pages/locations/market-filters.tsx","pages/locations/locations-filters.tsx","pages/entity-management/entity-management.tsx","components/calendar-grid/info-modal.tsx","components/calendar-grid/rss-add-modal.tsx","components/calendar-grid/calendar-event-menu.tsx","context/rss-market-repeater.tsx","components/calendar-grid/rss-checkbox.tsx","components/calendar-grid/calendar-event.tsx","components/calendar-grid/calendar-grid.tsx","pages/relief-scheduling/relief-scheduling-market.tsx","pages/relief-scheduling/relief-scheduling-repeater.tsx","pages/relief-scheduling/relief-scheduling.tsx","pages/ft-scheduling/ft-scheduling.tsx","fetch/legal-entities.ts","components/formik-mui/radio-group.tsx","pages/entity-management/add-legal-entity-modal.tsx","pages/entity-management/tabs/legal-entities.tsx","pages/entity-management/tabs/w2-dvms-filters.tsx","pages/entity-management/tabs/w2-dvms.tsx","fetch/w2-payment-reserve.ts","pages/entity-management/add-w2-dvms-modal.tsx","styles/theme.ts","pages/home/request-shifts.tsx","pages/locations/locations-details.tsx","pages/home/shift-overlay.tsx","pages/home/home.tsx","fetch/payments.ts","pages/pending-payments/pending-payments.tsx","pages/not-found/index.tsx","fetch/incentive-rates.ts","pages/locations/incentive-rates-modal.tsx","pages/locations/incentive-rates.tsx","pages/locations/configured-shifts-modal.tsx","pages/locations/configuredShifts.tsx","pages/locations/location-shifts.tsx","pages/dvms/dvm-filters.tsx","pages/dvms/dvm-add-contractor-modal.tsx","pages/dvms/dvms.tsx","pages/dvms/dvm-pending.tsx","pages/dvms/dvm-disabled.tsx","pages/users/add-edit-user-modal.tsx","pages/users/user-filters.tsx","pages/users/users.tsx","pages/activity/activity.tsx","pages/privacy-policy/index.tsx","pages/terms-and-conditions/index.tsx","constants/routes.ts","context/user.tsx","context/load.tsx","helpers/stateManagement.ts","context/nav.tsx","components/skeleton/private-route.tsx","components/loader/header-loader.tsx","components/error-handling/error-boundary.tsx","pages/error/index.tsx","pages/verify-email/verify-email.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["LocationTypes","Loader","children","loaderWrapperClassName","subtitle","title","props","classes","useStyles","className","clsx","loader","id","role","inner","CircularProgress","progress","size","variant","text","Typography","makeStyles","theme","createStyles","alignItems","display","flexShrink","flexWrap","justifyContent","position","marginTop","topOffset","width","backgroundColor","type","alpha","palette","background","paper","bottom","fontSize","height","left","right","top","zIndex","tooltip","color","primary","main","margin","spacing","grey","textTransform","maxWidth","white","textDecoration","dark","Modal","actions","customButtonHandler","customButtonIcon","DialogContentProps","DialogTitleProps","fullWidth","isLoading","noPaddingContent","titleContent","dialogProps","modalStyles","Dialog","Backdrop","open","dialogContainer","root","dialogTitle","IconButton","customButton","onClick","close","onClose","Close","dialogContent","dividers","DialogActions","padding","minHeight","secondary","lineHeight","config","require","Header","setShowNav","showNav","useContext","UserContext","user","isDVMPending","isActive","instance","useMsal","useState","anchorEl","setAnchorEl","Box","sx","flexGrow","AppBar","drawer","common","Toolbar","toolbar","disableGutters","hamburger","Grid","item","searchCol","innerCol","Button","event","currentTarget","headerButton","accountButton","AccountCircle","accountIcon","buttonText","accountText","account","username","Menu","keepMounted","anchorOrigin","vertical","horizontal","transformOrigin","MenuItem","logoutRedirect","postLogoutRedirectUri","REACT_APP_MSAL_REDIRECT","console","error","logOutItem","accountItem","ArrowForwardOutlined","iconFill","flex","paddingRight","black","marginBottom","fill","lighten","fontWeight","whiteSpace","breakpoints","up","marginRight","marginLeft","columnGap","Footer","clientName","footerContainer","component","Date","getFullYear","SideNav","headerHeight","navItems","isMobile","pathname","useLocation","history","useHistory","isSelected","useCallback","route","split","Drawer","anchor","navContainer","List","paddingTop","map","ListItemButton","navItem","selected","listItemSelected","path","navLinkActive","navLink","push","label","ListItemIcon","navIconSelected","navIcon","Icon","icon","ListItemText","showLabel","hideLabel","sortOrder","overflowY","overflowX","transition","transitions","create","easing","sharp","duration","leavingScreen","opacity","borderLeft","PageTitle","showDivider","additionalHeaderContent","subTitle","paddingBottom","additionalHeaderContentGridSpace","container","topWrapper","xs","heading","Divider","divider","additionalItems","additionalContentDivider","textAlign","flexDirection","contentDivider","SIDENAV_WIDTH_EXPANDED","pageTitleWrapper","titleWrapper","Page","customPageHeader","footerAction","useTheme","useMediaQuery","values","mobile","isDVM","isDVMContractor","isDVMDeactivated","NavContext","isExpanded","setIsExpanded","sideNavWidth","useMemo","showFooter","contentWidthFull","useEffect","document","Routes","setNavItems","filter","Paths","DVM_PENDING","idTokenClaims","roles","length","validation","value","HOME","some","allowedRoles","includes","DVM_PROFILE","appFrame","contentWrapper","contentShift","content","down","easeInOut","enteringScreen","boxSizing","easeOut","Logo","src","alt","appLogo","mapStyles","getPixelPositionOffset","x","y","CustomInfoWindow","onCloseClick","location","lat","lng","infoBox","useRef","options","closeBoxURL","enableEventPropagation","alignBottom","pixelOffset","google","maps","Size","ref","log","overlay","name","address","street","city","state","zip","shiftCount","removeButton","HighlightOff","boxShadow","getHeight","window","innerHeight","useCurrentHeight","setHeight","timeoutId","resizeListener","clearTimeout","setTimeout","addEventListener","removeEventListener","Map","windowHeight","mapContainerHeight","center","setCenter","zoom","setZoom","onTilesLoaded","isMapLoaded","mapContainerStyle","mapTypeControl","fullscreenControl","streetViewControl","zoomControl","styles","gestureHandling","calculator","markers","numStyles","totalShiftsInCluster","reduce","prev","curr","getLabel","parseInt","index","total","Math","min","clusterer","locations","locationType","UrgentVet","latitude","longitude","url","scaledSize","labelOrigin","Point","setInfoWindow","locationId","showOverlay","infoWindow","handleInfoWindowClose","REACT_APP_MSAL_CLIENT_ID","REACT_APP_MSAL_TENANT_ID","REACT_APP_MSAL_SCOPES","msalConfig","auth","clientId","authority","redirectUri","cache","cacheLocation","storeAuthStateInCookie","system","loggerOptions","loggerCallback","level","message","containsPii","LogLevel","Error","Info","info","Verbose","debug","Warning","warn","apiConfig","resourceUri","resourceScopes","tokenRequest","scopes","APPLICATIONINSIGHTS_CONNECTION_STRING","browserHistory","createBrowserHistory","basename","reactPlugin","ReactPlugin","appInsights","ApplicationInsights","connectionString","extensions","extensionConfig","identifier","loadAppInsights","addTelemetryInitializer","env","tags","DVMTabs","localEnv","logInfo","details","obj","severityLevel","SeverityLevel","Information","APPLICATIONINSIGHTS_ENVIRONMENT","trackTrace","logError","trackException","buildConfig","axiosInstance","Axios","baseURL","REACT_APP_API_URL","axiosRequest","method","data","params","Promise","reject","get","post","put","delete","setLocalStorage","key","JSON","stringify","localForage","removeLocalStorage","token_key","phoneRegExp","formatInputPhoneNumber","RegExp","val","number","replace","match","formatMoney","digits","amount","isNaN","Number","Intl","NumberFormat","maximumFractionDigits","minimumFractionDigits","style","currency","format","stringToDate","date","d","formatDate","stringDate","formatDateWithDay","formatShortFriendlyDateWithTime","parsedDate","parseISO","formatUtcToLocalShortFriendlyDateWithTime","toLocaleString","convertMilitaryToStandard","time","toLocaleTimeString","hour","minute","hour12","trimDecimals","decimals","parseFloat","toFixed","toString","formatWholeNumberPercent","percent","downloadFile","blob","fileName","URL","createObjectURL","Blob","a","createElement","href","download","click","remove","resolveObjectField","handleError","res","Detail","Errors","Object","acquireAccessToken","msalInstance","activeAccount","getActiveAccount","accounts","getAllAccounts","request","resourceRequestUri","acquireTokenSilent","accessToken","InteractionRequiredAuthError","acquireTokenPopup","PublicClientApplication","authFetch","axios","headers","Authorization","routeOptions","forceRefresh","then","response","catch","baseUrl","getDvms","filters","activeFilters","queryParams","URLSearchParams","keys","forEach","Array","isArray","append","toLowerCase","undefined","set","getDvm","dvmId","updateDvm","dvm","payload","updateLimitedDvm","getDvmRequestsAndShifts","mondayDate","MondayDate","getDvmUpcomingShifts","getDvmPendingShiftRequests","getDvmShiftRequestHistory","createDvm","cancelDvmShift","shiftId","reason","getScheduledShiftCount","verifyPendingEmail","newEmail","confirmationCode","startEmailChange","getMarkets","getDvmStatuses","getDvmTypes","getDvmSchools","getLocationLookup","getLocationsForSchedulingLookup","LocationType","getDVMsLookup","getDVMContractors","getCancelationReasons","getStates","getLegalEntities","getW2DVMs","getTaxTypes","getLocationTypes","MultiFileUpload","handleUploadClick","handleFileChange","files","disabled","isRequired","showSource","multi","imageKey","createBase64Image","file","reader","FileReader","resolve","onload","target","result","readAsDataURL","handleCapture","base64Images","allFiles","from","fileLength","i","base64","newUrl","urlPath","contents","isUploaded","whenTaken","servicePhotoId","floor","random","buttonsContainer","input","capture","multiple","onChange","e","htmlFor","startIcon","Camera","imgBox","img","imageHelpText","button","TablePaginationActions","count","page","rowsPerPage","onPageChange","isDesktop","direction","LastPage","FirstPage","KeyboardArrowRight","KeyboardArrowLeft","ceil","max","Pagination","labelRowsPerPage","rowsPerPageOptions","setPage","setRowsPerPage","paginationStyles","TablePagination","paginationRoot","newPage","onRowsPerPageChange","ActionsComponent","overflow","paddingLeft","currencyRE","formatCell","cell","dateTime","tColumn","column","codes","code","join","Tooltip","enterDelay","leaveDelay","render","isDate","isDateTime","isCurrency","isPercent","indexOf","formatPercent","getCellStyle","cursor","textOverflow","isNumber","isCentered","overrideWidth","wordWrap","overflowWrap","handleClickColumn","Table","cellClasses","columns","centerPagination","containerClasses","headerClasses","hideDeleted","hidePagination","loadingPageSize","LoadMoreComponent","mobileProps","noResultsText","ResponsiveComponent","ResponsiveComponentLoader","rowClasses","rowOnClick","serverPage","serverRecordCount","serverPerPage","handlePage","handleRowsPerPage","stickyHeader","tableSize","useTableProps","useTable","userPageCount","manualPagination","autoResetPage","autoResetSortBy","useGlobalFilter","useSortBy","usePagination","useRowSelect","getTableProps","headerGroups","prepareRow","gotoPage","setPageSize","pageSize","TableContainer","TableHead","headerGroup","TableRow","getHeaderGroupProps","TableCell","align","columnAlignment","sort","getHeaderProps","getSortByToggleProps","isServerSorted","TableSortLabel","active","isSorted","isSortedDesc","isServerSortedDesc","TableBody","_","j","hideLoad","Skeleton","row","original","isDeleted","getRowProps","cells","tableColumn","getCellProps","mobileTable","mobileCell","noResults","gutterBottom","maxHeight","borderNone","border","getFile","fileId","responseType","createLicense","license","formData","FormData","expirationDate","toUTCString","updateLicense","licenseId","deleteLicense","LicenseInfo","licenses","errors","setFieldValue","validateForm","fetchDVM","readOnly","licensesCopy","setLicensesCopy","enqueueSnackbar","useSnackbar","setFiles","updateAcceptLicenseData","columnId","rowIndex","old","newLicenses","getFileName","filename","disposition","matches","exec","handleDelete","confirm","errorMessage","accessor","Cell","setVal","TextField","onBlur","placeholder","autoComplete","InputProps","accessKey","LocalizationProvider","dateAdapter","AdapterDateFns","MobileDatePicker","toolbarPlaceholder","inputFormat","onAccept","renderInput","DesktopDatePicker","required","azureUri","binaryData","locationShifts","md","DeleteForever","newLicense","updateMyData","createInsurance","insuranceFile","deleteInsurance","InsuranceInfo","insuranceExpirationDate","insuranceCopy","setInsuranceCopy","shiftIndex","setExpirationDate","InsuranceFile","insurance","IconHeading","getUsers","getUser","userId","updateUserRoles","getAppRoles","getHolidays","createHoliday","holiday","updateHoliday","deleteHoliday","holidayId","getLocations","getLocation","createLocation","updateLocation","deleteLocation","getLocationHours","getDVMMarkets","createMarket","market","updateMarket","deleteMarket","marketId","getMapLocations","formattedItem","replaceAll","toISOString","getAvailableDVMShifts","startDate","endDate","getSchedule","putFTPersist","requests","putRSSPersist","getMarketSchedule","paramsSerializer","entries","v","getScheduledDaysForDVM","createDVMShiftRequest","dvmShiftRequests","createRSSShiftRequest","shiftRequest","updateRSSShiftRequest","updateRSSShift","cancelShiftRequest","shiftRequestId","getShiftRequestsCancelationActivity","acknowledgeCancelation","isAcknowledged","getConfiguredShifts","createConfiguredShift","shift","updateConfiguredShift","deleteConfiguredShift","configuredShiftId","Schema","Yup","shape","email","nullable","DvmChangeEmailModal","refetch","enableReinitialize","initialValues","validationSchema","onSubmit","resetForm","isSubmitting","handleSubmit","dirty","isValid","handleBlur","touched","Fade","in","inputProps","helperText","Edit","deepEqual","primaryHeader","paginationWrapper","saveWrapper","deleteButton","addButton","validationMessage","DvmProfile","getDVM","setIsDirty","areStatusesLoading","setAreStatusesLoading","statuses","setStatuses","areTypesLoading","setAreTypesLoading","types","setTypes","areSchoolsLoading","setAreSchoolsLoading","schools","setSchools","useParams","isSysAdmin","isRSS","isDVMEmployee","dvmProfileView","fetchStatuses","fetchTypes","areMarketsLoading","setAreMarketsLoading","markets","setMarkets","fetchMarkets","fetchSchools","areStatesLoading","setAreStatesLoading","states","setStates","fetchStates","firstName","lastName","pendingEmailAddress","status","phoneNumber","excludeEmptyString","schoolId","notRequired","vendorId","legalEntityName","graduationYear","integer","of","enableNotifications","enableAutomaticPayments","isChangeEmailModalOpen","setIsChangeEmailModalOpen","dvmInformation","to","canViewNotifications","canViewAutoPayments","validateOnMount","initialTouched","primaryMarketId","vendor1099Id","vendorW2Id","employeeId","authorizedStateIds","stateName","stateId","phone","school","authorizedStateId","find","addressId","upcomingApprovedShiftsCount","form","Alert","severity","ContactMail","onBlurCapture","FormControl","InputLabel","Select","labelId","description","FormHelperText","selectedState","shorthand","test","InputLabelProps","shrink","Autocomplete","newValue","selectOnFocus","handleHomeEndKeys","loading","getOptionLabel","option","CheckCircle","FormControlLabel","control","Switch","checked","optOutText","mt","linksToTerms","School","AssignmentInd","HomeRepairService","goBack","Email","CancelScheduleModal","fetchRequests","isLoadingReasons","setLoadingReasons","reasons","setReasons","fetchCancelationReasons","reasonSelector","Check","Coin","coin","coinIncentiveIcon","DvmSchedule","isContractor","setIsLoading","upcomingShifts","setUpcomingShifts","isModalOpen","setIsModalOpen","setShiftId","fetchUpcomingShifts","shiftDate","googleMapsUrl","locationName","incentive","noWrap","totalPayment","cancelButton","handleCancel","Clear","centered","tableOverflow","tableCell","col","shiftTableWrapper","minWidth","CancelRequestModal","fetchPendingRequests","DvmPendingRequests","pendingRequests","setPendingRequests","setShiftRequestId","DateRangePicker","inputSize","isDisabled","minDate","maxDate","showPopover","displayCalendar","setDisplayCalendar","inputValue","setInputValue","fromDate","setFromDate","toDate","setToDate","dateRangeRef","onAdornmentClick","current","onPopperClose","onSelectDateRanges","selection","processInputValue","elm","trim","clearButton","stopPropagation","pickerInput","endAdornment","InputAdornment","edge","Popover","ranges","editableDateInputs","showMonthAndYearPickers","moveRangeOnFirstSelection","showDateDisplay","staticRanges","inputRanges","dateRange","buttonGroup","applyButton","dateRangeFullWidth","DvmRequestHistory","setDate","getDate","selectedDateRange","setSelectedDateRange","dateFrom","dateTo","defaultDateRange","mobileIcon","approvedIcon","rejectedIcon","pendingIcon","statusText","lg","noShiftMessage","success","RegionTabs","DvmDetails","setDvm","Profile","selectedTab","setSelectedTab","isProfilePageDirty","setIsProfilePageDirty","dvmIsContractor","fetchDvm","warningMessage","when","tabBar","tabBarRoot","Tabs","indicatorColor","textColor","handleTabChangeWithoutSave","Tab","AccountBox","iconPosition","profileTabs","Schedule","Requests","History","borderRadius","MobileTable","handleDownload","handleApproval","handleCheckboxComplete","handleEdit","fields","mobileAccordionLabel","Accordion","AccordionSummary","accordion","expandIcon","ExpandMore","topPanelSummaryWrapper","boldName","field","buttonsWrapper","editButton","Download","Delete","paymentStatus","rejectButton","approvalButton","checkboxWrapper","checkboxLabel","Checkbox","cancelationAcknowledged","AccordionDetails","panelSummaryWrapper","FormLabel","subLabelEmail","HolidayModal","currentHoliday","fetchHolidays","Holidays","isDeleting","setIsDeleting","holidays","setHolidays","setCurrentHoliday","EditLocationAlt","Add","LocationsTable","searchValue","setLocations","isPracticeManager","canViewRoles","perPage","recordCount","setRecordCount","selectedSort","setSelectedSort","Name","sortDirection","setSortDirection","fetchLocations","sortBy","searchTerm","records","totalRecordCount","Market","Type","Address","City","State","Zip","accountsPayableId","MarketModal","stateAbbreviation","validateField","setFieldTouched","handleChange","onSelect","MarketsTable","handleEditMarket","currentMarket","isMarketModalOpen","handleCloseMarketModal","setIsMarketsLoading","nameSearchTerm","MarketFilters","applyFilters","handleSearch","hasAppliedFilters","setHasAppliedFilters","isMobileFilterButtonOpen","setIsMobileFilterButtonOpen","setSearchValue","noFilters","searchWrapper","mobileButton","FilterList","endIcon","ArrowDropUp","ArrowDropDown","wrapper","sm","searchRoot","onKeyDown","resetButton","gridItem","searchIcon","ellipsis","formControlRoot","textFieldRoot","clearSearchButton","searchButton","LocationsFilters","selectedType","setSelectedType","selectedMarkets","setSelectedMarkets","toggleMobileFilter","renderTags","getTagProps","Chip","chip","AdminEntitiesTabs","Locations","setIsMarketModalOpen","setCurrentMarket","marketSearchValue","setMarketSearchValue","hasAppliedMarketFilters","setHasAppliedMarketFilters","selectedLocationType","setSelectedDvmType","locationTypes","setLocationTypes","areLocationTypesLoading","setLocationTypesLoading","loadLocationTypes","marketIds","s","setFilters","Place","Link","Markets","AddBusiness","regionTabs","Store","clearFilters","InfoModal","isOpen","shiftTime","rate","statusDate","link","Phone","Mail","requestsAndShifts","gap","RSSAddEditModal","fetchSchedule","scheduledShift","thisDaysIncentive","contractors","setContractors","areContractorsLoading","setAreContractorsLoading","selectedContractor","setSelectedContractor","selectedAmount","setSelectedAmount","selectedIncentive","setSelectedIncentive","handleClose","fetchContractors","toDateString","setIsSubmitting","addRequest","configuredShifts","cs","isEdit","getTitle","dvmName","startAdornment","inputMode","pattern","CalendarEventMenu","menuItems","darkBackground","Boolean","MoreHoriz","MenuListProps","action","RSSMarketRepeaterContext","createContext","payloads","setPayloads","allPayloads","shiftRequestApproval","setAllPayloads","RSSMarketRepeaterHandler","Provider","RSSCheckbox","checkedRequests","rejectedRequests","toggleApprove","handleApprove","handleReject","handleReinstate","onSchedule","handleModalOpen","reinstatedRequests","getStatusLabel","req","reqId","currentStatus","reinstated","hasBeenReinstated","selectedRelief","sameLocationSameDate","getTime","sameDVMsameDate","sameDVMsameDateScheduled","sched","schedule","selectedDVMRequest","shouldBeDisabled","isSelectedAcrossMarkets","isChecked","isPendingReinstatement","isRSSAddModalOpen","setIsRSSAddModalOpen","RSSModalSelectedShiftRequest","setRSSModalSelectedShiftRequest","reinstateMenuItems","bid","checkedBid","inactiveReinstated","inactivePending","inactiveApproved","inactiveRejected","cancelationSource","inactiveCanceledByRSS","inactiveCanceledByDVM","determineClassFromStatus","bidName","totalAmount","hasIncentive","eventMenuContainer","checkbox","checkboxArea","pendingCheckbox","statusLabelContainer","statusLabel","borderTop","borderRight","borderBottom","alignSelf","light","truncate","CalendarEvent","isSameDay","isMarket","determineClass","isBeforeOpenDate","isAfterCloseDate","onCalendar","day","setRSSModalSelectedShift","setRssAddLocation","setRssAddDate","setRssIncentive","cloneDay","selectedDate","isRelief","allowDvmCardDelete","selectedDvm","selectedDVMSchedule","handleRemoveClick","onDateClickHandle","thisDaysRequests","thisDaysConfiguredShifts","onCalendarGeneralPractice","isLocationGeneralPractice","dateHasRecentCancelation","showInactiveRequests","currentRoute","formatShiftTime","isGeneralPracticeStaffed","isFTScheduling","bidContainer","dayContainer","recentCancelation","closed","fulltime","fulltimeHighlighted","start","line","end","AddCircle","flatMap","shifts","addButtonWithRequests","scheduledName","dvmType","locationContainer","penciledIn","penciledInRelief","winningBid","scheduled","checkDisabled","scheduledRelief","headerDate","typography","fontWeightBold","noBids","CalendarGrid","selectedLocation","handleDateClick","setSelectedDate","openDate","closeDate","reloadPayload","locationInfo","loc","setInfo","RSSModalSelectedShift","rssAddLocation","rssAddDate","rssIncentive","renderCells","startOfWeek","weekStartsOn","lastDayOfWeek","rows","days","startOfDay","requested","shiftRequests","incentives","incentiveRates","localConfiguredShifts","flat","isScheduled","isPenciledIn","dayString","String","isoDateString","parse","datesWithRecentCancelations","addDays","renderDays","ReliefSchedulingMarket","preSelectedMarket","areLocationsLoading","setAreLocationsLoading","selectedMarketIndex","removeMarket","showSaveButton","inactiveRequests","selectedMarket","setSelectedMarket","scheduledMarketLocations","setScheduledMarketLocations","scheduledMarketLocationsClone","setScheduledMarketLocationsClone","IncludeInactiveShifts","locationsAndShifts","setCheckedRequests","setRejectedRequests","setReinstatedRequests","isSubmitDisabled","getPayload","deletedItems","marketLocations","scheduledShiftDeletion","scheduledShiftCreation","shiftRequestRejection","shiftRequestsToReinstate","reloadMarketSchedule","locationsWithoutSelectedMarkets","handleChangeWithoutSave","aPReq","Set","saveButton","schedPaginationControls","weekPaginationBtns","ReliefSchedulingRepeater","localStorage","getItem","retrieveMarketsFromBrowserStorage","setItem","marketIndex","splice","ButtonGroup","filteredPayloads","isPayloadEmpty","all","err","finally","ReliefScheduling","isNotPhone","excludeMarketsWithoutLocations","setStartDate","setEndDate","showInactive","setShowInactive","labelPlacement","someDate","today","getMonth","isToday","prevWeek","ArrowBackIos","adapterLocale","enLocale","earliestPossibleDate","nextWeek","ArrowForwardIos","AlertTitle","FTScheduling","previousSelectedDate","setPreviousSelectedDate","previousDate","setPreviousDate","scheduledClone","setScheduled","setSelectedLocation","nextOpenShift","dvms","setDvms","areDvmsLoading","setAreDvmsLoading","setSelectedDvm","showAllDvms","setShowAllDvms","fetchDvms","setSelectedDVMSchedule","fetchDvmSchedule","setOpenDate","setCloseDate","setScheduledClone","setLocationInfo","locationIds","editSchedule","isUrgentVet","isUpdated","deletedShift","reliefButton","reliefButtonContainer","getLegalEntity","legalEntityId","createLegalEntity","updateLegalEntity","RadioGroup","useField","meta","taxType","LegalEntityModal","fetchLegalEntities","currentLegalEntityId","legalEntity","setLegalEntity","stateIds","setStateIds","fetchLegalEntity","areTaxTypesLoading","setAreTaxTypesLoading","taxTypes","setTaxTypes","fetchTaxTypes","filteredStates","newStateIds","filterSelectedOptions","defaultValue","Radio","LegalEntities","legalEntities","setLegalEntities","stateCodes","W2DVMFilters","W2DVMs","dvmsWithW2Reserves","setDvmsWithW2Reserves","Reserve","currentW2PaymentReserve","reserve","EffectiveDate","effectiveDate","IW2PaymentReserves","getDVMsWithW2Reserves","getDVMWithW2Reserves","updateDVMWithW2Reserves","w2PaymentReserves","typeError","W2DVMsModal","fetchW2DVMs","currentDVMId","DVMPaymentReserves","setDVMPaymentReserves","fetchDVMW2PaymentReserves","areDVMsLoading","setAreDVMsLoading","DVMOptions","setDVMOptions","fetchW2DVMOptions","startOfToday","w2PaymentReserveId","arrayHelpers","contentContainer","reservePercentage","reserveName","effectiveDateName","touchedRate","errorRate","isNew","columnSpacing","rowSpacing","inputComponent","NumericFormatCustom","DatePicker","isAfter","React","forwardRef","other","getInputRef","onValueChange","valueIsNumericString","allowNegative","decimalScale","suffix","EntityManagement","isLegalEntityModalOpen","isW2DVMModalOpen","setIsW2DVMModalOpen","setIsEdit","setCurrentLegalEntityId","setCurrentDVMId","isLoadingW2Reserves","setIsLoadingW2Reserves","currentW2PaymentReserves","setCurrentW2PaymentReserves","fetchDVMsWithW2Reserves","W2Witholdings","Gavel","Paid","createTheme","contrastText","warmNeutral","coolNeutral","xl","tablet","htmlFontSize","fontFamily","h1","h2","h3","h4","h5","h6","body1","body2","labels","subtitle1","subtitle2","caption","overline","components","MuiTypography","styleOverrides","MuiButton","defaultProps","disableElevation","MuiFormControl","MuiInputBase","ownerState","MuiOutlinedInput","borderColor","MuiInputLabel","MuiFormLabel","MuiFormControlLabel","MuiTextField","MuiFormHelperText","MuiCheckbox","MuiRadio","MuiDivider","RequestShifts","isRequestShiftsOverlay","setIsRequestShiftsOverlay","setRequestedShifts","requestedShifts","setIsOverlayCovering","overlayContainerHeight","setMapLocations","showSuccessScreen","setShowSuccessScreen","submittedRequests","setSubmittedRequests","scrollTo","updateMap","requestShiftsCover","successContainer","shiftContainer","checkCircleContainer","checkCircle","submittedRequest","shiftDateFormatted","shiftDateDayOfWeek","inputLine","submittedDescription","submittedLocation","submittedAmount","incentiveRate","coinSubmitted","findMore","Search","requestedShiftsContainer","reqShift","findIndex","updatedShift","getFieldMeta","isCorrectShiftToDelete","incentiveArea","buttons","submit","EventAvailable","visibility","default","requestShifts","LoadingShifts","isLoadingAvailableShifts","ShiftOverlay","availableShifts","mapLocations","isOverlayCovering","selectedLocationId","setSelectedLocationId","canUserBid","authorizedToWork","cover","reqShifts","isShiftSelected","requestContainer","xOverflow","Home","isMapLoading","setIsMapLoading","zipCode","setZipCode","setAvailableShifts","setIsLoadingAvailableShifts","defaultStartDate","defaultEndDate","maxFutureDate","currentDay","isZip","geocoder","Geocoder","handleZipSearch","geocode","results","geometry","navigator","geolocation","getCurrentPosition","coords","zip_code","address_components","long_name","displayShifts","fetchMapLocations","isLoadingMapLocations","useQuery","queryKey","queryFn","enabled","Stack","base","iconButton","overlayContainer","nonDvmButton","b","getPendingPayments","updatePendingPaymentStatus","pendingPaymentUpdate","PendingPayments","pendingPayments","setPendingPayments","fetchPendingPayments","pendingPayment","pendingPaymentRow","rejectButtonDesktop","approvalButtonDesktop","pendingPaymentsGrid","NotFound","getIncentiveRates","createIncentiveRate","updateIncentiveRate","deleteIncentiveRate","incentiveRateId","IncentiveRatesModal","fetchIncentiveRates","setValues","IncentiveRates","canEdit","isLoadingIncentiveRates","setLoadingIncentiveRates","setIncentiveRates","handlePopoverClose","addButtonDisabled","AttachMoney","pointerEvents","disableRestoreFocus","p","onMouseEnter","onMouseLeave","shiftTimeStart","shiftTimeEnd","breakDuration","ConfiguredShiftsModal","fetchConfiguredShifts","shiftDateRangeStart","shiftDateRangeEnd","handleApiTimeString","apiTimeString","slice","dateTimeString","isConfirmDisabled","formattedShiftTimeStart","formattedShiftTimeEnd","editData","disablePast","TimePicker","ConfiguredShifts","isLoadingConfiguredShifts","setLoadingConfiguredShifts","setConfiguredShifts","selectedShift","setSelectedShift","shiftDateStartOfDay","isDatePast","isBefore","CalendarMonth","LocationsDetails","setLocation","setShifts","isValidDate","date1","date2","fetchLocation","hoursRes","isMarketsLoading","areLegalEntitiesLoading","setIsLegalEntitiesLoading","setIsStatesLoading","setAreLocationTypesLoading","fetchLocationTypes","marketName","locationShiftId","monday","tuesday","wednesday","thursday","friday","saturday","sunday","isVisible","GeneralPractice","LocationOnOutlinedIcon","WorkspacesIcon","LocationShifts","shiftsCopy","setShiftsCopy","updateShiftsData","newShifts","setValue","locationHours","AccessTimeIcon","DVMFilters","selectedStatuses","setSelectedStatuses","setSelectedState","AddContractorModal","Dvms","FirstName","selectedStateId","setSelectedStateId","selectedDvmType","selectedDvmStatus","setSelectedDvmStatus","dvmTypes","setDvmTypes","dvmStatuses","setDvmStatuses","areDvmTypesLoading","setAreDvmTypesLoading","areDvmStatusesLoading","setAreDvmStatusesLoading","isAddContractorModalOpen","setIsAddContractorModalOpen","mappedStatuses","DVMName","LastName","Status","PrimaryMarket","PrimaryMarketId","DvmPending","DvmDisabled","AddEditUserModal","currentUser","fetchUsers","appRoles","userRoles","userLocations","userRole","appRole","setIsPracticeManager","maxLength","UserFilters","selectedStatus","setSelectedStatus","STATUSES","Users","users","setUsers","setAppRoles","areAppRolesLoading","setAreAppRolesLoading","setStatus","fetchAppRoles","searchText","setCurrentUser","azureOID","setUserRoles","isLoadingUserRoles","setisLoadingUserRoles","fetchUser","lastLoginDate","userLocation","Activity","setShiftRequests","isSaving","setSaving","CanceledDate","fetchShiftRequests","updatedShiftRequests","baseColumns","DvmName","LocationName","ShiftDate","canceledDateTime","unshift","ReadState","PrivacyPolicy","mb","headingTextColor","subheader","ListItem","my","dense","listItem","TermsAndConditions","RELIEF_SCHEDULING","FT_SCHEDULING","PENDING_PAYMENTS","LOCATIONS","LOCATION_DETAILS","DVMS","DVMS_DETAILS","DVM_DEACTIVATED","HOLIDAYS","USERS","LEGALENTITIES","ACTIVITY","NOT_FOUND","Roles","MUIHome","pageComponent","Today","CalendarMonthIcon","PaymentsIcon","StoreTwoTone","CelebrationOutlinedIcon","GroupsTwoTone","AdminPanelSettingsTwoTone","RuleTwoTone","setUser","isFetching","isUserInAnyValidRole","getUserInfo","isSetUp","UserContextHandler","useAccount","setFetching","setIsSetUp","DVM","forceTokenRefresh","holder","hasOwnProperty","reload","handleSetUser","dvmStatus","LoadContext","LoadProvider","loadKeys","initialValue","trait","updateTrait","useSyncState","loadKey","load","NavContextHandler","PrivateRoute","redirectTo","HeaderLoader","loadingText","headerText","subtitleText","ErrorBoundary","hasError","errorInfo","this","setState","Component","withRouter","ErrorPage","VerifyEmail","queryParameters","search","isVerifyingEmail","setIsVerifyingEmail","setErrorMessage","verifyEmail","REACT_APP_GA_TRACKING","publicPaths","AuthWrapper","interactionType","InteractionType","Redirect","errorComponent","App","ga","ReactGA","initialize","gtagOptions","titleCase","process","queryClient","QueryClient","defaultOptions","queries","cacheTime","retry","retryOnMount","staleTime","Infinity","refetchOnMount","refetchOnWindowFocus","StyledEngineProvider","injectFirst","ThemeProvider","client","iconVariant","maxSnack","TransitionComponent","Slide","loadingElement","googleMapsApiKey","buildSettings","REACT_APP_GOOGLE_KEY","exact","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","setActiveAccount","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.69b7a435.chunk.js","sourcesContent":["import { GoogleMap, Marker, MarkerClusterer } from '@react-google-maps/api';\r\nimport { mapStyles } from './mapStyles';\r\nimport { IMapLocation } from '../../models/maps';\r\nimport { CustomInfoWindow } from './customInfoWindow';\r\nimport { useCurrentHeight } from '../../helpers/resize';\r\nimport { useMediaQuery } from '@mui/material';\r\n\r\ninterface ILatLng {\r\n  lat: number;\r\n  lng: number;\r\n}\r\ninterface Props {\r\n  locations: IMapLocation[];\r\n  isMapLoaded: () => void;\r\n  isMapLoading: boolean;\r\n  showOverlay: (locationId: number) => void;\r\n  handleInfoWindowClose: () => void;\r\n  setInfoWindow: (locationId: number | null) => void;\r\n  infoWindow: number | null;\r\n  center: ILatLng;\r\n  setCenter: React.Dispatch<React.SetStateAction<ILatLng>>;\r\n  zoom: number;\r\n  setZoom: React.Dispatch<React.SetStateAction<number>>;\r\n}\r\n\r\nenum LocationTypes {\r\n  UrgentVet = 'UrgentVet',\r\n  GeneralPractice = 'GeneralPractice',\r\n}\r\n\r\nexport const Map = (props: Props) => {\r\n  const windowHeight = useCurrentHeight();\r\n  const mapContainerHeight = windowHeight - windowHeight * 0.3 + 'px';\r\n\r\n  const { center, setCenter, zoom, setZoom } = props;\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n\r\n  return (\r\n    <GoogleMap\r\n      onTilesLoaded={() => {\r\n        props.isMapLoaded();\r\n      }}\r\n      mapContainerStyle={{ height: mapContainerHeight }}\r\n      options={{\r\n        mapTypeControl: false,\r\n        fullscreenControl: false,\r\n        streetViewControl: false,\r\n        zoomControl: !isMobile,\r\n        styles: mapStyles,\r\n        gestureHandling: 'greedy',\r\n        zoom: zoom,\r\n        center: center,\r\n      }}\r\n    >\r\n      <MarkerClusterer\r\n        // https://nooshu.com/blog/2012/10/03/marker-cluster-calculator-for-google-maps-v3/\r\n        calculator={function (markers, numStyles) {\r\n          const totalShiftsInCluster = markers.reduce((prev, curr) => {\r\n            const label = curr?.getLabel() as google.maps.MarkerLabel;\r\n            return prev + parseInt(label.text, 10);\r\n          }, 0);\r\n          //create an index for icon styles\r\n          let index = 0,\r\n            //Count the total number of markers in this cluster\r\n            count = markers.length,\r\n            //Set total to loop through (starts at total number)\r\n            total = count;\r\n          /**\r\n           * While we still have markers, divide by a set number and\r\n           * increase the index. Cluster moves up to a new style.\r\n           *\r\n           * The bigger the index, the more markers the cluster contains,\r\n           * so the bigger the cluster.\r\n           */\r\n          while (total !== 0) {\r\n            //Create a new total by dividing by a set number\r\n            total = parseInt(`${total / 5}`, 10);\r\n            //Increase the index and move up to the next style\r\n            index++;\r\n          }\r\n\r\n          /**\r\n           * Make sure we always return a valid index. E.g. If we only have\r\n           * 5 styles, but the index is 8, this will make sure we return\r\n           * 5. Returning an index of 8 wouldn't have a marker style.\r\n           */\r\n          index = Math.min(index, numStyles);\r\n\r\n          //Tell MarkerCluster this clusters details (and how to style it)\r\n          return {\r\n            text: `${totalShiftsInCluster}`,\r\n            index: index,\r\n          };\r\n        }}\r\n      >\r\n        {clusterer => (\r\n          <>\r\n            {props.locations.map(location => {\r\n              return (\r\n                <Marker\r\n                  key={location.locationId}\r\n                  label={{\r\n                    text: `${location.shiftCount}`,\r\n                    color: location.locationType === LocationTypes.UrgentVet ? 'black' : 'white',\r\n                  }}\r\n                  position={{ lat: location.latitude, lng: location.longitude }}\r\n                  clusterer={clusterer}\r\n                  icon={{\r\n                    url:\r\n                      location.locationType === LocationTypes.UrgentVet\r\n                        ? 'images/pointless-marker.png'\r\n                        : 'images/pointless-marker-blue.png',\r\n\r\n                    scaledSize: new google.maps.Size(26, 36),\r\n                    labelOrigin: new google.maps.Point(13, 13),\r\n                  }}\r\n                  onClick={() => {\r\n                    setCenter({\r\n                      lat: location.latitude - 0.0039,\r\n                      lng: location.longitude + 0.0042,\r\n                    });\r\n                    setZoom(15);\r\n                    props.setInfoWindow(location.locationId);\r\n                    props.showOverlay(location.locationId);\r\n                  }}\r\n                >\r\n                  {props.infoWindow === location.locationId && (\r\n                    <CustomInfoWindow\r\n                      key={location.locationId}\r\n                      onCloseClick={() => {\r\n                        props.setInfoWindow(null);\r\n                        props.handleInfoWindowClose();\r\n                      }}\r\n                      location={location}\r\n                      lat={location.latitude}\r\n                      lng={location.longitude}\r\n                    />\r\n                  )}\r\n                </Marker>\r\n              );\r\n            })}\r\n          </>\r\n        )}\r\n      </MarkerClusterer>\r\n    </GoogleMap>\r\n  );\r\n};\r\n","import { Typography } from '@mui/material';\r\nimport CircularProgress, { CircularProgressProps } from '@mui/material/CircularProgress';\r\nimport { alpha, Theme } from '@mui/material/styles';\r\nimport { createStyles, makeStyles } from '@mui/styles';\r\nimport clsx from 'clsx';\r\nimport React, { FC } from 'react';\r\n\r\ninterface ILoaderExtended {\r\n  loaderWrapperClassName?: string;\r\n  position?: 'centered' | 'left' | 'top-center';\r\n  size?: 'small' | 'medium' | 'large';\r\n  subtitle?: string;\r\n  title?: string;\r\n  topOffset?: number;\r\n  type?: 'fullscreen' | 'inline' | 'overlay';\r\n}\r\n\r\ntype ILoader = ILoaderExtended & Omit<CircularProgressProps, 'variant'>;\r\n\r\n/**\r\n * A presentational CircularProgress indicator.\r\n * \r\n * @usage\r\n * ```TypeScript\r\n * const Component: FC = () => {\r\n *   const [isLoading, setIsLoading] = useState(true);\r\n *   const [resources, setResources] = useState<Resource[]>([]);\r\n *   useEffect(() => {\r\n *     fetchResource().then(x => setResource(x)).finally(() => setIsLoading(false));\r\n *   }, []);\r\n *   if (isLoading) return <Loader title=\"Loading xyz data...\" />;\r\n *   return <div> ... </div>;\r\n * };\r\n * ```\r\n */\r\nexport const Loader: FC<ILoader> = ({\r\n  children,\r\n  loaderWrapperClassName = '',\r\n  subtitle,\r\n  title = 'Loading...',\r\n  ...props\r\n}) => {\r\n  const classes = useStyles(props);\r\n  return (\r\n    <div\r\n      className={clsx(classes.loader, loaderWrapperClassName)}\r\n      data-testid={props.id}\r\n      role=\"alert\"\r\n    >\r\n      <div className={classes.inner}>\r\n        <CircularProgress\r\n          {...props}\r\n          className={clsx(classes.progress, props.className)}\r\n          size={props.size === 'large' ? 18 : props.size === 'small' ? 10 : 14}\r\n          variant=\"indeterminate\"\r\n        />\r\n        <div className={classes.text}>\r\n          {children}\r\n          {!children && (\r\n            <>\r\n              <Typography className={classes.title} variant=\"body1\">\r\n                {title}\r\n              </Typography>\r\n              {subtitle && (\r\n                <Typography className={classes.subtitle} variant=\"subtitle1\">\r\n                  {subtitle}\r\n                </Typography>\r\n              )}\r\n            </>\r\n          )}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, ILoader>((theme: Theme) => {\r\n  return createStyles({\r\n    inner: {\r\n      alignItems: 'center',\r\n      display: 'flex',\r\n      flexShrink: 1,\r\n      flexWrap: 'wrap',\r\n      justifyContent: props =>\r\n        props.position === 'top-center'\r\n          ? 'center'\r\n          : props.position === 'centered'\r\n          ? 'center'\r\n          : 'flex-start',\r\n      marginTop: props => props.topOffset && props.topOffset + '%',\r\n      width: '100%',\r\n    },\r\n    loader: {\r\n      alignItems: props => (props.position === 'centered' ? 'center' : 'flex-start'),\r\n      backgroundColor: props =>\r\n        props.type === 'fullscreen' || props.type === 'overlay'\r\n          ? alpha(theme.palette.background.paper, 0.75)\r\n          : '',\r\n      bottom: 0,\r\n      display: 'flex',\r\n      fontSize: props =>\r\n        props.size === 'large' ? '1.25rem' : props.size === 'small' ? '0.875rem' : '1rem',\r\n      height: props => (props.position === 'centered' ? '100%' : 'auto'),\r\n      left: 0,\r\n      position: props =>\r\n        props.type === 'fullscreen' ? 'fixed' : props.type === 'overlay' ? 'absolute' : 'static',\r\n      right: 0,\r\n      top: 0,\r\n      width: '100%',\r\n      zIndex: theme.zIndex.tooltip + 1,\r\n    },\r\n    progress: {\r\n      color: theme.palette.primary.main,\r\n      margin: theme.spacing(0, 1, 0, 0),\r\n    },\r\n    subtitle: {\r\n      color: theme.palette.grey[800],\r\n      fontSize: props =>\r\n        props.size === 'large' ? '0.875rem' : props.size === 'small' ? '0.625rem' : '0.75rem',\r\n      margin: theme.spacing(0.25, 0, 0),\r\n      textTransform: 'uppercase',\r\n    },\r\n    text: {\r\n      maxWidth: 230, // this is needed for long subtitles (to force that text to wrap)\r\n    },\r\n    title: {\r\n      color: theme.palette.primary.main,\r\n      fontSize: props =>\r\n        props.size === 'large' ? '1.25rem' : props.size === 'small' ? '0.875rem' : '1rem',\r\n      margin: 0,\r\n    },\r\n  });\r\n});\r\n","import React, { FC } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Link as MLink } from 'react-router-dom';\r\n\r\ninterface ILink {\r\n  className?: string;\r\n  to: string;\r\n  type?: 'primary' | 'white';\r\n}\r\n\r\nexport const Link: FC<ILink> = ({ to, children, className, type = 'primary' }) => {\r\n  const classes = useStyles();\r\n\r\n  return (\r\n    <MLink to={to} className={clsx(classes[type], className)}>\r\n      {/* @ts-ignore */}\r\n      {children}\r\n    </MLink>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  white: {\r\n    color: theme.palette.background.paper,\r\n    textDecoration: 'none',\r\n  },\r\n  primary: {\r\n    color: theme.palette.primary.main,\r\n    textDecoration: 'none',\r\n    '&:hover': {\r\n      color: theme.palette.primary.dark,\r\n    },\r\n  },\r\n}));\r\n","import {\r\n  Backdrop,\r\n  CircularProgress,\r\n  Dialog,\r\n  DialogActions,\r\n  DialogContent as MuiDialogContent,\r\n  DialogContentProps,\r\n  DialogProps,\r\n  DialogTitle as MuiDialogTitle,\r\n  DialogTitleProps,\r\n  IconButton,\r\n  Typography,\r\n} from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Close } from '@mui/icons-material';\r\nimport { FC, ReactNode } from 'react';\r\n\r\ninterface IModal {\r\n  actions?: JSX.Element;\r\n  children: ReactNode;\r\n  customButtonHandler?: Function;\r\n  customButtonIcon?: JSX.Element;\r\n  DialogContentProps?: DialogContentProps;\r\n  DialogTitleProps?: DialogTitleProps;\r\n  /** Defaults to true. */\r\n  fullWidth?: boolean;\r\n  /** Defaults to false */\r\n  isLoading?: boolean;\r\n  maxWidth?: DialogProps['maxWidth'];\r\n  noPaddingContent?: boolean;\r\n  subtitle?: string;\r\n  titleContent?: JSX.Element | string;\r\n}\r\n\r\n/**\r\n * @usage\r\n * ```TypeScript\r\n * const Component: FC = () => {\r\n *   const [isModalOpen, setIsModalOpen] = useState(false);\r\n *   return (\r\n *     <Modal open={isModalOpen} onClose={() => setIsModalOpen(false)}>\r\n *       ...\r\n *     </Modal>\r\n *   );\r\n * ```\r\n * }\r\n */\r\nexport const Modal: FC<IModal & DialogProps> = ({\r\n  actions,\r\n  children,\r\n  customButtonHandler,\r\n  customButtonIcon,\r\n  DialogContentProps,\r\n  DialogTitleProps,\r\n  fullWidth = true,\r\n  isLoading = false,\r\n  maxWidth,\r\n  noPaddingContent,\r\n  subtitle,\r\n  titleContent,\r\n  ...dialogProps\r\n}) => {\r\n  const classes = modalStyles({ noPaddingContent });\r\n\r\n  return (\r\n    <Dialog fullWidth={fullWidth} maxWidth={maxWidth ?? 'lg'} {...dialogProps}>\r\n      {/* CIRCLE LOADER */}\r\n      <Backdrop open={isLoading}>\r\n        <CircularProgress color=\"primary\" />\r\n      </Backdrop>\r\n\r\n      {/* MODAL CONTENT */}\r\n      {!isLoading && (\r\n        <div className={classes.dialogContainer}>\r\n          <MuiDialogTitle classes={{ root: classes.dialogTitle }} {...DialogTitleProps}>\r\n            {titleContent && (\r\n              <Typography className={classes.title} variant=\"h6\">\r\n                {titleContent}\r\n              </Typography>\r\n            )}\r\n            {customButtonHandler && (\r\n              <IconButton\r\n                className={classes.customButton}\r\n                onClick={() => customButtonHandler()}\r\n                size=\"large\"\r\n              >\r\n                {customButtonIcon}\r\n              </IconButton>\r\n            )}\r\n            <IconButton\r\n              aria-label=\"Close\"\r\n              className={classes.close}\r\n              onClick={() => {\r\n                dialogProps?.onClose?.({}, 'backdropClick');\r\n              }}\r\n              size=\"large\"\r\n            >\r\n              <Close />\r\n            </IconButton>\r\n          </MuiDialogTitle>\r\n\r\n          <MuiDialogContent\r\n            classes={{ root: classes.dialogContent }}\r\n            dividers={false}\r\n            {...DialogContentProps}\r\n          >\r\n            {subtitle && (\r\n              <Typography className={classes.subtitle} variant=\"h4\">\r\n                {subtitle}\r\n              </Typography>\r\n            )}\r\n            {children}\r\n          </MuiDialogContent>\r\n\r\n          {actions && <DialogActions>{actions}</DialogActions>}\r\n        </div>\r\n      )}\r\n    </Dialog>\r\n  );\r\n};\r\n\r\nconst modalStyles = makeStyles<Theme, { noPaddingContent?: boolean }>((theme: Theme) => {\r\n  return {\r\n    dialogContainer: {\r\n      padding: '12px',\r\n    },\r\n    close: {\r\n      position: 'absolute',\r\n      right: theme.spacing(0.25),\r\n      top: theme.spacing(0.25),\r\n      color: theme.palette.primary.main,\r\n    },\r\n    customButton: {\r\n      position: 'absolute',\r\n      right: theme.spacing(3),\r\n      top: theme.spacing(0.25),\r\n      color: theme.palette.primary.main,\r\n    },\r\n    dialogContent: {\r\n      // minHeight is to give <Loader /> component top and bottom space, if shown with no content to overlay\r\n      minHeight: theme.spacing(4),\r\n      padding: ({ noPaddingContent }) => (noPaddingContent ? 0 : theme.spacing(0.5, 1.5, 1.5)),\r\n    },\r\n    dialogTitle: {\r\n      margin: 0,\r\n      padding: theme.spacing(1, 4, 1, 1.5),\r\n    },\r\n    subtitle: {\r\n      color: theme.palette.secondary.main,\r\n      fontSize: 28,\r\n      lineHeight: 1.3,\r\n      margin: theme.spacing(0, 0, 1),\r\n    },\r\n    title: {\r\n      fontSize: 20,\r\n      textTransform: 'uppercase',\r\n      color: theme.palette.primary.main,\r\n    },\r\n  };\r\n});\r\n","import { Box, Button, Grid, IconButton, Menu, MenuItem } from '@mui/material';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { useMsal } from '@azure/msal-react';\r\nimport { Theme, lighten } from '@mui/material/styles';\r\nimport {\r\n  AccountCircle as AccountCircleIcon,\r\n  ArrowForwardOutlined as ArrowForwardOutlinedIcon,\r\n  Menu as MenuIcon,\r\n} from '@mui/icons-material';\r\nimport clsx from 'clsx';\r\nimport { FC, useContext, useState } from 'react';\r\nimport { AppBar, Toolbar } from '@mui/material';\r\nimport { Logo } from './';\r\nimport { UserContext } from '../../context';\r\nconst config = require('../../buildSettings.json');\r\n\r\ninterface IHeaderProps {\r\n  setShowNav(showNav: boolean): void;\r\n  showNav: boolean;\r\n  height: number;\r\n}\r\n\r\nexport const Header: FC<IHeaderProps> = ({ setShowNav, showNav, height }) => {\r\n  const { user, isDVMPending, isActive } = useContext(UserContext);\r\n  const { instance } = useMsal();\r\n  const classes = useStyles();\r\n\r\n  const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n  return (\r\n    <Box sx={{ flexGrow: 1 }}>\r\n      <AppBar\r\n        position=\"fixed\"\r\n        sx={{\r\n          height,\r\n          zIndex: theme => theme.zIndex.drawer + 1,\r\n          backgroundColor: theme => theme.palette.common.white,\r\n        }}\r\n      >\r\n        <Toolbar className={classes.toolbar} disableGutters sx={{ height }}>\r\n          {/* MENU BUTTON */}\r\n          <IconButton\r\n            onClick={\r\n              !isDVMPending && isActive ? () => setShowNav(!showNav) : () => setShowNav(false)\r\n            }\r\n            color=\"primary\"\r\n            aria-label=\"Toggle sidebar navigation text.\"\r\n          >\r\n            <MenuIcon className={classes.hamburger} />\r\n          </IconButton>\r\n\r\n          {/* LOGO */}\r\n          <Logo />\r\n\r\n          <Grid item className={classes.searchCol}>\r\n            <div className={classes.innerCol}>\r\n              {/* DROPDOWN BUTTON */}\r\n              <Button\r\n                onClick={event => setAnchorEl(event.currentTarget)}\r\n                size=\"medium\"\r\n                variant=\"contained\"\r\n                className={clsx(classes.headerButton, classes.accountButton)}\r\n                aria-controls=\"customized-menu\"\r\n                aria-haspopup=\"true\"\r\n              >\r\n                <AccountCircleIcon className={clsx(classes.accountIcon, classes.accountIcon)} />\r\n                <span className={clsx(classes.buttonText, classes.accountText)}>\r\n                  {user?.account?.username}\r\n                </span>\r\n              </Button>\r\n\r\n              {/* DROPDOWN MENU */}\r\n              <Menu\r\n                id=\"customized-menu\"\r\n                anchorEl={anchorEl}\r\n                keepMounted\r\n                open={!!anchorEl}\r\n                onClose={() => setAnchorEl(null)}\r\n                anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\r\n                transformOrigin={{ vertical: 'top', horizontal: 'center' }}\r\n              >\r\n                {/* LOGOUT */}\r\n                <MenuItem\r\n                  onClick={async () => {\r\n                    try {\r\n                      // Log out of MSAL\r\n                      await instance.logoutRedirect({\r\n                        postLogoutRedirectUri: `${config.REACT_APP_MSAL_REDIRECT}`,\r\n                      });\r\n                    } catch (error) {\r\n                      console.error(error);\r\n                    }\r\n                  }}\r\n                  className={clsx(classes.logOutItem, classes.accountItem)}\r\n                >\r\n                  <ArrowForwardOutlinedIcon className={classes.iconFill} />\r\n                  Logout\r\n                </MenuItem>\r\n              </Menu>\r\n            </div>\r\n          </Grid>\r\n        </Toolbar>\r\n      </AppBar>\r\n    </Box>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => {\r\n  return {\r\n    innerCol: {\r\n      display: 'flex',\r\n      height: '100%',\r\n      alignItems: 'center',\r\n      flex: '1',\r\n      justifyContent: 'flex-end',\r\n    },\r\n    searchCol: {\r\n      paddingRight: '1rem',\r\n      flexGrow: 1,\r\n    },\r\n    headerButton: {\r\n      color: theme.palette.common.black,\r\n      display: 'flex',\r\n      height: '45px',\r\n      marginBottom: 'auto',\r\n      marginTop: 'auto',\r\n      justifyContent: 'space-between',\r\n    },\r\n    hamburger: {\r\n      fill: theme.palette.primary.main,\r\n    },\r\n    accountButton: {\r\n      backgroundColor: lighten(theme.palette.common.white, 0.4),\r\n      '&:hover': {\r\n        backgroundColor: lighten(theme.palette.common.white, 0.4),\r\n      },\r\n    },\r\n    buttonText: {\r\n      color: theme.palette.common.black,\r\n      fontWeight: 'normal',\r\n      textTransform: 'none',\r\n      whiteSpace: 'nowrap',\r\n    },\r\n    accountText: {\r\n      display: 'none',\r\n      [theme.breakpoints.up('md')]: {\r\n        display: 'inline',\r\n      },\r\n    },\r\n    accountIcon: {\r\n      height: '31px',\r\n      width: '31px',\r\n      color: theme.palette.secondary.main,\r\n    },\r\n    logOutItem: {\r\n      color: theme.palette.secondary.main,\r\n    },\r\n    iconFill: {\r\n      fill: theme.palette.secondary.main,\r\n    },\r\n    accountItem: {\r\n      '& > svg': {\r\n        marginRight: theme.spacing(0.5),\r\n      },\r\n    },\r\n    toolbar: {\r\n      marginLeft: theme.spacing(1),\r\n      columnGap: theme.spacing(1.5),\r\n    },\r\n  };\r\n});\r\n","import { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport React, { FC } from 'react';\r\nimport { AppBar, Toolbar } from '@mui/material';\r\n\r\ninterface IFooter {\r\n  clientName: string;\r\n  height: number;\r\n}\r\n\r\nexport const Footer: FC<IFooter> = ({ clientName, height }) => {\r\n  const classes = useStyles();\r\n\r\n  return (\r\n    <AppBar\r\n      className={classes.footerContainer}\r\n      position=\"fixed\"\r\n      color=\"primary\"\r\n      component=\"footer\"\r\n      sx={{ height, zIndex: theme => theme.zIndex.drawer + 1 }}\r\n    >\r\n      <Toolbar disableGutters>\r\n        {clientName} {new Date().getFullYear()}. All Rights Reserved.\r\n      </Toolbar>\r\n    </AppBar>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => {\r\n  return {\r\n    footerContainer: {\r\n      display: 'flex',\r\n      justifyContent: 'center',\r\n      alignItems: 'center',\r\n      top: 'auto',\r\n      bottom: 0,\r\n      backgroundColor: theme.palette.primary.main,\r\n      color: theme.palette.primary.main,\r\n    },\r\n  };\r\n});\r\n","import React, { FC, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport { makeStyles } from '@mui/styles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport {\r\n  alpha,\r\n  Box,\r\n  Drawer,\r\n  Icon,\r\n  List,\r\n  ListItemButton,\r\n  ListItemIcon,\r\n  ListItemText,\r\n  Toolbar,\r\n} from '@mui/material';\r\nimport clsx from 'clsx';\r\nimport { IRoute, Paths } from '../../constants';\r\n\r\nexport interface ISideNavProps {\r\n  open: boolean;\r\n  navItems: IRoute[];\r\n  isMobile: boolean;\r\n  setShowNav: (b: boolean) => void;\r\n  width: number;\r\n  headerHeight: number;\r\n}\r\n\r\nexport const SideNav: FC<ISideNavProps> = ({\r\n  headerHeight,\r\n  open,\r\n  navItems,\r\n  isMobile,\r\n  setShowNav,\r\n  width,\r\n}) => {\r\n  const { pathname } = useLocation();\r\n  const history = useHistory();\r\n  const classes = useStyles({ width });\r\n\r\n  const isSelected = useCallback(\r\n    (route: string) => pathname?.split('/')[1] === route?.split('/')[1],\r\n    [pathname]\r\n  );\r\n\r\n  const handleNavItemClick = (route: typeof Paths[keyof typeof Paths]) => {\r\n    // Automatically close the menu on nav selection for mobile views\r\n\r\n    if (isMobile) {\r\n      setShowNav(false);\r\n    }\r\n    history.push(route);\r\n  };\r\n\r\n  return (\r\n    <Drawer\r\n      anchor=\"left\"\r\n      variant=\"persistent\"\r\n      classes={{ paper: classes.drawer }}\r\n      open={(isMobile && open) || !isMobile}\r\n    >\r\n      {/* HEADER SPACER */}\r\n      <Toolbar sx={{ height: headerHeight }} />\r\n\r\n      {/* NAV CONTAINER */}\r\n      <Box className={classes.navContainer}>\r\n        <List sx={{ paddingTop: '1px' }}>\r\n          {navItems.map(item => (\r\n            <ListItemButton\r\n              classes={{ root: classes.navItem, selected: classes.listItemSelected }}\r\n              className={isSelected(item.path) ? classes.navLinkActive : classes.navLink}\r\n              key={item.sortOrder}\r\n              onClick={() => handleNavItemClick(item.path)}\r\n              selected={isSelected(item.path)}\r\n              role={\"listitem\"}\r\n              component={\"li\"}\r\n              title={item.label}\r\n            >\r\n              {/* NAV ICON */}\r\n              <ListItemIcon\r\n                className={isSelected(item.path) ? classes.navIconSelected : classes.navIcon}\r\n              >\r\n                <Icon component={item.icon} />\r\n              </ListItemIcon>\r\n\r\n              {/* NAV TEXT */}\r\n              <ListItemText\r\n                primary={item.label}\r\n                className={clsx(classes.showLabel, {\r\n                  [classes.hideLabel]: !open,\r\n                })}\r\n              />\r\n            </ListItemButton>\r\n          ))}\r\n        </List>\r\n      </Box>\r\n    </Drawer>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { width: number }>(theme => ({\r\n  drawer: {\r\n    backgroundColor: theme.palette.secondary.main,\r\n  },\r\n  listItemSelected: {\r\n    '&.selected': { backgroundColor: 'none' },\r\n  },\r\n  navContainer: {\r\n    overflowY: 'auto',\r\n    overflowX: 'hidden',\r\n    fontSize: '24px',\r\n    width: ({ width }) => width,\r\n    transition: theme.transitions.create('width', {\r\n      easing: theme.transitions.easing.sharp,\r\n      duration: theme.transitions.duration.leavingScreen,\r\n    }),\r\n  },\r\n  showLabel: {\r\n    opacity: 1,\r\n    whiteSpace: 'nowrap',\r\n    transition: theme.transitions.create('opacity', {\r\n      easing: theme.transitions.easing.sharp,\r\n      duration: theme.transitions.duration.leavingScreen,\r\n    }),\r\n  },\r\n  hideLabel: {\r\n    opacity: 0,\r\n  },\r\n  navLink: {\r\n    fill: theme.palette.common.white,\r\n    color: alpha(theme.palette.common.white, 0.4),\r\n    '& button': {\r\n      fill: alpha(theme.palette.common.white, 0.4),\r\n    },\r\n    '& button svg': {\r\n      fill: alpha(theme.palette.common.white, 0.4),\r\n    },\r\n  },\r\n  navLinkActive: {\r\n    borderLeft: `2px solid ${theme.palette.primary.main}`,\r\n    fill: theme.palette.common.white,\r\n    backgroundColor: 'none',\r\n    color: alpha(theme.palette.common.white, 1),\r\n    '& button': {\r\n      fill: alpha(theme.palette.common.white, 1),\r\n    },\r\n    '& button svg': {\r\n      fill: alpha(theme.palette.common.white, 1),\r\n    },\r\n\r\n    selected: {\r\n      backgroundColor: 'none',\r\n    },\r\n  },\r\n  navItem: {\r\n    color: alpha(theme.palette.common.white, 0.4),\r\n\r\n    '&.Mui-selected': {\r\n      backgroundColor: 'transparent',\r\n      color: theme.palette.common.white,\r\n      fill: alpha(theme.palette.common.white, 1),\r\n    },\r\n  },\r\n  navIcon: {\r\n    '& svg': {\r\n      fill: alpha(theme.palette.common.white, 0.4),\r\n    },\r\n  },\r\n  navIconSelected: {\r\n    '& svg': {\r\n      fill: alpha(theme.palette.common.white, 1),\r\n    },\r\n  },\r\n}));\r\n","import { Divider, Grid, Theme, Typography } from '@mui/material';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { FC } from 'react';\r\n\r\nexport interface IPageTitleProps {\r\n  title?: string;\r\n  showDivider?: boolean;\r\n  additionalHeaderContent?: JSX.Element;\r\n  subTitle?: string | JSX.Element;\r\n  marginBottom?: boolean;\r\n  paddingBottom?: number;\r\n  additionalHeaderContentGridSpace?: number;\r\n}\r\n\r\nexport const PageTitle: FC<IPageTitleProps> = ({\r\n  title,\r\n  showDivider = true,\r\n  additionalHeaderContent,\r\n  marginBottom = true,\r\n  subTitle,\r\n  paddingBottom,\r\n  additionalHeaderContentGridSpace = 6,\r\n}) => {\r\n  const classes = useStyles({ marginBottom, paddingBottom });\r\n  return (\r\n    <>\r\n      <Grid container alignItems=\"center\" className={classes.topWrapper}>\r\n        <Grid item xs={12 - additionalHeaderContentGridSpace}>\r\n          <Typography variant=\"h1\" className={classes.heading}>\r\n            {title}\r\n            <Typography className={classes.subTitle} component=\"span\">\r\n              {subTitle}\r\n            </Typography>\r\n            {showDivider && !additionalHeaderContent && title && (\r\n              <Divider className={classes.divider} />\r\n            )}\r\n          </Typography>\r\n        </Grid>\r\n        {additionalHeaderContent && (\r\n          <Grid item xs={!additionalHeaderContent ? 12 : additionalHeaderContentGridSpace}>\r\n            <div className={classes.additionalItems}>{additionalHeaderContent}</div>\r\n          </Grid>\r\n        )}\r\n\r\n        <Grid item xs={12}>\r\n          {showDivider && additionalHeaderContent && title && (\r\n            <Divider className={classes.additionalContentDivider} />\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { marginBottom: boolean; paddingBottom: number | undefined }>(\r\n  theme => ({\r\n    heading: {\r\n      marginBottom: ({ marginBottom }) => (marginBottom ? theme.spacing(0.5) : 0),\r\n      color: theme.palette.common.black,\r\n      textAlign: 'center',\r\n      [theme.breakpoints.up('sm')]: {\r\n        textAlign: 'left',\r\n      },\r\n    },\r\n    topWrapper: {\r\n      marginBottom: theme.spacing(0.5),\r\n      justifyContent: 'center',\r\n      flexDirection: 'column',\r\n      paddingBottom: ({ paddingBottom }) => (paddingBottom ? paddingBottom : 0),\r\n      [theme.breakpoints.up('sm')]: {\r\n        justifyContent: 'flex-start',\r\n        flexDirection: 'row',\r\n      },\r\n    },\r\n    divider: {\r\n      marginTop: 0,\r\n    },\r\n    additionalContentDivider: {\r\n      marginTop: theme.spacing(0.5),\r\n    },\r\n    contentDivider: {\r\n      marginTop: 0,\r\n    },\r\n    additionalItems: {\r\n      [theme.breakpoints.up('sm')]: {\r\n        textAlign: 'right',\r\n      },\r\n    },\r\n    subTitle: {\r\n      display: 'block',\r\n      color: '#000',\r\n      marginTop: 5,\r\n    },\r\n  })\r\n);\r\n","import { useTheme, useMediaQuery } from '@mui/material';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport React, { FC, useContext, useEffect, useMemo, useState } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport clsx from 'clsx';\r\n\r\nimport { Footer, Header } from './';\r\nimport { SideNav } from '../side-nav';\r\nimport { PageTitle } from '../page-title';\r\nimport { NavContext, UserContext } from '../../context';\r\nimport { Paths, Routes } from '../../constants';\r\n\r\n// Placeholder icons for demonstration purposes\r\n\r\nimport { Theme } from '@mui/material/styles';\r\n\r\ninterface IPage {\r\n  children: React.ReactNode;\r\n  title: string;\r\n  customPageHeader?: boolean;\r\n  footerAction?: () => void;\r\n  additionalHeaderContent?: JSX.Element;\r\n  contentWidthFull?: true;\r\n  paddingBottom?: number;\r\n  additionalHeaderContentGridSpace?: number;\r\n}\r\n\r\n/**\r\n * Controls both the <Footer /> text display and the window title.\r\n */\r\nconst CLIENT_NAME = 'AVG';\r\nexport const SIDENAV_WIDTH_COLLAPSED = 56;\r\nexport const SIDENAV_WIDTH_EXPANDED = 240;\r\nconst HEADER_HEIGHT = 64;\r\nconst FOOTER_HEIGHT = 64;\r\n\r\nexport const Page: FC<IPage> = ({\r\n  children,\r\n  title,\r\n  customPageHeader = false,\r\n  footerAction,\r\n  additionalHeaderContent,\r\n  paddingBottom,\r\n  additionalHeaderContentGridSpace,\r\n}) => {\r\n  const { pathname } = useLocation();\r\n  const theme = useTheme();\r\n  const isMobile = useMediaQuery(`(max-width: ${theme.breakpoints.values.mobile}px)`);\r\n\r\n  const { user, isDVM, isDVMPending, isDVMContractor, isActive, isDVMDeactivated } =\r\n    useContext(UserContext);\r\n\r\n  const { isExpanded, setIsExpanded } = useContext(NavContext);\r\n\r\n  const sideNavWidth = useMemo(() => {\r\n    if (isExpanded && isMobile) {\r\n      // Show Icons and Labels\r\n      return SIDENAV_WIDTH_EXPANDED;\r\n    }\r\n    if (isExpanded) {\r\n      // Show Icons and Labels\r\n      return SIDENAV_WIDTH_EXPANDED;\r\n    } else if (!isExpanded) {\r\n      // Only show Icons\r\n      return SIDENAV_WIDTH_COLLAPSED;\r\n    } else {\r\n      // Hide completely\r\n      return 0;\r\n    }\r\n  }, [isExpanded, isMobile]);\r\n\r\n  const classes = useStyles({\r\n    sideNavWidth,\r\n    showFooter: !!footerAction,\r\n    isMobile,\r\n    isDVMPending,\r\n    contentWidthFull: true,\r\n  });\r\n\r\n  useEffect(() => {\r\n    document.title = `${title} | ${CLIENT_NAME}`;\r\n  }, [pathname, title]);\r\n\r\n  const [navItems, setNavItems] = useState(Routes);\r\n\r\n  const showSideNav = () => {\r\n    if (isDVMDeactivated) {\r\n      return false;\r\n    }\r\n    if (!isDVMPending && isActive) {\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  };\r\n  useEffect(() => {\r\n    setNavItems(\r\n      Routes.filter(route => {\r\n        // if User is DVM and has 'Pending' status\r\n        if (isDVMPending) {\r\n          return route.path === Paths.DVM_PENDING;\r\n        }\r\n        return true;\r\n      })\r\n        .filter(route => {\r\n          // if User has no Roles\r\n          if (\r\n            !user?.account?.idTokenClaims?.roles ||\r\n            user?.account?.idTokenClaims?.roles.length < 1 ||\r\n            !user?.validation?.value.isActive\r\n          ) {\r\n            return route.path === Paths.HOME;\r\n          }\r\n\r\n          if (route.path === Paths.HOME && isDVMContractor) {\r\n            return true;\r\n          }\r\n\r\n          // Filter out routes that the user's role does not provide access to\r\n          return user?.account?.idTokenClaims?.roles?.some(role =>\r\n            route.allowedRoles?.includes(role)\r\n          );\r\n        })\r\n        .filter(route => {\r\n          //For ease of reading, if a route has more than roles that determine if it should show, add those checks here.\r\n          if (route.path === Paths.DVM_PROFILE) {\r\n            // Extra checks for DVM Profile\r\n\r\n            return isDVM && user?.validation?.value?.isActive;\r\n          }\r\n          return true;\r\n        })\r\n    );\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [user, isDVM]);\r\n\r\n  return (\r\n    <div className={classes.appFrame}>\r\n      <Header setShowNav={setIsExpanded} showNav={isExpanded} height={HEADER_HEIGHT} />\r\n\r\n      {/* SIDE NAVIGATION */}\r\n      {showSideNav() && (\r\n        <SideNav\r\n          open={isExpanded}\r\n          headerHeight={HEADER_HEIGHT}\r\n          setShowNav={setIsExpanded}\r\n          isMobile={isMobile}\r\n          width={sideNavWidth}\r\n          navItems={navItems}\r\n        />\r\n      )}\r\n\r\n      {/* BODY CONTENT */}\r\n      <div\r\n        className={clsx(classes.contentWrapper, {\r\n          [classes.contentShift]: isExpanded,\r\n        })}\r\n      >\r\n        <div className={classes.content}>\r\n          {!customPageHeader && (\r\n            <PageTitle\r\n              title={title}\r\n              additionalHeaderContent={additionalHeaderContent}\r\n              paddingBottom={paddingBottom}\r\n              additionalHeaderContentGridSpace={additionalHeaderContentGridSpace}\r\n            />\r\n          )}\r\n          {children}\r\n        </div>\r\n      </div>\r\n\r\n      {!!footerAction && <Footer clientName={CLIENT_NAME} height={FOOTER_HEIGHT} />}\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<\r\n  Theme,\r\n  {\r\n    sideNavWidth: number;\r\n    showFooter: boolean;\r\n    isMobile: boolean;\r\n    isDVMPending: boolean;\r\n    contentWidthFull: boolean;\r\n  }\r\n>((theme: Theme) => ({\r\n  appFrame: {\r\n    height: '100vh',\r\n    [theme.breakpoints.down('mobile')]: {\r\n      overflowY: 'scroll',\r\n    },\r\n\r\n    overflow: 'hidden',\r\n    backgroundColor: theme.palette.common.white,\r\n  },\r\n  contentWrapper: {\r\n    [theme.breakpoints.down('mobile')]: {\r\n      width: `100%`,\r\n    },\r\n    [theme.breakpoints.up('mobile')]: {\r\n      width: ({ sideNavWidth, isDVMPending }) =>\r\n        isDVMPending ? `100%` : `calc(100% - (${sideNavWidth}px }))`,\r\n      transition: theme.transitions.create('width', {\r\n        easing: theme.transitions.easing.easeInOut,\r\n        duration: theme.transitions.duration.enteringScreen,\r\n      }),\r\n    },\r\n    marginLeft: ({ sideNavWidth, isMobile, isDVMPending }) =>\r\n      isMobile || isDVMPending ? `0` : `${sideNavWidth}px`,\r\n    display: 'flex',\r\n    position: 'fixed',\r\n    right: 0,\r\n    left: 0,\r\n\r\n    top: theme.spacing(8),\r\n    bottom: ({ showFooter }) => (showFooter ? theme.spacing(8) : 0),\r\n    overflow: 'auto',\r\n    height: `calc(100% - ${theme.spacing(8)})`,\r\n  },\r\n  content: {\r\n    boxSizing: 'border-box',\r\n    overflowX: 'clip',\r\n    width: ({ contentWidthFull }) =>\r\n      contentWidthFull ? '100%' : `calc(100% - ${theme.spacing(4)})`,\r\n    padding: theme.spacing(3),\r\n    [theme.breakpoints.down('mobile')]: {\r\n      padding: theme.spacing(1, 3),\r\n    },\r\n  },\r\n  contentShift: {\r\n    // Account for side nav, plus left margin that would have been added\r\n    // from contentWrapper class rules\r\n    [theme.breakpoints.up('mobile')]: {\r\n      marginLeft: ({ sideNavWidth }) => `${sideNavWidth}px`,\r\n    },\r\n    transition: theme.transitions.create('margin', {\r\n      easing: theme.transitions.easing.easeOut,\r\n      duration: theme.transitions.duration.enteringScreen,\r\n    }),\r\n  },\r\n}));\r\n","import { ArrowBack } from '@mui/icons-material';\r\nimport { Divider, Grid, IconButton, Theme } from '@mui/material';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { FC } from 'react';\r\nimport { PageTitle } from './PageTitle';\r\nimport { useHistory } from 'react-router';\r\n\r\nexport interface IPageWithBackTitleProps {\r\n  backText?: string;\r\n  backUrl?: string;\r\n  title?: string;\r\n  additionalHeaderContent?: JSX.Element;\r\n  subTitle?: string | JSX.Element;\r\n  showDivider?: boolean;\r\n  isExternalLink?: boolean;\r\n}\r\n\r\nexport const PageTitleWithBack: FC<IPageWithBackTitleProps> = ({\r\n  backText = 'Back',\r\n  showDivider = true,\r\n  backUrl,\r\n  title,\r\n  additionalHeaderContent,\r\n  subTitle,\r\n  isExternalLink = false,\r\n}) => {\r\n  const classes = useStyles({ marginBottom: false });\r\n  const history = useHistory();\r\n  return (\r\n    <>\r\n      <Grid container className={classes.titleWrapper}>\r\n        <Grid item>\r\n          <IconButton\r\n            title={backText}\r\n            onClick={() =>\r\n              isExternalLink\r\n                ? (window.location.href = backUrl as string)\r\n                : history.push(backUrl as string)\r\n            }\r\n            size=\"large\"\r\n          >\r\n            <ArrowBack />\r\n          </IconButton>\r\n        </Grid>\r\n        <Grid item xs={12} className={classes.pageTitleWrapper}>\r\n          <PageTitle\r\n            showDivider={false}\r\n            title={title}\r\n            additionalHeaderContent={additionalHeaderContent}\r\n            subTitle={subTitle}\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n      {showDivider && title && <Divider className={classes.divider} />}\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { marginBottom: boolean }>(theme => ({\r\n  divider: {\r\n    marginTop: 0,\r\n  },\r\n  pageTitleWrapper: {\r\n    '@media (min-width: 768px)': {\r\n      flex: 1,\r\n    },\r\n  },\r\n  titleWrapper: {\r\n    flexWrap: 'nowrap',\r\n  },\r\n  subTitle: {\r\n    display: 'block',\r\n    color: '#000',\r\n    marginTop: 5,\r\n  },\r\n}));\r\n","import makeStyles from '@mui/styles/makeStyles';\r\nimport clsx from 'clsx';\r\nimport React, { FC } from 'react';\r\nimport image from '../../images/vetcher-logo-small-compressed.png';\r\n\r\ninterface ILogo {\r\n  className?: string;\r\n}\r\n\r\nexport const Logo: FC<ILogo> = ({ className }) => {\r\n  const classes = useStyles();\r\n\r\n  return <img src={image} alt=\"Urgent Vet\" className={clsx(classes.appLogo, className)} />;\r\n};\r\n\r\nconst useStyles = makeStyles(() => ({\r\n  appLogo: {\r\n    margin: 'auto 0',\r\n    width: '158px',\r\n  },\r\n}));\r\n","export default \"data:image/png;base64,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\"","export const mapStyles = [\r\n  // {\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#f5f5f5',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   elementType: 'labels.icon',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#616161',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   elementType: 'labels.text.stroke',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#f5f5f5',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'administrative',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'administrative.land_parcel',\r\n  //   elementType: 'labels',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'administrative.land_parcel',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#bdbdbd',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'poi',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'poi',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#eeeeee',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'poi',\r\n  //   elementType: 'labels.text',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'poi',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#757575',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'poi.park',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#e5e5e5',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'poi.park',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#9e9e9e',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#ffffff',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road',\r\n  //   elementType: 'labels.icon',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.arterial',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.arterial',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#757575',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.highway',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#dadada',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.highway',\r\n  //   elementType: 'labels',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.highway',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#616161',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.local',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.local',\r\n  //   elementType: 'labels',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'road.local',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#9e9e9e',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'transit',\r\n  //   stylers: [\r\n  //     {\r\n  //       visibility: 'off',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'transit.line',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#e5e5e5',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'transit.station',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#eeeeee',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'water',\r\n  //   elementType: 'geometry',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#c9c9c9',\r\n  //     },\r\n  //   ],\r\n  // },\r\n  // {\r\n  //   featureType: 'water',\r\n  //   elementType: 'labels.text.fill',\r\n  //   stylers: [\r\n  //     {\r\n  //       color: '#9e9e9e',\r\n  //     },\r\n  //   ],\r\n  // },\r\n];\r\n","import makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport React, { FC, useRef } from 'react';\r\nimport { InfoBox } from '@react-google-maps/api';\r\nimport { IMapLocation } from '../../models';\r\nimport { IconButton } from '@mui/material';\r\nimport { HighlightOff } from '@mui/icons-material';\r\n\r\ninterface ICustomInfoWindow {\r\n  onCloseClick: any;\r\n  location: IMapLocation;\r\n  lat: number;\r\n  lng: number;\r\n}\r\nconst getPixelPositionOffset = (width: number, height: number) => {\r\n  return {\r\n    x: width / (width / 2),\r\n    y: height + 50,\r\n  };\r\n};\r\n\r\nexport const CustomInfoWindow: FC<ICustomInfoWindow> = ({ onCloseClick, location, lat, lng }) => {\r\n  const classes = useStyles();\r\n  const position = { lat: lat, lng: lng };\r\n  const infoBox = useRef(null);\r\n  const options = {\r\n    closeBoxURL: '',\r\n    enableEventPropagation: true,\r\n    alignBottom: true,\r\n    pixelOffset: new google.maps.Size(30, 5),\r\n  };\r\n\r\n  return (\r\n    <div>\r\n      <InfoBox\r\n        ref={infoBox}\r\n        // @ts-ignore\r\n        position={position}\r\n        options={options}\r\n        onCloseClick={() => console.log('close')}\r\n        getPixelPositionOffset={getPixelPositionOffset}\r\n        pixelOffset={getPixelPositionOffset}\r\n      >\r\n        <>\r\n          <div className={classes.overlay}>\r\n            <h3 className={classes.title}>{location.name}</h3>\r\n            <p className={classes.address}>{location.street}</p>\r\n            <p\r\n              className={classes.address}\r\n            >{`${location.city}, ${location.state} ${location.zip}`}</p>\r\n            <h3>{`${location.shiftCount} available shifts`}</h3>\r\n          </div>\r\n          <IconButton\r\n            className={classes.removeButton}\r\n            onClick={() => {\r\n              onCloseClick();\r\n            }}\r\n          >\r\n            <HighlightOff />\r\n          </IconButton>\r\n        </>\r\n      </InfoBox>\r\n    </div>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  title: {\r\n    color: theme.palette.secondary.main,\r\n    marginTop: '1.25rem',\r\n\r\n    margin: '.75rem 0 .75rem 0',\r\n  },\r\n  address: {\r\n    color: '#848e9f',\r\n    margin: '0 0 0 0',\r\n  },\r\n  overlay: {\r\n    position: 'relative',\r\n    padding: '.5rem 1rem',\r\n    backgroundColor: '#fff',\r\n    maxWidth: 185,\r\n\r\n    boxShadow: '0px 3px 15px rgba(0,0,0,0.2)',\r\n    zIndex: -1,\r\n  },\r\n  removeButton: { position: 'absolute', top: 0, right: 0, padding: '0.1em' },\r\n}));\r\n","import { useState, useEffect } from \"react\";\r\n\r\nconst getHeight = () => window.innerHeight;\r\n\r\nexport const useCurrentHeight = () => {\r\n  // save current window height in the state object\r\n  let [height, setHeight] = useState(getHeight());\r\n\r\n  // in this case useEffect will execute only once because\r\n  // it does not have any dependencies.\r\n  useEffect(() => {\r\n    // timeoutId for debounce mechanism\r\n    let timeoutId: any  = null;\r\n    const resizeListener = () => {\r\n      // prevent execution of previous setTimeout\r\n      clearTimeout(timeoutId);\r\n      // change height from the state object after 150 milliseconds\r\n      timeoutId = setTimeout(() => setHeight(getHeight()), 150);\r\n    };\r\n    // set resize listener\r\n    window.addEventListener('resize', resizeListener);\r\n\r\n    // clean up function\r\n    return () => {\r\n      // remove resize listener\r\n      window.removeEventListener('resize', resizeListener);\r\n    }\r\n  }, [])\r\n\r\n  return height;\r\n};","import { LogLevel } from \"@azure/msal-browser\";\r\n\r\nconst {\r\n    REACT_APP_MSAL_CLIENT_ID,\r\n    REACT_APP_MSAL_TENANT_ID,\r\n    REACT_APP_MSAL_SCOPES,\r\n    REACT_APP_MSAL_REDIRECT,\r\n} = require('./buildSettings.json');\r\n\r\n\r\nexport const msalConfig = {\r\n    auth: {\r\n        clientId: REACT_APP_MSAL_CLIENT_ID,\r\n        authority: `https://login.windows.net/${REACT_APP_MSAL_TENANT_ID}`,\r\n        redirectUri: REACT_APP_MSAL_REDIRECT,\r\n        postLogoutRedirectUri: REACT_APP_MSAL_REDIRECT\r\n    },\r\n    cache: {\r\n        cacheLocation: \"sessionStorage\", // This configures where your cache will be stored\r\n        storeAuthStateInCookie: false, // Set this to \"true\" if you are having issues on IE11 or Edge\r\n    },\r\n    system: {\r\n        loggerOptions: {\r\n            loggerCallback: (level: any, message: any, containsPii: any) => {\r\n                if (containsPii) {\r\n                    return;\r\n                }\r\n                switch (level) {\r\n                    case LogLevel.Error:\r\n                        console.error(message);\r\n                        return;\r\n                    case LogLevel.Info:\r\n                        console.info(message);\r\n                        return;\r\n                    case LogLevel.Verbose:\r\n                        console.debug(message);\r\n                        return;\r\n                    case LogLevel.Warning:\r\n                        console.warn(message);\r\n                        return;\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n// Coordinates and required scopes for your web API\r\nexport const apiConfig = {\r\n    resourceUri: \"https://localhost:44351/api/profile\",\r\n    resourceScopes: [REACT_APP_MSAL_SCOPES]\r\n}\r\n\r\n// Add scopes here for ID token to be used at Microsoft identity platform endpoints.\r\nexport const loginRequest = {\r\n    scopes: [\"User.Read\"]\r\n};\r\n\r\n// Add the endpoints here for Microsoft Graph API services you'd like to use.\r\nexport const graphConfig = {\r\n    graphMeEndpoint: \"https://graph.microsoft.com\"\r\n};\r\n\r\n// Add here scopes for access token to be used at the API endpoints.\r\nexport const tokenRequest = {\r\n    scopes: [...apiConfig.resourceScopes]\r\n}","import { ApplicationInsights, ITelemetryItem } from '@microsoft/applicationinsights-web';\r\nimport { ReactPlugin } from '@microsoft/applicationinsights-react-js';\r\nimport { createBrowserHistory } from 'history';\r\n\r\nconst { APPLICATIONINSIGHTS_CONNECTION_STRING } = require('./buildSettings.json');\r\n\r\nconst browserHistory = createBrowserHistory({ basename: '' });\r\n\r\nconst reactPlugin = new ReactPlugin();\r\n\r\nconst appInsights = new ApplicationInsights({\r\n  config: {\r\n    connectionString: APPLICATIONINSIGHTS_CONNECTION_STRING,\r\n    extensions: [reactPlugin],\r\n    extensionConfig: {\r\n      [reactPlugin.identifier]: { history: browserHistory },\r\n    },\r\n  },\r\n});\r\nappInsights?.loadAppInsights();\r\nappInsights.addTelemetryInitializer((env: ITelemetryItem) => {\r\n  env.tags = env.tags || [];\r\n});\r\n\r\nexport { reactPlugin, appInsights };\r\n","import { AppBar, Grid, Tab, Tabs, useMediaQuery } from '@mui/material';\r\nimport { FC, useState, useEffect, useContext } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { IDVM } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Prompt, Redirect, useParams } from 'react-router-dom';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { getDvm } from '../../fetch/dvms';\r\nimport { UserContext } from '../../context';\r\nimport { DvmProfile } from './dvm-profile';\r\nimport { DvmSchedule } from './dvm-schedule';\r\nimport { AccountBox, Schedule } from '@mui/icons-material';\r\nimport DateRangeIcon from '@mui/icons-material/DateRange';\r\nimport HistoryIcon from '@mui/icons-material/History';\r\nimport { DvmPendingRequests } from './dvm-requests';\r\nimport { DvmRequestHistory } from './dvm-request-history';\r\n\r\nenum DVMTabs {\r\n  Profile,\r\n  Schedule,\r\n  Requests,\r\n  History,\r\n}\r\n\r\nexport const DvmDetails: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(true);\r\n  const [dvm, setDvm] = useState<IDVM | null>(null);\r\n\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const { dvmId }: { dvmId: string } = useParams();\r\n  const { user, isDVM } = useContext(UserContext);\r\n  const isEdit = true;\r\n  const [selectedTab, setSelectedTab] = useState<DVMTabs>(DVMTabs.Profile);\r\n  const [isProfilePageDirty, setIsProfilePageDirty] = useState(false);\r\n\r\n  const dvmIsContractor = dvm?.type === 1;\r\n\r\n  const classes = useStyles();\r\n\r\n  const fetchDvm = async (id: number) => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getDvm(id);\r\n      setDvm(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVM, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const getDVM = async () => {\r\n    if (!dvmId && user?.validation?.value?.dvmInformation?.dvmId) {\r\n      await fetchDvm(parseInt(user?.validation?.value?.dvmInformation?.dvmId));\r\n    }\r\n\r\n    if (dvmId && isEdit) {\r\n      await fetchDvm(parseInt(dvmId));\r\n    }\r\n  };\r\n  useEffect(() => {\r\n    getDVM();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const warningMessage = 'You have unsaved changes, are you sure you want to continue?';\r\n  // Handles a tab change if the form state is dirty\r\n  const handleTabChangeWithoutSave = (value: number) => {\r\n    if (isProfilePageDirty) {\r\n      const result = window.confirm(warningMessage);\r\n      if (result) {\r\n        setSelectedTab(value);\r\n        if (DVMTabs.Profile !== value) setIsProfilePageDirty(false);\r\n      } else {\r\n        return;\r\n      }\r\n    } else {\r\n      setSelectedTab(value);\r\n      if (DVMTabs.Profile !== value) setIsProfilePageDirty(false);\r\n    }\r\n  };\r\n\r\n  // They are a DVM but don't have their data setup correctly, or are trying to URL hack\r\n  if ((isDVM && !dvmId && !user?.validation?.value?.dvmInformation?.dvmId) || (isDVM && dvmId)) {\r\n    return <Redirect to={`not-found`} />;\r\n  }\r\n\r\n  if (isLoading) {\r\n    return <Loader position=\"centered\" type=\"fullscreen\" />;\r\n  }\r\n\r\n  return (\r\n    <Page\r\n      paddingBottom={24}\r\n      title={isEdit ? `${dvm?.firstName ?? ''} ${dvm?.lastName ?? ''}` : 'Add New DVMs'}\r\n    >\r\n      {/* Handles navigating away from the page */}\r\n      <Prompt when={isProfilePageDirty} message={_ => warningMessage} />\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12} className={classes.tabBar}>\r\n          <AppBar\r\n            classes={{ root: classes.tabBarRoot }}\r\n            position=\"static\"\r\n            color=\"default\"\r\n            component=\"div\"\r\n          >\r\n            <Tabs\r\n              value={selectedTab}\r\n              indicatorColor=\"primary\"\r\n              textColor=\"primary\"\r\n              onChange={(_, value) => {\r\n                handleTabChangeWithoutSave(value);\r\n              }}\r\n              variant={isMobile ? 'scrollable' : 'standard'}\r\n            >\r\n              <Tab\r\n                icon={<AccountBox />}\r\n                iconPosition={isMobile ? 'top' : 'start'}\r\n                className={classes.profileTabs}\r\n                id=\"profile\"\r\n                aria-controls=\"profile\"\r\n                label={'Profile'}\r\n              />\r\n              <Tab\r\n                icon={<DateRangeIcon />}\r\n                iconPosition={isMobile ? 'top' : 'start'}\r\n                className={classes.profileTabs}\r\n                id=\"schedule\"\r\n                aria-controls=\"schedule\"\r\n                label={'Schedule'}\r\n              />\r\n              {dvmIsContractor && [\r\n                <Tab\r\n                  icon={<Schedule />}\r\n                  iconPosition={isMobile ? 'top' : 'start'}\r\n                  className={classes.profileTabs}\r\n                  id=\"requests\"\r\n                  aria-controls=\"requests\"\r\n                  label={'Requests'}\r\n                  key={'request'}\r\n                />,\r\n                <Tab\r\n                  icon={<HistoryIcon />}\r\n                  iconPosition={isMobile ? 'top' : 'start'}\r\n                  className={classes.profileTabs}\r\n                  id=\"history\"\r\n                  aria-controls=\"history\"\r\n                  label={'History'}\r\n                  key={'history'}\r\n                />,\r\n              ]}\r\n            </Tabs>\r\n          </AppBar>\r\n        </Grid>\r\n\r\n        {selectedTab === DVMTabs.Profile && dvm && (\r\n          <Grid item xs={12}>\r\n            <DvmProfile\r\n              dvm={dvm}\r\n              isLoading={isLoading}\r\n              getDVM={getDVM}\r\n              setIsDirty={setIsProfilePageDirty}\r\n            />\r\n          </Grid>\r\n        )}\r\n        {selectedTab === DVMTabs.Schedule && (\r\n          <Grid item xs={12}>\r\n            <DvmSchedule dvm={dvm} isContractor={dvmIsContractor} />\r\n          </Grid>\r\n        )}\r\n        {selectedTab === DVMTabs.Requests && (\r\n          <Grid item xs={12}>\r\n            <DvmPendingRequests dvm={dvm} />\r\n          </Grid>\r\n        )}\r\n        {selectedTab === DVMTabs.History && (\r\n          <Grid item xs={12}>\r\n            <DvmRequestHistory dvm={dvm} />\r\n          </Grid>\r\n        )}\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  tabBar: {\r\n    position: 'sticky',\r\n    top: 0,\r\n    zIndex: 2,\r\n    width: '100vw',\r\n    marginLeft: '-24px',\r\n    paddingTop: '0!important',\r\n  },\r\n  tabBarRoot: {\r\n    width: '100vw',\r\n  },\r\n  profileTabs: {\r\n    fontSize: 14,\r\n    borderRadius: 0,\r\n  },\r\n}));\r\n","import { appInsights } from '../appInsightsConfig';\r\nimport { SeverityLevel } from '@microsoft/applicationinsights-common';\r\n\r\nconst config = require('../buildSettings.json');\r\nlet localEnv = 'Local';\r\n\r\nexport const logInfo = (details: any, message: string) => {\r\n  let obj = {\r\n    message: message,\r\n    severityLevel: SeverityLevel.Information,\r\n  };\r\n\r\n  if (config.APPLICATIONINSIGHTS_ENVIRONMENT === localEnv) {\r\n    console.log(details);\r\n    return;\r\n  }\r\n\r\n  if (appInsights) {\r\n    appInsights.trackTrace(obj);\r\n  }\r\n};\r\n\r\nexport const logWarning = (details: any, message: string) => {\r\n  let obj = {\r\n    message: message,\r\n    severityLevel: SeverityLevel.Warning,\r\n  };\r\n\r\n  if (config.APPLICATIONINSIGHTS_ENVIRONMENT === localEnv) {\r\n    console.log(details);\r\n    return;\r\n  }\r\n\r\n  if (appInsights) {\r\n    appInsights.trackTrace(obj);\r\n  }\r\n};\r\n\r\nexport const logError = (error: any, message: string) => {\r\n  let obj = {\r\n    message: error,\r\n    severityLevel: SeverityLevel.Error,\r\n  };\r\n\r\n  if (config.APPLICATIONINSIGHTS_ENVIRONMENT === localEnv) {\r\n    console.log(error);\r\n    return;\r\n  }\r\n\r\n  if (appInsights) {\r\n    appInsights.trackException(obj);\r\n  }\r\n};\r\n","import Axios, { Method } from 'axios';\r\n\r\nimport { logError, logInfo } from '../services';\r\nlet buildConfig = require('../buildSettings');\r\n// uncomment for hitting staging\r\n// let buildConfig = require('../buildSettings.stage.json');\r\n\r\nconst axiosInstance = Axios.create({\r\n  baseURL: `${buildConfig.REACT_APP_API_URL}/api/`,\r\n});\r\n\r\nconst axiosRequest = async (\r\n  method: Method,\r\n  url: string,\r\n  data: object | null,\r\n  options: object,\r\n  params?: any\r\n) => {\r\n  logInfo(null, `axios.js request started: ${url}`);\r\n  try {\r\n    return await axiosInstance({\r\n      method,\r\n      url,\r\n      ...(data ? { data } : {}),\r\n      ...options,\r\n      params,\r\n    });\r\n  } catch (err) {\r\n    logError(err, 'axios.js request failed');\r\n    return Promise.reject(err);\r\n  }\r\n};\r\n\r\n// eslint-disable-next-line import/no-anonymous-default-export\r\nexport default {\r\n  get: async (url: string, params?: {}, options = {}) => {\r\n    return axiosRequest('get', url, null, options, params);\r\n  },\r\n  post: async (url: string, data = {}, options = {}) => {\r\n    return axiosRequest('post', url, data, { ...options });\r\n  },\r\n  put: async (url: string, data = {}, options = {}) => {\r\n    return axiosRequest('put', url, data, { ...options });\r\n  },\r\n  delete: async (url: string, options = {}) => {\r\n    return axiosRequest('delete', url, null, { ...options });\r\n  },\r\n};\r\n","import * as localForage from 'localforage';\r\n\r\n/**\r\n * Sets an item in local storage. NOTE: Only for use within the browser.\r\n * @param key string\r\n * @param value any\r\n * @returns boolean\r\n */\r\nexport const setLocalStorage = async (key: string, value: any): Promise<boolean> => {\r\n    try {\r\n        const item = JSON.stringify(value);\r\n        await localForage.setItem(key, item);\r\n        return true;\r\n    } catch (error) {\r\n        console.error('setLocalStorage', error);\r\n        return false;\r\n    }\r\n};\r\n\r\n/**\r\n * Gets an item from local storage. NOTE: Only for use within the browser.\r\n * @param key string\r\n * @returns any\r\n */\r\nexport const getLocalStorage = async (key: string): Promise<any | undefined> => {\r\n    try {\r\n        const item: any = await localForage.getItem(key);\r\n        if (item) {\r\n            const parsed = JSON.parse(item);\r\n            return parsed;\r\n        } else {\r\n            return undefined;\r\n        }\r\n    } catch (error) {\r\n        console.error('getLocalStorage', error);\r\n        return undefined;\r\n    }\r\n};\r\n\r\n/**\r\n * Removes an item from local storage. NOTE: Only for use within the browser.\r\n * @param key string\r\n * @returns boolean\r\n */\r\nexport const removeLocalStorage = async (key: string): Promise<boolean> => {\r\n    try {\r\n        await localForage.removeItem(key);\r\n        return true;\r\n    } catch (error) {\r\n        console.error('removeLocalStorage', error);\r\n        return false;\r\n    }\r\n};\r\n","import { getLocalStorage } from './local-storage';\r\n\r\nexport const token_key: string = 'token--user';\r\n\r\nexport const getToken = async (key: string) => {\r\n  return await getLocalStorage(key);\r\n};\r\n","import { differenceInSeconds, format, parseISO } from 'date-fns';\r\n\r\nexport const phoneRegExp = /1?\\W*([2-9][0-8][0-9])\\W*([2-9][0-9]{2})\\W*([0-9]{4})(\\se?x?t?(\\d*))?/;\r\nexport const passwordRegex = new RegExp(\r\n  /^(?=.*[A-Z])(?=.*[A-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?])\\S{10,20}$/\r\n);\r\n\r\nexport const formatInputPhoneNumber = (val: string | undefined) => {\r\n  let number = val?.replace(/\\D/g, '').match(/(\\d{0,3})(\\d{0,3})(\\d{0,4})/);\r\n  // taken from here, https://stackoverflow.com/questions/17651207/mask-us-phone-number-string-with-javascript\r\n  return (\r\n    number &&\r\n    (!number[2] ? number[1] : `(${number[1]}) ${number[2]}${number[3] ? `-${number[3]}` : ''}`)\r\n  );\r\n};\r\n\r\n/**\r\n * Formats a string or number into USD\r\n * @example formatMoney(1) => $1.00\r\n * @example formatMoney(0) => $0.00\r\n * @example formatMoney('1.99') => $1.99\r\n * @example formatMoney('9999.99') => $9,999.99\r\n * @example formatMoney(undefined) => $0.00\r\n * @example formatMoney(null) => $0.00\r\n * @param value number | string | undefined | null\r\n * @param digits number | undefined\r\n * @returns string\r\n */\r\nexport const formatMoney = (value: number | string | undefined | null, digits = 2): string => {\r\n  let amount = 0;\r\n\r\n  if (value) {\r\n    if (typeof value === 'string') {\r\n      // strip out any commas or dollar signs so that $9,999.99 passes !isNaN test\r\n      value =\r\n        value.includes(',') || value.includes('$')\r\n          ? value.replace(',', '').replace('$', '')\r\n          : value;\r\n      // make sure the string is a number\r\n      if (!isNaN(value as unknown as number)) {\r\n        amount = Number(value);\r\n      }\r\n    } else if (typeof value === 'number' && value > 0) {\r\n      amount = value;\r\n    }\r\n  }\r\n\r\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\r\n  return new Intl.NumberFormat('en-US', {\r\n    maximumFractionDigits: digits,\r\n    minimumFractionDigits: digits,\r\n    style: 'currency',\r\n    currency: 'USD',\r\n  }).format(amount);\r\n};\r\n\r\n/**\r\n * Format date string to Date\r\n * @example \"2020-06-09T00:00:00+00:00\" => Tue Jun 09 2020 00:00:00 GMT-0400\r\n * @param date string\r\n * @returns Date\r\n */\r\nexport const stringToDate = (date: string): Date => {\r\n  const d = date.split('T')[0].split('-');\r\n  // Months are 0 index so subtract 1\r\n  return new Date(+d[0], +d[1] - 1, +d[2]);\r\n};\r\n\r\n/**\r\n * Format date\r\n * @example 1/6/2020\r\n * @example 12/12/2020\r\n * @param date Date | number | string\r\n * @returns string\r\n */\r\nexport const formatDate = (date: Date | number | string | null): string | null => {\r\n  if (date) {\r\n    const stringDate: Date | number = typeof date === 'string' ? stringToDate(date) : date;\r\n    return format(stringDate, 'L/d/yy');\r\n  }\r\n  return null;\r\n};\r\n\r\n/**\r\n * Format date\r\n * @example 1/6/2020\r\n * @example 12/12/2020\r\n * @param date Date | number | string\r\n * @returns string\r\n */\r\nexport const formatDateWithDay = (date: Date | number | string | null): string | null => {\r\n  if (date) {\r\n    const stringDate: Date | number = typeof date === 'string' ? stringToDate(date) : date;\r\n    return format(stringDate, 'L/d/yy eee');\r\n  }\r\n  return null;\r\n};\r\n\r\n/**\r\n * Format date into a short friendly date with time\r\n * @example 1/6/2020 2:00pm\r\n * @example 12/12/2020 12:00am\r\n * @param date Date | number | string\r\n * @returns string\r\n */\r\nexport const formatShortFriendlyDateWithTime = (date: Date | number | string): string | null => {\r\n  if (date) {\r\n    const parsedDate: Date | number = typeof date === 'string' ? parseISO(date) : date;\r\n    return format(parsedDate, 'L/d/yy h:mm a');\r\n  }\r\n  return null;\r\n};\r\n\r\nexport const formatUtcToLocalShortFriendlyDateWithTime = (date: Date | number | string): string | null => {\r\n  if (date) {\r\n  const updatedDate = new Date(date + 'Z');\r\n  return updatedDate.toLocaleString();\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Format date into a short friendly date with time and seconds\r\n * @example 1/6/2020 2:00:00pm\r\n * @example 12/12/2020 12:00:00AM\r\n * @param date Date | number | string\r\n * @returns string\r\n */\r\nexport const formatDateWithTimeAndSeconds = (date: Date | number | string): string | null => {\r\n  if (date) {\r\n    const parsedDate: Date | number = typeof date === 'string' ? parseISO(date) : date;\r\n    return format(parsedDate, 'L/d/yy h:mm:ssa');\r\n  }\r\n  return null;\r\n};\r\n\r\n/**\r\n * return the difference in seconds between two date objects\r\n * @param date Date | number | string\r\n * @returns string\r\n */\r\nexport const getDifferenceBetweenTwoDatesInSeconds = (\r\n  date1: Date | number | string,\r\n  date2: Date | number | string\r\n): number | null => {\r\n  if (date1 && date2) {\r\n    const parsedDate1: Date | number = typeof date1 === 'string' ? parseISO(date1) : date1;\r\n    const parsedDate2: Date | number = typeof date2 === 'string' ? parseISO(date2) : date2;\r\n    return differenceInSeconds(parsedDate2, parsedDate1);\r\n  }\r\n  return null;\r\n};\r\n\r\nexport const convertMilitaryToStandard = (time: string): string => {\r\n    const date = new Date(`1970-01-01T${time}`);\r\n    return date.toLocaleTimeString('en-US', {\r\n        hour: 'numeric',\r\n        minute: 'numeric',\r\n        hour12: true\r\n    });\r\n}\r\n\r\nexport const formatArrayParams = (data: string[], key: string) => {\r\n  return `${data.map((id, index) => `${index !== 0 ? '&' : ''}${key}=${id}`).join('')}`;\r\n};\r\n\r\n/** @example `Shopping cart contains ${items.length} item${s(items.length)}.` */\r\nexport const checkArrayLengthReturnS = (arr: unknown[]): string => (arr.length > 1 ? 's' : '');\r\n\r\nexport const groupByKey = (array: any[], key: string) => {\r\n  return array.reduce((hash, obj) => {\r\n    if (obj[key] === undefined) return hash;\r\n    return Object.assign(hash, { [obj[key]]: (hash[obj[key]] || []).concat(obj) });\r\n  }, {});\r\n};\r\n\r\nexport const formatPascalStringToSpaces = (data: string) => {\r\n  const regx = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g;\r\n  return data.replace(regx, '$1$4 $2$3$5');\r\n};\r\n\r\nexport const DECIMAL_REGEX = /^\\d*(\\.)?(\\d{0,4})?$/;\r\n\r\nexport const unescape = (string: string) => {\r\n  return new DOMParser()?.parseFromString(string, 'text/html')?.querySelector('html')?.textContent;\r\n};\r\n\r\n// Calling val.toFixed(2) drops decimals down and creates a string\r\n// representation of the number. If we then parse out the string into a float\r\n// and call .toString() on that we can remove any 0s padded on at the end. I.e.\r\n// '16.00` becomes '16'. Take that final string value and parse it back to a\r\n// float and return.\r\nexport const trimDecimals = (val: number, decimals = 2): number =>\r\n  parseFloat(parseFloat(val.toFixed(decimals)).toString());\r\n\r\n// format percent and ensure at least 1 decimal place even if it is .0%\r\nexport const formatPercent = (val: number): string => {\r\n  let percent = `${trimDecimals(parseFloat((val * 100).toString()))}`;\r\n  if (percent.indexOf('.') === -1) {\r\n    return `${percent}.0%`;\r\n  }\r\n  return `${percent}%`;\r\n};\r\n\r\nexport const formatWholeNumberPercent = (val: number): string => {\r\n  let percent = `${trimDecimals(parseFloat((val * 100).toString()))}`;\r\n  return `${percent}%`;\r\n};\r\n\r\nexport const dateFormatter = (val: string | number | null | undefined) => {\r\n  if (val === null || val === undefined) {\r\n    return val;\r\n  }\r\n\r\n  // allow for shortcuts\r\n  const today = new Date();\r\n  const newVal = new Date();\r\n\r\n  if (!isNaN(val as number)) {\r\n    // convert dates like 0428 to 04/28/YYYY\r\n    if (val.toString().length === 4) {\r\n      const month = val.toString().slice(0, 2);\r\n      const day = val.toString().slice(2, 4);\r\n      val = `${month}/${day}/${today.getFullYear()}`;\r\n    } else {\r\n      val = newVal.setDate(today.getDate() + Number(val));\r\n    }\r\n  } else if ((val as string).split('/').length === 2) {\r\n    // apply a year since we can assume it wasn't provided\r\n    today.getFullYear();\r\n    val = new Date(val).setFullYear(today.getFullYear());\r\n  }\r\n\r\n  return format(new Date(val), 'MM/dd/yyyy');\r\n};\r\n\r\n// Gets the localized date, without time\r\nexport const getLocalDate = (date: string) => format(new Date(date), 'P');\r\n\r\n// Gets the localized date and time\r\nexport const getLocalDateTime = (dateTime: string) => format(new Date(dateTime), 'Pp');\r\n","export const downloadFile = (blob: any, fileName: string) => {\r\n  const url = URL.createObjectURL(new Blob(blob));\r\n  const a = document.createElement('a');\r\n  a.href = url;\r\n  a.download = fileName;\r\n  a.click();\r\n  a.remove();\r\n};\r\n","/**\r\n *\r\n * @param path string the key of the object you are trying to resolve the value of\r\n * @param obj the object that gets passed in to check against\r\n * @returns the value of the object at the given path, i.e. path='test.test.value' obj={{ test: { test: { value: 'TEST' } }  }}\r\n */\r\nexport const resolveObjectField = (path: string, obj: any) => {\r\n  return path.split('.').reduce((prev, curr) => {\r\n    return prev ? prev[curr] : null;\r\n  }, obj);\r\n};\r\n\r\nexport const truncate = (input: string, max: number, append?: JSX.Element) => {\r\n  if (input.length > max) {\r\n    return (\r\n      <>\r\n        {`${input.substring(0, max)}...`}\r\n        {append}\r\n      </>\r\n    );\r\n  }\r\n  return input;\r\n};\r\n","export const handleError = (res: any) => {\r\n  if (res && res.Detail) {\r\n    return res.Detail;\r\n  } else if (\r\n    res &&\r\n    res.Errors &&\r\n    Object.values(res.Errors)[0] &&\r\n    Object.values(Object.values(res.Errors)[0] as any)[0]\r\n  ) {\r\n    return `Error, ${Object.values(Object.values(res.Errors)[0] as any)[0]}`;\r\n  } else return 'Something went wrong.';\r\n};\r\n","import { tokenRequest } from './../authConfig';\r\nimport { InteractionRequiredAuthError, PublicClientApplication, SilentRequest } from '@azure/msal-browser';\r\nimport { msalConfig } from '../authConfig';\r\n\r\nimport { axios } from '../helpers';\r\n\r\nconst acquireAccessToken = async (msalInstance: PublicClientApplication) => {\r\n  // This may have been set somewhere, so we need to check\r\n  const activeAccount = msalInstance.getActiveAccount(); // This will only return a non-null value if you have logic somewhere else that calls the setActiveAccount API\r\n  const accounts = msalInstance.getAllAccounts();\r\n\r\n  const request:SilentRequest = {\r\n    scopes: tokenRequest.scopes,\r\n    account: activeAccount || accounts[0],\r\n    resourceRequestUri: msalConfig.auth.clientId,\r\n\r\n  };\r\n\r\n  try {\r\n    const res = await msalInstance.acquireTokenSilent(request)\r\n    return res.accessToken;\r\n  } catch(error) {\r\n    if (error instanceof InteractionRequiredAuthError) {\r\n      try {\r\n        const res = await msalInstance.acquireTokenPopup(request);\r\n        return res.accessToken;\r\n      } catch (error) {\r\n        msalInstance.logoutRedirect()\r\n      }\r\n    }\r\n    else {\r\n      msalInstance.logoutRedirect()\r\n    }\r\n  }\r\n};\r\nconst msalInstance = new PublicClientApplication(msalConfig);\r\n\r\n// keep axios syntax for simplicity\r\nexport const authFetch = {\r\n  get: async (url: string, params?: any, options?: any) => {\r\n    const accessToken = await acquireAccessToken(msalInstance);\r\n\r\n    return await axios.get(url, params, {\r\n      ...options,\r\n      headers: {\r\n        Authorization: `Bearer ${accessToken}`,\r\n      },\r\n    });\r\n  },\r\n  put: async (url: string, data: any, options?: any) => {\r\n    const accessToken = await acquireAccessToken(msalInstance);\r\n\r\n    const routeOptions = {\r\n      ...options,\r\n      ...{\r\n        headers: {\r\n          Authorization: `Bearer ${accessToken}`,\r\n        },\r\n      },\r\n    };\r\n    return await axios.put(url, data, routeOptions);\r\n  },\r\n  post: async (url: string, data: any, options?: any) => {\r\n    const accessToken = await acquireAccessToken(msalInstance);\r\n\r\n    const routeOptions = {\r\n      ...options,\r\n      ...{\r\n        headers: {\r\n          Authorization: `Bearer ${accessToken}`,\r\n        },\r\n      },\r\n    };\r\n\r\n    return await axios.post(url, data, routeOptions);\r\n  },\r\n  delete: async (url: string) => {\r\n    const accessToken = await acquireAccessToken(msalInstance);\r\n\r\n    return await axios.delete(url, {\r\n      headers: {\r\n        Authorization: `Bearer ${accessToken}`,\r\n      },\r\n    });\r\n  },\r\n  /**\r\n   * The null return path should redirect the user to the login page of the app\r\n   * so I think it's safe to assume that this will always give you a result when it\r\n   * matters. If they're sent to the login screen we don't care what they were doing really.\r\n   * @returns Promise<AuthenticationResult | null>\r\n   */\r\n  forceRefresh: async () => {\r\n    // This may have been set somewhere, so we need to check\r\n    const activeAccount = msalInstance.getActiveAccount(); // This will only return a non-null value if you have logic somewhere else that calls the setActiveAccount API\r\n    const accounts = msalInstance.getAllAccounts();\r\n\r\n    const request: SilentRequest = {\r\n      scopes: tokenRequest.scopes,\r\n      account: activeAccount || accounts[0],\r\n      forceRefresh: true,\r\n      resourceRequestUri: msalConfig.auth.clientId\r\n    };\r\n\r\n    return await msalInstance.acquireTokenSilent(request)\r\n      .then(response => { return response })\r\n      .catch(async error => {\r\n        if (error instanceof InteractionRequiredAuthError) {\r\n          return await msalInstance.acquireTokenPopup(request);\r\n        }\r\n        else {\r\n          msalInstance.logoutRedirect();\r\n          return null;\r\n        }\r\n      });\r\n  }\r\n};\r\n","import { authFetch } from './fetch';\r\nimport {\r\n  DVMPeekInfo,\r\n  IDVM,\r\n  IDVMTable,\r\n  IDVMUpdateContainer,\r\n  IUpcomingShift,\r\n  IPendingShiftRequest,\r\n  IShiftRequestHistory,\r\n} from '../models/dvms';\r\nimport { IDropdownResponse, IResponse } from '../models/util';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/dvms';\r\n\r\nexport const getDvms = async (filters?: {\r\n  DVMName?: string;\r\n  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;\r\n  city?: string;\r\n  state?: string;\r\n  dvmType?: string;\r\n  DVMStatuses?: string[];\r\n}): Promise<IResponse<IDVMTable[]>> => {\r\n  try {\r\n    const activeFilters = filters || {};\r\n\r\n    const queryParams = new URLSearchParams();\r\n    Object.keys(activeFilters).forEach(key => {\r\n      const value = activeFilters[key as keyof typeof activeFilters];\r\n      if (Array.isArray(value)) {\r\n        if (value.length > 0) {\r\n          // For array fields with items, add each value under the same key\r\n          value.forEach(item => queryParams.append(key, item));\r\n        } else if (key.toLowerCase() === 'dvmstatuses') {\r\n          // If DVMStatuses is empty, still add it to the query string with no value\r\n          queryParams.append(key, '');\r\n        }\r\n      } else if (value !== undefined) {\r\n        // For non-array fields, just set the parameter\r\n        queryParams.set(key, value.toString());\r\n      }\r\n    });\r\n\r\n    const { data } = await authFetch.get(`${baseUrl}?${queryParams.toString()}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvms failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvm = async (dvmId: number): Promise<IDVM> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${dvmId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvm failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateDvm = async (dvm: IDVMUpdateContainer): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}`, dvm);\r\n    return data;\r\n  } catch (error) {\r\n    logError({ error, payload: dvm }, 'updateDvm failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateLimitedDvm = async (dvm: IDVMUpdateContainer): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}/limited`, dvm);\r\n    return data;\r\n  } catch (error) {\r\n    logError({ error, payload: dvm }, 'updateLimitedDvm failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const deleteDvm = async (dvmId: number): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.delete(`${baseUrl}/${dvmId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteDvm failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmStatuses = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/DVMStatuses`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmStatuses failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmTypes = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/DVMTypes`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmTypes failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmRequestsAndShifts = async (\r\n  dvmId: number,\r\n  mondayDate: string\r\n): Promise<DVMPeekInfo> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${dvmId}/RequestsAndShifts`, {\r\n      MondayDate: mondayDate,\r\n    });\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmRequestAndShifts failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmUpcomingShifts = async (dvmId: number): Promise<IUpcomingShift[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${dvmId}/UpcomingShiftsForDVM`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmUpcomingShifts failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmPendingShiftRequests = async (\r\n  dvmId: number\r\n): Promise<IPendingShiftRequest[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${dvmId}/PendingShiftRequests`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmPendingShiftRequests failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmShiftRequestHistory = async (\r\n  dvmId: number,\r\n  filters: {\r\n    dateFrom: string;\r\n    dateTo: string;\r\n  }\r\n): Promise<IShiftRequestHistory[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${dvmId}/ShiftRequestHistory`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmShiftRequestHistory failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createDvm = async (info: {\r\n  firstName: string;\r\n  lastName: string;\r\n  email: string;\r\n}): Promise<number> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}`, info);\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({error}, 'createDvm failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const cancelDvmShift = async (\r\n  shiftId: number,\r\n  dvmId: number,\r\n  reason: string\r\n): Promise<number> => {\r\n  try {\r\n    const { data } = await authFetch.put(`${baseUrl}/DVMCancelShift`, {shiftId, dvmId, reason});\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({ error, payload: {shiftId, dvmId, reason} }, 'cancelDvmShift failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getScheduledShiftCount = async (dvmId: number): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${dvmId}/DVMDeactivationConfirmation`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getScheduledShiftCount failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const verifyPendingEmail = async (dvmId: string, newEmail: string,  confirmationCode: string ): Promise<void> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}/${dvmId}/verify-email`, { newEmail, confirmationCode});\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'verifyPendingEmail failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\n\r\nexport const startEmailChange = async (dvmId: string, newEmail: string, ): Promise<void> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}/${dvmId}/start-email-change`, { newEmail, dvmId});\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'startEmailChange failed');\r\n    return Promise.reject(error);\r\n  }\r\n};","import { IDropdownResponse, IDVMDropdown, ILocationDropdown } from './../models/util';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/lookup';\r\n\r\nexport const getMarkets = async (filters?: {\r\n  excludeMarketsWithoutLocations: boolean;\r\n}): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/Markets`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getMarkets failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmStatuses = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/DVMStatuses`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmStatuses failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmTypes = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/DVMTypes`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmTypes failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDvmSchools = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetDVMSchools`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDvmSchools failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getLocationLookup = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetLocations`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLocationLookup failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getLocationsForSchedulingLookup = async (locationType?: number): Promise<ILocationDropdown[]> => {\r\n  try {\r\n    const params = locationType ? { LocationType: locationType } : {};\r\n    const { data } = await authFetch.get(`${baseUrl}/GetLocationsForScheduling`, params);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLocationsForSchedulingLookup failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDVMsLookup = async (filters?: {\r\n  locationId?: string | undefined;\r\n  showAllDvms: boolean;\r\n}): Promise<IDVMDropdown[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetDVMs`, filters);\r\n\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDVMsLookup failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDVMContractors = async (filters: {\r\n  locationId: number | string | undefined;\r\n  shiftDate: string;\r\n}): Promise<IDVMDropdown[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetDVMContractors`, filters);\r\n\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDVMContractors failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getCancelationReasons = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/CancelationReasons`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getCancelationReasons failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getStates = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/States`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getStates failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getLegalEntities = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/LegalEntities`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLegalEntities failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getW2DVMs = async (): Promise<IDVMDropdown[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetW2DVMs`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getW2DVMs failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getTaxTypes = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/TaxTypes`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getTaxTypes failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getLocationTypes = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/LocationTypes`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLocationTypes failed');\r\n    return Promise.reject(error);\r\n  }\r\n};","import { Camera } from '@mui/icons-material';\r\nimport { Box, Button, Grid } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { FC } from 'react';\r\n\r\ninterface IMultiImageUpload {\r\n  handleFileChange: (val: any[], file?: File[]) => void;\r\n  files: string[];\r\n  disabled?: boolean;\r\n  isRequired?: boolean;\r\n  showSource?: boolean;\r\n  handleUploadClick?: () => void;\r\n  multi?: boolean;\r\n  imageKey?: string;\r\n  fileName?: string;\r\n}\r\n\r\nexport const MultiFileUpload: FC<IMultiImageUpload> = ({\r\n  handleUploadClick,\r\n  handleFileChange,\r\n  files,\r\n  disabled = false,\r\n  isRequired = false,\r\n  showSource = true,\r\n  multi = true,\r\n  imageKey,\r\n  fileName,\r\n}) => {\r\n  const classes = useStyles();\r\n\r\n  const createBase64Image = async (file: Blob) => {\r\n    const reader = new FileReader();\r\n    return new Promise(function (resolve, reject) {\r\n      reader.onload = function (event) {\r\n        resolve(event?.target?.result);\r\n      };\r\n      reader.readAsDataURL(file);\r\n    });\r\n  };\r\n\r\n  const handleCapture = async (target: EventTarget & HTMLInputElement) => {\r\n    if (target.files) {\r\n      if (target.files.length !== 0) {\r\n        const files = [];\r\n        const base64Images: Array<{\r\n          title: string;\r\n          urlPath: string;\r\n          contents: string;\r\n          isUploaded: boolean;\r\n          whenTaken: Date | string;\r\n          servicePhotoId: string;\r\n          file: File;\r\n        }> = [];\r\n        // Get fileList Object, convert to an array and get the values before they disappear\r\n        // https://stackoverflow.com/questions/25333488/why-isnt-the-filelist-object-an-array\r\n        const allFiles: File[] = Array.from(target.files);\r\n        const fileLength = target.files.length;\r\n        for (let i = 0; i < fileLength; i++) {\r\n          const file = allFiles[i];\r\n          const base64 = (await createBase64Image(file)) as string;\r\n          const newUrl = URL.createObjectURL(file);\r\n\r\n          files.push(file);\r\n          base64Images.push({\r\n            title: file.name,\r\n            urlPath: newUrl,\r\n            contents: base64.split(',')[1],\r\n            isUploaded: false,\r\n            whenTaken: '',\r\n            servicePhotoId: Math.floor(1000000 + Math.random() * 9000000).toString(),\r\n            file: file,\r\n          });\r\n        }\r\n        handleFileChange(base64Images, files);\r\n      }\r\n    }\r\n  };\r\n\r\n  return (\r\n    <Grid container className={classes.root}>\r\n      <Grid item xs={12} className={classes.buttonsContainer}>\r\n        <input\r\n          disabled={disabled}\r\n          className={classes.input}\r\n          id={`icon-button-file-${imageKey}`}\r\n          type=\"file\"\r\n          capture=\"environment\"\r\n          multiple={multi}\r\n          onChange={e => {\r\n            handleCapture(e.target);\r\n            // reset the input value so you can re-upload the same photo if you want to\r\n            e.target.value = '';\r\n          }}\r\n        />\r\n        <Box>\r\n          <label htmlFor={`icon-button-file-${imageKey}`}>\r\n            <Button\r\n              onClick={handleUploadClick}\r\n              disabled={disabled}\r\n              // className={classes.button}\r\n              // style={{ margin: 0 }}\r\n              startIcon={<Camera />}\r\n              size={'large'}\r\n              variant={'contained'}\r\n              component={'span'}\r\n            >\r\n              {fileName || <span>UPLOAD FILE{multi ? <span>(S)</span> : null}</span>}\r\n            </Button>\r\n          </label>\r\n        </Box>\r\n      </Grid>\r\n    </Grid>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  root: { display: 'flex' },\r\n  heading: {\r\n    display: 'block',\r\n    marginBottom: theme.spacing(0.75),\r\n  },\r\n  buttonsContainer: {\r\n    width: '100%',\r\n    textAlign: 'center',\r\n    [theme.breakpoints.down('md')]: {\r\n      marginBottom: theme.spacing(4),\r\n    },\r\n  },\r\n  imgBox: {\r\n    maxWidth: '100%',\r\n    flexDirection: 'column',\r\n  },\r\n  img: {\r\n    height: 'inherit',\r\n    maxWidth: 'inherit',\r\n    padding: theme.spacing(1),\r\n  },\r\n  input: {\r\n    display: 'none',\r\n  },\r\n  removeButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  imageHelpText: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  button: {\r\n    margin: 0,\r\n    backgroundColor: theme.palette.primary.main,\r\n  },\r\n}));\r\n","import {\r\n  FirstPage as FirstPageIcon,\r\n  KeyboardArrowLeft,\r\n  KeyboardArrowRight,\r\n  LastPage as LastPageIcon,\r\n} from '@mui/icons-material';\r\nimport { IconButton, useMediaQuery } from '@mui/material';\r\nimport { useTheme, Theme } from '@mui/material/styles';\r\nimport { TablePaginationActionsProps } from '@mui/material/TablePagination/TablePaginationActions';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport React, { FC } from 'react';\r\n\r\nexport const TablePaginationActions: FC<TablePaginationActionsProps> = ({\r\n  count,\r\n  page,\r\n  rowsPerPage,\r\n  onPageChange,\r\n})  => {\r\n  const classes = useStyles();\r\n  const theme = useTheme();\r\n  const isDesktop = useMediaQuery('(min-width: 960px)');\r\n\r\n  const handleFirstPageButtonClick = () => {\r\n    onPageChange(null, 0);\r\n  };\r\n\r\n  const handleBackButtonClick = () => {\r\n    onPageChange(null, page - 1);\r\n  };\r\n\r\n  const handleNextButtonClick = () => {\r\n    onPageChange(null, page + 1);\r\n  };\r\n\r\n  const handleLastPageButtonClick = () => {\r\n    onPageChange(null, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n  };\r\n\r\n  return (\r\n    <div className={classes.root}>\r\n      {isDesktop && (\r\n        <IconButton\r\n          onClick={handleFirstPageButtonClick}\r\n          disabled={page === 0}\r\n          aria-label=\"first page\"\r\n        >\r\n          {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}\r\n        </IconButton>\r\n      )}\r\n      <IconButton\r\n        className={classes.button}\r\n        onClick={handleBackButtonClick}\r\n        disabled={page === 0}\r\n        aria-label=\"previous page\"\r\n      >\r\n        {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}\r\n      </IconButton>\r\n      <IconButton\r\n        className={classes.button}\r\n        onClick={handleNextButtonClick}\r\n        disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n        aria-label=\"next page\"\r\n      >\r\n        {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}\r\n      </IconButton>\r\n      {isDesktop && (\r\n        <IconButton\r\n          onClick={handleLastPageButtonClick}\r\n          disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n          aria-label=\"last page\"\r\n        >\r\n          {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}\r\n        </IconButton>\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  root: {\r\n    flexShrink: 0,\r\n    [theme.breakpoints.up('md')]: {\r\n      marginLeft: theme.spacing(2.5),\r\n    },\r\n  },\r\n  button: {\r\n    [theme.breakpoints.down('md')]: {\r\n      padding: 0,\r\n    },\r\n  },\r\n}));\r\n","import { TablePagination, TablePaginationProps } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport React, { FC } from 'react';\r\n\r\nimport { TablePaginationActions } from './TablePaginationActions';\r\n\r\ninterface IPagination\r\n  extends Pick<\r\n    TablePaginationProps,\r\n    'labelRowsPerPage' | 'count' | 'rowsPerPage' | 'page' | 'rowsPerPageOptions'\r\n  > {\r\n  setPage: (newPage: number) => void;\r\n  setRowsPerPage: (val: number) => void;\r\n  rowsPerPageOptions?: number[];\r\n}\r\n\r\nexport const Pagination: FC<IPagination> = ({\r\n  labelRowsPerPage,\r\n  rowsPerPageOptions,\r\n  count,\r\n  rowsPerPage,\r\n  page,\r\n  setPage,\r\n  setRowsPerPage,\r\n}) => {\r\n  const classes = paginationStyles();\r\n  return (\r\n    <TablePagination\r\n      labelRowsPerPage={labelRowsPerPage}\r\n      count={count}\r\n      page={page}\r\n      rowsPerPage={rowsPerPage}\r\n      rowsPerPageOptions={rowsPerPageOptions ?? [10, 25, 50]}\r\n      component=\"div\"\r\n      classes={{\r\n        root: classes.paginationRoot,\r\n      }}\r\n      onPageChange={(e: unknown, newPage: number) => setPage(newPage)}\r\n      onRowsPerPageChange={(e: React.ChangeEvent<HTMLInputElement>) => {\r\n        setPage(0);\r\n        setRowsPerPage(parseInt(e.target.value, 10));\r\n      }}\r\n      ActionsComponent={TablePaginationActions}\r\n    />\r\n  );\r\n};\r\n\r\nconst paginationStyles = makeStyles((theme: Theme) => ({\r\n  paginationRoot: {\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'flex-end',\r\n    overflow: 'hidden',\r\n    '&& .MuiTablePagination-selectRoot': {\r\n      marginLeft: 0,\r\n      marginRight: '5px',\r\n    },\r\n    '&& .MuiToolbar-gutters': {\r\n      paddingLeft: 0,\r\n    },\r\n    '&& .MuiTablePagination-actions': {\r\n      marginLeft: 0,\r\n    },\r\n    [theme.breakpoints.up('md')]: {\r\n      '&& .MuiTablePagination-selectRoot': {\r\n        marginLeft: '8px',\r\n        marginRight: '32px',\r\n      },\r\n      '&& .MuiToolbar-gutters': {\r\n        paddingLeft: 0,\r\n      },\r\n      '&& .MuiTablePagination-actions': {\r\n        marginLeft: '20px',\r\n      },\r\n    },\r\n  },\r\n}));\r\n","import {\r\n  Grid,\r\n  Skeleton,\r\n  Table as MaUTable,\r\n  TableBody,\r\n  TableCell,\r\n  TableCellProps,\r\n  TableContainer,\r\n  TableHead,\r\n  TableRow,\r\n  TableSortLabel,\r\n  Typography,\r\n  useMediaQuery,\r\n  Tooltip,\r\n} from '@mui/material';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport clsx from 'clsx';\r\nimport React, { FC, ReactNode, useEffect } from 'react';\r\nimport {\r\n  Cell,\r\n  ColumnInterface,\r\n  Row,\r\n  useGlobalFilter,\r\n  usePagination,\r\n  useRowSelect,\r\n  useSortBy,\r\n  useTable,\r\n  UseTableOptions,\r\n} from 'react-table';\r\nimport { formatPercent, getLocalDate, getLocalDateTime } from '../../helpers';\r\nimport { Pagination } from './Pagination';\r\n\r\n// `ITableColumn` is our version of `Column`, or rather, `ColumnInterface`\r\nexport interface ITableColumn<D extends object = {}> extends ColumnInterface<D> {\r\n  accessor?: ((item: Row<D>) => string | number) | string;\r\n  canFilter?: boolean;\r\n  className?: string;\r\n  columnAlignment?: TableCellProps['align'];\r\n  filterType?: 'input' | 'autocomplete';\r\n  handleClickColumn?: (columnId: any) => void;\r\n  hideLoad?: boolean;\r\n  isCentered?: boolean;\r\n  isCurrency?: boolean;\r\n  isDate?: boolean;\r\n  isDateTime?: boolean;\r\n  isNumber?: boolean;\r\n  isPercent?: boolean;\r\n  isServerSorted?: boolean;\r\n  isServerSortedDesc?: boolean;\r\n  overrideWidth?: number;\r\n  sort?: boolean;\r\n}\r\n\r\ninterface ITable<D extends object = {}> extends Pick<UseTableOptions<D>, 'data' | 'columns'> {\r\n  cellClasses?: string | ((original: D) => string);\r\n  centerPagination?: boolean;\r\n  containerClasses?: string;\r\n  handlePage?: (val: number) => void;\r\n  handleRowsPerPage?: (val: number) => void;\r\n  headerClasses?: string;\r\n  hideDeleted?: boolean;\r\n  hidePagination?: boolean;\r\n  isLoading?: boolean;\r\n  loadingPageSize?: number;\r\n  LoadMoreComponent?: FC;\r\n  mobileProps?: Record<string, unknown>;\r\n  noResultsText?: string;\r\n  onRowsPerPageChange?: (rows: number) => void;\r\n  ResponsiveComponent?: FC<any>;\r\n  ResponsiveComponentLoader?: FC;\r\n  rowClasses?: string | ((original: D) => string);\r\n  rowOnClick?: (val: unknown) => void;\r\n  serverPage?: number;\r\n  serverRecordCount?: number;\r\n  serverPerPage?: number;\r\n  stickyHeader?: boolean;\r\n  tableSize?: 'medium' | 'small';\r\n  useTableProps?: UseTableOptions<D>;\r\n  Cell?: (data: any) => JSX.Element;\r\n  rowsPerPageOptions?: number[];\r\n}\r\n\r\nconst currencyRE = /\\B(?=(\\d{3})+(?!\\d))/g;\r\n\r\nconst formatCell = (cell: Cell<{}>): ReactNode => {\r\n  const tColumn = cell.column as ITableColumn; // ColumnInstance with extra properties\r\n\r\n  if (tColumn.id === 'states') {\r\n    const codes = cell.value.map((state: any) => state.code).join(', ');\r\n\r\n    return (\r\n      <Tooltip title={codes} enterDelay={500} leaveDelay={200}>\r\n        <span>{codes}</span>\r\n      </Tooltip>\r\n    );\r\n  }\r\n\r\n  if (tColumn.id === 'name') {\r\n    return (\r\n      <Tooltip title={cell.value} enterDelay={500} leaveDelay={200}>\r\n        <span>{cell.render('Cell')}</span>\r\n      </Tooltip>\r\n    );\r\n  }\r\n\r\n  if (tColumn.isDate) return getLocalDate(cell.value);\r\n  if (tColumn.isDateTime) return getLocalDateTime(cell.value);\r\n  else if (tColumn.isCurrency) return `$${Number(cell.value).toFixed(2).replace(currencyRE, ',')}`;\r\n  else if (tColumn.isPercent) return formatPercent(cell.value);\r\n  else return cell.render('Cell');\r\n};\r\n\r\nconst getCellStyle = (column: ITableColumn, type: 'header' | 'cell'): React.CSSProperties => {\r\n  let style: React.CSSProperties = { cursor: 'inherit' };\r\n\r\n  if (column.id === 'states' || column.id === 'name') {\r\n    style = {\r\n      ...style,\r\n      maxWidth: '300px',\r\n      overflow: 'hidden',\r\n      whiteSpace: 'nowrap',\r\n      textOverflow: 'ellipsis',\r\n    };\r\n  }\r\n\r\n  if (column.isDate) {\r\n    style = {\r\n      ...style,\r\n    };\r\n  } else if (column.isNumber) {\r\n    style = {\r\n      ...style,\r\n      textAlign: 'right',\r\n      paddingRight: '3rem',\r\n    };\r\n  } else if (column.isCurrency) {\r\n    style = {\r\n      ...style,\r\n    };\r\n  } else if (column.isCentered) {\r\n    style = {\r\n      ...style,\r\n      textAlign: 'center',\r\n    };\r\n  }\r\n\r\n  if (column.overrideWidth) {\r\n    style = {\r\n      ...style,\r\n      width: column.overrideWidth,\r\n      maxWidth: column.overrideWidth,\r\n      wordWrap: 'break-word', // IE11\r\n      overflowWrap: 'break-word',\r\n    };\r\n  }\r\n\r\n  if (type === 'header') {\r\n    style = {\r\n      ...style,\r\n      fontWeight: 'bold',\r\n      cursor: column.handleClickColumn ? 'pointer' : 'inherit',\r\n      color: '#a81f25',\r\n    };\r\n  }\r\n\r\n  return style;\r\n};\r\n\r\nexport const Table: FC<ITable> = ({\r\n  cellClasses = '',\r\n  centerPagination,\r\n  columns,\r\n  containerClasses = '',\r\n  data,\r\n  headerClasses,\r\n  hideDeleted,\r\n  hidePagination,\r\n  isLoading,\r\n  loadingPageSize,\r\n  LoadMoreComponent,\r\n  mobileProps,\r\n  noResultsText = 'No Results',\r\n  onRowsPerPageChange,\r\n  ResponsiveComponent,\r\n  ResponsiveComponentLoader,\r\n  rowClasses,\r\n  rowOnClick,\r\n  serverPage,\r\n  serverRecordCount,\r\n  serverPerPage,\r\n  handlePage,\r\n  handleRowsPerPage,\r\n  stickyHeader = false,\r\n  tableSize = 'small',\r\n  useTableProps = {},\r\n  rowsPerPageOptions,\r\n}) => {\r\n  const classes = useStyles();\r\n  const isDesktop = useMediaQuery('(min-width: 960px)');\r\n\r\n  const {\r\n    getTableProps,\r\n    headerGroups,\r\n    prepareRow,\r\n    // @ts-ignore\r\n    page,\r\n    // @ts-ignore\r\n    gotoPage,\r\n    // @ts-ignore\r\n    setPageSize,\r\n    // @ts-ignore\r\n    state: { pageSize },\r\n  } = useTable(\r\n    {\r\n      columns,\r\n      data,\r\n      // @ts-ignore\r\n      userPageCount: 1,\r\n      manualPagination: hidePagination,\r\n      autoResetPage: isLoading,\r\n      autoResetSortBy: isLoading,\r\n      ...useTableProps,\r\n    },\r\n    useGlobalFilter,\r\n    useSortBy,\r\n    usePagination,\r\n    useRowSelect\r\n  );\r\n\r\n  const setPage = (page: number) => {\r\n    gotoPage(page);\r\n  };\r\n\r\n  // update page size if we hide pagination\r\n  useEffect(() => {\r\n    data.length ? setPageSize(Number(data.length)) : setPageSize(Number(10));\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [data]);\r\n\r\n  // always start on first page if data length changes, ie; filter was applied\r\n  useEffect(() => {\r\n    setPage(0);\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [data.length]);\r\n  return (\r\n    <>\r\n      <TableContainer className={clsx(containerClasses, stickyHeader ? classes.stickyHeader : '')}>\r\n        <MaUTable\r\n          stickyHeader={stickyHeader}\r\n          size={tableSize}\r\n          {...getTableProps()}\r\n          style={ResponsiveComponent && !isLoading ? { display: 'block' } : undefined}\r\n        >\r\n          {isDesktop || !ResponsiveComponent ? (\r\n            <>\r\n              {/** TABLE HEADER */}\r\n              <TableHead>\r\n                {headerGroups.map(headerGroup => (\r\n                  <TableRow {...headerGroup.getHeaderGroupProps()}>\r\n                    {/** TABLE HEADER COLUMNS */}\r\n                    {headerGroup.headers.map((column: any) => (\r\n                      <TableCell\r\n                        align={column?.columnAlignment ?? column?.isCurrency ? 'right' : 'left'}\r\n                        {...((column as ITableColumn).sort !== false\r\n                          ? column.getHeaderProps(column.getSortByToggleProps())\r\n                          : column.getHeaderProps())}\r\n                        title={column.title || ''}\r\n                        className={headerClasses}\r\n                        style={getCellStyle(column, 'header')}\r\n                        onClick={e => {\r\n                          const { handleClickColumn, sort } = column as ITableColumn;\r\n                          const sortProps: any = column.getHeaderProps(\r\n                            column.getSortByToggleProps()\r\n                          );\r\n\r\n                          // If the column is sortable and there's an onClick handler, then call it\r\n                          const { onClick } = sortProps || {};\r\n                          sort !== false && onClick && onClick(e);\r\n\r\n                          // Also run column click handler if passed\r\n                          handleClickColumn && handleClickColumn(column.id);\r\n                        }}\r\n                      >\r\n                        {(column as ITableColumn).sort !== false ||\r\n                        (column as ITableColumn).isServerSorted ? (\r\n                          <TableSortLabel\r\n                            active={column.isSorted || (column as ITableColumn).isServerSorted}\r\n                            direction={\r\n                              column.isSortedDesc || (column as ITableColumn).isServerSortedDesc\r\n                                ? 'desc'\r\n                                : 'asc'\r\n                            }\r\n                          >\r\n                            {column.render('Header')}\r\n                          </TableSortLabel>\r\n                        ) : (\r\n                          column.render('Header')\r\n                        )}\r\n                      </TableCell>\r\n                    ))}\r\n                  </TableRow>\r\n                ))}\r\n              </TableHead>\r\n\r\n              {/** TABLE BODY ROWS */}\r\n              <TableBody>\r\n                {isLoading\r\n                  ? new Array(loadingPageSize || pageSize || 3).fill('').map((_, j) => (\r\n                      <TableRow\r\n                        key={`table-row-skeleton-${j}`}\r\n                        {...(rowOnClick ? { onClick: rowOnClick } : {})}\r\n                      >\r\n                        {/** LOADING SKELETON */}\r\n                        {columns.map((column: any, i) => (\r\n                          <TableCell\r\n                            align={column?.columnAlignment ?? 'left'}\r\n                            key={`skeleton-cell-${i}`}\r\n                            style={getCellStyle(column as ITableColumn, 'cell')}\r\n                            className={\r\n                              typeof cellClasses === 'function' ? cellClasses({}) : cellClasses\r\n                            }\r\n                          >\r\n                            {column.hideLoad ? null : <Skeleton />}\r\n                          </TableCell>\r\n                        ))}\r\n                      </TableRow>\r\n                    ))\r\n                  : page.map((row: Row) => {\r\n                      prepareRow(row);\r\n                      return !hideDeleted || (hideDeleted && !(row.original as any).isDeleted) ? (\r\n                        <TableRow\r\n                          {...row.getRowProps()}\r\n                          className={\r\n                            typeof rowClasses === 'function' ? rowClasses(row.original) : rowClasses\r\n                          }\r\n                          {...(rowOnClick ? { onClick: () => rowOnClick(row.original) } : {})}\r\n                        >\r\n                          {row.cells.map(cell => {\r\n                            const tableColumn: ITableColumn | undefined = cell?.column;\r\n                            return (\r\n                              <TableCell\r\n                                align={\r\n                                  tableColumn?.columnAlignment || tableColumn?.isCurrency\r\n                                    ? 'right'\r\n                                    : 'left'\r\n                                }\r\n                                {...cell.getCellProps()}\r\n                                className={clsx(\r\n                                  tableColumn?.className ?? '',\r\n                                  typeof cellClasses === 'function'\r\n                                    ? cellClasses(row.original)\r\n                                    : cellClasses,\r\n                                  tableColumn?.className ?? ''\r\n                                )}\r\n                                style={getCellStyle(tableColumn, 'cell')}\r\n                              >\r\n                                {formatCell(cell)}\r\n                              </TableCell>\r\n                            );\r\n                          })}\r\n                        </TableRow>\r\n                      ) : null;\r\n                    })}\r\n              </TableBody>\r\n            </>\r\n          ) : (\r\n            <TableBody className={isLoading ? undefined : classes.mobileTable}>\r\n              {/** TABLE BODY FROM RESPONSIVE COMPONENT */}\r\n              {isLoading ? (\r\n                <TableRow>\r\n                  <TableCell\r\n                    className={clsx(\r\n                      classes.mobileCell,\r\n                      typeof cellClasses === 'function' ? cellClasses({}) : cellClasses\r\n                    )}\r\n                  >\r\n                    {ResponsiveComponentLoader ? <ResponsiveComponentLoader /> : <Skeleton />}\r\n                  </TableCell>\r\n                </TableRow>\r\n              ) : (\r\n                (page as Row[]).map((row, i) => {\r\n                  prepareRow(row);\r\n                  return !hideDeleted || (hideDeleted && !(row.original as any).isDeleted) ? (\r\n                    <TableRow\r\n                      {...row.getRowProps()}\r\n                      className={\r\n                        typeof rowClasses === 'function' ? rowClasses(row.original) : rowClasses\r\n                      }\r\n                      {...(rowOnClick ? { onClick: () => rowOnClick(row.original) } : {})}\r\n                      style={{ display: 'block' }}\r\n                    >\r\n                      <TableCell\r\n                        key={`row-${i}-mobile-cell`}\r\n                        className={clsx(\r\n                          classes.mobileCell,\r\n                          typeof cellClasses === 'function'\r\n                            ? cellClasses(row.original)\r\n                            : cellClasses\r\n                        )}\r\n                        style={{ display: 'block' }}\r\n                      >\r\n                        <ResponsiveComponent\r\n                          key={`responsive-row-${i}`}\r\n                          {...row}\r\n                          {...useTableProps}\r\n                          {...mobileProps}\r\n                        />\r\n                      </TableCell>\r\n                    </TableRow>\r\n                  ) : null;\r\n                })\r\n              )}\r\n            </TableBody>\r\n          )}\r\n        </MaUTable>\r\n\r\n        {/** NO RESULTS DISPLAY */}\r\n        {!isLoading && data.length === 0 && (\r\n          <Grid container justifyContent=\"center\">\r\n            <Typography className={classes.noResults} variant=\"body1\" gutterBottom>\r\n              {noResultsText}\r\n            </Typography>\r\n          </Grid>\r\n        )}\r\n\r\n        {LoadMoreComponent && <LoadMoreComponent />}\r\n      </TableContainer>\r\n\r\n      {!isLoading &&\r\n        data.length > 0 &&\r\n        !hidePagination &&\r\n        !isNaN(serverPage as number) &&\r\n        !isNaN(serverPerPage as number) &&\r\n        !isNaN(serverRecordCount as number) &&\r\n        handlePage &&\r\n        handleRowsPerPage && (\r\n          <div className={classes.centerPagination}>\r\n            <Pagination\r\n              count={serverRecordCount as number}\r\n              rowsPerPage={serverPerPage as number}\r\n              page={serverPage as number}\r\n              setPage={handlePage}\r\n              setRowsPerPage={handleRowsPerPage}\r\n              rowsPerPageOptions={rowsPerPageOptions}\r\n            />\r\n          </div>\r\n        )}\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles(() => ({\r\n  noResults: {\r\n    marginTop: '1rem',\r\n  },\r\n  stickyHeader: {\r\n    flexGrow: 1,\r\n    maxHeight: '100%',\r\n  },\r\n  borderNone: {\r\n    border: 'none',\r\n  },\r\n  mobileTable: {\r\n    display: 'block',\r\n  },\r\n  mobileCell: {\r\n    padding: 0,\r\n    border: 0,\r\n  },\r\n  centerPagination: {\r\n    width: '100%',\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    alignItems: 'center',\r\n  },\r\n}));\r\n","import { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/files';\r\n\r\nexport const getFile = async (fileId: string): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.get(`${baseUrl}/${fileId}`, null, { responseType: 'blob' });\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getFile failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { ILicense } from './../models/dvms';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\nconst baseUrl = '/license';\r\n\r\nexport const createLicense = async (license: ILicense, dvmId: number): Promise<any> => {\r\n  try {\r\n    const formData = new FormData();\r\n    formData.append('LicenseId', '0');\r\n    formData.append('DVMId', dvmId.toString());\r\n    formData.append('State', license.state);\r\n    if (license.expirationDate) {\r\n      formData.append('ExpirationDate', new Date(license.expirationDate).toUTCString());\r\n    } else {\r\n      //@ts-ignore\r\n      formData.append('ExpirationDate', '');\r\n    }\r\n    formData.append('FileDetails', license.file ?? null);\r\n    const { data } = await authFetch.post(`${baseUrl}`, formData);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: {license, dvmId}}, 'createLicense failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateLicense = async (license: ILicense, dvmId: number): Promise<any> => {\r\n  const formData = new FormData();\r\n  formData.append('LicenseId', license.licenseId.toString());\r\n  formData.append('DVMId', dvmId.toString());\r\n  formData.append('State', license.state);\r\n  if (license.expirationDate) {\r\n    formData.append('ExpirationDate', new Date(license.expirationDate).toUTCString());\r\n  } else {\r\n    //@ts-ignore\r\n    formData.append('ExpirationDate', '');\r\n  }\r\n\r\n  formData.append('FileDetails', license.file ?? null);\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}`, formData);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: {license, dvmId}}, 'updateLicense failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const deleteLicense = async (licenseId: number): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.delete(`${baseUrl}/${licenseId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteLicense failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { DeleteForever } from '@mui/icons-material';\r\nimport { Box, Button, Grid, IconButton, TextField, Typography, useMediaQuery } from '@mui/material';\r\nimport { LocalizationProvider, DesktopDatePicker, MobileDatePicker } from '@mui/x-date-pickers';\r\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\r\nimport { useSnackbar } from 'notistack';\r\nimport { FC, useEffect, useMemo, useState } from 'react';\r\nimport { MultiFileUpload } from '../../components/file/multi-image-upload';\r\nimport { Table } from '../../components/table/Table';\r\nimport { getFile } from '../../fetch/files';\r\nimport { deleteLicense } from '../../fetch/license';\r\nimport { downloadFile } from '../../helpers';\r\nimport { ILicense } from '../../models';\r\nimport { IFile } from '../../models/files';\r\n\r\ninterface ILicenseInfo {\r\n  licenses: ILicense[];\r\n  isLoading: boolean;\r\n  errors: any;\r\n  setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;\r\n  validateForm: any;\r\n  values: any;\r\n  fetchDVM: () => void;\r\n  readOnly: boolean;\r\n}\r\nexport const LicenseInfo: FC<ILicenseInfo> = ({\r\n  licenses,\r\n  isLoading,\r\n  errors,\r\n  setFieldValue,\r\n  validateForm,\r\n  values,\r\n  fetchDVM,\r\n  readOnly,\r\n}) => {\r\n  const [licensesCopy, setLicensesCopy] = useState(values.licenses);\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const [files, setFiles] = useState<IFile[]>([]);\r\n\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n\r\n  useEffect(() => {\r\n    setLicensesCopy(licenses);\r\n  }, [licenses, isLoading]);\r\n\r\n  const addLicense = () => {\r\n    setLicensesCopy((prev: any) => {\r\n      const newLicense = [\r\n        ...prev,\r\n        {\r\n          licenseId: -Math.floor(1000000 + Math.random() * 9000000).toString(),\r\n          state: '',\r\n          expirationDate: new Date(),\r\n          file: null,\r\n        },\r\n      ];\r\n      setFieldValue('licenses', newLicense);\r\n\r\n      return newLicense;\r\n    });\r\n  };\r\n\r\n  const updateLicenseData = (\r\n    license: ILicense,\r\n    columnId: string,\r\n    value: string,\r\n    rowIndex: number\r\n  ) => {\r\n    setLicensesCopy((old: ILicense[]) => {\r\n      const newLicenses = old.map((row, index) => {\r\n        if (index === rowIndex) {\r\n          return {\r\n            ...license,\r\n            [columnId]: value,\r\n          };\r\n        }\r\n        return row;\r\n      });\r\n\r\n      return newLicenses;\r\n    });\r\n  };\r\n\r\n  const updateAcceptLicenseData = (\r\n    license: ILicense,\r\n    columnId: string,\r\n    value: string,\r\n    rowIndex: number\r\n  ) => {\r\n    setLicensesCopy((old: ILicense[]) => {\r\n      const newLicenses = old.map((row, index) => {\r\n        if (index === rowIndex) {\r\n          return {\r\n            ...license,\r\n            [columnId]: value,\r\n          };\r\n        }\r\n        return row;\r\n      });\r\n\r\n      setFieldValue('licenses', newLicenses);\r\n      return newLicenses;\r\n    });\r\n  };\r\n\r\n  const getFileName = (res: any) => {\r\n    let filename = '';\r\n    let disposition = res.headers['content-disposition'];\r\n    if (disposition && disposition.indexOf('attachment') !== -1) {\r\n      const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n      const matches = filenameRegex.exec(disposition);\r\n      if (matches != null && matches[1]) {\r\n        filename = matches[1].replace(/['\"]/g, '');\r\n      }\r\n    }\r\n    return filename;\r\n  };\r\n  const handleDelete = async (licenseId: number) => {\r\n    const result = window.confirm('Are you sure you want to delete this license?');\r\n    if (result) {\r\n      try {\r\n        if (licenseId > 0) await deleteLicense(licenseId);\r\n        setLicensesCopy((prev: any) => {\r\n          const newLicenses = prev.filter((license: any) => license.licenseId !== licenseId);\r\n          setFieldValue('licenses', newLicenses);\r\n\r\n          validateForm();\r\n          return newLicenses;\r\n        });\r\n\r\n        enqueueSnackbar(`license deleted.`, {\r\n          variant: 'success',\r\n        });\r\n        fetchDVM();\r\n      } catch (error: any) {\r\n        console.error(error);\r\n        const errorMessage = error?.response?.data?.Detail;\r\n        enqueueSnackbar(errorMessage || `Error deleting license, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n      }\r\n    }\r\n  };\r\n\r\n  const columns = useMemo(() => {\r\n    return [\r\n      {\r\n        Header: 'State',\r\n        accessor: 'state',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [val, setVal] = useState(licensesCopy?.[props?.row?.index]?.state);\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled={readOnly}\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onChange={(e: any) => setVal(e.target.value)}\r\n                onBlur={() => {\r\n                  updateAcceptLicenseData(\r\n                    props?.row?.original,\r\n                    props?.column?.id,\r\n                    val,\r\n                    props?.row?.index\r\n                  );\r\n                }}\r\n                placeholder={props.column.Header}\r\n                autoComplete=\"nope\"\r\n                value={val}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-${props.column.id}`,\r\n                }}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Expiration Date',\r\n        accessor: 'expirationDate',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [val, setVal] = useState('');\r\n          return (\r\n            <>\r\n              {!isMobile ? (\r\n                <>\r\n                  <LocalizationProvider dateAdapter={AdapterDateFns}>\r\n                    <DesktopDatePicker\r\n                      toolbarPlaceholder={'Expiration Date'}\r\n                      inputFormat=\"MM/dd/yyyy\"\r\n                      value={licensesCopy?.[props?.row?.index]?.expirationDate}\r\n                      onChange={val => setVal(val)}\r\n                      disabled={readOnly}\r\n                      onAccept={val => {\r\n                        updateAcceptLicenseData(\r\n                          props?.row?.original,\r\n                          props?.column?.id,\r\n                          val,\r\n                          props?.row?.index\r\n                        );\r\n                      }}\r\n                      renderInput={(params: any) => (\r\n                        <TextField\r\n                          disabled={readOnly}\r\n                          onBlur={() => {\r\n                            updateAcceptLicenseData(\r\n                              props?.row?.original,\r\n                              props?.column?.id,\r\n                              val,\r\n                              props?.row?.index\r\n                            );\r\n                          }}\r\n                          required={false}\r\n                          size=\"small\"\r\n                          variant=\"standard\"\r\n                          {...params}\r\n                          error={errors && !!errors?.licenses?.[props?.row?.index]?.expirationDate}\r\n                        />\r\n                      )}\r\n                    />\r\n                  </LocalizationProvider>\r\n                  <Typography variant=\"body2\">\r\n                    {errors && errors?.licenses?.[props?.row?.index]?.expirationDate}\r\n                  </Typography>\r\n                </>\r\n              ) : (\r\n                <>\r\n                  <LocalizationProvider dateAdapter={AdapterDateFns}>\r\n                    <MobileDatePicker\r\n                      toolbarPlaceholder={'Expiration Date'}\r\n                      inputFormat=\"MM/dd/yyyy\"\r\n                      value={licensesCopy?.[props?.row?.index]?.expirationDate}\r\n                      onChange={val => setVal(val)}\r\n                      disabled={readOnly}\r\n                      onAccept={val => {\r\n                        setFieldValue(`licenses.[${props?.row?.index}].expirationDate`, val);\r\n                      }}\r\n                      renderInput={(params: any) => (\r\n                        <TextField\r\n                          disabled={readOnly}\r\n                          onBlur={() => setFieldValue('licenses', licensesCopy)}\r\n                          variant=\"standard\"\r\n                          size=\"small\"\r\n                          {...params}\r\n                          error={errors && !!errors?.licenses?.[props?.row?.index]?.expirationDate}\r\n                        />\r\n                      )}\r\n                    />\r\n                  </LocalizationProvider>\r\n                  <Typography variant=\"body2\">\r\n                    {errors && errors?.licenses?.[props?.row?.index]?.expirationDate}\r\n                  </Typography>\r\n                </>\r\n              )}\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'File',\r\n        accessor: 'file',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          return (\r\n            <>\r\n              {props?.row?.original?.file?.azureUri ? (\r\n                <Button\r\n                  key={props.row.original.file.fileId}\r\n                  onClick={async () => {\r\n                    const res = await getFile(props?.row?.original?.file?.fileId);\r\n                    const fileName = getFileName(res);\r\n                    const binaryData = [];\r\n                    binaryData.push(res.data);\r\n                    downloadFile(binaryData, fileName);\r\n                  }}\r\n                  size={'large'}\r\n                  variant={'contained'}\r\n                  component={'span'}\r\n                >\r\n                  {values?.licenses?.[props?.row?.index]?.file?.fileName}\r\n                </Button>\r\n              ) : (\r\n                <>\r\n                  {readOnly ? (\r\n                    <Typography variant=\"body2\">There is no file to display</Typography>\r\n                  ) : (\r\n                    <>\r\n                      <MultiFileUpload\r\n                        multi={false}\r\n                        imageKey={`${props?.row?.index}`}\r\n                        handleFileChange={async val => {\r\n                          setFiles(prev => [...prev, ...val]);\r\n                          setFieldValue(`licenses[${props?.row?.index}].file`, val?.[0].file);\r\n                        }}\r\n                        fileName={\r\n                          props?.row?.original?.file?.name || props?.row?.original?.file?.fileName\r\n                        }\r\n                        files={files.map(file => {\r\n                          return file.title;\r\n                        })}\r\n                      />\r\n                      {errors && errors?.locationShifts?.[props?.row?.index]?.file && (\r\n                        <Typography variant=\"body2\">\r\n                          {errors && errors?.locationShifts?.[props?.row?.index]?.file}\r\n                        </Typography>\r\n                      )}\r\n                    </>\r\n                  )}\r\n                </>\r\n              )}\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        isServerSorted: false,\r\n        isServerSortedDesc: false,\r\n        handleClickColumn: () => {},\r\n        Cell: (props: any) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <IconButton onClick={() => handleDelete(props?.row?.original?.licenseId)}>\r\n                <DeleteForever />\r\n              </IconButton>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ].filter(column => (readOnly ? column.id !== 'actions' : true));\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [licenses, isLoading]);\r\n\r\n  return (\r\n    <Grid container spacing={3}>\r\n      {!readOnly && (\r\n        <Grid item xs={12}>\r\n          <Button onClick={() => addLicense()}>Add</Button>\r\n        </Grid>\r\n      )}\r\n      <Grid item xs={12}>\r\n        <Table\r\n          columns={columns}\r\n          data={licensesCopy}\r\n          hidePagination\r\n          isLoading={isLoading}\r\n          useTableProps={{\r\n            // @ts-ignore\r\n            updateMyData: updateLicenseData,\r\n          }}\r\n        />\r\n      </Grid>\r\n    </Grid>\r\n  );\r\n};\r\n","import { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\nconst baseUrl = '/dvms';\r\n\r\nexport const createInsurance = async (insuranceFile: any, dvmId: number): Promise<any> => {\r\n  try {\r\n    const formData = new FormData();\r\n    if (insuranceFile) {\r\n      formData.append('FileDetails', insuranceFile as File);\r\n    } else {\r\n      //@ts-ignore\r\n      formData.append('FileDetails', '');\r\n    }\r\n\r\n    const { data } = await authFetch.post(`${baseUrl}/${dvmId}/Insurance`, formData);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: {insuranceFile, dvmId}}, 'createInsurance failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const deleteInsurance = async (dvmId: number): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.delete(`${baseUrl}/${dvmId}/Insurance`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteInsurance failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { DeleteForever } from '@mui/icons-material';\r\nimport { Box, Button, Grid, IconButton, TextField, Typography, useMediaQuery } from '@mui/material';\r\nimport { DesktopDatePicker, MobileDatePicker } from '@mui/x-date-pickers';\r\nimport { useSnackbar } from 'notistack';\r\nimport { FC, useEffect, useMemo, useState } from 'react';\r\nimport { MultiFileUpload } from '../../components/file/multi-image-upload';\r\nimport { Table } from '../../components/table/Table';\r\nimport { getFile } from '../../fetch/files';\r\nimport { deleteInsurance } from '../../fetch/insurance';\r\nimport { downloadFile } from '../../helpers';\r\nimport { IFile } from '../../models/files';\r\n\r\ninterface IInsuranceInfo {\r\n  insuranceFile: any;\r\n  insuranceExpirationDate: any;\r\n  isLoading: boolean;\r\n  errors: any;\r\n  setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;\r\n  validateForm: any;\r\n  fetchDVM: () => void;\r\n  dvmId: number;\r\n  readOnly: boolean;\r\n}\r\nexport const InsuranceInfo: FC<IInsuranceInfo> = ({\r\n  insuranceFile,\r\n  insuranceExpirationDate,\r\n  isLoading,\r\n  errors,\r\n  setFieldValue,\r\n  validateForm,\r\n  fetchDVM,\r\n  dvmId,\r\n  readOnly,\r\n}) => {\r\n  const [insuranceCopy, setInsuranceCopy] = useState<any>(insuranceFile);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [files, setFiles] = useState<IFile[]>([]);\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const addInsurance = () => {\r\n    setInsuranceCopy({\r\n      file: null,\r\n      expirationDate: null,\r\n    });\r\n  };\r\n\r\n  const updateMyData = (insurance: any, columnId: string, value: string, rowIndex: number) => {\r\n    setInsuranceCopy(insurance);\r\n    setFieldValue('insuranceExpirationDate', insurance.expirationDate);\r\n  };\r\n\r\n  const handleDelete = async (shiftIndex: number) => {\r\n    const result = window.confirm('Are you sure you want to delete this insurance?');\r\n    if (result) {\r\n      try {\r\n        await deleteInsurance(dvmId);\r\n        enqueueSnackbar(`insurance deleted.`, {\r\n          variant: 'success',\r\n        });\r\n        setInsuranceCopy(null);\r\n        fetchDVM();\r\n      } catch (error: any) {\r\n        console.error(error);\r\n        const errorMessage = error?.response?.data?.Detail;\r\n        enqueueSnackbar(errorMessage || `Error deleting insurance, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n      }\r\n    }\r\n  };\r\n\r\n  const [expirationDate, setExpirationDate] = useState<string | undefined>(\r\n    insuranceExpirationDate as string\r\n  );\r\n\r\n  // If the initialValue is changed external, sync it up with our state\r\n  useEffect(() => {\r\n    setExpirationDate(insuranceExpirationDate as string);\r\n  }, [insuranceExpirationDate]);\r\n\r\n  useEffect(() => {\r\n    setInsuranceCopy(insuranceFile);\r\n  }, [insuranceFile]);\r\n\r\n  const getFileName = (res: any) => {\r\n    let filename = '';\r\n    let disposition = res.headers['content-disposition'];\r\n    if (disposition && disposition.indexOf('attachment') !== -1) {\r\n      const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n      const matches = filenameRegex.exec(disposition);\r\n      if (matches != null && matches[1]) {\r\n        filename = matches[1].replace(/['\"]/g, '');\r\n      }\r\n    }\r\n    return filename;\r\n  };\r\n\r\n  const columns = useMemo(\r\n    () =>\r\n      [\r\n        {\r\n          Header: 'Expiration Date',\r\n          accessor: 'insuranceExpirationDate',\r\n          sort: false,\r\n          Cell: (props: any) => {\r\n            const [val, setVal] = useState('');\r\n            return (\r\n              <>\r\n                {!isMobile ? (\r\n                  <>\r\n                    <DesktopDatePicker\r\n                      toolbarPlaceholder={'Expiration Date'}\r\n                      inputFormat=\"MM/dd/yyyy\"\r\n                      value={expirationDate}\r\n                      onChange={(e: any) => setVal(e)}\r\n                      disabled={readOnly}\r\n                      onAccept={val => {\r\n                        setExpirationDate(val);\r\n                        setFieldValue('insuranceExpirationDate', val);\r\n                      }}\r\n                      renderInput={(params: any) => (\r\n                        <TextField\r\n                          disabled={readOnly}\r\n                          onBlur={() => {\r\n                            setExpirationDate(val);\r\n                            setFieldValue('insuranceExpirationDate', val);\r\n                          }}\r\n                          size=\"small\"\r\n                          variant=\"standard\"\r\n                          {...params}\r\n                          error={errors && errors?.insuranceExpirationDate}\r\n                        />\r\n                      )}\r\n                    />\r\n                  </>\r\n                ) : (\r\n                  <>\r\n                    <MobileDatePicker\r\n                      toolbarPlaceholder={'Expiration Date'}\r\n                      inputFormat=\"MM/dd/yyyy\"\r\n                      value={expirationDate}\r\n                      onChange={(e: any) => setVal(e)}\r\n                      disabled={readOnly}\r\n                      onAccept={val => {\r\n                        setExpirationDate(val);\r\n                        setFieldValue('insuranceExpirationDate', val);\r\n                      }}\r\n                      renderInput={(params: any) => (\r\n                        <TextField\r\n                          disabled={readOnly}\r\n                          onBlur={() => {\r\n                            setExpirationDate(val);\r\n                            setFieldValue('insuranceExpirationDate', val);\r\n                          }}\r\n                          variant=\"standard\"\r\n                          size=\"small\"\r\n                          {...params}\r\n                          error={errors && errors?.insuranceExpirationDate}\r\n                        />\r\n                      )}\r\n                    />\r\n                  </>\r\n                )}\r\n              </>\r\n            );\r\n          },\r\n        },\r\n        {\r\n          Header: 'File',\r\n          accessor: 'insuranceFile',\r\n          sort: false,\r\n          Cell: (props: any) => {\r\n            return (\r\n              <>\r\n                {insuranceCopy?.azureUri ? (\r\n                  <Button\r\n                    onClick={async () => {\r\n                      const res = await getFile(props?.row?.original?.fileId);\r\n                      const fileName = getFileName(res);\r\n                      const binaryData = [];\r\n                      binaryData.push(res.data);\r\n                      downloadFile(binaryData, fileName);\r\n                    }}\r\n                    size={'large'}\r\n                    variant={'contained'}\r\n                    component={'span'}\r\n                  >\r\n                    {insuranceCopy?.fileName}\r\n                  </Button>\r\n                ) : (\r\n                  <>\r\n                    <MultiFileUpload\r\n                      multi={false}\r\n                      imageKey={`insurance-${props?.row?.index}`}\r\n                      handleFileChange={async val => {\r\n                        setFiles(prev => [...prev, ...val]);\r\n                        setFieldValue('insuranceFile', val?.[0].file);\r\n                      }}\r\n                      files={files.map(file => {\r\n                        return file.title;\r\n                      })}\r\n                      fileName={props?.row?.original?.name || props?.row?.original?.fileName}\r\n                      // disabled={isUploadingPhoto || isLoadingServicePhotos || isDeletingPhoto}\r\n                    />\r\n                    <Typography variant=\"body2\">{errors && errors?.InsuranceFile}</Typography>\r\n                  </>\r\n                )}\r\n              </>\r\n            );\r\n          },\r\n        },\r\n        {\r\n          Header: '',\r\n          accessor: '',\r\n          id: 'actions',\r\n          isServerSorted: false,\r\n          isServerSortedDesc: false,\r\n          handleClickColumn: () => {},\r\n          Cell: (props: any) => {\r\n            return (\r\n              <Box\r\n                sx={{\r\n                  textAlign: {\r\n                    xs: 'left',\r\n                    md: 'center',\r\n                  },\r\n                }}\r\n              >\r\n                <IconButton onClick={() => handleDelete(props?.row?.index)}>\r\n                  <DeleteForever />\r\n                </IconButton>\r\n              </Box>\r\n            );\r\n          },\r\n        },\r\n      ].filter(column => (readOnly ? column.id !== 'actions' : true)),\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    [expirationDate, isLoading]\r\n  );\r\n\r\n  return (\r\n    <Grid container spacing={1}>\r\n      {!readOnly && (\r\n        <Grid item xs={12}>\r\n          <Button disabled={!!insuranceCopy} onClick={() => addInsurance()}>\r\n            Add\r\n          </Button>\r\n        </Grid>\r\n      )}\r\n      <Grid item xs={12}>\r\n        <Table\r\n          columns={columns}\r\n          data={insuranceCopy ? [insuranceCopy] : []}\r\n          hidePagination\r\n          isLoading={isLoading}\r\n          useTableProps={{\r\n            // @ts-ignore\r\n            updateMyData,\r\n          }}\r\n        />\r\n      </Grid>\r\n    </Grid>\r\n  );\r\n};\r\n","import { Grid, Icon } from '@mui/material';\r\nimport Typography, { TypographyTypeMap } from '@mui/material/Typography';\r\nimport { SvgIconTypeMap } from '@mui/material/SvgIcon';\r\nimport { OverridableComponent } from '@mui/material/OverridableComponent';\r\nimport { FC } from 'react';\r\n\r\nexport interface IIconHeadingProps {\r\n  title: string;\r\n  icon: OverridableComponent<SvgIconTypeMap<{}, 'svg'>>;\r\n  variant: TypographyTypeMap['props']['variant'];\r\n  style?: React.CSSProperties;\r\n}\r\n\r\nexport const IconHeading: FC<IIconHeadingProps> = ({ title, variant, icon, style }) => {\r\n  return (\r\n    <>\r\n      <Grid container direction=\"row\" spacing=\"6\" style={style}>\r\n        <Grid item>\r\n          <Icon component={icon} />\r\n        </Grid>\r\n        <Grid item>\r\n          <Typography variant={variant}>{title}</Typography>\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n","import { IAppRole, IAppUser, IUserInfo } from '../models';\r\nimport { IResponse } from '../models/util';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/Admin';\r\n\r\nexport const getUsers = async (filters?: {\r\n  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;\r\n  searchText?: string;\r\n  isActive?: string;\r\n}): Promise<IResponse<IUserInfo[]>> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/usermanagement`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getUsers failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getUser = async (userId: number): Promise<IAppUser> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/usermanagement/${userId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getUser failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateUserRoles = async (\r\n  id: number,\r\n  roles: (string | undefined)[],\r\n  locations: any[]\r\n): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.put(`${baseUrl}/usermanagement/${id}`, { roles, locations });\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: {id, roles, locations}}, 'updateUserRoles failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getAppRoles = async (): Promise<IAppRole[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/AppRoles`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getAppRoles failed');\r\n    return Promise.reject(error);\r\n  }\r\n};","import { IHolidayContainer } from './../models/holidays';\r\nimport { authFetch } from './fetch';\r\nimport { IHoliday } from '../models/holidays';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/admin/holidays';\r\n\r\nexport const getHolidays = async (): Promise<IHoliday[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getHolidays failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createHoliday = async (holiday: IHolidayContainer): Promise<string> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}`, holiday);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: holiday}, 'createHoliday failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateHoliday = async (holiday: IHolidayContainer): Promise<string> => {\r\n  try {\r\n    const { data } = await authFetch.put(`${baseUrl}`, holiday);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: holiday}, 'updateHoliday failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const deleteHoliday = async (holidayId: number | string): Promise<string> => {\r\n  try {\r\n    const { data } = await authFetch.delete(`${baseUrl}/${holidayId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteHoliday failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { authFetch } from './fetch';\r\nimport { ILocation, ILocationContainer } from '../models/locations';\r\nimport { IResponse } from '../models/util';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/locations';\r\n\r\nexport const getLocations = async (filters?: {\r\n  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;\r\n  searchTerm?: string;\r\n}): Promise<IResponse<ILocation[]>> => {\r\n  try {\r\n    const activeFilters = filters || {};\r\n\r\n    const queryParams = new URLSearchParams();\r\n    Object.keys(activeFilters).forEach(key => {\r\n      const value = activeFilters[key as keyof typeof activeFilters];\r\n      if (Array.isArray(value)) {\r\n        if (value.length > 0) {\r\n          // For array fields with items, add each value under the same key\r\n          value.forEach(item => queryParams.append(key, item));\r\n        } else if (key.toLowerCase() === 'marketIds') {\r\n          // If DVMStatuses is empty, still add it to the query string with no value\r\n          queryParams.append(key, '');\r\n        }\r\n      } else if (value !== undefined) {\r\n        // For non-array fields, just set the parameter\r\n        queryParams.set(key, value.toString());\r\n      }\r\n    });\r\n    const { data } = await authFetch.get(`${baseUrl}?${queryParams.toString()}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLocations failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const getLocation = async (locationId: number): Promise<ILocation> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${locationId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLocation failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createLocation = async (location: ILocationContainer): Promise<string> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}`, location);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: location}, 'createLocation failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateLocation = async (location: ILocationContainer): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}`, location);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: location}, 'updateLocation failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const deleteLocation = async (locationId: number): Promise<ILocation> => {\r\n  try {\r\n    const { data } = await authFetch.delete(`${baseUrl}/${locationId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteLocation failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getLocationHours = async (locationId: number): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/hours/${locationId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLocationHours failed');\r\n    return Promise.reject(error);\r\n  }\r\n};","import { IMarketContainer } from './../models/markets';\r\nimport { IDropdownResponse, IResponse } from './../models/util';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\nimport { IMarket } from '../models/markets';\r\n\r\n\r\nconst baseUrl = '/markets';\r\n\r\nexport const getStates = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/states`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getStates failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getDVMMarkets = async (): Promise<IDropdownResponse[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/dvmMarkets`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDVMMarkets failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getMarkets = async (filters?: {\r\n  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;\r\n  nameSearchTerm?: string;\r\n}): Promise<IResponse<IMarket[]>> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getMarkets failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const getMarket = async (marketId: number): Promise<IMarket> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${marketId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getMarket failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createMarket = async (market: IMarketContainer): Promise<string> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}`, market);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: market}, 'createMarket failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateMarket = async (market: IMarketContainer): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}`, market);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: market}, 'updateMarket failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const deleteMarket = async (marketId: number): Promise<IMarket> => {\r\n  try {\r\n    const { data } = await authFetch.delete(`${baseUrl}/${marketId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteMarket failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { authFetch } from '.';\r\nimport { IAvailableShift, IMapLocation } from '../models/maps';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/maps';\r\n\r\nexport const getMapLocations = async (filters?: {\r\n  startDate?: Date | null;\r\n  endDate?: Date | null;\r\n  locationTypes?: string[];\r\n}): Promise<IMapLocation[]> => {\r\n  try {\r\n    const activeFilters = filters || {};\r\n\r\n    const queryParams = new URLSearchParams();\r\n    Object.keys(activeFilters).forEach(key => {\r\n      const value = activeFilters[key as keyof typeof activeFilters];\r\n      if (Array.isArray(value)) {\r\n        if (value.length > 0) {\r\n          // For array fields with items, add each value under the same key\r\n          value.forEach(item => {\r\n            const formattedItem = item.replaceAll(/\\s/g, '');\r\n            queryParams.append(key, formattedItem);\r\n          });\r\n        }\r\n      } else if (value !== undefined && value !== null) {\r\n        // For dates, set  to an ISOStri\r\n        if (value instanceof Date) {\r\n          queryParams.set(key, value.toISOString());\r\n        }\r\n      }\r\n    });\r\n\r\n    const { data } = await authFetch.get(\r\n      `${baseUrl}/availableLocationShifts?${queryParams.toString()}`\r\n    );\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getMapLocations failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getAvailableDVMShifts = async (\r\n  locationId: number,\r\n  startDate: Date,\r\n  endDate: Date\r\n): Promise<IAvailableShift[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/AvailableDVMShifts`, {\r\n      locationId,\r\n      startDate,\r\n      endDate,\r\n    });\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getAvailableDVMShifts failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import {\r\n  ICalendarLocation,\r\n  IFTPutSchedulePersist,\r\n  IMarketCalendarSchedule,\r\n  IRSSPutSchedulePersist,\r\n} from './../models/schedule';\r\nimport { authFetch } from '.';\r\nimport { logError } from '../services';\r\nconst baseUrl = '/Schedules';\r\n\r\ninterface ISchedulingParams {\r\n  marketIds?: never;\r\n  locationIds: number;\r\n  dateFrom: Date;\r\n  dateTo: Date;\r\n}\r\n\r\ninterface IMarketSchedulingParams {\r\n  marketIds: number;\r\n  locationIds?: never;\r\n  dateFrom: Date;\r\n  dateTo: Date;\r\n  IncludeInactiveShifts: boolean;\r\n  locationTypes?: string[];\r\n}\r\n\r\ntype ILocationSchedulingParams = ISchedulingParams | IMarketSchedulingParams;\r\n\r\ninterface IScheduledDaysParams {\r\n  dateFrom: Date;\r\n  dateTo: Date;\r\n}\r\n\r\nexport const getSchedule = async (\r\n  params?: ILocationSchedulingParams\r\n): Promise<ICalendarLocation[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/Locations`, params);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getSchedule failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const putFTPersist = async (requests: IFTPutSchedulePersist): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}/FTPersist`, requests);\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({error, payload: requests}, 'putFTPersist failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const putRSSPersist = async (requests: IRSSPutSchedulePersist): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}/RSSPersist`, requests);\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({error, payload: requests}, 'putRSSPersist failed');\r\n    return error.response.data;\r\n  }\r\n};\r\n\r\nexport const getMarketSchedule = async (\r\n  params?: ILocationSchedulingParams\r\n): Promise<IMarketCalendarSchedule[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/Markets`, params, {\r\n      paramsSerializer: (params: any) => {\r\n        return Object.entries(params)\r\n          .map(([key, value]) => {\r\n            if (Array.isArray(value)) {\r\n              return value.map((v) => `${key}=${v?.replace(/\\s/g,'')}`).join('&');\r\n            }\r\n            if (value instanceof Date) {\r\n              return `${key}=${value.toISOString()}`;\r\n            }\r\n            if (typeof value === 'string') {\r\n            return `${key}=${value.toString()?.replace(/\\s/g,'')}`;\r\n            }\r\n            return `${key}=${value}`;\r\n          })\r\n          .join('&');\r\n      },\r\n    \r\n    });\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getMarketSchedule failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const getScheduledDaysForDVM = async (\r\n  dvmId: string,\r\n  params?: IScheduledDaysParams\r\n): Promise<string[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetScheduledDaysForDVM/${dvmId}`, params);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getScheduledDaysForDVM failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { IPostShiftRequest, IRSSShiftRequestContainer, IRSSUpdateShift, IRSSUpdateShiftRequest } from '../models';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/ShiftRequests';\r\n\r\nexport const createDVMShiftRequest = async (dvmShiftRequests: IPostShiftRequest): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.post(`${baseUrl}/DVMCreateShiftRequests`, dvmShiftRequests);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: dvmShiftRequests}, 'createDVMShiftRequest failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createRSSShiftRequest = async (\r\n  shiftRequest: IRSSShiftRequestContainer\r\n): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.post(`${baseUrl}/RSSCreateShiftRequest`, shiftRequest);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: shiftRequest}, 'createRSSShiftRequest failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateRSSShiftRequest = async (\r\n  shiftRequest: IRSSUpdateShiftRequest\r\n): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}/RSSUpdateShiftRequest`, shiftRequest);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: shiftRequest}, 'updateRSSShiftRequest failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateRSSShift = async (\r\n  shiftRequest: IRSSUpdateShift\r\n): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}/RSSUpdateShiftRequestByShift`, shiftRequest);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: shiftRequest}, 'updateRSSShift failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const cancelShiftRequest = async (shiftRequestId: number, reason: string): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.put(`${baseUrl}/DVMCancelShiftRequest`, {shiftRequestId, reason});\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: {shiftRequestId, reason}}, 'cancelShiftRequest failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getShiftRequestsCancelationActivity = async (filters?: {\r\n  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;\r\n}): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/cancelation-activity`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getShiftRequestsCancelationActivity failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const acknowledgeCancelation = async (shiftRequestId: number, isAcknowledged: boolean): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}/${shiftRequestId}/acknowledge-cancelation?IsAcknowledged=${isAcknowledged}`, {});\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: {shiftRequestId, isAcknowledged}}, 'acknowledgeCancelation failed');\r\n    return Promise.reject(error);\r\n  }\r\n};","import {\r\n  ICreateConfiguredShift,\r\n  IConfiguredShift,\r\n  IUpdateConfiguredShift,\r\n} from '../models/configured-shifts';\r\nimport { IResponse } from '../models/util';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/ConfiguredShifts';\r\n\r\nexport const getConfiguredShifts = async (\r\n  locationId: string,\r\n  filters?: { page?: number; perPage?: number; sortBy?: string; sortDirection?: string }\r\n): Promise<IResponse<IConfiguredShift[]>> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/paged/${locationId}`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getConfiguredShifts failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createConfiguredShift = async (shift: ICreateConfiguredShift): Promise<string> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}`, { shift });\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({ error, payload: { shift } }, 'createIncentiveRate failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateConfiguredShift = async (shift: IUpdateConfiguredShift): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.put(`${baseUrl}`, { shift });\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({ error, payload: { shift } }, 'updateConfiguredShift failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const deleteConfiguredShift = async (configuredShiftId: number): Promise<any> => {\r\n  try {\r\n    const data = await authFetch.delete(`${baseUrl}/${configuredShiftId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'deleteConfiguredShift failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { FC } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport { Box, Button, Fade, Grid, TextField } from '@mui/material';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Edit, Close } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { startEmailChange } from '../../fetch';\r\n\r\ninterface IDvmChangeEmailModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  dvmId: string;\r\n  refetch: () => void;\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  newEmail: Yup.string().email('Invalid email').nullable(),\r\n});\r\n\r\nexport const DvmChangeEmailModal: FC<IDvmChangeEmailModal> = ({\r\n  open,\r\n  onClose,\r\n  dvmId,\r\n  refetch,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  return (\r\n    <Formik\r\n      enableReinitialize={true}\r\n      initialValues={{ newEmail: '' }}\r\n      validationSchema={Schema}\r\n      onSubmit={async (values, actions) => {\r\n        try {\r\n          await startEmailChange(dvmId, values.newEmail);\r\n          actions.resetForm();\r\n          onClose();\r\n          refetch();\r\n        } catch (error: any) {\r\n          const errorMessage = error?.response?.data?.Detail;\r\n          enqueueSnackbar(errorMessage || `Error requesting a change of email, please try again.`, {\r\n            variant: 'error',\r\n          });\r\n          console.log(error);\r\n        }\r\n      }}\r\n    >\r\n      {({\r\n        isSubmitting,\r\n        values,\r\n        initialValues,\r\n        setFieldValue,\r\n        handleSubmit,\r\n        dirty,\r\n        isValid,\r\n        handleBlur,\r\n        errors,\r\n        touched,\r\n        resetForm,\r\n      }) => {\r\n        return (\r\n          <Modal\r\n            open={open}\r\n            onClose={() => {\r\n              resetForm();\r\n              onClose();\r\n            }}\r\n            maxWidth=\"md\"\r\n            title=\"Change Email Address\"\r\n            titleContent={'Change Email Address'}\r\n          >\r\n            <Fade in={open}>\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                <div className={classes.content}>\r\n                  <Grid container spacing={1}>\r\n                    <Grid item xs={12}>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"off\"\r\n                        label={'Email'}\r\n                        name=\"newEmail\"\r\n                        value={values.newEmail}\r\n                        onBlur={handleBlur}\r\n                        size=\"small\"\r\n                        onChange={e => {\r\n                          setFieldValue('newEmail', e.target.value);\r\n                        }}\r\n                        inputProps={{ 'data-lpignore': 'true' }}\r\n                        error={touched.newEmail && errors.newEmail ? true : false}\r\n                        helperText={touched.newEmail && errors.newEmail}\r\n                      />\r\n                    </Grid>\r\n                  </Grid>\r\n                </div>\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!dirty || isSubmitting || !isValid}\r\n                    type=\"submit\"\r\n                    startIcon={<Edit />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Save\r\n                  </Button>\r\n                  <Button\r\n                    className={classes.button}\r\n                    type=\"button\"\r\n                    variant=\"contained\"\r\n                    color=\"inherit\"\r\n                    disabled={isSubmitting}\r\n                    startIcon={<Close />}\r\n                    onClick={() => {\r\n                      //@ts-ignore\r\n                      if (!deepEqual(initialValues, values)) {\r\n                        const result = window.confirm(\r\n                          'You have unsaved changes, are you sure you want to exit?'\r\n                        );\r\n                        if (result) {\r\n                          resetForm();\r\n                          onClose();\r\n                        } else {\r\n                          return;\r\n                        }\r\n                      } else {\r\n                        resetForm();\r\n                        onClose();\r\n                      }\r\n                    }}\r\n                  >\r\n                    Cancel\r\n                  </Button>\r\n                </Box>\r\n              </Form>\r\n            </Fade>\r\n          </Modal>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import {\r\n  Box,\r\n  Button,\r\n  FormControl,\r\n  FormControlLabel,\r\n  FormHelperText,\r\n  Grid,\r\n  InputLabel,\r\n  MenuItem,\r\n  Select,\r\n  TextField,\r\n  Switch,\r\n  Typography,\r\n  Autocomplete,\r\n  Alert,\r\n} from '@mui/material';\r\nimport React, { FC, useState, useEffect, useContext } from 'react';\r\nimport { Loader } from '../../components';\r\nimport { IDVM } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  AssignmentInd,\r\n  Close,\r\n  ContactMail,\r\n  Edit,\r\n  School,\r\n  HomeRepairService,\r\n  CheckCircle,\r\n  Email,\r\n} from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { Formik, Form } from 'formik';\r\nimport { Redirect, useHistory, useParams, Link } from 'react-router-dom';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { updateDvm, updateLimitedDvm, getScheduledShiftCount } from '../../fetch/dvms';\r\n\r\nimport {\r\n  getDvmSchools,\r\n  getDvmStatuses,\r\n  getDvmTypes,\r\n  getMarkets,\r\n  getStates,\r\n} from '../../fetch/lookups';\r\nimport { formatInputPhoneNumber, phoneRegExp } from '../../helpers';\r\nimport { UserContext } from '../../context';\r\nimport { LicenseInfo } from './license-info';\r\nimport { InsuranceInfo } from './insurance-info';\r\nimport { createLicense, updateLicense } from '../../fetch/license';\r\nimport { createInsurance } from '../../fetch/insurance';\r\nimport { IconHeading } from '../../components/icon-heading';\r\nimport { DvmChangeEmailModal } from './dvm-update-email';\r\n\r\nexport interface IDVMProfile {\r\n  dvm: IDVM;\r\n  isLoading: boolean;\r\n  getDVM: () => Promise<void>;\r\n  setIsDirty: React.Dispatch<React.SetStateAction<boolean>>;\r\n}\r\nexport const DvmProfile: FC<IDVMProfile> = ({ dvm, isLoading, getDVM, setIsDirty }) => {\r\n  const [areStatusesLoading, setAreStatusesLoading] = useState(false);\r\n  const [statuses, setStatuses] = useState<IDropdownResponse[]>([]);\r\n  const [areTypesLoading, setAreTypesLoading] = useState(false);\r\n  const [types, setTypes] = useState<IDropdownResponse[]>([]);\r\n  const [areSchoolsLoading, setAreSchoolsLoading] = useState(false);\r\n  const [schools, setSchools] = useState<IDropdownResponse[]>([]);\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const history = useHistory();\r\n  const { dvmId }: { dvmId: string } = useParams();\r\n  const { user, isDVM, isSysAdmin, isRSS, isDVMEmployee } = useContext(UserContext);\r\n  const dvmProfileView = isDVM && !dvmId;\r\n\r\n  const fetchStatuses = async () => {\r\n    setAreStatusesLoading(true);\r\n    try {\r\n      setAreStatusesLoading(true);\r\n      const res = await getDvmStatuses();\r\n      setStatuses(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVM Statuses, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreStatusesLoading(false);\r\n    }\r\n  };\r\n\r\n  const fetchTypes = async () => {\r\n    setAreTypesLoading(true);\r\n    try {\r\n      setAreTypesLoading(true);\r\n      const res = await getDvmTypes();\r\n      setTypes(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVM Types, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreTypesLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areMarketsLoading, setAreMarketsLoading] = useState(true);\r\n  const [markets, setMarkets] = useState<IDropdownResponse[]>([]);\r\n\r\n  const fetchMarkets = async () => {\r\n    setAreMarketsLoading(true);\r\n    try {\r\n      const res = await getMarkets();\r\n      setMarkets(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading markets, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreMarketsLoading(false);\r\n    }\r\n  };\r\n\r\n  const fetchSchools = async () => {\r\n    setAreSchoolsLoading(true);\r\n    try {\r\n      const res = await getDvmSchools();\r\n      setSchools(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading schools, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreSchoolsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areStatesLoading, setAreStatesLoading] = useState(true);\r\n  const [states, setStates] = useState<IDropdownResponse[]>([]);\r\n  const fetchStates = async () => {\r\n    setAreStatesLoading(true);\r\n    try {\r\n      const res = await getStates();\r\n      setStates(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading states, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreStatesLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchStatuses();\r\n    fetchTypes();\r\n    fetchSchools();\r\n    fetchMarkets();\r\n    fetchStates();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const Schema = Yup.object().shape({\r\n    firstName: Yup.string().required('Required'),\r\n    lastName: Yup.string().required('Required'),\r\n    pendingEmailAddress: Yup.string().email('Invalid email').nullable(),\r\n    type: Yup.number(),\r\n    status: Yup.number(),\r\n    address: Yup.string(),\r\n    city: Yup.string(),\r\n    state: Yup.string(),\r\n    zip: Yup.string().length(5),\r\n    phoneNumber: Yup.string().matches(phoneRegExp, {\r\n      excludeEmptyString: true,\r\n      message: 'Invalid phone number',\r\n    }),\r\n    schoolId: Yup.number().nullable().notRequired(),\r\n    vendorId: Yup.string().nullable().notRequired(),\r\n    legalEntityName: Yup.string().nullable().notRequired(),\r\n    graduationYear: Yup.number()\r\n      .integer()\r\n      .min(1900, 'Graduation year must be valid')\r\n      .max(new Date().getFullYear(), 'Graduation year must be valid')\r\n      .notRequired(),\r\n    licenses: Yup.array().of(\r\n      Yup.object()\r\n        .shape({\r\n          state: Yup.mixed().notRequired(),\r\n          expirationDate: Yup.mixed().notRequired(),\r\n          file: Yup.mixed().notRequired(),\r\n        })\r\n        .notRequired()\r\n    ),\r\n    insuranceExpirationDate: Yup.mixed().notRequired(),\r\n    insuranceFile: Yup.mixed().notRequired(),\r\n    enableNotifications: Yup.boolean().required(),\r\n    enableAutomaticPayments: Yup.boolean().required(),\r\n  });\r\n\r\n  const [isChangeEmailModalOpen, setIsChangeEmailModalOpen] = useState(false);\r\n\r\n  // They are a DVM but don't have their data setup correctly, or are trying to URL hack\r\n  if ((isDVM && !dvmId && !user?.validation?.value?.dvmInformation?.dvmId) || (isDVM && dvmId)) {\r\n    return <Redirect to={`not-found`} />;\r\n  }\r\n\r\n  // check user roles to determine what actions they can take/view\r\n  const canViewNotifications = (isSysAdmin: boolean, isRSS: boolean, isDVM: boolean): boolean => {\r\n    return isSysAdmin || isRSS || isDVM;\r\n  };\r\n  const canViewAutoPayments = (isSysAdmin: boolean, isRSS: boolean): boolean => {\r\n    return isSysAdmin || isRSS;\r\n  };\r\n\r\n  if (\r\n    isLoading ||\r\n    areTypesLoading ||\r\n    areStatusesLoading ||\r\n    areSchoolsLoading ||\r\n    areMarketsLoading\r\n  ) {\r\n    return <Loader position=\"centered\" type=\"fullscreen\" />;\r\n  }\r\n\r\n  return (\r\n    <Grid container spacing={3}>\r\n      <Grid item xs={12}>\r\n        <Formik\r\n          enableReinitialize={true}\r\n          validateOnMount\r\n          initialTouched={{\r\n            firstName: true,\r\n            lastName: true,\r\n            type: true,\r\n            status: true,\r\n            address: true,\r\n            city: true,\r\n            state: true,\r\n            zip: true,\r\n            primaryMarketId: true,\r\n            phoneNumber: true,\r\n            vendor1099Id: true,\r\n            vendorW2Id: true,\r\n            employeeId: true,\r\n            authorizedStateIds: true,\r\n          }}\r\n          initialValues={{\r\n            firstName: dvm?.firstName ?? '',\r\n            lastName: dvm?.lastName ?? '',\r\n\r\n            email: dvm?.email ?? '',\r\n            type: dvm?.type ?? 0,\r\n            status: dvm?.status ?? 0,\r\n            address: dvm?.address?.street ?? '',\r\n            city: dvm?.address?.city ?? '',\r\n            state: dvm?.address?.state ?? '',\r\n            stateName: dvm?.address?.stateName ?? '',\r\n            stateId: dvm?.address?.stateId ?? '',\r\n            zip: dvm?.address?.zip ?? '',\r\n            primaryMarketId: !!dvm?.primaryMarketId ? dvm?.primaryMarketId : undefined,\r\n            phoneNumber: formatInputPhoneNumber(dvm?.phone) ?? '',\r\n            schoolId: dvm?.school?.value ?? null,\r\n            graduationYear: dvm?.graduationYear ?? '',\r\n            licenses: dvm?.licenses ?? [],\r\n            insuranceExpirationDate: dvm?.insuranceExpirationDate ?? '',\r\n            insuranceFile: dvm?.insuranceFile ?? null,\r\n            vendor1099Id: dvm?.vendor1099Id ?? null,\r\n            vendorW2Id: dvm?.vendorW2Id ?? null,\r\n            employeeId: dvm?.employeeId ?? null,\r\n            authorizedStateIds:\r\n              dvm?.authorizedStateIds.map(authorizedStateId =>\r\n                states.find(state => +state.value === authorizedStateId)\r\n              ) ?? [],\r\n            legalEntityName: dvm?.legalEntityName ?? null,\r\n            enableNotifications: dvm?.enableNotifications ?? true,\r\n            enableAutomaticPayments: dvm?.enableAutomaticPayments ?? true,\r\n          }}\r\n          validationSchema={Schema}\r\n          onSubmit={async (values, actions) => {\r\n            const data = {\r\n              dvm: {\r\n                status: values.status,\r\n                type: values.type,\r\n                dvmId: dvm?.dvmId ?? 0,\r\n                firstName: values.firstName,\r\n                lastName: values.lastName,\r\n                schoolId: values?.schoolId && values?.schoolId > 0 ? values.schoolId : null,\r\n                graduationYear: values.graduationYear ?? '',\r\n                insuranceFile: values.insuranceFile,\r\n                insuranceExpirationDate: values.insuranceExpirationDate ?? '',\r\n                licenses: values.licenses ?? [],\r\n                phone: values.phoneNumber.replace(/\\D/g, ''),\r\n                vendor1099Id: values.vendor1099Id,\r\n                vendorW2Id: values.vendorW2Id,\r\n                employeeId: values.employeeId,\r\n                authorizedStateIds:\r\n                  values?.authorizedStateIds?.length === 0\r\n                    ? null\r\n                    : values.authorizedStateIds.map(state => Number(state?.value)),\r\n                legalEntityName: values.legalEntityName,\r\n                primaryMarketId: values.primaryMarketId ?? '',\r\n                address: {\r\n                  addressId: dvm?.address?.addressId ?? 0,\r\n                  street: values.address,\r\n                  city: values.city,\r\n                  state: values.state,\r\n                  stateId: values.stateId,\r\n                  stateName: values.stateName,\r\n                  zip: values.zip || null,\r\n                  latitude: dvm?.address?.latitude,\r\n                  longitude: dvm?.address?.longitude,\r\n                },\r\n                enableNotifications: values.enableNotifications ?? true,\r\n                enableAutomaticPayments: values.enableAutomaticPayments ?? true,\r\n              },\r\n            };\r\n\r\n            if (data?.dvm?.status === 3) {\r\n              const res = await getScheduledShiftCount(Number(dvmId));\r\n              if (res?.upcomingApprovedShiftsCount > 0) {\r\n                const confirmation = window.confirm(\r\n                  `Deactivating this user will cancel ${res.upcomingApprovedShiftsCount} upcoming shifts. Are you sure?`\r\n                );\r\n\r\n                if (!confirmation) {\r\n                  return;\r\n                }\r\n              } else {\r\n                const confirmation = window.confirm(\r\n                  `You are setting this user to Deactivated. Confirm if you would like to proceed.`\r\n                );\r\n\r\n                if (!confirmation) {\r\n                  return;\r\n                }\r\n              }\r\n            }\r\n\r\n            try {\r\n              dvmProfileView ? await updateLimitedDvm(data) : await updateDvm(data);\r\n              for await (let license of values.licenses) {\r\n                license.licenseId > 0\r\n                  ? await updateLicense(license, dvm?.dvmId ?? 0)\r\n                  : await createLicense(license, dvm?.dvmId ?? 0);\r\n              }\r\n              if (values?.insuranceFile && !dvm?.insuranceFile) {\r\n                await createInsurance(values.insuranceFile, dvm?.dvmId ?? 0);\r\n              }\r\n              enqueueSnackbar(`DVM updated!`, {\r\n                variant: 'success',\r\n              });\r\n              setIsDirty(false);\r\n              getDVM();\r\n              !dvmProfileView && history.push('/dvms');\r\n            } catch (error: any) {\r\n              const errorMessage = error?.response?.data?.Detail;\r\n              enqueueSnackbar(errorMessage || `Error updating this DVM, please try again.`, {\r\n                variant: 'error',\r\n              });\r\n            }\r\n          }}\r\n        >\r\n          {({\r\n            isSubmitting,\r\n            values,\r\n            initialValues,\r\n            setFieldValue,\r\n            handleSubmit,\r\n            dirty,\r\n            isValid,\r\n            handleBlur,\r\n            errors,\r\n            touched,\r\n            validateForm,\r\n          }) => {\r\n            return (\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\" className={classes.form}>\r\n                {(isSubmitting || isLoading) && (\r\n                  <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />\r\n                )}\r\n                <Grid container spacing={6} paddingBottom={'24px'}>\r\n                  <Grid item xs={12}>\r\n                    <Typography variant=\"body1\">\r\n                      <span style={{ fontWeight: 'bold' }}>Email:</span>{' '}\r\n                      {dvm?.email ?? 'No Email provided.'}\r\n                    </Typography>\r\n                    {dvm.pendingEmailAddress && (\r\n                      <Alert severity={'warning'}>\r\n                        Email ({dvm?.pendingEmailAddress}) is Pending.\r\n                      </Alert>\r\n                    )}\r\n                  </Grid>\r\n                  <Grid item container xs={12} md={6}>\r\n                    <IconHeading title=\"Contact Information\" icon={ContactMail} variant=\"h2\" />\r\n\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"First Name\"\r\n                          name=\"name\"\r\n                          value={values.firstName}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('firstName', e.target.value);\r\n                          }}\r\n                          inputProps={{ 'data-lpignore': 'true' }}\r\n                          error={touched.firstName && errors.firstName ? true : false}\r\n                          helperText={touched.firstName && errors.firstName}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Last Name\"\r\n                          name=\"name\"\r\n                          value={values.lastName}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('lastName', e.target.value);\r\n                          }}\r\n                          inputProps={{ 'data-lpignore': 'true' }}\r\n                          error={touched.lastName && errors.lastName ? true : false}\r\n                          helperText={touched.lastName && errors.lastName}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <FormControl fullWidth variant=\"standard\" size=\"small\">\r\n                          <InputLabel htmlFor=\"typesLabel\">Type</InputLabel>\r\n                          <Select\r\n                            fullWidth\r\n                            name=\"types\"\r\n                            labelId=\"typesLabel\"\r\n                            id=\"types\"\r\n                            disabled={areTypesLoading}\r\n                            error={errors && errors.type ? true : false}\r\n                            value={values.type}\r\n                            onBlurCapture={() => setIsDirty(dirty)}\r\n                            onChange={e => {\r\n                              if (e.target.value === 2) {\r\n                                setFieldValue('legalEntityName', '');\r\n                              }\r\n                              setFieldValue('type', e.target.value as string);\r\n                            }}\r\n                          >\r\n                            {types?.map((type: IDropdownResponse, index) => {\r\n                              return (\r\n                                <MenuItem key={`${index + 1}`} value={type.value}>\r\n                                  {type.description}\r\n                                </MenuItem>\r\n                              );\r\n                            })}\r\n                          </Select>\r\n                          {touched?.type && errors?.type && (\r\n                            <FormHelperText error>Required</FormHelperText>\r\n                          )}\r\n                        </FormControl>\r\n                      </Grid>\r\n                    )}\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <FormControl fullWidth variant=\"standard\" size=\"small\">\r\n                          <InputLabel htmlFor=\"statusesLabel\">Status</InputLabel>\r\n                          <Select\r\n                            fullWidth\r\n                            name=\"statuses\"\r\n                            labelId=\"statusesLabel\"\r\n                            id=\"statuses\"\r\n                            disabled={areStatusesLoading}\r\n                            error={errors && errors.status ? true : false}\r\n                            value={values.status}\r\n                            onBlurCapture={() => setIsDirty(dirty)}\r\n                            onChange={e => {\r\n                              setFieldValue('status', e.target.value as string);\r\n                            }}\r\n                          >\r\n                            {statuses?.map((status: IDropdownResponse, index) => {\r\n                              return (\r\n                                <MenuItem key={`${index + 1}`} value={status.value}>\r\n                                  {status.description}\r\n                                </MenuItem>\r\n                              );\r\n                            })}\r\n                          </Select>\r\n                          {touched?.status && errors?.status && (\r\n                            <FormHelperText error>Required</FormHelperText>\r\n                          )}\r\n                        </FormControl>\r\n                      </Grid>\r\n                    )}\r\n                    <Grid item xs={12}>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Address\"\r\n                        name=\"address\"\r\n                        value={values.address}\r\n                        onBlur={handleBlur}\r\n                        size=\"small\"\r\n                        onBlurCapture={() => setIsDirty(dirty)}\r\n                        onChange={e => {\r\n                          setFieldValue('address', e.target.value);\r\n                        }}\r\n                        inputProps={{ 'data-lpignore': 'true' }}\r\n                        error={touched.address && errors.address ? true : false}\r\n                        helperText={touched.address && errors.address}\r\n                      />\r\n                    </Grid>\r\n                    <Grid item xs={12}>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"City\"\r\n                        name=\"city\"\r\n                        value={values.city}\r\n                        onBlur={handleBlur}\r\n                        size=\"small\"\r\n                        onBlurCapture={() => setIsDirty(dirty)}\r\n                        onChange={e => {\r\n                          setFieldValue('city', e.target.value);\r\n                        }}\r\n                        error={touched.city && errors.city ? true : false}\r\n                        helperText={touched.city && errors.city}\r\n                      />\r\n                    </Grid>\r\n                    <Grid item xs={12}>\r\n                      <FormControl fullWidth variant=\"standard\" size=\"small\">\r\n                        <InputLabel htmlFor=\"stateLabel\">State</InputLabel>\r\n                        <Select\r\n                          fullWidth\r\n                          name=\"state\"\r\n                          labelId=\"stateLabel\"\r\n                          id=\"state\"\r\n                          disabled={areStatesLoading}\r\n                          error={errors && errors.stateId ? true : false}\r\n                          value={values.stateId}\r\n                          onChange={e => {\r\n                            const selectedState = states.find(\r\n                              state => e.target.value === state.value\r\n                            );\r\n                            setFieldValue('stateId', e.target.value);\r\n                            setFieldValue('state', selectedState?.shorthand ?? '');\r\n                            setFieldValue('stateName', selectedState?.description ?? '');\r\n                          }}\r\n                        >\r\n                          {states?.map((state: IDropdownResponse, index) => {\r\n                            return (\r\n                              <MenuItem key={`${index}`} value={state.value}>\r\n                                {state.description}\r\n                              </MenuItem>\r\n                            );\r\n                          })}\r\n                        </Select>\r\n                        {touched?.state && errors?.state && (\r\n                          <FormHelperText error>Required</FormHelperText>\r\n                        )}\r\n                      </FormControl>\r\n                    </Grid>\r\n                    <Grid item xs={12}>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Zip\"\r\n                        name=\"zip\"\r\n                        value={values.zip}\r\n                        onBlur={handleBlur}\r\n                        size=\"small\"\r\n                        onBlurCapture={() => setIsDirty(dirty)}\r\n                        onChange={e => {\r\n                          const re = /^[0-9\\b]+$/;\r\n                          // if value is not blank, then test the regex\r\n                          if (e.target.value === '' || re.test(e.target.value)) {\r\n                            setFieldValue('zip', e.target.value);\r\n                          }\r\n                        }}\r\n                        error={touched.zip && errors.zip ? true : false}\r\n                        helperText={touched.zip && errors.zip}\r\n                      />\r\n                    </Grid>\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <FormControl fullWidth variant=\"standard\" size=\"small\">\r\n                          <InputLabel htmlFor=\"primaryMarketLabel\">Primary Market</InputLabel>\r\n                          <Select\r\n                            fullWidth\r\n                            name=\"primaryMarket\"\r\n                            labelId=\"primaryMarketLabel\"\r\n                            id=\"primaryMarket\"\r\n                            disabled={areMarketsLoading}\r\n                            error={errors?.primaryMarketId ? true : false}\r\n                            value={values.primaryMarketId}\r\n                            onBlurCapture={() => setIsDirty(dirty)}\r\n                            onChange={e => {\r\n                              setFieldValue('primaryMarketId', e.target.value as string);\r\n                            }}\r\n                          >\r\n                            <MenuItem key={`${0}`} value={''}>\r\n                              Not Assigned\r\n                            </MenuItem>\r\n                            {markets?.map((market: IDropdownResponse, index) => {\r\n                              return (\r\n                                <MenuItem key={`${index + 1}`} value={market.value}>\r\n                                  {market.description}\r\n                                </MenuItem>\r\n                              );\r\n                            })}\r\n                          </Select>\r\n                        </FormControl>\r\n                      </Grid>\r\n                    )}\r\n                    <Grid item xs={12}>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Phone Number\"\r\n                        name=\"phoneNumber\"\r\n                        value={values.phoneNumber}\r\n                        onBlur={e => {\r\n                          setFieldValue('phoneNumber', formatInputPhoneNumber(e.target.value));\r\n                        }}\r\n                        size=\"small\"\r\n                        onBlurCapture={() => setIsDirty(dirty)}\r\n                        onChange={e => setFieldValue('phoneNumber', e.target.value)}\r\n                        error={touched.phoneNumber && errors.phoneNumber ? true : false}\r\n                        helperText={touched.phoneNumber && errors.phoneNumber}\r\n                      />\r\n                    </Grid>\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Vendor ID (1099)\"\r\n                          name=\"vendor1099Id\"\r\n                          value={values.vendor1099Id}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('vendor1099Id', e.target.value);\r\n                          }}\r\n                          InputLabelProps={{ shrink: !!values.vendor1099Id ?? false }}\r\n                          error={touched.vendor1099Id && errors.vendor1099Id ? true : false}\r\n                          helperText={touched.vendor1099Id && errors.vendor1099Id}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Vendor ID (W2)\"\r\n                          name=\"vendorW2Id\"\r\n                          value={values.vendorW2Id}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('vendorW2Id', e.target.value);\r\n                          }}\r\n                          InputLabelProps={{ shrink: !!values.vendorW2Id ?? false }}\r\n                          error={touched.vendorW2Id && errors.vendorW2Id ? true : false}\r\n                          helperText={touched.vendorW2Id && errors.vendorW2Id}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Employee ID\"\r\n                          name=\"employeeId\"\r\n                          value={values.employeeId}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('employeeId', e.target.value);\r\n                          }}\r\n                          InputLabelProps={{ shrink: !!values.employeeId ?? false }}\r\n                          error={touched.employeeId && errors.employeeId ? true : false}\r\n                          helperText={touched.employeeId && errors.employeeId}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                    {!dvmProfileView && (\r\n                      <Grid item xs={12}>\r\n                        <Autocomplete\r\n                          multiple\r\n                          value={values.authorizedStateIds}\r\n                          onChange={(event, newValue: any) => {\r\n                            setFieldValue('authorizedStateIds', newValue);\r\n                          }}\r\n                          disabled={areStatesLoading}\r\n                          selectOnFocus\r\n                          handleHomeEndKeys\r\n                          loading={areStatesLoading}\r\n                          id=\"selected-states\"\r\n                          options={states || []}\r\n                          getOptionLabel={(option: any) => {\r\n                            // Value selected with enter, right from the input\r\n                            if (typeof option === 'string') {\r\n                              return option;\r\n                            }\r\n                            return `${option?.description}`;\r\n                          }}\r\n                          renderInput={params => (\r\n                            <TextField\r\n                              {...params}\r\n                              key={params.id}\r\n                              size=\"small\"\r\n                              autoComplete=\"on\"\r\n                              label=\"Authorized States\"\r\n                              variant=\"standard\"\r\n                            />\r\n                          )}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                    {(isSysAdmin || isRSS) && values.type === 1 && (\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Legal Entity Name\"\r\n                          name=\"legalEntityName\"\r\n                          value={values.legalEntityName}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('legalEntityName', e.target.value);\r\n                          }}\r\n                          InputLabelProps={{ shrink: !!values.legalEntityName ?? false }}\r\n                          error={touched.legalEntityName && errors.legalEntityName ? true : false}\r\n                          helperText={touched.legalEntityName && errors.legalEntityName}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                  </Grid>\r\n\r\n                  <Grid item spacing={5} container xs={12} md={6}>\r\n                    {canViewNotifications(isSysAdmin, isRSS, isDVM) && (\r\n                      <Grid item xs={12}>\r\n                        <IconHeading title=\"Notifications\" icon={CheckCircle} variant=\"h2\" />\r\n                        <FormControlLabel\r\n                          control={\r\n                            <Switch\r\n                              checked={values.enableNotifications}\r\n                              onChange={e => {\r\n                                setFieldValue('enableNotifications', e.target.checked);\r\n                              }}\r\n                              inputProps={{ 'aria-label': 'controlled' }}\r\n                            />\r\n                          }\r\n                          label=\"Enable Notifications\"\r\n                        />\r\n                        {canViewAutoPayments(isSysAdmin, isRSS) && (\r\n                          <FormControlLabel\r\n                            control={\r\n                              <Switch\r\n                                checked={values.enableAutomaticPayments}\r\n                                onChange={e => {\r\n                                  setFieldValue('enableAutomaticPayments', e.target.checked);\r\n                                }}\r\n                                inputProps={{ 'aria-label': 'controlled' }}\r\n                              />\r\n                            }\r\n                            label=\"Enable Automatic Payments\"\r\n                          />\r\n                        )}\r\n                        <Typography className={classes.optOutText}>\r\n                          By enabling notifications I agree to receive messaging at the phone number\r\n                          provided above, data rates may apply, reply STOP to opt out.\r\n                        </Typography>\r\n                        <Grid item mt={2}>\r\n                          <Link className={classes.linksToTerms} to=\"/privacy-policy\">Privacy Policy</Link>\r\n                          <span> | </span> \r\n                          <Link className={classes.linksToTerms} to=\"/terms-and-conditions\">Terms & Conditions</Link>\r\n                        </Grid>\r\n                      </Grid>\r\n                    )}\r\n\r\n                    <Grid item xs={12}>\r\n                      <IconHeading variant=\"h2\" icon={School} title=\"Education and Certification\" />\r\n                      <FormControl fullWidth variant=\"standard\" size=\"small\">\r\n                        <InputLabel shrink={!!values.schoolId} htmlFor=\"schoolLabel\">\r\n                          School\r\n                        </InputLabel>\r\n                        <Select\r\n                          fullWidth\r\n                          name=\"school\"\r\n                          labelId=\"schoolLabel\"\r\n                          id=\"school\"\r\n                          disabled={areSchoolsLoading || dvmProfileView}\r\n                          error={touched.schoolId && errors && errors.schoolId ? true : false}\r\n                          value={values.schoolId}\r\n                          onBlurCapture={() => setIsDirty(dirty)}\r\n                          onChange={e => {\r\n                            setFieldValue('schoolId', e.target.value as string);\r\n                          }}\r\n                        >\r\n                          {schools?.map((school: IDropdownResponse, index) => {\r\n                            return (\r\n                              <MenuItem key={`${index + 1}`} value={school.value}>\r\n                                {school.description}\r\n                              </MenuItem>\r\n                            );\r\n                          })}\r\n                        </Select>\r\n                        {touched?.schoolId && errors?.schoolId && (\r\n                          <FormHelperText error>Required</FormHelperText>\r\n                        )}\r\n                      </FormControl>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Graduation Year\"\r\n                        name=\"graduationYear\"\r\n                        value={values.graduationYear}\r\n                        disabled={dvmProfileView}\r\n                        inputProps={{\r\n                          shrink: !values.graduationYear,\r\n                        }}\r\n                        onBlur={handleBlur}\r\n                        size=\"small\"\r\n                        onBlurCapture={() => setIsDirty(dirty)}\r\n                        onChange={e => {\r\n                          const re = /^[0-9\\b]+$/;\r\n                          // if value is not blank, then test the regex\r\n                          if (e.target.value === '' || re.test(e.target.value)) {\r\n                            setFieldValue('graduationYear', e.target.value);\r\n                          }\r\n                        }}\r\n                        error={touched.graduationYear && errors.graduationYear ? true : false}\r\n                        helperText={touched.graduationYear && errors.graduationYear}\r\n                      />\r\n                    </Grid>\r\n                    <Grid item xs={12}>\r\n                      <IconHeading\r\n                        variant=\"h2\"\r\n                        icon={AssignmentInd}\r\n                        title=\"License Information\"\r\n                        style={{ marginBottom: '1rem' }}\r\n                      />\r\n                      <LicenseInfo\r\n                        licenses={values.licenses}\r\n                        setFieldValue={setFieldValue}\r\n                        isLoading={isLoading}\r\n                        validateForm={validateForm}\r\n                        errors={errors}\r\n                        values={values}\r\n                        fetchDVM={async () => await getDVM()}\r\n                        readOnly={dvmProfileView}\r\n                      />\r\n                    </Grid>\r\n                    <Grid item xs={12}>\r\n                      <IconHeading\r\n                        variant=\"h2\"\r\n                        icon={HomeRepairService}\r\n                        title=\"Insurance Information\"\r\n                        style={{ marginBottom: '1rem' }}\r\n                      />\r\n                      <InsuranceInfo\r\n                        insuranceFile={values.insuranceFile}\r\n                        insuranceExpirationDate={values.insuranceExpirationDate}\r\n                        dvmId={dvm?.dvmId ?? 0}\r\n                        fetchDVM={getDVM}\r\n                        setFieldValue={setFieldValue}\r\n                        isLoading={isLoading}\r\n                        validateForm={validateForm}\r\n                        errors={errors}\r\n                        readOnly={dvmProfileView}\r\n                      />\r\n                    </Grid>\r\n                  </Grid>\r\n                </Grid>\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!dirty || isSubmitting || isLoading || !isValid}\r\n                    type=\"submit\"\r\n                    startIcon={<Edit />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Update\r\n                  </Button>\r\n                  {!isDVMEmployee && (\r\n                    <Button\r\n                      className={classes.button}\r\n                      type=\"button\"\r\n                      variant=\"contained\"\r\n                      color=\"inherit\"\r\n                      disabled={isSubmitting}\r\n                      startIcon={<Close />}\r\n                      onClick={() => {\r\n                        //@ts-ignore\r\n                        if (!deepEqual(initialValues, values)) {\r\n                          const result = window.confirm(\r\n                            'You have unsaved changes, are you sure you want to exit?'\r\n                          );\r\n                          if (result) {\r\n                            dvmProfileView ? history.goBack() : history.push('/dvms');\r\n                          } else {\r\n                            return;\r\n                          }\r\n                        } else {\r\n                          dvmProfileView ? history.goBack() : history.push('/dvms');\r\n                        }\r\n                      }}\r\n                    >\r\n                      {dvmProfileView ? 'Back' : 'Cancel'}\r\n                    </Button>\r\n                  )}\r\n                  {!dvmProfileView && (\r\n                    <Button\r\n                      className={classes.button}\r\n                      type=\"button\"\r\n                      variant=\"contained\"\r\n                      color=\"primary\"\r\n                      disabled={isSubmitting}\r\n                      startIcon={<Email />}\r\n                      onClick={() => {\r\n                        setIsChangeEmailModalOpen(true);\r\n                      }}\r\n                    >\r\n                      {'Change Email Address'}\r\n                    </Button>\r\n                  )}\r\n                </Box>\r\n              </Form>\r\n            );\r\n          }}\r\n        </Formik>\r\n      </Grid>\r\n      <DvmChangeEmailModal\r\n        open={isChangeEmailModalOpen}\r\n        onClose={() => setIsChangeEmailModalOpen(false)}\r\n        dvmId={dvmId}\r\n        refetch={() => getDVM()}\r\n      />\r\n    </Grid>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  form: {\r\n    marginBottom: theme.spacing(2),\r\n  },\r\n  optOutText: {\r\n    fontWeight: 'bold',\r\n    marginTop: theme.spacing(1),\r\n    color: theme.palette.common.black,\r\n  },\r\n  linksToTerms: {\r\n    color: theme.palette.common.black,\r\n    '&:hover': {\r\n      color: theme.palette.primary.main,\r\n    },\r\n  }\r\n}));\r\n","import { FC, useEffect, useState } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Box,\r\n  Button,\r\n  FormControl,\r\n  FormHelperText,\r\n  Grid,\r\n  InputLabel,\r\n  MenuItem,\r\n  Select,\r\n  Typography,\r\n} from '@mui/material';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { getCancelationReasons } from '../../fetch/lookups';\r\nimport { cancelDvmShift } from '../../fetch';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Close, Check } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\n\r\ninterface ICancelScheduleModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  shiftRequestId?: number;\r\n  dvmId?: number;\r\n  fetchRequests: () => {};\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  reason: Yup.string().required('Required'),\r\n});\r\n\r\nexport const CancelScheduleModal: FC<ICancelScheduleModal> = ({\r\n  open,\r\n  onClose,\r\n  shiftRequestId,\r\n  dvmId,\r\n  fetchRequests,\r\n}) => {\r\n  const [isLoadingReasons, setLoadingReasons] = useState(false);\r\n  const [reasons, setReasons] = useState<IDropdownResponse[]>([]);\r\n\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const fetchCancelationReasons = async () => {\r\n    setLoadingReasons(true);\r\n    try {\r\n      const res = await getCancelationReasons();\r\n      setReasons(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading Cancelation Reasons, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setLoadingReasons(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchCancelationReasons();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize={true}\r\n        initialValues={{\r\n          reason: '',\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          const data = {\r\n            shiftRequestId: shiftRequestId ?? 0,\r\n            dvmId: dvmId ?? 0,\r\n            reason: values.reason ?? '',\r\n          };\r\n          try {\r\n            await cancelDvmShift(data?.shiftRequestId, data?.dvmId, data?.reason);\r\n            fetchRequests();\r\n            onClose();\r\n            actions.resetForm();\r\n            enqueueSnackbar(`Schedule updated!`, {\r\n              variant: 'success',\r\n            });\r\n          } catch (error: any) {\r\n            const errorMessage = error?.response?.data?.Detail;\r\n            enqueueSnackbar(\r\n              errorMessage || `Error updating this scheduled shift, please try again.`,\r\n              {\r\n                variant: 'error',\r\n              }\r\n            );\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          handleBlur,\r\n          errors,\r\n          touched,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                resetForm();\r\n                onClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                <div>\r\n                  <Typography variant=\"h5\">Please select a reason for cancelation:</Typography>\r\n                  <div className={classes.content}>\r\n                    <Grid container spacing={1}>\r\n                      <Grid item xs={12}>\r\n                        <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                          <InputLabel htmlFor=\"reasonsLabel\">Reason</InputLabel>\r\n                          <Select\r\n                            className={classes.reasonSelector}\r\n                            fullWidth\r\n                            name=\"reasons\"\r\n                            labelId=\"reasonsLabel\"\r\n                            id=\"reasons\"\r\n                            disabled={isLoadingReasons}\r\n                            error={errors && errors.reason ? true : false}\r\n                            value={values.reason}\r\n                            onChange={e => {\r\n                              setFieldValue('reason', e.target.value as string);\r\n                            }}\r\n                          >\r\n                            {reasons?.map((reason: IDropdownResponse, index) => {\r\n                              return (\r\n                                <MenuItem key={`${index + 1}`} value={reason.value}>\r\n                                  {reason.description}\r\n                                </MenuItem>\r\n                              );\r\n                            })}\r\n                          </Select>\r\n                          {touched?.reason && errors?.reason && (\r\n                            <FormHelperText error>Required</FormHelperText>\r\n                          )}\r\n                        </FormControl>\r\n                      </Grid>\r\n                    </Grid>\r\n                  </div>\r\n                </div>\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!values.reason || isSubmitting}\r\n                    type=\"submit\"\r\n                    startIcon={<Check />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Confirm\r\n                  </Button>\r\n                  <Button\r\n                    className={classes.button}\r\n                    type=\"button\"\r\n                    variant=\"contained\"\r\n                    color=\"inherit\"\r\n                    disabled={isSubmitting}\r\n                    startIcon={<Close />}\r\n                    onClick={() => {\r\n                      //@ts-ignore\r\n                      if (!deepEqual(initialValues, values)) {\r\n                        const result = window.confirm(\r\n                          'You have unsaved changes, are you sure you want to exit?'\r\n                        );\r\n                        if (result) {\r\n                          resetForm();\r\n                          onClose();\r\n                        } else {\r\n                          return;\r\n                        }\r\n                      } else {\r\n                        resetForm();\r\n                        onClose();\r\n                      }\r\n                    }}\r\n                  >\r\n                    Cancel\r\n                  </Button>\r\n                </Box>\r\n              </Form>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  reasonSelector: {\r\n    cursor: 'pointer',\r\n  },\r\n}));\r\n","export default \"data:image/png;base64,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\"","import makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport coinIncentiveIcon from '../../images/coin-incentive.png';\r\n\r\nimport { FC } from 'react';\r\n\r\nexport interface ICoin {\r\n  maxHeight?: number;\r\n}\r\n\r\nexport const Coin: FC<ICoin> = ({ maxHeight }) => {\r\n  const classes = useStyles({ maxHeight });\r\n\r\n  return <img className={classes.coin} src={coinIncentiveIcon} alt={'incentive-coin'} />;\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { maxHeight: number | undefined }>((theme: Theme) => ({\r\n  coin: {\r\n    maxHeight: ({ maxHeight }) => (maxHeight ? `${maxHeight}px` : '28px'),\r\n    marginLeft: theme.spacing(1),\r\n    marginBottom: '-5px',\r\n  },\r\n}));\r\n","import { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Box, Button, Grid, Link, Typography, useMediaQuery } from '@mui/material';\r\nimport { IColumn } from '../../models/util';\r\nimport { Table } from '../../components/table/Table';\r\nimport { getDvmUpcomingShifts } from '../../fetch';\r\nimport { IDVM, IUpcomingShift } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport { formatDateWithDay, formatMoney } from '../../helpers';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Clear } from '@mui/icons-material';\r\nimport { CancelScheduleModal } from './cancel-schedule-modal';\r\nimport { Coin } from '../../components/icons/coin';\r\n\r\nexport interface IDvmSchedule {\r\n  dvm: IDVM | null;\r\n  isContractor: boolean;\r\n}\r\nexport const DvmSchedule: FC<IDvmSchedule> = ({ dvm, isContractor }) => {\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const [isLoading, setIsLoading] = useState(false);\r\n  const [upcomingShifts, setUpcomingShifts] = useState<IUpcomingShift[]>([]);\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const [shiftId, setShiftId] = useState<number>();\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const classes = useStyles({ isMobile });\r\n\r\n  const fetchUpcomingShifts = async () => {\r\n    setIsLoading(true);\r\n    try {\r\n      const res = await getDvmUpcomingShifts(dvm?.dvmId ?? 0);\r\n      setUpcomingShifts(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading upcoming shifts, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchUpcomingShifts();\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const handleCancel = (shiftId: number, dvmId: number) => {\r\n    setShiftId(shiftId);\r\n    setIsModalOpen(true);\r\n  };\r\n\r\n  const handleClose = () => {\r\n    setShiftId(undefined);\r\n    setIsModalOpen(false);\r\n  };\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return (\r\n      [\r\n        {\r\n          Header: 'Date',\r\n          accessor: 'date',\r\n          Cell: ({\r\n            cell: {\r\n              row: { original },\r\n            },\r\n          }: {\r\n            cell: { row: { original: IUpcomingShift } };\r\n          }) => {\r\n            return <span>{formatDateWithDay(original.shiftDate)}</span>;\r\n          },\r\n        },\r\n        {\r\n          Header: 'Location Name',\r\n          accessor: 'locationName',\r\n          Cell: ({\r\n            cell: {\r\n              row: { original },\r\n            },\r\n          }: {\r\n            cell: { row: { original: IUpcomingShift } };\r\n          }) => {\r\n            return (\r\n              <Link href={original.googleMapsUrl} target={'_blank'}>\r\n                {original.locationName}\r\n              </Link>\r\n            );\r\n          },\r\n        },\r\n        {\r\n          Header: 'Shift Hours',\r\n          accessor: 'shiftTime',\r\n        },\r\n        {\r\n          Header: 'Rate',\r\n          accessor: 'amount',\r\n          columnAlignment: 'right' as 'right',\r\n          // TypeScript was complaining this was set as 'string' and not 'left' | 'center' | 'right' I think it has to do with the filters\r\n          Cell: ({\r\n            cell: {\r\n              row: { original },\r\n            },\r\n          }: {\r\n            cell: { row: { original: IUpcomingShift } };\r\n          }) => {\r\n            return <span>{formatMoney(original.amount, 0)}</span>;\r\n          },\r\n        },\r\n        {\r\n          Header: 'Incentive',\r\n          accessor: 'incentive',\r\n          // TypeScript was complaining this was set as 'string' and not 'left' | 'center' | 'right' I think it has to do with the filters\r\n          columnAlignment: 'right' as 'right',\r\n          Cell: ({\r\n            cell: {\r\n              row: { original },\r\n            },\r\n          }: {\r\n            cell: { row: { original: IUpcomingShift } };\r\n          }) => {\r\n            return (\r\n              <span>\r\n                {original?.incentive ? <Coin maxHeight={20} /> : null}{' '}\r\n                {original?.incentive ? formatMoney(original.incentive, 0) : null}\r\n              </span>\r\n            );\r\n          },\r\n        },\r\n        {\r\n          Header: 'Total Payment',\r\n          accessor: 'totalPayment',\r\n          // TypeScript was complaining this was set as 'string' and not 'left' | 'center' | 'right' I think it has to do with the filters\r\n          columnAlignment: 'right' as 'right',\r\n          Cell: ({\r\n            cell: {\r\n              row: { original },\r\n            },\r\n          }: {\r\n            cell: { row: { original: IUpcomingShift } };\r\n          }) => {\r\n            return (\r\n              <span className={classes.noWrap}>\r\n                {original?.incentive && isMobile ? <Coin maxHeight={20} /> : null}{' '}\r\n                {original?.totalPayment ? formatMoney(original.totalPayment, 0) : null}\r\n              </span>\r\n            );\r\n          },\r\n        },\r\n        {\r\n          Header: '',\r\n          accessor: 'actions',\r\n          id: 'actions',\r\n          Cell: ({\r\n            cell: {\r\n              row: { original },\r\n            },\r\n          }: {\r\n            cell: { row: { original: IUpcomingShift } };\r\n          }) => {\r\n            return (\r\n              <Box\r\n                sx={{\r\n                  textAlign: {\r\n                    xs: 'left',\r\n                    md: 'center',\r\n                  },\r\n                }}\r\n              >\r\n                <Button\r\n                  className={classes.cancelButton}\r\n                  color=\"primary\"\r\n                  onClick={() => handleCancel(original.shiftId, dvm?.dvmId ?? 0)}\r\n                >\r\n                  <Clear />\r\n                  {isMobile ? null : ' Cancel'}\r\n                </Button>\r\n              </Box>\r\n            );\r\n          },\r\n        },\r\n      ]\r\n        // This removes the columns that are not needed for the full time employee view\r\n        .filter(column => (isContractor ? true : column.accessor !== 'incentive'))\r\n        .filter(column => (isContractor ? true : column.accessor !== 'totalPayment'))\r\n        .filter(column => (isContractor ? true : column.accessor !== 'amount'))\r\n        .filter(column => (isContractor ? true : column.accessor !== 'actions'))\r\n    );\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isMobile]);\r\n\r\n  return (\r\n    <>\r\n      <Grid container spacing={6}>\r\n        <Grid className={classes.centered} item xs={12}>\r\n          <div style={isMobile ? { width: '100%' } : undefined}>\r\n            {!isLoading && upcomingShifts.length < 1 ? (\r\n              <Typography>No upcoming scheduled shifts</Typography>\r\n            ) : (\r\n              <Table\r\n                containerClasses={classes.tableOverflow}\r\n                headerClasses={classes.tableCell}\r\n                cellClasses={classes.tableCell}\r\n                columns={columns\r\n                  .filter(col =>\r\n                    isMobile\r\n                      ? col.accessor === 'date' ||\r\n                        col.accessor === 'locationName' ||\r\n                        col.accessor === 'totalPayment' ||\r\n                        col.accessor === 'shiftTime' ||\r\n                        col.accessor === 'actions'\r\n                      : true\r\n                  )\r\n                  .map(col =>\r\n                    col.Header === 'Total Payment' ? { ...col, Header: 'Payment' } : col\r\n                  )}\r\n                data={upcomingShifts}\r\n                hidePagination\r\n                isLoading={isLoading}\r\n              />\r\n            )}\r\n          </div>\r\n        </Grid>\r\n      </Grid>\r\n      <CancelScheduleModal\r\n        open={isModalOpen}\r\n        onClose={handleClose}\r\n        shiftRequestId={shiftId}\r\n        dvmId={dvm?.dvmId ?? 0}\r\n        fetchRequests={() => fetchUpcomingShifts()}\r\n      />\r\n    </>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme, { isMobile: boolean }>((theme: Theme) => ({\r\n  shiftTableWrapper: {\r\n    width: '100%',\r\n  },\r\n  centered: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-start',\r\n  },\r\n  cancelButton: {\r\n    width: '100%',\r\n    maxWidth: '125px',\r\n    minWidth: '1px',\r\n    padding: ({ isMobile }) => (isMobile ? 0 : '6px 16px'),\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n      marginRight: ({ isMobile }) => (isMobile ? 0 : '6px'),\r\n    },\r\n  },\r\n  noWrap: {\r\n    whiteSpace: 'nowrap',\r\n  },\r\n  tableOverflow: {\r\n    overflowY: 'auto',\r\n  },\r\n  tableCell: {\r\n    padding: ({ isMobile }) => (isMobile ? '6px' : '6px 16px'),\r\n  },\r\n}));\r\n","import { FC, useEffect, useState } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Box,\r\n  Button,\r\n  FormControl,\r\n  FormHelperText,\r\n  Grid,\r\n  InputLabel,\r\n  MenuItem,\r\n  Select,\r\n  Typography,\r\n} from '@mui/material';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { getCancelationReasons } from '../../fetch/lookups';\r\nimport { cancelShiftRequest } from '../../fetch';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Close, Check } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\n\r\ninterface ICancelRequestModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  shiftRequestId?: number;\r\n  fetchPendingRequests: () => {};\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  reason: Yup.string().required('Required'),\r\n});\r\n\r\nexport const CancelRequestModal: FC<ICancelRequestModal> = ({\r\n  open,\r\n  onClose,\r\n  shiftRequestId,\r\n  fetchPendingRequests,\r\n}) => {\r\n  const [isLoadingReasons, setLoadingReasons] = useState(false);\r\n  const [reasons, setReasons] = useState<IDropdownResponse[]>([]);\r\n\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const fetchCancelationReasons = async () => {\r\n    setLoadingReasons(true);\r\n    try {\r\n      const res = await getCancelationReasons();\r\n      setReasons(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading Cancelation Reasons, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setLoadingReasons(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchCancelationReasons();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize={true}\r\n        initialValues={{\r\n          reason: '',\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          const data = {\r\n            shiftRequestId: shiftRequestId ?? 0,\r\n            reason: values.reason ?? '',\r\n          };\r\n          try {\r\n            await cancelShiftRequest(data?.shiftRequestId, data?.reason);\r\n            fetchPendingRequests();\r\n            onClose();\r\n            actions.resetForm();\r\n            enqueueSnackbar(`Requests updated!`, {\r\n              variant: 'success',\r\n            });\r\n          } catch (error: any) {\r\n            const errorMessage = error?.response?.data?.Detail;\r\n            enqueueSnackbar(errorMessage || `Error updating this request, please try again.`, {\r\n              variant: 'error',\r\n            });\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          handleBlur,\r\n          errors,\r\n          touched,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                resetForm();\r\n                onClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                <div>\r\n                  <Typography variant=\"h5\">Please select a reason for cancelation:</Typography>\r\n                  <div className={classes.content}>\r\n                    <Grid container spacing={1}>\r\n                      <Grid item xs={12}>\r\n                        <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                          <InputLabel htmlFor=\"reasonsLabel\">Reason</InputLabel>\r\n                          <Select\r\n                            className={classes.reasonSelector}\r\n                            fullWidth\r\n                            name=\"reasons\"\r\n                            labelId=\"reasonsLabel\"\r\n                            id=\"reasons\"\r\n                            disabled={isLoadingReasons}\r\n                            error={errors && errors.reason ? true : false}\r\n                            value={values.reason}\r\n                            onChange={e => {\r\n                              setFieldValue('reason', e.target.value as string);\r\n                            }}\r\n                          >\r\n                            {reasons?.map((reason: IDropdownResponse, index) => {\r\n                              return (\r\n                                <MenuItem key={`${index + 1}`} value={reason.value}>\r\n                                  {reason.description}\r\n                                </MenuItem>\r\n                              );\r\n                            })}\r\n                          </Select>\r\n                          {touched?.reason && errors?.reason && (\r\n                            <FormHelperText error>Required</FormHelperText>\r\n                          )}\r\n                        </FormControl>\r\n                      </Grid>\r\n                    </Grid>\r\n                  </div>\r\n                </div>\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!values.reason || isSubmitting}\r\n                    type=\"submit\"\r\n                    startIcon={<Check />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Confirm\r\n                  </Button>\r\n                  <Button\r\n                    className={classes.button}\r\n                    type=\"button\"\r\n                    variant=\"contained\"\r\n                    color=\"inherit\"\r\n                    disabled={isSubmitting}\r\n                    startIcon={<Close />}\r\n                    onClick={() => {\r\n                      //@ts-ignore\r\n                      if (!deepEqual(initialValues, values)) {\r\n                        const result = window.confirm(\r\n                          'You have unsaved changes, are you sure you want to exit?'\r\n                        );\r\n                        if (result) {\r\n                          resetForm();\r\n                          onClose();\r\n                        } else {\r\n                          return;\r\n                        }\r\n                      } else {\r\n                        resetForm();\r\n                        onClose();\r\n                      }\r\n                    }}\r\n                  >\r\n                    Cancel\r\n                  </Button>\r\n                </Box>\r\n              </Form>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  reasonSelector: {\r\n    cursor: 'pointer',\r\n  },\r\n}));\r\n","import { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Grid, Typography, Button, Box, useMediaQuery } from '@mui/material';\r\nimport { IColumn } from '../../models/util';\r\nimport { Table } from '../../components/table/Table';\r\nimport { getDvmPendingShiftRequests } from '../../fetch';\r\nimport { IDVM, IPendingShiftRequest } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport { formatDateWithDay, formatMoney } from '../../helpers';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Clear } from '@mui/icons-material';\r\nimport { CancelRequestModal } from './cancel-request-modal';\r\nimport { Coin } from '../../components/icons/coin';\r\n\r\nexport interface IDvmPendingRequests {\r\n  dvm: IDVM | null;\r\n}\r\nexport const DvmPendingRequests: FC<IDvmPendingRequests> = ({ dvm }) => {\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const [isLoading, setIsLoading] = useState(false);\r\n  const [pendingRequests, setPendingRequests] = useState<IPendingShiftRequest[]>([]);\r\n  const [shiftRequestId, setShiftRequestId] = useState<number>();\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const classes = useStyles({ isMobile });\r\n\r\n  const fetchPendingRequests = async () => {\r\n    setIsLoading(true);\r\n    try {\r\n      const res = await getDvmPendingShiftRequests(dvm?.dvmId ?? 0);\r\n      setPendingRequests(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading pending shift requests, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const handleCancel = (shiftRequestId: number) => {\r\n    setShiftRequestId(shiftRequestId);\r\n    setIsModalOpen(true);\r\n  };\r\n\r\n  const handleClose = () => {\r\n    setShiftRequestId(undefined);\r\n    setIsModalOpen(false);\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchPendingRequests();\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'shiftDate',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IPendingShiftRequest } };\r\n        }) => {\r\n          return <span>{formatDateWithDay(original.shiftDate)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Location',\r\n        accessor: 'locationName',\r\n      },\r\n      {\r\n        Header: 'Rate',\r\n        accessor: 'amount',\r\n        columnAlignment: 'right',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IPendingShiftRequest } };\r\n        }) => {\r\n          return <span>{formatMoney(original.amount, 0)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Incentive',\r\n        accessor: 'incentive',\r\n        columnAlignment: 'right',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IPendingShiftRequest } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original?.incentive ? <Coin maxHeight={20} /> : null}{' '}\r\n              {original?.incentive ? formatMoney(original.incentive, 0) : null}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Total Payment',\r\n        accessor: 'totalPayment',\r\n        columnAlignment: 'right',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IPendingShiftRequest } };\r\n        }) => {\r\n          return (\r\n            <span className={classes.noWrap}>\r\n              {original?.incentive && isMobile ? <Coin maxHeight={20} /> : null}{' '}\r\n              {original?.totalPayment ? formatMoney(original.totalPayment, 0) : null}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: 'actions',\r\n        id: 'actions',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IPendingShiftRequest } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.cancelButton}\r\n                color=\"primary\"\r\n                onClick={() => handleCancel(original.shiftRequestId)}\r\n              >\r\n                <Clear />\r\n                {isMobile ? null : ' Cancel'}\r\n              </Button>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isMobile]);\r\n  return (\r\n    <>\r\n      <Grid container spacing={6}>\r\n        <Grid className={classes.centered} item xs={12}>\r\n          <div style={isMobile ? { width: '100%' } : undefined}>\r\n            {!isLoading && pendingRequests.length < 1 ? (\r\n              <Typography align=\"center\">No pending shift requests found.</Typography>\r\n            ) : (\r\n              <Table\r\n                containerClasses={classes.tableOverflow}\r\n                headerClasses={classes.tableCell}\r\n                cellClasses={classes.tableCell}\r\n                columns={columns\r\n                  .filter(col =>\r\n                    isMobile\r\n                      ? col.accessor === 'shiftDate' ||\r\n                        col.accessor === 'locationName' ||\r\n                        col.accessor === 'totalPayment' ||\r\n                        col.accessor === 'actions'\r\n                      : true\r\n                  )\r\n                  .map(col =>\r\n                    col.Header === 'Total Payment' ? { ...col, Header: 'Payment' } : col\r\n                  )}\r\n                data={pendingRequests}\r\n                hidePagination\r\n                isLoading={isLoading}\r\n              />\r\n            )}\r\n          </div>\r\n        </Grid>\r\n      </Grid>\r\n      <CancelRequestModal\r\n        open={isModalOpen}\r\n        onClose={handleClose}\r\n        shiftRequestId={shiftRequestId}\r\n        fetchPendingRequests={() => fetchPendingRequests()}\r\n      />\r\n    </>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme, { isMobile: boolean }>((theme: Theme) => ({\r\n  shiftTableWrapper: {\r\n    width: '100%',\r\n  },\r\n  centered: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-start',\r\n  },\r\n  cancelButton: {\r\n    width: '100%',\r\n    maxWidth: '125px',\r\n    minWidth: '1px',\r\n    padding: ({ isMobile }) => (isMobile ? 0 : '6px 16px'),\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n      marginRight: ({ isMobile }) => (isMobile ? 0 : '6px'),\r\n    },\r\n  },\r\n  noWrap: {\r\n    whiteSpace: 'nowrap',\r\n  },\r\n  tableOverflow: {\r\n    overflowY: 'auto',\r\n  },\r\n  tableCell: {\r\n    padding: ({ isMobile }) => (isMobile ? '6px' : '6px 16px'),\r\n  },\r\n}));\r\n","import { Close, DateRange as DateRangeIcon } from '@mui/icons-material';\r\nimport { Box, IconButton, InputAdornment, Popover, Button } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport TextField from '@mui/material/TextField';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport clsx from 'clsx';\r\nimport { format, isValid, toDate as formatDate } from 'date-fns';\r\nimport { FC, useRef, useState, useEffect } from 'react';\r\nimport { DateRange } from 'react-date-range';\r\nimport 'react-date-range/dist/styles.css'; // main style file\r\nimport { IDateRange } from '../../models/date';\r\n\r\nimport '../../styles/react-date-range-theme.css'; // theme css file\r\n\r\nexport interface DateRangePickerProps {\r\n  value: IDateRange | null;\r\n  onChange: (value: IDateRange) => void;\r\n  id: string;\r\n  className?: string;\r\n  placeholder?: string;\r\n  inputSize?: 'medium' | 'small';\r\n  fullWidth?: boolean;\r\n  label?: string;\r\n  isDisabled?: boolean;\r\n  minDate?: Date | null;\r\n  maxDate?: Date | null;\r\n  showPopover?: boolean;\r\n}\r\n\r\nexport const DateRangePicker: FC<DateRangePickerProps> = ({\r\n  value,\r\n  onChange,\r\n  id,\r\n  placeholder,\r\n  inputSize,\r\n  className,\r\n  fullWidth,\r\n  label,\r\n  isDisabled,\r\n  minDate,\r\n  maxDate,\r\n  showPopover = true,\r\n  ...props\r\n}) => {\r\n  const classes = useStyles({ inputSize });\r\n  const [displayCalendar, setDisplayCalendar] = useState<boolean>(false);\r\n  const [inputValue, setInputValue] = useState(value?.inputValue ?? '');\r\n  const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n  const [fromDate, setFromDate] = useState<Date | null>(value?.startDate ?? null);\r\n  const [toDate, setToDate] = useState<Date | null>(value?.endDate ?? null);\r\n  const dateRangeRef = useRef(null);\r\n\r\n  // if the parent value changes update state\r\n  useEffect(() => {\r\n    setInputValue(value?.inputValue ?? '');\r\n    setFromDate(value?.startDate ?? null);\r\n    setToDate(value?.endDate ?? null);\r\n  }, [value]);\r\n\r\n  const onAdornmentClick = (e: any) => {\r\n    setDisplayCalendar(true);\r\n    setAnchorEl(dateRangeRef.current);\r\n  };\r\n  const onClearClick = (e: any) => {\r\n    e.stopPropagation();\r\n    setDisplayCalendar(false);\r\n    setAnchorEl(null);\r\n    setInputValue('');\r\n    setFromDate(null);\r\n    setToDate(null);\r\n    onChange({ startDate: null, endDate: null, key: 'selection', inputValue: '' }); // callback\r\n  };\r\n  const onInputChange = (e: any) => {\r\n    const inputValue = e.target.value;\r\n    const { fromDate, toDate } = processInputValue(inputValue);\r\n    setInputValue(inputValue);\r\n    setFromDate(fromDate);\r\n    setToDate(toDate);\r\n  };\r\n  const onPopperClose = () => {\r\n    setDisplayCalendar(false);\r\n    setAnchorEl(null);\r\n    onChange({ startDate: fromDate, endDate: toDate, key: 'selection', inputValue }); // callback\r\n  };\r\n  const onSelectDateRanges = ({ selection }: any) => {\r\n    let { startDate, endDate } = selection;\r\n    startDate = isValid(startDate) ? formatDate(startDate) : undefined;\r\n    endDate = isValid(endDate) ? formatDate(endDate) : undefined;\r\n\r\n    let inputValue = '';\r\n    if (startDate) inputValue += format(startDate, 'M/d/yyyy');\r\n    if (endDate) inputValue += ' - ' + format(endDate, 'M/d/yyyy');\r\n\r\n    setFromDate(startDate);\r\n    setToDate(endDate);\r\n    setInputValue(inputValue);\r\n  };\r\n  const processInputValue = (value: any) => {\r\n    let [fromDate, toDate] = value.split('-').map((elm: any) => elm.trim());\r\n\r\n    fromDate = format(fromDate, 'M/dd/yyyy');\r\n    fromDate = fromDate.isValid() ? formatDate(fromDate) : undefined;\r\n\r\n    toDate = format(toDate, 'M/dd/yyyy');\r\n    toDate = toDate.isValid() ? formatDate(toDate) : undefined;\r\n\r\n    return { fromDate, toDate };\r\n  };\r\n\r\n  const clearButton =\r\n    fromDate || toDate ? (\r\n      <IconButton className={classes.clearButton} onClick={onClearClick} size=\"small\">\r\n        <Close />\r\n      </IconButton>\r\n    ) : (\r\n      <></>\r\n    );\r\n  return (\r\n    <div className={clsx(className, fullWidth && classes.fullWidth)} ref={dateRangeRef}>\r\n      <TextField\r\n        fullWidth\r\n        placeholder={placeholder}\r\n        size={inputSize}\r\n        id={id}\r\n        disabled={isDisabled}\r\n        label={label}\r\n        value={inputValue}\r\n        onChange={onInputChange}\r\n        onClick={onAdornmentClick}\r\n        className={classes.pickerInput}\r\n        InputProps={{\r\n          endAdornment: (\r\n            <InputAdornment className={classes.endAdornment} position=\"end\">\r\n              {clearButton}\r\n              <IconButton edge=\"end\" onClick={onAdornmentClick} size=\"small\">\r\n                <DateRangeIcon />\r\n              </IconButton>\r\n            </InputAdornment>\r\n          ),\r\n        }}\r\n      />\r\n\r\n      {showPopover ? (\r\n        <Popover\r\n          id={`${id}-popover`}\r\n          open={displayCalendar}\r\n          anchorEl={anchorEl}\r\n          anchorOrigin={{\r\n            vertical: 'bottom',\r\n            horizontal: 'center',\r\n          }}\r\n          transformOrigin={{\r\n            vertical: 'top',\r\n            horizontal: 'center',\r\n          }}\r\n          onClose={onPopperClose}\r\n          className={clsx(!fromDate && !toDate ? 'isEmpty' : '')}\r\n        >\r\n          <Box>\r\n            {/* @ts-ignore */}\r\n            <DateRange\r\n              ranges={[\r\n                {\r\n                  startDate: fromDate,\r\n                  endDate: toDate,\r\n                  key: 'selection',\r\n                },\r\n              ]}\r\n              onChange={onSelectDateRanges}\r\n              editableDateInputs={false}\r\n              value={value}\r\n              showMonthAndYearPickers={true}\r\n              moveRangeOnFirstSelection={false}\r\n              showDateDisplay={false}\r\n              staticRanges={undefined}\r\n              inputRanges={undefined}\r\n              className={classes.dateRange}\r\n              minDate={minDate}\r\n              maxDate={maxDate}\r\n            />\r\n          </Box>\r\n          <Box className={classes.buttonGroup}>\r\n            <Button className={classes.applyButton} onClick={onPopperClose} color=\"secondary\">\r\n              Apply\r\n            </Button>\r\n          </Box>\r\n        </Popover>\r\n      ) : (\r\n        <Box>\r\n          {/* @ts-ignore */}\r\n          <DateRange\r\n            ranges={[\r\n              {\r\n                startDate: fromDate,\r\n                endDate: toDate,\r\n                key: 'selection',\r\n              },\r\n            ]}\r\n            onChange={onSelectDateRanges}\r\n            editableDateInputs={false}\r\n            value={value}\r\n            showMonthAndYearPickers={true}\r\n            moveRangeOnFirstSelection={false}\r\n            showDateDisplay={false}\r\n            staticRanges={undefined}\r\n            inputRanges={undefined}\r\n            className={classes.dateRangeFullWidth}\r\n            minDate={minDate}\r\n            maxDate={maxDate}\r\n          />\r\n        </Box>\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { inputSize?: string }>(theme => ({\r\n  fullWidth: {\r\n    width: '100%',\r\n  },\r\n  dateRangeFullWidth: {\r\n    width: '100%',\r\n  },\r\n  buttonGroup: {\r\n    padding: theme.spacing(0, 1.5, 1.5, 1.5),\r\n  },\r\n  endAdornment: {\r\n    '@media (max-width: 400px)': {\r\n      marginLeft: -10,\r\n      marginRight: -12,\r\n    },\r\n  },\r\n  clearButton: {\r\n    '@media (max-width: 400px)': {\r\n      marginRight: -12,\r\n    },\r\n  },\r\n  applyButton: {},\r\n  pickerInput: {\r\n    '&& .MuiInputBase-input': {\r\n      color: theme.palette.common.black,\r\n      '-webkit-text-fill-color': theme.palette.common.black, // Display input as normal, not disabled\r\n    },\r\n  },\r\n  dateRange: {},\r\n}));\r\n","import { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Grid, Typography, useMediaQuery } from '@mui/material';\r\nimport { IColumn } from '../../models/util';\r\nimport { Table } from '../../components/table/Table';\r\nimport { getDvmShiftRequestHistory } from '../../fetch';\r\nimport { IDVM, IShiftRequestHistory } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport { formatDate, formatDateWithDay, formatMoney } from '../../helpers';\r\nimport { format } from 'date-fns';\r\nimport { DateRangePicker } from '../../components/input/date-range';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { IDateRange } from '../../models/date';\r\nimport { Check } from '@mui/icons-material';\r\nimport QuestionMarkIcon from '@mui/icons-material/QuestionMark';\r\nimport ClearIcon from '@mui/icons-material/Clear';\r\nimport clsx from 'clsx';\r\nimport { Coin } from '../../components/icons/coin';\r\n\r\nexport interface IDvmRequestHsitory {\r\n  dvm: IDVM | null;\r\n}\r\nexport const DvmRequestHistory: FC<IDvmRequestHsitory> = ({ dvm }) => {\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const [isLoading, setIsLoading] = useState(false);\r\n  const [upcomingShifts, setUpcomingShifts] = useState<IShiftRequestHistory[]>([]);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const classes = useStyles({ isMobile });\r\n\r\n  const fromDate = new Date();\r\n  fromDate.setDate(new Date().getDate() - 29);\r\n\r\n  const toDate = new Date();\r\n  toDate.setDate(new Date().getDate());\r\n\r\n  const [selectedDateRange, setSelectedDateRange] = useState<IDateRange>({\r\n    startDate: null,\r\n    endDate: null,\r\n    key: 'selection',\r\n    inputValue: '',\r\n  });\r\n\r\n  const fetchUpcomingShifts = async () => {\r\n    setIsLoading(true);\r\n    try {\r\n      const res = await getDvmShiftRequestHistory(dvm?.dvmId ?? 0, {\r\n        dateFrom: formatDate(selectedDateRange.startDate) ?? '',\r\n        dateTo: formatDate(selectedDateRange.endDate) ?? '',\r\n      });\r\n      setUpcomingShifts(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading shift request history, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  // set default date range on load\r\n  useEffect(() => {\r\n    if (!selectedDateRange.startDate && !selectedDateRange.endDate) {\r\n      const defaultDateRange = format(fromDate, 'M/d/yyyy') + ' - ' + format(toDate, 'M/d/yyyy');\r\n\r\n      setSelectedDateRange({\r\n        startDate: fromDate,\r\n        endDate: toDate,\r\n        key: defaultDateRange,\r\n        inputValue: defaultDateRange,\r\n      });\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (selectedDateRange.startDate && selectedDateRange.endDate) {\r\n      fetchUpcomingShifts();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedDateRange]);\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'shiftDate',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestHistory } };\r\n        }) => {\r\n          return <span>{`${formatDateWithDay(original.shiftDate)}`}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Location',\r\n        accessor: 'locationName',\r\n      },\r\n      {\r\n        Header: 'Status',\r\n        accessor: 'status',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestHistory } };\r\n        }) => {\r\n          return (\r\n            <>\r\n              <span\r\n                className={clsx(\r\n                  classes.mobileIcon,\r\n                  original.status === 'Approved' ? classes.approvedIcon : '',\r\n                  original.status === 'Rejected' ? classes.rejectedIcon : '',\r\n                  original.status === 'Pending' ? classes.pendingIcon : ''\r\n                )}\r\n              >\r\n                {original.status === 'Approved' ? <Check /> : ''}\r\n                {original.status === 'Pending' ? <QuestionMarkIcon /> : ''}\r\n                {original.status === 'Rejected' ? <ClearIcon /> : ''}\r\n              </span>\r\n              <span className={classes.statusText}>{original.status}</span>\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Rate',\r\n        accessor: 'amount',\r\n        columnAlignment: 'right',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestHistory } };\r\n        }) => {\r\n          return <span>{formatMoney(original.amount, 0)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Incentive',\r\n        accessor: 'incentive',\r\n        columnAlignment: 'right',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestHistory } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original?.incentive ? <Coin maxHeight={20} /> : null}\r\n              {` `}\r\n              {original?.incentive ? formatMoney(original.incentive, 0) : null}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Total Payment',\r\n        accessor: 'totalPayment',\r\n        columnAlignment: 'right',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestHistory } };\r\n        }) => {\r\n          return (\r\n            <span className={classes.noWrap}>\r\n              {original?.incentive && isMobile ? <Coin maxHeight={20} /> : null}{' '}\r\n              {formatMoney(original.totalPayment, 0)}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [isMobile]);\r\n\r\n  return (\r\n    <Grid container spacing={6}>\r\n      <Grid item container xs={12}>\r\n        <Grid item xs={12} lg={3}>\r\n          <DateRangePicker\r\n            id=\"filterDateRange\"\r\n            label=\"Date Range\"\r\n            value={selectedDateRange}\r\n            isDisabled={isLoading}\r\n            onChange={value => {\r\n              setSelectedDateRange(value);\r\n            }}\r\n            fullWidth\r\n            inputSize=\"small\"\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n      <Grid className={classes.centered} item container xs={12}>\r\n        <Grid item xs={12} className={classes.centered}>\r\n          <div style={isMobile ? { width: '100%' } : undefined}>\r\n            {!isLoading && upcomingShifts.length < 1 ? (\r\n              <Typography className={classes.noShiftMessage} align=\"center\">\r\n                No shift request history found.\r\n              </Typography>\r\n            ) : (\r\n              <Table\r\n                containerClasses={classes.tableOverflow}\r\n                headerClasses={classes.tableCell}\r\n                cellClasses={classes.tableCell}\r\n                columns={columns\r\n                  .filter(col =>\r\n                    isMobile\r\n                      ? col.accessor === 'shiftDate' ||\r\n                        col.accessor === 'locationName' ||\r\n                        col.accessor === 'totalPayment' ||\r\n                        col.accessor === 'status'\r\n                      : true\r\n                  )\r\n                  .map(col =>\r\n                    col.Header === 'Total Payment' ? { ...col, Header: 'Payment' } : col\r\n                  )}\r\n                data={upcomingShifts}\r\n                hidePagination\r\n                isLoading={isLoading}\r\n              />\r\n            )}\r\n          </div>\r\n        </Grid>\r\n      </Grid>\r\n    </Grid>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme, { isMobile: boolean }>((theme: Theme) => ({\r\n  centered: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-start',\r\n  },\r\n  noShiftMessage: {\r\n    marginTop: '1em',\r\n  },\r\n  statusText: {\r\n    [theme.breakpoints.down('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  mobileIcon: {\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n    },\r\n  },\r\n  approvedIcon: {\r\n    '& svg': {\r\n      color: theme.palette.success.main,\r\n    },\r\n  },\r\n  rejectedIcon: {\r\n    '& svg': {\r\n      color: theme.palette.error.main,\r\n    },\r\n  },\r\n  pendingIcon: {\r\n    '& svg': {\r\n      color: theme.palette.common.black,\r\n    },\r\n  },\r\n  noWrap: {\r\n    whiteSpace: 'nowrap',\r\n  },\r\n  tableOverflow: {\r\n    overflowY: 'auto',\r\n  },\r\n  tableCell: {\r\n    padding: ({ isMobile }) => (isMobile ? '6px' : '6px 16px'),\r\n  },\r\n}));\r\n","import { AppBar, Button, Grid, Tab, Tabs, useMediaQuery } from '@mui/material';\r\nimport { FC, useEffect, useState, useContext } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { AddBusiness, Place, Store } from '@mui/icons-material';\r\nimport { Link } from 'react-router-dom';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { UserContext } from '../../context';\r\nimport { LocationsTable } from './location-table';\r\nimport { MarketsTable } from './markets-table';\r\nimport { IMarket } from '../../models/markets';\r\nimport { MarketFilters } from './market-filters';\r\nimport { getLocationTypes } from '../../fetch/lookups';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { useSnackbar } from 'notistack';\r\nimport { getDVMMarkets } from '../../fetch';\r\nimport { LocationsFilters } from './locations-filters';\r\n\r\nenum RegionTabs {\r\n  Locations,\r\n  Markets,\r\n}\r\n\r\nexport const Locations: FC = () => {\r\n  const { isPracticeManager, isSysAdmin, isRSS } = useContext(UserContext);\r\n\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [isDeleting, setIsDeleting] = useState(false);\r\n  const [page, setPage] = useState(0);\r\n\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n\r\n  const [selectedTab, setSelectedTab] = useState<RegionTabs>(RegionTabs.Locations);\r\n\r\n  const handleTabChangeWithoutSave = (value: number) => {\r\n    setSelectedTab(value);\r\n  };\r\n\r\n  const classes = useStyles();\r\n\r\n  const [isMarketModalOpen, setIsMarketModalOpen] = useState(false);\r\n  const [currentMarket, setCurrentMarket] = useState<IMarket | undefined>(undefined);\r\n\r\n  const handleAddMarket = () => {\r\n    setIsMarketModalOpen(true);\r\n  };\r\n  const handleEditMarket = (market: IMarket) => {\r\n    setCurrentMarket(market);\r\n    setIsMarketModalOpen(true);\r\n  };\r\n\r\n  const handleCloseMarketModal = () => {\r\n    setCurrentMarket(undefined);\r\n    setIsMarketModalOpen(false);\r\n  };\r\n\r\n  // Search functionality\r\n  const [searchValue, setSearchValue] = useState<string>('');\r\n  const [hasAppliedFilters, setHasAppliedFilters] = useState<boolean>(false);\r\n\r\n  // Search functionality\r\n  const [marketSearchValue, setMarketSearchValue] = useState<string>('');\r\n  const [hasAppliedMarketFilters, setHasAppliedMarketFilters] = useState<boolean>(false);\r\n\r\n  // Filters\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const [selectedLocationType, setSelectedDvmType] = useState('');\r\n  const [selectedMarkets, setSelectedMarkets] = useState<IDropdownResponse[]>([]);\r\n\r\n  const [locationTypes, setLocationTypes] = useState<IDropdownResponse[]>([]);\r\n  const [areLocationTypesLoading, setLocationTypesLoading] = useState(false);\r\n  const loadLocationTypes = async () => {\r\n    setLocationTypesLoading(true);\r\n    try {\r\n      const res = await getLocationTypes();\r\n      setLocationTypes(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading location types, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setLocationTypesLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areMarketsLoading, setAreMarketsLoading] = useState(true);\r\n  const [markets, setMarkets] = useState<IDropdownResponse[]>([]);\r\n\r\n  const fetchMarkets = async () => {\r\n    setAreMarketsLoading(true);\r\n    try {\r\n      const res = await getDVMMarkets();\r\n      setMarkets(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading markets, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreMarketsLoading(false);\r\n    }\r\n  };\r\n  const [filters, setFilters] = useState<{\r\n    locationType?: string;\r\n    marketIds?: string[] | number[];\r\n  }>({\r\n    locationType: undefined,\r\n    marketIds: selectedMarkets?.map(s => s.value),\r\n  });\r\n\r\n  // visibility condition based on roles\r\n  const canViewRoles =  !isPracticeManager || isSysAdmin || isRSS;\r\n\r\n  useEffect(() => {\r\n    fetchMarkets();\r\n    loadLocationTypes();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    setMarketSearchValue('');\r\n    setSearchValue('');\r\n    setPage(0);\r\n    setFilters({});\r\n    setSelectedMarkets([]);\r\n    setSelectedDvmType('');\r\n    setHasAppliedFilters(false);\r\n    setHasAppliedMarketFilters(false);\r\n  }, [selectedTab]);\r\n\r\n  return (\r\n    <Page\r\n      title={'Locations'}\r\n      paddingBottom={24}\r\n      additionalHeaderContent={\r\n        <>\r\n          {selectedTab === RegionTabs.Locations && canViewRoles && (\r\n            <Button\r\n              startIcon={<Place />}\r\n              color=\"primary\"\r\n              variant=\"contained\"\r\n              disabled={isLoading}\r\n              component={Link}\r\n              to=\"/locations/new-location\"\r\n            >\r\n              New Location\r\n            </Button>\r\n          )}\r\n\r\n          {selectedTab === RegionTabs.Markets && (\r\n            <Button\r\n              startIcon={<AddBusiness />}\r\n              color=\"primary\"\r\n              variant=\"contained\"\r\n              disabled={isLoading}\r\n              onClick={() => handleAddMarket()}\r\n            >\r\n              New Market\r\n            </Button>\r\n          )}\r\n        </>\r\n      }\r\n    >\r\n      {(isDeleting || isLoading) && (\r\n        <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />\r\n      )}\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12} className={classes.tabBar}>\r\n          <AppBar\r\n            classes={{ root: classes.tabBarRoot }}\r\n            position=\"static\"\r\n            color=\"default\"\r\n            component=\"div\"\r\n          >\r\n            <Tabs\r\n              value={selectedTab}\r\n              indicatorColor=\"primary\"\r\n              textColor=\"primary\"\r\n              onChange={(_, value) => {\r\n                handleTabChangeWithoutSave(value);\r\n              }}\r\n              variant={isMobile ? 'scrollable' : 'standard'}\r\n            >\r\n              <Tab\r\n                icon={<Place />}\r\n                iconPosition={isMobile ? 'top' : 'start'}\r\n                className={classes.regionTabs}\r\n                id=\"locations\"\r\n                aria-controls=\"locations\"\r\n                label={'Locations'}\r\n              />\r\n              {canViewRoles && (\r\n                <Tab\r\n                  icon={<Store />}\r\n                  iconPosition={isMobile ? 'top' : 'start'}\r\n                  className={classes.regionTabs}\r\n                  id=\"markets\"\r\n                  aria-controls=\"markets\"\r\n                  label={'Markets'}\r\n                />\r\n              )}\r\n            </Tabs>\r\n          </AppBar>\r\n        </Grid>\r\n        <Grid item xs={12}>\r\n          {selectedTab === RegionTabs.Markets && (\r\n            <MarketFilters\r\n              setSearchValue={setSearchValue}\r\n              searchValue={searchValue}\r\n              applyFilters={(clearFilters?: boolean) => {\r\n                if (clearFilters) {\r\n                  setMarketSearchValue('');\r\n                }\r\n              }}\r\n              setHasAppliedFilters={setHasAppliedMarketFilters}\r\n              handleSearch={(val: string) => {\r\n                setMarketSearchValue(val);\r\n              }}\r\n              isLoading={isLoading}\r\n              hasAppliedFilters={hasAppliedMarketFilters}\r\n            />\r\n          )}\r\n          {selectedTab === RegionTabs.Locations && (\r\n            <LocationsFilters\r\n              setSearchValue={setSearchValue}\r\n              searchValue={searchValue}\r\n              applyFilters={(clearFilters?: boolean) => {\r\n                if (clearFilters) {\r\n                  setFilters({});\r\n                  setSearchValue('');\r\n                } else {\r\n                  setPage(0);\r\n                  setFilters({\r\n                    ...filters,\r\n                    marketIds: selectedMarkets?.map(s => s.value) || undefined,\r\n                    locationType: selectedLocationType || undefined,\r\n                  });\r\n                }\r\n              }}\r\n              setHasAppliedFilters={setHasAppliedFilters}\r\n              handleSearch={(val: string) => {\r\n                setPage(0);\r\n                setSearchValue(val);\r\n              }}\r\n              isLoading={isLoading || areLocationTypesLoading || areMarketsLoading}\r\n              types={locationTypes}\r\n              selectedType={selectedLocationType}\r\n              setSelectedType={setSelectedDvmType}\r\n              hasAppliedFilters={hasAppliedFilters}\r\n              markets={markets ?? []}\r\n              selectedMarkets={selectedMarkets}\r\n              setSelectedMarkets={setSelectedMarkets}\r\n            />\r\n          )}\r\n        </Grid>\r\n        <Grid item xs={12}>\r\n          {selectedTab === RegionTabs.Locations && (\r\n            <LocationsTable\r\n              isLoading={isLoading}\r\n              setIsLoading={setIsLoading}\r\n              setIsDeleting={setIsDeleting}\r\n              page={page}\r\n              setPage={setPage}\r\n              searchValue={searchValue}\r\n              filters={filters}\r\n            />\r\n          )}\r\n          {selectedTab === RegionTabs.Markets && (\r\n            <MarketsTable\r\n              isLoading={isLoading}\r\n              setIsLoading={setIsLoading}\r\n              setIsDeleting={setIsDeleting}\r\n              handleEditMarket={handleEditMarket}\r\n              currentMarket={currentMarket}\r\n              isMarketModalOpen={isMarketModalOpen}\r\n              handleCloseMarketModal={handleCloseMarketModal}\r\n              searchValue={marketSearchValue}\r\n            />\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  tabBar: {\r\n    position: 'sticky',\r\n    top: 0,\r\n    zIndex: 2,\r\n    width: '100vw',\r\n    marginLeft: '-24px',\r\n    paddingTop: '0!important',\r\n    [theme.breakpoints.down('mobile')]: {\r\n      width: '100vw',\r\n    },\r\n  },\r\n  tabBarRoot: {\r\n    width: '100vw',\r\n  },\r\n  regionTabs: {\r\n    fontSize: 14,\r\n    borderRadius: 0,\r\n  },\r\n}));\r\n","import React, { FC } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport clsx from 'clsx';\r\n// Components\r\nimport {\r\n  FormLabel,\r\n  Accordion,\r\n  AccordionSummary,\r\n  AccordionDetails,\r\n  Typography,\r\n  IconButton,\r\n  Checkbox,\r\n  Box,\r\n} from '@mui/material';\r\nimport { ExpandMore, Edit, Delete, Download, Clear, Check } from '@mui/icons-material';\r\nimport { resolveObjectField } from '../../helpers';\r\n\r\ninterface IMobileTable {\r\n  original: any;\r\n  handleEdit?: (val: any) => void;\r\n  handleDelete?: (val: any) => void;\r\n  handleDownload?: (val: any) => void;\r\n  handleApproval?: (val: any) => void;\r\n  handleCheckboxComplete?: (val: any) => void;\r\n  handleAccordionLabel?: (val: any) => void;\r\n  fields: {\r\n    name: string;\r\n    accessor: string;\r\n    Cell?: (value: { cell: { row: { original: Record<string, unknown> } } }) => JSX.Element;\r\n  }[];\r\n  mobileAccordionLabel?: string;\r\n}\r\n\r\nexport const MobileTable: FC<IMobileTable> = ({\r\n  handleDownload,\r\n  handleApproval,\r\n  handleCheckboxComplete,\r\n  handleEdit,\r\n  handleDelete,\r\n  fields,\r\n  original,\r\n  mobileAccordionLabel,\r\n}) => {\r\n  const classes = useStyles();\r\n  return (\r\n    <Accordion className={classes.root}>\r\n      <AccordionSummary\r\n        className={classes.accordion}\r\n        expandIcon={<ExpandMore />}\r\n        aria-controls=\"panel1a-content\"\r\n        id=\"panel1a-header\"\r\n      >\r\n        <div className={classes.topPanelSummaryWrapper}>\r\n          <Typography color=\"primary\" className={classes.boldName}>\r\n            {mobileAccordionLabel\r\n              ? original[\r\n                  fields.find(field => {\r\n                    return field.accessor === mobileAccordionLabel;\r\n                  })?.accessor ?? 0\r\n                ]\r\n              : original[fields[0].accessor]}\r\n          </Typography>\r\n          <div className={classes.buttonsWrapper}>\r\n            {handleDownload && (\r\n              <IconButton\r\n                className={classes.editButton}\r\n                color=\"primary\"\r\n                onClick={e => {\r\n                  e.stopPropagation();\r\n                  handleDownload(original);\r\n                }}\r\n                size=\"large\"\r\n              >\r\n                <Download />\r\n              </IconButton>\r\n            )}\r\n            {handleEdit && (\r\n              <IconButton\r\n                className={classes.editButton}\r\n                color=\"primary\"\r\n                onClick={e => {\r\n                  e.stopPropagation();\r\n                  handleEdit(original);\r\n                }}\r\n                size=\"large\"\r\n              >\r\n                <Edit />\r\n              </IconButton>\r\n            )}\r\n            {handleDelete && (\r\n              <IconButton\r\n                className={classes.deleteButton}\r\n                color=\"default\"\r\n                onClick={e => {\r\n                  e.stopPropagation();\r\n                  handleDelete(original);\r\n                }}\r\n                size=\"large\"\r\n              >\r\n                <Delete />\r\n              </IconButton>\r\n            )}\r\n            {handleApproval && (\r\n              <IconButton\r\n                className={\r\n                  original.paymentStatus === 'Approved'\r\n                    ? classes.rejectButton\r\n                    : classes.approvalButton\r\n                }\r\n                color=\"default\"\r\n                onClick={e => {\r\n                  e.stopPropagation();\r\n                  handleApproval(original);\r\n                }}\r\n                size=\"large\"\r\n              >\r\n                {original.paymentStatus === 'Approved' ? <Clear /> : <Check />}\r\n              </IconButton>\r\n            )}\r\n            {handleCheckboxComplete && (\r\n              <Box display=\"flex\" alignItems=\"center\" className={classes.checkboxWrapper}>\r\n                <Typography className={classes.checkboxLabel}>Mark as read</Typography>\r\n                <Checkbox\r\n                  checked={original.cancelationAcknowledged === true}\r\n                  id=\"orders-checkbox\"\r\n                  onChange={e => {\r\n                    e.stopPropagation();\r\n                    handleCheckboxComplete(original);\r\n                  }}\r\n                />\r\n              </Box>\r\n            )}\r\n          </div>\r\n        </div>\r\n      </AccordionSummary>\r\n      <AccordionDetails className={classes.details}>\r\n        {fields.map((field: typeof fields[0], index) => {\r\n          return (\r\n            <div key={`${index}`} className={classes.panelSummaryWrapper}>\r\n              <FormLabel component=\"span\" className={clsx(classes.boldName, classes.subLabelEmail)}>\r\n                {field?.name?.length > 1 ? `${field.name}:` : field.name}\r\n              </FormLabel>\r\n              <Typography component=\"span\">\r\n                {/* TODO clean this up */}\r\n                {typeof field.accessor === 'string' && typeof field.Cell !== 'function'\r\n                  ? !resolveObjectField(field.accessor, original)\r\n                    ? '--'\r\n                    : resolveObjectField(field.accessor, original)\r\n                  : typeof field.Cell === 'function'\r\n                  ? ''\r\n                  : '--'}\r\n                {typeof field.Cell === 'function'\r\n                  ? field.Cell({ cell: { row: { original } } })\r\n                  : null}\r\n              </Typography>\r\n            </div>\r\n          );\r\n        })}\r\n      </AccordionDetails>\r\n    </Accordion>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  root: {\r\n    maxWidth: '100%',\r\n    border: `1px solid ${theme.palette.grey[300]}`,\r\n    overflowX: 'hidden',\r\n  },\r\n  accordion: {\r\n    padding: '0 16px',\r\n    '&& .MuiAccordionSummary-expandIcon': {\r\n      padding: 3,\r\n    },\r\n  },\r\n  topPanelSummaryWrapper: {\r\n    marginTop: theme.spacing(0.5),\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'space-between',\r\n    width: '100%',\r\n    '&:first-child': { marginTop: 0 },\r\n  },\r\n  panelSummaryWrapper: {\r\n    '&:first-child': { marginTop: 0 },\r\n  },\r\n  details: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    padding: '12px 16px',\r\n    backgroundColor: theme.palette.grey[100],\r\n  },\r\n  editButton: {\r\n    padding: `2px 5px`,\r\n  },\r\n  deleteButton: {\r\n    padding: `2px 5px`,\r\n    color: theme.palette.error.main,\r\n  },\r\n  approvalButton: {\r\n    padding: `2px`,\r\n    marginRight: '6px',\r\n    backgroundColor: theme.palette.success.main,\r\n    color: '#ffffff',\r\n    '&:hover': {\r\n      backgroundColor: theme.palette.success.main,\r\n      color: '#ffffff',\r\n    },\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n    },\r\n  },\r\n  rejectButton: {\r\n    padding: `2px`,\r\n    marginRight: '6px',\r\n    backgroundColor: theme.palette.error.main,\r\n    color: '#ffffff',\r\n    '&:hover': { backgroundColor: theme.palette.error.main, color: '#ffffff' },\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n    },\r\n  },\r\n  boldName: {\r\n    color: theme.palette.secondary.main,\r\n    fontWeight: 600,\r\n  },\r\n  subLabelEmail: {\r\n    marginRight: 10,\r\n  },\r\n  buttonsWrapper: {\r\n    display: 'flex',\r\n  },\r\n  checkboxWrapper: {\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    marginRight: theme.spacing(1),\r\n  },\r\n  checkboxLabel: {\r\n    color: theme.palette.primary.main,\r\n    fontWeight: 600,\r\n  },\r\n}));\r\n","import { FC } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Box,\r\n  Button,\r\n  Fade,\r\n  FormControl,\r\n  Grid,\r\n  TextField,\r\n  Typography,\r\n  useMediaQuery,\r\n} from '@mui/material';\r\nimport { IHoliday } from '../../models/holidays';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { createHoliday, updateHoliday } from '../../fetch/holidays';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Edit, Close } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker';\r\nimport { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker';\r\n\r\ninterface IHolidayModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  currentHoliday?: IHoliday;\r\n  fetchHolidays: () => {};\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  name: Yup.string().required('Required'),\r\n  date: Yup.string().required('Required'),\r\n});\r\n\r\nexport const HolidayModal: FC<IHolidayModal> = ({\r\n  open,\r\n  onClose,\r\n  currentHoliday,\r\n  fetchHolidays,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize={true}\r\n        initialValues={{\r\n          name: currentHoliday?.name ?? '',\r\n          date: currentHoliday?.date ?? '',\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          const data = {\r\n            holiday: {\r\n              holidayId: currentHoliday?.holidayId ?? 0,\r\n              name: values.name,\r\n              date: values.date,\r\n            },\r\n          };\r\n          try {\r\n            if (!!currentHoliday) {\r\n              await updateHoliday(data);\r\n              enqueueSnackbar(`Holiday updated!`, {\r\n                variant: 'success',\r\n              });\r\n            }\r\n            if (!currentHoliday) {\r\n              await createHoliday(data);\r\n              enqueueSnackbar(`Holiday created!`, {\r\n                variant: 'success',\r\n              });\r\n            }\r\n            actions.resetForm();\r\n            fetchHolidays();\r\n            onClose();\r\n          } catch (error: any) {\r\n            if (!!currentHoliday) {\r\n              const errorMessage = error?.response?.data?.Detail;\r\n              enqueueSnackbar(errorMessage || `Holiday was not updated.`, {\r\n                variant: 'error',\r\n              });\r\n            }\r\n            if (!currentHoliday) {\r\n              const errorMessage = error?.response?.data?.Detail;\r\n              enqueueSnackbar(errorMessage || `Holiday was not created`, {\r\n                variant: 'success',\r\n              });\r\n            }\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          handleBlur,\r\n          errors,\r\n          touched,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                resetForm();\r\n                onClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Fade in={open}>\r\n                <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                  <div>\r\n                    <Typography variant=\"h5\">\r\n                      {!!currentHoliday ? `Edit ${currentHoliday?.name}` : `Add New Holiday`}\r\n                    </Typography>\r\n                    <div className={classes.content}>\r\n                      <Grid container spacing={1}>\r\n                        <Grid item xs={12}>\r\n                          <TextField\r\n                            fullWidth\r\n                            variant=\"standard\"\r\n                            autoComplete=\"nope\"\r\n                            label=\"Holiday Name\"\r\n                            name=\"name\"\r\n                            value={values.name}\r\n                            onBlur={handleBlur}\r\n                            size=\"small\"\r\n                            required\r\n                            onChange={e => setFieldValue('name', e.target.value)}\r\n                            error={touched.name && errors && errors.name ? true : false}\r\n                            helperText={touched.name && errors && errors.name}\r\n                          />\r\n                        </Grid>\r\n                        <Grid item xs={12}>\r\n                          <FormControl fullWidth variant=\"outlined\">\r\n                            {!isMobile ? (\r\n                              <DesktopDatePicker\r\n                                label={'Holiday Date'}\r\n                                inputFormat=\"MM/dd/yyyy\"\r\n                                value={values.date}\r\n                                onChange={(e: any) => {\r\n                                  setFieldValue('date', e);\r\n                                }}\r\n                                renderInput={(params: any) => (\r\n                                  <TextField\r\n                                    required\r\n                                    size=\"small\"\r\n                                    variant=\"standard\"\r\n                                    {...params}\r\n                                    error={touched.date && errors && errors.date ? true : false}\r\n                                    helperText={touched.date && errors && errors.date}\r\n                                  />\r\n                                )}\r\n                              />\r\n                            ) : (\r\n                              <MobileDatePicker\r\n                                label={'Holiday Date'}\r\n                                inputFormat=\"MM/dd/yyyy\"\r\n                                value={values.date}\r\n                                onChange={(e: any) => {\r\n                                  setFieldValue('date', e);\r\n                                }}\r\n                                renderInput={(params: any) => (\r\n                                  <TextField\r\n                                    required\r\n                                    variant=\"standard\"\r\n                                    size=\"small\"\r\n                                    {...params}\r\n                                    error={touched.date && errors && errors.date ? true : false}\r\n                                    helperText={touched.date && errors && errors.date}\r\n                                  />\r\n                                )}\r\n                              />\r\n                            )}\r\n                          </FormControl>\r\n                        </Grid>\r\n                      </Grid>\r\n                    </div>\r\n                  </div>\r\n                  <Box marginTop=\"1rem\">\r\n                    <Button\r\n                      className={classes.button}\r\n                      disabled={!dirty || isSubmitting || !isValid}\r\n                      type=\"submit\"\r\n                      startIcon={<Edit />}\r\n                      variant=\"contained\"\r\n                      color=\"primary\"\r\n                    >\r\n                      Save\r\n                    </Button>\r\n                    <Button\r\n                      className={classes.button}\r\n                      type=\"button\"\r\n                      variant=\"contained\"\r\n                      color=\"inherit\"\r\n                      disabled={isSubmitting}\r\n                      startIcon={<Close />}\r\n                      onClick={() => {\r\n                        //@ts-ignore\r\n                        if (!deepEqual(initialValues, values)) {\r\n                          const result = window.confirm(\r\n                            'You have unsaved changes, are you sure you want to exit?'\r\n                          );\r\n                          if (result) {\r\n                            resetForm();\r\n                            onClose();\r\n                          } else {\r\n                            return;\r\n                          }\r\n                        } else {\r\n                          resetForm();\r\n                          onClose();\r\n                        }\r\n                      }}\r\n                    >\r\n                      Cancel\r\n                    </Button>\r\n                  </Box>\r\n                </Form>\r\n              </Fade>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { Box, Button, Grid, IconButton, useMediaQuery } from '@mui/material';\r\nimport { FC, useState, useEffect, useMemo } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn } from '../../models/util';\r\nimport { Add, DeleteForever, EditLocationAlt } from '@mui/icons-material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { deleteHoliday, getHolidays } from '../../fetch/holidays';\r\nimport { IHoliday } from '../../models/holidays';\r\nimport { HolidayModal } from './add-edit-holiday-modal';\r\nimport { formatDate } from '../../helpers';\r\n\r\nexport const Holidays: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [isDeleting, setIsDeleting] = useState(false);\r\n  const [holidays, setHolidays] = useState<IHoliday[]>([]);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const [currentHoliday, setCurrentHoliday] = useState<IHoliday | undefined>(undefined);\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const classes = useStyles();\r\n\r\n  const fetchHolidays = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getHolidays();\r\n      setHolidays(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading holidays, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchHolidays();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const handleAdd = () => {\r\n    setIsModalOpen(true);\r\n  };\r\n  const handleEdit = (holidayId: number | string) => {\r\n    setCurrentHoliday(holidays.find(holiday => holiday.holidayId === holidayId));\r\n    setIsModalOpen(true);\r\n  };\r\n\r\n  const handleClose = () => {\r\n    setCurrentHoliday(undefined);\r\n    setIsModalOpen(false);\r\n  };\r\n\r\n  const handleDelete = async (holidayId: number | string) => {\r\n    const result = window.confirm('Are you sure you want to delete this Holiday?');\r\n    if (result) {\r\n      try {\r\n        setIsDeleting(true);\r\n        await deleteHoliday(holidayId);\r\n        await fetchHolidays();\r\n        enqueueSnackbar('Holiday Deleted!', {\r\n          variant: 'success',\r\n        });\r\n      } catch (error: any) {\r\n        const errorMessage = error?.response?.data?.Detail;\r\n        enqueueSnackbar(errorMessage || `Error deleting holiday, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n        console.log(error);\r\n      } finally {\r\n        setIsDeleting(false);\r\n      }\r\n    }\r\n  };\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Name',\r\n        accessor: 'name',\r\n      },\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'date',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IHoliday } };\r\n        }) => {\r\n          return <span>{formatDate(original.date)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IHoliday } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original.holidayId);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n              <IconButton\r\n                className={classes.button}\r\n                onClick={() => handleDelete(original.holidayId)}\r\n              >\r\n                <DeleteForever />\r\n              </IconButton>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [holidays]);\r\n\r\n  return (\r\n    <Page\r\n      title={'Holidays'}\r\n      additionalHeaderContent={\r\n        <Button\r\n          startIcon={<Add />}\r\n          color=\"primary\"\r\n          variant=\"contained\"\r\n          disabled={isLoading}\r\n          onClick={() => handleAdd()}\r\n        >\r\n          New Holiday\r\n        </Button>\r\n      }\r\n    >\r\n      {(isDeleting || isLoading) && (\r\n        <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />\r\n      )}\r\n\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12}>\r\n          <Table\r\n            columns={columns}\r\n            data={holidays}\r\n            hidePagination\r\n            isLoading={isLoading}\r\n            ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n            mobileProps={{\r\n              fields: columns\r\n                .filter(col => col.Header)\r\n                .map(col => ({\r\n                  name: col.Header,\r\n                  accessor: col.accessor,\r\n                  Cell: col?.Cell,\r\n                })),\r\n              handleEdit: (holiday: IHoliday) => {\r\n                handleEdit(holiday.holidayId);\r\n              },\r\n              handleDelete: (holiday: IHoliday) => handleDelete(holiday.holidayId),\r\n            }}\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n      <HolidayModal\r\n        open={isModalOpen}\r\n        onClose={handleClose}\r\n        currentHoliday={currentHoliday}\r\n        fetchHolidays={() => fetchHolidays()}\r\n      />\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { Box, Button, IconButton, useMediaQuery } from '@mui/material';\r\nimport React, { FC, useState, useEffect, useMemo, useContext } from 'react';\r\nimport { UserContext } from '../../context';\r\nimport { deleteLocation, getLocations } from '../../fetch/locations';\r\nimport { ILocation } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn, sortable } from '../../models/util';\r\nimport { DeleteForever, EditLocationAlt } from '@mui/icons-material';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\ninterface ILocationTable {\r\n  isLoading: boolean;\r\n  setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\r\n  setIsDeleting: React.Dispatch<React.SetStateAction<boolean>>;\r\n  page: number;\r\n  setPage: React.Dispatch<React.SetStateAction<number>>;\r\n  searchValue: string;\r\n  filters: {\r\n    locationType?: string;\r\n    marketIds?: string[] | number[];\r\n  };\r\n}\r\nexport const LocationsTable: FC<ILocationTable> = ({\r\n  isLoading,\r\n  setIsLoading,\r\n  setIsDeleting,\r\n  page,\r\n  setPage,\r\n  searchValue,\r\n  filters,\r\n}) => {\r\n  const [locations, setLocations] = useState<ILocation[]>([]);\r\n\r\n  const { isPracticeManager, isSysAdmin, isRSS } = useContext(UserContext);\r\n  // visibility condition based on roles\r\n  const canViewRoles = isPracticeManager && !isSysAdmin && !isRSS;\r\n  \r\n  const [perPage, setRowsPerPage] = useState(10);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [selectedSort, setSelectedSort] = useState<string>('1');\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    Name?: sortable;\r\n    Market?: sortable;\r\n    Address?: sortable;\r\n    City?: sortable;\r\n    State?: sortable;\r\n    Zip?: sortable;\r\n    Type?: sortable;\r\n  }>({\r\n    Name: 'Asc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const history = useHistory();\r\n  const classes = useStyles();\r\n\r\n  const fetchLocations = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getLocations({\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n        searchTerm: searchValue,\r\n        ...filters,\r\n      });\r\n      setLocations(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading locations, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchLocations();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection, filters]);\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  const handleEdit = (locationId: number | string) => {\r\n    history.push(`locations/${locationId}`);\r\n  };\r\n\r\n  const handleDelete = async (locationId: number | string) => {\r\n    const result = window.confirm('Are you sure you want to delete this Location?');\r\n    if (result) {\r\n      try {\r\n        setIsDeleting(true);\r\n        await deleteLocation(parseInt(locationId as string));\r\n        await fetchLocations();\r\n        enqueueSnackbar('Location Deleted!', {\r\n          variant: 'success',\r\n        });\r\n      } catch (error: any) {\r\n        const errorMessage = error?.response?.data?.Detail;\r\n        enqueueSnackbar(errorMessage || `Error deleting location, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n        console.log(error);\r\n      } finally {\r\n        setIsDeleting(false);\r\n      }\r\n    }\r\n  };\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Name',\r\n        accessor: 'name',\r\n        isServerSorted: selectedSort === 'Name',\r\n        isServerSortedDesc: sortDirection.Name === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Name'),\r\n      },\r\n      {\r\n        Header: 'Market',\r\n        accessor: 'marketName',\r\n        isServerSorted: selectedSort === 'Market',\r\n        isServerSortedDesc: sortDirection.Market === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Market'),\r\n      },\r\n      {\r\n        Header: 'Type',\r\n        accessor: 'locationTypeName',\r\n        isServerSorted: selectedSort === 'Type',\r\n        isServerSortedDesc: sortDirection.Type === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Type'),\r\n      },\r\n      {\r\n        Header: 'Address',\r\n        accessor: '',\r\n        isServerSorted: selectedSort === 'Address',\r\n        isServerSortedDesc: sortDirection.Address === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Address'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILocation } };\r\n        }) => {\r\n          return <span>{original.address.street}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'City',\r\n        accessor: 'city',\r\n        isServerSorted: selectedSort === 'City',\r\n        isServerSortedDesc: sortDirection.City === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('City'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILocation } };\r\n        }) => {\r\n          return <span>{original.address.city}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'State',\r\n        accessor: 'state',\r\n        isServerSorted: selectedSort === 'State',\r\n        isServerSortedDesc: sortDirection.State === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('State'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILocation } };\r\n        }) => {\r\n          return <span>{original.address.state}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Zip',\r\n        accessor: 'zip',\r\n        isServerSorted: selectedSort === 'Zip',\r\n        isServerSortedDesc: sortDirection.Zip === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Zip'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILocation } };\r\n        }) => {\r\n          return <span>{original.address.zip}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Accounting Location ID',\r\n        accessor: 'accountsPayableId',\r\n        sort: false,\r\n        isServerSorted: false,\r\n        isServerSortedDesc: false,\r\n        handleClickColumn: () => {},\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILocation } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {!!original.accountsPayableId ? original.accountsPayableId : 'No ID Provided'}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        sort: false,\r\n        id: 'actions',\r\n        isServerSorted: false,\r\n        isServerSortedDesc: false,\r\n        handleClickColumn: () => {},\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILocation } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original.locationId);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n              {!canViewRoles && (\r\n                <IconButton\r\n                  className={classes.button}\r\n                  onClick={() => handleDelete(original.locationId)}\r\n                >\r\n                  <DeleteForever />\r\n                </IconButton>\r\n              )}\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedSort, sortDirection]);\r\n\r\n  return (\r\n    <Table\r\n      columns={columns}\r\n      data={locations}\r\n      isLoading={isLoading}\r\n      serverPage={page}\r\n      serverRecordCount={recordCount}\r\n      serverPerPage={perPage}\r\n      handlePage={setPage}\r\n      handleRowsPerPage={setRowsPerPage}\r\n      ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n      mobileProps={{\r\n        fields: columns\r\n          .filter(col => col.Header)\r\n          .map(col => ({\r\n            name: col.Header,\r\n            accessor: col.accessor,\r\n            Cell: col?.Cell,\r\n          })),\r\n        handleEdit: (location: ILocation) => {\r\n          handleEdit(location.locationId);\r\n        },\r\n        ...(!canViewRoles\r\n          ? {}\r\n          : {\r\n              handleDelete: (location: ILocation) => handleDelete(location.locationId),\r\n            }),\r\n      }}\r\n    />\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { FC, useMemo } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Autocomplete,\r\n  Box,\r\n  Button,\r\n  Fade,\r\n  FormHelperText,\r\n  Grid,\r\n  TextField,\r\n  Typography,\r\n} from '@mui/material';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Edit, Close } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { IMarket } from '../../models/markets';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { createMarket, updateMarket } from '../../fetch';\r\n\r\ninterface IMarketModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  market: IMarket | undefined;\r\n  fetchMarkets: () => void;\r\n  states: IDropdownResponse[];\r\n  areStatesLoading: boolean;\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  name: Yup.string().required('Required'),\r\n  stateName: Yup.string().required('Required'),\r\n});\r\n\r\nexport const MarketModal: FC<IMarketModal> = ({\r\n  open,\r\n  onClose,\r\n  market,\r\n  fetchMarkets,\r\n  states,\r\n  areStatesLoading,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const selectedState = useMemo(\r\n    () => states.find(state => market?.stateName === state.description),\r\n    [market?.stateName, states]\r\n  );\r\n\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize={true}\r\n        initialValues={{\r\n          marketId: market?.marketId ?? 0,\r\n          name: market?.name ?? '',\r\n          stateId: selectedState?.value ?? 0,\r\n          stateName: market?.stateName ?? '',\r\n          stateAbbreviation: market?.stateAbbreviation ?? '',\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          const data = {\r\n            market: {\r\n              marketId: market?.marketId ?? 0,\r\n              name: values.name,\r\n              stateId: values.stateId,\r\n            },\r\n          };\r\n          try {\r\n            if (!!market) {\r\n              await updateMarket(data);\r\n              enqueueSnackbar(`Market updated!`, {\r\n                variant: 'success',\r\n              });\r\n            }\r\n            if (!market) {\r\n              await createMarket(data);\r\n              enqueueSnackbar(`Market created!`, {\r\n                variant: 'success',\r\n              });\r\n            }\r\n            actions.resetForm();\r\n            fetchMarkets();\r\n            onClose();\r\n          } catch (error: any) {\r\n            if (!!market) {\r\n              const errorMessage = error?.response?.data?.Detail;\r\n              enqueueSnackbar(errorMessage || `Market was not updated.`, {\r\n                variant: 'error',\r\n              });\r\n            }\r\n            if (!market) {\r\n              const errorMessage = error?.response?.data?.Detail;\r\n              enqueueSnackbar(errorMessage || `Market was not created`, {\r\n                variant: 'success',\r\n              });\r\n            }\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          validateField,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          setFieldTouched,\r\n          handleBlur,\r\n          handleChange,\r\n          errors,\r\n          touched,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                resetForm();\r\n                onClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Fade in={open}>\r\n                <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                  <div>\r\n                    <Typography variant=\"h5\">\r\n                      {!!market ? `Edit ${market?.name}` : `Add New Market`}\r\n                    </Typography>\r\n\r\n                    <div className={classes.content}>\r\n                      <Grid container spacing={1}>\r\n                        <Grid item xs={12}>\r\n                          <TextField\r\n                            fullWidth\r\n                            variant=\"standard\"\r\n                            autoComplete=\"nope\"\r\n                            label=\"Market Name\"\r\n                            name=\"name\"\r\n                            value={values.name}\r\n                            onBlur={handleBlur}\r\n                            size=\"small\"\r\n                            required\r\n                            onChange={e => setFieldValue('name', e.target.value)}\r\n                            error={touched.name && errors && errors.name ? true : false}\r\n                            helperText={touched.name && errors && errors.name}\r\n                          />\r\n                        </Grid>\r\n\r\n                        <Grid item xs={12}>\r\n                          <Autocomplete\r\n                            value={\r\n                              states.find(\r\n                                state => state.description === values.stateName\r\n                              ) as IDropdownResponse\r\n                            }\r\n                            onChange={(event, newValue: any) => {\r\n                              setFieldValue('stateName', newValue?.description ?? '');\r\n                              setFieldValue('stateId', newValue?.value ?? '');\r\n                              setFieldValue('stateAbbreviation', newValue?.shorthand ?? '');\r\n                              validateField('stateName');\r\n                            }}\r\n                            onSelect={e => {\r\n                              handleBlur(e);\r\n                            }}\r\n                            disabled={areStatesLoading}\r\n                            handleHomeEndKeys\r\n                            loading={areStatesLoading}\r\n                            id=\"stateName\"\r\n                            options={states || []}\r\n                            onBlur={handleBlur}\r\n                            getOptionLabel={(option: IDropdownResponse) => {\r\n                              // Value selected with enter, right from the input\r\n                              if (typeof option === 'string') {\r\n                                return option;\r\n                              }\r\n                              return `${option.description}`;\r\n                            }}\r\n                            renderInput={params => (\r\n                              <TextField\r\n                                {...params}\r\n                                key={params.id}\r\n                                size=\"small\"\r\n                                autoComplete=\"on\"\r\n                                label=\"State\"\r\n                                variant=\"standard\"\r\n                              />\r\n                            )}\r\n                          />\r\n\r\n                          {touched?.stateName && errors?.stateName && (\r\n                            <FormHelperText error>Required</FormHelperText>\r\n                          )}\r\n                        </Grid>\r\n                      </Grid>\r\n                    </div>\r\n                  </div>\r\n                  <Box marginTop=\"1rem\">\r\n                    <Button\r\n                      className={classes.button}\r\n                      disabled={!dirty || isSubmitting || !isValid}\r\n                      type=\"submit\"\r\n                      startIcon={<Edit />}\r\n                      variant=\"contained\"\r\n                      color=\"primary\"\r\n                    >\r\n                      Save\r\n                    </Button>\r\n                    <Button\r\n                      className={classes.button}\r\n                      type=\"button\"\r\n                      variant=\"contained\"\r\n                      color=\"inherit\"\r\n                      disabled={isSubmitting}\r\n                      startIcon={<Close />}\r\n                      onClick={() => {\r\n                        //@ts-ignore\r\n                        if (!deepEqual(initialValues, values)) {\r\n                          const result = window.confirm(\r\n                            'You have unsaved changes, are you sure you want to exit?'\r\n                          );\r\n                          if (result) {\r\n                            resetForm();\r\n                            onClose();\r\n                          } else {\r\n                            return;\r\n                          }\r\n                        } else {\r\n                          resetForm();\r\n                          onClose();\r\n                        }\r\n                      }}\r\n                    >\r\n                      Cancel\r\n                    </Button>\r\n                  </Box>\r\n                </Form>\r\n              </Fade>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { Box, Button, IconButton, useMediaQuery } from '@mui/material';\r\nimport React, { FC, useState, useEffect, useMemo } from 'react';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn, IDropdownResponse, sortable } from '../../models/util';\r\nimport { DeleteForever, Edit } from '@mui/icons-material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { IMarket } from '../../models/markets';\r\nimport { deleteMarket, getMarkets } from '../../fetch/markets';\r\nimport { getStates } from '../../fetch/lookups';\r\nimport { MarketModal } from './add-edit-market-modal';\r\nimport { Loader } from '../../components';\r\n\r\ninterface IMarketsTable {\r\n  isLoading: boolean;\r\n  setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\r\n  setIsDeleting: React.Dispatch<React.SetStateAction<boolean>>;\r\n  handleEditMarket: (market: IMarket) => void;\r\n  currentMarket: IMarket | undefined;\r\n  isMarketModalOpen: boolean;\r\n  handleCloseMarketModal: () => void;\r\n  searchValue: string;\r\n}\r\nexport const MarketsTable: FC<IMarketsTable> = ({\r\n  isLoading,\r\n  setIsLoading,\r\n  setIsDeleting,\r\n  handleEditMarket,\r\n  currentMarket,\r\n  isMarketModalOpen,\r\n  handleCloseMarketModal,\r\n  searchValue,\r\n}) => {\r\n  const [markets, setMarkets] = useState<IMarket[]>([]);\r\n  const [page, setPage] = useState(0);\r\n  const [perPage, setRowsPerPage] = useState(10);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [selectedSort, setSelectedSort] = useState<string>('1');\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    Name?: sortable;\r\n    State?: sortable;\r\n  }>({\r\n    Name: 'Asc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const classes = useStyles();\r\n\r\n  const [areMarketsLoading, setIsMarketsLoading] = useState(true);\r\n  const fetchMarkets = async () => {\r\n    try {\r\n      setIsMarketsLoading(true);\r\n      const res = await getMarkets({\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n        nameSearchTerm: searchValue,\r\n      });\r\n      setMarkets(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading markets, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsMarketsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchMarkets();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection, searchValue]);\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  const handleDelete = async (marketId: number | string) => {\r\n    const result = window.confirm('Are you sure you want to delete this Market?');\r\n    if (result) {\r\n      try {\r\n        setIsDeleting(true);\r\n        await deleteMarket(parseInt(marketId as string));\r\n        await fetchMarkets();\r\n        enqueueSnackbar('Market Deleted!', {\r\n          variant: 'success',\r\n        });\r\n      } catch (error: any) {\r\n        const errorMessage = error?.response?.data?.Detail;\r\n        enqueueSnackbar(errorMessage || `Error deleting market, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n        console.log(error);\r\n      } finally {\r\n        setIsDeleting(false);\r\n      }\r\n    }\r\n  };\r\n\r\n  const [areStatesLoading, setAreStatesLoading] = useState(true);\r\n  const [states, setStates] = useState<IDropdownResponse[]>([]);\r\n  const fetchStates = async () => {\r\n    setAreStatesLoading(true);\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getStates();\r\n      setStates(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading states, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreStatesLoading(false);\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n  useEffect(() => {\r\n    // Values for Dropdowns\r\n    fetchStates();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Name',\r\n        accessor: 'name',\r\n        isServerSorted: selectedSort === 'Name',\r\n        isServerSortedDesc: sortDirection.Name === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Name'),\r\n      },\r\n\r\n      {\r\n        Header: 'State',\r\n        accessor: 'stateName',\r\n        isServerSorted: selectedSort === 'State',\r\n        isServerSortedDesc: sortDirection.State === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('State'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IMarket } };\r\n        }) => {\r\n          return <span>{original.stateName}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        sort: false,\r\n        id: 'actions',\r\n        isServerSorted: false,\r\n        isServerSortedDesc: false,\r\n        handleClickColumn: () => {},\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IMarket } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                startIcon={<Edit />}\r\n                onClick={() => {\r\n                  handleEditMarket(original);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n              <IconButton\r\n                className={classes.button}\r\n                onClick={() => handleDelete(original.marketId)}\r\n              >\r\n                <DeleteForever />\r\n              </IconButton>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedSort, sortDirection]);\r\n\r\n  return (\r\n    <>\r\n      {(areMarketsLoading || isLoading || areStatesLoading) && (\r\n        <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />\r\n      )}\r\n      <Table\r\n        columns={columns}\r\n        data={markets}\r\n        isLoading={isLoading}\r\n        serverPage={page}\r\n        serverRecordCount={recordCount}\r\n        serverPerPage={perPage}\r\n        handlePage={setPage}\r\n        handleRowsPerPage={setRowsPerPage}\r\n        ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n        mobileProps={{\r\n          fields: columns\r\n            .filter(col => col.Header)\r\n            .map(col => ({\r\n              name: col.Header,\r\n              accessor: col.accessor,\r\n              Cell: col?.Cell,\r\n            })),\r\n          handleEdit: (market: IMarket) => {\r\n            handleEditMarket(market);\r\n          },\r\n          handleDelete: (market: IMarket) => handleDelete(market.marketId),\r\n        }}\r\n      />\r\n      {!areStatesLoading && (\r\n        <MarketModal\r\n          open={isMarketModalOpen}\r\n          onClose={handleCloseMarketModal}\r\n          market={currentMarket}\r\n          fetchMarkets={fetchMarkets}\r\n          states={states}\r\n          areStatesLoading={areStatesLoading}\r\n        />\r\n      )}\r\n    </>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Grid, Button, Divider, TextField } from '@mui/material';\r\nimport { FilterList, Close, ArrowDropDown, ArrowDropUp } from '@mui/icons-material';\r\n\r\ninterface IMarketFilters {\r\n  isLoading: boolean;\r\n  applyFilters: (clearFilters?: boolean) => void;\r\n  setSearchValue: (val: string) => void;\r\n  searchValue: string;\r\n  handleSearch: (val: string) => void;\r\n  hasAppliedFilters: boolean;\r\n  setHasAppliedFilters: (val: boolean) => void;\r\n}\r\n\r\nexport const MarketFilters: FC<IMarketFilters> = ({\r\n  isLoading,\r\n  applyFilters,\r\n  handleSearch,\r\n  hasAppliedFilters,\r\n  setHasAppliedFilters,\r\n}) => {\r\n  const [isMobileFilterButtonOpen, setIsMobileFilterButtonOpen] = useState<boolean>(false);\r\n  const classes = useStyles({ isMobileFilterButtonOpen });\r\n\r\n  const [searchValue, setSearchValue] = useState<string>('');\r\n  const noFilters = !searchValue;\r\n  return (\r\n    <>\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.searchWrapper}></Grid>\r\n      <Button\r\n        color=\"secondary\"\r\n        variant=\"contained\"\r\n        className={classes.mobileButton}\r\n        startIcon={<FilterList />}\r\n        endIcon={isMobileFilterButtonOpen ? <ArrowDropUp /> : <ArrowDropDown />}\r\n        onClick={() => {\r\n          setIsMobileFilterButtonOpen(!isMobileFilterButtonOpen);\r\n        }}\r\n      >\r\n        Filters\r\n      </Button>\r\n      {!isMobileFilterButtonOpen && <Divider className={classes.divider} />}\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.wrapper}>\r\n        <Grid item xs={12} sm={6} md={3}>\r\n          <TextField\r\n            fullWidth\r\n            variant=\"standard\"\r\n            autoComplete=\"nope\"\r\n            label=\"Search\"\r\n            name=\"search\"\r\n            classes={{ root: classes.searchRoot }}\r\n            value={searchValue}\r\n            size=\"small\"\r\n            onKeyDown={e => {\r\n              if (e.key === 'Enter') {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n                handleSearch(searchValue);\r\n              }\r\n            }}\r\n            onChange={e => {\r\n              setSearchValue(e.target.value);\r\n            }}\r\n          />\r\n        </Grid>\r\n\r\n        <Grid item xs={12} sm={6} lg={4}>\r\n          <Button\r\n            color=\"primary\"\r\n            variant=\"contained\"\r\n            className={classes.button}\r\n            disabled={isLoading}\r\n            startIcon={<FilterList />}\r\n            onClick={() => {\r\n              if (noFilters) {\r\n                setHasAppliedFilters(false);\r\n                applyFilters();\r\n              } else {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n                handleSearch(searchValue);\r\n              }\r\n            }}\r\n          >\r\n            Apply Filters\r\n          </Button>\r\n          {hasAppliedFilters && (\r\n            <Button\r\n              className={clsx(classes.button, classes.resetButton)}\r\n              variant=\"contained\"\r\n              color=\"inherit\"\r\n              disabled={isLoading}\r\n              startIcon={<Close />}\r\n              onClick={() => {\r\n                setSearchValue('');\r\n                setHasAppliedFilters(false);\r\n                applyFilters(true);\r\n              }}\r\n            >\r\n              Reset\r\n            </Button>\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { isMobileFilterButtonOpen?: boolean }>((theme: Theme) => ({\r\n  mobileButton: {\r\n    width: '100%',\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  button: {\r\n    marginTop: 4,\r\n    marginBottom: 4,\r\n    height: 40,\r\n    textTransform: 'capitalize',\r\n    width: '100%',\r\n\r\n    [theme.breakpoints.up('sm')]: {\r\n      width: 'auto',\r\n      marginLeft: theme.spacing(2),\r\n    },\r\n  },\r\n  resetButton: {\r\n    '@media (min-width: 600px)': {\r\n      marginLeft: 11,\r\n    },\r\n    [theme.breakpoints.up('sm')]: {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  wrapper: ({ isMobileFilterButtonOpen }) =>\r\n    isMobileFilterButtonOpen\r\n      ? {\r\n          marginTop: 10,\r\n          marginBottom: 10,\r\n          display: 'flex',\r\n        }\r\n      : {\r\n          display: 'none',\r\n          marginBottom: theme.spacing(1),\r\n          [theme.breakpoints.up('sm')]: {\r\n            display: 'flex',\r\n          },\r\n        },\r\n  divider: {\r\n    display: 'block',\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  gridItem: {\r\n    padding: `3px 8px !important`,\r\n    [theme.breakpoints.up('sm')]: {\r\n      padding: `8px !important`,\r\n    },\r\n  },\r\n  searchIcon: {\r\n    cursor: 'pointer',\r\n    color: theme.palette.grey[500],\r\n  },\r\n  ellipsis: {\r\n    fontSize: 14,\r\n    width: 'auto',\r\n    whiteSpace: 'normal',\r\n    overflow: 'visible',\r\n    '@media (min-width: 960px)': {\r\n      textOverflow: 'ellipsis',\r\n      whiteSpace: 'nowrap',\r\n      overflow: 'hidden',\r\n    },\r\n    '@media (min-width: 1400px)': {\r\n      width: 'auto',\r\n      whiteSpace: 'normal',\r\n      overflow: 'visible',\r\n    },\r\n  },\r\n  formControlRoot: {\r\n    marginTop: 0,\r\n  },\r\n  textFieldRoot: {\r\n    marginBottom: 0,\r\n  },\r\n  searchWrapper: {\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'flex',\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n  },\r\n  clearSearchButton: {\r\n    '@media (min-width: 408px)': {\r\n      marginTop: 3,\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  searchButton: {\r\n    minWidth: '8rem',\r\n  },\r\n  searchRoot: {\r\n    marginTop: 0,\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport {\r\n  FormControl,\r\n  InputLabel,\r\n  Select,\r\n  MenuItem,\r\n  Grid,\r\n  Button,\r\n  Divider,\r\n  TextField,\r\n  Autocomplete,\r\n  Chip,\r\n} from '@mui/material';\r\nimport { FilterList, Close, ArrowDropDown, ArrowDropUp } from '@mui/icons-material';\r\nimport { IDropdownResponse } from '../../models/util';\r\n\r\ninterface ILocationsFilters {\r\n  isLoading: boolean;\r\n  applyFilters: (clearFilters?: boolean) => void;\r\n  types: IDropdownResponse[];\r\n  selectedType: string;\r\n  setSelectedType: (val: string) => void;\r\n  markets: IDropdownResponse[];\r\n  selectedMarkets: any;\r\n  setSelectedMarkets: any;\r\n  setSearchValue: (val: string) => void;\r\n  searchValue: string;\r\n  handleSearch: (val: string) => void;\r\n  hasAppliedFilters: boolean;\r\n  setHasAppliedFilters: (val: boolean) => void;\r\n}\r\n\r\nexport const LocationsFilters: FC<ILocationsFilters> = ({\r\n  isLoading,\r\n  applyFilters,\r\n  types,\r\n  selectedType,\r\n  setSelectedType,\r\n  setSearchValue,\r\n  searchValue,\r\n  hasAppliedFilters,\r\n  setHasAppliedFilters,\r\n  markets,\r\n  selectedMarkets,\r\n  setSelectedMarkets,\r\n}) => {\r\n  const [isMobileFilterButtonOpen, toggleMobileFilter] = useState<boolean>(false);\r\n  const classes = useStyles({ isMobileFilterButtonOpen });\r\n\r\n  const noFilters = !selectedType && !selectedMarkets && !searchValue;\r\n\r\n  return (\r\n    <>\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.searchWrapper}></Grid>\r\n      <Button\r\n        color=\"secondary\"\r\n        variant=\"contained\"\r\n        className={classes.mobileButton}\r\n        startIcon={<FilterList />}\r\n        endIcon={isMobileFilterButtonOpen ? <ArrowDropUp /> : <ArrowDropDown />}\r\n        onClick={() => {\r\n          toggleMobileFilter(!isMobileFilterButtonOpen);\r\n        }}\r\n      >\r\n        Filters\r\n      </Button>\r\n      {!isMobileFilterButtonOpen && <Divider className={classes.divider} />}\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.wrapper}>\r\n        <Grid item xs={12} sm={6} md={4} lg={2}>\r\n          <TextField\r\n            fullWidth\r\n            variant=\"standard\"\r\n            autoComplete=\"nope\"\r\n            label=\"Search\"\r\n            name=\"search\"\r\n            classes={{ root: classes.searchRoot }}\r\n            value={searchValue}\r\n            size=\"small\"\r\n            onKeyDown={e => {\r\n              if (e.key === 'Enter') {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n              }\r\n            }}\r\n            onChange={e => {\r\n              setSearchValue(e.target.value);\r\n            }}\r\n          />\r\n        </Grid>\r\n        <Grid item xs={6} sm={3} md={3} lg={1}>\r\n          <FormControl\r\n            classes={{ root: classes.formControlRoot }}\r\n            fullWidth\r\n            variant=\"standard\"\r\n            size=\"small\"\r\n          >\r\n            <InputLabel htmlFor=\"locationType\" className={classes.ellipsis}>\r\n              Location Type\r\n            </InputLabel>\r\n            <Select\r\n              disabled={isLoading}\r\n              name=\"Location Type\"\r\n              labelId=\"locationType\"\r\n              id=\"locationType\"\r\n              value={selectedType}\r\n              onChange={({ target: { value } }) => {\r\n                setSelectedType(value);\r\n              }}\r\n              onKeyDown={e => {\r\n                if (e.key === 'Enter' && searchValue.length > 0) {\r\n                  setHasAppliedFilters(true);\r\n                  applyFilters();\r\n                }\r\n              }}\r\n            >\r\n              {types &&\r\n                types.map((type, index) => {\r\n                  return (\r\n                    <MenuItem key={`${index}`} value={type.value}>\r\n                      {type.description}\r\n                    </MenuItem>\r\n                  );\r\n                })}\r\n            </Select>\r\n          </FormControl>\r\n        </Grid>\r\n        <Grid item xs={12} sm={6} md={4} lg={3}>\r\n          <Autocomplete\r\n            multiple\r\n            value={selectedMarkets}\r\n            className={classes.statuses}\r\n            onChange={(event, newValue: any) => {\r\n              setSelectedMarkets(newValue);\r\n            }}\r\n            disabled={isLoading}\r\n            selectOnFocus\r\n            handleHomeEndKeys\r\n            loading={isLoading}\r\n            id=\"selected-markets\"\r\n            options={markets}\r\n            getOptionLabel={(option: IDropdownResponse) => {\r\n              // Value selected with enter, right from the input\r\n              if (typeof option === 'string') {\r\n                return option;\r\n              }\r\n              return `${option.description}`;\r\n            }}\r\n            renderTags={(value, getTagProps) =>\r\n              value.map((option, index) => (\r\n                <Chip\r\n                  variant=\"outlined\"\r\n                  label={typeof option === 'string' ? option : option.description}\r\n                  {...getTagProps({ index })}\r\n                  className={classes.chip}\r\n                />\r\n              ))\r\n            }\r\n            renderInput={params => (\r\n              <TextField\r\n                {...params}\r\n                key={params.id}\r\n                size=\"small\"\r\n                autoComplete=\"on\"\r\n                label=\"Market\"\r\n                variant=\"standard\"\r\n              />\r\n            )}\r\n          />\r\n        </Grid>\r\n        <Grid item xs={12} sm={6} md={4} lg={3}>\r\n          <Button\r\n            color=\"primary\"\r\n            variant=\"contained\"\r\n            className={classes.button}\r\n            disabled={isLoading}\r\n            startIcon={<FilterList />}\r\n            onClick={() => {\r\n              if (noFilters) {\r\n                setHasAppliedFilters(false);\r\n                applyFilters();\r\n              } else {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n              }\r\n            }}\r\n          >\r\n            Apply Filters\r\n          </Button>\r\n          {hasAppliedFilters && (\r\n            <Button\r\n              className={clsx(classes.button, classes.resetButton)}\r\n              variant=\"contained\"\r\n              color=\"inherit\"\r\n              disabled={isLoading}\r\n              startIcon={<Close />}\r\n              onClick={() => {\r\n                setSearchValue('');\r\n                setHasAppliedFilters(false);\r\n                setSelectedType('');\r\n                setSelectedMarkets([]);\r\n                applyFilters(true);\r\n              }}\r\n            >\r\n              Reset\r\n            </Button>\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { isMobileFilterButtonOpen?: boolean }>((theme: Theme) => ({\r\n  mobileButton: {\r\n    width: '100%',\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  button: {\r\n    marginTop: 4,\r\n    marginBottom: 4,\r\n    height: 40,\r\n    textTransform: 'capitalize',\r\n    width: '100%',\r\n\r\n    [theme.breakpoints.up('sm')]: {\r\n      width: 'auto',\r\n      marginLeft: theme.spacing(2),\r\n    },\r\n  },\r\n  resetButton: {\r\n    '@media (min-width: 600px)': {\r\n      marginLeft: 11,\r\n    },\r\n    [theme.breakpoints.up('sm')]: {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  wrapper: ({ isMobileFilterButtonOpen }) =>\r\n    isMobileFilterButtonOpen\r\n      ? {\r\n          marginTop: 10,\r\n          marginBottom: 10,\r\n          display: 'flex',\r\n        }\r\n      : {\r\n          display: 'none',\r\n          marginBottom: theme.spacing(1),\r\n          [theme.breakpoints.up('sm')]: {\r\n            display: 'flex',\r\n          },\r\n        },\r\n  divider: {\r\n    display: 'block',\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  gridItem: {\r\n    padding: `3px 8px !important`,\r\n    [theme.breakpoints.up('sm')]: {\r\n      padding: `8px !important`,\r\n    },\r\n  },\r\n  searchIcon: {\r\n    cursor: 'pointer',\r\n    color: theme.palette.grey[500],\r\n  },\r\n  ellipsis: {\r\n    fontSize: 14,\r\n    width: 'auto',\r\n    whiteSpace: 'normal',\r\n    overflow: 'visible',\r\n    '@media (min-width: 960px)': {\r\n      textOverflow: 'ellipsis',\r\n      whiteSpace: 'nowrap',\r\n      overflow: 'hidden',\r\n    },\r\n    '@media (min-width: 1400px)': {\r\n      width: 'auto',\r\n      whiteSpace: 'normal',\r\n      overflow: 'visible',\r\n    },\r\n  },\r\n  formControlRoot: {\r\n    marginTop: 0,\r\n  },\r\n  textFieldRoot: {\r\n    marginBottom: 0,\r\n  },\r\n  searchWrapper: {\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'flex',\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n  },\r\n  clearSearchButton: {\r\n    '@media (min-width: 408px)': {\r\n      marginTop: 3,\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  searchButton: {\r\n    minWidth: '8rem',\r\n  },\r\n  searchRoot: {\r\n    marginTop: 0,\r\n  },\r\n  chip: {\r\n    fontSize: '0.75rem',\r\n    height: '20px',\r\n    marginBottom: '4px',\r\n  },\r\n  statuses: {\r\n    marginTop: '-16px',\r\n  },\r\n}));\r\n","import { AppBar, Button, Grid, Tab, Tabs, useMediaQuery } from '@mui/material';\r\nimport { FC, useState, useEffect } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Add, Gavel, Paid } from '@mui/icons-material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { getLegalEntities } from '../../fetch/legal-entities';\r\nimport { ILegalEntityList } from '../../models/legal-entitites';\r\nimport { LegalEntityModal } from './add-legal-entity-modal';\r\nimport { LegalEntities } from './tabs/legal-entities';\r\nimport { W2DVMs } from './tabs/w2-dvms';\r\nimport { W2DVMsModal } from './add-w2-dvms-modal';\r\nimport { IW2PaymentReserves } from '../../models/w2-payment-reserve';\r\nimport { getDVMsWithW2Reserves } from '../../fetch/w2-payment-reserve';\r\nimport { sortable } from '../../models/util';\r\n\r\nenum AdminEntitiesTabs {\r\n  LegalEntities,\r\n  W2Witholdings,\r\n}\r\n\r\nexport const EntityManagement: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [legalEntities, setLegalEntities] = useState<ILegalEntityList[]>([]);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [isLegalEntityModalOpen, setIsModalOpen] = useState(false);\r\n  const [isW2DVMModalOpen, setIsW2DVMModalOpen] = useState(false);\r\n  const [isEdit, setIsEdit] = useState<boolean>(false);\r\n  const [currentLegalEntityId, setCurrentLegalEntityId] = useState<number | string>('');\r\n  const [currentDVMId, setCurrentDVMId] = useState<number | string>('');\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const classes = useStyles();\r\n\r\n  const [selectedTab, setSelectedTab] = useState<AdminEntitiesTabs>(\r\n    AdminEntitiesTabs.LegalEntities\r\n  );\r\n\r\n  const fetchLegalEntities = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getLegalEntities();\r\n      setLegalEntities(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading legal entities, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [isLoadingW2Reserves, setIsLoadingW2Reserves] = useState<boolean>(false);\r\n  const [currentW2PaymentReserves, setCurrentW2PaymentReserves] = useState<IW2PaymentReserves[]>(\r\n    []\r\n  );\r\n\r\n  // filters\r\n  const [searchValue, setSearchValue] = useState<string>('');\r\n  const [hasAppliedFilters, setHasAppliedFilters] = useState<boolean>(false);\r\n\r\n  // sorting\r\n  const [selectedSort, setSelectedSort] = useState<string>('Name');\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    Name?: sortable;\r\n    Reserve?: sortable;\r\n    EffectiveDate?: sortable;\r\n  }>({\r\n    Name: 'Asc',\r\n  });\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  const fetchDVMsWithW2Reserves = async () => {\r\n    try {\r\n      setIsLoadingW2Reserves(true);\r\n      const res = await getDVMsWithW2Reserves({\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n\r\n        name: searchValue,\r\n      });\r\n      setCurrentW2PaymentReserves(res.records);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVMs, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoadingW2Reserves(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (selectedTab === AdminEntitiesTabs.LegalEntities) fetchLegalEntities();\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedTab]);\r\n\r\n  useEffect(() => {\r\n    if (selectedTab === AdminEntitiesTabs.W2Witholdings) fetchDVMsWithW2Reserves();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedTab, selectedSort, sortDirection, searchValue]);\r\n\r\n  const handleAdd = () => {\r\n    setIsEdit(false);\r\n    setIsModalOpen(true);\r\n  };\r\n\r\n  const handleAddW2DVM = () => {\r\n    setIsEdit(false);\r\n    setIsW2DVMModalOpen(true);\r\n  };\r\n\r\n  const handleLegalEntitiesEdit = (legalEntityId: number | string) => {\r\n    setIsEdit(true);\r\n    setCurrentLegalEntityId(legalEntityId);\r\n    setIsModalOpen(true);\r\n  };\r\n\r\n  const handleLegalEntityModalClose = () => {\r\n    setCurrentLegalEntityId('');\r\n    setIsModalOpen(false);\r\n  };\r\n\r\n  const handleW2DVMEdit = (dvmId: number | string) => {\r\n    setIsEdit(true);\r\n    setCurrentDVMId(dvmId);\r\n    setIsW2DVMModalOpen(true);\r\n  };\r\n\r\n  const handleW2DVMlClose = () => {\r\n    setCurrentDVMId('');\r\n    setIsW2DVMModalOpen(false);\r\n  };\r\n\r\n  const handleTabChangeWithoutSave = (value: number) => {\r\n    setSelectedTab(value);\r\n  };\r\n\r\n  return (\r\n    <Page\r\n      title={'Entity Management'}\r\n      paddingBottom={24}\r\n      additionalHeaderContent={\r\n        <>\r\n          {selectedTab === AdminEntitiesTabs.LegalEntities && (\r\n            <Button\r\n              startIcon={<Add />}\r\n              color=\"primary\"\r\n              variant=\"contained\"\r\n              disabled={isLoading}\r\n              onClick={() => handleAdd()}\r\n            >\r\n              New Legal Entity\r\n            </Button>\r\n          )}\r\n          {selectedTab === AdminEntitiesTabs.W2Witholdings && (\r\n            <Button\r\n              startIcon={<Add />}\r\n              color=\"primary\"\r\n              variant=\"contained\"\r\n              disabled={isLoading}\r\n              onClick={() => handleAddW2DVM()}\r\n            >\r\n              New W2 DVM\r\n            </Button>\r\n          )}\r\n        </>\r\n      }\r\n    >\r\n      {isLoading && <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />}\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12} className={classes.tabBar}>\r\n          <AppBar\r\n            classes={{ root: classes.tabBarRoot }}\r\n            position=\"static\"\r\n            color=\"default\"\r\n            component=\"div\"\r\n          >\r\n            <Tabs\r\n              value={selectedTab}\r\n              indicatorColor=\"primary\"\r\n              textColor=\"primary\"\r\n              onChange={(_, value) => {\r\n                handleTabChangeWithoutSave(value);\r\n              }}\r\n              variant={isMobile ? 'scrollable' : 'standard'}\r\n            >\r\n              <Tab\r\n                icon={<Gavel />}\r\n                iconPosition={isMobile ? 'top' : 'start'}\r\n                className={classes.profileTabs}\r\n                id=\"legalEntity\"\r\n                aria-controls=\"legalEntity\"\r\n                label={'Legal Entities'}\r\n              />\r\n              <Tab\r\n                icon={<Paid />}\r\n                iconPosition={isMobile ? 'top' : 'start'}\r\n                className={classes.profileTabs}\r\n                id=\"w2DVMs\"\r\n                aria-controls=\"w2DVMs\"\r\n                label={'W2 DVMs'}\r\n              />\r\n            </Tabs>\r\n          </AppBar>\r\n        </Grid>\r\n        <Grid item xs={12}>\r\n          {selectedTab === AdminEntitiesTabs.LegalEntities && (\r\n            <LegalEntities\r\n              handleEdit={handleLegalEntitiesEdit}\r\n              legalEntities={legalEntities}\r\n              setLegalEntities={setLegalEntities}\r\n              isLoading={isLoading}\r\n            />\r\n          )}\r\n          {selectedTab === AdminEntitiesTabs.W2Witholdings && (\r\n            <W2DVMs\r\n              handleEdit={handleW2DVMEdit}\r\n              dvmsWithW2Reserves={currentW2PaymentReserves}\r\n              setDvmsWithW2Reserves={setCurrentW2PaymentReserves}\r\n              isLoading={isLoadingW2Reserves}\r\n              searchValue={searchValue}\r\n              setSearchValue={setSearchValue}\r\n              hasAppliedFilters={hasAppliedFilters}\r\n              setHasAppliedFilters={setHasAppliedFilters}\r\n              handleClickColumn={handleClickColumn}\r\n              sortDirection={sortDirection}\r\n              selectedSort={selectedSort}\r\n              handleSearch={(val: string) => {\r\n                setSearchValue(val);\r\n              }}\r\n            />\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n      <LegalEntityModal\r\n        open={isLegalEntityModalOpen}\r\n        onClose={handleLegalEntityModalClose}\r\n        currentLegalEntityId={currentLegalEntityId}\r\n        fetchLegalEntities={fetchLegalEntities}\r\n        isEdit={isEdit}\r\n      />\r\n      <W2DVMsModal\r\n        open={isW2DVMModalOpen}\r\n        onClose={handleW2DVMlClose}\r\n        currentDVMId={currentDVMId}\r\n        fetchW2DVMs={fetchDVMsWithW2Reserves}\r\n        isEdit={isEdit}\r\n      />\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  tabBar: {\r\n    position: 'sticky',\r\n    top: 0,\r\n    zIndex: 2,\r\n    width: '100vw',\r\n    marginLeft: '-24px',\r\n    paddingTop: '0!important',\r\n    [theme.breakpoints.down('mobile')]: {\r\n      width: '100vw',\r\n    },\r\n  },\r\n  tabBarRoot: {\r\n    width: '100vw',\r\n  },\r\n  profileTabs: {\r\n    fontSize: 14,\r\n    borderRadius: 0,\r\n  },\r\n}));\r\n","import { Mail, Phone } from '@mui/icons-material';\r\nimport { Fade, Grid, Link } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { FC, useMemo } from 'react';\r\nimport {\r\n  formatDate,\r\n  formatInputPhoneNumber,\r\n  formatUtcToLocalShortFriendlyDateWithTime,\r\n} from '../../helpers';\r\nimport { DVMPeekInfo, requestAndShift } from '../../models';\r\nimport { Coin } from '../icons/coin';\r\nimport { Modal } from '../modal';\r\nimport { Table } from '../table/Table';\r\n\r\ninterface IInfoModal {\r\n  isOpen: boolean;\r\n  onClose: () => void;\r\n  info: DVMPeekInfo | null;\r\n}\r\n\r\nexport const InfoModal: FC<IInfoModal> = ({ isOpen, onClose, info }) => {\r\n  const classes = useStyles();\r\n\r\n  const columns = useMemo(\r\n    () => [\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'date',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original.shiftDate && original.shiftTime\r\n                ? `${formatDate(original.shiftDate)} ${original.shiftTime}`\r\n                : ''}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Location',\r\n        accessor: 'location',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return <span>{original.locationName ?? ''}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Rate',\r\n        accessor: 'rate',\r\n        sort: false,\r\n        isNumber: true,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return <span>{original.rate ? `$${original.rate}` : ''}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Incentive',\r\n        accessor: 'incentive',\r\n        sort: false,\r\n        isNumber: true,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original.incentive ? <Coin maxHeight={20} /> : null}{' '}\r\n              {original.incentive ? `$${original.incentive}` : ''}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Total Payment',\r\n        accessor: 'totalPayment',\r\n        sort: false,\r\n        isNumber: true,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return <span>{original.totalPayment ? `$${original.totalPayment}` : ''}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Status',\r\n        accessor: 'status',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return <span>{original.status ?? ''}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Status Date',\r\n        accessor: 'statusDate',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: requestAndShift } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original.statusDate\r\n                ? `${formatUtcToLocalShortFriendlyDateWithTime(original.statusDate)}`\r\n                : ''}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n    ],\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    [info]\r\n  );\r\n\r\n  return (\r\n    <Modal\r\n      titleContent={\r\n        <Link target={'_blank'} href={`/dvms/${info?.dvmId}`}>\r\n          {info?.name}\r\n        </Link>\r\n      }\r\n      open={isOpen}\r\n      onClose={() => {\r\n        onClose();\r\n      }}\r\n      maxWidth=\"lg\"\r\n    >\r\n      <Fade in={isOpen}>\r\n        <Grid container>\r\n          <Grid item xs={12} sm={6}>\r\n            <Link\r\n              className={classes.link}\r\n              color={'secondary'}\r\n              variant=\"body2\"\r\n              href={`tel:${info?.phone}`}\r\n            >\r\n              {<Phone />} {formatInputPhoneNumber(info?.phone)}\r\n            </Link>\r\n          </Grid>\r\n          <Grid item xs={12} sm={6}>\r\n            <Link\r\n              className={classes.link}\r\n              color={'secondary'}\r\n              variant=\"body2\"\r\n              href={`mailto:${info?.email}`}\r\n            >\r\n              {<Mail />} {info?.email}\r\n            </Link>\r\n          </Grid>\r\n          <Grid item xs={12}>\r\n            <Table\r\n              columns={columns}\r\n              data={info?.requestsAndShifts ?? []}\r\n              hidePagination\r\n              isLoading={false}\r\n            />\r\n          </Grid>\r\n        </Grid>\r\n      </Fade>\r\n    </Modal>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  link: {\r\n    display: 'flex',\r\n    gap: theme.spacing(1),\r\n  },\r\n}));\r\n","import { Edit, Close } from '@mui/icons-material';\r\nimport {\r\n  Autocomplete,\r\n  Box,\r\n  Button,\r\n  Fade,\r\n  Grid,\r\n  InputAdornment,\r\n  TextField,\r\n  Typography,\r\n} from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { useSnackbar } from 'notistack';\r\nimport { FC, useEffect, useState } from 'react';\r\nimport { getDVMContractors } from '../../fetch/lookups';\r\nimport {\r\n  createRSSShiftRequest,\r\n  updateRSSShift,\r\n  updateRSSShiftRequest,\r\n} from '../../fetch/shift-requests';\r\nimport { formatDate } from '../../helpers';\r\nimport {\r\n  IConfiguredShiftCalendar,\r\n  IMarketCalendarLocation,\r\n  IMarketCalendarShiftRequest,\r\n  IShift,\r\n} from '../../models/schedule';\r\nimport { IDropdownResponse, IDVMDropdown } from '../../models/util';\r\nimport { Coin } from '../icons/coin';\r\n\r\nimport { Modal } from '../modal';\r\n\r\ninterface IRSSAddEditModal {\r\n  isOpen: boolean;\r\n  onClose: () => void;\r\n  date: Date;\r\n  location: IMarketCalendarLocation;\r\n  fetchSchedule: () => Promise<void> | undefined;\r\n  shift?: IShift;\r\n  scheduledShift?: IMarketCalendarShiftRequest;\r\n  thisDaysIncentive: number | null;\r\n}\r\n\r\nexport const RSSAddEditModal: FC<IRSSAddEditModal> = ({\r\n  isOpen,\r\n  onClose,\r\n  date,\r\n  location,\r\n  fetchSchedule,\r\n  shift,\r\n  scheduledShift,\r\n  thisDaysIncentive,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const [contractors, setContractors] = useState<IDVMDropdown[] | null>(null);\r\n  const [areContractorsLoading, setAreContractorsLoading] = useState<boolean>(false);\r\n  const [selectedContractor, setSelectedContractor] = useState<IDVMDropdown | null>(null);\r\n  const [selectedAmount, setSelectedAmount] = useState<number | string | null>(null);\r\n  const [selectedIncentive, setSelectedIncentive] = useState<number | string | null>(null);\r\n\r\n  useEffect(() => {\r\n    setSelectedAmount(\r\n      shift?.amount ? shift?.amount : scheduledShift?.amount ? scheduledShift?.amount : null\r\n    );\r\n    setSelectedIncentive(\r\n      typeof shift?.incentive === 'number'\r\n        ? shift?.incentive\r\n        : typeof scheduledShift?.incentive === 'number' || scheduledShift?.incentive === null\r\n        ? scheduledShift?.incentive\r\n        : thisDaysIncentive\r\n    );\r\n    // setSelectedContractor(\r\n    //   shift?.dvmId ? shift?.dvmId : scheduledShift?.dvmId ? scheduledShift?.dvmId : null\r\n    // );\r\n  }, [shift, scheduledShift, thisDaysIncentive]);\r\n\r\n  const getDVMName = () => {\r\n    return shift?.dvmName\r\n      ? shift?.dvmName\r\n      : scheduledShift?.dvmName\r\n      ? scheduledShift?.dvmName\r\n      : null;\r\n  };\r\n\r\n  const handleClose = () => {\r\n    setSelectedAmount(null);\r\n    setSelectedIncentive(null);\r\n    setSelectedContractor(null);\r\n    onClose();\r\n  };\r\n\r\n  const fetchContractors = async () => {\r\n    try {\r\n      setAreContractorsLoading(true);\r\n      const res = await getDVMContractors({\r\n        locationId: location.locationId,\r\n        shiftDate: date.toDateString(),\r\n      });\r\n      setContractors(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(\r\n        errorMessage || `Error loading Contractors, please refresh the page and try again.`,\r\n        {\r\n          variant: 'error',\r\n        }\r\n      );\r\n      console.log(error);\r\n    } finally {\r\n      setAreContractorsLoading(false);\r\n    }\r\n  };\r\n\r\n  const getTitle = () => {\r\n    if (shift) return `Edit Shift: ${location?.locationName} - ${formatDate(date)}` ?? '';\r\n    if (scheduledShift)\r\n      return `Edit Shift Request: ${location?.locationName} - ${formatDate(date)}` ?? '';\r\n\r\n    return `${location?.locationName} - ${formatDate(date)}` ?? '';\r\n  };\r\n\r\n  const [isSubmitting, setIsSubmitting] = useState(false);\r\n  const addRequest = async () => {\r\n    try {\r\n      setIsSubmitting(true);\r\n\r\n      if (shift) {\r\n        await updateRSSShift({\r\n          amount: selectedAmount as number,\r\n          shiftId: shift.shiftId as number,\r\n          incentive: selectedIncentive as number,\r\n        });\r\n      } else if (scheduledShift) {\r\n        await updateRSSShiftRequest({\r\n          amount: selectedAmount as number,\r\n          shiftRequestId: scheduledShift.shiftRequestId,\r\n          incentive: selectedIncentive as number,\r\n        });\r\n      } else {\r\n        await createRSSShiftRequest({\r\n          shiftRequest: {\r\n            locationId: location.locationId,\r\n            shiftDate: new Date(date).toDateString(),\r\n            amount: selectedAmount as string,\r\n            dvmId: selectedContractor?.value as string,\r\n            incentive: selectedIncentive as string,\r\n            configuredShiftId:\r\n              (location?.configuredShifts as unknown as IConfiguredShiftCalendar[])?.find(\r\n                cs => new Date(cs?.shiftDate)?.toDateString() === new Date(date)?.toDateString()\r\n              )?.configuredShiftId ?? undefined,\r\n          },\r\n        });\r\n      }\r\n      await fetchSchedule();\r\n      handleClose();\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error creating a request, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n\r\n      console.log(error);\r\n    } finally {\r\n      setIsSubmitting(false);\r\n    }\r\n  };\r\n\r\n  const isEdit = !!shift || !!scheduledShift;\r\n\r\n  useEffect(() => {\r\n    if (location && date && !isEdit) fetchContractors();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [location, date, isEdit]);\r\n\r\n  return (\r\n    <Modal\r\n      titleContent={getTitle()}\r\n      open={isOpen}\r\n      onClose={() => {\r\n        handleClose();\r\n      }}\r\n      maxWidth=\"md\"\r\n    >\r\n      <Fade in={isOpen}>\r\n        <Grid container spacing={2} alignItems={'flex-end'}>\r\n          {!isEdit ? (\r\n            <Grid item xs={12} sm={4}>\r\n              <Autocomplete\r\n                value={selectedContractor as IDropdownResponse}\r\n                onChange={(event, newValue: any) => {\r\n                  setSelectedContractor(newValue);\r\n                }}\r\n                disabled={areContractorsLoading}\r\n                selectOnFocus\r\n                handleHomeEndKeys\r\n                loading={areContractorsLoading}\r\n                id=\"selected-dvm\"\r\n                options={contractors || []}\r\n                getOptionLabel={(option: IDropdownResponse) => {\r\n                  // Value selected with enter, right from the input\r\n                  if (typeof option === 'string') {\r\n                    return option;\r\n                  }\r\n                  return `${option.description}`;\r\n                }}\r\n                renderInput={params => (\r\n                  <TextField\r\n                    {...params}\r\n                    key={params.id}\r\n                    size=\"small\"\r\n                    autoComplete=\"on\"\r\n                    label=\"Available DVM's\"\r\n                    variant=\"standard\"\r\n                  />\r\n                )}\r\n              />\r\n            </Grid>\r\n          ) : (\r\n            <Grid item xs={12} sm={4}>\r\n              <TextField label=\"DVM\" variant={'standard'} disabled value={getDVMName()} />\r\n            </Grid>\r\n          )}\r\n          <Grid item xs={12} sm={4}>\r\n            <TextField\r\n              label=\"Requested Rate\"\r\n              variant={'standard'}\r\n              value={selectedAmount ?? ''}\r\n              onChange={e => {\r\n                const re = /^[0-9\\b]+$/;\r\n                // make sure it is number only before we update state\r\n                if (e.target.value === '' || re.test(e.target.value)) {\r\n                  setSelectedAmount(e.target.value);\r\n                }\r\n              }}\r\n              InputProps={{\r\n                startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\r\n                endAdornment: <InputAdornment position=\"end\">/day</InputAdornment>,\r\n              }}\r\n              // https://github.com/mui/material-ui/issues/9046\r\n              inputProps={{\r\n                inputMode: 'numeric',\r\n                pattern: '[0-9]*',\r\n              }}\r\n            />\r\n          </Grid>\r\n          <Grid item xs={12} sm={4}>\r\n            <TextField\r\n              label=\"Incentive Amount\"\r\n              variant={'standard'}\r\n              value={selectedIncentive ?? ''}\r\n              onChange={e => {\r\n                const re = /^[0-9\\b]+$/;\r\n                // make sure it is number only before we update state\r\n                if (e.target.value === '' || re.test(e.target.value)) {\r\n                  setSelectedIncentive(e.target.value);\r\n                }\r\n              }}\r\n              InputProps={{\r\n                startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\r\n                endAdornment: <InputAdornment position=\"end\">/day</InputAdornment>,\r\n              }}\r\n              // https://github.com/mui/material-ui/issues/9046\r\n              inputProps={{\r\n                inputMode: 'numeric',\r\n                pattern: '[0-9]*',\r\n              }}\r\n            />\r\n          </Grid>\r\n          <Grid item xs={12}>\r\n            <Typography variant=\"h3\" color=\"textSecondary\">\r\n              Total: {selectedIncentive ? <Coin maxHeight={20} /> : ''}\r\n              {`$${Number(selectedAmount) + Number(selectedIncentive)}`}\r\n            </Typography>\r\n          </Grid>\r\n          <Grid item xs={12} textAlign={'right'}>\r\n            <Box marginTop=\"1rem\">\r\n              <Button\r\n                className={classes.button}\r\n                disabled={isSubmitting || !selectedAmount || (!isEdit && !selectedContractor)}\r\n                startIcon={<Edit />}\r\n                variant=\"contained\"\r\n                color=\"primary\"\r\n                onClick={() => addRequest()}\r\n              >\r\n                Save\r\n              </Button>\r\n              <Button\r\n                className={classes.button}\r\n                type=\"button\"\r\n                variant=\"contained\"\r\n                color=\"inherit\"\r\n                disabled={isSubmitting}\r\n                startIcon={<Close />}\r\n                onClick={() => {\r\n                  handleClose();\r\n                }}\r\n              >\r\n                Cancel\r\n              </Button>\r\n            </Box>\r\n          </Grid>\r\n        </Grid>\r\n      </Fade>\r\n    </Modal>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  link: {\r\n    display: 'flex',\r\n    gap: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport { IconButton, Menu, MenuItem } from '@mui/material';\r\nimport { MoreHoriz } from '@mui/icons-material';\r\nimport { ICalendarMenuOption } from '.';\r\n\r\nexport interface ICalendarEventMenu {\r\n  menuItems: ICalendarMenuOption[];\r\n  darkBackground?: boolean;\r\n}\r\nexport const CalendarEventMenu: FC<ICalendarEventMenu> = ({\r\n  menuItems,\r\n  darkBackground = false,\r\n}) => {\r\n  // Menu\r\n  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n  const open = Boolean(anchorEl);\r\n  const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n    setAnchorEl(event.currentTarget);\r\n  };\r\n  const handleClose = () => {\r\n    setAnchorEl(null);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <IconButton\r\n        id=\"dvm-event-menu-button\"\r\n        aria-controls={open ? 'dvm-event-menu-button' : undefined}\r\n        aria-haspopup=\"true\"\r\n        aria-expanded={open ? 'true' : undefined}\r\n        onClick={handleClick}\r\n        sx={{ color: darkBackground ? 'white' : '' }}\r\n      >\r\n        <MoreHoriz />\r\n      </IconButton>\r\n      <Menu\r\n        id=\"dvm-event-menu\"\r\n        anchorEl={anchorEl}\r\n        open={open}\r\n        onClose={handleClose}\r\n        MenuListProps={{\r\n          'aria-labelledby': 'dvm-event-menu-button',\r\n        }}\r\n      >\r\n        {' '}\r\n        {menuItems.map((item, index) => (\r\n          <MenuItem\r\n            disabled={item.disabled}\r\n            key={`${item.label}-${index}`}\r\n            onClick={() => {\r\n              item.action();\r\n              handleClose();\r\n            }}\r\n          >\r\n            {item.label}\r\n          </MenuItem>\r\n        ))}\r\n      </Menu>\r\n    </>\r\n  );\r\n};\r\n","import React, { createContext, Dispatch, FC, SetStateAction, useState } from 'react';\r\nimport { ISchedulePayload } from '../models/schedule';\r\n\r\nexport interface IShiftRequestApproval {\r\n  shiftRequestApproval: IShiftRequests;\r\n}\r\n\r\nexport interface IShiftRequests {\r\n  requests: IShiftApprovals[];\r\n}\r\nexport interface IShiftApprovals {\r\n  shiftId: number;\r\n  dvmId: number;\r\n  locationId: number;\r\n  date: string | Date;\r\n}\r\ninterface IRSSMarketRepeaterContext {\r\n  isLoading: boolean;\r\n  setIsLoading: Dispatch<SetStateAction<boolean>>;\r\n  payloads: ISchedulePayload[];\r\n  setPayloads: Dispatch<SetStateAction<ISchedulePayload[]>>;\r\n  allPayloads: IShiftRequestApproval;\r\n  setAllPayloads: Dispatch<SetStateAction<IShiftRequestApproval>>;\r\n}\r\n\r\ninterface IRSSMarketRepeaterContextHandlerProps {\r\n  children: React.ReactNode;\r\n}\r\n\r\nexport const RSSMarketRepeaterContext = createContext<IRSSMarketRepeaterContext>({\r\n  isLoading: false,\r\n  setIsLoading: () => {},\r\n  payloads: [],\r\n  setPayloads: () => {},\r\n  allPayloads: { shiftRequestApproval: { requests: [] } },\r\n  setAllPayloads: () => {},\r\n});\r\n\r\nexport const RSSMarketRepeaterHandler: FC<IRSSMarketRepeaterContextHandlerProps> = ({\r\n  children,\r\n}) => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [payloads, setPayloads] = useState<any>([]);\r\n  const [allPayloads, setAllPayloads] = useState<IShiftRequestApproval>({\r\n    shiftRequestApproval: { requests: [] },\r\n  });\r\n\r\n  return (\r\n    <RSSMarketRepeaterContext.Provider\r\n      value={{\r\n        isLoading,\r\n        setIsLoading,\r\n        payloads,\r\n        setPayloads,\r\n        allPayloads,\r\n        setAllPayloads,\r\n      }}\r\n    >\r\n      {children}\r\n    </RSSMarketRepeaterContext.Provider>\r\n  );\r\n};\r\n","import { FC, useCallback, useContext, useEffect, useMemo, useState } from 'react';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport {\r\n  IMarketCalendarLocation,\r\n  IMarketCalendarShiftRequest,\r\n  IShift,\r\n} from '../../models/schedule';\r\nimport { Typography, Checkbox, Link, alpha } from '@mui/material';\r\nimport clsx from 'clsx';\r\nimport { Coin } from '../icons/coin';\r\nimport { RSSAddEditModal } from './rss-add-modal';\r\nimport { CalendarEventMenu } from './calendar-event-menu';\r\nimport { ICalendarMenuOption } from '.';\r\nimport { RSSMarketRepeaterContext } from '../../context/rss-market-repeater';\r\n\r\ninterface IRSSCheckbox {\r\n  checkedRequests: IMarketCalendarShiftRequest[];\r\n  rejectedRequests: any[];\r\n  request: IMarketCalendarShiftRequest;\r\n  handleApprove: (request: IMarketCalendarShiftRequest) => void;\r\n  handleReject: (request: IMarketCalendarShiftRequest) => void;\r\n  handleReinstate: ((request: IMarketCalendarShiftRequest) => void) | undefined;\r\n  reinstatedRequests?: IMarketCalendarShiftRequest[];\r\n  onSchedule: IShift[];\r\n  handleModalOpen: () => Promise<void>;\r\n  fetchSchedule: (() => Promise<void>) | undefined;\r\n  location: IMarketCalendarLocation;\r\n  thisDaysIncentive: number | null;\r\n}\r\n\r\nexport const RSSCheckbox: FC<IRSSCheckbox> = ({\r\n  checkedRequests,\r\n  rejectedRequests,\r\n  request,\r\n  handleApprove: toggleApprove,\r\n  handleReject,\r\n  handleReinstate,\r\n  onSchedule,\r\n  handleModalOpen,\r\n  fetchSchedule,\r\n  location,\r\n  thisDaysIncentive,\r\n  reinstatedRequests,\r\n}) => {\r\n  const getStatusLabel = useCallback(\r\n    (request: IMarketCalendarShiftRequest) => {\r\n      if (\r\n        rejectedRequests\r\n          ?.map?.((req: any) => req.shiftRequestId)\r\n          ?.find(\r\n            (reqId: number | string) =>\r\n              reqId === (request as IMarketCalendarShiftRequest)?.shiftRequestId\r\n          )\r\n      ) {\r\n        return 'Rejected';\r\n      }\r\n      if (\r\n        checkedRequests?.find(\r\n          (req: IMarketCalendarShiftRequest) =>\r\n            req.shiftRequestId === (request as IMarketCalendarShiftRequest)?.shiftRequestId\r\n        )\r\n      ) {\r\n        return 'Not Saved';\r\n      }\r\n      if (\r\n        reinstatedRequests?.find(\r\n          (req: IMarketCalendarShiftRequest) =>\r\n            req.shiftRequestId === (request as IMarketCalendarShiftRequest)?.shiftRequestId\r\n        )\r\n      ) {\r\n        return 'Reinstate';\r\n      }\r\n      return request.status || '';\r\n    },\r\n    [checkedRequests, rejectedRequests, reinstatedRequests]\r\n  );\r\n\r\n  const determineClassFromStatus = (request: IMarketCalendarShiftRequest) => {\r\n    if (request.hasBeenReinstated && request.status === 'Pending') {\r\n      return classes.inactiveReinstated;\r\n    }\r\n\r\n    if (request.status === 'Pending') {\r\n      return classes.inactivePending;\r\n    } else if (request.status === 'Approved') {\r\n      return classes.inactiveApproved;\r\n    } else if (request.status === 'Rejected') {\r\n      return classes.inactiveRejected;\r\n    } else if (request.status === 'Canceled') {\r\n      if (request?.cancelationSource === 'RSS') {\r\n        return classes.inactiveCanceledByRSS;\r\n      }\r\n      return classes.inactiveCanceledByDVM;\r\n    }\r\n  };\r\n\r\n  const currentStatus = useMemo(() => {\r\n    return getStatusLabel(request);\r\n  }, [getStatusLabel, request]);\r\n\r\n  const classes = useStyles({ reinstated: request?.hasBeenReinstated });\r\n  const selectedRelief =\r\n    (!!checkedRequests &&\r\n      checkedRequests?.find(\r\n        (req: { shiftRequestId: number }) => req.shiftRequestId === request.shiftRequestId\r\n      )) ??\r\n    false;\r\n\r\n  const { allPayloads } = useContext(RSSMarketRepeaterContext);\r\n  const isDisabled = useCallback(() => {\r\n    const sameLocationSameDate =\r\n      !!checkedRequests &&\r\n      !!checkedRequests?.find(\r\n        (req: IMarketCalendarShiftRequest) =>\r\n          req.locationId === request.locationId &&\r\n          new Date(req.shiftDate).getTime() === new Date(request.shiftDate).getTime()\r\n      );\r\n    const sameDVMsameDate =\r\n      !!checkedRequests &&\r\n      checkedRequests?.find(\r\n        (req: IMarketCalendarShiftRequest) =>\r\n          req.dvmId === request.dvmId &&\r\n          new Date(req.shiftDate).getTime() === new Date(request.shiftDate).getTime()\r\n      );\r\n\r\n    const sameDVMsameDateScheduled = onSchedule\r\n      .map(sched => {\r\n        return { dvmId: sched.dvmId, shiftDate: new Date(sched.shiftDate).getTime() };\r\n      })\r\n      .some(\r\n        schedule =>\r\n          schedule.dvmId === request.dvmId &&\r\n          new Date(schedule.shiftDate).getTime() === new Date(request.shiftDate).getTime()\r\n      );\r\n\r\n    const selectedDVMRequest = allPayloads?.shiftRequestApproval?.requests?.find(\r\n      (dvm: any) =>\r\n        // same dvm\r\n        dvm.dvmId === request.dvmId &&\r\n        dvm.date === request.shiftDate &&\r\n        dvm.locationId === request.locationId\r\n    );\r\n\r\n    // These are the 'rules' that govern if a checkbox is disabled or is clickable\r\n    let shouldBeDisabled = false;\r\n\r\n    const isSelectedAcrossMarkets = allPayloads?.shiftRequestApproval?.requests?.filter(\r\n      (req: any) => req.dvmId === request.dvmId\r\n    );\r\n\r\n    const DVMIsAlreadySelectedOnSameDate = isSelectedAcrossMarkets?.some(\r\n      selected => selected.date === request.shiftDate\r\n    );\r\n\r\n    if (sameLocationSameDate || sameDVMsameDate || sameDVMsameDateScheduled) {\r\n      // If you are in the same location at the same time as the selected DVM, you should be disabled\r\n      // if you are the same DVM as the selected DVM on the same day, you should be disabled\r\n      shouldBeDisabled = true;\r\n    }\r\n\r\n    if (DVMIsAlreadySelectedOnSameDate) {\r\n      shouldBeDisabled = true;\r\n    }\r\n\r\n    if (!!selectedDVMRequest) {\r\n      // if you are the selectedDVM themselves, you should NOT be disabled\r\n      shouldBeDisabled = false;\r\n    }\r\n\r\n    return shouldBeDisabled;\r\n  }, [allPayloads, checkedRequests, onSchedule, request]);\r\n\r\n  const isChecked = !!selectedRelief;\r\n\r\n  const selectedReliefPendingReinstatement =\r\n    (!!reinstatedRequests &&\r\n      reinstatedRequests?.find(\r\n        (req: { shiftRequestId: number }) => req.shiftRequestId === request.shiftRequestId\r\n      )) ??\r\n    false;\r\n\r\n  const isPendingReinstatement = !!selectedReliefPendingReinstatement;\r\n\r\n  const [isRSSAddModalOpen, setIsRSSAddModalOpen] = useState(false);\r\n  const [RSSModalSelectedShiftRequest, setRSSModalSelectedShiftRequest] =\r\n    useState<IMarketCalendarShiftRequest | null>(null);\r\n\r\n  useEffect(() => {\r\n    if (RSSModalSelectedShiftRequest) {\r\n      setIsRSSAddModalOpen(true);\r\n    }\r\n  }, [RSSModalSelectedShiftRequest]);\r\n\r\n  const menuItems: ICalendarMenuOption[] = [\r\n    {\r\n      action: () => {\r\n        toggleApprove(request);\r\n      },\r\n      label: 'Approve',\r\n      disabled: currentStatus === 'Rejected',\r\n    },\r\n    {\r\n      action: () => {\r\n        if (currentStatus === 'Not Saved') toggleApprove(request);\r\n        handleReject(request);\r\n      },\r\n      label: currentStatus === 'Rejected' ? 'Unreject' : 'Reject',\r\n      disabled: false,\r\n    },\r\n  ];\r\n\r\n  const reinstateMenuItems: ICalendarMenuOption[] = [\r\n    {\r\n      action: () => {\r\n        handleReinstate?.(request || {});\r\n      },\r\n      label: isPendingReinstatement ? 'Keep Pending' : 'Reinstate to Pending',\r\n      disabled: false,\r\n    },\r\n  ];\r\n\r\n  const getMenuItems = () => {\r\n    if (request.status === 'Rejected' || request.status === 'Canceled') {\r\n      return reinstateMenuItems;\r\n    }\r\n    return menuItems;\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <div\r\n        key={request.shiftRequestId}\r\n        className={clsx(\r\n          classes.bid,\r\n          isChecked && classes.checkedBid,\r\n          determineClassFromStatus(request)\r\n        )}\r\n      >\r\n        <div>\r\n          <Typography onClick={handleModalOpen} className={classes.bidName}>\r\n            {request.dvmName}\r\n          </Typography>\r\n          <Link\r\n            className={classes.link}\r\n            color={'inherit'}\r\n            onClick={() => {\r\n              setRSSModalSelectedShiftRequest(request);\r\n            }}\r\n          >\r\n            <Typography>\r\n              {`$${request.totalAmount}`}\r\n              {request.hasIncentive ? <Coin maxHeight={20} /> : null}\r\n            </Typography>\r\n          </Link>\r\n        </div>\r\n        <div className={classes.eventMenuContainer}>\r\n          <CalendarEventMenu menuItems={getMenuItems()} />\r\n        </div>\r\n        {!(request.status === 'Rejected' || request.status === 'Canceled') && (\r\n          <Checkbox\r\n            disabled={isDisabled()}\r\n            classes={{\r\n              root: isChecked ? classes.checkbox : '',\r\n            }}\r\n            checked={isChecked}\r\n            onChange={() => {\r\n              toggleApprove(request);\r\n            }}\r\n            className={classes.checkboxArea}\r\n            inputProps={{ 'aria-label': 'controlled' }}\r\n          />\r\n        )}\r\n\r\n        {(request.status === 'Rejected' || request.status === 'Canceled') && (\r\n          <Checkbox\r\n            classes={{\r\n              root: isPendingReinstatement ? classes.pendingCheckbox : '',\r\n            }}\r\n            checked={isPendingReinstatement}\r\n            onChange={() => {\r\n              handleReinstate?.(request || {});\r\n            }}\r\n            className={classes.checkboxArea}\r\n            inputProps={{ 'aria-label': 'controlled' }}\r\n          />\r\n        )}\r\n\r\n        <div className={classes.statusLabelContainer}>\r\n          <Typography className={classes.statusLabel} variant=\"caption\">\r\n            {currentStatus}\r\n          </Typography>\r\n        </div>\r\n      </div>\r\n      <RSSAddEditModal\r\n        isOpen={isRSSAddModalOpen}\r\n        onClose={() => {\r\n          setIsRSSAddModalOpen(false);\r\n          setRSSModalSelectedShiftRequest(null);\r\n        }}\r\n        fetchSchedule={() => fetchSchedule?.()}\r\n        date={RSSModalSelectedShiftRequest?.shiftDate as Date}\r\n        scheduledShift={RSSModalSelectedShiftRequest ?? undefined}\r\n        location={location as IMarketCalendarLocation}\r\n        thisDaysIncentive={thisDaysIncentive}\r\n      />\r\n    </>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme, { reinstated: boolean }>((theme: Theme) => ({\r\n  bid: {\r\n    width: '80%',\r\n    borderRadius: '10px',\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'space-between',\r\n    paddingLeft: theme.spacing(1),\r\n    minHeight: '7rem',\r\n    borderTop: `3px solid ${theme.palette.grey[300]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[300]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[300]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[300]}`,\r\n    margin: theme.spacing(1, 0.25, 0),\r\n    alignSelf: 'flex-start',\r\n    '&:last-of-type': {\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n    '&.reinstated': {\r\n      borderTop: `3px solid ${theme.palette.primary.main}`,\r\n      borderRight: `3px solid ${theme.palette.primary.main} !important`,\r\n      borderBottom: `3px solid ${theme.palette.primary.main}`,\r\n      borderLeft: `3px solid ${theme.palette.primary.main}`,\r\n    },\r\n    position: 'relative',\r\n  },\r\n  checkedBid: {\r\n    backgroundColor: ({ reinstated }) =>\r\n      reinstated ? theme.palette.primary.light : theme.palette.primary.light,\r\n    color: theme.palette.common.white,\r\n  },\r\n  pendingCheckbox: { '&.Mui-checked': { color: theme.palette.secondary.main } },\r\n  checkbox: { '&.Mui-checked': { color: theme.palette.common.white } },\r\n  checkboxArea: {\r\n    marginTop: '1.5rem',\r\n  },\r\n  bidName: {\r\n    textDecoration: 'underline',\r\n  },\r\n  truncate: {\r\n    whiteSpace: 'nowrap',\r\n    overflow: 'hidden',\r\n    textOverflow: 'ellipsis',\r\n  },\r\n  eventMenuContainer: {\r\n    position: 'absolute',\r\n    right: '0',\r\n    top: '0',\r\n  },\r\n  statusLabelContainer: {\r\n    position: 'absolute',\r\n    right: '0',\r\n    bottom: '0',\r\n    textAlign: 'right',\r\n    marginRight: '.5rem',\r\n  },\r\n  statusLabel: {\r\n    backgroundColor: alpha(theme.palette.common.white, 0),\r\n  },\r\n  //Reinstated\r\n  inactiveReinstated: {\r\n    backgroundColor: '#E1F7FF',\r\n    borderTop: `3px solid ${theme.palette.secondary.light}`,\r\n    borderRight: `3px solid ${theme.palette.secondary.light} !important`,\r\n    borderBottom: `3px solid ${theme.palette.secondary.light}`,\r\n    borderLeft: `3px solid ${theme.palette.secondary.light}`,\r\n  },\r\n  //Rejected\r\n  inactiveRejected: {\r\n    backgroundColor: theme.palette.grey[200],\r\n    borderTop: `3px solid ${theme.palette.grey[500]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[500]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[500]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[500]}`,\r\n  },\r\n  //Canceled by RSS\r\n  inactiveCanceledByRSS: {\r\n    backgroundColor: theme.palette.grey[200],\r\n    borderTop: `3px solid ${theme.palette.grey[500]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[500]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[500]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[500]}`,\r\n  },\r\n  //Canceled by DVM\r\n  inactiveCanceledByDVM: {\r\n    backgroundColor: theme.palette.common.white,\r\n    borderTop: `3px solid ${theme.palette.error.dark}`,\r\n    borderRight: `3px solid ${theme.palette.error.dark} !important`,\r\n    borderBottom: `3px solid ${theme.palette.error.dark}`,\r\n    borderLeft: `3px solid ${theme.palette.error.dark}`,\r\n  },\r\n  //Pending/ Not Selected\r\n  inactivePending: {\r\n    borderTop: `3px solid ${theme.palette.grey[200]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[200]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[200]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[200]}`,\r\n  },\r\n  //Approved\r\n  inactiveApproved: {\r\n    color: theme.palette.common.white,\r\n    backgroundColor: '#4c5076',\r\n    justifyContent: 'space-around',\r\n  },\r\n}));\r\n","import { AddCircle, HighlightOff } from '@mui/icons-material';\r\nimport { Button, IconButton, Link, Typography, alpha } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport clsx from 'clsx';\r\nimport { format } from 'date-fns';\r\nimport { FC } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n  IConfiguredShiftCalendar,\r\n  IMarketCalendarLocation,\r\n  IMarketCalendarShiftRequest,\r\n  IShift,\r\n} from '../../models/schedule';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { Coin } from '../icons/coin';\r\nimport { CalendarEventMenu } from './calendar-event-menu';\r\nimport { RSSCheckbox } from './rss-checkbox';\r\n\r\ninterface ICalendarEvent {\r\n  isSameDay: (a: Date, b: Date) => boolean;\r\n  isSelected: (a: Date, b: Date) => string;\r\n  isMarket: boolean;\r\n  determineClass: (calendarItem: IShift) => string;\r\n  isBeforeOpenDate: boolean;\r\n  isAfterCloseDate: boolean;\r\n  onCalendar: IShift | undefined;\r\n  location: string | IMarketCalendarLocation;\r\n  day: Date;\r\n  handleModalOpen: (dvmId: number, mondayDate: Date) => Promise<void>;\r\n  setRSSModalSelectedShift: (shift: IShift) => void;\r\n  setRssAddLocation: (location: IMarketCalendarLocation) => void;\r\n  setRssAddDate: (date: Date) => void;\r\n  setIsRSSAddModalOpen: (isOpen: boolean) => void;\r\n  setRssIncentive: (incentive: number) => void;\r\n  cloneDay: Date;\r\n  selectedDate: Date;\r\n  startDate: Date;\r\n  isRelief: boolean;\r\n  allowDvmCardDelete?: boolean;\r\n  selectedDvm: IDropdownResponse | null | undefined;\r\n  selectedDVMSchedule: string[] | undefined;\r\n  handleRemoveClick: (day: Date, locationId?: string | number) => void;\r\n  onDateClickHandle: (date: Date) => void;\r\n  handleApprove: ((request: IMarketCalendarShiftRequest) => void) | undefined;\r\n  handleReject: ((request: IMarketCalendarShiftRequest) => void) | undefined;\r\n  handleReinstate: ((request: IMarketCalendarShiftRequest) => void) | undefined;\r\n  checkedRequests: IMarketCalendarShiftRequest[] | undefined;\r\n  reinstatedRequests: IMarketCalendarShiftRequest[] | undefined;\r\n  rejectedRequests: IMarketCalendarShiftRequest[] | undefined;\r\n  onSchedule: IMarketCalendarLocation[] | undefined;\r\n  thisDaysRequests: IMarketCalendarShiftRequest[] | undefined;\r\n  thisDaysIncentive: number;\r\n  onCalendarGeneralPractice?: any;\r\n  thisDaysConfiguredShifts?: IConfiguredShiftCalendar[] | undefined;\r\n  isLocationGeneralPractice: boolean;\r\n  fetchSchedule: (() => Promise<void>) | undefined;\r\n  dateHasRecentCancelation?: boolean;\r\n  showInactiveRequests?: boolean;\r\n  variant?: 'FT-Scheduling' | 'Other';\r\n}\r\n\r\nexport const CalendarEvent: FC<ICalendarEvent> = ({\r\n  isSameDay,\r\n  isSelected,\r\n  isMarket,\r\n  determineClass,\r\n  isBeforeOpenDate,\r\n  isAfterCloseDate,\r\n  onCalendar,\r\n  location,\r\n  day,\r\n  handleModalOpen,\r\n  setRSSModalSelectedShift,\r\n  setRssAddLocation,\r\n  setRssAddDate,\r\n  setIsRSSAddModalOpen,\r\n  setRssIncentive,\r\n  cloneDay,\r\n  selectedDate,\r\n  startDate,\r\n  isRelief,\r\n  allowDvmCardDelete,\r\n  selectedDvm,\r\n  selectedDVMSchedule,\r\n  handleRemoveClick,\r\n  onDateClickHandle,\r\n  handleApprove,\r\n  handleReject,\r\n  handleReinstate,\r\n  checkedRequests,\r\n  reinstatedRequests,\r\n  rejectedRequests,\r\n  onSchedule,\r\n  thisDaysRequests,\r\n  thisDaysIncentive,\r\n  thisDaysConfiguredShifts,\r\n  onCalendarGeneralPractice,\r\n  isLocationGeneralPractice,\r\n  fetchSchedule,\r\n  dateHasRecentCancelation,\r\n  showInactiveRequests,\r\n  variant = 'Other',\r\n}) => {\r\n  const classes = useStyles();\r\n  const currentRoute = useLocation();\r\n\r\n  const menuItems: { action: () => void; label: string; disabled: boolean }[] = [\r\n    {\r\n      action: () => {\r\n        if (onCalendar) {\r\n          handleRemoveClick(cloneDay, (location as IMarketCalendarLocation).locationId);\r\n        }\r\n      },\r\n      label: 'Cancel',\r\n      disabled: false,\r\n    },\r\n  ];\r\n\r\n  const formatShiftTime = (time: string | undefined): string => {\r\n    if (!time) return '';\r\n    const [hour, minute] = time.split(':');\r\n    const date = new Date(1970, 0, 1, Number(hour), Number(minute));\r\n    return format(date, 'h:mm a');\r\n  };\r\n\r\n  // Relief schedule only\r\n  const isGeneralPracticeStaffed =\r\n    (isLocationGeneralPractice && thisDaysConfiguredShifts?.length === 0) ?? [];\r\n\r\n  // use variant to render differing views without interfering with relief schedule\r\n  const isFTScheduling = variant === 'FT-Scheduling';\r\n\r\n  return (\r\n    <div\r\n      className={clsx(\r\n        `col cell ${isSameDay(day, new Date()) ? 'today' : isSelected(day, selectedDate)}`,\r\n        !isMarket ? classes.dayContainer : classes.bidContainer,\r\n        dateHasRecentCancelation ? classes.recentCancelation : null\r\n      )}\r\n      key={\r\n        isMarket\r\n          ? `${(location as IMarketCalendarLocation).locationName}_${day.toDateString()}`\r\n          : day.toDateString()\r\n      }\r\n    >\r\n      {!isBeforeOpenDate && !isAfterCloseDate && !!onCalendar ? (\r\n        <div className={clsx(classes.bid, determineClass(onCalendar))}>\r\n          <div className={classes.eventMenuContainer}>\r\n            <CalendarEventMenu darkBackground={true} menuItems={menuItems} />\r\n          </div>\r\n          <Typography\r\n            onClick={() => {\r\n              handleModalOpen(onCalendar.dvmId as number, startDate);\r\n            }}\r\n            className={classes.scheduledName}\r\n          >\r\n            {onCalendar.dvmName}\r\n          </Typography>\r\n          {onCalendar.dvmType === 'Contractor' && isMarket && (\r\n            <Link\r\n              className={classes.link}\r\n              color={'inherit'}\r\n              onClick={() => {\r\n                setRSSModalSelectedShift(onCalendar);\r\n                setRssAddLocation(location as IMarketCalendarLocation);\r\n                setRssAddDate(cloneDay);\r\n              }}\r\n            >\r\n              <Typography>\r\n                ${onCalendar.totalAmount}\r\n                {onCalendar.hasIncentive ? <Coin maxHeight={20} /> : null}\r\n              </Typography>\r\n            </Link>\r\n          )}\r\n          {((currentRoute.pathname === '/ft-scheduling' && !isRelief) || allowDvmCardDelete) && (\r\n            <IconButton\r\n              className={classes.removeButton}\r\n              onClick={() => {\r\n                handleRemoveClick(cloneDay, (location as IMarketCalendarLocation).locationId);\r\n              }}\r\n            >\r\n              <HighlightOff />\r\n            </IconButton>\r\n          )}\r\n        </div>\r\n      ) : (\r\n        <>\r\n          {!isFTScheduling && (\r\n            <>\r\n              {!isGeneralPracticeStaffed && (isBeforeOpenDate || isAfterCloseDate) ? (\r\n                <div className={classes.closed}>\r\n                  <Typography>Closed</Typography>\r\n                </div>\r\n              ) : null}\r\n\r\n              {isGeneralPracticeStaffed ? (\r\n                <div className={classes.closed}>\r\n                  <Typography>Staffed</Typography>\r\n                </div>\r\n              ) : null}\r\n            </>\r\n          )}\r\n\r\n          {isFTScheduling && (\r\n            <>\r\n              {isBeforeOpenDate || isAfterCloseDate ? (\r\n                <div className={classes.fulltime}>\r\n                  <Typography>Closed</Typography>\r\n                </div>\r\n              ) : onCalendarGeneralPractice ? (\r\n                <div className={clsx(classes.fulltime, classes.fulltimeHighlighted)}>\r\n                  <Typography>\r\n                    {formatShiftTime(onCalendarGeneralPractice?.shiftTime?.start)} -{' '}\r\n                  </Typography>\r\n                  <Typography className={classes.line}>\r\n                    {formatShiftTime(onCalendarGeneralPractice?.shiftTime?.end)}\r\n                  </Typography>\r\n                </div>\r\n              ) : (\r\n                <div className={classes.fulltime}>\r\n                  <Typography>Staffed</Typography>\r\n                </div>\r\n              )}\r\n            </>\r\n          )}\r\n\r\n          {!onCalendar && !isFTScheduling && !isMarket && !isBeforeOpenDate && !isAfterCloseDate ? (\r\n            <Button\r\n              disabled={\r\n                (!selectedDvm && !isMarket) ||\r\n                selectedDVMSchedule\r\n                  ?.map(date => new Date(date).getTime())\r\n                  ?.includes(new Date(cloneDay).getTime())\r\n              }\r\n              startIcon={<AddCircle />}\r\n              onClick={() => {\r\n                onDateClickHandle(cloneDay);\r\n              }}\r\n            >\r\n              ADD\r\n            </Button>\r\n          ) : null}\r\n\r\n          {isMarket &&\r\n            handleApprove &&\r\n            handleReject &&\r\n            checkedRequests &&\r\n            onSchedule &&\r\n            !isBeforeOpenDate &&\r\n            !isAfterCloseDate &&\r\n            ((thisDaysRequests && thisDaysRequests?.length > 0) || onCalendar ? (\r\n              <>\r\n                {thisDaysRequests?.map(request => (\r\n                  <RSSCheckbox\r\n                    key={`${request.dvmId} ${request.locationId} ${request.shiftDate}`}\r\n                    checkedRequests={checkedRequests}\r\n                    rejectedRequests={rejectedRequests ?? []}\r\n                    request={request}\r\n                    onSchedule={\r\n                      Array.isArray(onSchedule)\r\n                        ? onSchedule?.flatMap(schedule => schedule.shifts)\r\n                        : []\r\n                    }\r\n                    handleApprove={handleApprove}\r\n                    handleReinstate={handleReinstate}\r\n                    handleReject={handleReject}\r\n                    location={location as IMarketCalendarLocation}\r\n                    handleModalOpen={() => handleModalOpen(request.dvmId, startDate)}\r\n                    fetchSchedule={fetchSchedule}\r\n                    thisDaysIncentive={thisDaysIncentive}\r\n                    reinstatedRequests={reinstatedRequests}\r\n                  />\r\n                ))}\r\n                {(showInactiveRequests || !onCalendar) && (\r\n                  <IconButton\r\n                    disabled={false}\r\n                    className={classes.addButtonWithRequests}\r\n                    color={'primary'}\r\n                    onClick={() => {\r\n                      setRssAddDate(cloneDay);\r\n                      setRssAddLocation(location as IMarketCalendarLocation);\r\n                      setIsRSSAddModalOpen(true);\r\n                      setRssIncentive(thisDaysIncentive);\r\n                    }}\r\n                  >\r\n                    <AddCircle />\r\n                  </IconButton>\r\n                )}\r\n              </>\r\n            ) : !isBeforeOpenDate && !isAfterCloseDate && !isGeneralPracticeStaffed ? (\r\n              <Button\r\n                disabled={false}\r\n                startIcon={<AddCircle />}\r\n                onClick={() => {\r\n                  setRssAddDate(cloneDay);\r\n                  setRssAddLocation(location as IMarketCalendarLocation);\r\n                  setIsRSSAddModalOpen(true);\r\n                  setRssIncentive(thisDaysIncentive);\r\n                }}\r\n              >\r\n                ADD\r\n              </Button>\r\n            ) : null)}\r\n        </>\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  locationContainer: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    alignItems: 'center',\r\n    textAlign: 'right',\r\n    color: alpha(theme.palette.text.primary, 0.875),\r\n    padding: '.5rem',\r\n  },\r\n  dayContainer: {\r\n    display: 'flex',\r\n    justifyContent: 'space-around',\r\n    alignItems: 'center',\r\n  },\r\n  penciledIn: {\r\n    borderTop: `3px solid ${theme.palette.secondary.light}`,\r\n    borderRight: `3px solid ${theme.palette.secondary.light} !important`,\r\n    borderBottom: `3px solid ${theme.palette.secondary.light}`,\r\n    borderLeft: `3px solid ${theme.palette.secondary.light}`,\r\n  },\r\n  penciledInRelief: {\r\n    borderTop: `3px solid ${theme.palette.primary.light}`,\r\n    borderRight: `3px solid ${theme.palette.primary.light} !important`,\r\n    borderBottom: `3px solid ${theme.palette.primary.light}`,\r\n    borderLeft: `3px solid ${theme.palette.primary.light}`,\r\n  },\r\n  closed: {\r\n    height: '80%',\r\n    width: '80%',\r\n    borderRadius: '10px',\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'space-between',\r\n    paddingLeft: theme.spacing(1),\r\n    marginBottom: theme.spacing(1),\r\n    borderTop: `3px solid ${theme.palette.grey[300]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[300]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[300]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[300]}`,\r\n    margin: theme.spacing(1, 0.25, 0),\r\n    alignSelf: 'flex-start',\r\n  },\r\n  fulltime: {\r\n    height: '80%',\r\n    width: '80%',\r\n    borderRadius: '10px',\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    alignItems: 'center',\r\n    justifyContent: 'center',\r\n    borderTop: `3px solid ${theme.palette.grey[300]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[300]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[300]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[300]}`,\r\n    margin: theme.spacing(1, 0.25, 0),\r\n    alignSelf: 'flex-start',\r\n  },\r\n  line: {\r\n    marginLeft: '-.5rem',\r\n  },\r\n  fulltimeHighlighted: {\r\n    backgroundColor: theme.palette.secondary.main,\r\n    color: theme.palette.common.white,\r\n  },\r\n  addButtonWithRequests: {\r\n    opacity: '0',\r\n    transition: 'opacity .25s ease-out',\r\n    position: 'absolute',\r\n    bottom: -7,\r\n    right: -7,\r\n  },\r\n  bidContainer: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    justifyContent: 'space-around',\r\n    alignItems: 'center',\r\n    transition: 'opacity .15s ease-in',\r\n\r\n    '&:hover > $addButtonWithRequests': {\r\n      opacity: '1',\r\n    },\r\n  },\r\n  recentCancelation: {\r\n    borderTop: `3px solid ${theme.palette.error.main}`,\r\n    borderRight: `3px solid ${theme.palette.error.main} !important`,\r\n    borderBottom: `3px solid ${theme.palette.error.main}`,\r\n    borderLeft: `3px solid ${theme.palette.error.main}`,\r\n    borderRadius: '5px',\r\n  },\r\n  bid: {\r\n    width: '80%',\r\n    borderRadius: '10px',\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'space-between',\r\n    paddingLeft: theme.spacing(1),\r\n    paddingRight: theme.spacing(1),\r\n    minHeight: '7rem',\r\n    borderTop: `3px solid ${theme.palette.grey[300]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[300]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[300]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[300]}`,\r\n    margin: theme.spacing(1, 0.25, 0),\r\n    alignSelf: 'flex-start',\r\n    '&:last-of-type': {\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n    '&.reinstated': {\r\n      borderTop: `3px solid ${theme.palette.primary.main}`,\r\n      borderRight: `3px solid ${theme.palette.primary.main} !important`,\r\n      borderBottom: `3px solid ${theme.palette.primary.main}`,\r\n      borderLeft: `3px solid ${theme.palette.primary.main}`,\r\n    },\r\n    position: 'relative',\r\n  },\r\n  winningBid: {\r\n    height: '100%',\r\n    width: '80%',\r\n    borderRadius: '10px',\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'space-between',\r\n    paddingLeft: theme.spacing(1),\r\n    minHeight: '7rem',\r\n    borderTop: `3px solid ${theme.palette.grey[300]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[300]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[300]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[300]}`,\r\n    margin: theme.spacing(1, 0.25, 0),\r\n    alignSelf: 'flex-start',\r\n    '&:last-of-type': {\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n    '&.reinstated': {\r\n      borderTop: `3px solid ${theme.palette.primary.main}`,\r\n      borderRight: `3px solid ${theme.palette.primary.main} !important`,\r\n      borderBottom: `3px solid ${theme.palette.primary.main}`,\r\n      borderLeft: `3px solid ${theme.palette.primary.main}`,\r\n    },\r\n    position: 'relative',\r\n  },\r\n  scheduled: {\r\n    color: theme.palette.common.white,\r\n    backgroundColor: theme.palette.secondary.light,\r\n    justifyContent: 'space-around',\r\n  },\r\n  scheduledName: {\r\n    textDecoration: 'underline',\r\n  },\r\n  checkDisabled: {\r\n    backgroundColor: theme.palette.secondary.light,\r\n  },\r\n  scheduledRelief: {\r\n    color: theme.palette.common.white,\r\n    backgroundColor: '#4c5076',\r\n    justifyContent: 'space-around',\r\n  },\r\n  headerDate: {\r\n    color: alpha(theme.palette.text.primary, 0.875),\r\n    fontWeight: theme.typography.fontWeightBold,\r\n    fontSize: 16,\r\n  },\r\n  heading: {\r\n    borderRight: ` 1px solid #eee`,\r\n  },\r\n  removeButton: { position: 'absolute', top: 0, left: 0 },\r\n  '.calendar': {\r\n    '& .body': {\r\n      '& .cell': {\r\n        '& .remove': {},\r\n      },\r\n    },\r\n  },\r\n  noBids: {\r\n    alignSelf: 'center',\r\n  },\r\n  link: {\r\n    color: theme.palette.common.white,\r\n  },\r\n  eventMenuContainer: {\r\n    color: 'white',\r\n    position: 'absolute',\r\n    right: '0',\r\n    top: '0',\r\n  },\r\n}));\r\n","import { Dispatch, FC, SetStateAction, useEffect, useState } from 'react';\r\nimport { format, startOfWeek, addDays, isSameDay, lastDayOfWeek, startOfDay } from 'date-fns';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport '../../styles/react-calendar-grid.css'; // theme css file\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { Alert, alpha, Typography } from '@mui/material';\r\nimport clsx from 'clsx';\r\nimport {\r\n  ICalendarLocation,\r\n  IMarketCalendarLocation,\r\n  IMarketCalendarShiftRequest,\r\n  IShift,\r\n  IConfiguredShiftCalendar,\r\n} from '../../models/schedule';\r\nimport { InfoModal } from './info-modal';\r\nimport { getDvmRequestsAndShifts } from '../../fetch';\r\nimport { DVMPeekInfo } from '../../models';\r\nimport { RSSAddEditModal } from './rss-add-modal';\r\nimport { CalendarEvent } from './calendar-event';\r\nimport { Box } from '@mui/system';\r\n\r\ninterface ICalendarGrid {\r\n  locations: IDropdownResponse[];\r\n  selectedLocation: string;\r\n  selectedDvm?: IDropdownResponse | null;\r\n  handleDateClick: (day: Date) => void;\r\n  handleRemoveClick: (day: Date, locationId?: string | number) => void;\r\n  selectedDate: Date;\r\n  setSelectedDate: Dispatch<SetStateAction<Date>>;\r\n  scheduled: IShift[] | IMarketCalendarLocation[];\r\n  isMarket?: boolean;\r\n  selectedDVMSchedule?: string[];\r\n  allowDvmCardDelete?: boolean;\r\n  handleApprove?: (request: IMarketCalendarShiftRequest) => void;\r\n  handleReject?: (request: IMarketCalendarShiftRequest) => void;\r\n  handleReinstate?: (request: IMarketCalendarShiftRequest) => void;\r\n  checkedRequests?: IMarketCalendarShiftRequest[];\r\n  reinstatedRequests?: IMarketCalendarShiftRequest[];\r\n  rejectedRequests?: IMarketCalendarShiftRequest[];\r\n  fetchSchedule?: () => Promise<void>;\r\n  openDate?: Date | null;\r\n  closeDate?: Date | null;\r\n  reloadPayload?: () => void;\r\n  showInactiveRequests?: boolean;\r\n  locationInfo?: ICalendarLocation;\r\n  configuredShifts?: IConfiguredShiftCalendar[];\r\n  isLocationGeneralPractice?: any;\r\n  variant?: any;\r\n}\r\n\r\n// based off of this component, https://codesandbox.io/s/xmt6r?file=/package.json\r\nexport const CalendarGrid: FC<ICalendarGrid> = ({\r\n  locations,\r\n  selectedLocation,\r\n  selectedDvm,\r\n  handleDateClick,\r\n  handleRemoveClick,\r\n  selectedDate,\r\n  setSelectedDate,\r\n  scheduled,\r\n  isMarket = false,\r\n  selectedDVMSchedule,\r\n  allowDvmCardDelete = false,\r\n  handleApprove,\r\n  handleReject,\r\n  handleReinstate,\r\n  checkedRequests,\r\n  reinstatedRequests,\r\n  rejectedRequests,\r\n  fetchSchedule,\r\n  openDate,\r\n  closeDate,\r\n  reloadPayload,\r\n  showInactiveRequests,\r\n  locationInfo,\r\n  configuredShifts,\r\n  isLocationGeneralPractice,\r\n  variant,\r\n}) => {\r\n  const location = locations.find(loc => loc.value === selectedLocation) ?? {\r\n    description: '',\r\n    shorthand: '',\r\n    value: '',\r\n  };\r\n\r\n  const classes = useStyles();\r\n\r\n  const onDateClickHandle = (day: Date) => {\r\n    handleDateClick(day);\r\n  };\r\n\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const [info, setInfo] = useState<DVMPeekInfo | null>(null);\r\n\r\n  const [isRSSAddModalOpen, setIsRSSAddModalOpen] = useState(false);\r\n  const [RSSModalSelectedShift, setRSSModalSelectedShift] = useState<IShift | null>(null);\r\n  const [RSSModalSelectedShiftRequest, setRSSModalSelectedShiftRequest] =\r\n    useState<IMarketCalendarShiftRequest | null>(null);\r\n\r\n  useEffect(() => {\r\n    if (RSSModalSelectedShift || RSSModalSelectedShiftRequest) {\r\n      setIsRSSAddModalOpen(true);\r\n    }\r\n  }, [RSSModalSelectedShift, RSSModalSelectedShiftRequest]);\r\n\r\n  const [rssAddLocation, setRssAddLocation] = useState<IMarketCalendarLocation | null>(null);\r\n  const [rssAddDate, setRssAddDate] = useState<Date | null>(null);\r\n  const [rssIncentive, setRssIncentive] = useState<number | null>(null);\r\n\r\n  const handleModalOpen = async (dvmId: number, mondayDate: Date) => {\r\n    try {\r\n      const res = await getDvmRequestsAndShifts(dvmId, format(mondayDate, 'yyyy-MM-dd'));\r\n      setInfo(res);\r\n      setIsModalOpen(true);\r\n    } catch (error) {\r\n      console.log(error);\r\n    }\r\n  };\r\n  const renderDays = () => {\r\n    const dateFormatDay = 'MMM d';\r\n\r\n    const dateFormat = 'EEE';\r\n    const days = [\r\n      <div className={clsx('col col-center', classes.heading)} key={'days-empty'}>\r\n        Location\r\n      </div>,\r\n    ];\r\n    let startDate = startOfWeek(selectedDate, { weekStartsOn: 1 });\r\n    const endDate = lastDayOfWeek(selectedDate, { weekStartsOn: 1 });\r\n    let day = startDate;\r\n\r\n    while (day <= endDate) {\r\n      for (let i = 0; i < 7; i++) {\r\n        days.push(\r\n          <div className={clsx('col col-center', classes.heading, scheduled)} key={i}>\r\n            {format(addDays(startDate, i), dateFormat)}\r\n            <Typography className={classes.headerDate}>\r\n              {format(addDays(startDate, i), dateFormatDay)}\r\n            </Typography>\r\n          </div>\r\n        );\r\n        day = addDays(day, 1);\r\n      }\r\n    }\r\n    return <div className=\"days row\">{days}</div>;\r\n  };\r\n\r\n  const renderCells = (\r\n    location: string | IMarketCalendarLocation,\r\n    onSchedule?: IMarketCalendarLocation[],\r\n    openDate?: Date | null,\r\n    closeDate?: Date | null\r\n  ) => {\r\n    const startDate = startOfWeek(selectedDate, { weekStartsOn: 1 });\r\n    const endDate = lastDayOfWeek(selectedDate, { weekStartsOn: 1 });\r\n    const rows = [];\r\n\r\n    const isFTScheduling = typeof location === 'string';\r\n    let days = [\r\n      <Box\r\n        sx={theme =>\r\n          !isFTScheduling && location?.locationType === 'UrgentVet'\r\n            ? { borderLeft: `5px solid ${theme.palette.primary.main}` }\r\n            : { borderLeft: isFTScheduling ? 'none' : `5px solid #1f2454` }\r\n        }\r\n        className={clsx('col cell', classes.locationContainer)}\r\n        key={'empty'}\r\n      >\r\n        <Typography>{typeof location === 'string' ? location : location.locationName}</Typography>\r\n      </Box>,\r\n    ];\r\n    let day = startOfDay(startDate);\r\n\r\n    const isSelected = (day: Date, selectedDate: Date) =>\r\n      isSameDay(day, selectedDate) ? 'selected' : '';\r\n\r\n    const requested = isMarket ? (location as IMarketCalendarLocation)?.shiftRequests : [];\r\n    const incentives = isMarket ? (location as IMarketCalendarLocation)?.incentiveRates : [];\r\n\r\n    // used for relief scheduling calendar only //\r\n    const localConfiguredShifts = isMarket\r\n      ? (location as IMarketCalendarLocation)?.configuredShifts\r\n      : [];\r\n\r\n    while (day <= endDate) {\r\n      for (let i = 0; i < 7; i++) {\r\n        const cloneDay = day;\r\n\r\n        const onCalendar = isMarket\r\n          ? (location as IMarketCalendarLocation)?.shifts?.find(\r\n              s => new Date(s.shiftDate).getTime() === cloneDay.getTime() && !s.isDeleted\r\n            )\r\n          : (scheduled as IShift[]).find(\r\n              s => new Date(s.shiftDate).getTime() === cloneDay.getTime() && !s.isDeleted\r\n            );\r\n\r\n        const onCalendarGeneralPractice = configuredShifts\r\n          ?.flat()\r\n          .find(s => new Date(s?.shiftDate).getTime() === cloneDay.getTime());\r\n\r\n        const thisDaysRequests = requested?.[i] ?? [];\r\n        const thisDaysIncentive = incentives?.[i] ?? null;\r\n\r\n        // for displaying General Practice shifts (relief calendar only - ft shifts are pass fron the ft-scheduling file)\r\n        const thisDaysConfiguredShifts = localConfiguredShifts?.[i] ?? [];\r\n        const isLocationGeneralPractice =\r\n          (location as IMarketCalendarLocation)?.locationType === 'GeneralPractice' ?? false;\r\n\r\n        const isScheduled = onCalendar?.shiftId;\r\n        const isRelief = onCalendar?.dvmType === 'Contractor';\r\n        const isPenciledIn = onCalendar && onCalendar.shiftId === null;\r\n\r\n        const dayString = String(day);\r\n        const dateObj = new Date(Date.parse(dayString));\r\n        const isoDateString = dateObj.toISOString();\r\n\r\n        let isBeforeOpenDate = false;\r\n        let isAfterCloseDate = false;\r\n\r\n        if (openDate && isoDateString < String(openDate)) {\r\n          isBeforeOpenDate = true;\r\n        }\r\n        if (closeDate && isoDateString > String(closeDate)) {\r\n          isAfterCloseDate = true;\r\n        }\r\n\r\n        const dateHasRecentCancelation = isMarket\r\n          ? (location as IMarketCalendarLocation)?.datesWithRecentCancelations\r\n              ?.map(dateTime => new Date(dateTime).getTime())\r\n              ?.includes(new Date(cloneDay).getTime()) && !isScheduled\r\n          : undefined;\r\n\r\n        const determineClass = (event: IShift) => {\r\n          if (!!onCalendar && !isBeforeOpenDate && !isAfterCloseDate) {\r\n            if (isScheduled) {\r\n              if (isRelief) {\r\n                return classes.scheduledRelief;\r\n              } else {\r\n                return classes.scheduled;\r\n              }\r\n            } else if (isPenciledIn) {\r\n              if (isRelief) {\r\n                return classes.penciledInRelief;\r\n              } else {\r\n                return classes.penciledIn;\r\n              }\r\n            } else {\r\n              return '';\r\n            }\r\n          } else {\r\n            return '';\r\n          }\r\n        };\r\n\r\n        days.push(\r\n          <CalendarEvent\r\n            isSameDay={isSameDay}\r\n            isSelected={isSelected}\r\n            isMarket={isMarket}\r\n            determineClass={determineClass}\r\n            isBeforeOpenDate={isBeforeOpenDate}\r\n            isAfterCloseDate={isAfterCloseDate}\r\n            onCalendar={onCalendar}\r\n            location={location}\r\n            day={day}\r\n            allowDvmCardDelete={allowDvmCardDelete}\r\n            handleModalOpen={handleModalOpen}\r\n            setRSSModalSelectedShift={setRSSModalSelectedShift}\r\n            setRssAddLocation={setRssAddLocation}\r\n            setRssAddDate={setRssAddDate}\r\n            setIsRSSAddModalOpen={setIsRSSAddModalOpen}\r\n            setRssIncentive={setRssIncentive}\r\n            cloneDay={cloneDay}\r\n            selectedDate={selectedDate}\r\n            startDate={startDate}\r\n            isRelief={isRelief}\r\n            selectedDvm={selectedDvm}\r\n            selectedDVMSchedule={selectedDVMSchedule}\r\n            handleRemoveClick={handleRemoveClick}\r\n            onDateClickHandle={onDateClickHandle}\r\n            handleApprove={handleApprove}\r\n            handleReject={handleReject}\r\n            handleReinstate={handleReinstate}\r\n            checkedRequests={checkedRequests}\r\n            reinstatedRequests={reinstatedRequests}\r\n            rejectedRequests={rejectedRequests}\r\n            onSchedule={onSchedule}\r\n            thisDaysRequests={thisDaysRequests}\r\n            thisDaysIncentive={thisDaysIncentive}\r\n            thisDaysConfiguredShifts={thisDaysConfiguredShifts}\r\n            onCalendarGeneralPractice={onCalendarGeneralPractice}\r\n            isLocationGeneralPractice={isLocationGeneralPractice}\r\n            fetchSchedule={fetchSchedule}\r\n            dateHasRecentCancelation={dateHasRecentCancelation}\r\n            showInactiveRequests={showInactiveRequests}\r\n            variant={variant}\r\n          />\r\n        );\r\n        day = addDays(day, 1);\r\n      }\r\n      rows.push(\r\n        <div className=\"row\" key={day.toDateString()}>\r\n          {days}\r\n        </div>\r\n      );\r\n      days = [];\r\n    }\r\n    return <div className=\"body\">{rows}</div>;\r\n  };\r\n  const renderFooter = () => {\r\n    return <div className=\"header row flex-middle\">{/* Footer Content */}</div>;\r\n  };\r\n  return isMarket && (scheduled as IMarketCalendarLocation[]).length === 0 ? (\r\n    <Alert>No locations exist for this market</Alert>\r\n  ) : (\r\n    <div className=\"calendar\">\r\n      {renderDays()}\r\n      {isMarket\r\n        ? (scheduled as IMarketCalendarLocation[]).map(location =>\r\n            renderCells(\r\n              location,\r\n              scheduled as IMarketCalendarLocation[],\r\n              location.openDate,\r\n              location.closeDate\r\n            )\r\n          )\r\n        : renderCells(location.shorthand, undefined, openDate, closeDate)}\r\n      {renderFooter()}\r\n      <InfoModal isOpen={isModalOpen && !!info} onClose={() => setIsModalOpen(false)} info={info} />\r\n      <RSSAddEditModal\r\n        isOpen={isRSSAddModalOpen}\r\n        onClose={() => {\r\n          setIsRSSAddModalOpen(false);\r\n          setRSSModalSelectedShift(null);\r\n          setRSSModalSelectedShiftRequest(null);\r\n          setRssAddDate(null);\r\n          setRssIncentive(null);\r\n          setRssAddLocation(null);\r\n        }}\r\n        fetchSchedule={() => fetchSchedule?.()}\r\n        date={rssAddDate as Date}\r\n        shift={RSSModalSelectedShift ?? undefined}\r\n        scheduledShift={RSSModalSelectedShiftRequest ?? undefined}\r\n        location={rssAddLocation as IMarketCalendarLocation}\r\n        thisDaysIncentive={rssIncentive as number}\r\n      />\r\n    </div>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  locationContainer: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    alignItems: 'center',\r\n    textAlign: 'right',\r\n    color: alpha(theme.palette.text.primary, 0.875),\r\n    padding: '.5rem',\r\n  },\r\n  dayContainer: {\r\n    display: 'flex',\r\n    justifyContent: 'space-around',\r\n    alignItems: 'center',\r\n  },\r\n  penciledIn: {\r\n    borderTop: `3px solid ${theme.palette.secondary.light}`,\r\n    borderRight: `3px solid ${theme.palette.secondary.light} !important`,\r\n    borderBottom: `3px solid ${theme.palette.secondary.light}`,\r\n    borderLeft: `3px solid ${theme.palette.secondary.light}`,\r\n  },\r\n  penciledInRelief: {\r\n    borderTop: `3px solid ${theme.palette.primary.light}`,\r\n    borderRight: `3px solid ${theme.palette.primary.light} !important`,\r\n    borderBottom: `3px solid ${theme.palette.primary.light}`,\r\n    borderLeft: `3px solid ${theme.palette.primary.light}`,\r\n  },\r\n  closed: {\r\n    height: '80%',\r\n    width: '80%',\r\n    borderRadius: '10px',\r\n    display: 'flex',\r\n    alignItems: 'center',\r\n    justifyContent: 'space-between',\r\n    paddingLeft: theme.spacing(1),\r\n    marginBottom: theme.spacing(1),\r\n\r\n    borderTop: `3px solid ${theme.palette.grey[300]}`,\r\n    borderRight: `3px solid ${theme.palette.grey[300]} !important`,\r\n    borderBottom: `3px solid ${theme.palette.grey[300]}`,\r\n    borderLeft: `3px solid ${theme.palette.grey[300]}`,\r\n    margin: theme.spacing(1, 0.25, 0),\r\n    alignSelf: 'flex-start',\r\n  },\r\n  addButtonWithRequests: {\r\n    opacity: '0',\r\n\r\n    transition: 'opacity .25s ease-out',\r\n    position: 'absolute',\r\n    bottom: -7,\r\n    right: -7,\r\n  },\r\n  bidContainer: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    justifyContent: 'space-around',\r\n    alignItems: 'center',\r\n    transition: 'opacity .15s ease-in',\r\n\r\n    '&:hover > $addButtonWithRequests': {\r\n      opacity: '1',\r\n    },\r\n  },\r\n  scheduled: {\r\n    color: theme.palette.common.white,\r\n    backgroundColor: theme.palette.secondary.light,\r\n    justifyContent: 'space-around',\r\n  },\r\n  scheduledName: {\r\n    textDecoration: 'underline',\r\n  },\r\n  checkDisabled: {\r\n    backgroundColor: theme.palette.secondary.light,\r\n  },\r\n  scheduledRelief: {\r\n    color: theme.palette.common.white,\r\n    backgroundColor: '#4c5076',\r\n    justifyContent: 'space-around',\r\n  },\r\n\r\n  headerDate: {\r\n    color: alpha(theme.palette.text.primary, 0.875),\r\n    fontWeight: theme.typography.fontWeightBold,\r\n    fontSize: 16,\r\n  },\r\n  heading: {\r\n    borderRight: ` 1px solid #eee`,\r\n  },\r\n  removeButton: { position: 'absolute', top: 0, left: 0 },\r\n  '.calendar': {\r\n    '& .body': {\r\n      '& .cell': {\r\n        '& .remove': {},\r\n      },\r\n    },\r\n  },\r\n  noBids: {\r\n    alignSelf: 'center',\r\n  },\r\n  link: {\r\n    color: theme.palette.common.white,\r\n  },\r\n}));\r\n","import { Box, Button, FormControl, Grid, InputLabel, MenuItem, Select } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Dispatch, FC, SetStateAction, useCallback, useContext, useEffect, useState } from 'react';\r\nimport { CalendarGrid } from '../../components/calendar-grid';\r\nimport { IShiftRequestApproval, RSSMarketRepeaterContext } from '../../context/rss-market-repeater';\r\nimport { getMarketSchedule, putRSSPersist } from '../../fetch';\r\nimport { IMarketCalendarLocation, IMarketCalendarShiftRequest } from '../../models/schedule';\r\nimport { IDropdownResponse } from '../../models/util';\r\n\r\nexport interface IReliefSchedulingMarket {\r\n  preSelectedMarket: string | null;\r\n  selectedDate: Date;\r\n  setSelectedDate: Dispatch<SetStateAction<Date>>;\r\n  locations?: IDropdownResponse[];\r\n  setLocations: Dispatch<SetStateAction<IDropdownResponse[] | undefined>>;\r\n  areLocationsLoading: boolean;\r\n  setAreLocationsLoading: Dispatch<SetStateAction<boolean>>;\r\n  startDate: Date;\r\n  endDate: Date;\r\n  selectedMarketIndex: number;\r\n  selectedMarkets: Array<string | null>;\r\n  setSelectedMarkets: Dispatch<SetStateAction<Array<string | null>>>;\r\n  removeMarket: () => void;\r\n  showSaveButton?: boolean;\r\n  showInactiveRequests?: boolean;\r\n  inactiveRequests?: boolean;\r\n}\r\nexport const ReliefSchedulingMarket: FC<IReliefSchedulingMarket> = ({\r\n  preSelectedMarket,\r\n  selectedDate,\r\n  setSelectedDate,\r\n  locations,\r\n  setLocations,\r\n  areLocationsLoading,\r\n  setAreLocationsLoading,\r\n  startDate,\r\n  endDate,\r\n  selectedMarketIndex,\r\n  selectedMarkets,\r\n  setSelectedMarkets,\r\n  removeMarket,\r\n  showSaveButton = true,\r\n  showInactiveRequests,\r\n  inactiveRequests,\r\n}) => {\r\n  const { setIsLoading, setPayloads, setAllPayloads } = useContext(RSSMarketRepeaterContext);\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const handleChangeWithoutSave = () => {\r\n    if (\r\n      checkedRequests.length > 0 ||\r\n      rejectedRequests.length > 0 ||\r\n      reinstatedRequests.length > 0 ||\r\n      !deepEqual(scheduledMarketLocations, scheduledMarketLocationsClone)\r\n    ) {\r\n      const result = window.confirm('You have unsaved changes, are you sure you want to continue?');\r\n      if (result) {\r\n        setScheduledMarketLocations([]);\r\n        setCheckedRequests([]);\r\n        setReinstatedRequests([]);\r\n        setRejectedRequests([]);\r\n        return result;\r\n      } else {\r\n        return result;\r\n      }\r\n    } else {\r\n      return true;\r\n    }\r\n  };\r\n\r\n  // Dropdowns\r\n  const [selectedMarket, setSelectedMarket] = useState<string | null>(preSelectedMarket);\r\n\r\n  // Schedule\r\n  const [scheduledMarketLocations, setScheduledMarketLocations] = useState<\r\n    IMarketCalendarLocation[]\r\n  >([]);\r\n  const [scheduledMarketLocationsClone, setScheduledMarketLocationsClone] = useState<\r\n    IMarketCalendarLocation[]\r\n  >([]);\r\n\r\n  const fetchSchedule = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      // const mappedStatuses = selectedLocationTypes?.map(s => s.description);\r\n      const res = await getMarketSchedule({\r\n        marketIds: parseInt(selectedMarket as string) ?? undefined,\r\n        dateFrom: startDate,\r\n        dateTo: endDate,\r\n        IncludeInactiveShifts: !!showInactiveRequests,\r\n        locationTypes: ['UrgentVet'],\r\n      });\r\n\r\n      setScheduledMarketLocations(res?.[0]?.locationsAndShifts ?? []);\r\n      setScheduledMarketLocationsClone(\r\n        JSON.parse(JSON.stringify(res?.[0]?.locationsAndShifts ?? []))\r\n      );\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading the Schedule, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const handleDateClick = (date: Date) => {};\r\n\r\n  const handleRemoveClick = (date: Date, locationId: string | number | undefined) => {\r\n    setScheduledMarketLocations((prev: IMarketCalendarLocation[]) => {\r\n      const selected = prev\r\n        .find(location => location.locationId === locationId)\r\n        ?.shifts.find(shift => {\r\n          return new Date(shift.shiftDate).getTime() === new Date(date).getTime();\r\n        });\r\n\r\n      if (selected) {\r\n        selected.isDeleted = true;\r\n      }\r\n      return [...prev];\r\n    });\r\n  };\r\n  const [checkedRequests, setCheckedRequests] = useState<IMarketCalendarShiftRequest[]>([]);\r\n  const handleApprove = (request: IMarketCalendarShiftRequest) => {\r\n    setCheckedRequests(prev => {\r\n      return prev.some(\r\n        (req: IMarketCalendarShiftRequest) => req.shiftRequestId === request.shiftRequestId\r\n      )\r\n        ? prev.filter(\r\n            (req: IMarketCalendarShiftRequest) => req.shiftRequestId !== request.shiftRequestId\r\n          )\r\n        : [...prev, request];\r\n    });\r\n\r\n    setAllPayloads((prev: IShiftRequestApproval) => {\r\n      if (\r\n        prev?.shiftRequestApproval?.requests?.find(\r\n          (aPReq: any) => aPReq.shiftId === request.shiftRequestId\r\n        )\r\n      ) {\r\n        return {\r\n          ...prev,\r\n          shiftRequestApproval: {\r\n            requests: prev?.shiftRequestApproval?.requests?.filter(\r\n              (aPReq: any) => aPReq.shiftId !== request.shiftRequestId\r\n            ),\r\n          },\r\n        };\r\n      } else {\r\n        return {\r\n          ...prev,\r\n          shiftRequestApproval: {\r\n            requests: Array.from(\r\n              new Set([\r\n                ...(prev?.shiftRequestApproval?.requests ?? []),\r\n                {\r\n                  shiftId: request.shiftRequestId,\r\n                  dvmId: request.dvmId,\r\n                  locationId: request.locationId,\r\n                  date: request.shiftDate,\r\n                },\r\n              ])\r\n            ),\r\n          },\r\n        };\r\n      }\r\n    });\r\n  };\r\n\r\n  const [rejectedRequests, setRejectedRequests] = useState<IMarketCalendarShiftRequest[]>([]);\r\n  const [reinstatedRequests, setReinstatedRequests] = useState<IMarketCalendarShiftRequest[]>([]);\r\n  const handleReinstate = (request: IMarketCalendarShiftRequest) => {\r\n    if (request.shiftRequestId !== null) {\r\n      setReinstatedRequests(prev => {\r\n        return prev.some(\r\n          (req: IMarketCalendarShiftRequest) => req.shiftRequestId === request.shiftRequestId\r\n        )\r\n          ? prev.filter(\r\n              (req: IMarketCalendarShiftRequest) => req.shiftRequestId !== request.shiftRequestId\r\n            )\r\n          : [...prev, request];\r\n      });\r\n    }\r\n  };\r\n  const handleReject = (request: IMarketCalendarShiftRequest) => {\r\n    if (request.shiftRequestId !== null) {\r\n      setRejectedRequests(prev => {\r\n        return prev.some(\r\n          (req: IMarketCalendarShiftRequest) => req.shiftRequestId === request.shiftRequestId\r\n        )\r\n          ? prev.filter(\r\n              (req: IMarketCalendarShiftRequest) => req.shiftRequestId !== request.shiftRequestId\r\n            )\r\n          : [...prev, request];\r\n      });\r\n    }\r\n  };\r\n\r\n  const isSubmitDisabled = () => {\r\n    let isDisabled = true;\r\n    if (checkedRequests.length >= 1) isDisabled = false;\r\n    if (rejectedRequests.length >= 1) isDisabled = false;\r\n    if (reinstatedRequests.length >= 1) isDisabled = false;\r\n    if (!deepEqual(scheduledMarketLocations, scheduledMarketLocationsClone)) isDisabled = false;\r\n    if (isSubmitting) isDisabled = true;\r\n    return isDisabled;\r\n  };\r\n  const reloadPayload = useCallback(async () => {\r\n    await fetchSchedule();\r\n    setCheckedRequests([]);\r\n    setRejectedRequests([]);\r\n    setReinstatedRequests([]);\r\n    setAllPayloads({ shiftRequestApproval: { requests: [] } });\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [startDate, selectedDate, showInactiveRequests]);\r\n\r\n  const getPayload = useCallback(() => {\r\n    const deletedItems =\r\n      scheduledMarketLocations\r\n        ?.flatMap(marketLocations => marketLocations.shifts)\r\n        ?.filter(shifts => shifts.isDeleted)\r\n        ?.map(shift => shift.shiftId as number) ?? [];\r\n\r\n    const payload = {\r\n      // FT doesn't handle shift Request Approvals, so this should always be null\r\n      shiftRequestApproval: checkedRequests.map(shift => shift.shiftRequestId),\r\n      scheduledShiftDeletion: Array.isArray(deletedItems) ? deletedItems : [],\r\n      scheduledShiftCreation: [],\r\n      shiftRequestRejection: rejectedRequests.map(shift => shift.shiftRequestId),\r\n      shiftRequestsToReinstate: reinstatedRequests.map(shift => shift.shiftRequestId),\r\n      locationName:\r\n        locations?.find(location => location.value === selectedMarket)?.description ?? 'No Name',\r\n      reloadMarketSchedule: reloadPayload,\r\n    };\r\n\r\n    return payload;\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [checkedRequests, rejectedRequests, reinstatedRequests, scheduledMarketLocations]);\r\n\r\n  useEffect(() => {\r\n    setPayloads(prev => {\r\n      prev[selectedMarketIndex] = getPayload();\r\n      return [...prev];\r\n    });\r\n  }, [getPayload, selectedMarketIndex, selectedMarkets, inactiveRequests, setPayloads]);\r\n\r\n  const [isSubmitting, setIsSubmitting] = useState(false);\r\n  const handleSubmit = async () => {\r\n    setIsSubmitting(true);\r\n    const payload = getPayload();\r\n    try {\r\n      const res = await putRSSPersist(payload);\r\n\r\n      if (typeof res === 'string') {\r\n        enqueueSnackbar(`${res}`, {\r\n          variant: 'error',\r\n        });\r\n      }\r\n\r\n      if (res.Type === 'Error') {\r\n        enqueueSnackbar(`${res?.Detail}`, {\r\n          variant: 'error',\r\n        });\r\n      }\r\n\r\n      // res is successful\r\n      if (res.status >= 200 && res.status <= 299) {\r\n        await fetchSchedule();\r\n        setCheckedRequests([]);\r\n        setReinstatedRequests([]);\r\n        setRejectedRequests([]);\r\n      }\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `${error}`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsSubmitting(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (selectedMarket && startDate && endDate) {\r\n      fetchSchedule();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedMarket, startDate, endDate, showInactiveRequests]);\r\n\r\n  const locationsWithoutSelectedMarkets = locations?.filter(location => {\r\n    if (location.value === preSelectedMarket) {\r\n      return true;\r\n    } else {\r\n      return !selectedMarkets.includes(location.value);\r\n    }\r\n  });\r\n\r\n  return (\r\n    <Box width=\"100%\">\r\n      <Grid container spacing={1}>\r\n        <Grid item xs={3}>\r\n          <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n            <InputLabel shrink={!!selectedMarket} htmlFor=\"locationsLabel\">\r\n              Market\r\n            </InputLabel>\r\n            <Select\r\n              fullWidth\r\n              name=\"locations\"\r\n              labelId=\"locationsLabel\"\r\n              id=\"locations\"\r\n              disabled={areLocationsLoading}\r\n              value={selectedMarket}\r\n              onChange={e => {\r\n                handleChangeWithoutSave() && setSelectedMarket(e.target.value as string);\r\n                setSelectedMarkets(prev => {\r\n                  prev[selectedMarketIndex] = e.target.value as string;\r\n                  return [...prev];\r\n                });\r\n              }}\r\n            >\r\n              {locationsWithoutSelectedMarkets?.map((location: IDropdownResponse, index) => {\r\n                return (\r\n                  <MenuItem key={`${index + 1}`} value={location.value}>\r\n                    {location.description}\r\n                  </MenuItem>\r\n                );\r\n              })}\r\n            </Select>\r\n          </FormControl>\r\n        </Grid>\r\n      </Grid>\r\n      {locations && locations.length > 0 && !!selectedMarket && scheduledMarketLocations && (\r\n        <CalendarGrid\r\n          key={selectedMarketIndex}\r\n          selectedLocation={selectedMarket}\r\n          locations={locations}\r\n          selectedDate={selectedDate}\r\n          setSelectedDate={setSelectedDate}\r\n          handleDateClick={handleDateClick}\r\n          handleRemoveClick={handleRemoveClick}\r\n          scheduled={scheduledMarketLocations}\r\n          isMarket={true}\r\n          allowDvmCardDelete={true}\r\n          handleApprove={handleApprove}\r\n          handleReject={handleReject}\r\n          handleReinstate={handleReinstate}\r\n          checkedRequests={checkedRequests}\r\n          reinstatedRequests={reinstatedRequests}\r\n          rejectedRequests={rejectedRequests}\r\n          fetchSchedule={() => fetchSchedule()}\r\n          reloadPayload={reloadPayload}\r\n          showInactiveRequests={showInactiveRequests}\r\n        />\r\n      )}\r\n      {showSaveButton && scheduledMarketLocations.length !== 0 && (\r\n        <Box display={'flex'} flexDirection={'row-reverse'}>\r\n          <Button\r\n            variant=\"contained\"\r\n            className={classes.saveButton}\r\n            disabled={isSubmitDisabled()}\r\n            // disabled={true}\r\n            onClick={() => handleSubmit()}\r\n          >\r\n            Save\r\n          </Button>\r\n        </Box>\r\n      )}\r\n      <Box display={'flex'} flexDirection={'row-reverse'} marginTop={'1rem'}>\r\n        <Button variant=\"contained\" disabled={!isSubmitDisabled()} onClick={() => removeMarket()}>\r\n          Remove Market\r\n        </Button>\r\n      </Box>\r\n    </Box>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  saveButton: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  schedPaginationControls: {\r\n    '& .this-week-btn-wrap': {\r\n      paddingTop: theme.spacing(1.75),\r\n    },\r\n  },\r\n  weekPaginationBtns: {\r\n    border: 'none',\r\n    background: 'none',\r\n    color: theme.palette.common.black,\r\n    padding: 0,\r\n    borderRadius: 0,\r\n    minWidth: theme.spacing(4),\r\n\r\n    '&:hover': {\r\n      background: 'none',\r\n    },\r\n  },\r\n}));\r\n","import { Dispatch, FC, SetStateAction, useContext, useEffect, useState } from 'react';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { ReliefSchedulingMarket } from './relief-scheduling-market';\r\nimport { Box, Button, ButtonGroup } from '@mui/material';\r\nimport { RSSMarketRepeaterContext } from '../../context/rss-market-repeater';\r\nimport { Loader } from '../../components';\r\nimport { useSnackbar } from 'notistack';\r\nimport { putRSSPersist } from '../../fetch';\r\nimport { ISchedulePayload } from '../../models/schedule';\r\n\r\nexport interface IReliefSchedulingRepeater {\r\n  selectedDate: Date;\r\n  setSelectedDate: Dispatch<SetStateAction<Date>>;\r\n  locations?: IDropdownResponse[];\r\n  setLocations: Dispatch<SetStateAction<IDropdownResponse[] | undefined>>;\r\n  areLocationsLoading: boolean;\r\n  setAreLocationsLoading: Dispatch<SetStateAction<boolean>>;\r\n  startDate: Date;\r\n  endDate: Date;\r\n  showInactiveRequests: boolean;\r\n}\r\n\r\nexport const ReliefSchedulingRepeater: FC<IReliefSchedulingRepeater> = ({\r\n  selectedDate,\r\n  setSelectedDate,\r\n  locations,\r\n  setLocations,\r\n  areLocationsLoading,\r\n  setAreLocationsLoading,\r\n  startDate,\r\n  endDate,\r\n  showInactiveRequests,\r\n}) => {\r\n  type IReliefSchedulingSelectedMarkets = Array<string | null>;\r\n  const [selectedMarkets, setSelectedMarkets] = useState<IReliefSchedulingSelectedMarkets>([null]);\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const saveMarketsToBrowserStorage = () => {\r\n    localStorage.setItem('selectedMarkets', JSON.stringify(selectedMarkets));\r\n  };\r\n  const retrieveMarketsFromBrowserStorage = () => {\r\n    const markets = localStorage.getItem('selectedMarkets');\r\n    if (markets) {\r\n      setSelectedMarkets(JSON.parse(markets));\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    retrieveMarketsFromBrowserStorage();\r\n  }, []);\r\n\r\n  const addMarket = (marketId: string | null) => {\r\n    setSelectedMarkets(prev => [...prev, marketId]);\r\n  };\r\n\r\n  useEffect(() => {\r\n    saveMarketsToBrowserStorage();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedMarkets]);\r\n\r\n  const { isLoading, payloads, setPayloads } = useContext(RSSMarketRepeaterContext);\r\n  const removeMarket = (marketIndex: number) => {\r\n    setSelectedMarkets(markets => {\r\n      markets.splice(marketIndex, 1);\r\n      return [...markets];\r\n    });\r\n    setPayloads(payloads => {\r\n      payloads.splice(marketIndex, 1);\r\n      return [...payloads];\r\n    });\r\n  };\r\n\r\n  const [isSubmitting, setIsSubmitting] = useState(false);\r\n\r\n  // Instead of calling each market to update it's date after saving,\r\n  // we just reset the markets at the parent level,\r\n  // which will cause each market to re-fetch it's data.\r\n  const resetMarkets = () => {\r\n    setSelectedMarkets(prev => prev);\r\n    setIsSubmitting(false);\r\n  };\r\n\r\n  const isPayloadEmpty = (payload: ISchedulePayload) => {\r\n    const isEmpty =\r\n      payload.scheduledShiftCreation.length === 0 &&\r\n      payload.scheduledShiftDeletion.length === 0 &&\r\n      payload.shiftRequestApproval.length === 0 &&\r\n      payload.shiftRequestRejection.length === 0 &&\r\n      payload.shiftRequestsToReinstate.length === 0;\r\n\r\n    return isEmpty;\r\n  };\r\n  const saveAll = () => {\r\n    setIsSubmitting(true);\r\n    const filteredPayloads = payloads.filter(payload => {\r\n      return !isPayloadEmpty(payload);\r\n    });\r\n    Promise.all(\r\n      filteredPayloads.map(async payload => {\r\n        try {\r\n          const res = await putRSSPersist(payload);\r\n\r\n          if (typeof res === 'string') {\r\n            enqueueSnackbar(`${res}`, {\r\n              variant: 'error',\r\n            });\r\n          }\r\n\r\n          // res is successful\r\n          if (res.status >= 200 && res.status <= 299) {\r\n            enqueueSnackbar(`${payload?.locationName} was saved!`, {\r\n              variant: 'success',\r\n            });\r\n            await payload.reloadMarketSchedule();\r\n          }\r\n\r\n          if (res.Type === 'Error') {\r\n            enqueueSnackbar(`${payload?.locationName} ${res?.Detail}`, {\r\n              variant: 'error',\r\n            });\r\n          }\r\n        } catch (error: any) {\r\n          console.log('error', error);\r\n          const errorMessage = `${payload?.locationName} ${error?.response?.data?.Detail}`;\r\n          enqueueSnackbar(errorMessage || `${error}`, {\r\n            variant: 'error',\r\n          });\r\n          console.log(error);\r\n        }\r\n      })\r\n    )\r\n      .catch(err => {\r\n        console.log('err', err);\r\n        enqueueSnackbar(`${err?.Detail ?? 'Something went wrong, please try saving again.'}`, {\r\n          variant: 'error',\r\n        });\r\n      })\r\n      .finally(() => {\r\n        resetMarkets();\r\n      });\r\n  };\r\n\r\n  return (\r\n    <>\r\n      {(isLoading || isSubmitting) && <Loader position=\"centered\" type=\"fullscreen\" />}\r\n      {selectedMarkets.map((market, index) => (\r\n        <ReliefSchedulingMarket\r\n          key={market ?? index}\r\n          selectedDate={selectedDate}\r\n          setSelectedDate={setSelectedDate}\r\n          locations={locations}\r\n          setLocations={setLocations}\r\n          areLocationsLoading={areLocationsLoading}\r\n          setAreLocationsLoading={setAreLocationsLoading}\r\n          startDate={startDate}\r\n          endDate={endDate}\r\n          preSelectedMarket={market}\r\n          selectedMarketIndex={index}\r\n          selectedMarkets={selectedMarkets}\r\n          setSelectedMarkets={setSelectedMarkets}\r\n          removeMarket={() => removeMarket(index)}\r\n          showSaveButton={false}\r\n          showInactiveRequests={showInactiveRequests}\r\n        />\r\n      ))}\r\n      <Box display={'flex'} flexDirection={'row'} margin={'1rem 0'} padding={'1rem 0'}>\r\n        <ButtonGroup>\r\n          <Button variant=\"contained\" onClick={() => addMarket(null)}>\r\n            Add Market\r\n          </Button>\r\n          <Button variant=\"contained\" onClick={saveAll}>\r\n            Save Markets\r\n          </Button>\r\n        </ButtonGroup>\r\n      </Box>\r\n    </>\r\n  );\r\n};\r\n","import { FC, useEffect, useState } from 'react';\r\nimport { Page } from '../../components';\r\nimport {\r\n  Alert,\r\n  AlertTitle,\r\n  Button,\r\n  FormControlLabel,\r\n  Grid,\r\n  Switch,\r\n  TextField,\r\n  useMediaQuery,\r\n  IconButton,\r\n} from '@mui/material';\r\nimport { ArrowBackIos, ArrowForwardIos } from '@mui/icons-material';\r\nimport { LocalizationProvider, DesktopDatePicker } from '@mui/x-date-pickers';\r\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\r\nimport enLocale from 'date-fns/locale/en-US';\r\nimport { getMarkets } from '../../fetch/lookups';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { useSnackbar } from 'notistack';\r\nimport { startOfWeek, lastDayOfWeek } from 'date-fns';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport { ReliefSchedulingRepeater } from './relief-scheduling-repeater';\r\nimport { RSSMarketRepeaterHandler } from '../../context/rss-market-repeater';\r\n\r\nexport const ReliefScheduling: FC = () => {\r\n  const classes = useStyles();\r\n  const [selectedDate, setSelectedDate] = useState(new Date());\r\n  const [date, setDate] = useState(new Date());\r\n\r\n  const isNotPhone = useMediaQuery('only screen and (min-width : 768px)');\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const isToday = (someDate: Date | null) => {\r\n    if (someDate === null) return;\r\n\r\n    const today = new Date();\r\n    return (\r\n      someDate.getDate() === today.getDate() &&\r\n      someDate.getMonth() === today.getMonth() &&\r\n      someDate.getFullYear() === today.getFullYear()\r\n    );\r\n  };\r\n\r\n  // Dropdowns\r\n  const [locations, setLocations] = useState<IDropdownResponse[]>();\r\n  const [areLocationsLoading, setAreLocationsLoading] = useState(false);\r\n\r\n  const fetchLocations = async () => {\r\n    try {\r\n      setAreLocationsLoading(true);\r\n      const res = await getMarkets({\r\n        excludeMarketsWithoutLocations: true,\r\n      });\r\n      setLocations(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading markets, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreLocationsLoading(false);\r\n    }\r\n  };\r\n\r\n  // Schedule\r\n  const [startDate, setStartDate] = useState(startOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n  const [endDate, setEndDate] = useState(lastDayOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n  const [showInactive, setShowInactive] = useState<boolean>(false);\r\n\r\n  useEffect(() => {\r\n    fetchLocations();\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    setStartDate(startOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n    setEndDate(lastDayOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedDate]);\r\n\r\n  return (\r\n    <Page\r\n      title={'Relief Scheduling'}\r\n      additionalHeaderContentGridSpace={9}\r\n      additionalHeaderContent={\r\n        isNotPhone ? (\r\n          <Grid\r\n            alignItems={'center'}\r\n            justifyContent={'flex-end'}\r\n            container\r\n            spacing={1}\r\n            className={classes.schedPaginationControls}\r\n          >\r\n            <Grid\r\n              display={'flex'}\r\n              textAlign={'left'}\r\n              alignItems={'flex-start'}\r\n              flexDirection={'column'}\r\n              item\r\n              xs={3}\r\n            >\r\n              <FormControlLabel\r\n                style={{ alignItems: 'flex-start' }}\r\n                labelPlacement=\"top\"\r\n                control={\r\n                  <Switch\r\n                    checked={showInactive}\r\n                    color={'secondary'}\r\n                    onChange={_ => {\r\n                      setShowInactive(prev => !prev);\r\n                    }}\r\n                    inputProps={{ 'aria-label': 'controlled' }}\r\n                  />\r\n                }\r\n                label=\"Show Inactive Requests?\"\r\n              />\r\n            </Grid>\r\n            <Grid item xs={2} className={'this-week-btn-wrap'}>\r\n              <Button\r\n                onClick={() => {\r\n                  setSelectedDate(new Date());\r\n                  setDate(new Date());\r\n                }}\r\n                disabled={isToday(date)}\r\n              >\r\n                This Week\r\n              </Button>\r\n            </Grid>\r\n            <Grid container item alignItems={'center'} xs={3}>\r\n              <Grid item xs={2}>\r\n                <IconButton\r\n                  disabled={areLocationsLoading}\r\n                  onClick={() => {\r\n                    const prevWeek = new Date(date);\r\n                    prevWeek.setDate(prevWeek.getDate() - 7);\r\n                    setSelectedDate(prevWeek);\r\n                    setDate(prevWeek);\r\n                  }}\r\n                  title={'Previous Week'}\r\n                  className={classes.weekPaginationBtns}\r\n                >\r\n                  <ArrowBackIos style={{ fontSize: '12px' }} />\r\n                </IconButton>\r\n              </Grid>\r\n\r\n              <Grid item xs={8}>\r\n                <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={enLocale}>\r\n                  <DesktopDatePicker\r\n                    toolbarPlaceholder={'Date'}\r\n                    inputFormat=\"MM/dd/yyyy\"\r\n                    value={selectedDate}\r\n                    onChange={val => {\r\n                      setDate(val as Date);\r\n                    }}\r\n                    onAccept={val => {\r\n                      setSelectedDate(val as Date);\r\n                    }}\r\n                    renderInput={(params: any) => (\r\n                      <TextField\r\n                        onBlur={() => {\r\n                          const earliestPossibleDate = new Date('January 1, 1900');\r\n                          if (date < earliestPossibleDate) {\r\n                            setSelectedDate(earliestPossibleDate);\r\n                            setDate(earliestPossibleDate);\r\n                          } else {\r\n                            setSelectedDate(date);\r\n                            setDate(date);\r\n                        }}}\r\n                        size=\"small\"\r\n                        variant=\"standard\"\r\n                        {...params}\r\n                      ></TextField>\r\n                    )}\r\n                  />\r\n                </LocalizationProvider>\r\n              </Grid>\r\n\r\n              <Grid item xs={2}>\r\n                <IconButton\r\n                  disabled={areLocationsLoading}\r\n                  onClick={() => {\r\n                    const nextWeek = new Date(date);\r\n                    nextWeek.setDate(nextWeek.getDate() + 7);\r\n                    setSelectedDate(nextWeek);\r\n                    setDate(nextWeek);\r\n                  }}\r\n                  title={'Next Week'}\r\n                  className={classes.weekPaginationBtns}\r\n                >\r\n                  <ArrowForwardIos style={{ fontSize: '12px' }} />\r\n                </IconButton>\r\n              </Grid>\r\n            </Grid>\r\n          </Grid>\r\n        ) : undefined\r\n      }\r\n    >\r\n      {isNotPhone ? (\r\n        <RSSMarketRepeaterHandler>\r\n          <ReliefSchedulingRepeater\r\n            selectedDate={selectedDate}\r\n            setSelectedDate={setSelectedDate}\r\n            locations={locations}\r\n            setLocations={setLocations}\r\n            areLocationsLoading={areLocationsLoading}\r\n            setAreLocationsLoading={setAreLocationsLoading}\r\n            startDate={startDate}\r\n            endDate={endDate}\r\n            showInactiveRequests={showInactive}\r\n          />\r\n        </RSSMarketRepeaterHandler>\r\n      ) : (\r\n        <Alert severity=\"warning\">\r\n          <AlertTitle>Scheduling not available at this screen resolution</AlertTitle>\r\n        </Alert>\r\n      )}\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  saveButton: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  schedPaginationControls: {\r\n    '& .this-week-btn-wrap': {\r\n      paddingTop: theme.spacing(1.75),\r\n    },\r\n  },\r\n  weekPaginationBtns: {\r\n    border: 'none',\r\n    background: 'none',\r\n    color: theme.palette.common.black,\r\n    padding: 0,\r\n    borderRadius: 0,\r\n    minWidth: theme.spacing(4),\r\n\r\n    '&:hover': {\r\n      background: 'none',\r\n    },\r\n  },\r\n  statuses: {\r\n    marginTop: '-16px',\r\n  },\r\n  chip: {\r\n    fontSize: '0.75rem',\r\n    height: '20px',\r\n    marginBottom: '4px',\r\n  },\r\n}));\r\n","import { FC, useEffect, useState } from 'react';\r\nimport { Page } from '../../components';\r\nimport {\r\n  Alert,\r\n  AlertTitle,\r\n  Autocomplete,\r\n  Box,\r\n  Button,\r\n  Checkbox,\r\n  FormControl,\r\n  FormControlLabel,\r\n  Grid,\r\n  InputLabel,\r\n  MenuItem,\r\n  Select,\r\n  TextField,\r\n  useMediaQuery,\r\n  IconButton,\r\n} from '@mui/material';\r\nimport { ArrowBackIos, ArrowForwardIos } from '@mui/icons-material';\r\nimport { CalendarGrid } from '../../components/calendar-grid';\r\nimport { LocalizationProvider, DesktopDatePicker } from '@mui/x-date-pickers';\r\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\r\nimport enLocale from 'date-fns/locale/en-US';\r\nimport { getDVMsLookup, getLocationsForSchedulingLookup } from '../../fetch/lookups';\r\nimport { IDropdownResponse, IDVMDropdown, ILocationDropdown } from '../../models/util';\r\nimport { useSnackbar } from 'notistack';\r\nimport { ICalendarLocation, IShift } from '../../models/schedule';\r\nimport { getSchedule, getScheduledDaysForDVM, putFTPersist } from '../../fetch';\r\nimport { startOfWeek, lastDayOfWeek, addDays } from 'date-fns';\r\nimport { deepEqual } from 'fast-equals';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport { handleError } from '../../helpers';\r\n\r\nexport const FTScheduling: FC = () => {\r\n  const classes = useStyles();\r\n  const [selectedDate, setSelectedDate] = useState(new Date());\r\n  const [date, setDate] = useState(new Date());\r\n\r\n  const [previousSelectedDate, setPreviousSelectedDate] = useState(new Date());\r\n  const [previousDate, setPreviousDate] = useState(new Date());\r\n  const isNotPhone = useMediaQuery('only screen and (min-width : 768px)');\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const isToday = (someDate: Date | null) => {\r\n    if (someDate === null) return;\r\n\r\n    const today = new Date();\r\n    return (\r\n      someDate.getDate() === today.getDate() &&\r\n      someDate.getMonth() === today.getMonth() &&\r\n      someDate.getFullYear() === today.getFullYear()\r\n    );\r\n  };\r\n\r\n  const handleChangeWithoutSave = () => {\r\n    if (!deepEqual(scheduled, scheduledClone)) {\r\n      const result = window.confirm('You have unsaved changes, are you sure you want to continue?');\r\n      if (result) {\r\n        setScheduled([]);\r\n        return result;\r\n      } else {\r\n        return result;\r\n      }\r\n    } else {\r\n      return true;\r\n    }\r\n  };\r\n\r\n  // Dropdowns\r\n  const [locations, setLocations] = useState<ILocationDropdown[]>();\r\n  const [areLocationsLoading, setAreLocationsLoading] = useState(false);\r\n  const [selectedLocation, setSelectedLocation] = useState<ILocationDropdown | null>(null);\r\n\r\n  const fetchLocations = async (locationId?: number) => {\r\n    try {\r\n      setAreLocationsLoading(true);\r\n      const res = await getLocationsForSchedulingLookup(locationId);\r\n      setLocations(res);\r\n      setSelectedLocation(null);\r\n      //we are adding a day here because the ISO date is read as GMT when it is in fact UTC\r\n      setSelectedDate(addDays(new Date(res[0]?.nextOpenShift), 1));\r\n      setDate(addDays(new Date(res[0]?.nextOpenShift), 1));\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading locations, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreLocationsLoading(false);\r\n    }\r\n  };\r\n\r\n  // DVMS\r\n  const [dvms, setDvms] = useState<IDropdownResponse[]>();\r\n  const [areDvmsLoading, setAreDvmsLoading] = useState(false);\r\n  const [selectedDvm, setSelectedDvm] = useState<IDVMDropdown | null>(null);\r\n  const [showAllDvms, setShowAllDvms] = useState<boolean>(false);\r\n\r\n  const fetchDvms = async () => {\r\n    try {\r\n      setAreDvmsLoading(true);\r\n      const res = await getDVMsLookup({\r\n        locationId: selectedLocation?.value,\r\n        showAllDvms: showAllDvms,\r\n      });\r\n\r\n      setDvms(res);\r\n      setSelectedDvm(res[0]);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVMs, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreDvmsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [selectedDVMSchedule, setSelectedDVMSchedule] = useState<string[]>([]);\r\n  const fetchDvmSchedule = async () => {\r\n    try {\r\n      const res = await getScheduledDaysForDVM(selectedDvm?.value as string, {\r\n        dateFrom: startDate,\r\n        dateTo: endDate,\r\n      });\r\n      setSelectedDVMSchedule(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(\r\n        errorMessage ||\r\n          `Error loading the schedule for ${selectedDvm?.description}, please try again.`,\r\n        {\r\n          variant: 'error',\r\n        }\r\n      );\r\n      console.log(error);\r\n    }\r\n  };\r\n\r\n  // Schedule\r\n  const [startDate, setStartDate] = useState(startOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n  const [endDate, setEndDate] = useState(lastDayOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n  const [scheduled, setScheduled] = useState<IShift[]>([]);\r\n  const [openDate, setOpenDate] = useState<Date | null>();\r\n  const [closeDate, setCloseDate] = useState<Date | null>();\r\n  const [scheduledClone, setScheduledClone] = useState<IShift[]>([]);\r\n\r\n  const [locationInfo, setLocationInfo] = useState<ICalendarLocation | undefined>(undefined);\r\n\r\n  const fetchSchedule = async () => {\r\n    try {\r\n      const res = await getSchedule({\r\n        locationIds: parseInt(selectedLocation?.value as string),\r\n        dateFrom: startDate,\r\n        dateTo: endDate,\r\n      });\r\n\r\n      setLocationInfo(res?.[0]);\r\n      setOpenDate(res?.[0]?.openDate);\r\n      setCloseDate(res?.[0]?.closeDate);\r\n      setScheduled(res?.[0]?.shifts);\r\n      setScheduledClone(res?.[0]?.shifts);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading the Schedule, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    }\r\n  };\r\n\r\n  const editSchedule = async () => {\r\n    try {\r\n      const payload = {\r\n        // FT doesn't handle shift Request Approvals, so this should always be null\r\n        shiftRequestApproval: [],\r\n        scheduledShiftDeletion:\r\n          scheduled.filter(shift => shift.isDeleted)?.map(shift => shift.shiftId as number) ?? null,\r\n        scheduledShiftCreation: scheduled\r\n          .filter(shift => shift.shiftId === null)\r\n          ?.map(shift => {\r\n            return {\r\n              shiftId: 0,\r\n              dvmId: shift.dvmId as number,\r\n              shiftDate: shift.shiftDate,\r\n              locationId: selectedLocation?.value as string,\r\n            };\r\n          }),\r\n      };\r\n\r\n      const res = await putFTPersist(payload);\r\n\r\n      if (res.Detail) {\r\n        enqueueSnackbar(`${handleError(res)}`, {\r\n          variant: 'error',\r\n        });\r\n      }\r\n\r\n      if (!res.Detail) {\r\n        await fetchSchedule();\r\n        await fetchDvmSchedule();\r\n      }\r\n    } catch (error: any) {\r\n      const errorMessage = handleError(error?.response?.data);\r\n      enqueueSnackbar(errorMessage || 'Something went wrong. Your changes were not saved.', {\r\n        variant: 'error',\r\n      });\r\n      await fetchSchedule();\r\n      await fetchDvmSchedule();\r\n    }\r\n  };\r\n\r\n  const handleDateClick = (date: Date) => {\r\n    setScheduled((prev: IShift[]) => {\r\n      return [\r\n        ...prev,\r\n        {\r\n          shiftId: null,\r\n          dvmId: selectedDvm?.value,\r\n          dvmName: selectedDvm?.description,\r\n          dvmType: selectedDvm?.dvmType,\r\n          shiftDate: date,\r\n          isUpdated: true,\r\n          isDeleted: false,\r\n          hasIncentive: false,\r\n        },\r\n      ];\r\n    });\r\n  };\r\n\r\n  const handleRemoveClick = (date: Date) => {\r\n    setScheduled((prev: IShift[]) => {\r\n      let deletedShift = prev.find(s => new Date(s.shiftDate).getTime() === date.getTime());\r\n\r\n      if (deletedShift) {\r\n        if (deletedShift?.shiftId) {\r\n          deletedShift.isDeleted = true;\r\n        } else {\r\n          return prev.filter(s => new Date(s.shiftDate).getTime() !== date.getTime());\r\n        }\r\n      }\r\n      if (deletedShift) {\r\n        return [...prev, deletedShift];\r\n      }\r\n      return [...prev];\r\n    });\r\n  };\r\n\r\n  // Fetch locations only when location types are selected\r\n  // Filter locations based on location Type selected\r\n  useEffect(() => {\r\n    fetchLocations(1);\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    // only fetch DVM data if urgentVet\r\n    if (selectedLocation && isUrgentVet) {\r\n      fetchDvms();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedLocation, showAllDvms]);\r\n\r\n  useEffect(() => {\r\n    if (selectedLocation && startDate && endDate) {\r\n      fetchSchedule();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedLocation, startDate, endDate]);\r\n\r\n  useEffect(() => {\r\n    if (selectedDvm) fetchDvmSchedule();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedDvm, startDate, endDate]);\r\n\r\n  useEffect(() => {\r\n    // Don't refetch if the user didn't change the date.\r\n    if (previousSelectedDate.getTime() === selectedDate.getTime()) return;\r\n    setPreviousSelectedDate(selectedDate);\r\n    setStartDate(startOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n    setEndDate(lastDayOfWeek(selectedDate, { weekStartsOn: 1 }));\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedDate]);\r\n\r\n  useEffect(() => {\r\n    setPreviousDate(date);\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [date]);\r\n\r\n  const isUrgentVet = true;\r\n\r\n  return (\r\n    <Page\r\n      title={'FT Scheduling'}\r\n      additionalHeaderContent={\r\n        isNotPhone ? (\r\n          <Grid\r\n            alignItems={'center'}\r\n            justifyContent={'flex-end'}\r\n            container\r\n            spacing={1}\r\n            className={classes.schedPaginationControls}\r\n          >\r\n            <Grid item xs={3} className={'this-week-btn-wrap'}>\r\n              <Button\r\n                onClick={() => {\r\n                  if (handleChangeWithoutSave()) {\r\n                    setSelectedDate(new Date());\r\n                    setDate(new Date());\r\n                  }\r\n                }}\r\n                disabled={isToday(date)}\r\n              >\r\n                This Week\r\n              </Button>\r\n            </Grid>\r\n\r\n            <Grid container item alignItems={'center'} xs={3}>\r\n              <Grid item xs={2}>\r\n                <IconButton\r\n                  onClick={() => {\r\n                    if (handleChangeWithoutSave()) {\r\n                      const prevWeek = new Date(date);\r\n                      prevWeek.setDate(prevWeek.getDate() - 7);\r\n                      setSelectedDate(prevWeek);\r\n                      setDate(prevWeek);\r\n                    }\r\n                  }}\r\n                  title={'Previous Week'}\r\n                  className={classes.weekPaginationBtns}\r\n                >\r\n                  <ArrowBackIos style={{ fontSize: '12px' }} />\r\n                </IconButton>\r\n              </Grid>\r\n              <Grid item xs={8}>\r\n                <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={enLocale}>\r\n                  <DesktopDatePicker\r\n                    toolbarPlaceholder={'Date'}\r\n                    inputFormat=\"MM/dd/yyyy\"\r\n                    value={selectedDate}\r\n                    onChange={val => {\r\n                      setDate(val as Date);\r\n                    }}\r\n                    onAccept={val => {\r\n                      if (handleChangeWithoutSave()) {\r\n                        setSelectedDate(val as Date);\r\n                      } else {\r\n                        setDate(previousDate);\r\n                        setSelectedDate(previousSelectedDate);\r\n                      }\r\n                    }}\r\n                    renderInput={(params: any) => (\r\n                      <TextField\r\n                        onBlur={() => {\r\n                          // Short circuit if the user clicked in the box and didn't change the date.\r\n                          if (previousSelectedDate.getTime() === date.getTime()) return;\r\n                          const earliestPossibleDate = new Date('January 1, 1900');\r\n                          if (handleChangeWithoutSave()) {\r\n                            if (date < earliestPossibleDate) {\r\n                              setSelectedDate(earliestPossibleDate);\r\n                              setDate(earliestPossibleDate);\r\n                            } else {\r\n                              setSelectedDate(date);\r\n                              setDate(date);\r\n                            }\r\n                          } else {\r\n                            setDate(previousSelectedDate);\r\n                            setSelectedDate(_ => {\r\n                              return new Date(previousSelectedDate);\r\n                            });\r\n                          }\r\n                        }}\r\n                        size=\"small\"\r\n                        variant=\"standard\"\r\n                        {...params}\r\n                      ></TextField>\r\n                    )}\r\n                  />\r\n                </LocalizationProvider>\r\n              </Grid>\r\n\r\n              <Grid item xs={2}>\r\n                <IconButton\r\n                  onClick={() => {\r\n                    if (handleChangeWithoutSave()) {\r\n                      const nextWeek = new Date(date);\r\n                      nextWeek.setDate(nextWeek.getDate() + 7);\r\n                      setSelectedDate(nextWeek);\r\n                      setDate(nextWeek);\r\n                    }\r\n                  }}\r\n                  title={'Next Week'}\r\n                  className={classes.weekPaginationBtns}\r\n                >\r\n                  <ArrowForwardIos style={{ fontSize: '12px' }} />\r\n                </IconButton>\r\n              </Grid>\r\n            </Grid>\r\n          </Grid>\r\n        ) : undefined\r\n      }\r\n    >\r\n      {isNotPhone ? (\r\n        <Box width=\"100%\">\r\n          <Grid container spacing={1}>\r\n            <Grid item xs={3}>\r\n              <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                <InputLabel shrink={!!selectedLocation?.value} htmlFor=\"locationsLabel\">\r\n                  {selectedLocation ? 'Location' : 'Select Location'}\r\n                </InputLabel>\r\n                <Select\r\n                  fullWidth\r\n                  name=\"locations\"\r\n                  labelId=\"locationsLabel\"\r\n                  id=\"locations\"\r\n                  disabled={areLocationsLoading}\r\n                  value={selectedLocation ? selectedLocation.value : ''}\r\n                  onChange={async (event: any) => {\r\n                    handleChangeWithoutSave();\r\n                    const location = locations?.find(loc => loc.value === event.target.value);\r\n                    setSelectedLocation(location ?? null);\r\n                  }}\r\n                >\r\n                  {locations?.map((location: ILocationDropdown, index) => (\r\n                    <MenuItem key={`${index + 1}`} value={location.value}>\r\n                      {location.description}\r\n                    </MenuItem>\r\n                  ))}\r\n                </Select>\r\n              </FormControl>\r\n            </Grid>\r\n\r\n            {isUrgentVet && (\r\n              <>\r\n                <Grid item xs={3}>\r\n                  <Autocomplete\r\n                    value={selectedDvm as IDropdownResponse}\r\n                    onChange={(event, newValue: any) => {\r\n                      setSelectedDvm(newValue);\r\n                    }}\r\n                    disabled={areDvmsLoading}\r\n                    selectOnFocus\r\n                    handleHomeEndKeys\r\n                    loading={areDvmsLoading}\r\n                    id=\"selected-dvm\"\r\n                    options={dvms || []}\r\n                    getOptionLabel={(option: IDropdownResponse) => {\r\n                      // Value selected with enter, right from the input\r\n                      if (typeof option === 'string') {\r\n                        return option;\r\n                      }\r\n                      return `${option.description}`;\r\n                    }}\r\n                    renderInput={params => (\r\n                      <TextField\r\n                        {...params}\r\n                        key={params.id}\r\n                        size=\"small\"\r\n                        autoComplete=\"on\"\r\n                        label=\"DVM\"\r\n                        variant=\"standard\"\r\n                      />\r\n                    )}\r\n                  />\r\n                </Grid>\r\n                <Grid item xs={2} alignSelf={'end'}>\r\n                  <FormControlLabel\r\n                    label=\"Show All\"\r\n                    control={\r\n                      <Checkbox\r\n                        checked={showAllDvms}\r\n                        onChange={() => setShowAllDvms(!showAllDvms)}\r\n                      />\r\n                    }\r\n                  />\r\n                </Grid>\r\n              </>\r\n            )}\r\n          </Grid>\r\n          {locations && locations.length > 0 && !!selectedLocation?.value && scheduled && (\r\n            <>\r\n              {isUrgentVet && (\r\n                <CalendarGrid\r\n                  selectedLocation={selectedLocation.value}\r\n                  selectedDvm={selectedDvm}\r\n                  locations={locations}\r\n                  selectedDate={selectedDate}\r\n                  setSelectedDate={setSelectedDate}\r\n                  handleDateClick={handleDateClick}\r\n                  handleRemoveClick={handleRemoveClick}\r\n                  scheduled={scheduled}\r\n                  selectedDVMSchedule={selectedDVMSchedule}\r\n                  allowDvmCardDelete={false}\r\n                  openDate={openDate}\r\n                  closeDate={closeDate}\r\n                  locationInfo={locationInfo}\r\n                />\r\n              )}\r\n            </>\r\n          )}\r\n\r\n          <Box display={'flex'} flexDirection={'row-reverse'}>\r\n            <Button\r\n              className={classes.saveButton}\r\n              disabled={deepEqual(scheduled, scheduledClone)}\r\n              onClick={() => editSchedule()}\r\n            >\r\n              Save\r\n            </Button>\r\n          </Box>\r\n        </Box>\r\n      ) : (\r\n        <Alert severity=\"warning\">\r\n          <AlertTitle>Scheduling not available at this screen resolution</AlertTitle>\r\n        </Alert>\r\n      )}\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  reliefButton: {\r\n    width: 'auto',\r\n    padding: theme.spacing(1, 2),\r\n  },\r\n  reliefButtonContainer: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    alignItems: 'center',\r\n  },\r\n  saveButton: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  schedPaginationControls: {\r\n    '& .this-week-btn-wrap': {\r\n      paddingTop: theme.spacing(1.75),\r\n    },\r\n  },\r\n  weekPaginationBtns: {\r\n    border: 'none',\r\n    background: 'none',\r\n    color: theme.palette.common.black,\r\n    padding: 0,\r\n    borderRadius: 0,\r\n    minWidth: theme.spacing(4),\r\n\r\n    '&:hover': {\r\n      background: 'none',\r\n    },\r\n  },\r\n}));\r\n","import { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\nconst baseUrl = '/admin/LegalEntities';\r\n\r\nexport const getLegalEntities = async (): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLegalEntities failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const getLegalEntity = async (legalEntityId: string | number): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/${legalEntityId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getLegalEntity failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const createLegalEntity = async (info: {\r\n  name: string;\r\n  code: string;\r\n  stateIds: number[] | null;\r\n  taxType: string;\r\n}): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}`, info);\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({error}, 'createLegalEntity failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\nexport const updateLegalEntity = async (legalEntityId: string | number, info: {\r\n  name: string;\r\n  code: string;\r\n  stateIds: number[] | null;\r\n  taxType: string;\r\n}): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.put(`${baseUrl}/${legalEntityId}`, info);\r\n    return data;\r\n  } catch (error: any) {\r\n    logError({error}, 'updateLegalEntity failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { FC, ReactNode } from 'react';\r\nimport { RadioGroup as MuiRadioGroup, RadioGroupProps as StandardRadioGroupProps, FormControl, FormHelperText } from '@mui/material';\r\nimport { useField } from 'formik';\r\n\r\ninterface RadioGroupProps extends StandardRadioGroupProps {\r\n  name: string,\r\n  children: ReactNode,\r\n};\r\n\r\nexport const RadioGroup: FC<RadioGroupProps> = ({\r\n  name,\r\n  children,\r\n  ...props\r\n}) => {\r\n  const [field, meta] = useField(name);\r\n\r\n  return (\r\n    <FormControl>\r\n      <MuiRadioGroup {...field} {...props}>\r\n        { children }\r\n      </MuiRadioGroup>\r\n      { meta.touched && meta.error &&\r\n        <FormHelperText error>{meta.error}</FormHelperText>\r\n      }\r\n    </FormControl>\r\n  )\r\n};\r\n","import { FC, useEffect, useState, useMemo } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Box,\r\n  Button,\r\n  Fade,\r\n  Grid,\r\n  TextField,\r\n  Typography,\r\n  Autocomplete,\r\n  FormControl,\r\n  FormControlLabel,\r\n  FormLabel,\r\n  Radio,\r\n} from '@mui/material';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { createLegalEntity, getLegalEntity, updateLegalEntity } from '../../fetch/legal-entities';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Edit, Close } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { ILegalEntity } from '../../models/legal-entitites';\r\nimport { getStates, getTaxTypes } from '../../fetch/lookups';\r\nimport { RadioGroup } from '../../components/formik-mui/radio-group';\r\n\r\ninterface ILegalEntityModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  fetchLegalEntities: () => void;\r\n  currentLegalEntityId: string | number;\r\n  isEdit: boolean;\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  legalEntityName: Yup.string().required('Required'),\r\n  code: Yup.string().required('Required'),\r\n  taxType: Yup.string().required('Tax Type is Required'),\r\n});\r\n\r\nexport const LegalEntityModal: FC<ILegalEntityModal> = ({\r\n  open,\r\n  onClose,\r\n  fetchLegalEntities,\r\n  currentLegalEntityId,\r\n  isEdit,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [legalEntity, setLegalEntity] = useState<ILegalEntity>();\r\n  const [areStatesLoading, setAreStatesLoading] = useState(true);\r\n  const [states, setStates] = useState<IDropdownResponse[]>([]);\r\n  const [stateIds, setStateIds] = useState<number[]>([]);\r\n\r\n  const fetchLegalEntity = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getLegalEntity(currentLegalEntityId);\r\n      setLegalEntity(res);\r\n      setStateIds(res?.stateIds || []);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading legal entity, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const fetchStates = async () => {\r\n    setAreStatesLoading(true);\r\n    try {\r\n      const res = await getStates();\r\n      setStates(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading states, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreStatesLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areTaxTypesLoading, setAreTaxTypesLoading] = useState(true);\r\n  const [taxTypes, setTaxTypes] = useState<IDropdownResponse[]>([]);\r\n  const fetchTaxTypes = async () => {\r\n    setAreTaxTypesLoading(true);\r\n    try {\r\n      const res = await getTaxTypes();\r\n      setTaxTypes(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading taxTypes, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreTaxTypesLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchStates();\r\n    if (!currentLegalEntityId) {\r\n      setStateIds([]);\r\n      setLegalEntity(undefined);\r\n    }\r\n    fetchTaxTypes();\r\n    if (currentLegalEntityId) fetchLegalEntity();\r\n    if (!currentLegalEntityId) setLegalEntity(undefined);\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [currentLegalEntityId]);\r\n\r\n  const filteredStates = useMemo(() => {\r\n    if (!states || !stateIds) return states;\r\n    return states.filter(state => !stateIds.includes(Number(state.value)));\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [states, legalEntity?.stateIds, stateIds]);\r\n\r\n  return (\r\n    <Formik\r\n      enableReinitialize={true}\r\n      initialValues={{\r\n        legalEntityName: legalEntity?.name ?? '',\r\n        code: legalEntity?.code ?? '',\r\n        authorizedStateIds:\r\n          legalEntity?.stateIds.map(\r\n            (id: string | number) => states.find(state => state.value === id) // Convert IDs to IDropdownResponse objects\r\n          ) ?? [],\r\n        taxType: taxTypes?.find(type => type.value === legalEntity?.taxType)?.value ?? '',\r\n      }}\r\n      validationSchema={Schema}\r\n      onSubmit={async (values, actions) => {\r\n        const data = {\r\n          authorizedStateIds:\r\n            values?.authorizedStateIds?.length === 0\r\n              ? []\r\n              : values.authorizedStateIds.map((state: any) => Number(state?.value)),\r\n          name: values.legalEntityName,\r\n          code: values.code,\r\n          taxType: values.taxType,\r\n        };\r\n\r\n        try {\r\n          if (!isEdit) {\r\n            await createLegalEntity({\r\n              name: data?.name,\r\n              code: data?.code,\r\n              stateIds: data?.authorizedStateIds || null,\r\n              taxType: values.taxType,\r\n            });\r\n          } else {\r\n            await updateLegalEntity(currentLegalEntityId, {\r\n              name: data?.name,\r\n              code: data?.code,\r\n              stateIds: data?.authorizedStateIds || null,\r\n              taxType: values.taxType,\r\n            });\r\n          }\r\n          fetchLegalEntities();\r\n          enqueueSnackbar('Legal Entity Saved!', {\r\n            variant: 'success',\r\n          });\r\n          actions.resetForm();\r\n          onClose();\r\n        } catch (error: any) {\r\n          const errorMessage = error?.response?.data?.Detail;\r\n          enqueueSnackbar(errorMessage || `Error saving legal entity, please try again.`, {\r\n            variant: 'error',\r\n          });\r\n          console.log(error);\r\n        }\r\n      }}\r\n    >\r\n      {({\r\n        isSubmitting,\r\n        values,\r\n        initialValues,\r\n        setFieldValue,\r\n        handleSubmit,\r\n        dirty,\r\n        isValid,\r\n        handleBlur,\r\n        errors,\r\n        touched,\r\n        resetForm,\r\n      }) => {\r\n        return (\r\n          <Modal\r\n            open={open}\r\n            onClose={() => {\r\n              resetForm();\r\n              onClose();\r\n            }}\r\n            maxWidth=\"md\"\r\n          >\r\n            <Fade in={open}>\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                <div>\r\n                  <Typography variant=\"h5\">\r\n                    {isEdit ? 'Edit Legal Entity' : 'Add New Legal Entity'}\r\n                  </Typography>\r\n                  <div className={classes.content}>\r\n                    <Grid container spacing={1}>\r\n                      <Grid item xs={12} sm={6}>\r\n                        <TextField\r\n                          disabled={isLoading}\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Legal Entity Name\"\r\n                          name=\"name\"\r\n                          value={values?.legalEntityName}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          required\r\n                          onChange={e => setFieldValue('legalEntityName', e.target.value)}\r\n                          error={\r\n                            touched.legalEntityName && errors && errors.legalEntityName\r\n                              ? true\r\n                              : false\r\n                          }\r\n                          helperText={touched.legalEntityName && errors && errors.legalEntityName}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={12} sm={6}>\r\n                        <TextField\r\n                          disabled={isLoading}\r\n                          fullWidth\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Code\"\r\n                          name=\"code\"\r\n                          value={values?.code}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          required\r\n                          onChange={e => setFieldValue('code', e.target.value)}\r\n                          error={touched.code && errors && errors.code ? true : false}\r\n                          helperText={touched.code && errors && errors.code}\r\n                        />\r\n                      </Grid>\r\n\r\n                      <Grid item xs={12} sm={8}>\r\n                        <Autocomplete\r\n                          multiple\r\n                          value={values.authorizedStateIds}\r\n                          onChange={(event, newValue: any) => {\r\n                            const newStateIds = newValue.map((item: any) => item.value);\r\n                            setStateIds(newStateIds);\r\n                            setFieldValue('authorizedStateIds', newValue);\r\n                          }}\r\n                          disabled={areStatesLoading}\r\n                          selectOnFocus\r\n                          handleHomeEndKeys\r\n                          loading={areStatesLoading}\r\n                          id=\"selected-states\"\r\n                          options={filteredStates || []}\r\n                          filterSelectedOptions\r\n                          getOptionLabel={(option: any) => {\r\n                            // Value selected with enter, right from the input\r\n                            if (typeof option === 'string') {\r\n                              return option;\r\n                            }\r\n                            return `${option?.description} (${option?.shorthand})`;\r\n                          }}\r\n                          renderInput={params => (\r\n                            <TextField\r\n                              {...params}\r\n                              key={params.id}\r\n                              size=\"small\"\r\n                              autoComplete=\"on\"\r\n                              label=\"Authorized States\"\r\n                              variant=\"standard\"\r\n                            />\r\n                          )}\r\n                        />\r\n                      </Grid>\r\n                      {/* Used as a spacer */}\r\n                      <Grid item xs={12} sm={1}></Grid>\r\n                      <Grid item xs={12} sm={3}>\r\n                        <FormControl\r\n                          component=\"fieldset\"\r\n                          disabled={areTaxTypesLoading}\r\n                          margin={'dense'}\r\n                        >\r\n                          <FormLabel required>Tax Type</FormLabel>\r\n                          <RadioGroup\r\n                            defaultValue=\"1099\"\r\n                            row\r\n                            aria-label=\"taxType\"\r\n                            name=\"taxType\"\r\n                            value={values.taxType}\r\n                            onChange={(e, value) => setFieldValue('taxType', e.target.value)}\r\n                          >\r\n                            {taxTypes.map(type => (\r\n                              <FormControlLabel\r\n                                value={type.value}\r\n                                control={<Radio />}\r\n                                label={type.description}\r\n                              />\r\n                            ))}\r\n                          </RadioGroup>\r\n                        </FormControl>\r\n                      </Grid>\r\n                    </Grid>\r\n                  </div>\r\n                </div>\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!dirty || isSubmitting || !isValid}\r\n                    type=\"submit\"\r\n                    startIcon={<Edit />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Save\r\n                  </Button>\r\n                  <Button\r\n                    className={classes.button}\r\n                    type=\"button\"\r\n                    variant=\"contained\"\r\n                    color=\"inherit\"\r\n                    disabled={isSubmitting}\r\n                    startIcon={<Close />}\r\n                    onClick={() => {\r\n                      //@ts-ignore\r\n                      if (!deepEqual(initialValues, values)) {\r\n                        const result = window.confirm(\r\n                          'You have unsaved changes, are you sure you want to exit?'\r\n                        );\r\n                        if (result) {\r\n                          resetForm();\r\n                          onClose();\r\n                        } else {\r\n                          return;\r\n                        }\r\n                      } else {\r\n                        resetForm();\r\n                        onClose();\r\n                      }\r\n                    }}\r\n                  >\r\n                    Cancel\r\n                  </Button>\r\n                </Box>\r\n              </Form>\r\n            </Fade>\r\n          </Modal>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { Box, Button, useMediaQuery } from '@mui/material';\r\nimport { FC, useMemo } from 'react';\r\nimport { Table } from '../../../components/table/Table';\r\nimport { MobileTable } from '../../../components/table/MobileTable';\r\nimport { IColumn } from '../../../models/util';\r\nimport { EditLocationAlt } from '@mui/icons-material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { ILegalEntityList } from '../../../models/legal-entitites';\r\n\r\ninterface ILegalEntities {\r\n  handleEdit: (legalEntityId: number | string) => void;\r\n  legalEntities: ILegalEntityList[];\r\n  setLegalEntities: (legalEntities: ILegalEntityList[]) => void;\r\n  isLoading: boolean;\r\n}\r\nexport const LegalEntities: FC<ILegalEntities> = ({\r\n  handleEdit,\r\n  legalEntities,\r\n  setLegalEntities,\r\n  isLoading,\r\n}) => {\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n\r\n  const classes = useStyles();\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Name',\r\n        accessor: 'name',\r\n      },\r\n      {\r\n        Header: 'Code',\r\n        accessor: 'code',\r\n      },\r\n      {\r\n        Header: 'States',\r\n        accessor: 'states',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILegalEntityList } };\r\n        }) => {\r\n          const stateCodes = original.states.map(state => state.code);\r\n          return <span>{stateCodes.join(', ')}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        sort: false,\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: ILegalEntityList } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original?.legalEntityId);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [legalEntities]);\r\n\r\n  return (\r\n    <Table\r\n      columns={columns}\r\n      data={legalEntities}\r\n      hidePagination\r\n      isLoading={isLoading}\r\n      ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n      mobileProps={{\r\n        fields: columns\r\n          .filter(col => col.Header)\r\n          .map(col => ({\r\n            name: col.Header,\r\n            accessor: col.accessor,\r\n            Cell: col?.Cell,\r\n          })),\r\n        handleEdit: (legalEntity: ILegalEntityList) => {\r\n          handleEdit(legalEntity?.legalEntityId);\r\n        },\r\n      }}\r\n    />\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Grid, Button, Divider, TextField } from '@mui/material';\r\nimport { FilterList, Close, ArrowDropDown, ArrowDropUp } from '@mui/icons-material';\r\n\r\ninterface IW2DVMFilters {\r\n  isLoading: boolean;\r\n  applyFilters: (clearFilters?: boolean) => void;\r\n  setSearchValue: (val: string) => void;\r\n  searchValue: string;\r\n  handleSearch: (val: string) => void;\r\n  hasAppliedFilters: boolean;\r\n  setHasAppliedFilters: (val: boolean) => void;\r\n}\r\n\r\nexport const W2DVMFilters: FC<IW2DVMFilters> = ({\r\n  isLoading,\r\n  applyFilters,\r\n\r\n  handleSearch,\r\n  hasAppliedFilters,\r\n  setHasAppliedFilters,\r\n}) => {\r\n  const [isMobileFilterButtonOpen, setIsMobileFilterButtonOpen] = useState<boolean>(false);\r\n  const classes = useStyles({ isMobileFilterButtonOpen });\r\n\r\n  const [searchValue, setSearchValue] = useState<string>('');\r\n  const noFilters = !searchValue;\r\n  return (\r\n    <>\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.searchWrapper}></Grid>\r\n      <Button\r\n        color=\"secondary\"\r\n        variant=\"contained\"\r\n        className={classes.mobileButton}\r\n        startIcon={<FilterList />}\r\n        endIcon={isMobileFilterButtonOpen ? <ArrowDropUp /> : <ArrowDropDown />}\r\n        onClick={() => {\r\n          setIsMobileFilterButtonOpen(!isMobileFilterButtonOpen);\r\n        }}\r\n      >\r\n        Filters\r\n      </Button>\r\n      {!isMobileFilterButtonOpen && <Divider className={classes.divider} />}\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.wrapper}>\r\n        <Grid item xs={12} sm={6} md={3}>\r\n          <TextField\r\n            fullWidth\r\n            variant=\"standard\"\r\n            autoComplete=\"nope\"\r\n            label=\"Search\"\r\n            name=\"search\"\r\n            classes={{ root: classes.searchRoot }}\r\n            value={searchValue}\r\n            size=\"small\"\r\n            onKeyDown={e => {\r\n              if (e.key === 'Enter') {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n                handleSearch(searchValue);\r\n              }\r\n            }}\r\n            onChange={e => {\r\n              setSearchValue(e.target.value);\r\n            }}\r\n          />\r\n        </Grid>\r\n\r\n        <Grid item xs={12} sm={6} lg={4}>\r\n          <Button\r\n            color=\"primary\"\r\n            variant=\"contained\"\r\n            className={classes.button}\r\n            disabled={isLoading}\r\n            startIcon={<FilterList />}\r\n            onClick={() => {\r\n              if (noFilters) {\r\n                setHasAppliedFilters(false);\r\n                applyFilters();\r\n              } else {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n                handleSearch(searchValue);\r\n              }\r\n            }}\r\n          >\r\n            Apply Filters\r\n          </Button>\r\n          {hasAppliedFilters && (\r\n            <Button\r\n              className={clsx(classes.button, classes.resetButton)}\r\n              variant=\"contained\"\r\n              color=\"inherit\"\r\n              disabled={isLoading}\r\n              startIcon={<Close />}\r\n              onClick={() => {\r\n                setSearchValue('');\r\n                setHasAppliedFilters(false);\r\n                applyFilters(true);\r\n              }}\r\n            >\r\n              Reset\r\n            </Button>\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { isMobileFilterButtonOpen?: boolean }>((theme: Theme) => ({\r\n  mobileButton: {\r\n    width: '100%',\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  button: {\r\n    marginTop: 4,\r\n    marginBottom: 4,\r\n    height: 40,\r\n    textTransform: 'capitalize',\r\n    width: '100%',\r\n\r\n    [theme.breakpoints.up('sm')]: {\r\n      width: 'auto',\r\n      marginLeft: theme.spacing(2),\r\n    },\r\n  },\r\n  resetButton: {\r\n    '@media (min-width: 600px)': {\r\n      marginLeft: 11,\r\n    },\r\n    [theme.breakpoints.up('sm')]: {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  wrapper: ({ isMobileFilterButtonOpen }) =>\r\n    isMobileFilterButtonOpen\r\n      ? {\r\n          marginTop: 10,\r\n          marginBottom: 10,\r\n          display: 'flex',\r\n        }\r\n      : {\r\n          display: 'none',\r\n          marginBottom: theme.spacing(1),\r\n          [theme.breakpoints.up('sm')]: {\r\n            display: 'flex',\r\n          },\r\n        },\r\n  divider: {\r\n    display: 'block',\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  gridItem: {\r\n    padding: `3px 8px !important`,\r\n    [theme.breakpoints.up('sm')]: {\r\n      padding: `8px !important`,\r\n    },\r\n  },\r\n  searchIcon: {\r\n    cursor: 'pointer',\r\n    color: theme.palette.grey[500],\r\n  },\r\n  ellipsis: {\r\n    fontSize: 14,\r\n    width: 'auto',\r\n    whiteSpace: 'normal',\r\n    overflow: 'visible',\r\n    '@media (min-width: 960px)': {\r\n      textOverflow: 'ellipsis',\r\n      whiteSpace: 'nowrap',\r\n      overflow: 'hidden',\r\n    },\r\n    '@media (min-width: 1400px)': {\r\n      width: 'auto',\r\n      whiteSpace: 'normal',\r\n      overflow: 'visible',\r\n    },\r\n  },\r\n  formControlRoot: {\r\n    marginTop: 0,\r\n  },\r\n  textFieldRoot: {\r\n    marginBottom: 0,\r\n  },\r\n  searchWrapper: {\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'flex',\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n  },\r\n  clearSearchButton: {\r\n    '@media (min-width: 408px)': {\r\n      marginTop: 3,\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  searchButton: {\r\n    minWidth: '8rem',\r\n  },\r\n  searchRoot: {\r\n    marginTop: 0,\r\n  },\r\n}));\r\n","import { Box, Button, useMediaQuery } from '@mui/material';\r\nimport { FC, useMemo } from 'react';\r\nimport { Table } from '../../../components/table/Table';\r\nimport { MobileTable } from '../../../components/table/MobileTable';\r\nimport { IColumn, setState } from '../../../models/util';\r\nimport { EditLocationAlt } from '@mui/icons-material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { IW2PaymentReserves } from '../../../models';\r\nimport { formatDate, formatWholeNumberPercent } from '../../../helpers';\r\nimport { W2DVMFilters } from './w2-dvms-filters';\r\n\r\ninterface IW2DVMs {\r\n  handleEdit: (dvmId: number | string) => void;\r\n  dvmsWithW2Reserves: IW2PaymentReserves[];\r\n  setDvmsWithW2Reserves: (dvmsWithW2Reserves: IW2PaymentReserves[]) => void;\r\n  isLoading: boolean;\r\n  searchValue: string;\r\n  setSearchValue: setState<string>;\r\n  hasAppliedFilters: boolean;\r\n  setHasAppliedFilters: setState<boolean>;\r\n  handleClickColumn: (column: string) => void;\r\n  selectedSort: string;\r\n  sortDirection: any;\r\n  handleSearch: (val: string) => void;\r\n}\r\n\r\nexport const W2DVMs: FC<IW2DVMs> = ({\r\n  handleEdit,\r\n  dvmsWithW2Reserves,\r\n  setDvmsWithW2Reserves,\r\n  searchValue,\r\n  setSearchValue,\r\n  hasAppliedFilters,\r\n  setHasAppliedFilters,\r\n  handleClickColumn,\r\n  isLoading,\r\n  selectedSort,\r\n  sortDirection,\r\n  handleSearch,\r\n}) => {\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n\r\n  const classes = useStyles();\r\n\r\n  // filters\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'DVM Name',\r\n        accessor: 'name',\r\n        isServerSorted: selectedSort === 'Name',\r\n        isServerSortedDesc: sortDirection.Name === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Name'),\r\n      },\r\n      {\r\n        Header: 'Current Reserve Rate',\r\n        accessor: 'currentW2PaymentReserve.reserve',\r\n        isServerSorted: selectedSort === 'Reserve',\r\n        isServerSortedDesc: sortDirection.Reserve === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Reserve'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IW2PaymentReserves } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original?.currentW2PaymentReserve?.reserve\r\n                ? formatWholeNumberPercent(original?.currentW2PaymentReserve?.reserve)\r\n                : 'No Current Rate'}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Date of Current Reserve Rate',\r\n        accessor: 'currentW2PaymentReserve.effectiveDate',\r\n        isServerSorted: selectedSort === 'EffectiveDate',\r\n        isServerSortedDesc: sortDirection.EffectiveDate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('EffectiveDate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IW2PaymentReserves } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original?.currentW2PaymentReserve?.effectiveDate\r\n                ? formatDate(original?.currentW2PaymentReserve?.effectiveDate)\r\n                : 'No Current Date'}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IW2PaymentReserves } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original?.dvmId);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [dvmsWithW2Reserves, selectedSort, sortDirection]);\r\n\r\n  return (\r\n    <>\r\n      <W2DVMFilters\r\n        setSearchValue={setSearchValue}\r\n        searchValue={searchValue}\r\n        applyFilters={(clearFilters?: boolean) => {\r\n          if (clearFilters) {\r\n            setSearchValue('');\r\n          }\r\n        }}\r\n        setHasAppliedFilters={setHasAppliedFilters}\r\n        handleSearch={(val: string) => {\r\n          handleSearch(val);\r\n        }}\r\n        isLoading={isLoading}\r\n        hasAppliedFilters={hasAppliedFilters}\r\n      />\r\n      <Table\r\n        columns={columns}\r\n        data={dvmsWithW2Reserves}\r\n        hidePagination\r\n        isLoading={isLoading}\r\n        ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n        mobileProps={{\r\n          fields: columns\r\n            .filter(col => col.Header)\r\n            .map(col => ({\r\n              name: col.Header,\r\n              accessor: col.accessor,\r\n              Cell: col?.Cell,\r\n            })),\r\n          handleEdit: (IW2PaymentReserves: IW2PaymentReserves) => {\r\n            handleEdit(IW2PaymentReserves?.dvmId);\r\n          },\r\n        }}\r\n      />\r\n    </>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\nimport { IDVMPaymentReserves, IDVMPaymentReservesUpdatePayload, IW2PaymentReserves } from '../models';\r\nimport { IResponse } from '../models/util';\r\nconst baseUrl = '/admin/W2PaymentReserves';\r\n\r\nexport const getDVMsWithW2Reserves = async (filters?: {\r\n  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;\r\n  name?: string;\r\n}): Promise<IResponse<IW2PaymentReserves[]>> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}`, filters);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDVMsWithW2Reserves failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\n\r\nexport const getDVMWithW2Reserves = async (dvmId: string | number): Promise<IDVMPaymentReserves> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/dvm/${dvmId}`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getDVMWithW2Reserves failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n\r\n\r\nexport const updateDVMWithW2Reserves = async (dvmId: string | number, payload: IDVMPaymentReservesUpdatePayload ): Promise<any> => {\r\n  try {\r\n    const { data } = await authFetch.post(`${baseUrl}/dvm/${dvmId}`, payload);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'updateDVMWithW2Reserves failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\n","import { FC, useEffect, useState } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Autocomplete,\r\n  Box,\r\n  Button,\r\n  Fade,\r\n  FormControl,\r\n  Grid,\r\n  IconButton,\r\n  TextField,\r\n  Typography,\r\n} from '@mui/material';\r\nimport { Loader, Modal } from '../../components';\r\nimport { FieldArray, Form, Formik, FormikErrors } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Edit, Close } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { getDVMWithW2Reserves, updateDVMWithW2Reserves } from '../../fetch/w2-payment-reserve';\r\nimport { ICurrentW2PaymentReserve, IDVMPaymentReserves } from '../../models';\r\nimport { getW2DVMs } from '../../fetch/lookups';\r\nimport { DatePicker } from '@mui/x-date-pickers';\r\nimport React from 'react';\r\nimport { NumericFormatProps, NumericFormat } from 'react-number-format';\r\nimport { isAfter, startOfToday } from 'date-fns';\r\n\r\ninterface IW2DVMsModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  fetchW2DVMs: () => void;\r\n  currentDVMId: string | number;\r\n  isEdit: boolean;\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  name: Yup.object().required('W2 DVM is Required'),\r\n  w2PaymentReserves: Yup.array()\r\n    .of(\r\n      Yup.object({\r\n        reserve: Yup.number()\r\n          .typeError('Reserve Percentage is Required')\r\n          .min(0, 'Value must be at least 0%')\r\n          .max(100, 'Value must be less than 100%')\r\n          .required('Reserve Percentage is Required'),\r\n        effectiveDate: Yup.date()\r\n          .typeError('Effective Date is invalid')\r\n          .required('Effective Date is Required'),\r\n      })\r\n    )\r\n    .required('At least 1 Location is Required')\r\n    .min(1),\r\n});\r\n\r\nexport const W2DVMsModal: FC<IW2DVMsModal> = ({\r\n  open,\r\n  onClose,\r\n  fetchW2DVMs,\r\n  currentDVMId,\r\n  isEdit,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [DVMPaymentReserves, setDVMPaymentReserves] = useState<IDVMPaymentReserves>();\r\n\r\n  const fetchDVMW2PaymentReserves = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getDVMWithW2Reserves(currentDVMId);\r\n      setDVMPaymentReserves(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVM with W2 Reserves, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areDVMsLoading, setAreDVMsLoading] = useState(true);\r\n  const [DVMOptions, setDVMOptions] = useState<any[]>([]);\r\n  const fetchW2DVMOptions = async () => {\r\n    try {\r\n      setAreDVMsLoading(true);\r\n      const res = await getW2DVMs();\r\n      setDVMOptions(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading W2 DVMs please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreDVMsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (currentDVMId) {\r\n      fetchDVMW2PaymentReserves();\r\n    }\r\n\r\n    fetchW2DVMOptions();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [open, currentDVMId]);\r\n\r\n  const today = startOfToday();\r\n\r\n  return (\r\n    <Formik\r\n      enableReinitialize={true}\r\n      initialValues={{\r\n        name: DVMOptions.find(option => option.description === DVMPaymentReserves?.name) ?? '',\r\n        w2PaymentReserves:\r\n          DVMPaymentReserves?.w2PaymentReserves?.map(reserve => {\r\n            if (reserve?.w2PaymentReserveId) {\r\n              // Old Item\r\n              return {\r\n                w2PaymentReserveId: reserve.w2PaymentReserveId,\r\n                reserve: reserve.reserve * 100,\r\n                effectiveDate: reserve.effectiveDate,\r\n                isDeleted: false,\r\n              };\r\n            } else {\r\n              // New Item\r\n              return {\r\n                reserve: reserve.reserve * 100,\r\n                effectiveDate: reserve.effectiveDate,\r\n                isDeleted: false,\r\n              };\r\n            }\r\n          }) ?? [],\r\n      }}\r\n      validationSchema={Schema}\r\n      onSubmit={async (values, actions) => {\r\n        const data = {\r\n          w2PaymentReserves: values.w2PaymentReserves\r\n            ?.map(reserve => {\r\n              if (reserve?.w2PaymentReserveId) {\r\n                return {\r\n                  w2PaymentReserveId: reserve.w2PaymentReserveId ?? null,\r\n                  reserve: reserve.reserve / 100,\r\n                  effectiveDate: reserve.effectiveDate,\r\n                  isDeleted: reserve?.isDeleted,\r\n                };\r\n              } else {\r\n                return {\r\n                  reserve: reserve.reserve / 100,\r\n                  effectiveDate: reserve.effectiveDate,\r\n                  isDeleted: reserve?.isDeleted,\r\n                };\r\n              }\r\n            })\r\n            ?.filter(reserve => {\r\n              if (!reserve?.w2PaymentReserveId) {\r\n                return !reserve.isDeleted;\r\n              }\r\n              return true;\r\n            }) as any[],\r\n        };\r\n        try {\r\n          await updateDVMWithW2Reserves(values.name.value, data);\r\n          fetchW2DVMs();\r\n          enqueueSnackbar('W2 DVM Saved!', {\r\n            variant: 'success',\r\n          });\r\n          actions.resetForm();\r\n          onClose();\r\n          setDVMPaymentReserves(undefined);\r\n        } catch (error: any) {\r\n          const errorMessage = error?.response?.data?.Detail;\r\n          enqueueSnackbar(errorMessage || `Error saving W2 DVM, please try again.`, {\r\n            variant: 'error',\r\n          });\r\n          console.log(error);\r\n        }\r\n      }}\r\n    >\r\n      {({\r\n        isSubmitting,\r\n        values,\r\n        initialValues,\r\n        setFieldValue,\r\n        handleSubmit,\r\n        dirty,\r\n        isValid,\r\n        handleBlur,\r\n        errors,\r\n        touched,\r\n        resetForm,\r\n      }) => {\r\n        return (\r\n          <Modal\r\n            open={open}\r\n            onClose={() => {\r\n              resetForm();\r\n              onClose();\r\n              setDVMPaymentReserves(undefined);\r\n            }}\r\n            maxWidth=\"md\"\r\n          >\r\n            <Fade in={open}>\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                {isLoading || isSubmitting ? (\r\n                  <Loader type=\"inline\" position=\"centered\" title=\"Loading...\" />\r\n                ) : (\r\n                  <>\r\n                    {currentDVMId ? (\r\n                      <Typography variant={'h5'}>Edit {DVMPaymentReserves?.name}</Typography>\r\n                    ) : (\r\n                      <Autocomplete\r\n                        value={values.name}\r\n                        onChange={(event, newValue: any) => {\r\n                          setFieldValue('name', newValue);\r\n                        }}\r\n                        disabled={areDVMsLoading}\r\n                        selectOnFocus\r\n                        handleHomeEndKeys\r\n                        loading={areDVMsLoading}\r\n                        id=\"w2DVMs\"\r\n                        options={DVMOptions}\r\n                        getOptionLabel={(option: any) => {\r\n                          // Value selected with enter, right from the input\r\n                          if (typeof option === 'string') {\r\n                            return option;\r\n                          }\r\n                          return `${option?.description} (${option?.shorthand})`;\r\n                        }}\r\n                        renderInput={params => (\r\n                          <TextField\r\n                            {...params}\r\n                            key={params.id}\r\n                            size=\"small\"\r\n                            autoComplete=\"on\"\r\n                            label=\"W2 DVMs\"\r\n                            variant=\"standard\"\r\n                            name={'name'}\r\n                            onBlur={handleBlur}\r\n                            error={!!(touched?.name && errors?.name)}\r\n                            helperText={touched?.name && errors?.name}\r\n                          />\r\n                        )}\r\n                      />\r\n                    )}\r\n                    <FieldArray\r\n                      name=\"w2PaymentReserves\"\r\n                      render={arrayHelpers => (\r\n                        <Grid>\r\n                          <Box className={classes.contentContainer}>\r\n                            {values.w2PaymentReserves.map((reserve, index) => {\r\n                              const reservePercentage = `w2PaymentReserves[${index}].reserve`;\r\n                              const effectiveDate = `w2PaymentReserves[${index}].effectiveDate`;\r\n                              const isDeleted = `w2PaymentReserves[${index}].isDeleted`;\r\n\r\n                              const reserveName = `w2PaymentReserves[${index}].reserve`;\r\n                              const effectiveDateName = `w2PaymentReserves[${index}].effectiveDate`;\r\n                              const touchedRate = touched?.w2PaymentReserves?.[index];\r\n                              const errorRate = errors?.w2PaymentReserves?.[\r\n                                index\r\n                              ] as FormikErrors<ICurrentW2PaymentReserve>;\r\n                              const isNew = reserve?.w2PaymentReserveId === undefined;\r\n                              // If it was saved, it is now disabled. The user can delete it if it's in the future.\r\n                              const isDisabled = !!reserve?.w2PaymentReserveId;\r\n                              return (\r\n                                <Grid\r\n                                  key={`${index}`}\r\n                                  container\r\n                                  item\r\n                                  xs={12}\r\n                                  spacing={0}\r\n                                  alignItems={'flex-start'}\r\n                                  columnSpacing={0}\r\n                                  rowSpacing={0}\r\n                                  style={{ display: reserve?.isDeleted ? 'none' : 'flex' }}\r\n                                >\r\n                                  <Grid item xs={12} sm={5}>\r\n                                    <FormControl\r\n                                      fullWidth\r\n                                      variant=\"outlined\"\r\n                                      margin=\"dense\"\r\n                                      size=\"small\"\r\n                                    >\r\n                                      <TextField\r\n                                        fullWidth\r\n                                        required\r\n                                        name={reserveName}\r\n                                        margin=\"dense\"\r\n                                        variant=\"outlined\"\r\n                                        autoComplete=\"nope\"\r\n                                        label=\"Reserve Percentage\"\r\n                                        value={reserve.reserve}\r\n                                        onBlur={handleBlur}\r\n                                        size=\"small\"\r\n                                        error={!!(touchedRate?.reserve && errorRate?.reserve)}\r\n                                        disabled={isDisabled}\r\n                                        helperText={touchedRate?.reserve && errorRate?.reserve}\r\n                                        InputProps={{\r\n                                          inputComponent: NumericFormatCustom as any,\r\n                                        }}\r\n                                        onChange={e => {\r\n                                          const value = e.target.value ?? 0;\r\n                                          setFieldValue(reservePercentage, value);\r\n                                        }}\r\n                                      />\r\n                                    </FormControl>\r\n                                  </Grid>\r\n                                  <Grid item xs={12} sm={5}>\r\n                                    <FormControl\r\n                                      fullWidth\r\n                                      variant=\"outlined\"\r\n                                      margin=\"dense\"\r\n                                      size=\"small\"\r\n                                    >\r\n                                      <DatePicker\r\n                                        label=\"Effective Date\"\r\n                                        inputFormat=\"MM/dd/yyyy\"\r\n                                        minDate={today}\r\n                                        value={reserve.effectiveDate ?? null}\r\n                                        onChange={val => setFieldValue(effectiveDate, val)}\r\n                                        disabled={isDisabled}\r\n                                        renderInput={params => (\r\n                                          <TextField\r\n                                            {...params}\r\n                                            name={effectiveDateName}\r\n                                            margin=\"dense\"\r\n                                            size=\"small\"\r\n                                            variant=\"outlined\"\r\n                                            onBlur={handleBlur}\r\n                                            error={\r\n                                              !!(\r\n                                                touchedRate?.effectiveDate &&\r\n                                                errorRate?.effectiveDate\r\n                                              )\r\n                                            }\r\n                                            helperText={\r\n                                              touchedRate?.effectiveDate && errorRate?.effectiveDate\r\n                                            }\r\n                                            inputProps={{\r\n                                              ...params.inputProps,\r\n                                              readOnly: isDisabled,\r\n                                            }}\r\n                                            disabled={isDisabled}\r\n                                            required\r\n                                          />\r\n                                        )}\r\n                                      />\r\n                                    </FormControl>\r\n                                  </Grid>\r\n                                  <Grid className={classes.removeButton} item xs={12} sm={2}>\r\n                                    <IconButton\r\n                                      aria-label=\"remove payment reserve\"\r\n                                      disabled={isAfter(today, new Date(reserve.effectiveDate))}\r\n                                      onClick={() => {\r\n                                        setFieldValue(isDeleted, true);\r\n                                        if (isNew) {\r\n                                          arrayHelpers.remove(index);\r\n                                        }\r\n                                      }}\r\n                                    >\r\n                                      <Close />\r\n                                    </IconButton>\r\n                                  </Grid>\r\n                                </Grid>\r\n                              );\r\n                            })}\r\n                          </Box>\r\n                          <Box marginTop=\"1rem\">\r\n                            <Button\r\n                              className={classes.button}\r\n                              disabled={!dirty || isSubmitting || !isValid}\r\n                              type=\"submit\"\r\n                              startIcon={<Edit />}\r\n                              variant=\"contained\"\r\n                              color=\"primary\"\r\n                            >\r\n                              Save\r\n                            </Button>\r\n                            <Button\r\n                              className={classes.button}\r\n                              type=\"button\"\r\n                              variant=\"contained\"\r\n                              color=\"inherit\"\r\n                              disabled={isSubmitting}\r\n                              startIcon={<Close />}\r\n                              onClick={() => {\r\n                                //@ts-ignore\r\n                                if (!deepEqual(initialValues, values)) {\r\n                                  const result = window.confirm(\r\n                                    'You have unsaved changes, are you sure you want to exit?'\r\n                                  );\r\n                                  if (result) {\r\n                                    resetForm();\r\n                                    onClose();\r\n                                    setDVMPaymentReserves(undefined);\r\n                                  } else {\r\n                                    return;\r\n                                  }\r\n                                } else {\r\n                                  resetForm();\r\n                                  onClose();\r\n                                  setDVMPaymentReserves(undefined);\r\n                                }\r\n                              }}\r\n                            >\r\n                              Cancel\r\n                            </Button>\r\n                            <Button\r\n                              className={classes.button}\r\n                              startIcon={<Edit />}\r\n                              variant=\"contained\"\r\n                              color=\"primary\"\r\n                              disabled={!isValid && values.w2PaymentReserves.length > 0}\r\n                              onClick={() =>\r\n                                arrayHelpers.push({\r\n                                  reserve: 30,\r\n                                  effectiveDate: '',\r\n                                  isDeleted: false,\r\n                                })\r\n                              }\r\n                            >\r\n                              Add New Rate\r\n                            </Button>\r\n                          </Box>\r\n                        </Grid>\r\n                      )}\r\n                    />\r\n                  </>\r\n                )}\r\n              </Form>\r\n            </Fade>\r\n          </Modal>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  contentContainer: {\r\n    maxHeight: 500,\r\n    overflowY: 'auto',\r\n  },\r\n  removeButton: {\r\n    alignSelf: 'center',\r\n    padding: '0 8px',\r\n  },\r\n}));\r\ninterface CustomProps {\r\n  onChange: (event: { target: { name: string; value: string } }) => void;\r\n  name: string;\r\n}\r\nconst NumericFormatCustom = React.forwardRef<NumericFormatProps, CustomProps>(\r\n  function NumericFormatCustom(props, ref) {\r\n    const { onChange, ...other } = props;\r\n\r\n    return (\r\n      <NumericFormat\r\n        {...other}\r\n        getInputRef={ref}\r\n        onValueChange={values => {\r\n          onChange({\r\n            target: {\r\n              name: props.name,\r\n              value: values.value,\r\n            },\r\n          });\r\n        }}\r\n        valueIsNumericString\r\n        allowNegative={false}\r\n        decimalScale={0}\r\n        suffix=\"%\"\r\n      />\r\n    );\r\n  }\r\n);\r\n","import { grey } from '@mui/material/colors';\r\nimport { createTheme } from '@mui/material/styles';\r\nimport { CSSProperties } from 'react';\r\n\r\n/** @see https://mui.com/customization/breakpoints/ */\r\ndeclare module '@mui/material/styles' {\r\n  interface BreakpointOverrides {\r\n    xs: true; // retains the `xs` breakpoint\r\n    sm: true;\r\n    md: true;\r\n    lg: true;\r\n    xl: true;\r\n    mobile: true; // adds the `mobile` breakpoint\r\n    tablet: true;\r\n  }\r\n  // // https://mui.com/material-ui/customization/typography/#variants\r\n  interface TypographyVariants {\r\n    labels: CSSProperties;\r\n  }\r\n\r\n  // // allow configuration using `createTheme`\r\n  interface TypographyVariantsOptions {\r\n    labels?: CSSProperties;\r\n  }\r\n\r\n  interface Palette {\r\n    warmNeutral: Palette['primary'];\r\n    coolNeutral: Palette['primary'];\r\n  }\r\n  interface PaletteOptions {\r\n    warmNeutral: PaletteOptions['primary'];\r\n    coolNeutral: PaletteOptions['primary'];\r\n  }\r\n}\r\n\r\n// // Update the Typography's variant prop options\r\ndeclare module '@mui/material/Typography' {\r\n  interface TypographyPropsVariantOverrides {\r\n    labels: true;\r\n  }\r\n}\r\n\r\nexport const theme = createTheme({\r\n  palette: {\r\n    primary: {\r\n      main: '#EA1B2D',\r\n      contrastText: '#fff',\r\n    },\r\n    secondary: {\r\n      main: '#39839D',\r\n      contrastText: '#fff',\r\n    },\r\n    warmNeutral: {\r\n      main: '#EEE4DC',\r\n    },\r\n    coolNeutral: {\r\n      main: '#EEF7FA',\r\n    },\r\n    success: {\r\n      main: '#A0AD6A',\r\n      contrastText: '#fff',\r\n    },\r\n    divider: grey[300],\r\n  },\r\n  shape: {\r\n    borderRadius: 0,\r\n  },\r\n  breakpoints: {\r\n    values: {\r\n      xs: 0,\r\n      sm: 600,\r\n      md: 900,\r\n      lg: 1200,\r\n      xl: 1536,\r\n      mobile: 767,\r\n      tablet: 1500,\r\n    },\r\n  },\r\n  typography: {\r\n    fontSize: 14,\r\n    htmlFontSize: 14,\r\n    fontFamily: ['Roboto', '\"Helvetica Neue\"', 'Arial', 'sans-serif'].join(','),\r\n    h1: {\r\n      lineHeight: 1.2,\r\n      fontWeight: 700,\r\n    },\r\n    h2: {\r\n      lineHeight: 1.2,\r\n      fontWeight: 700,\r\n    },\r\n    h3: {\r\n      lineHeight: 1.2,\r\n      fontWeight: 700,\r\n    },\r\n    h4: {\r\n      color: '#EA1B2D',\r\n      lineHeight: 1.6,\r\n      fontWeight: 700,\r\n    },\r\n    h5: {\r\n      color: '#EA1B2D',\r\n      lineHeight: 1.6,\r\n      fontWeight: 700,\r\n    },\r\n    h6: {\r\n      color: '#EA1B2D',\r\n      fontSize: 14,\r\n      lineHeight: 1.6,\r\n      textTransform: 'uppercase',\r\n      fontWeight: 700,\r\n    },\r\n    body1: {\r\n      lineHeight: 1.6,\r\n    },\r\n    body2: {\r\n      lineHeight: 1.6,\r\n    },\r\n    labels: {\r\n      color: '#002855', // primary,\r\n      fontWeight: 'bold',\r\n    },\r\n    subtitle1: {\r\n      lineHeight: 1.6,\r\n      fontWeight: 'bold',\r\n    },\r\n    subtitle2: {\r\n      lineHeight: 1.6,\r\n      fontWeight: 'normal',\r\n    },\r\n    button: {\r\n      fontWeight: 'bold',\r\n      textTransform: 'capitalize',\r\n      lineHeight: 1.2,\r\n      borderRadius: '50%',\r\n    },\r\n    caption: {\r\n      lineHeight: 1.6,\r\n    },\r\n    overline: {\r\n      lineHeight: 1.6,\r\n      textTransform: 'uppercase',\r\n    },\r\n  },\r\n});\r\n\r\n// Define Responsive Typography\r\n// Mobile: Minor Second 1.067 w/ 18 base: https://type-scale.com/?size=18&scale=1.125\r\n// Desktop: Custom (Major Second) - 1.125 w/ 16 base: https://type-scale.com/?size=18&scale=1.2\r\ntheme.typography.h1 = {\r\n  ...theme.typography.h1,\r\n  fontSize: 23.33,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 25.63,\r\n  },\r\n};\r\ntheme.typography.h2 = {\r\n  ...theme.typography.h2,\r\n  fontSize: 21.87,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 22.78,\r\n  },\r\n};\r\ntheme.typography.h3 = {\r\n  ...theme.typography.h3,\r\n  fontSize: 20.49,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 20.25,\r\n  },\r\n};\r\ntheme.typography.h4 = {\r\n  ...theme.typography.h4,\r\n  fontSize: 19.21,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 18,\r\n  },\r\n};\r\ntheme.typography.h5 = {\r\n  ...theme.typography.h5,\r\n  fontSize: 18,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 16,\r\n  },\r\n};\r\ntheme.typography.body1 = {\r\n  ...theme.typography.body1,\r\n  fontSize: 14,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 14,\r\n  },\r\n};\r\ntheme.typography.body2 = {\r\n  ...theme.typography.body2,\r\n  fontSize: 14,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 14,\r\n  },\r\n};\r\ntheme.typography.labels = {\r\n  ...theme.typography.labels,\r\n  fontSize: 16,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 16,\r\n  },\r\n};\r\ntheme.typography.subtitle1 = {\r\n  ...theme.typography.subtitle1,\r\n  fontSize: 18,\r\n\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 20,\r\n  },\r\n};\r\ntheme.typography.subtitle2 = {\r\n  ...theme.typography.subtitle2,\r\n  fontSize: 18,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 20,\r\n  },\r\n};\r\ntheme.typography.button = {\r\n  ...theme.typography.button,\r\n  fontSize: 12,\r\n};\r\ntheme.typography.caption = {\r\n  ...theme.typography.caption,\r\n  fontSize: 12,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 14,\r\n  },\r\n};\r\ntheme.typography.overline = {\r\n  ...theme.typography.overline,\r\n  fontSize: 12,\r\n  [theme.breakpoints.up('mobile')]: {\r\n    fontSize: 14,\r\n  },\r\n};\r\n\r\n// Default Props and Component Overrides\r\ntheme.components = {\r\n  MuiTypography: {\r\n    styleOverrides: {\r\n      gutterBottom: {\r\n        marginBottom: '1rem',\r\n      },\r\n    },\r\n  },\r\n  MuiButton: {\r\n    defaultProps: {\r\n      variant: 'contained',\r\n      color: 'primary', // most common, secondary action\r\n      disableElevation: true,\r\n    },\r\n    styleOverrides: {\r\n      root: {\r\n        padding: theme.spacing(.75, 2),\r\n        borderRadius: '24px',\r\n        fontSize: 12,\r\n      },\r\n    },\r\n  },\r\n  MuiFormControl: {\r\n    defaultProps: {\r\n      size: 'small',\r\n      fullWidth: true,\r\n      margin: 'normal',\r\n    },\r\n  },\r\n  MuiInputBase: {\r\n    defaultProps: {\r\n      margin: 'dense',\r\n    },\r\n    styleOverrides: {\r\n      // @ts-ignore\r\n      input: ({ ownerState }) => ({\r\n        cursor:\r\n          ownerState.readOnly === true || ownerState.disabled === true ? 'not-allowed' : 'unset',\r\n      }),\r\n    },\r\n  },\r\n  MuiOutlinedInput: {\r\n    defaultProps: {\r\n      color: 'primary',\r\n      size: 'small',\r\n      fullWidth: true,\r\n    },\r\n    styleOverrides: {\r\n      root: {\r\n        ':hover .MuiOutlinedInput-notchedOutline': {\r\n          borderColor: theme.palette.primary.main,\r\n        },\r\n      },\r\n      input: {\r\n        lineHeight: 1.6,\r\n      },\r\n    },\r\n  },\r\n  MuiInputLabel: {\r\n    defaultProps: {\r\n      color: 'primary',\r\n      margin: 'dense',\r\n    },\r\n    styleOverrides: {\r\n      shrink: {\r\n        color: theme.palette.primary.main,\r\n      },\r\n    },\r\n  },\r\n  MuiFormLabel: {\r\n    defaultProps: {\r\n      color: 'primary',\r\n    },\r\n    styleOverrides: {\r\n      root: {\r\n        color: theme.palette.primary.main,\r\n      },\r\n    },\r\n  },\r\n  MuiFormControlLabel: {\r\n    defaultProps: {\r\n      color: 'primary',\r\n    },\r\n  },\r\n  MuiTextField: {\r\n    defaultProps: {\r\n      fullWidth: true,\r\n      autoComplete: 'nope',\r\n      size: 'small',\r\n    },\r\n  },\r\n  MuiFormHelperText: {\r\n    defaultProps: {\r\n      margin: 'dense',\r\n    },\r\n  },\r\n  MuiCheckbox: {\r\n    defaultProps: {\r\n      size: 'small',\r\n      color: 'secondary',\r\n    },\r\n  },\r\n  MuiRadio: {\r\n    defaultProps: {\r\n      size: 'small',\r\n      color: 'secondary',\r\n    },\r\n  },\r\n  MuiDivider: {\r\n    defaultProps: {\r\n      variant: 'fullWidth',\r\n    },\r\n    styleOverrides: {\r\n      fullWidth: {\r\n        marginTop: theme.spacing(1),\r\n        marginBottom: theme.spacing(1),\r\n      },\r\n    },\r\n  },\r\n};\r\n","import React, { FC, useEffect, useRef, useState } from 'react';\r\n\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport clsx from 'clsx';\r\nimport {\r\n  Button,\r\n  IconButton,\r\n  InputAdornment,\r\n  TextField,\r\n  Typography,\r\n  useMediaQuery,\r\n  alpha,\r\n} from '@mui/material';\r\nimport { IAvailableShift, IMapLocation } from '../../models';\r\nimport { CheckCircle, Close, Search, KeyboardArrowLeft, EventAvailable } from '@mui/icons-material';\r\nimport { theme } from '../../styles';\r\nimport { createDVMShiftRequest } from '../../fetch/shift-requests';\r\nimport * as Yup from 'yup';\r\nimport { FieldArray, Form, Formik } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { getMapLocations } from '../../fetch/maps';\r\nimport { IDateRange } from '../../models/date';\r\nimport coinIncentiveIcon from '../../images/coin-incentive.png';\r\nimport { formatMoney } from '../../helpers';\r\n\r\ninterface IRequestShifts {\r\n  isRequestShiftsOverlay: boolean;\r\n  setIsRequestShiftsOverlay: React.Dispatch<React.SetStateAction<boolean>>;\r\n  setRequestedShifts: React.Dispatch<React.SetStateAction<IAvailableShift[]>>;\r\n  requestedShifts: IAvailableShift[];\r\n  setInfoWindow: React.Dispatch<React.SetStateAction<number | null | undefined>>;\r\n  setIsOverlayCovering: React.Dispatch<React.SetStateAction<boolean>>;\r\n  overlayContainerHeight: string;\r\n  selectedDateRange: IDateRange;\r\n  setMapLocations: React.Dispatch<React.SetStateAction<IMapLocation[] | null>>;\r\n  // selectedLocationTypes: IDropdownResponse[];\r\n}\r\nexport const RequestShifts: FC<IRequestShifts> = ({\r\n  isRequestShiftsOverlay,\r\n  setIsRequestShiftsOverlay,\r\n  setRequestedShifts,\r\n  requestedShifts,\r\n  setInfoWindow,\r\n  setIsOverlayCovering,\r\n  overlayContainerHeight,\r\n  selectedDateRange,\r\n  setMapLocations,\r\n  // selectedLocationTypes,\r\n}) => {\r\n  const classes = useStyles({ overlayContainerHeight: overlayContainerHeight });\r\n  const isMobile = useMediaQuery(`(max-width: ${theme.breakpoints.values.mobile}px)`);\r\n\r\n  const Schema = Yup.object().shape({\r\n    requestedShifts: Yup.array().of(\r\n      Yup.object().shape({\r\n        amount: Yup.number().required('All amounts are required'),\r\n      })\r\n    ),\r\n  });\r\n\r\n  const [showSuccessScreen, setShowSuccessScreen] = useState(false);\r\n  const [submittedRequests, setSubmittedRequests] = useState<IAvailableShift[]>([]);\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const handleError = (res: any) => {\r\n    if (res && res.Detail) {\r\n      return enqueueSnackbar(`Error, ${res.Detail}`, {\r\n        variant: 'error',\r\n      });\r\n    } else if (\r\n      res &&\r\n      res.Errors &&\r\n      Object.values(res.Errors)[0] &&\r\n      Object.values(Object.values(res.Errors)[0] as any)[0]\r\n    ) {\r\n      return enqueueSnackbar(`Error, ${Object.values(Object.values(res.Errors)[0] as any)[0]}`, {\r\n        variant: 'error',\r\n      });\r\n    }\r\n  };\r\n  const handleSubmit = async (values: IAvailableShift[], actions: any) => {\r\n    try {\r\n      const res = await createDVMShiftRequest({\r\n        shiftRequests: values.map(shift => {\r\n          return {\r\n            locationId: shift.locationId,\r\n            shiftDate: new Date(shift.shiftDate),\r\n            amount: shift.amount,\r\n            configuredShiftId: shift.configuredShiftId ?? undefined,\r\n          };\r\n        }),\r\n      });\r\n\r\n      handleError(res);\r\n      if (!res.Detail) {\r\n        setShowSuccessScreen(true);\r\n        setSubmittedRequests(values);\r\n        setRequestedShifts([]);\r\n        setInfoWindow(null);\r\n        setIsOverlayCovering(false);\r\n        overlay?.current?.scrollTo(0, 0);\r\n      }\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error saving this Shift Request this, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    }\r\n  };\r\n\r\n  const overlay = useRef<HTMLDivElement>(null);\r\n  useEffect(() => {\r\n    if (requestedShifts.length === 0 && !showSuccessScreen) {\r\n      setIsRequestShiftsOverlay(false);\r\n    }\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [requestedShifts]);\r\n\r\n  const updateMap = async () => {\r\n    try {\r\n      const res = await getMapLocations({\r\n        startDate: selectedDateRange.startDate,\r\n        endDate: selectedDateRange.endDate,\r\n        locationTypes: ['UrgentVet'],\r\n      });\r\n      setMapLocations(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading map locations, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div\r\n      ref={overlay}\r\n      className={clsx(classes.overlay, isRequestShiftsOverlay ? classes.requestShiftsCover : null)}\r\n    >\r\n      {showSuccessScreen ? (\r\n        <>\r\n          <div className={classes.successContainer}>\r\n            <div className={classes.shiftContainer}>\r\n              <Typography variant=\"h2\">Your Shift Request Has Been Received!</Typography>\r\n            </div>\r\n            <p>\r\n              Your shift request was submitted successfully. We will reach out to you with updates\r\n              as soon as they are available.\r\n            </p>\r\n            <div className={classes.checkCircleContainer}>\r\n              <CheckCircle classes={{ root: classes.checkCircle }} />\r\n            </div>\r\n            <div>\r\n              {submittedRequests.map(request => {\r\n                return (\r\n                  <div className={classes.submittedRequest}>\r\n                    <Typography variant=\"h3\">\r\n                      {`${request.shiftDateFormatted} (${request.shiftDateDayOfWeek})`}\r\n                    </Typography>\r\n                    <div className={classes.inputLine}>\r\n                      <Typography className={classes.submittedDescription}>\r\n                        <span className={classes.submittedLocation}>\r\n                          {request.locationName} {request.shiftTime}\r\n                        </span>\r\n                        <span className={classes.submittedAmount}>\r\n                          {request?.incentiveRate ? (\r\n                            <span>\r\n                              ${parseInt(request.amount) + request?.incentiveRate} (\r\n                              <img\r\n                                className={classes.coinSubmitted}\r\n                                src={coinIncentiveIcon}\r\n                                alt={'incentive-coin'}\r\n                              />\r\n                              ${request?.incentiveRate}) / day\r\n                            </span>\r\n                          ) : (\r\n                            `$${request.amount} / day`\r\n                          )}\r\n                        </span>\r\n                      </Typography>\r\n                    </div>\r\n                  </div>\r\n                );\r\n              })}\r\n            </div>\r\n          </div>\r\n          {submittedRequests.length > 0 && (\r\n            <Button\r\n              className={classes.findMore}\r\n              onClick={() => {\r\n                setIsRequestShiftsOverlay(false);\r\n                setShowSuccessScreen(false);\r\n                updateMap();\r\n              }}\r\n              startIcon={<Search />}\r\n            >\r\n              {`Find More Shifts`}\r\n            </Button>\r\n          )}\r\n        </>\r\n      ) : (\r\n        <>\r\n          <div className={classes.shiftContainer}>\r\n            <Typography variant=\"h2\">Request Shifts</Typography>\r\n          </div>\r\n          <Formik\r\n            enableReinitialize={true}\r\n            initialValues={{\r\n              requestedShifts: requestedShifts.map(shift => {\r\n                if (!shift.amount) {\r\n                  return { ...shift, amount: '' };\r\n                }\r\n                return shift;\r\n              }),\r\n            }}\r\n            onSubmit={(values, actions) => handleSubmit(values.requestedShifts, actions)}\r\n            validationSchema={Schema}\r\n            validateOnMount\r\n            render={({ values, errors }) => (\r\n              <Form>\r\n                <FieldArray\r\n                  name=\"requestedShifts\"\r\n                  render={arrayHelpers => {\r\n                    return (\r\n                      <>\r\n                        <div className={classes.requestedShiftsContainer}>\r\n                          {values.requestedShifts.map((reqShift, index) => {\r\n                            return (\r\n                              <>\r\n                                <div\r\n                                  className={classes.bid}\r\n                                  key={`${reqShift.shiftDate}-${reqShift.locationId}`}\r\n                                >\r\n                                  <Typography variant=\"h3\">{`${reqShift.shiftDateFormatted} (${reqShift.shiftDateDayOfWeek})`}</Typography>\r\n                                  <div className={classes.inputLine}>\r\n                                    <Typography className={classes.description}>\r\n                                      {reqShift.locationName} {reqShift.shiftTime}\r\n                                    </Typography>\r\n                                    <div className={classes.input}>\r\n                                      <TextField\r\n                                        name={`${reqShift.locationId} ${reqShift.shiftDate}`}\r\n                                        variant={'standard'}\r\n                                        value={\r\n                                          values.requestedShifts[\r\n                                            requestedShifts.findIndex(\r\n                                              shift =>\r\n                                                shift?.locationId === reqShift?.locationId &&\r\n                                                reqShift?.shiftDate === shift?.shiftDate\r\n                                            )\r\n                                          ]?.amount ?? ''\r\n                                        }\r\n                                        onChange={e => {\r\n                                          const re = /^[0-9\\b]+$/;\r\n                                          // make sure it is number only before we update state\r\n                                          if (e.target.value === '' || re.test(e.target.value)) {\r\n                                            arrayHelpers.form.setFieldValue(\r\n                                              `requestedShifts[${requestedShifts.findIndex(\r\n                                                shift =>\r\n                                                  shift.locationId === reqShift.locationId &&\r\n                                                  reqShift.shiftDate === shift.shiftDate\r\n                                              )}].amount`,\r\n                                              e.target.value\r\n                                            );\r\n                                            const updatedShift = requestedShifts?.find(\r\n                                              shift =>\r\n                                                shift?.locationId === reqShift?.locationId &&\r\n                                                reqShift?.shiftDate === shift?.shiftDate\r\n                                            );\r\n                                            if (updatedShift) {\r\n                                              updatedShift.amount = e.target.value;\r\n                                            }\r\n                                          }\r\n                                        }}\r\n                                        InputProps={{\r\n                                          startAdornment: (\r\n                                            <InputAdornment position=\"start\">$</InputAdornment>\r\n                                          ),\r\n                                          endAdornment: (\r\n                                            <InputAdornment position=\"end\">/day</InputAdornment>\r\n                                          ),\r\n                                        }}\r\n                                        // https://github.com/mui/material-ui/issues/9046\r\n                                        inputProps={{\r\n                                          inputMode: 'numeric',\r\n                                          pattern: '[0-9]*',\r\n                                        }}\r\n                                        error={\r\n                                          arrayHelpers.form.getFieldMeta(\r\n                                            `${reqShift.locationId} ${reqShift.shiftDate}`\r\n                                          ).touched &&\r\n                                          arrayHelpers.form.errors &&\r\n                                          arrayHelpers.form.getFieldMeta(\r\n                                            `${reqShift.locationId} ${reqShift.shiftDate}`\r\n                                          ).error\r\n                                            ? true\r\n                                            : false\r\n                                        }\r\n                                        helperText={\r\n                                          arrayHelpers.form.getFieldMeta(\r\n                                            `${reqShift.locationId} ${reqShift.shiftDate}`\r\n                                          ).touched &&\r\n                                          arrayHelpers.form.errors &&\r\n                                          arrayHelpers.form.getFieldMeta(\r\n                                            `${reqShift.locationId} ${reqShift.shiftDate}`\r\n                                          ).error\r\n                                        }\r\n                                      />\r\n                                    </div>\r\n                                    <div className={classes.remove}>\r\n                                      {!isMobile ? (\r\n                                        <Button\r\n                                          onClick={() => {\r\n                                            arrayHelpers.remove(index);\r\n                                            setRequestedShifts(prev => {\r\n                                              return prev.filter(shift => {\r\n                                                const isCorrectShiftToDelete =\r\n                                                  shift.locationId === reqShift.locationId &&\r\n                                                  shift.shiftDateFormatted ===\r\n                                                    reqShift.shiftDateFormatted;\r\n                                                if (isCorrectShiftToDelete) delete shift.amount;\r\n                                                return !isCorrectShiftToDelete;\r\n                                              });\r\n                                            });\r\n                                            arrayHelpers.form.validateForm();\r\n                                          }}\r\n                                          variant={'text'}\r\n                                          startIcon={<Close />}\r\n                                        >\r\n                                          Remove\r\n                                        </Button>\r\n                                      ) : (\r\n                                        <IconButton\r\n                                          onClick={() => {\r\n                                            arrayHelpers.remove(index);\r\n                                            setRequestedShifts(prev => {\r\n                                              return prev.filter(shift => {\r\n                                                const isCorrectShiftToDelete =\r\n                                                  shift.locationId === reqShift.locationId &&\r\n                                                  shift.shiftDateFormatted ===\r\n                                                    reqShift.shiftDateFormatted;\r\n                                                if (isCorrectShiftToDelete) delete shift.amount;\r\n                                                return !isCorrectShiftToDelete;\r\n                                              });\r\n                                            });\r\n                                            arrayHelpers.form.validateForm();\r\n                                          }}\r\n                                        >\r\n                                          <Close />\r\n                                        </IconButton>\r\n                                      )}\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                                {reqShift?.incentiveRate != null && reqShift.incentiveRate > 0 && (\r\n                                  <div className={classes.incentiveArea}>\r\n                                    <img\r\n                                      className={classes.coin}\r\n                                      src={coinIncentiveIcon}\r\n                                      alt={'incentive-coin'}\r\n                                    />\r\n                                    {` + ${formatMoney(reqShift.incentiveRate, 0)} Incentive`}\r\n                                  </div>\r\n                                )}\r\n                              </>\r\n                            );\r\n                          })}\r\n                        </div>\r\n                        <div className={classes.buttons}>\r\n                          <Button\r\n                            className={classes.close}\r\n                            onClick={() => setIsRequestShiftsOverlay(false)}\r\n                            variant={'outlined'}\r\n                          >\r\n                            <KeyboardArrowLeft />\r\n                            {`Select More`}\r\n                          </Button>\r\n\r\n                          <Button\r\n                            disabled={!arrayHelpers.form.isValid || arrayHelpers.form.isSubmitting}\r\n                            className={classes.submit}\r\n                            startIcon={<EventAvailable />}\r\n                            type={'submit'}\r\n                          >\r\n                            {`Submit Shifts (${requestedShifts.length})`}\r\n                          </Button>\r\n                        </div>\r\n                      </>\r\n                    );\r\n                  }}\r\n                />\r\n              </Form>\r\n            )}\r\n          />\r\n        </>\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { overlayContainerHeight: string }>((theme: Theme) => ({\r\n  overlay: {\r\n    backgroundColor: '#f6f6f6',\r\n    position: 'absolute',\r\n    height: 0,\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n    visibility: 'hidden',\r\n    transition: '0.3s',\r\n    overflow: 'hidden',\r\n  },\r\n  incentiveArea: {\r\n    padding: theme.spacing(2),\r\n    margin: theme.spacing(-2, 1, 2, 1),\r\n    backgroundColor: theme.palette.secondary.main,\r\n    color: theme.palette.secondary.contrastText,\r\n    display: 'flex',\r\n    justifyContent: 'center',\r\n  },\r\n  coin: {\r\n    maxHeight: '28px',\r\n    marginRight: theme.spacing(1),\r\n  },\r\n  coinSubmitted: {\r\n    maxHeight: '20px',\r\n    marginRight: theme.spacing(0.5),\r\n    marginBottom: '-5px',\r\n  },\r\n  requestShiftsCover: {\r\n    visibility: 'visible',\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n    height: ({ overlayContainerHeight }) => overlayContainerHeight,\r\n    backgroundColor: theme.palette.background.default,\r\n  },\r\n  buttons: {\r\n    display: 'flex',\r\n    justifyContent: 'space-between',\r\n    bottom: 0,\r\n  },\r\n  requestShifts: {\r\n    width: '100%',\r\n    borderRadius: 0,\r\n    padding: theme.spacing(1.5),\r\n    position: 'absolute',\r\n    bottom: 0,\r\n  },\r\n  shiftContainer: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    padding: '1rem .5rem .75rem',\r\n  },\r\n  close: {\r\n    alignSelf: 'flex-end',\r\n    position: 'absolute',\r\n\r\n    right: '.75em',\r\n    top: '.75em',\r\n\r\n    '&:hover': {\r\n      backgroundColor: theme.palette.primary.main,\r\n      color: theme.palette.common.white,\r\n    },\r\n\r\n    '& svg': {\r\n      height: '.75em',\r\n      width: '.75em',\r\n    },\r\n  },\r\n  submit: {\r\n    width: 'calc(100% - 16px)',\r\n    borderRadius: 0,\r\n    padding: theme.spacing(1.5),\r\n    position: 'absolute',\r\n    bottom: '0',\r\n    left: '8px',\r\n\r\n    '&.Mui-disabled': {\r\n      backgroundColor: '#a9a9a9',\r\n    },\r\n  },\r\n  bid: {\r\n    padding: theme.spacing(2),\r\n    margin: theme.spacing(1, 1, 2, 1),\r\n    backgroundColor: alpha(theme.palette.common.black, 0.05),\r\n  },\r\n  inputLine: {\r\n    display: 'flex',\r\n    justifyContent: 'space-between',\r\n    alignItems: 'center',\r\n  },\r\n  description: {\r\n    flex: '8 1 auto',\r\n    padding: theme.spacing(1),\r\n  },\r\n  submittedDescription: {\r\n    flex: '8 1 auto',\r\n    padding: theme.spacing(1, 0),\r\n  },\r\n  submittedLocation: {\r\n    fontWeight: 'bold',\r\n  },\r\n  submittedRequest: {\r\n    margin: theme.spacing(1, 0),\r\n  },\r\n  input: {\r\n    flex: '1 1 auto',\r\n    padding: theme.spacing(1),\r\n  },\r\n  remove: {\r\n    flex: '1 4 auto',\r\n    padding: theme.spacing(1),\r\n\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    position: 'relative',\r\n    bottom: '45px',\r\n    left: '15px',\r\n  },\r\n  requestedShiftsContainer: {\r\n    overflow: 'auto',\r\n    height: '68vh',\r\n  },\r\n  successContainer: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    justifyContent: 'space-around',\r\n  },\r\n  checkCircleContainer: {\r\n    display: 'flex',\r\n    alignSelf: 'center',\r\n  },\r\n  checkCircle: {\r\n    fontSize: '200px',\r\n    color: theme.palette.secondary.main,\r\n  },\r\n  submittedAmount: {\r\n    marginLeft: theme.spacing(2),\r\n  },\r\n  findMore: {\r\n    width: '100%',\r\n    borderRadius: 0,\r\n    marginTop: theme.spacing(0.5),\r\n    padding: theme.spacing(1.5),\r\n    position: 'sticky',\r\n    bottom: 0,\r\n  },\r\n}));\r\n","import {\r\n  Alert,\r\n  Box,\r\n  Button,\r\n  FormControl,\r\n  FormControlLabel,\r\n  FormHelperText,\r\n  Grid,\r\n  InputLabel,\r\n  MenuItem,\r\n  Select,\r\n  Switch,\r\n  TextField,\r\n  useMediaQuery,\r\n} from '@mui/material';\r\nimport { FC, useState, useEffect, useContext } from 'react';\r\nimport { UserContext } from '../../context';\r\nimport { Loader, Page } from '../../components';\r\nimport {\r\n  createLocation,\r\n  getLocation,\r\n  updateLocation,\r\n  getLocationHours,\r\n} from '../../fetch/locations';\r\nimport { ILocation, ILocationShift } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport * as Yup from 'yup';\r\nimport { Close, Edit } from '@mui/icons-material';\r\nimport LocationOnOutlinedIcon from '@mui/icons-material/LocationOnOutlined';\r\nimport WorkspacesIcon from '@mui/icons-material/Workspaces';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { Formik, Form } from 'formik';\r\nimport { useHistory, useParams } from 'react-router-dom';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { getLegalEntities, getLocationTypes, getMarkets } from '../../fetch/lookups';\r\nimport { IDropdownResponse } from '../../models/util';\r\nimport { LocationShifts } from '.';\r\nimport { IconHeading } from '../../components/icon-heading';\r\nimport { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker';\r\nimport { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker';\r\nimport { IncentiveRates } from './incentive-rates';\r\nimport { getStates } from '../../fetch/lookups';\r\nimport { ConfiguredShifts } from './configuredShifts';\r\nimport { formatDate } from '../../helpers';\r\n\r\nexport enum LocationType {\r\n  UrgentVet = '1',\r\n  GeneralPractice = '2',\r\n}\r\n\r\nexport const LocationsDetails: FC = () => {\r\n  const { isPracticeManager, isSysAdmin, isRSS } = useContext(UserContext);\r\n\r\n  const [isLoading, setIsLoading] = useState<boolean>(true);\r\n  const [location, setLocation] = useState<ILocation | null>(null);\r\n  const [shifts, setShifts] = useState<ILocationShift[]>([]);\r\n\r\n  const classes = useStyles();\r\n\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const history = useHistory();\r\n  const { locationId }: { locationId: string } = useParams();\r\n\r\n  function isValidDate(date: string) {\r\n    const date1 = new Date(date);\r\n    if (!isNaN(date1.getTime())) {\r\n      return true;\r\n    }\r\n    const date2 = new Date(date.replace(/(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}:\\d{2})/, '$1T$2Z'));\r\n    if (!isNaN(date2.getTime())) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  // visibility & permissions conditions based on roles\r\n  const canViewRoles = isPracticeManager && !isSysAdmin && !isRSS;\r\n  const canEdit =  !isPracticeManager || isSysAdmin || isRSS;\r\n\r\n  const isEdit = locationId !== 'new-location';\r\n  const fetchLocation = async (id: number) => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getLocation(id);\r\n      const hoursRes = await getLocationHours(id);\r\n      setLocation(res);\r\n      setShifts([hoursRes] ?? []);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading locations, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [isMarketsLoading, setIsMarketsLoading] = useState(true);\r\n  const [markets, setMarkets] = useState<IDropdownResponse[]>([]);\r\n  const fetchMarkets = async () => {\r\n    setIsMarketsLoading(true);\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getMarkets();\r\n      setMarkets(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading markets, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsMarketsLoading(false);\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areLegalEntitiesLoading, setIsLegalEntitiesLoading] = useState(true);\r\n  const [legalEntities, setLegalEntities] = useState<IDropdownResponse[]>([]);\r\n  const fetchLegalEntities = async () => {\r\n    setIsLegalEntitiesLoading(true);\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getLegalEntities();\r\n      setLegalEntities(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading legal entities, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLegalEntitiesLoading(false);\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areStatesLoading, setIsStatesLoading] = useState(true);\r\n  const [states, setStates] = useState<IDropdownResponse[]>([]);\r\n  const fetchStates = async () => {\r\n    setIsStatesLoading(true);\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getStates();\r\n      setStates(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading states, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsStatesLoading(false);\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  // LocationTypes\r\n  const [areLocationTypesLoading, setAreLocationTypesLoading] = useState(true);\r\n  const [locationTypes, setLocationTypes] = useState<IDropdownResponse[]>([]);\r\n  const fetchLocationTypes = async () => {\r\n    setAreLocationTypesLoading(true);\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getLocationTypes();\r\n      setLocationTypes(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading location types, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreLocationTypesLoading(false);\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n  useEffect(() => {\r\n    // Values for Dropdowns\r\n    fetchMarkets();\r\n    fetchLegalEntities();\r\n    fetchStates();\r\n    fetchLocationTypes();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (isEdit) {\r\n      fetchLocation(parseInt(locationId));\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [locationId]);\r\n\r\n  const Schema = Yup.object().shape({\r\n    name: Yup.string().required('Required'),\r\n    marketName: Yup.string().required('Required'),\r\n    address: Yup.string().required('Required'),\r\n    city: Yup.string().required('Required'),\r\n    state: Yup.string().required('Required'),\r\n    zip: Yup.string().length(5).required('Required'),\r\n    accountsPayableId: Yup.string(),\r\n    openDate: Yup.string(),\r\n    closeDate: Yup.string(),\r\n    locationShifts: Yup.array(\r\n      Yup.object().shape({\r\n        locationShiftId: Yup.number(),\r\n        effectiveDate: Yup.date().required('Required'),\r\n        monday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        tuesday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        wednesday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        thursday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        friday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        saturday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        sunday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n        holiday: Yup.string()\r\n          .max(15)\r\n          .typeError('must be less than 15 characters')\r\n          .required('Required'),\r\n      })\r\n    ),\r\n  });\r\n\r\n  return (\r\n    <Formik\r\n      enableReinitialize={true}\r\n      validateOnMount={isEdit}\r\n      initialTouched={{\r\n        locationId: isEdit,\r\n        name: isEdit,\r\n        marketName: isEdit,\r\n        marketId: isEdit,\r\n        address: isEdit,\r\n        city: isEdit,\r\n        state: isEdit,\r\n        stateId: isEdit,\r\n        stateName: isEdit,\r\n        zip: isEdit,\r\n        accountsPayableId: isEdit,\r\n        latitude: isEdit,\r\n        longitude: isEdit,\r\n        openDate: isEdit,\r\n        closeDate: isEdit,\r\n        isVisible: isEdit,\r\n        legalEntityId: isEdit,\r\n        legalEntityName: isEdit,\r\n      }}\r\n      initialValues={{\r\n        locationType:\r\n          location?.locationType === 'GeneralPractice'\r\n            ? LocationType.GeneralPractice\r\n            : location?.locationType === 'UrgentVet'\r\n            ? LocationType.UrgentVet\r\n            : '',\r\n        locationId: location?.locationId ?? '',\r\n        name: location?.name ?? '',\r\n        marketName: location?.marketName ?? '',\r\n        marketId: location?.marketId ?? '',\r\n        address: location?.address.street ?? '',\r\n        city: location?.address?.city ?? '',\r\n        state: location?.address?.state ?? '',\r\n        stateId: location?.address?.stateId ?? '',\r\n        stateName: location?.address?.stateName ?? '',\r\n        zip: location?.address?.zip ?? '',\r\n        accountsPayableId: location?.accountsPayableId ?? '',\r\n        latitude: location?.address?.latitude ?? '',\r\n        longitude: location?.address?.longitude ?? '',\r\n        locationShifts: location?.locationShifts ?? [],\r\n        openDate: location?.openDate ?? '',\r\n        closeDate: location?.closeDate ?? '',\r\n        isVisible: location?.isVisible ?? true,\r\n        legalEntityId: location?.legalEntityId ?? '',\r\n        legalEntityName: location?.legalEntityName ?? '',\r\n      }}\r\n      validationSchema={Schema}\r\n      onSubmit={async values => {\r\n        const selectedState = states.find(state => state.value === values.stateId);\r\n        const data = {\r\n          location: {\r\n            ...location,\r\n            locationType: values.locationType,\r\n            locationId: !!parseInt(values.locationId as string) ? values.locationId : 0,\r\n            name: values.name,\r\n            marketName: values.marketName,\r\n            accountsPayableId: values.accountsPayableId,\r\n            openDate: values.openDate === '' ? null : values.openDate,\r\n            closeDate: values.closeDate === '' ? null : values.closeDate,\r\n            isVisible: values.isVisible,\r\n            address: {\r\n              addressId: location?.address?.addressId ?? 0,\r\n              street: values.address,\r\n              city: values.city,\r\n              state: selectedState?.shorthand,\r\n              stateName: selectedState?.description ?? '',\r\n              stateId: selectedState?.value ?? '',\r\n              zip: values.zip,\r\n              latitude: Number(values.latitude) ?? 0,\r\n              longitude: Number(values.longitude) ?? 0,\r\n            },\r\n            marketId: Number(values.marketId),\r\n            locationShifts: values.locationShifts.map(shift =>\r\n              shift.locationShiftId < 0 ? { ...shift, locationShiftId: 0 } : shift\r\n            ),\r\n            legalEntityId: values?.legalEntityId,\r\n            legalEntityName: values?.legalEntityName,\r\n          },\r\n        };\r\n\r\n        if (data?.location?.openDate !== null && !isValidDate(String(data?.location?.openDate))) {\r\n          return enqueueSnackbar(`Please enter a valid date`, {\r\n            variant: 'error',\r\n          });\r\n        }\r\n\r\n        if (data?.location?.closeDate !== null && !isValidDate(String(data?.location?.closeDate))) {\r\n          return enqueueSnackbar(`Please enter a valid date`, {\r\n            variant: 'error',\r\n          });\r\n        }\r\n\r\n        try {\r\n          if (isEdit) {\r\n            await updateLocation(data);\r\n            enqueueSnackbar(`Location updated!`, {\r\n              variant: 'success',\r\n            });\r\n            history.push('/locations');\r\n          } else {\r\n            const locationId = await createLocation(data);\r\n            enqueueSnackbar(`Location created!`, {\r\n              variant: 'success',\r\n            });\r\n            history.push(`/locations/${locationId}`);\r\n          }\r\n        } catch (error: any) {\r\n          const errorMessage = error?.response?.data?.Detail;\r\n\r\n          if (!!isEdit) {\r\n            enqueueSnackbar(\r\n              errorMessage ||\r\n                `Error updating a new Location, please make sure all dates are unique and try again.`,\r\n              {\r\n                variant: 'error',\r\n              }\r\n            );\r\n          } else {\r\n            enqueueSnackbar(\r\n              errorMessage ||\r\n                `Error creating a new Location, please make sure all dates are unique and try again.`,\r\n              {\r\n                variant: 'error',\r\n              }\r\n            );\r\n          }\r\n        }\r\n      }}\r\n    >\r\n      {({\r\n        isSubmitting,\r\n        values,\r\n        initialValues,\r\n        setFieldValue,\r\n        handleSubmit,\r\n        dirty,\r\n        isValid,\r\n        handleBlur,\r\n        errors,\r\n        touched,\r\n        validateForm,\r\n      }) => {\r\n        return (\r\n          <Page\r\n            title={isEdit ? 'Edit Location' : 'Add New Location'}\r\n            additionalHeaderContent={\r\n              <FormControlLabel\r\n                control={\r\n                  <Switch\r\n                    disabled={canViewRoles}\r\n                    checked={values.isVisible}\r\n                    onChange={e => {\r\n                      setFieldValue('isVisible', e.target.checked);\r\n                    }}\r\n                    inputProps={{ 'aria-label': 'controlled' }}\r\n                  />\r\n                }\r\n                label=\"Visible on Map\"\r\n              />\r\n            }\r\n          >\r\n            <Grid container spacing={3}>\r\n              <Grid item xs={12}>\r\n                <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                  {(isSubmitting ||\r\n                    isLoading ||\r\n                    isMarketsLoading ||\r\n                    areLocationTypesLoading ||\r\n                    areLegalEntitiesLoading ||\r\n                    areStatesLoading) && (\r\n                    <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />\r\n                  )}\r\n                  <Grid container spacing={3}>\r\n                    <Grid item xs={12} lg={6}>\r\n                      <IconHeading\r\n                        icon={LocationOnOutlinedIcon}\r\n                        title=\"Location Details\"\r\n                        variant=\"h2\"\r\n                      />\r\n                      <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                        <InputLabel htmlFor=\"locationTypeLabel\">Location Type</InputLabel>\r\n                        <Select\r\n                          fullWidth\r\n                          name=\"locationType\"\r\n                          labelId=\"locationTypeLabel\"\r\n                          id=\"locationType\"\r\n                          disabled={areLocationTypesLoading || isEdit}\r\n                          error={errors && errors.locationType ? true : false}\r\n                          value={values.locationType}\r\n                          onChange={e => {\r\n                            setFieldValue('locationType', e.target.value);\r\n                          }}\r\n                        >\r\n                          {locationTypes?.map((locationType: IDropdownResponse, index) => {\r\n                            return (\r\n                              <MenuItem key={`${index}`} value={locationType.value}>\r\n                                {locationType.description}\r\n                              </MenuItem>\r\n                            );\r\n                          })}\r\n                        </Select>\r\n                        {touched?.locationType && errors?.locationType && (\r\n                          <FormHelperText error>Required</FormHelperText>\r\n                        )}\r\n                      </FormControl>\r\n\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Location Name\"\r\n                        name=\"name\"\r\n                        value={values.name}\r\n                        onBlur={handleBlur}\r\n                        disabled={canViewRoles}\r\n                        size=\"small\"\r\n                        required\r\n                        onChange={e => setFieldValue('name', e.target.value)}\r\n                        error={touched.name && errors && errors.name ? true : false}\r\n                        helperText={touched.name && errors && errors.name}\r\n                      />\r\n\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Address\"\r\n                        name=\"address\"\r\n                        value={values.address}\r\n                        onBlur={handleBlur}\r\n                        disabled={canViewRoles}\r\n                        size=\"small\"\r\n                        required\r\n                        onChange={e => setFieldValue('address', e.target.value)}\r\n                        error={touched.address && errors && errors.address ? true : false}\r\n                        helperText={touched.address && errors && errors.address}\r\n                      />\r\n\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"City\"\r\n                        name=\"city\"\r\n                        value={values.city}\r\n                        onBlur={handleBlur}\r\n                        disabled={canViewRoles}\r\n                        size=\"small\"\r\n                        required\r\n                        onChange={e => setFieldValue('city', e.target.value)}\r\n                        error={touched.city && errors && errors.city ? true : false}\r\n                        helperText={touched.city && errors && errors.city}\r\n                      />\r\n\r\n                      <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                        <InputLabel htmlFor=\"stateLabel\">State</InputLabel>\r\n                        <Select\r\n                          fullWidth\r\n                          name=\"state\"\r\n                          labelId=\"stateLabel\"\r\n                          id=\"state\"\r\n                          disabled={areStatesLoading || canViewRoles}\r\n                          error={touched.stateId && errors && errors.stateId ? true : false}\r\n                          value={values.stateId}\r\n                          onChange={e => {\r\n                            const selectedState = states.find(\r\n                              state => e.target.value === state.value\r\n                            );\r\n                            setFieldValue('stateId', e.target.value);\r\n                            setFieldValue('state', selectedState?.shorthand ?? '');\r\n                            setFieldValue('stateName', selectedState?.description ?? '');\r\n                            validateForm('state');\r\n                          }}\r\n                        >\r\n                          {states?.map((state: IDropdownResponse, index) => {\r\n                            return (\r\n                              <MenuItem key={`${index}`} value={state.value}>\r\n                                {state.description}\r\n                              </MenuItem>\r\n                            );\r\n                          })}\r\n                        </Select>\r\n                        {touched?.state && errors?.state && (\r\n                          <FormHelperText error>Required</FormHelperText>\r\n                        )}\r\n                      </FormControl>\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Zip\"\r\n                        name=\"zip\"\r\n                        value={values.zip}\r\n                        onBlur={handleBlur}\r\n                        disabled={canViewRoles}\r\n                        size=\"small\"\r\n                        required\r\n                        onChange={e => {\r\n                          const re = /^[0-9\\b]+$/;\r\n                          // if value is not blank, then test the regex\r\n                          if (e.target.value === '' || re.test(e.target.value)) {\r\n                            setFieldValue('zip', e.target.value);\r\n                          }\r\n                        }}\r\n                        error={touched.zip && errors && errors.zip ? true : false}\r\n                        helperText={touched.zip && errors && errors.zip}\r\n                      />\r\n                      <TextField\r\n                        fullWidth\r\n                        variant=\"standard\"\r\n                        autoComplete=\"nope\"\r\n                        label=\"Accounting Location ID\"\r\n                        name=\"accountsPayableId\"\r\n                        value={values.accountsPayableId}\r\n                        onBlur={handleBlur}\r\n                        disabled={canViewRoles}\r\n                        size=\"small\"\r\n                        onChange={e => {\r\n                          setFieldValue('accountsPayableId', e.target.value);\r\n                        }}\r\n                        error={\r\n                          touched.accountsPayableId && errors && errors.accountsPayableId\r\n                            ? true\r\n                            : false\r\n                        }\r\n                        helperText={touched.accountsPayableId && errors && errors.accountsPayableId}\r\n                      />\r\n                      <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                        <InputLabel htmlFor=\"legalEntityLabel\">Legal Entity</InputLabel>\r\n                        <Select\r\n                          fullWidth\r\n                          name=\"legalEntity\"\r\n                          labelId=\"legalEntityLabel\"\r\n                          id=\"legalEntity\"\r\n                          disabled={areLegalEntitiesLoading || canViewRoles}\r\n                          error={errors && errors.legalEntityId ? true : false}\r\n                          value={values.legalEntityId}\r\n                          onChange={e => {\r\n                            setFieldValue('legalEntityId', e.target.value);\r\n                            setFieldValue(\r\n                              'legalEntityName',\r\n                              legalEntities.find(\r\n                                legalEntity => legalEntity.value === e.target.value\r\n                              )?.description ?? ''\r\n                            );\r\n                          }}\r\n                        >\r\n                          {legalEntities?.map((legalEntities: IDropdownResponse, index) => {\r\n                            return (\r\n                              <MenuItem key={`${index}`} value={legalEntities.value}>\r\n                                {legalEntities.description}\r\n                              </MenuItem>\r\n                            );\r\n                          })}\r\n                        </Select>\r\n                        {touched?.legalEntityId && errors?.legalEntityId && (\r\n                          <FormHelperText error>Required</FormHelperText>\r\n                        )}\r\n                      </FormControl>\r\n                    </Grid>\r\n                    <Grid item xs={12} lg={6}>\r\n                      <IconHeading\r\n                        icon={WorkspacesIcon}\r\n                        title=\"Location Classifications\"\r\n                        variant=\"h2\"\r\n                      />\r\n                      <FormControl fullWidth required={true} variant=\"standard\" size=\"small\">\r\n                        <InputLabel htmlFor=\"marketLabel\">Market</InputLabel>\r\n                        <Select\r\n                          fullWidth\r\n                          name=\"market\"\r\n                          labelId=\"marketLabel\"\r\n                          id=\"market\"\r\n                          disabled={isMarketsLoading || canViewRoles}\r\n                          error={errors && errors.marketId ? true : false}\r\n                          value={values.marketId}\r\n                          onChange={e => {\r\n                            setFieldValue('marketId', e.target.value as number);\r\n                            setFieldValue(\r\n                              'marketName',\r\n                              markets.find(market => market.value === e.target.value)\r\n                                ?.description ?? ''\r\n                            );\r\n                          }}\r\n                        >\r\n                          {markets?.map((market: IDropdownResponse, index) => {\r\n                            return (\r\n                              <MenuItem key={`${index}`} value={market.value}>\r\n                                {market.description}\r\n                              </MenuItem>\r\n                            );\r\n                          })}\r\n                        </Select>\r\n                        {touched?.marketId && errors?.marketId && (\r\n                          <FormHelperText error>Required</FormHelperText>\r\n                        )}\r\n                      </FormControl>\r\n                      <FormControl className={classes.openDate} fullWidth variant=\"outlined\">\r\n                        {!isMobile ? (\r\n                          <DesktopDatePicker\r\n                            disablePast\r\n                            label={'Open Date'}\r\n                            inputFormat=\"MM/dd/yyyy\"\r\n                            value={values.openDate}\r\n                            disabled={canViewRoles}\r\n                            onChange={(e: any) => {\r\n                              if (e === null) {\r\n                                e = '';\r\n                              }\r\n                              setFieldValue('openDate', e);\r\n                            }}\r\n                            renderInput={(params: any) => {\r\n                              return (\r\n                                <TextField\r\n                                  size=\"small\"\r\n                                  variant=\"standard\"\r\n                                  {...params}\r\n                                  error={\r\n                                    touched.openDate && errors && errors.openDate ? true : false\r\n                                  }\r\n                                  helperText={touched.openDate && errors && errors.openDate}\r\n                                />\r\n                              );\r\n                            }}\r\n                          />\r\n                        ) : (\r\n                          <MobileDatePicker\r\n                            disablePast\r\n                            label={'Open Date'}\r\n                            inputFormat=\"MM/dd/yyyy\"\r\n                            value={values.openDate}\r\n                            disabled={canViewRoles}\r\n                            onChange={(e: any) => {\r\n                              if (e === null) {\r\n                                e = '';\r\n                              }\r\n                              setFieldValue('openDate', e);\r\n                            }}\r\n                            renderInput={(params: any) => (\r\n                              <TextField\r\n                                variant=\"standard\"\r\n                                size=\"small\"\r\n                                {...params}\r\n                                error={touched.openDate && errors && errors.openDate ? true : false}\r\n                                helperText={touched.openDate && errors && errors.openDate}\r\n                              />\r\n                            )}\r\n                          />\r\n                        )}\r\n                      </FormControl>\r\n                      <FormControl className={classes.closeDate} fullWidth variant=\"outlined\">\r\n                        {!isMobile ? (\r\n                          <DesktopDatePicker\r\n                            disablePast\r\n                            label={'Close Date'}\r\n                            inputFormat=\"MM/dd/yyyy\"\r\n                            value={values.closeDate}\r\n                            disabled={canViewRoles}\r\n                            onChange={(e: any) => {\r\n                              if (e === null) {\r\n                                e = '';\r\n                              }\r\n                              setFieldValue('closeDate', e);\r\n                            }}\r\n                            renderInput={(params: any) => (\r\n                              <TextField\r\n                                size=\"small\"\r\n                                variant=\"standard\"\r\n                                {...params}\r\n                                error={\r\n                                  touched.closeDate && errors && errors.closeDate ? true : false\r\n                                }\r\n                                helperText={touched.closeDate && errors && errors.closeDate}\r\n                              />\r\n                            )}\r\n                          />\r\n                        ) : (\r\n                          <MobileDatePicker\r\n                            disablePast\r\n                            label={'Close Date'}\r\n                            inputFormat=\"MM/dd/yyyy\"\r\n                            value={values.closeDate}\r\n                            disabled={canViewRoles}\r\n                            onChange={(e: any) => {\r\n                              if (e === null) {\r\n                                e = '';\r\n                              }\r\n                              setFieldValue('date', e);\r\n                            }}\r\n                            renderInput={(params: any) => (\r\n                              <TextField\r\n                                variant=\"standard\"\r\n                                size=\"small\"\r\n                                {...params}\r\n                                error={\r\n                                  touched.closeDate && errors && errors.closeDate ? true : false\r\n                                }\r\n                                helperText={touched.closeDate && errors && errors.closeDate}\r\n                              />\r\n                            )}\r\n                          />\r\n                        )}\r\n                        {values.closeDate &&\r\n                          formatDate(values.closeDate) !==\r\n                            formatDate(location?.closeDate ?? '') && (\r\n                            <Alert severity=\"warning\">\r\n                              Setting a \"Close Date\" will alter all future shifts and requests.\r\n                            </Alert>\r\n                          )}\r\n                      </FormControl>\r\n\r\n                      {location?.locationType === 'UrgentVet' && (\r\n                        <IncentiveRates\r\n                          isLoading={isLoading}\r\n                          locationId={locationId}\r\n                          canEdit={canEdit}\r\n                        />\r\n                      )}\r\n                    </Grid>\r\n                  </Grid>\r\n                  {location?.locationType === 'UrgentVet' && shifts && (\r\n                    <Box>\r\n                      <LocationShifts\r\n                        key={'locationShifts'}\r\n                        shifts={shifts}\r\n                        isLoading={isLoading}\r\n                        setFieldValue={setFieldValue}\r\n                        errors={errors}\r\n                        validateForm={validateForm}\r\n                        values={values}\r\n                      />\r\n                    </Box>\r\n                  )}\r\n                  {location?.locationType === 'GeneralPractice' && (\r\n                    <ConfiguredShifts isLoading={isLoading} locationId={locationId} />\r\n                  )}\r\n                  <Box marginTop=\"1rem\" marginBottom=\"1rem\">\r\n                    <Button\r\n                      className={classes.button}\r\n                      disabled={!dirty || isSubmitting || !isValid}\r\n                      type=\"submit\"\r\n                      startIcon={<Edit />}\r\n                      variant=\"contained\"\r\n                      color=\"primary\"\r\n                    >\r\n                      Save\r\n                    </Button>\r\n                    <Button\r\n                      className={classes.button}\r\n                      type=\"button\"\r\n                      variant=\"contained\"\r\n                      color=\"inherit\"\r\n                      disabled={isSubmitting}\r\n                      startIcon={<Close />}\r\n                      onClick={() => {\r\n                        //@ts-ignore\r\n                        if (!deepEqual(initialValues, values)) {\r\n                          const result = window.confirm(\r\n                            'You have unsaved changes, are you sure you want to exit?'\r\n                          );\r\n                          if (result) {\r\n                            history.push('/locations');\r\n                          } else {\r\n                            return;\r\n                          }\r\n                        } else {\r\n                          history.push('/locations');\r\n                        }\r\n                      }}\r\n                    >\r\n                      Cancel\r\n                    </Button>\r\n                  </Box>\r\n                </Form>\r\n              </Grid>\r\n            </Grid>\r\n          </Page>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  openDate: {\r\n    marginTop: 0,\r\n  },\r\n  closeDate: {\r\n    marginTop: -8,\r\n  },\r\n}));\r\n","import { FC, useContext, useEffect } from 'react';\r\nimport { Loader } from '../../components';\r\nimport { Box, Button, Typography } from '@mui/material';\r\nimport { IAvailableShift, IMapLocation } from '../../models/maps';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from '@mui/material/styles';\r\nimport clsx from 'clsx';\r\nimport { IDateRange } from '../../models/date';\r\nimport { UserContext } from '../../context';\r\nimport coinIncentiveIcon from '../../images/coin-incentive.png';\r\n\r\ninterface ILoadingShifts {\r\n  isLoadingAvailableShifts: boolean;\r\n}\r\n\r\nconst LoadingShifts: FC<ILoadingShifts> = ({ isLoadingAvailableShifts }) =>\r\n  isLoadingAvailableShifts ? (\r\n    <Loader position={'centered'} />\r\n  ) : (\r\n    <Typography>No Available Shifts</Typography>\r\n  );\r\n\r\ninterface IShiftOverlay {\r\n  isLoading: boolean;\r\n  fetchMapLocations: () => Promise<void>;\r\n  isLoadingAvailableShifts: boolean;\r\n  availableShifts: IAvailableShift[];\r\n  requestedShifts: IAvailableShift[];\r\n  setRequestedShifts: React.Dispatch<React.SetStateAction<IAvailableShift[]>>;\r\n  mapLocations: IMapLocation[] | null;\r\n  selectedDateRange: IDateRange;\r\n  setIsRequestShiftsOverlay: React.Dispatch<React.SetStateAction<boolean>>;\r\n  isOverlayCovering: boolean;\r\n  setIsOverlayCovering: React.Dispatch<React.SetStateAction<boolean>>;\r\n  setSelectedLocationId: React.Dispatch<React.SetStateAction<number | null>>;\r\n  selectedLocationId: number | null;\r\n  overlayContainerHeight: string;\r\n}\r\nexport const ShiftOverlay: FC<IShiftOverlay> = ({\r\n  isLoading,\r\n  isLoadingAvailableShifts,\r\n  availableShifts,\r\n  requestedShifts,\r\n  setRequestedShifts,\r\n  mapLocations,\r\n  isOverlayCovering,\r\n  setIsOverlayCovering,\r\n  setSelectedLocationId,\r\n  selectedLocationId,\r\n  overlayContainerHeight,\r\n}) => {\r\n  const classes = useStyles({ overlayContainerHeight: overlayContainerHeight });\r\n  const { isDVM, isDVMDeactivated } = useContext(UserContext);\r\n\r\n  useEffect(() => {\r\n    if (selectedLocationId === null) setIsOverlayCovering(false);\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedLocationId]);\r\n\r\n  const isShiftSelected = (shift: IAvailableShift) => {\r\n    return (\r\n      requestedShifts\r\n        .filter((reqShifts: IAvailableShift) => reqShifts.locationId === shift.locationId)\r\n        .filter(\r\n          (reqShifts: IAvailableShift) => reqShifts.shiftDateFormatted === shift.shiftDateFormatted\r\n        ).length > 0\r\n    );\r\n  };\r\n\r\n  const canUserBid = mapLocations?.find(\r\n    location => location.locationId === selectedLocationId\r\n  )?.authorizedToWork;\r\n  return !isLoading && mapLocations ? (\r\n    <div className={clsx(classes.overlay, isOverlayCovering ? classes.cover : null)}>\r\n      {/* Shift request overlay */}\r\n      <div className={classes.shiftContainer}>\r\n        <Typography variant=\"h3\">\r\n          {mapLocations?.find(location => location.locationId === selectedLocationId)?.name}\r\n        </Typography>\r\n        {!isLoadingAvailableShifts && availableShifts.length > 0 ? (\r\n          availableShifts.map((shift: IAvailableShift) => {\r\n            const isSelected = isShiftSelected(shift);\r\n            return (\r\n              <div\r\n                key={`${shift.locationId} ${shift.shiftDateFormatted}`}\r\n                className={classes.shift}\r\n              >\r\n                <p\r\n                  className={classes.date}\r\n                >{`${shift.shiftDateFormatted} (${shift.shiftDateDayOfWeek})`}</p>\r\n                <Box className={classes.requestContainer}>\r\n                  {shift?.incentiveRate ? (\r\n                    <img className={classes.coin} src={coinIncentiveIcon} alt={'incentive-coin'} />\r\n                  ) : null}\r\n                  <Button\r\n                    disabled={!isDVM || !canUserBid || isDVMDeactivated}\r\n                    variant={isSelected ? 'contained' : 'outlined'}\r\n                    onClick={() =>\r\n                      isSelected\r\n                        ? setRequestedShifts(prev => {\r\n                            return prev.filter(reqShift => {\r\n                              const isCorrectShiftToDelete =\r\n                                shift.locationId === reqShift.locationId &&\r\n                                shift.shiftDateFormatted === reqShift.shiftDateFormatted;\r\n                              if (isCorrectShiftToDelete) delete shift.amount;\r\n                              return !isCorrectShiftToDelete;\r\n                            });\r\n                          })\r\n                        : setRequestedShifts(prev => {\r\n                            return [...prev, shift];\r\n                          })\r\n                    }\r\n                  >\r\n                    {shift.shiftTime}\r\n                  </Button>\r\n                </Box>\r\n              </div>\r\n            );\r\n          })\r\n        ) : (\r\n          <LoadingShifts isLoadingAvailableShifts={isLoadingAvailableShifts} />\r\n        )}\r\n      </div>\r\n    </div>\r\n  ) : null;\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { overlayContainerHeight: string }>((theme: Theme) => ({\r\n  overlay: {\r\n    backgroundColor: '#f6f6f6',\r\n    position: 'absolute',\r\n    height: 0,\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n    visibility: 'hidden',\r\n    transition: '0.3s',\r\n    overflow: 'hidden',\r\n    overflowY: 'auto',\r\n    borderTop: `5px solid ${theme.palette.secondary.main}`,\r\n  },\r\n  coin: {\r\n    maxHeight: '28px',\r\n    marginRight: theme.spacing(1),\r\n  },\r\n  requestContainer: {\r\n    display: 'flex',\r\n    justifyContent: 'space-between',\r\n    alignItems: 'center',\r\n  },\r\n  cover: {\r\n    visibility: 'visible',\r\n    height: '60%',\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n  },\r\n  requestShiftsCover: {\r\n    visibility: 'visible',\r\n    height: ({ overlayContainerHeight }) => overlayContainerHeight,\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n    backgroundColor: theme.palette.background.default,\r\n  },\r\n  shiftContainer: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    xOverflow: 'scroll',\r\n    padding: '.5rem 1rem',\r\n  },\r\n  requestShifts: {\r\n    width: '100%',\r\n    borderRadius: 0,\r\n    marginTop: theme.spacing(0.5),\r\n    padding: theme.spacing(0.5),\r\n    position: 'sticky',\r\n    bottom: 0,\r\n  },\r\n  close: {\r\n    // May need to update the :last-child if/when this button is removed so it leaves space for the Request Shifts (n) button.\r\n    margin: '.5rem 1rem 3rem',\r\n    alignSelf: 'flex-end',\r\n  },\r\n  date: { padding: '0 .25rem 0 0' },\r\n  shift: { display: 'flex', justifyContent: 'space-between' },\r\n}));\r\n","import { Box, Button, Grid, IconButton, Stack, TextField } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { useSnackbar } from 'notistack';\r\nimport { FC, useContext, useEffect, useState } from 'react';\r\nimport { Map, Page } from '../../components';\r\nimport { getAvailableDVMShifts, getMapLocations } from '../../fetch';\r\nimport { IAvailableShift, IMapLocation } from '../../models/maps';\r\n\r\nimport { EventAvailable, Search } from '@mui/icons-material';\r\nimport { format } from 'date-fns';\r\nimport { useQuery } from 'react-query';\r\nimport { DateRangePicker } from '../../components/input/date-range';\r\nimport { UserContext } from '../../context';\r\nimport { useCurrentHeight } from '../../helpers/resize';\r\nimport { IDateRange } from '../../models/date';\r\nimport { RequestShifts } from './request-shifts';\r\nimport { ShiftOverlay } from './shift-overlay';\r\n\r\nexport const Home: FC = () => {\r\n  const [mapLocations, setMapLocations] = useState<IMapLocation[] | null>(null);\r\n  const [isLoading, setIsLoading] = useState(true);\r\n  const [isMapLoading, setIsMapLoading] = useState(true);\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const [selectedDateRange, setSelectedDateRange] = useState<IDateRange>({\r\n    startDate: null,\r\n    endDate: null,\r\n    key: 'selection',\r\n    inputValue: '',\r\n  });\r\n\r\n  const [zipCode, setZipCode] = useState('');\r\n\r\n  const [infoWindow, setInfoWindow] = useState<number | null>();\r\n  const [selectedLocationId, setSelectedLocationId] = useState<number | null>(null);\r\n  const [isOverlayCovering, setIsOverlayCovering] = useState(false);\r\n  const [availableShifts, setAvailableShifts] = useState<IAvailableShift[]>([]);\r\n  const [isLoadingAvailableShifts, setIsLoadingAvailableShifts] = useState(false);\r\n  const { isDVM, isDVMDeactivated } = useContext(UserContext);\r\n\r\n  const defaultStartDate = new Date();\r\n  defaultStartDate.setDate(new Date().getDate());\r\n\r\n  const defaultEndDate = new Date();\r\n  defaultEndDate.setDate(new Date().getDate() + 180);\r\n\r\n  const maxFutureDate = new Date();\r\n  maxFutureDate.setDate(new Date().getDate() + 180);\r\n\r\n  const currentDay = new Date();\r\n\r\n  const [requestedShifts, setRequestedShifts] = useState<IAvailableShift[]>([]);\r\n  const [isRequestShiftsOverlay, setIsRequestShiftsOverlay] = useState(false);\r\n\r\n  const windowHeight = useCurrentHeight();\r\n  const overlayContainerHeight = windowHeight - (windowHeight - 80) * 0.25 + 'px';\r\n\r\n  const classes = useStyles({ overlayContainerHeight: overlayContainerHeight });\r\n\r\n  const [center, setCenter] = useState<{ lat: number; lng: number }>({ lat: 27.949, lng: -82.75 });\r\n  const [zoom, setZoom] = useState(5);\r\n\r\n  const regexZipCode = /(^\\d{5}$)|(^\\d{5}-\\d{4}$)/;\r\n  const isZip = regexZipCode.test(zipCode);\r\n\r\n  const geocoder = new google.maps.Geocoder();\r\n  const handleZipSearch = async (zip: string) => {\r\n    geocoder.geocode({ address: zip }, (results, status) => {\r\n      if (status === 'OK' && typeof results !== 'undefined') {\r\n        setCenter({\r\n          lat: results?.[0]?.geometry.location.lat() as number,\r\n          lng: results?.[0]?.geometry.location.lng() as number,\r\n        });\r\n        setZoom(11);\r\n      } else {\r\n        enqueueSnackbar(`This zip code doesn't seem to exist, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n      }\r\n    });\r\n  };\r\n\r\n  useEffect(() => {\r\n    navigator.geolocation.getCurrentPosition(\r\n      async position => {\r\n        geocoder.geocode(\r\n          {\r\n            location: { lat: position.coords.latitude, lng: position.coords.longitude },\r\n          },\r\n          (results, status) => {\r\n            if (status === 'OK' && typeof results !== 'undefined') {\r\n              const zip_code =\r\n                results?.[0]?.address_components?.find((component: any) =>\r\n                  component?.types?.includes('postal_code')\r\n                )?.long_name ?? '';\r\n\r\n              if (zip_code) {\r\n                setZipCode(zip_code ?? '');\r\n                handleZipSearch(zip_code);\r\n              }\r\n            }\r\n          }\r\n        );\r\n      },\r\n      error => {\r\n        console.log('error', error);\r\n      }\r\n    );\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (selectedLocationId === null) setIsOverlayCovering(false);\r\n  }, [selectedLocationId]);\r\n\r\n  const displayShifts = async (locationId: number) => {\r\n    setIsOverlayCovering(true);\r\n    try {\r\n      setIsLoadingAvailableShifts(true);\r\n      // These will always have values at this point\r\n      const res = await getAvailableDVMShifts(\r\n        locationId,\r\n        selectedDateRange.startDate as Date,\r\n        selectedDateRange.endDate as Date\r\n      );\r\n      setAvailableShifts(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVM Statuses, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoadingAvailableShifts(false);\r\n    }\r\n  };\r\n\r\n  const fetchMapLocations = async () => {\r\n    try {\r\n      // const mappedLocationTypes = selectedLocationTypes?.map(s => s.description);\r\n      setIsLoading(true);\r\n      const res = await getMapLocations({\r\n        startDate: selectedDateRange.startDate,\r\n        endDate: selectedDateRange.endDate,\r\n        // locationTypes: mappedLocationTypes || undefined,\r\n        locationTypes: ['UrgentVet'],\r\n      });\r\n\r\n      setMapLocations(Array.isArray(res) ? res : null);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading map locations, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  // set default date range on load\r\n  useEffect(() => {\r\n    if (!selectedDateRange.startDate && !selectedDateRange.endDate) {\r\n      const defaultDateRange =\r\n        format(defaultStartDate, 'M/d/yyyy') + ' - ' + format(defaultEndDate, 'M/d/yyyy');\r\n\r\n      setSelectedDateRange({\r\n        startDate: defaultStartDate,\r\n        endDate: defaultEndDate,\r\n        key: defaultDateRange,\r\n        inputValue: defaultDateRange,\r\n      });\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (\r\n      selectedDateRange.startDate &&\r\n      selectedDateRange.endDate\r\n      // && selectedLocationTypes.length > 0\r\n    ) {\r\n      setInfoWindow(null);\r\n      setIsOverlayCovering(false);\r\n      setIsRequestShiftsOverlay(false);\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedDateRange]);\r\n\r\n  // initial load when all required fields are filled\r\n  const { isLoading: isLoadingMapLocations } = useQuery<any, Error>({\r\n    queryKey: ['mapLocationsData'],\r\n    queryFn: fetchMapLocations,\r\n    enabled: !!selectedDateRange.startDate && !!selectedDateRange.endDate,\r\n    // && selectedLocationTypes.length > 0,\r\n  });\r\n\r\n  const canUserBid =\r\n    Array.isArray(mapLocations) &&\r\n    mapLocations?.find(location => location?.locationId === selectedLocationId)?.authorizedToWork;\r\n\r\n  return (\r\n    <Page customPageHeader={true} title={'Home'}>\r\n      <Box width=\"100%\">\r\n        {!isRequestShiftsOverlay ? (\r\n          <Stack spacing={1}>\r\n            <Grid alignItems={'center'} container spacing={1}>\r\n              <Grid item xs={12} sm={6} md={4} lg={3}>\r\n                <DateRangePicker\r\n                  id=\"filterDateRange\"\r\n                  label=\"Date Range\"\r\n                  value={selectedDateRange}\r\n                  isDisabled={isLoading || isLoadingMapLocations}\r\n                  onChange={value => {\r\n                    setSelectedDateRange(value);\r\n                  }}\r\n                  fullWidth\r\n                  inputSize=\"small\"\r\n                  minDate={currentDay}\r\n                  maxDate={maxFutureDate}\r\n                />\r\n              </Grid>\r\n              <Grid item xs={8} sm={3} md={3} lg={3}>\r\n                <TextField\r\n                  fullWidth\r\n                  variant=\"outlined\"\r\n                  autoComplete=\"nope\"\r\n                  label=\"Zip Code\"\r\n                  name=\"zipCode\"\r\n                  value={zipCode}\r\n                  size=\"small\"\r\n                  InputProps={{\r\n                    classes: { root: classes.base },\r\n                    endAdornment: (\r\n                      <IconButton\r\n                        onClick={() => handleZipSearch(zipCode)}\r\n                        className={classes.iconButton}\r\n                        size=\"small\"\r\n                        component={'span'}\r\n                        disabled={!isZip}\r\n                      >\r\n                        <Search />\r\n                      </IconButton>\r\n                    ),\r\n                  }}\r\n                  onChange={e => {\r\n                    // only numbers\r\n                    const re = /^[0-9\\b]+$/;\r\n                    // const re = /^\\d{5}$)|^\\d{9}$|^\\d{5}-\\d{4}$/;\r\n                    // if value is not blank, then test the regex\r\n                    if (e.target.value === '' || re.test(e.target.value)) {\r\n                      setZipCode(e.target.value);\r\n                    }\r\n                  }}\r\n                />\r\n              </Grid>\r\n              <Grid item xs={4} sm={2} md={2} lg={2}>\r\n                <Box\r\n                  sx={theme => ({\r\n                    marginTop: '.5rem',\r\n                    marginLeft: { xs: theme.spacing(1), md: 0 },\r\n                  })}\r\n                >\r\n                  <Button\r\n                    // disabled={selectedLocationTypes.length === 0}\r\n                    className={classes.button}\r\n                    type=\"submit\"\r\n                    startIcon={<Search />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                    onClick={() => {\r\n                      fetchMapLocations();\r\n                      if (zipCode) {\r\n                        handleZipSearch(zipCode);\r\n                      }\r\n                    }}\r\n                  >\r\n                    Search\r\n                  </Button>\r\n                </Box>\r\n              </Grid>\r\n            </Grid>\r\n          </Stack>\r\n        ) : null}\r\n\r\n        {!isLoading && !isLoadingMapLocations && mapLocations && (\r\n          <div className={classes.overlayContainer}>\r\n            <Map\r\n              locations={mapLocations}\r\n              isMapLoading={isMapLoading}\r\n              isMapLoaded={() => setIsMapLoading(false)}\r\n              infoWindow={infoWindow ?? null}\r\n              setInfoWindow={setInfoWindow}\r\n              showOverlay={locationId => {\r\n                setSelectedLocationId(locationId);\r\n                displayShifts(locationId);\r\n              }}\r\n              handleInfoWindowClose={() => setIsOverlayCovering(false)}\r\n              center={center}\r\n              setCenter={setCenter}\r\n              zoom={zoom}\r\n              setZoom={setZoom}\r\n            />\r\n\r\n            <ShiftOverlay\r\n              isLoading={isLoading}\r\n              fetchMapLocations={fetchMapLocations}\r\n              isLoadingAvailableShifts={isLoadingAvailableShifts}\r\n              availableShifts={availableShifts}\r\n              requestedShifts={requestedShifts}\r\n              setRequestedShifts={setRequestedShifts}\r\n              mapLocations={mapLocations}\r\n              selectedDateRange={selectedDateRange}\r\n              setIsRequestShiftsOverlay={setIsRequestShiftsOverlay}\r\n              isOverlayCovering={isOverlayCovering}\r\n              setIsOverlayCovering={setIsOverlayCovering}\r\n              setSelectedLocationId={setSelectedLocationId}\r\n              selectedLocationId={selectedLocationId}\r\n              overlayContainerHeight={overlayContainerHeight}\r\n            />\r\n            {!isLoadingAvailableShifts &&\r\n              requestedShifts.length > 0 &&\r\n              isDVM &&\r\n              !isDVMDeactivated &&\r\n              !isRequestShiftsOverlay && (\r\n                <Button\r\n                  className={classes.requestShifts}\r\n                  onClick={() => setIsRequestShiftsOverlay(true)}\r\n                  startIcon={<EventAvailable />}\r\n                >\r\n                  {`Request Shifts (${requestedShifts.length})`}\r\n                </Button>\r\n              )}\r\n            {!isLoadingAvailableShifts && isOverlayCovering && isDVMDeactivated && (\r\n              <Button className={classes.nonDvmButton}>\r\n                {`DVM user is deactivated! Can't request shifts.`}\r\n              </Button>\r\n            )}\r\n            {!isLoadingAvailableShifts && isOverlayCovering && !isDVM && (\r\n              <Button className={classes.nonDvmButton}>\r\n                {`Non-DVM user! Can't request shifts.`}\r\n              </Button>\r\n            )}\r\n\r\n            {!isLoadingAvailableShifts && isOverlayCovering && isDVM && !canUserBid && (\r\n              <Button href={'mailto: relief@vetcher.com'} className={classes.nonDvmButton}>\r\n                {`You are not on file as being authorized to work in this state. Please contact relief@vetcher.com for assistance.`}\r\n              </Button>\r\n            )}\r\n\r\n            <RequestShifts\r\n              isRequestShiftsOverlay={isRequestShiftsOverlay}\r\n              setIsRequestShiftsOverlay={setIsRequestShiftsOverlay}\r\n              requestedShifts={[...requestedShifts]\r\n                .sort((a, b) => {\r\n                  return a.locationId - b.locationId;\r\n                })\r\n                .sort((a, b) => {\r\n                  // @ts-ignore\r\n                  //https://stackoverflow.com/questions/10123953/how-to-sort-an-object-array-by-date-property\r\n                  return new Date(a.shiftDate) - new Date(b.shiftDate);\r\n                })}\r\n              setRequestedShifts={setRequestedShifts}\r\n              setInfoWindow={setInfoWindow}\r\n              setIsOverlayCovering={setIsOverlayCovering}\r\n              overlayContainerHeight={overlayContainerHeight}\r\n              setMapLocations={setMapLocations}\r\n              selectedDateRange={selectedDateRange}\r\n            />\r\n          </div>\r\n        )}\r\n      </Box>\r\n    </Page>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { overlayContainerHeight: string }>((theme: Theme) => ({\r\n  overlayContainer: {\r\n    width: '100%',\r\n    height: ({ overlayContainerHeight }) => overlayContainerHeight,\r\n    position: 'relative',\r\n  },\r\n  base: { padding: 0 },\r\n  overlay: {\r\n    backgroundColor: '#f6f6f6',\r\n    position: 'absolute',\r\n    height: 0,\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n    visibility: 'hidden',\r\n    transition: '0.3s',\r\n    overflow: 'hidden',\r\n    overflowY: 'auto',\r\n  },\r\n  cover: {\r\n    visibility: 'visible',\r\n    height: '60%',\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n  },\r\n  requestShiftsCover: {\r\n    visibility: 'visible',\r\n    height: '100%',\r\n    width: '100%',\r\n    bottom: 0,\r\n    left: 0,\r\n    backgroundColor: theme.palette.background.default,\r\n  },\r\n  shiftContainer: {\r\n    display: 'flex',\r\n    flexDirection: 'column',\r\n    xOverflow: 'scroll',\r\n    padding: '.5rem 1rem',\r\n  },\r\n  requestShifts: {\r\n    width: '100%',\r\n    borderRadius: 0,\r\n    padding: theme.spacing(1.5),\r\n    position: 'absolute',\r\n    bottom: 0,\r\n    [theme.breakpoints.up('md')]: {\r\n      bottom: '-' + theme.spacing(5),\r\n    },\r\n  },\r\n  nonDvmButton: {\r\n    width: '100%',\r\n    borderRadius: 0,\r\n    padding: theme.spacing(1.5),\r\n    position: 'absolute',\r\n    bottom: 0,\r\n    cursor: 'not-allowed',\r\n    [theme.breakpoints.up('md')]: {\r\n      bottom: '-' + theme.spacing(5),\r\n    },\r\n  },\r\n  iconButton: {\r\n    paddingRight: 5,\r\n    '@media (min-width: 400px)': {\r\n      paddingRight: 14,\r\n    },\r\n  },\r\n\r\n  date: { padding: '0 .25rem 0 0' },\r\n  shift: { display: 'flex', justifyContent: 'space-between' },\r\n  chip: {\r\n    fontSize: '0.75rem',\r\n    height: '20px',\r\n    marginTop: '2px',\r\n    marginBottom: '2px',\r\n    '& .MuiChip-deleteIcon': {\r\n      fontSize: '1rem',\r\n    },\r\n  },\r\n}));\r\n","import {\r\n  IPendingPaymentUpdateContainer,\r\n  IPendingPayment\r\n} from './../models/payments';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\nconst baseUrl = '/Payments';\r\n\r\nexport const getPendingPayments = async (): Promise<IPendingPayment[]> => {\r\n  try {\r\n    const { data } = await authFetch.get(`${baseUrl}/GetPendingPayments`);\r\n    return data;\r\n  } catch (error) {\r\n    logError(error, 'getPendingPayments failed');\r\n    return Promise.reject(error);\r\n  }\r\n};\r\nexport const updatePendingPaymentStatus = async (pendingPaymentUpdate: IPendingPaymentUpdateContainer): Promise<IPendingPayment> => {\r\n  try {\r\n    const { data } = await authFetch.put(`${baseUrl}/UpdatePendingPayment`, pendingPaymentUpdate);\r\n    return data;\r\n  } catch (error) {\r\n    logError({error, payload: pendingPaymentUpdate}, 'updatePendingPaymentStatus failed');\r\n    return Promise.reject(error);\r\n  }\r\n};","import { Box, Button, Grid, useMediaQuery } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn } from '../../models/util';\r\nimport { getPendingPayments, updatePendingPaymentStatus } from '../../fetch/payments';\r\nimport { IPendingPayment } from '../../models/payments';\r\nimport { useSnackbar } from 'notistack';\r\nimport clsx from 'clsx';\r\nimport { Check, Clear } from '@mui/icons-material';\r\n\r\nexport const PendingPayments: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [pendingPayments, setPendingPayments] = useState<IPendingPayment[]>([]);\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const classes = useStyles();\r\n\r\n  const fetchPendingPayments = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getPendingPayments();\r\n      setPendingPayments(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading pending payments, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchPendingPayments();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const handleApproval = async (original: IPendingPayment) => {\r\n    const data = {\r\n      pendingPayment: {\r\n        shiftId: original.shiftId,\r\n        paymentStatus: original.paymentStatus === 'Approved' ? 'Rejected' : 'Approved',\r\n      },\r\n    };\r\n    try {\r\n      const pendingPaymentRow = await updatePendingPaymentStatus(data);\r\n      setPendingPayments((prev: IPendingPayment[]) => {\r\n        return prev.map(pendingPayment =>\r\n          pendingPayment.shiftId === pendingPaymentRow.shiftId\r\n            ? { ...pendingPayment, ...pendingPaymentRow }\r\n            : pendingPayment\r\n        );\r\n      });\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error updating this Pending Payment, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n    }\r\n  };\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'shiftDate',\r\n      },\r\n      {\r\n        Header: 'Location',\r\n        accessor: 'location',\r\n      },\r\n      {\r\n        Header: 'Scheduled DVM',\r\n        accessor: 'dvmName',\r\n      },\r\n      {\r\n        Header: 'Status',\r\n        accessor: 'paymentStatus',\r\n      },\r\n      {\r\n        Header: 'Override By',\r\n        accessor: 'overrideBy',\r\n      },\r\n      {\r\n        Header: 'Override Date',\r\n        accessor: 'overrideDateTime',\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IPendingPayment } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={clsx(\r\n                  classes.button,\r\n                  original.paymentStatus === 'Approved'\r\n                    ? classes.rejectButtonDesktop\r\n                    : classes.approvalButtonDesktop\r\n                )}\r\n                color=\"primary\"\r\n                onClick={() => handleApproval(original)}\r\n              >\r\n                {original.paymentStatus === 'Approved' ? <Clear /> : <Check />}\r\n                {original.paymentStatus === 'Approved' ? 'Reject' : 'ReApprove'}\r\n              </Button>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  return (\r\n    <Page title={'Pending Payments'}>\r\n      {isLoading && <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />}\r\n\r\n      <Grid container className={classes.pendingPaymentsGrid} spacing={3}>\r\n        <Grid item xs={12}>\r\n          <Table\r\n            columns={columns}\r\n            data={pendingPayments}\r\n            hidePagination\r\n            isLoading={isLoading}\r\n            ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n            stickyHeader={true}\r\n            containerClasses={'pending-payments-container'}\r\n            mobileProps={{\r\n              fields: columns\r\n                .filter((col: { Header: any }) => col.Header)\r\n                .map(col => ({\r\n                  name: col.Header,\r\n                  accessor: col.accessor,\r\n                  Cell: col?.Cell,\r\n                })),\r\n              mobileAccordionLabel: 'dvmName',\r\n              handleApproval: async (original: IPendingPayment) => {\r\n                await handleApproval(original);\r\n              },\r\n            }}\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  pendingPaymentsGrid: {\r\n    '& .pending-payments-container': {\r\n      height: '80vh',\r\n    },\r\n  },\r\n  rejectButtonDesktop: {\r\n    width: '100%',\r\n    maxWidth: '125px',\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n      marginRight: '6px',\r\n    },\r\n  },\r\n  approvalButtonDesktop: {\r\n    width: '100%',\r\n    maxWidth: '125px',\r\n    backgroundColor: theme.palette.success.main,\r\n    '& svg': {\r\n      width: '.75em',\r\n      height: '.75em',\r\n      marginRight: '6px',\r\n    },\r\n  },\r\n}));\r\n","import React, { FC } from 'react';\r\nimport { Page } from '../../components';\r\nimport { Grid, Link } from '@mui/material';\r\n\r\nexport const NotFound: FC = () => {\r\n  return (\r\n    <Page title={'Something went wrong'}>\r\n      <Grid container spacing={3}>\r\n        <Grid item>\r\n          The page you requested was either not found or is inaccessible. Please return to the home\r\n          page and try again. If you continue to experience problems, contact{' '}\r\n          <Link href=\"mailto:relief@vetcher.com\">\r\n            relief@vetcher.com\r\n          </Link>\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n","import { ICreateIncentiveRate, IIncentiveRate, IUpdateIncentiveRate } from '../models/incentiveRates';\r\nimport { IResponse } from '../models/util';\r\nimport { authFetch } from './fetch';\r\nimport { logError } from '../services';\r\n\r\n\r\nconst baseUrl = '/IncentiveRates';\r\nexport const getIncentiveRates = async (locationId: string, filters?: {  page?: number;\r\n  perPage?: number;\r\n  sortBy?: string;\r\n  sortDirection?: string;}\r\n): Promise<IResponse<IIncentiveRate[]>> => {\r\n    try {\r\n      const { data } = await authFetch.get(`${baseUrl}/paged/${locationId}`, filters);\r\n      return data;\r\n    } catch (error) {\r\n      logError(error, 'getIncentiveRates failed');\r\n      return Promise.reject(error);\r\n    }\r\n  };\r\n\r\n  export const createIncentiveRate = async (incentiveRate: ICreateIncentiveRate): Promise<string> => {\r\n    try {\r\n      const { data } = await authFetch.post(`${baseUrl}`, {incentiveRate});\r\n      return data;\r\n    } catch (error: any) {\r\n      logError({error, payload: {incentiveRate}}, 'getDvms failed');\r\n      return Promise.reject(error);\r\n    }\r\n  };\r\n\r\n  export const updateIncentiveRate = async (incentiveRate: IUpdateIncentiveRate): Promise<any> => {\r\n    try {\r\n      const data = await authFetch.put(`${baseUrl}`, {incentiveRate});\r\n      return data;\r\n    } catch (error: any) {\r\n      logError({error, payload: {incentiveRate}}, 'updateIncentiveRate failed');\r\n      return Promise.reject(error);\r\n    }\r\n  };\r\n\r\n  export const deleteIncentiveRate = async (incentiveRateId:number): Promise<any> => {\r\n    try {\r\n      const data = await authFetch.delete(`${baseUrl}/${incentiveRateId}`);\r\n      return data;\r\n    } catch (error) {\r\n      logError(error, 'deleteIncentiveRate failed');\r\n      return Promise.reject(error);\r\n    }\r\n  };","import { FC, useEffect, useState } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport { Box, Button, Grid, InputAdornment, TextField, Typography } from '@mui/material';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Close, Check } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { IIncentiveRate } from '../../models/incentiveRates';\r\nimport { DateRangePicker } from '../../components/input/date-range';\r\nimport { IDateRange } from '../../models/date';\r\nimport { createIncentiveRate, updateIncentiveRate } from '../../fetch/incentive-rates';\r\nimport { formatDate } from '../../helpers';\r\n\r\ninterface ICancelRequestModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  fetchIncentiveRates: () => {};\r\n  incentive?: IIncentiveRate;\r\n  locationId: string;\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  startDate: Yup.string().required('Required'),\r\n  endDate: Yup.string().required('Required'),\r\n  rate: Yup.number().required('Required'),\r\n});\r\n\r\nexport const IncentiveRatesModal: FC<ICancelRequestModal> = ({\r\n  open,\r\n  onClose,\r\n  fetchIncentiveRates,\r\n  incentive,\r\n  locationId,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const [selectedDateRange, setSelectedDateRange] = useState<IDateRange>({\r\n    startDate: incentive?.startDate ?? null,\r\n    endDate: incentive?.endDate ?? null,\r\n    key: 'selection',\r\n    inputValue: '',\r\n  });\r\n\r\n  useEffect(() => {\r\n    setSelectedDateRange({\r\n      startDate: incentive?.startDate ? new Date(incentive.startDate) : null,\r\n      endDate: incentive?.endDate ? new Date(incentive.endDate) : null,\r\n      key: 'selection',\r\n      inputValue:\r\n        incentive?.startDate && incentive?.endDate\r\n          ? `${formatDate(incentive?.startDate)} - ${formatDate(incentive?.endDate)}`\r\n          : '',\r\n    });\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [open]);\r\n\r\n  const currentDay = new Date();\r\n\r\n  const handleClose = () => {\r\n    setSelectedDateRange({\r\n      startDate: incentive?.startDate ?? null,\r\n      endDate: incentive?.endDate ?? null,\r\n      key: 'selection',\r\n      inputValue: '',\r\n    });\r\n\r\n    onClose();\r\n  };\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize\r\n        initialValues={{\r\n          startDate: incentive?.startDate ?? null,\r\n          endDate: incentive?.endDate ?? null,\r\n          rate: incentive?.rate ?? null,\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          const data = {\r\n            locationId: parseInt(locationId),\r\n            incentiveRateId: incentive?.incentiveRateId ?? 0,\r\n            startDate: selectedDateRange.startDate as Date,\r\n            endDate: selectedDateRange.endDate as Date,\r\n            rate: parseInt(values?.rate ?? ''),\r\n          };\r\n\r\n          try {\r\n            if (!data?.incentiveRateId) {\r\n              await createIncentiveRate(data);\r\n            } else {\r\n              await updateIncentiveRate(data);\r\n            }\r\n\r\n            fetchIncentiveRates();\r\n            handleClose();\r\n            actions.resetForm();\r\n            enqueueSnackbar(`Incentive Rates updated!`, {\r\n              variant: 'success',\r\n            });\r\n          } catch (error: any) {\r\n            const errorMessage = error?.response?.data?.Detail;\r\n            enqueueSnackbar(\r\n              errorMessage || `Error updating this Incentive Rate, please try again.`,\r\n              {\r\n                variant: 'error',\r\n              }\r\n            );\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          setValues,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          handleBlur,\r\n          errors,\r\n          touched,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                resetForm();\r\n                handleClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                <div>\r\n                  <Typography variant=\"h5\">Incentive Rates</Typography>\r\n                  <div className={classes.content}>\r\n                    <Grid container spacing={1}>\r\n                      <Grid item xs={6}>\r\n                        <TextField\r\n                          fullWidth\r\n                          required\r\n                          variant={'outlined'}\r\n                          autoComplete=\"nope\"\r\n                          label=\"Amount\"\r\n                          name=\"rate\"\r\n                          value={values.rate}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          InputProps={{\r\n                            startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\r\n                          }}\r\n                          onChange={e => {\r\n                            const re = /^[0-9\\b]+$/;\r\n                            // make sure it is number only before we update state\r\n                            if (e.target.value === '' || re.test(e.target.value)) {\r\n                              setFieldValue('rate', e.target.value);\r\n                            }\r\n                          }}\r\n                          error={touched.rate && errors.rate ? true : false}\r\n                          helperText={touched.rate && errors.rate}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={12} sm={6}>\r\n                        <DateRangePicker\r\n                          id=\"filterDateRange\"\r\n                          label=\"Date Range\"\r\n                          value={selectedDateRange}\r\n                          isDisabled={isSubmitting}\r\n                          onChange={value => {\r\n                            setSelectedDateRange(value);\r\n                            setValues({\r\n                              ...values,\r\n                              startDate: value.startDate,\r\n                              endDate: value.endDate,\r\n                            });\r\n                          }}\r\n                          fullWidth\r\n                          inputSize=\"small\"\r\n                          minDate={currentDay}\r\n                        />\r\n                      </Grid>\r\n                    </Grid>\r\n                  </div>\r\n                </div>\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!isValid || !dirty || isSubmitting}\r\n                    type=\"submit\"\r\n                    startIcon={<Check />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Confirm\r\n                  </Button>\r\n                  <Button\r\n                    className={classes.button}\r\n                    type=\"button\"\r\n                    variant=\"contained\"\r\n                    color=\"inherit\"\r\n                    disabled={isSubmitting}\r\n                    startIcon={<Close />}\r\n                    onClick={() => {\r\n                      //@ts-ignore\r\n                      if (!deepEqual(initialValues, values)) {\r\n                        const result = window.confirm(\r\n                          'You have unsaved changes, are you sure you want to exit?'\r\n                        );\r\n                        if (result) {\r\n                          resetForm();\r\n                          fetchIncentiveRates();\r\n                          handleClose();\r\n                        } else {\r\n                          return;\r\n                        }\r\n                      } else {\r\n                        resetForm();\r\n                        handleClose();\r\n                      }\r\n                    }}\r\n                  >\r\n                    Cancel\r\n                  </Button>\r\n                </Box>\r\n              </Form>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  reasonSelector: {\r\n    cursor: 'pointer',\r\n  },\r\n}));\r\n","import { Box, Button, Grid, IconButton, Popover, Typography } from '@mui/material';\r\nimport { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Table } from '../../components/table/Table';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { IconHeading } from '../../components/icon-heading';\r\nimport { IColumn, sortable } from '../../models/util';\r\nimport { AttachMoney, DeleteForever, EditLocationAlt } from '@mui/icons-material';\r\nimport { IIncentiveRate } from '../../models/incentiveRates';\r\nimport { useSnackbar } from 'notistack';\r\nimport { deleteIncentiveRate, getIncentiveRates } from '../../fetch/incentive-rates';\r\nimport { IncentiveRatesModal } from './incentive-rates-modal';\r\nimport { formatDate, formatMoney } from '../../helpers';\r\n\r\ninterface ILocationShifts {\r\n  isLoading: boolean;\r\n  locationId: string;\r\n  canEdit: boolean;\r\n}\r\nexport const IncentiveRates: FC<ILocationShifts> = ({ isLoading, locationId, canEdit }) => {\r\n  const classes = useStyles();\r\n  const [isLoadingIncentiveRates, setLoadingIncentiveRates] = useState(false);\r\n  const [incentiveRates, setIncentiveRates] = useState<IIncentiveRate[]>([]);\r\n  const [selectedIncentive, setSelectedIncentive] = useState<IIncentiveRate | undefined>(undefined);\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const [selectedSort, setSelectedSort] = useState<string>('startDate');\r\n  const [page, setPage] = useState(0);\r\n  const [perPage, setRowsPerPage] = useState(5);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    startDate?: sortable;\r\n    rate?: sortable;\r\n  }>({\r\n    startDate: 'Asc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const fetchIncentiveRates = async () => {\r\n    setLoadingIncentiveRates(true);\r\n    try {\r\n      if (locationId === 'new-location') return;\r\n\r\n      const res = await getIncentiveRates(locationId, {\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n      });\r\n      setIncentiveRates(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading Incentive Rates, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setLoadingIncentiveRates(false);\r\n    }\r\n  };\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchIncentiveRates();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection]);\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'startDate',\r\n        isServerSorted: selectedSort === 'startDate',\r\n        isServerSortedDesc: sortDirection.startDate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('startDate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IIncentiveRate } };\r\n        }) => {\r\n          return (\r\n            <span>\r\n              {original.endDate !== original.startDate\r\n                ? `${formatDate(original.startDate)} - ${formatDate(original.endDate)}`\r\n                : formatDate(original.startDate)}\r\n            </span>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Incentive',\r\n        accessor: 'rate',\r\n        isServerSorted: selectedSort === 'rate',\r\n        isServerSortedDesc: sortDirection.rate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('rate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IIncentiveRate } };\r\n        }) => {\r\n          return <span>{formatMoney(original.rate, 0)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IIncentiveRate } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'right',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                disabled={!canEdit}\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n              <IconButton\r\n                disabled={!canEdit}\r\n                className={classes.button}\r\n                onClick={async () => await handleDelete(original.incentiveRateId)}\r\n              >\r\n                <DeleteForever />\r\n              </IconButton>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedSort, sortDirection]);\r\n\r\n  const addIncentiveRate = () => {\r\n    setIsModalOpen(true);\r\n  };\r\n  const handleEdit = (incentive: IIncentiveRate) => {\r\n    setSelectedIncentive(incentive);\r\n    setIsModalOpen(true);\r\n  };\r\n  const handleDelete = async (incentiveRateId: number) => {\r\n    const result = window.confirm('Are you sure you want to delete this Incentive Rate?');\r\n    if (result) {\r\n      await deleteIncentiveRate(incentiveRateId);\r\n      fetchIncentiveRates();\r\n    }\r\n  };\r\n\r\n  const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n  const handlePopoverOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n    setAnchorEl(event.currentTarget);\r\n  };\r\n\r\n  const handlePopoverClose = () => {\r\n    setAnchorEl(null);\r\n  };\r\n  const addButtonDisabled = locationId === 'new-location' || !canEdit;\r\n\r\n  const open = Boolean(anchorEl);\r\n  return (\r\n    <Grid key={'incentiveRates'} className={classes.incentiveRates} container spacing={1}>\r\n      <Grid className={classes.buttons} item xs={6}>\r\n        <IconHeading icon={AttachMoney} title=\"Incentive Rates\" variant=\"h2\" />\r\n      </Grid>\r\n      <Grid className={classes.buttons} item xs={6}>\r\n        <Popover\r\n          id=\"disabled-popover-new-location\"\r\n          sx={{\r\n            pointerEvents: 'none',\r\n          }}\r\n          open={open}\r\n          anchorEl={anchorEl}\r\n          anchorOrigin={{\r\n            vertical: 'bottom',\r\n            horizontal: 'left',\r\n          }}\r\n          transformOrigin={{\r\n            vertical: 'top',\r\n            horizontal: 'left',\r\n          }}\r\n          onClose={handlePopoverClose}\r\n          disableRestoreFocus\r\n        >\r\n          <Typography sx={{ p: 1 }}>\r\n            Please save the Location details to add Incentive Rates.\r\n          </Typography>\r\n        </Popover>\r\n        {/* Needed to wrap this in a <span /> to have any effect on a disabled button. Disabled elements do not fire events.  */}\r\n        <span\r\n          onMouseEnter={addButtonDisabled ? handlePopoverOpen : undefined}\r\n          onMouseLeave={addButtonDisabled ? handlePopoverClose : undefined}\r\n        >\r\n          <Button disabled={addButtonDisabled} onClick={() => addIncentiveRate()}>\r\n            Add\r\n          </Button>\r\n        </span>\r\n      </Grid>\r\n      <Grid item xs={12}>\r\n        <Table\r\n          columns={columns}\r\n          data={incentiveRates}\r\n          isLoading={isLoading || isLoadingIncentiveRates}\r\n          serverPage={page}\r\n          serverRecordCount={recordCount}\r\n          serverPerPage={perPage}\r\n          handlePage={setPage}\r\n          handleRowsPerPage={setRowsPerPage}\r\n          rowsPerPageOptions={[5, 10, 25, 50]}\r\n        />\r\n      </Grid>\r\n      <IncentiveRatesModal\r\n        open={isModalOpen}\r\n        onClose={() => {\r\n          setIsModalOpen(false);\r\n          setSelectedIncentive(undefined);\r\n        }}\r\n        fetchIncentiveRates={() => fetchIncentiveRates()}\r\n        incentive={selectedIncentive}\r\n        locationId={locationId}\r\n      />\r\n    </Grid>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>(theme => ({\r\n  incentiveRates: {\r\n    marginTop: theme.spacing(4),\r\n  },\r\n  buttons: {\r\n    [theme.breakpoints.up('sm')]: {\r\n      textAlign: 'right',\r\n    },\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport {\r\n  Box,\r\n  Button,\r\n  Grid,\r\n  InputAdornment,\r\n  TextField,\r\n  Typography,\r\n  useMediaQuery,\r\n  FormControl,\r\n} from '@mui/material';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Close, Check } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { IConfiguredShift } from '../../models/configured-shifts';\r\nimport { IDateRange } from '../../models/date';\r\nimport { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker';\r\nimport { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker';\r\nimport { DateRangePicker } from '../../components/input/date-range';\r\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\r\nimport { createConfiguredShift, updateConfiguredShift } from '../../fetch';\r\nimport { format } from 'date-fns';\r\n\r\ninterface ICancelRequestModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  fetchConfiguredShifts: () => {};\r\n  shift?: IConfiguredShift;\r\n  locationId: string;\r\n}\r\n\r\nconst Schema = Yup.object().shape({\r\n  shiftTimeStart: Yup.date().nullable().required('Required'),\r\n  shiftTimeEnd: Yup.date().nullable().required('Required'),\r\n  breakDuration: Yup.number(),\r\n  rate: Yup.number(),\r\n});\r\n\r\nexport const ConfiguredShiftsModal: FC<ICancelRequestModal> = ({\r\n  open,\r\n  onClose,\r\n  fetchConfiguredShifts,\r\n  shift,\r\n  locationId,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const isEdit = shift ? true : false;\r\n  const currentDay = new Date();\r\n\r\n  const [selectedDateRange, setSelectedDateRange] = useState<IDateRange>({\r\n    startDate: shift?.shiftDateRangeStart ?? null,\r\n    endDate: shift?.shiftDateRangeEnd ?? null,\r\n    key: 'selection',\r\n    inputValue: '',\r\n  });\r\n\r\n  const handleClose = () => {\r\n    onClose();\r\n  };\r\n\r\n  const handleApiTimeString = (apiTimeString: string) => {\r\n    const today = new Date().toISOString().slice(0, 10);\r\n    const dateTimeString = `${today}T${apiTimeString}`;\r\n    return new Date(dateTimeString);\r\n  };\r\n\r\n  const isConfirmDisabled = isEdit ? false : selectedDateRange.startDate === null;\r\n\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize\r\n        initialValues={{\r\n          shiftDate: shift?.shiftDate ?? null,\r\n          shiftDateRangeStart: shift?.shiftDateRangeStart ?? null,\r\n          shiftDateRangeEnd: shift?.shiftDateRangeEnd ?? null,\r\n          shiftTimeStart: shift?.shiftTime ? handleApiTimeString(shift?.shiftTime.start) : '',\r\n          shiftTimeEnd: shift?.shiftTime ? handleApiTimeString(shift?.shiftTime?.end) : '',\r\n          breakDuration: shift?.breakDuration ?? '',\r\n          rate: shift?.rate ?? '',\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          const formattedShiftTimeStart = values?.shiftTimeStart\r\n            ? //@ts-ignore\r\n            format(values?.shiftTimeStart, 'HH:mm:ss')\r\n            : '';\r\n          const formattedShiftTimeEnd = values?.shiftTimeEnd\r\n            ? //@ts-ignore\r\n            format(values?.shiftTimeEnd, 'HH:mm:ss')\r\n            : '';\r\n        \r\n          const data = {\r\n            locationId: parseInt(locationId),\r\n            configuredShiftId: shift?.configuredShiftId ?? 0,\r\n            shiftDateRangeStart: values?.shiftDateRangeStart || null,\r\n            shiftDateRangeEnd: values?.shiftDateRangeEnd || null,\r\n            shiftTime: {\r\n              start: formattedShiftTimeStart,\r\n              end: formattedShiftTimeEnd,\r\n            },\r\n            breakDuration: values?.breakDuration,\r\n            rate: values?.rate || 0, // Default value for rate\r\n          };\r\n        \r\n          const editData = {\r\n            locationId: parseInt(locationId),\r\n            configuredShiftId: shift?.configuredShiftId ?? 0,\r\n            shiftDate: values?.shiftDate,\r\n            shiftTime: {\r\n              start: formattedShiftTimeStart,\r\n              end: formattedShiftTimeEnd,\r\n            },\r\n            breakDuration: values?.breakDuration,\r\n            rate: values?.rate || 0, // Default value for rate\r\n          };\r\n        \r\n          try {\r\n            if (!data?.configuredShiftId) {\r\n              await createConfiguredShift(data);\r\n            } else {\r\n              await updateConfiguredShift(editData);\r\n            }\r\n        \r\n            fetchConfiguredShifts();\r\n            handleClose();\r\n            actions.resetForm();\r\n            enqueueSnackbar(`Shift updated!`, {\r\n              variant: 'success',\r\n            });\r\n          } catch (error: any) {\r\n            const errorMessage = error?.response?.data?.Detail;\r\n            enqueueSnackbar(errorMessage || `Error updating this Shift, please try again.`, {\r\n              variant: 'error',\r\n            });\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          setValues,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          handleBlur,\r\n          errors,\r\n          touched,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                setSelectedDateRange({\r\n                  startDate: null,\r\n                  endDate: null,\r\n                  key: 'selection',\r\n                  inputValue: '',\r\n                });\r\n                resetForm();\r\n                handleClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                <div>\r\n                  <Typography variant=\"h5\">Shift</Typography>\r\n                  <div className={classes.content}>\r\n                    <Grid container spacing={1}>\r\n                      <Grid item xs={12} sm={6}>\r\n                        {!isEdit && (\r\n                          <DateRangePicker\r\n                            id=\"filterDateRange\"\r\n                            label=\"Date Range *\"\r\n                            value={selectedDateRange}\r\n                            isDisabled={isSubmitting}\r\n                            onChange={value => {\r\n                              setSelectedDateRange(value);\r\n                              const startDate = value?.startDate\r\n                                ? new Date(value.startDate).toISOString().slice(0, 10)\r\n                                : null;\r\n                              const endDate = value?.endDate\r\n                                ? new Date(value.endDate).toISOString().slice(0, 10)\r\n                                : null;\r\n                              setFieldValue('shiftDateRangeStart', startDate);\r\n                              setFieldValue('shiftDateRangeEnd', endDate);\r\n                            }}\r\n                            fullWidth\r\n                            inputSize=\"small\"\r\n                            minDate={currentDay}\r\n                          />\r\n                        )}\r\n                        {isEdit && (\r\n                          <FormControl className={classes.shiftDate} fullWidth variant=\"outlined\">\r\n                            {!isMobile ? (\r\n                              <DesktopDatePicker\r\n                                disabled={isEdit}\r\n                                disablePast\r\n                                label={'Date'}\r\n                                inputFormat=\"MM/dd/yyyy\"\r\n                                value={values.shiftDate}\r\n                                onChange={(e: any) => {\r\n                                  if (e === null) {\r\n                                    e = '';\r\n                                  }\r\n                                  setFieldValue('shiftDate', e);\r\n                                }}\r\n                                renderInput={(params: any) => {\r\n                                  return (\r\n                                    <TextField\r\n                                      required\r\n                                      size=\"small\"\r\n                                      variant=\"outlined\"\r\n                                      {...params}\r\n                                      error={\r\n                                        touched.shiftDate && errors && errors.shiftDate\r\n                                          ? true\r\n                                          : false\r\n                                      }\r\n                                      helperText={touched.shiftDate && errors && errors.shiftDate}\r\n                                    />\r\n                                  );\r\n                                }}\r\n                              />\r\n                            ) : (\r\n                              <MobileDatePicker\r\n                                disabled={isEdit}\r\n                                disablePast\r\n                                label={'Open Date'}\r\n                                inputFormat=\"MM/dd/yyyy\"\r\n                                value={values.shiftDate}\r\n                                onChange={(e: any) => {\r\n                                  if (e === null) {\r\n                                    e = '';\r\n                                  }\r\n                                  setFieldValue('shiftDate', e);\r\n                                }}\r\n                                renderInput={(params: any) => (\r\n                                  <TextField\r\n                                    required\r\n                                    variant=\"outlined\"\r\n                                    size=\"small\"\r\n                                    {...params}\r\n                                    error={\r\n                                      touched.shiftDate && errors && errors.shiftDate ? true : false\r\n                                    }\r\n                                    helperText={touched.shiftDate && errors && errors.shiftDate}\r\n                                  />\r\n                                )}\r\n                              />\r\n                            )}\r\n                          </FormControl>\r\n                        )}\r\n                      </Grid>\r\n                      <Grid item xs={12} sm={6}>\r\n                        <TextField\r\n                          fullWidth\r\n                          label=\"Break Duration In Minutes\"\r\n                          variant=\"outlined\"\r\n                          autoComplete=\"nope\"\r\n                          name=\"breakDuration\"\r\n                          value={values?.breakDuration}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onChange={e => setFieldValue('breakDuration', e.target.value)}\r\n                          error={\r\n                            touched.breakDuration && errors && errors.breakDuration ? true : false\r\n                          }\r\n                          helperText={touched.breakDuration && errors && errors.breakDuration}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={12} sm={6}>\r\n                        <TimePicker\r\n                          label=\"Start Time\"\r\n                          value={values.shiftTimeStart}\r\n                          onChange={(time: any) => {\r\n                            setFieldValue('shiftTimeStart', time);\r\n                          }}\r\n                          renderInput={(params: any) => (\r\n                            <TextField\r\n                              required\r\n                              variant=\"outlined\"\r\n                              size=\"small\"\r\n                              {...params}\r\n                              error={\r\n                                touched.shiftTimeStart && errors && errors.shiftTimeStart\r\n                                  ? true\r\n                                  : false\r\n                              }\r\n                              helperText={touched.shiftTimeStart && errors && errors.shiftTimeStart}\r\n                            />\r\n                          )}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={12} sm={6}>\r\n                        <TimePicker\r\n                          label=\"End Time\"\r\n                          value={values.shiftTimeEnd}\r\n                          onChange={(time: any) => {\r\n                            setFieldValue('shiftTimeEnd', time);\r\n                          }}\r\n                          renderInput={(params: any) => (\r\n                            <TextField\r\n                              required\r\n                              variant=\"outlined\"\r\n                              size=\"small\"\r\n                              {...params}\r\n                              error={\r\n                                touched.shiftTimeEnd && errors && errors.shiftTimeEnd ? true : false\r\n                              }\r\n                              helperText={touched.shiftTimeEnd && errors && errors.shiftTimeEnd}\r\n                            />\r\n                          )}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={6}>\r\n                        <TextField\r\n                          fullWidth\r\n                          variant={'outlined'}\r\n                          autoComplete=\"nope\"\r\n                          label=\"Incentive Amount\"\r\n                          name=\"rate\"\r\n                          value={values.rate}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          InputProps={{\r\n                            startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\r\n                          }}\r\n                          onChange={e => {\r\n                            const re = /^[0-9\\b]+$/;\r\n                            if (e.target.value === '' || re.test(e.target.value)) {\r\n                              setFieldValue('rate', e.target.value);\r\n                            }\r\n                          }}\r\n                          error={touched.rate && errors.rate ? true : false}\r\n                          helperText={touched.rate && errors.rate}\r\n                        />\r\n                      </Grid>\r\n                    </Grid>\r\n                  </div>\r\n                </div>\r\n\r\n                <Box marginTop=\"1rem\">\r\n                  <Button\r\n                    className={classes.button}\r\n                    disabled={!isValid || !dirty || isSubmitting || isConfirmDisabled}\r\n                    type=\"submit\"\r\n                    startIcon={<Check />}\r\n                    variant=\"contained\"\r\n                    color=\"primary\"\r\n                  >\r\n                    Confirm\r\n                  </Button>\r\n                  <Button\r\n                    className={classes.button}\r\n                    type=\"button\"\r\n                    variant=\"contained\"\r\n                    color=\"inherit\"\r\n                    disabled={isSubmitting}\r\n                    startIcon={<Close />}\r\n                    onClick={() => {\r\n                      //@ts-ignore\r\n                      if (!deepEqual(initialValues, values)) {\r\n                        const result = window.confirm(\r\n                          'You have unsaved changes, are you sure you want to exit?'\r\n                        );\r\n                        if (result) {\r\n                          resetForm();\r\n                          fetchConfiguredShifts();\r\n                          setSelectedDateRange({\r\n                            startDate: null,\r\n                            endDate: null,\r\n                            key: 'selection',\r\n                            inputValue: '',\r\n                          });\r\n                          handleClose();\r\n                        } else {\r\n                          return;\r\n                        }\r\n                      } else {\r\n                        resetForm();\r\n                        handleClose();\r\n                      }\r\n                    }}\r\n                  >\r\n                    Cancel\r\n                  </Button>\r\n                </Box>\r\n              </Form>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  reasonSelector: {\r\n    cursor: 'pointer',\r\n  },\r\n  shiftDate: {\r\n    marginTop: 0,\r\n  },\r\n}));\r\n","import { Box, Button, Grid, IconButton, Popover, Typography } from '@mui/material';\r\nimport { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Table } from '../../components/table/Table';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { IconHeading } from '../../components/icon-heading';\r\nimport { IColumn, sortable } from '../../models/util';\r\nimport { DeleteForever, EditLocationAlt, CalendarMonth } from '@mui/icons-material';\r\nimport { IConfiguredShift } from '../../models/configured-shifts';\r\nimport { useSnackbar } from 'notistack';\r\nimport { deleteConfiguredShift, getConfiguredShifts } from '../../fetch/configured-shifts';\r\nimport { ConfiguredShiftsModal } from './configured-shifts-modal';\r\nimport { formatDate, formatMoney, convertMilitaryToStandard } from '../../helpers';\r\nimport { isBefore, startOfDay } from 'date-fns';\r\n\r\ninterface ILocationConfiguredShifts {\r\n  isLoading: boolean;\r\n  locationId: string;\r\n}\r\nexport const ConfiguredShifts: FC<ILocationConfiguredShifts> = ({ isLoading, locationId }) => {\r\n  const classes = useStyles();\r\n  const [isLoadingConfiguredShifts, setLoadingConfiguredShifts] = useState(false);\r\n  const [configuredShifts, setConfiguredShifts] = useState<IConfiguredShift[]>([]);\r\n  const [selectedShift, setSelectedShift] = useState<IConfiguredShift | undefined>(undefined);\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const [selectedSort, setSelectedSort] = useState<string>('shiftDate');\r\n  const [page, setPage] = useState(0);\r\n  const [perPage, setRowsPerPage] = useState(5);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    shiftDate?: sortable;\r\n    shiftTimeStart?: sortable;\r\n    shiftTimeEnd?: sortable;\r\n    breakDuration?: sortable;\r\n    rate?: sortable;\r\n  }>({\r\n    shiftDate: 'Desc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const fetchConfiguredShifts = async () => {\r\n    setLoadingConfiguredShifts(true);\r\n    try {\r\n      if (locationId === 'new-location') return;\r\n\r\n      const res = await getConfiguredShifts(locationId, {\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n      });\r\n      setConfiguredShifts(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading Shifts, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setLoadingConfiguredShifts(false);\r\n    }\r\n  };\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchConfiguredShifts();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection]);\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'Date',\r\n        accessor: 'shiftDate',\r\n        isServerSorted: selectedSort === 'shiftDate',\r\n        isServerSortedDesc: sortDirection.shiftDate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('shiftDate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IConfiguredShift } };\r\n        }) => {\r\n          return <span>{formatDate(original?.shiftDate)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Start Time',\r\n        accessor: 'shiftTime.start',\r\n        isServerSorted: selectedSort === 'shiftTimeStart',\r\n        isServerSortedDesc: sortDirection.shiftTimeStart === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('shiftTimeStart'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IConfiguredShift } };\r\n        }) => {\r\n          return <span>{convertMilitaryToStandard(original.shiftTime.start)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'End Time',\r\n        accessor: 'shiftTime.end',\r\n        isServerSorted: selectedSort === 'shiftTimeEnd',\r\n        isServerSortedDesc: sortDirection.shiftTimeEnd === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('shiftTimeEnd'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IConfiguredShift } };\r\n        }) => {\r\n          return <span>{convertMilitaryToStandard(original.shiftTime.end)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Break',\r\n        accessor: 'breakDuration',\r\n        isServerSorted: selectedSort === 'breakDuration',\r\n        isServerSortedDesc: sortDirection.breakDuration === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('breakDuration'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IConfiguredShift } };\r\n        }) => {\r\n          return <span>{original.breakDuration ? `${original.breakDuration} minutes` : ''}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Incentive Amount',\r\n        accessor: 'rate',\r\n        isServerSorted: selectedSort === 'rate',\r\n        isServerSortedDesc: sortDirection.rate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('rate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IConfiguredShift } };\r\n        }) => {\r\n          return <span>{formatMoney(original.rate, 0)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IConfiguredShift } };\r\n        }) => {\r\n          const today = startOfDay(new Date());\r\n          const shiftDateStartOfDay = startOfDay(new Date(original.shiftDate));\r\n          const isDatePast = isBefore(shiftDateStartOfDay, today);\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'right',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                disabled={isDatePast}\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n              <IconButton\r\n                className={classes.button}\r\n                disabled={isDatePast}\r\n                onClick={async () => await handleDelete(original.configuredShiftId)}\r\n              >\r\n                <DeleteForever />\r\n              </IconButton>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedSort, sortDirection]);\r\n\r\n  const addConfiguredShift = () => {\r\n    setIsModalOpen(true);\r\n  };\r\n  const handleEdit = (shift: IConfiguredShift) => {\r\n    setSelectedShift(shift);\r\n    setIsModalOpen(true);\r\n  };\r\n  const handleDelete = async (configuredShiftId: number) => {\r\n    const result = window.confirm('Are you sure you want to delete this Shift?');\r\n    if (result) {\r\n      try {\r\n        await deleteConfiguredShift(configuredShiftId);\r\n        fetchConfiguredShifts();\r\n      } catch (error: any) {\r\n        const errorMessage = error?.response?.data?.Detail;\r\n        enqueueSnackbar(errorMessage || `Error deleting Shift, please try again.`, {\r\n          variant: 'error',\r\n        });\r\n        console.log(error);\r\n      }\r\n    }\r\n  };\r\n\r\n  const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n  const handlePopoverOpen = (event: React.MouseEvent<HTMLElement>) => {\r\n    setAnchorEl(event.currentTarget);\r\n  };\r\n\r\n  const handlePopoverClose = () => {\r\n    setAnchorEl(null);\r\n  };\r\n  const addButtonDisabled = locationId === 'new-location';\r\n\r\n  const open = Boolean(anchorEl);\r\n  return (\r\n    <Grid key={'configuredShifts'} className={classes.configuredShifts} container spacing={1}>\r\n      <Grid className={classes.buttons} item xs={6}>\r\n        <IconHeading icon={CalendarMonth} title=\"Shifts\" variant=\"h2\" />\r\n      </Grid>\r\n      <Grid className={classes.buttons} item xs={6}>\r\n        <Popover\r\n          id=\"disabled-popover-new-location\"\r\n          sx={{\r\n            pointerEvents: 'none',\r\n          }}\r\n          open={open}\r\n          anchorEl={anchorEl}\r\n          anchorOrigin={{\r\n            vertical: 'bottom',\r\n            horizontal: 'left',\r\n          }}\r\n          transformOrigin={{\r\n            vertical: 'top',\r\n            horizontal: 'left',\r\n          }}\r\n          onClose={handlePopoverClose}\r\n          disableRestoreFocus\r\n        >\r\n          <Typography sx={{ p: 1 }}>Please save the Location details to add Shifts.</Typography>\r\n        </Popover>\r\n        {/* Needed to wrap this in a <span /> to have any effect on a disabled button. Disabled elements do not fire events.  */}\r\n        <span\r\n          onMouseEnter={addButtonDisabled ? handlePopoverOpen : undefined}\r\n          onMouseLeave={addButtonDisabled ? handlePopoverClose : undefined}\r\n        >\r\n          <Button disabled={addButtonDisabled} onClick={() => addConfiguredShift()}>\r\n            Add\r\n          </Button>\r\n        </span>\r\n      </Grid>\r\n      <Grid item xs={12}>\r\n        <Table\r\n          columns={columns}\r\n          data={configuredShifts}\r\n          isLoading={isLoading || isLoadingConfiguredShifts}\r\n          serverPage={page}\r\n          serverRecordCount={recordCount}\r\n          serverPerPage={perPage}\r\n          handlePage={setPage}\r\n          handleRowsPerPage={setRowsPerPage}\r\n          rowsPerPageOptions={[5, 10, 25, 50]}\r\n        />\r\n      </Grid>\r\n      <ConfiguredShiftsModal\r\n        open={isModalOpen}\r\n        onClose={() => {\r\n          setIsModalOpen(false);\r\n          setSelectedShift(undefined);\r\n        }}\r\n        fetchConfiguredShifts={() => fetchConfiguredShifts()}\r\n        shift={selectedShift}\r\n        locationId={locationId}\r\n      />\r\n    </Grid>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>(theme => ({\r\n  configuredShifts: {\r\n    marginTop: theme.spacing(4),\r\n  },\r\n  buttons: {\r\n    [theme.breakpoints.up('sm')]: {\r\n      textAlign: 'right',\r\n    },\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { Button, Grid, TextField, Typography, useMediaQuery } from '@mui/material';\r\nimport AccessTimeIcon from '@mui/icons-material/AccessTime';\r\nimport { isDate } from 'date-fns';\r\nimport React, { FC, useEffect, useMemo, useState } from 'react';\r\nimport { Table } from '../../components/table/Table';\r\nimport { ILocationShift } from '../../models';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { DesktopDatePicker, MobileDatePicker } from '@mui/x-date-pickers';\r\nimport { IconHeading } from '../../components/icon-heading';\r\n\r\ninterface ILocationShifts {\r\n  shifts: ILocationShift[];\r\n  isLoading: boolean;\r\n  errors: any;\r\n  setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;\r\n  validateForm: any;\r\n  values: any;\r\n}\r\nexport const LocationShifts: FC<ILocationShifts> = ({\r\n  shifts,\r\n  isLoading,\r\n  errors,\r\n  setFieldValue,\r\n  validateForm,\r\n  values,\r\n}) => {\r\n  const [shiftsCopy, setShiftsCopy] = useState(shifts);\r\n\r\n  const classes = useStyles();\r\n\r\n  useEffect(() => {\r\n    setShiftsCopy(shifts);\r\n  }, [shifts, isLoading]);\r\n\r\n  const addShift = () => {\r\n    setShiftsCopy(prev => {\r\n      const newShifts = [\r\n        ...prev,\r\n        {\r\n          locationShiftId: 0,\r\n          effectiveDate: null,\r\n          monday: '',\r\n          tuesday: '',\r\n          wednesday: '',\r\n          thursday: '',\r\n          friday: '',\r\n          saturday: '',\r\n          sunday: '',\r\n          holiday: '',\r\n        },\r\n      ];\r\n      setFieldValue('locationShifts', newShifts);\r\n\r\n      return newShifts;\r\n    });\r\n  };\r\n\r\n  const updateShiftsData = (shift: ILocationShift, columnId: string, value: string, id: number) => {\r\n    setShiftsCopy((old: ILocationShift[]) => {\r\n      const newShifts = old.map(row => {\r\n        if (row.locationShiftId === id) {\r\n          return {\r\n            ...shift,\r\n            [columnId]: value,\r\n          };\r\n        }\r\n        return row;\r\n      });\r\n      setFieldValue('locationShifts', newShifts);\r\n\r\n      return newShifts;\r\n    });\r\n  };\r\n\r\n  const columns = useMemo(\r\n    () => [\r\n      {\r\n        Header: 'Effective Date',\r\n        accessor: 'effectiveDate',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const isMobile = useMediaQuery('(max-width: 960px)');\r\n          // We need to keep and update the state of the cell normally\r\n          const [value, setValue] = useState<string>(\r\n            shifts?.[props?.row?.index]?.effectiveDate ?? ''\r\n          );\r\n          const onChange = (value: any) => {\r\n            setValue(value);\r\n            updateShiftsData(\r\n              props.row.original,\r\n              props.column.id,\r\n              value,\r\n              props.row.original.locationShiftId\r\n            );\r\n          };\r\n\r\n          return (\r\n            <>\r\n              {!isMobile ? (\r\n                <>\r\n                  <DesktopDatePicker\r\n                    toolbarPlaceholder={'Effective Date'}\r\n                    inputFormat=\"MM/dd/yyyy\"\r\n                    value={value}\r\n                    onChange={onChange}\r\n                    disabled\r\n                    renderInput={(params: any) => (\r\n                      <TextField\r\n                        disabled\r\n                        required={true}\r\n                        size=\"small\"\r\n                        variant=\"standard\"\r\n                        {...params}\r\n                        error={\r\n                          !isDate(new Date(props?.cell?.row?.original?.effectiveDate)) ||\r\n                          !props?.cell?.row?.original?.effectiveDate\r\n                        }\r\n                      />\r\n                    )}\r\n                  />\r\n                  <Typography variant=\"body2\">\r\n                    {!isDate(new Date(props?.cell?.row?.original?.effectiveDate))\r\n                      ? 'Invalid Date'\r\n                      : ''}\r\n                  </Typography>\r\n                </>\r\n              ) : (\r\n                <>\r\n                  <MobileDatePicker\r\n                    toolbarPlaceholder={'Effective Date'}\r\n                    inputFormat=\"MM/dd/yyyy\"\r\n                    value={value}\r\n                    onChange={onChange}\r\n                    disabled\r\n                    renderInput={(params: any) => (\r\n                      <TextField\r\n                        disabled\r\n                        required={true}\r\n                        variant=\"standard\"\r\n                        size=\"small\"\r\n                        {...params}\r\n                        error={\r\n                          !isDate(new Date(props?.cell?.row?.original?.effectiveDate)) ||\r\n                          !props?.cell?.row?.original?.effectiveDate\r\n                        }\r\n                      />\r\n                    )}\r\n                  />\r\n                  <Typography variant=\"body2\">\r\n                    {!isDate(new Date(props?.cell?.row?.original?.effectiveDate))\r\n                      ? 'Invalid Date'\r\n                      : ''}\r\n                  </Typography>\r\n                </>\r\n              )}\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Mon',\r\n        accessor: 'monday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.monday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-monday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.monday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.monday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Tue',\r\n        accessor: 'tuesday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.tuesday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-tuesday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.tuesday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.tuesday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Wed',\r\n        accessor: 'wednesday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.wednesday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-wednesday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.wednesday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.wednesday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Thu',\r\n        accessor: 'thursday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.thursday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-thursday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.thursday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.thursday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Fri',\r\n        accessor: 'friday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.friday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-friday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.friday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.friday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Sat',\r\n        accessor: 'saturday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.saturday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-saturday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.saturday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.saturday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Sun',\r\n        accessor: 'sunday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.sunday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-sunday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.sunday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.sunday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n      {\r\n        Header: 'Holiday',\r\n        accessor: 'holiday',\r\n        sort: false,\r\n        Cell: (props: any) => {\r\n          const [value, setValue] = useState<string>(shifts?.[props?.row?.index]?.holiday ?? '');\r\n          const onChange = (e: any) => {\r\n            setValue(e.target.value);\r\n          };\r\n\r\n          return (\r\n            <>\r\n              <TextField\r\n                disabled\r\n                id={`${props.row.index}-${props.column.id}`}\r\n                key={`${props.row.index}-${props.column.id}`}\r\n                fullWidth\r\n                size=\"small\"\r\n                variant=\"standard\"\r\n                onBlur={() =>\r\n                  updateShiftsData(\r\n                    props.row.original,\r\n                    props.column.id,\r\n                    value,\r\n                    props.row.original.locationShiftId\r\n                  )\r\n                }\r\n                placeholder={props?.column?.Header}\r\n                autoComplete=\"nope\"\r\n                value={value}\r\n                required={true}\r\n                InputProps={{\r\n                  accessKey: `input-${props.row.index}-holiday`,\r\n                }}\r\n                classes={{\r\n                  root: classes.root,\r\n                }}\r\n                onChange={onChange}\r\n                error={errors && !!errors?.locationShifts?.[props?.row?.index]?.holiday}\r\n                helperText={errors && errors?.locationShifts?.[props?.row?.index]?.holiday}\r\n              />\r\n            </>\r\n          );\r\n        },\r\n      },\r\n    ],\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n    [shifts, shiftsCopy.length, isLoading]\r\n  );\r\n\r\n  return (\r\n    <Grid key={'shifts'} className={classes.locationHours} container spacing={1}>\r\n      <IconHeading icon={AccessTimeIcon} title=\"Location Hours\" variant=\"h2\" />\r\n      <Grid className={classes.buttons} item xs={6}>\r\n        {false && (\r\n          <Button disabled onClick={() => addShift()}>\r\n            Add\r\n          </Button>\r\n        )}\r\n      </Grid>\r\n      <Grid item xs={12}>\r\n        <Table\r\n          columns={columns}\r\n          data={shiftsCopy}\r\n          hidePagination\r\n          isLoading={isLoading}\r\n          useTableProps={{\r\n            // @ts-ignore\r\n            updateMyData: updateShiftsData,\r\n          }}\r\n        />\r\n      </Grid>\r\n    </Grid>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>(theme => ({\r\n  locationHours: {\r\n    marginTop: theme.spacing(4),\r\n  },\r\n  buttons: {\r\n    [theme.breakpoints.up('sm')]: {\r\n      textAlign: 'right',\r\n    },\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport {\r\n  FormControl,\r\n  InputLabel,\r\n  Select,\r\n  MenuItem,\r\n  Grid,\r\n  Button,\r\n  Divider,\r\n  TextField,\r\n  Autocomplete,\r\n  Chip,\r\n} from '@mui/material';\r\nimport { FilterList, Close, ArrowDropDown, ArrowDropUp } from '@mui/icons-material';\r\nimport { IDropdownResponse } from '../../models/util';\r\n\r\ninterface IDVMFilters {\r\n  isLoading: boolean;\r\n  applyFilters: (clearFilters?: boolean) => void;\r\n  types: IDropdownResponse[];\r\n  selectedType: string;\r\n  setSelectedType: (val: string) => void;\r\n  statuses: any;\r\n  selectedStatuses: any;\r\n  setSelectedStatuses: (val: any) => void;\r\n  states: IDropdownResponse[];\r\n  selectedState: string;\r\n  setSelectedState: (val: string) => void;\r\n  markets: IDropdownResponse[];\r\n  selectedMarket: string;\r\n  setSelectedMarket: (val: string) => void;\r\n  setSearchValue: (val: string) => void;\r\n  searchValue: string;\r\n  handleSearch: (val: string) => void;\r\n  hasAppliedFilters: boolean;\r\n  setHasAppliedFilters: (val: boolean) => void;\r\n}\r\n\r\nexport const DVMFilters: FC<IDVMFilters> = ({\r\n  isLoading,\r\n  applyFilters,\r\n  types,\r\n  selectedType,\r\n  setSelectedType,\r\n  statuses,\r\n  selectedStatuses,\r\n  setSelectedStatuses,\r\n  states,\r\n  selectedState,\r\n  setSelectedState,\r\n  setSearchValue,\r\n  searchValue,\r\n  hasAppliedFilters,\r\n  setHasAppliedFilters,\r\n  markets,\r\n  selectedMarket,\r\n  setSelectedMarket,\r\n}) => {\r\n  const [isMobileFilterButtonOpen, toggleMobileFilter] = useState<boolean>(false);\r\n  const classes = useStyles({ isMobileFilterButtonOpen });\r\n\r\n  const noFilters =\r\n    !selectedStatuses && !selectedType && !selectedState && !selectedMarket && !searchValue;\r\n  return (\r\n    <>\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.searchWrapper}></Grid>\r\n      <Button\r\n        color=\"secondary\"\r\n        variant=\"contained\"\r\n        className={classes.mobileButton}\r\n        startIcon={<FilterList />}\r\n        endIcon={isMobileFilterButtonOpen ? <ArrowDropUp /> : <ArrowDropDown />}\r\n        onClick={() => {\r\n          toggleMobileFilter(!isMobileFilterButtonOpen);\r\n        }}\r\n      >\r\n        Filters\r\n      </Button>\r\n      {!isMobileFilterButtonOpen && <Divider className={classes.divider} />}\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.wrapper}>\r\n        <Grid item xs={12} sm={6} md={4} lg={2}>\r\n          <TextField\r\n            fullWidth\r\n            variant=\"standard\"\r\n            autoComplete=\"nope\"\r\n            label=\"Name\"\r\n            name=\"search\"\r\n            classes={{ root: classes.searchRoot }}\r\n            value={searchValue}\r\n            size=\"small\"\r\n            onKeyDown={e => {\r\n              if (e.key === 'Enter') {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n              }\r\n            }}\r\n            onChange={e => {\r\n              setSearchValue(e.target.value);\r\n            }}\r\n          />\r\n        </Grid>\r\n        <Grid item xs={12} sm={6} md={4} lg={3}>\r\n          <Autocomplete\r\n            multiple\r\n            value={selectedStatuses}\r\n            className={classes.statuses}\r\n            onChange={(event, newValue: any) => {\r\n              setSelectedStatuses(newValue);\r\n            }}\r\n            disabled={isLoading}\r\n            selectOnFocus\r\n            handleHomeEndKeys\r\n            loading={isLoading}\r\n            id=\"selected-dvm\"\r\n            options={statuses}\r\n            getOptionLabel={(option: IDropdownResponse) => {\r\n              // Value selected with enter, right from the input\r\n              if (typeof option === 'string') {\r\n                return option;\r\n              }\r\n              return `${option.description}`;\r\n            }}\r\n            renderTags={(value, getTagProps) =>\r\n              value.map((option, index) => (\r\n                <Chip\r\n                  variant=\"outlined\"\r\n                  label={typeof option === 'string' ? option : option.description}\r\n                  {...getTagProps({ index })}\r\n                  className={classes.chip}\r\n                />\r\n              ))\r\n            }\r\n            renderInput={params => (\r\n              <TextField\r\n                {...params}\r\n                key={params.id}\r\n                size=\"small\"\r\n                autoComplete=\"on\"\r\n                label=\"DVM Status\"\r\n                variant=\"standard\"\r\n              />\r\n            )}\r\n          />\r\n        </Grid>\r\n\r\n        <Grid item xs={6} sm={3} md={3} lg={1}>\r\n          <FormControl\r\n            classes={{ root: classes.formControlRoot }}\r\n            fullWidth\r\n            variant=\"standard\"\r\n            size=\"small\"\r\n          >\r\n            <InputLabel htmlFor=\"dvmType\" className={classes.ellipsis}>\r\n              DVM Type\r\n            </InputLabel>\r\n            <Select\r\n              disabled={isLoading}\r\n              name=\"DVM Type\"\r\n              labelId=\"dvmType\"\r\n              id=\"dvmType\"\r\n              value={selectedType}\r\n              onChange={({ target: { value } }) => {\r\n                setSelectedType(value);\r\n              }}\r\n              onKeyDown={e => {\r\n                if (e.key === 'Enter' && searchValue.length > 0) {\r\n                  setHasAppliedFilters(true);\r\n                  applyFilters();\r\n                }\r\n              }}\r\n            >\r\n              {types &&\r\n                types.map((type, index) => {\r\n                  return (\r\n                    <MenuItem key={`${index}`} value={type.value}>\r\n                      {type.description}\r\n                    </MenuItem>\r\n                  );\r\n                })}\r\n            </Select>\r\n          </FormControl>\r\n        </Grid>\r\n        <Grid item xs={6} sm={3} md={3} lg={1}>\r\n          <FormControl\r\n            classes={{ root: classes.formControlRoot }}\r\n            fullWidth\r\n            variant=\"standard\"\r\n            size=\"small\"\r\n          >\r\n            <InputLabel htmlFor=\"state\" className={classes.ellipsis}>\r\n              State\r\n            </InputLabel>\r\n            <Select\r\n              disabled={isLoading}\r\n              name=\"state\"\r\n              labelId=\"state\"\r\n              id=\"state\"\r\n              value={selectedState}\r\n              onChange={({ target: { value } }) => setSelectedState(value)}\r\n            >\r\n              {states &&\r\n                states.map((state, index) => {\r\n                  return (\r\n                    <MenuItem key={`${index}`} value={state.value}>\r\n                      {state.description}\r\n                    </MenuItem>\r\n                  );\r\n                })}\r\n            </Select>\r\n          </FormControl>\r\n        </Grid>\r\n        <Grid item xs={12} sm={4} md={3} lg={2}>\r\n          <FormControl\r\n            classes={{ root: classes.formControlRoot }}\r\n            fullWidth\r\n            variant=\"standard\"\r\n            size=\"small\"\r\n          >\r\n            <InputLabel htmlFor=\"marketLabel\" className={classes.ellipsis}>\r\n              Market\r\n            </InputLabel>\r\n            <Select\r\n              disabled={isLoading}\r\n              name=\"market\"\r\n              labelId=\"marketLabel\"\r\n              id=\"market\"\r\n              value={selectedMarket}\r\n              onChange={({ target: { value } }) => setSelectedMarket(value)}\r\n            >\r\n              {markets &&\r\n                markets.map((market, index) => {\r\n                  return (\r\n                    <MenuItem key={`${index}`} value={market.value}>\r\n                      {market.description}\r\n                    </MenuItem>\r\n                  );\r\n                })}\r\n            </Select>\r\n          </FormControl>\r\n        </Grid>\r\n        <Grid item xs={12} sm={6} md={4} lg={3}>\r\n          <Button\r\n            color=\"primary\"\r\n            variant=\"contained\"\r\n            className={classes.button}\r\n            disabled={isLoading}\r\n            startIcon={<FilterList />}\r\n            onClick={() => {\r\n              if (noFilters) {\r\n                setHasAppliedFilters(false);\r\n                applyFilters();\r\n              } else {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n              }\r\n            }}\r\n          >\r\n            Apply Filters\r\n          </Button>\r\n          {hasAppliedFilters && (\r\n            <Button\r\n              className={clsx(classes.button, classes.resetButton)}\r\n              variant=\"contained\"\r\n              color=\"inherit\"\r\n              disabled={isLoading}\r\n              startIcon={<Close />}\r\n              onClick={() => {\r\n                setSearchValue('');\r\n                setHasAppliedFilters(false);\r\n                setSelectedType('');\r\n                setSelectedStatuses([\r\n                  {\r\n                    value: 2,\r\n                    description: 'Active',\r\n                    shorthand: 'Active',\r\n                  },\r\n                  {\r\n                    value: 1,\r\n                    description: 'Pending',\r\n                    shorthand: 'Pending',\r\n                  },\r\n                ]);\r\n                setSelectedState('');\r\n                setSelectedMarket('');\r\n                applyFilters(true);\r\n              }}\r\n            >\r\n              Reset\r\n            </Button>\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { isMobileFilterButtonOpen?: boolean }>((theme: Theme) => ({\r\n  mobileButton: {\r\n    width: '100%',\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  button: {\r\n    marginTop: 4,\r\n    marginBottom: 4,\r\n    height: 40,\r\n    textTransform: 'capitalize',\r\n    width: '100%',\r\n\r\n    [theme.breakpoints.up('sm')]: {\r\n      width: 'auto',\r\n      marginLeft: theme.spacing(2),\r\n    },\r\n  },\r\n  resetButton: {\r\n    '@media (min-width: 600px)': {\r\n      marginLeft: 11,\r\n    },\r\n    [theme.breakpoints.up('sm')]: {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  wrapper: ({ isMobileFilterButtonOpen }) =>\r\n    isMobileFilterButtonOpen\r\n      ? {\r\n          marginTop: 10,\r\n          marginBottom: 10,\r\n          display: 'flex',\r\n        }\r\n      : {\r\n          display: 'none',\r\n          marginBottom: theme.spacing(1),\r\n          [theme.breakpoints.up('sm')]: {\r\n            display: 'flex',\r\n          },\r\n        },\r\n  divider: {\r\n    display: 'block',\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  gridItem: {\r\n    padding: `3px 8px !important`,\r\n    [theme.breakpoints.up('sm')]: {\r\n      padding: `8px !important`,\r\n    },\r\n  },\r\n  searchIcon: {\r\n    cursor: 'pointer',\r\n    color: theme.palette.grey[500],\r\n  },\r\n  ellipsis: {\r\n    fontSize: 14,\r\n    width: 'auto',\r\n    whiteSpace: 'normal',\r\n    overflow: 'visible',\r\n    '@media (min-width: 960px)': {\r\n      textOverflow: 'ellipsis',\r\n      whiteSpace: 'nowrap',\r\n      overflow: 'hidden',\r\n    },\r\n    '@media (min-width: 1400px)': {\r\n      width: 'auto',\r\n      whiteSpace: 'normal',\r\n      overflow: 'visible',\r\n    },\r\n  },\r\n  formControlRoot: {\r\n    marginTop: 0,\r\n  },\r\n  textFieldRoot: {\r\n    marginBottom: 0,\r\n  },\r\n  searchWrapper: {\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'flex',\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n  },\r\n  clearSearchButton: {\r\n    '@media (min-width: 408px)': {\r\n      marginTop: 3,\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  searchButton: {\r\n    minWidth: '8rem',\r\n  },\r\n  searchRoot: {\r\n    marginTop: 0,\r\n  },\r\n  chip: {\r\n    fontSize: '0.75rem',\r\n    height: '20px',\r\n    marginBottom: '4px',\r\n  },\r\n  statuses: {\r\n    marginTop: '-16px',\r\n  },\r\n}));\r\n","import { Add } from '@mui/icons-material';\r\nimport { Box, Button, Fade, Grid, TextField } from '@mui/material';\r\nimport { Formik, Form } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { FC } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport * as Yup from 'yup';\r\nimport { Loader, Modal } from '../../components';\r\nimport { createDvm } from '../../fetch';\r\n\r\ninterface IAddContractorModal {\r\n  isOpen: boolean;\r\n  onClose: () => void;\r\n}\r\nconst Schema = Yup.object().shape({\r\n  firstName: Yup.string().required('Required'),\r\n  lastName: Yup.string().required('Required'),\r\n  email: Yup.string().email().required('Required'),\r\n});\r\n\r\nexport const AddContractorModal: FC<IAddContractorModal> = ({ isOpen, onClose }) => {\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const history = useHistory();\r\n\r\n  return (\r\n    <Formik\r\n      enableReinitialize={true}\r\n      initialValues={{\r\n        firstName: '',\r\n        lastName: '',\r\n        email: '',\r\n      }}\r\n      validationSchema={Schema}\r\n      onSubmit={async (values, actions) => {\r\n        try {\r\n          const dvmId = await createDvm(values);\r\n          enqueueSnackbar(`Contractor Created!`, {\r\n            variant: 'success',\r\n          });\r\n\r\n          history.push(`/dvms/${dvmId}`);\r\n        } catch (error: any) {\r\n          const errorMessage = error?.response?.data?.Detail;\r\n          enqueueSnackbar(\r\n            errorMessage ||\r\n              `Something went wrong, please make sure the user is not already in the system.`,\r\n            {\r\n              variant: 'error',\r\n            }\r\n          );\r\n        }\r\n      }}\r\n    >\r\n      {({\r\n        isSubmitting,\r\n        values,\r\n        initialValues,\r\n        setFieldValue,\r\n        resetForm,\r\n        handleSubmit,\r\n        dirty,\r\n        isValid,\r\n        handleBlur,\r\n        errors,\r\n        touched,\r\n        validateForm,\r\n      }) => {\r\n        return (\r\n          <Modal\r\n            titleContent={'Add Contractor'}\r\n            open={isOpen}\r\n            onClose={() => {\r\n              resetForm();\r\n              onClose();\r\n            }}\r\n            maxWidth=\"md\"\r\n          >\r\n            <Fade in={isOpen}>\r\n              <Grid container>\r\n                <Grid item xs={12}>\r\n                  <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                    {isSubmitting && (\r\n                      <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />\r\n                    )}\r\n                    <Grid container spacing={2} paddingBottom={'24px'}>\r\n                      <Grid item xs={12} md={6}>\r\n                        <TextField\r\n                          fullWidth\r\n                          required\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"First Name\"\r\n                          name=\"firstName\"\r\n                          value={values.firstName}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onChange={e => {\r\n                            setFieldValue('firstName', e.target.value);\r\n                          }}\r\n                          error={touched.firstName && errors.firstName ? true : false}\r\n                          helperText={touched.firstName && errors.firstName}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={12} md={6}>\r\n                        <TextField\r\n                          fullWidth\r\n                          required\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Last Name\"\r\n                          name=\"lastName\"\r\n                          value={values.lastName}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onChange={e => {\r\n                            setFieldValue('lastName', e.target.value);\r\n                          }}\r\n                          error={touched.lastName && errors.lastName ? true : false}\r\n                          helperText={touched.lastName && errors.lastName}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item xs={12}>\r\n                        <TextField\r\n                          fullWidth\r\n                          required\r\n                          variant=\"standard\"\r\n                          autoComplete=\"nope\"\r\n                          label=\"Email\"\r\n                          name=\"email\"\r\n                          value={values.email}\r\n                          onBlur={handleBlur}\r\n                          size=\"small\"\r\n                          onChange={e => {\r\n                            setFieldValue('email', e.target.value);\r\n                          }}\r\n                          error={touched.email && errors.email ? true : false}\r\n                          helperText={touched.email && errors.email}\r\n                        />\r\n                      </Grid>\r\n                      <Grid item container xs={12}>\r\n                        <Box marginTop=\"1rem\">\r\n                          <Button\r\n                            disabled={!dirty || isSubmitting || !isValid}\r\n                            type=\"submit\"\r\n                            startIcon={<Add />}\r\n                            variant=\"contained\"\r\n                            color=\"primary\"\r\n                          >\r\n                            ADD\r\n                          </Button>\r\n                        </Box>\r\n                      </Grid>\r\n                    </Grid>\r\n                  </Form>\r\n                </Grid>\r\n              </Grid>\r\n            </Fade>\r\n          </Modal>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n","import { Box, Button, Grid, useMediaQuery } from '@mui/material';\r\nimport { FC, useState, useEffect, useMemo } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { getDvms } from '../../fetch/dvms';\r\nimport { getDvmTypes } from '../../fetch/lookups';\r\nimport { getDvmStatuses } from '../../fetch/lookups';\r\nimport { IDVMTable } from '../../models';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn, IDropdownResponse, sortable } from '../../models/util';\r\nimport { Add, EditLocationAlt } from '@mui/icons-material';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { DVMFilters } from './dvm-filters';\r\nimport { getDVMMarkets, getStates } from '../../fetch/markets';\r\nimport { AddContractorModal } from './dvm-add-contractor-modal';\r\n\r\nexport const Dvms: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [dvms, setDvms] = useState<IDVMTable[]>([]);\r\n\r\n  const [page, setPage] = useState(0);\r\n  const [perPage, setRowsPerPage] = useState(10);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [selectedSort, setSelectedSort] = useState<string>('1');\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    FirstName?: sortable;\r\n    LastName?: sortable;\r\n    Status?: sortable;\r\n    Type?: sortable;\r\n    PrimaryMarket?: sortable;\r\n  }>({\r\n    FirstName: 'Asc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const history = useHistory();\r\n\r\n  // Filters\r\n  const [selectedStateId, setSelectedStateId] = useState<string>('');\r\n  const [searchValue, setSearchValue] = useState<string>('');\r\n  const [hasAppliedFilters, setHasAppliedFilters] = useState<boolean>(false);\r\n  const [selectedDvmType, setSelectedDvmType] = useState('');\r\n  const [selectedDvmStatus, setSelectedDvmStatus] = useState([\r\n    {\r\n      value: 2,\r\n      description: 'Active',\r\n      shorthand: 'Active',\r\n    },\r\n    {\r\n      value: 1,\r\n      description: 'Pending',\r\n      shorthand: 'Pending',\r\n    },\r\n  ]);\r\n\r\n  const [dvmTypes, setDvmTypes] = useState<IDropdownResponse[]>([]);\r\n  const [dvmStatuses, setDvmStatuses] = useState<IDropdownResponse[]>([]);\r\n  const [areDvmTypesLoading, setAreDvmTypesLoading] = useState(false);\r\n  const [areDvmStatusesLoading, setAreDvmStatusesLoading] = useState(false);\r\n  const [states, setStates] = useState<IDropdownResponse[]>([]);\r\n  const [areStatesLoading, setAreStatesLoading] = useState(false);\r\n\r\n  const [isAddContractorModalOpen, setIsAddContractorModalOpen] = useState(false);\r\n\r\n  const [filters, setFilters] = useState<{\r\n    stateId?: string;\r\n    dvmType?: string;\r\n    PrimaryMarketId?: string;\r\n    dvmStatuses?: string[];\r\n  }>({});\r\n\r\n  const fetchTypes = async () => {\r\n    setAreDvmTypesLoading(true);\r\n    try {\r\n      const res = await getDvmTypes();\r\n      setDvmTypes(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading types, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreDvmTypesLoading(false);\r\n    }\r\n  };\r\n\r\n  const fetchStatuses = async () => {\r\n    setAreDvmStatusesLoading(true);\r\n    try {\r\n      const res = await getDvmStatuses();\r\n      setDvmStatuses(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading statuses, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreDvmStatusesLoading(false);\r\n    }\r\n  };\r\n\r\n  const fetchStates = async () => {\r\n    setAreStatesLoading(true);\r\n    try {\r\n      const res = await getStates();\r\n      setStates(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading states, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreStatesLoading(false);\r\n    }\r\n  };\r\n\r\n  const [areMarketsLoading, setAreMarketsLoading] = useState(true);\r\n  const [markets, setMarkets] = useState<IDropdownResponse[]>([]);\r\n  const [selectedMarket, setSelectedMarket] = useState<string>('');\r\n\r\n  const fetchMarkets = async () => {\r\n    setAreMarketsLoading(true);\r\n    try {\r\n      const res = await getDVMMarkets();\r\n      setMarkets(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading markets, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreMarketsLoading(false);\r\n    }\r\n  };\r\n  useEffect(() => {\r\n    fetchTypes();\r\n    fetchStatuses();\r\n    fetchStates();\r\n    fetchMarkets();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const handleEdit = (dvmId: number | string) => {\r\n    history.push(`dvms/${dvmId}`);\r\n  };\r\n\r\n  const fetchDvms = async () => {\r\n    try {\r\n      const mappedStatuses = selectedDvmStatus?.map(s => s.description);\r\n      setIsLoading(true);\r\n      const res = await getDvms({\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n        DVMName: searchValue,\r\n        dvmStatuses: mappedStatuses || undefined,\r\n        ...filters,\r\n      });\r\n      setDvms(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading DVMs, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchDvms();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection, filters]);\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'First Name',\r\n        accessor: 'firstName',\r\n        isServerSorted: selectedSort === 'FirstName',\r\n        isServerSortedDesc: sortDirection.FirstName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('FirstName'),\r\n      },\r\n      {\r\n        Header: 'Last Name',\r\n        accessor: 'lastName',\r\n        isServerSorted: selectedSort === 'LastName',\r\n        isServerSortedDesc: sortDirection.LastName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('LastName'),\r\n      },\r\n      {\r\n        Header: 'Email',\r\n        accessor: 'email',\r\n        isServerSorted: selectedSort === 'email',\r\n        isServerSortedDesc: sortDirection.LastName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('email'),\r\n      },\r\n      {\r\n        Header: 'Status',\r\n        accessor: 'status',\r\n        isServerSorted: selectedSort === 'Status',\r\n        isServerSortedDesc: sortDirection.Status === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Status'),\r\n      },\r\n      {\r\n        Header: 'Type',\r\n        accessor: 'type',\r\n        isServerSorted: selectedSort === 'Type',\r\n        isServerSortedDesc: sortDirection.Type === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Type'),\r\n      },\r\n      {\r\n        Header: 'Market',\r\n        accessor: 'primaryMarket',\r\n        isServerSorted: selectedSort === 'PrimaryMarket',\r\n        isServerSortedDesc: sortDirection.PrimaryMarket === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('PrimaryMarket'),\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        isServerSorted: false,\r\n        isServerSortedDesc: false,\r\n        handleClickColumn: () => {},\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IDVMTable } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                onClick={() => {\r\n                  handleEdit(original.dvmId);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedSort, sortDirection]);\r\n\r\n  return (\r\n    <Page\r\n      title={'DVMs'}\r\n      additionalHeaderContent={\r\n        <>\r\n          <Button\r\n            color=\"primary\"\r\n            startIcon={<Add />}\r\n            onClick={() => {\r\n              setIsAddContractorModalOpen(true);\r\n            }}\r\n          >\r\n            ADD\r\n          </Button>\r\n        </>\r\n      }\r\n    >\r\n      {isLoading && <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />}\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12}>\r\n          <DVMFilters\r\n            setSearchValue={setSearchValue}\r\n            searchValue={searchValue}\r\n            applyFilters={(clearFilters?: boolean) => {\r\n              if (clearFilters) {\r\n                setFilters({});\r\n                setSearchValue('');\r\n              } else {\r\n                setPage(0);\r\n                setFilters({\r\n                  ...filters,\r\n                  dvmStatuses: selectedDvmStatus?.map(s => s.description) || undefined,\r\n                  dvmType: selectedDvmType || undefined,\r\n                  stateId: selectedStateId || undefined,\r\n                  PrimaryMarketId: selectedMarket || undefined,\r\n                });\r\n              }\r\n            }}\r\n            setHasAppliedFilters={setHasAppliedFilters}\r\n            handleSearch={(val: string) => {\r\n              setPage(0);\r\n              setSearchValue(val);\r\n            }}\r\n            isLoading={\r\n              isLoading ||\r\n              areDvmTypesLoading ||\r\n              areDvmStatusesLoading ||\r\n              areStatesLoading ||\r\n              areMarketsLoading\r\n            }\r\n            types={dvmTypes}\r\n            selectedType={selectedDvmType}\r\n            setSelectedType={setSelectedDvmType}\r\n            statuses={dvmStatuses}\r\n            selectedStatuses={selectedDvmStatus}\r\n            setSelectedStatuses={setSelectedDvmStatus}\r\n            states={states}\r\n            selectedState={selectedStateId}\r\n            setSelectedState={setSelectedStateId}\r\n            hasAppliedFilters={hasAppliedFilters}\r\n            markets={markets}\r\n            selectedMarket={selectedMarket}\r\n            setSelectedMarket={setSelectedMarket}\r\n          />\r\n        </Grid>\r\n        <Grid item xs={12}>\r\n          <Table\r\n            columns={columns}\r\n            data={dvms}\r\n            isLoading={isLoading}\r\n            serverPage={page}\r\n            serverRecordCount={recordCount}\r\n            serverPerPage={perPage}\r\n            handlePage={setPage}\r\n            handleRowsPerPage={setRowsPerPage}\r\n            ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n            mobileProps={{\r\n              fields: columns\r\n                .filter(col => col.Header)\r\n                .map(col => ({\r\n                  name: col.Header,\r\n                  accessor: col.accessor,\r\n                  Cell: col?.Cell,\r\n                })),\r\n              handleEdit: (dvm: IDVMTable) => {\r\n                handleEdit(dvm.dvmId);\r\n              },\r\n            }}\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n      <AddContractorModal\r\n        isOpen={isAddContractorModalOpen}\r\n        onClose={() => setIsAddContractorModalOpen(false)}\r\n      />\r\n    </Page>\r\n  );\r\n};\r\n","import { FC } from 'react';\r\nimport { Page } from '../../components';\r\nimport { Grid, Link } from '@mui/material';\r\n\r\nexport const DvmPending: FC = () => {\r\n    return (\r\n    <Page title={'Registration In Progress'}>\r\n        <Grid container spacing={3}>\r\n            <Grid item>A Relief Staffing Specialist will be in touch with you shortly to schedule a time to speak with you. For any questions, please contact <Link href=\"mailto:relief@vetcher.com\">relief@vetcher.com</Link></Grid>\r\n        </Grid>\r\n    </Page>\r\n    );\r\n};\r\n  ","import { FC } from 'react';\r\nimport { Page } from '../../components';\r\nimport { Grid, Link } from '@mui/material';\r\n\r\nexport const DvmDisabled: FC = () => {\r\n  return (\r\n    <Page title={'Account Inactive'}>\r\n      <Grid container spacing={3}>\r\n        <Grid item>\r\n          Login Error. Please contact{' '}\r\n          <Link href=\"mailto:relief@vetcher.com\">relief@vetcher.com</Link> for assistance and\r\n          someone will be in touch with you shortly.\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n","import { FC, useState, useEffect } from 'react';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport * as Yup from 'yup';\r\n// Components\r\nimport { Autocomplete, Box, Button, Fade, Grid, TextField, Typography } from '@mui/material';\r\nimport { Modal } from '../../components';\r\nimport { Form, Formik } from 'formik';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Edit, Close } from '@mui/icons-material';\r\nimport { deepEqual } from 'fast-equals';\r\nimport { IAppRole, IUserInfo } from '../../models';\r\nimport { updateUserRoles } from '../../fetch';\r\nimport { IDropdownResponse } from '../../models/util';\r\n\r\ninterface IAddEditUserModal {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  currentUser?: IUserInfo;\r\n  fetchUsers: () => {};\r\n  appRoles: IAppRole[] | null;\r\n  userRoles: string[];\r\n  locations: IDropdownResponse[] | null;\r\n  userLocations: any[] | undefined;\r\n}\r\n\r\nexport const AddEditUserModal: FC<IAddEditUserModal> = ({\r\n  open,\r\n  onClose,\r\n  currentUser,\r\n  fetchUsers,\r\n  appRoles,\r\n  userRoles,\r\n  userLocations,\r\n  locations,\r\n}) => {\r\n  const classes = useStyles();\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const [isPracticeManager, setIsPracticeManager] = useState(\r\n    userRoles\r\n      .map(userRole => appRoles?.find(appRole => appRole.id === userRole))\r\n      .map(role => role?.name)\r\n      .includes('Practice Manager')\r\n  );\r\n\r\n  useEffect(() => {\r\n    setIsPracticeManager(\r\n      userRoles\r\n        .map(userRole => appRoles?.find(appRole => appRole.id === userRole))\r\n        .map(role => role?.name)\r\n        .includes('Practice Manager')\r\n    );\r\n  }, [appRoles, userRoles]);\r\n\r\n  const Schema = Yup.object().shape({\r\n    roles: Yup.array()\r\n      .of(Yup.object({ name: Yup.string(), id: Yup.string() }))\r\n      .required('Required'),\r\n    locations: isPracticeManager\r\n      ? Yup.array().of(Yup.object()).required('At least 1 Location is Required').min(1)\r\n      : Yup.object().notRequired().nullable(),\r\n  });\r\n  return (\r\n    <>\r\n      <Formik\r\n        enableReinitialize={true}\r\n        initialValues={{\r\n          roles: userRoles.map(userRole => appRoles?.find(appRole => appRole.id === userRole)),\r\n          locations: userLocations ?? [],\r\n        }}\r\n        validationSchema={Schema}\r\n        onSubmit={async (values, actions) => {\r\n          if (values.roles?.length > 1 && values.roles?.some(role => role?.name === 'DVM'))\r\n          {\r\n            enqueueSnackbar(`If user is a DVM they may not be assigned any other role.`, {\r\n              variant: 'error',\r\n            });\r\n          }\r\n          else {\r\n            try {\r\n              if (values.roles) {\r\n                await updateUserRoles(\r\n                  currentUser?.userId as number,\r\n                  values.roles.map(role => role?.id),\r\n                  !isPracticeManager\r\n                    ? []\r\n                    : values.locations.map(location => {\r\n                        return { locationId: location?.value, name: location?.description };\r\n                      })\r\n                );\r\n              }\r\n              enqueueSnackbar(`Updated user!`, { variant: 'success' });\r\n              fetchUsers();\r\n              onClose();\r\n            } catch (e) {\r\n              enqueueSnackbar(`Error updating users.`, { variant: 'error' });\r\n            }\r\n          }\r\n        }}\r\n      >\r\n        {({\r\n          isSubmitting,\r\n          values,\r\n          initialValues,\r\n          setFieldValue,\r\n          handleSubmit,\r\n          dirty,\r\n          isValid,\r\n          handleBlur,\r\n          errors,\r\n          resetForm,\r\n        }) => {\r\n          return (\r\n            <Modal\r\n              open={open}\r\n              onClose={() => {\r\n                resetForm();\r\n                onClose();\r\n              }}\r\n              maxWidth=\"md\"\r\n            >\r\n              <Fade in={open}>\r\n                <Form onSubmit={handleSubmit} autoComplete=\"none\">\r\n                  <div>\r\n                    <Typography variant=\"h5\">\r\n                      {!!currentUser\r\n                        ? `Edit ${currentUser?.firstName} ${currentUser?.lastName}`\r\n                        : `Add New User`}\r\n                    </Typography>\r\n                    <Grid item xs={12}>\r\n                      <Autocomplete\r\n                        value={values.roles as IAppRole[]}\r\n                        multiple\r\n                        fullWidth\r\n                        size={'small'}\r\n                        onChange={(event, newValue: IAppRole[]) => {\r\n                          if (newValue && newValue.length > 0) {\r\n                            setFieldValue('roles', newValue);\r\n                            const isPracticeManager = newValue\r\n                              .map(userRole =>\r\n                                appRoles?.find(appRole => appRole.id === userRole.id)\r\n                              )\r\n                              .map(role => role?.name)\r\n                              .includes('Practice Manager');\r\n                            setIsPracticeManager(isPracticeManager);\r\n                            !isPracticeManager && setFieldValue('locations', []);\r\n                          } else {\r\n                            setFieldValue('roles', []);\r\n                          }\r\n                        }}\r\n                        id=\"roles\"\r\n                        options={appRoles ?? []}\r\n                        disabled={false}\r\n                        getOptionLabel={(option: IAppRole) => {\r\n                          return option.name;\r\n                        }}\r\n                        renderInput={params => (\r\n                          <TextField\r\n                            {...params}\r\n                            fullWidth\r\n                            name={'Roles'}\r\n                            autoComplete=\"none\"\r\n                            inputProps={{\r\n                              ...params.inputProps,\r\n                              maxLength: 150,\r\n                            }}\r\n                            onBlur={handleBlur}\r\n                            label=\"Roles\"\r\n                            variant=\"outlined\"\r\n                          />\r\n                        )}\r\n                      />\r\n                    </Grid>\r\n                    {isPracticeManager && (\r\n                      <Grid item xs={12}>\r\n                        <Autocomplete\r\n                          value={values.locations as any[]}\r\n                          multiple\r\n                          fullWidth\r\n                          size={'small'}\r\n                          onChange={(event, newValue: any[]) => {\r\n                            if (newValue && newValue.length > 0) {\r\n                              setFieldValue('locations', newValue);\r\n                            } else {\r\n                              setFieldValue('locations', []);\r\n                            }\r\n                          }}\r\n                          id=\"locations\"\r\n                          options={locations ?? []}\r\n                          disabled={false}\r\n                          getOptionLabel={(option: any) => {\r\n                            return option?.description ? option?.description : option?.name;\r\n                          }}\r\n                          renderInput={params => (\r\n                            <TextField\r\n                              {...params}\r\n                              fullWidth\r\n                              name={'Locations'}\r\n                              autoComplete=\"none\"\r\n                              inputProps={{\r\n                                ...params.inputProps,\r\n                                maxLength: 150,\r\n                              }}\r\n                              onBlur={handleBlur}\r\n                              label=\"Locations\"\r\n                              variant=\"outlined\"\r\n                            />\r\n                          )}\r\n                        />\r\n                      </Grid>\r\n                    )}\r\n                  </div>\r\n                  <Box marginTop=\"1rem\">\r\n                    <Button\r\n                      className={classes.button}\r\n                      disabled={!dirty || isSubmitting || !isValid}\r\n                      type=\"submit\"\r\n                      startIcon={<Edit />}\r\n                      variant=\"contained\"\r\n                      color=\"primary\"\r\n                    >\r\n                      Save\r\n                    </Button>\r\n                    <Button\r\n                      className={classes.button}\r\n                      type=\"button\"\r\n                      variant=\"contained\"\r\n                      color=\"inherit\"\r\n                      disabled={isSubmitting}\r\n                      startIcon={<Close />}\r\n                      onClick={() => {\r\n                        //@ts-ignore\r\n                        if (!deepEqual(initialValues, values)) {\r\n                          const result = window.confirm(\r\n                            'You have unsaved changes, are you sure you want to exit?'\r\n                          );\r\n                          if (result) {\r\n                            resetForm();\r\n                            onClose();\r\n                          } else {\r\n                            return;\r\n                          }\r\n                        } else {\r\n                          resetForm();\r\n                          onClose();\r\n                        }\r\n                      }}\r\n                    >\r\n                      Cancel\r\n                    </Button>\r\n                  </Box>\r\n                </Form>\r\n              </Fade>\r\n            </Modal>\r\n          );\r\n        }}\r\n      </Formik>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n  primaryHeader: {\r\n    backgroundColor: theme.palette.primary.main,\r\n    color: theme.palette.common.white,\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  marginBottom: {\r\n    marginBottom: theme.spacing(1),\r\n  },\r\n  content: {\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  paginationWrapper: {\r\n    margin: theme.spacing(0.5, 0),\r\n  },\r\n  saveWrapper: {\r\n    display: 'flex',\r\n    justifyContent: 'flex-end',\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  deleteButton: {\r\n    color: theme.palette.error.main,\r\n  },\r\n  addButton: {\r\n    flex: 1,\r\n  },\r\n  validationMessage: {\r\n    color: theme.palette.error.main,\r\n    marginTop: theme.spacing(1),\r\n  },\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { FC, useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport {\r\n  FormControl,\r\n  InputLabel,\r\n  Select,\r\n  MenuItem,\r\n  Grid,\r\n  Button,\r\n  Divider,\r\n  TextField,\r\n} from '@mui/material';\r\nimport { FilterList, Close, ArrowDropDown, ArrowDropUp } from '@mui/icons-material';\r\nimport { IDropdownResponse } from '../../models/util';\r\n\r\ninterface IUserFilters {\r\n  isLoading: boolean;\r\n  applyFilters: (clearFilters?: boolean) => void;\r\n  statuses: IDropdownResponse[];\r\n  selectedStatus: string | null;\r\n  setSelectedStatus: (val: string) => void;\r\n  setSearchValue: (val: string) => void;\r\n  searchValue: string;\r\n  handleSearch: (val: string) => void;\r\n  hasAppliedFilters: boolean;\r\n  setHasAppliedFilters: (val: boolean) => void;\r\n}\r\n\r\nexport const UserFilters: FC<IUserFilters> = ({\r\n  isLoading,\r\n  applyFilters,\r\n  statuses,\r\n  selectedStatus,\r\n  setSelectedStatus,\r\n  setSearchValue,\r\n  searchValue,\r\n  handleSearch,\r\n  hasAppliedFilters,\r\n  setHasAppliedFilters,\r\n}) => {\r\n  const [isMobileFilterButtonOpen, toggleMobileFilter] = useState<boolean>(false);\r\n  const classes = useStyles({ isMobileFilterButtonOpen });\r\n\r\n  const noFilters = !selectedStatus && !searchValue;\r\n  return (\r\n    <>\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.searchWrapper}></Grid>\r\n      <Button\r\n        color=\"secondary\"\r\n        variant=\"contained\"\r\n        className={classes.mobileButton}\r\n        startIcon={<FilterList />}\r\n        endIcon={isMobileFilterButtonOpen ? <ArrowDropUp /> : <ArrowDropDown />}\r\n        onClick={() => {\r\n          toggleMobileFilter(!isMobileFilterButtonOpen);\r\n        }}\r\n      >\r\n        Filters\r\n      </Button>\r\n      {!isMobileFilterButtonOpen && <Divider className={classes.divider} />}\r\n      <Grid container spacing={1} alignItems=\"center\" className={classes.wrapper}>\r\n        <Grid item xs={12} sm={6} md={3}>\r\n          <TextField\r\n            fullWidth\r\n            variant=\"standard\"\r\n            autoComplete=\"nope\"\r\n            label=\"Search\"\r\n            name=\"search\"\r\n            classes={{ root: classes.searchRoot }}\r\n            value={searchValue}\r\n            size=\"small\"\r\n            onKeyDown={e => {\r\n              if (e.key === 'Enter') {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n              }\r\n            }}\r\n            onChange={e => {\r\n              setSearchValue(e.target.value);\r\n            }}\r\n          />\r\n        </Grid>\r\n        <Grid item xs={6} sm={3} md={1}>\r\n          <FormControl\r\n            classes={{ root: classes.formControlRoot }}\r\n            fullWidth\r\n            variant=\"standard\"\r\n            size=\"small\"\r\n          >\r\n            <InputLabel htmlFor=\"Status\" className={classes.ellipsis}>\r\n              Status\r\n            </InputLabel>\r\n            <Select\r\n              disabled={isLoading}\r\n              name=\"Status\"\r\n              labelId=\"Status\"\r\n              id=\"Status\"\r\n              value={selectedStatus ?? ''}\r\n              onChange={({ target: { value } }) => {\r\n                setSelectedStatus(value ?? '');\r\n              }}\r\n              onKeyDown={e => {\r\n                if (e.key === 'Enter' && searchValue.length > 0) {\r\n                  setHasAppliedFilters(true);\r\n                  applyFilters();\r\n                }\r\n              }}\r\n            >\r\n              <MenuItem key={`all`} value={''}>\r\n                All\r\n              </MenuItem>\r\n              {statuses?.map((status, index) => {\r\n                return (\r\n                  <MenuItem key={`${status.value}`} value={status.value}>\r\n                    {status.description}\r\n                  </MenuItem>\r\n                );\r\n              })}\r\n            </Select>\r\n          </FormControl>\r\n        </Grid>\r\n        <Grid item xs={12} sm={6} lg={4}>\r\n          <Button\r\n            color=\"primary\"\r\n            variant=\"contained\"\r\n            className={classes.button}\r\n            disabled={isLoading}\r\n            startIcon={<FilterList />}\r\n            onClick={() => {\r\n              if (noFilters) {\r\n                setHasAppliedFilters(false);\r\n                applyFilters();\r\n              } else {\r\n                setHasAppliedFilters(true);\r\n                applyFilters();\r\n              }\r\n            }}\r\n          >\r\n            Apply Filters\r\n          </Button>\r\n          {hasAppliedFilters && (\r\n            <Button\r\n              className={clsx(classes.button, classes.resetButton)}\r\n              variant=\"contained\"\r\n              color=\"inherit\"\r\n              disabled={isLoading}\r\n              startIcon={<Close />}\r\n              onClick={() => {\r\n                setSearchValue('');\r\n                setHasAppliedFilters(false);\r\n                setSelectedStatus('');\r\n                applyFilters(true);\r\n              }}\r\n            >\r\n              Reset\r\n            </Button>\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, { isMobileFilterButtonOpen?: boolean }>((theme: Theme) => ({\r\n  mobileButton: {\r\n    width: '100%',\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  button: {\r\n    marginTop: 4,\r\n    marginBottom: 4,\r\n    height: 40,\r\n    textTransform: 'capitalize',\r\n    width: '100%',\r\n\r\n    [theme.breakpoints.up('sm')]: {\r\n      width: 'auto',\r\n      marginLeft: theme.spacing(2),\r\n    },\r\n  },\r\n  resetButton: {\r\n    '@media (min-width: 600px)': {\r\n      marginLeft: 11,\r\n    },\r\n    [theme.breakpoints.up('sm')]: {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  wrapper: ({ isMobileFilterButtonOpen }) =>\r\n    isMobileFilterButtonOpen\r\n      ? {\r\n          marginTop: 10,\r\n          marginBottom: 10,\r\n          display: 'flex',\r\n        }\r\n      : {\r\n          display: 'none',\r\n          marginBottom: theme.spacing(1),\r\n          [theme.breakpoints.up('sm')]: {\r\n            display: 'flex',\r\n          },\r\n        },\r\n  divider: {\r\n    display: 'block',\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'none',\r\n    },\r\n  },\r\n  gridItem: {\r\n    padding: `3px 8px !important`,\r\n    [theme.breakpoints.up('sm')]: {\r\n      padding: `8px !important`,\r\n    },\r\n  },\r\n  searchIcon: {\r\n    cursor: 'pointer',\r\n    color: theme.palette.grey[500],\r\n  },\r\n  ellipsis: {\r\n    fontSize: 14,\r\n    width: 'auto',\r\n    whiteSpace: 'normal',\r\n    overflow: 'visible',\r\n    '@media (min-width: 960px)': {\r\n      textOverflow: 'ellipsis',\r\n      whiteSpace: 'nowrap',\r\n      overflow: 'hidden',\r\n    },\r\n    '@media (min-width: 1400px)': {\r\n      width: 'auto',\r\n      whiteSpace: 'normal',\r\n      overflow: 'visible',\r\n    },\r\n  },\r\n  formControlRoot: {\r\n    marginTop: 0,\r\n  },\r\n  textFieldRoot: {\r\n    marginBottom: 0,\r\n  },\r\n  searchWrapper: {\r\n    marginBottom: theme.spacing(1),\r\n    [theme.breakpoints.up('sm')]: {\r\n      display: 'flex',\r\n      marginBottom: theme.spacing(1),\r\n    },\r\n  },\r\n  clearSearchButton: {\r\n    '@media (min-width: 408px)': {\r\n      marginTop: 3,\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n  searchButton: {\r\n    minWidth: '8rem',\r\n  },\r\n  searchRoot: {\r\n    marginTop: 0,\r\n  },\r\n}));\r\n","import { Box, Button, Grid, useMediaQuery } from '@mui/material';\r\nimport { FC, useState, useEffect, useMemo } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn, IDropdownResponse, sortable } from '../../models/util';\r\nimport { IUserInfo } from '../../models/user';\r\nimport { getUser, getUsers } from '../../fetch';\r\nimport { formatShortFriendlyDateWithTime } from '../../helpers';\r\nimport { EditLocationAlt } from '@mui/icons-material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { AddEditUserModal } from './add-edit-user-modal';\r\nimport { getAppRoles } from '../../fetch';\r\nimport { IAppRole, IAppUser } from '../../models';\r\nimport { getLocationLookup } from '../../fetch/lookups';\r\nimport { UserFilters } from './user-filters';\r\n\r\nconst STATUSES = [\r\n  { description: 'Active', shorthand: 'Active', value: 'true' },\r\n  { description: 'Inactive', shorthand: 'Inactive', value: 'false' },\r\n];\r\nexport const Users: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [users, setUsers] = useState<IUserInfo[]>([]);\r\n  const [page, setPage] = useState(0);\r\n  const [perPage, setRowsPerPage] = useState(10);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [selectedSort, setSelectedSort] = useState<string>('1');\r\n  const [isModalOpen, setIsModalOpen] = useState(false);\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    FirstName?: sortable;\r\n    LastName?: sortable;\r\n    Email?: sortable;\r\n    Status?: sortable;\r\n    LastLogin?: sortable;\r\n  }>({\r\n    FirstName: 'Asc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n  const classes = useStyles();\r\n\r\n  const [appRoles, setAppRoles] = useState<IAppRole[] | null>(null);\r\n  const [areAppRolesLoading, setAreAppRolesLoading] = useState(false);\r\n\r\n  const [searchValue, setSearchValue] = useState<string>('');\r\n  const [hasAppliedFilters, setHasAppliedFilters] = useState<boolean>(false);\r\n  const [status, setStatus] = useState<string>('');\r\n  const [filters, setFilters] = useState<{\r\n    isActive?: string;\r\n  }>({});\r\n\r\n  const fetchAppRoles = async () => {\r\n    setAreAppRolesLoading(true);\r\n    try {\r\n      const res = await getAppRoles();\r\n      setAppRoles(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading app roles, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreAppRolesLoading(false);\r\n    }\r\n  };\r\n\r\n  const fetchUsers = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getUsers({\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n        searchText: searchValue,\r\n        ...filters,\r\n      });\r\n      setUsers(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading users, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  const [locations, setLocations] = useState<IDropdownResponse[] | null>(null);\r\n  const [areLocationsLoading, setAreLocationsLoading] = useState(false);\r\n\r\n  const fetchLocations = async () => {\r\n    try {\r\n      setAreLocationsLoading(true);\r\n      const res = await getLocationLookup();\r\n      setLocations(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading locations, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setAreLocationsLoading(false);\r\n    }\r\n  };\r\n  useEffect(() => {\r\n    fetchUsers();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection, filters]);\r\n\r\n  useEffect(() => {\r\n    fetchAppRoles();\r\n    fetchLocations();\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  const [currentUser, setCurrentUser] = useState<IUserInfo | undefined>(undefined);\r\n  const handleEdit = (user: IUserInfo) => {\r\n    setCurrentUser(user);\r\n    user.azureOID ? setIsModalOpen(true) : setIsModalOpen(false);\r\n  };\r\n\r\n  const [userRoles, setUserRoles] = useState<IAppUser | null>(null);\r\n  const [isLoadingUserRoles, setisLoadingUserRoles] = useState(false);\r\n  const fetchUser = async () => {\r\n    try {\r\n      setisLoadingUserRoles(true);\r\n      const res = await getUser(currentUser?.userId as number);\r\n\r\n      setUserRoles(res);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n\r\n      setIsModalOpen(false);\r\n      enqueueSnackbar(errorMessage || `Error loading users, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setisLoadingUserRoles(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (currentUser) {\r\n      fetchUser();\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [currentUser]);\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    return [\r\n      {\r\n        Header: 'First Name',\r\n        accessor: 'firstName',\r\n        isServerSorted: selectedSort === 'FirstName',\r\n        isServerSortedDesc: sortDirection.FirstName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('FirstName'),\r\n      },\r\n      {\r\n        Header: 'Last Name',\r\n        accessor: 'lastName',\r\n        isServerSorted: selectedSort === 'LastName',\r\n        isServerSortedDesc: sortDirection.LastName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('LastName'),\r\n      },\r\n      {\r\n        Header: 'Status',\r\n        accessor: 'status',\r\n        isServerSorted: selectedSort === 'Status',\r\n        isServerSortedDesc: sortDirection.LastName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Status'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IUserInfo } };\r\n        }) => {\r\n          return <span>{original.isActive === true ? 'Active' : 'Inactive'}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Email',\r\n        accessor: 'email',\r\n        isServerSorted: selectedSort === 'Email',\r\n        isServerSortedDesc: sortDirection.LastName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('Email'),\r\n      },\r\n      {\r\n        Header: 'Last Login',\r\n        accessor: 'lastLoginDate',\r\n        isServerSorted: selectedSort === 'LastLogin',\r\n        isServerSortedDesc: sortDirection.LastName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('LastLogin'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IUserInfo } };\r\n        }) => {\r\n          return <span>{formatShortFriendlyDateWithTime(original.lastLoginDate)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: '',\r\n        accessor: '',\r\n        id: 'actions',\r\n        isServerSorted: false,\r\n        isServerSortedDesc: false,\r\n        handleClickColumn: () => {},\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IUserInfo } };\r\n        }) => {\r\n          return (\r\n            <Box\r\n              sx={{\r\n                textAlign: {\r\n                  xs: 'left',\r\n                  md: 'center',\r\n                },\r\n              }}\r\n            >\r\n              <Button\r\n                className={classes.button}\r\n                color=\"primary\"\r\n                startIcon={<EditLocationAlt />}\r\n                disabled={original.azureOID ? false : true}\r\n                onClick={() => {\r\n                  handleEdit(original);\r\n                }}\r\n              >\r\n                Edit\r\n              </Button>\r\n            </Box>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [selectedSort, sortDirection]);\r\n\r\n  return (\r\n    <Page title={'Users'}>\r\n      {isLoading && <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />}\r\n      <UserFilters\r\n        setSearchValue={setSearchValue}\r\n        searchValue={searchValue}\r\n        applyFilters={(clearFilters?: boolean) => {\r\n          if (clearFilters) {\r\n            setFilters({});\r\n            setSearchValue('');\r\n          } else {\r\n            setPage(0);\r\n            setFilters({\r\n              ...filters,\r\n              isActive: status ?? undefined,\r\n            });\r\n          }\r\n        }}\r\n        setHasAppliedFilters={setHasAppliedFilters}\r\n        handleSearch={(val: string) => {\r\n          setPage(0);\r\n          setSearchValue(val);\r\n        }}\r\n        isLoading={isLoading}\r\n        selectedStatus={status}\r\n        setSelectedStatus={setStatus}\r\n        hasAppliedFilters={hasAppliedFilters}\r\n        statuses={STATUSES}\r\n      />\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12}>\r\n          <Table\r\n            columns={columns}\r\n            data={users}\r\n            isLoading={isLoading}\r\n            serverPage={page}\r\n            serverRecordCount={recordCount}\r\n            serverPerPage={perPage}\r\n            handlePage={setPage}\r\n            handleRowsPerPage={setRowsPerPage}\r\n            ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n            mobileProps={{\r\n              fields: columns\r\n                .filter(col => col.Header)\r\n                .map(col => ({\r\n                  name: col.Header,\r\n                  accessor: col.accessor,\r\n                  Cell: col?.Cell,\r\n                })),\r\n              handleEdit,\r\n            }}\r\n          />\r\n        </Grid>\r\n      </Grid>\r\n      <AddEditUserModal\r\n        currentUser={currentUser}\r\n        open={isModalOpen && !areLocationsLoading && !isLoadingUserRoles && !areAppRolesLoading}\r\n        onClose={() => {\r\n          setIsModalOpen(false);\r\n          setCurrentUser(undefined);\r\n        }}\r\n        fetchUsers={() => fetchUsers()}\r\n        appRoles={appRoles}\r\n        locations={locations}\r\n        // @ts-ignore\r\n        userRoles={userRoles?.roles ?? []}\r\n        // @ts-ignore\r\n        userLocations={\r\n          userRoles?.locations?.map(userLocation =>\r\n            locations?.find(\r\n              (location: IDropdownResponse) => +location.value === userLocation.locationId\r\n            )\r\n          ) ?? []\r\n        }\r\n      />\r\n    </Page>\r\n  );\r\n};\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  button: {\r\n    '&:not(:first-of-type)': {\r\n      marginLeft: theme.spacing(1),\r\n    },\r\n  },\r\n}));\r\n","import { Box, Grid, useMediaQuery, FormControlLabel, Checkbox } from '@mui/material';\r\nimport { FC, useState, useEffect, useMemo } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { useSnackbar } from 'notistack';\r\nimport { Table } from '../../components/table/Table';\r\nimport { MobileTable } from '../../components/table/MobileTable';\r\nimport { IColumn, sortable } from '../../models/util';\r\nimport {\r\n  getShiftRequestsCancelationActivity,\r\n  acknowledgeCancelation,\r\n} from '../../fetch/shift-requests';\r\nimport { IShiftRequestsCancelationActivity } from '../../models/shift-requests';\r\nimport { formatDate, formatUtcToLocalShortFriendlyDateWithTime } from '../../helpers';\r\nimport { Pagination } from '../../components/table/Pagination';\r\n\r\nexport const Activity: FC = () => {\r\n  const [isLoading, setIsLoading] = useState<boolean>(false);\r\n  const [shiftRequests, setShiftRequests] = useState<IShiftRequestsCancelationActivity[]>([]);\r\n  const isMobile = useMediaQuery('(max-width: 960px)');\r\n  const [isSaving, setSaving] = useState<{\r\n    [id: number]: boolean;\r\n  }>({});\r\n  const [page, setPage] = useState(0);\r\n  const [perPage, setRowsPerPage] = useState(10);\r\n  const [recordCount, setRecordCount] = useState(0);\r\n  const [selectedSort, setSelectedSort] = useState<string>('CanceledDate');\r\n  const [sortDirection, setSortDirection] = useState<{\r\n    ReadState?: sortable;\r\n    DvmName?: sortable;\r\n    LocationName?: sortable;\r\n    ShiftDate?: sortable;\r\n    CanceledDate?: sortable;\r\n  }>({\r\n    CanceledDate: 'Desc',\r\n  });\r\n\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const fetchShiftRequests = async () => {\r\n    try {\r\n      setIsLoading(true);\r\n      const res = await getShiftRequestsCancelationActivity({\r\n        sortBy: selectedSort,\r\n        // @ts-ignore\r\n        sortDirection: sortDirection[selectedSort],\r\n        page: page + 1,\r\n        perPage,\r\n      });\r\n      setShiftRequests(res.records);\r\n      setRecordCount(res.totalRecordCount);\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error loading holidays, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n      console.log(error);\r\n    } finally {\r\n      setIsLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchShiftRequests();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [page, perPage, selectedSort, sortDirection]);\r\n\r\n  const handleCheckboxComplete = async (original: IShiftRequestsCancelationActivity) => {\r\n    setSaving({\r\n      ...isSaving,\r\n      [original.shiftRequestId]: true,\r\n    });\r\n\r\n    // Optimistically update the UI\r\n    const updatedShiftRequests = shiftRequests.map(item =>\r\n      item.shiftRequestId === original.shiftRequestId\r\n        ? { ...item, cancelationAcknowledged: !item.cancelationAcknowledged }\r\n        : item\r\n    );\r\n    setShiftRequests(updatedShiftRequests);\r\n\r\n    try {\r\n      await acknowledgeCancelation(original.shiftRequestId, !original.cancelationAcknowledged);\r\n    } catch (error: any) {\r\n      setShiftRequests(shiftRequests);\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      enqueueSnackbar(errorMessage || `Error updating item, please try again.`, {\r\n        variant: 'error',\r\n      });\r\n    } finally {\r\n      setSaving({\r\n        ...isSaving,\r\n        [original.shiftRequestId]: false,\r\n      });\r\n    }\r\n  };\r\n\r\n  const handleClickColumn = (column: string) => {\r\n    setSelectedSort(column);\r\n    setSortDirection({\r\n      ...sortDirection,\r\n      // @ts-ignore\r\n      [column]: sortDirection[column] === 'Asc' ? 'Desc' : 'Asc',\r\n    });\r\n  };\r\n\r\n  const columns = useMemo((): IColumn[] => {\r\n    const baseColumns: IColumn[] = [\r\n      {\r\n        Header: 'DVM Name',\r\n        accessor: 'dvmName',\r\n        isServerSorted: selectedSort === 'DvmName',\r\n        isServerSortedDesc: sortDirection.DvmName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('DvmName'),\r\n      },\r\n      {\r\n        Header: 'Location',\r\n        accessor: 'location',\r\n        isServerSorted: selectedSort === 'LocationName',\r\n        isServerSortedDesc: sortDirection.LocationName === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('LocationName'),\r\n      },\r\n      {\r\n        Header: 'Shift Date',\r\n        accessor: 'shiftDate',\r\n        isServerSorted: selectedSort === 'ShiftDate',\r\n        isServerSortedDesc: sortDirection.ShiftDate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('ShiftDate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestsCancelationActivity } };\r\n        }) => {\r\n          return <span>{formatDate(original?.shiftDate)}</span>;\r\n        },\r\n      },\r\n      {\r\n        Header: 'Canceled Date/Time',\r\n        accessor: 'canceledDateTime',\r\n        isServerSorted: selectedSort === 'CanceledDate',\r\n        isServerSortedDesc: sortDirection.CanceledDate === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('CanceledDate'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestsCancelationActivity } };\r\n        }) => {\r\n          return (\r\n            <span>{formatUtcToLocalShortFriendlyDateWithTime(original?.canceledDateTime)}</span>\r\n          );\r\n        },\r\n      },\r\n    ];\r\n\r\n    if (!isMobile) {\r\n      baseColumns.unshift({\r\n        Header: 'Mark as read',\r\n        accessor: 'cancelationAcknowledged',\r\n        isServerSorted: selectedSort === 'ReadState',\r\n        isServerSortedDesc: sortDirection.ReadState === 'Desc',\r\n        handleClickColumn: () => handleClickColumn('ReadState'),\r\n        Cell: ({\r\n          cell: {\r\n            row: { original },\r\n          },\r\n        }: {\r\n          cell: { row: { original: IShiftRequestsCancelationActivity } };\r\n        }) => {\r\n          return (\r\n            <Box display=\"flex\" paddingLeft={4}>\r\n              <FormControlLabel\r\n                color=\"primary\"\r\n                control={\r\n                  <Checkbox\r\n                    checked={original.cancelationAcknowledged === true}\r\n                    id=\"orders-checkbox\"\r\n                    onChange={(_, checked) => handleCheckboxComplete(original)}\r\n                  />\r\n                }\r\n                label=\"\"\r\n              />\r\n            </Box>\r\n          );\r\n        },\r\n      });\r\n    }\r\n\r\n    return baseColumns;\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [shiftRequests, isMobile]);\r\n\r\n  return (\r\n    <Page title={'Activity'}>\r\n      {isLoading && <Loader type=\"fullscreen\" position=\"centered\" title=\"Loading...\" />}\r\n\r\n      <Grid container spacing={3}>\r\n        <Grid item xs={12}>\r\n          <Table\r\n            columns={columns}\r\n            data={shiftRequests}\r\n            hidePagination\r\n            isLoading={isLoading}\r\n            ResponsiveComponent={isMobile ? MobileTable : undefined}\r\n            mobileProps={{\r\n              fields: columns\r\n                .filter(col => col.Header)\r\n                .map(col => ({\r\n                  name: col.Header,\r\n                  accessor: col.accessor,\r\n                  Cell: col?.Cell,\r\n                })),\r\n              mobileAccordionLabel: 'dvmName',\r\n              handleCheckboxComplete: async (original: IShiftRequestsCancelationActivity) => {\r\n                await handleCheckboxComplete(original);\r\n              },\r\n            }}\r\n          />\r\n          {!isLoading && (\r\n            <Grid item xs={12} container justifyContent=\"center\">\r\n              <Pagination\r\n                page={page}\r\n                count={recordCount}\r\n                rowsPerPage={perPage}\r\n                setPage={setPage}\r\n                setRowsPerPage={setRowsPerPage}\r\n              />\r\n            </Grid>\r\n          )}\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n","import { FC } from 'react';\r\nimport { Page } from '../../components';\r\nimport { Grid, Link, Typography, List, ListItem, ListItemText, Box } from '@mui/material';\r\nimport { Theme } from '@mui/material/styles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nexport const PrivacyPolicy: FC = () => {\r\n  const classes = useStyles();\r\n\r\n  return (\r\n    <Page title={'Privacy Policy'}>\r\n      <Grid container spacing={3}>\r\n        <Grid item mt={1}>\r\n          American Veterinary Group (“we”, “us”) are committed to protecting and respecting your\r\n          privacy. This Privacy Notice sets out the basis on which the personal data collected from\r\n          you, or that you provide to us, will be processed by us in connection with our DVM\r\n          Scheduling processes. For the purpose of the General Data Protection Regulation (“GDPR”)\r\n          the Data Controller is American Veterinary Group. We use Vetcher, an online software\r\n          product provided by American Veterinary Group (t/a Vetcher Software), to assist with our\r\n          DVM Scheduling process. We use Vetcher to process personal information as a data processor\r\n          on our behalf. Vetcher is only entitled to process your personal data in accordance with\r\n          our instructions. Where you apply for an opportunity posted by us, these Privacy Notice\r\n          provisions will apply to our processing of your personal information, in addition to our\r\n          other Privacy Notice which is available on{' '}\r\n          <Link href=\"https://www.americanveterinarygroup.com/\">our website</Link>.\r\n        </Grid>\r\n        <Grid item mb={4}>\r\n          <Typography className={classes.headingTextColor} variant=\"h2\">\r\n            Your Personal Information\r\n          </Typography>\r\n          <Typography variant=\"subtitle1\" mt={2}>\r\n            Information we collect from you.\r\n          </Typography>\r\n          <List\r\n            subheader={\r\n              'We collect and process some or all the following types of information from you:'\r\n            }\r\n          >\r\n            <ListItem>\r\n              <ListItemText primary=\"Information you provide. We may collect and store personal information you register for our Service or provide to us in some other manner. For example, when you register with the Service, we collect your name, email address, password, contact information, and employment information. If you are an employer, we also collect information about your business, payment information, and any information you provide about your employees, including your employees’ contact information and pay-scale. We may also collect any communications between you and Vetcher, any information you provide if you take part in any interactive features of the Service, and any other information you provide to us.\" />\r\n            </ListItem>\r\n            <ListItem>\r\n              <ListItemText primary=\"Data collected through the use of the Service. After you set up your account, we collect information in connection with your use of the Service, including your work schedule, your availability, and your time records.\" />\r\n            </ListItem>\r\n            <ListItem>\r\n              <ListItemText primary=\"Information we receive from third parties. From time to time, we may receive information about you from third parties, such as identity verification, payroll vendors, and other information. We may also collect information about you that is publicly available.\" />\r\n            </ListItem>\r\n          </List>\r\n          <Box>\r\n            We use this information to operate, maintain, and provide to you the features and\r\n            functionality of the Service, as well as to communicate directly with you. We may\r\n            compile analytics and share performance data on a de-identified or aggregate basis. We\r\n            may send you communications that contain information about our products or Service, or\r\n            information about third parties’ products or services we think you may enjoy. We may\r\n            also send you Service-related communications (e.g., account verification, messages and\r\n            schedules, change or updates to features of the Service, technical and security\r\n            notices).\r\n          </Box>\r\n          <Typography variant=\"subtitle1\" my={2}>\r\n            How we use cookies and other tracking technology to collect information.\r\n          </Typography>\r\n          <Box>\r\n            We, and our third-party partners, automatically collect certain types of usage\r\n            information when you visit our Service, read our communications, or otherwise engage\r\n            with us. We typically collect this information through a variety of tracking\r\n            technologies, including cookies, Flash objects, web beacons, file information and\r\n            similar technology (collectively, “tracking technologies”). For example, we collect\r\n            information about your device and its software, such as your IP address, browser type,\r\n            Internet service provider, platform type, device type, operating system, date and time\r\n            stamp, a unique ID that allows us to uniquely identify your browser, and other such\r\n            information. We also collect information about the way you use our Service, for example,\r\n            the site from which you came and the site to which you are going when you leave our\r\n            website, the pages you visit, the links you click, how frequently you access the\r\n            Service, whether you open emails or click the links contained in emails, whether you\r\n            access the Service from multiple devices, and other actions you take on the Service.\r\n            When you access our Service from a mobile device, we may collect unique identification\r\n            numbers associated with your device or our mobile application (including, for example, a\r\n            UDID, Unique ID for Advertisers (“IDFA”), Google AdID, or Windows Advertising ID),\r\n            mobile carrier, device type, model and manufacturer, mobile device operating system\r\n            brand and model, phone number, and depending on your mobile device settings, your\r\n            geographical location data, including GPS coordinates (e.g., latitude and/or longitude)\r\n            or similar information regarding the location of your mobile device, or we may be able\r\n            to approximate a device’s location by analyzing other information, like an IP address.\r\n            We may collect analytics data, or use third-party analytics tools, to help us measure\r\n            traffic and usage trends for the Service and to understand more about the demographics\r\n            of our users. We may also work with third party partners to employ technologies,\r\n            including the application of statistical modeling tools, which attempt to recognize you\r\n            across multiple devices. Although we do our best to honor the privacy preferences of our\r\n            users, we are unable to respond to Do Not Track signals set by your browser at this\r\n            time.\r\n          </Box>\r\n\r\n          <Box my={2}>\r\n            We use or may use the data collected through tracking technologies to: (a) remember\r\n            information so that you will not have to re-enter it during your visit or the next time\r\n            you visit the site; (b) provide custom, personalized content and information, including\r\n            targeted content and advertising; (c) identify you across multiple devices; (d) provide\r\n            and monitor the effectiveness of our Service; (e) monitor aggregate metrics such as\r\n            total number of visitors, traffic, usage, and demographic patterns on our website; (f)\r\n            diagnose or fix technology problems; and (g) otherwise to plan for and enhance our\r\n            Service.\r\n          </Box>\r\n\r\n          <Box my={2}>\r\n            If you would prefer not to accept cookies, most browsers will allow you to: (i) change\r\n            your browser settings to notify you when you receive a cookie, which lets you choose\r\n            whether or not to accept it; (ii) disable existing cookies; or (iii) set your browser to\r\n            automatically reject cookies. Please note that doing so may negatively impact your\r\n            experience using the Service, as some features and services on our Service may not work\r\n            properly. Depending on your mobile device and operating system, you may not be able to\r\n            delete or block all cookies. You may also set your e-mail options to prevent the\r\n            automatic downloading of images that may contain technologies that would allow us to\r\n            know whether you have accessed our e-mail and performed certain functions with it.\r\n            Deleting cookies does not delete Local Storage Objects (LSOs) such as Flash objects and\r\n            HTML5. If you choose to delete Flash objects from our sites, then you may not be able to\r\n            access and use all or part of the sites or benefit from the information and services\r\n            offered.\r\n          </Box>\r\n\r\n          <Box my={2}>\r\n            We and our third-party partners may also use cookies and tracking technologies for\r\n            advertising purposes.\r\n          </Box>\r\n\r\n          <Typography variant=\"subtitle1\" my={2}>\r\n            Sharing Information\r\n          </Typography>\r\n          <Box my={2}>\r\n            We may share your personal information in the instances described below.{' '}\r\n          </Box>\r\n          <Box my={2}>\r\n            Other companies owned by or under common ownership as Vetcher, which also includes our\r\n            subsidiaries (i.e., any organization we own or control) or our ultimate holding company\r\n            (i.e., any organization that owns or controls us) and any subsidiaries it owns. These\r\n            companies will use your personal information in the same way as we can under this\r\n            Policy; Third party vendors, consultants and other service providers that perform\r\n            services on our behalf, in order to carry out their work for us, which may include\r\n            identifying and serving targeted advertisements, hosting services, or providing\r\n            analytics services; Other parties in connection with any company transaction, such as a\r\n            merger, sale of all or a portion of company assets or shares, reorganization, financing,\r\n            change of control or acquisition of all or a portion of our business by another company\r\n            or third party or in the event of bankruptcy or related or similar proceedings; and\r\n            third parties as required to (i) satisfy any applicable law, regulation, subpoena/court\r\n            order, legal process or other government request, (ii) enforce our Terms of Service,\r\n            including the investigation of potential violations thereof, (iii) investigate and\r\n            defend ourselves against any third party claims or allegations, (iv) protect against\r\n            harm to the rights, property or safety of Vetcher, its users or the public as required\r\n            or permitted by law and (v) detect, prevent or otherwise address criminal (including\r\n            fraud or stalking), security or technical issues.\r\n          </Box>\r\n          <Box mt={2} mb={3}>\r\n            We may also share information with others in an aggregated and anonymous form that does\r\n            not reasonably identify you directly as an individual.\r\n          </Box>\r\n          <Typography className={classes.headingTextColor} variant=\"h2\">\r\n            How we store your personal data\r\n          </Typography>\r\n          <Typography variant=\"subtitle1\" my={2}>\r\n            Security\r\n          </Typography>\r\n          <Box my={2}>\r\n            We take appropriate measures to ensure that all personal data is kept secure including\r\n            security measures to prevent personal data from being accidentally lost, or used or\r\n            accessed in any unauthorized way. We limit access to your personal data to those who\r\n            have a genuine business need to view it. Those processing your information will do so\r\n            only in an authorized manner and are subject to a duty of confidentiality.\r\n          </Box>\r\n          <Box my={2}>\r\n            We also have procedures in place to deal with any suspected data security breach. We\r\n            will notify you and any applicable regulator of a suspected data security breach where\r\n            we are legally required to do so.\r\n          </Box>\r\n          <Box mt={2} mb={3}>\r\n            Unfortunately, the transmission of information via the internet is not completely\r\n            secure. Although we will do our best to protect your personal data, we cannot guarantee\r\n            the security of your data transmitted through any online means, therefore any\r\n            transmission remains at your own risk.\r\n          </Box>\r\n\r\n          <Typography className={classes.headingTextColor} variant=\"h2\" my={2}>\r\n            Your rights\r\n          </Typography>\r\n          <List\r\n            dense\r\n            subheader={\r\n              'Under the General Data Protection Regulation, you have a number of important rights. In summary, those include rights to:'\r\n            }\r\n          >\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Access to your personal data and to certain other supplementary information that this Privacy Notice is already designed to address.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Require us to correct any mistakes in your information which we hold.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Request the erasure of personal data concerning you in certain situations.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Request access to the personal data concerning you which you have provided to us, in a structured, commonly used, and machine-readable format and have the right to transmit those data to a third party in certain situations.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Object at any time to processing of personal data concerning you for direct marketing.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Object to decisions being taken by automated means which produce legal effects concerning you or similarly significantly affect you.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Object in certain other situations to our continued processing of your personal data.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Otherwise restrict our processing of your personal data in certain circumstances.\" />\r\n            </ListItem>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText primary=\"Claim compensation for damages caused by our breach of any data protection laws.\" />\r\n            </ListItem>\r\n          </List>\r\n          <Box mt={2}>If you would like to exercise any of those rights, please either:</Box>\r\n          <List dense>\r\n            <ListItem className={classes.listItem}>\r\n              <ListItemText\r\n                primary={\r\n                  <span>\r\n                    Contact us by email <Link href=\"mailto:info@vetcher.com\">info@vetcher.com</Link>\r\n                    , ensuring we have enough information to identify you, proving your identity,\r\n                    address and confirming which information to which your request relates.\r\n                  </span>\r\n                }\r\n              />\r\n            </ListItem>\r\n          </List>\r\n\r\n          <Typography className={classes.headingTextColor} variant=\"h2\" my={2}>\r\n            How to complain\r\n          </Typography>\r\n          <Box my={2}>\r\n            We hope that we can resolve any query or concern you raise about our use of your\r\n            information.\r\n          </Box>\r\n          <Box mt={2}>\r\n            The General Data Protection Regulation also gives you right to lodge a complaint with a\r\n            supervisory authority, in particular in the European Union (or European Economic Area)\r\n            state where you work, normally live or where any alleged infringement of data protection\r\n            laws occurred.\r\n          </Box>\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme>((theme: Theme) => ({\r\n  headingTextColor: {\r\n    color: theme.palette.common.black,\r\n  },\r\n  listItem: {\r\n    position: 'relative',\r\n    '&::before': {\r\n      content: '\"•\"',\r\n      position: 'absolute',\r\n      left: 0,\r\n      color: theme.palette.text.primary,\r\n      fontSize: '1.2em',\r\n    },\r\n  },\r\n}));\r\n","import { FC } from 'react';\r\nimport { Page } from '../../components';\r\nimport { Grid } from '@mui/material';\r\n\r\nexport const TermsAndConditions: FC = () => {\r\n  return (\r\n    <Page title={'Terms and Conditions'}>\r\n      <Grid container spacing={3}>\r\n        <Grid item mt={1}>\r\n          Vetcher offers you the option to engage in SMS text conversations about your job\r\n          application. By participating, you also understand that message frequency may vary\r\n          depending on the status of your job application, and that message and data rates may\r\n          apply. Please consult your carrier for further information on applicable rates and fees.\r\n          Carriers are not liable for delayed or undelivered messages. Reply STOP to cancel and HELP\r\n          for help.\r\n        </Grid>\r\n        <Grid item>\r\n          By opting-in to receiving SMS text messages about your job application, you acknowledge\r\n          and agree that your consent data, mobile number, and personal information will be\r\n          collected and stored solely for the purpose of providing you with updates and information\r\n          related to your job application. No mobile information will be shared with third\r\n          parties/affiliates for marketing/promotional purposes. All the above categories exclude\r\n          text messaging originator opt-in data and consent; this information will not be shared\r\n          with any third parties.\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n","import { DvmDetails } from './../pages/dvms/dvm-details';\r\nimport { Holidays } from './../pages/holidays/holidays';\r\nimport { Locations } from '../pages/locations/locations';\r\nimport { ReliefScheduling } from '../pages/relief-scheduling/relief-scheduling';\r\nimport { FTScheduling } from '../pages/ft-scheduling/ft-scheduling';\r\nimport { EntityManagement } from '../pages/entity-management/entity-management';\r\nimport LocationOnOutlinedIcon from '@mui/icons-material/LocationOnOutlined';\r\nimport CelebrationOutlinedIcon from '@mui/icons-material/CelebrationOutlined';\r\nimport { SvgIconTypeMap } from '@mui/material';\r\nimport { OverridableComponent } from '@mui/material/OverridableComponent';\r\nimport { FC, ReactNode } from 'react';\r\nimport { RouteChildrenProps } from 'react-router-dom';\r\nimport {\r\n  Home as MUIHome,\r\n  Today,\r\n  AdminPanelSettingsTwoTone,\r\n  GroupsTwoTone,\r\n  AccountBox,\r\n  StoreTwoTone,\r\n  RuleTwoTone\r\n} from '@mui/icons-material';\r\nimport CalendarMonthIcon from '@mui/icons-material/CalendarMonth';\r\nimport PaymentsIcon from '@mui/icons-material/Payments';\r\nimport { Home } from '../pages';\r\nimport { Dvms } from '../pages/dvms/dvms';\r\nimport { Users } from './../pages/users/users';\r\nimport { PendingPayments } from '../pages/pending-payments';\r\nimport { Activity } from './../pages/activity/activity';\r\n\r\nexport interface IRoute {\r\n  sortOrder: number;\r\n  label: string;\r\n  path: typeof Paths[keyof typeof Paths];\r\n  pageComponent: FC<any>;\r\n  accessTokens?: string[];\r\n  allowedRoles: string[];\r\n  children?:\r\n    | ReactNode\r\n    | ((props: RouteChildrenProps<{ [x: string]: string | undefined }, unknown>) => ReactNode);\r\n  icon: OverridableComponent<SvgIconTypeMap<{}, 'svg'>>;\r\n}\r\nexport const Paths = {\r\n  HOME: '/',\r\n  RELIEF_SCHEDULING: '/relief-scheduling',\r\n  FT_SCHEDULING: '/ft-scheduling',\r\n  PENDING_PAYMENTS: '/pending-payments',\r\n  DVM_PROFILE: '/profile',\r\n  LOCATIONS: '/locations',\r\n  LOCATION_DETAILS: '/locations/:locationId',\r\n  DVMS: '/dvms',\r\n  DVMS_DETAILS: '/dvms/:dvmId',\r\n  DVM_PENDING: '/dvm-pending',\r\n  DVM_DEACTIVATED: '/dvm-deactivated',\r\n  HOLIDAYS: '/holidays',\r\n  USERS: '/users',\r\n  LEGALENTITIES: '/legal-entities',\r\n  ACTIVITY: '/activity',\r\n  NOT_FOUND: '/not-found',\r\n};\r\n\r\nexport const Roles = {\r\n  SYSTEM_ADMIN: 'SystemAdmin',\r\n  RSS: 'RSS',\r\n  OPERATIONS_MANAGER: 'OperationsManager',\r\n  PRACTICE_MANAGER: 'PracticeManager',\r\n  DVM: 'DVM',\r\n};\r\n\r\nexport const Routes: IRoute[] = [\r\n  {\r\n    sortOrder: 0,\r\n    label: 'Home',\r\n    path: Paths.HOME,\r\n    icon: MUIHome,\r\n    pageComponent: Home,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.RSS, Roles.OPERATIONS_MANAGER, Roles.PRACTICE_MANAGER],\r\n  },\r\n  {\r\n    sortOrder: 1,\r\n    label: 'Relief Scheduling',\r\n    path: Paths.RELIEF_SCHEDULING,\r\n    icon: Today,\r\n    pageComponent: ReliefScheduling,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.RSS],\r\n  },\r\n  {\r\n    sortOrder: 2,\r\n    label: 'FT Scheduling',\r\n    path: Paths.FT_SCHEDULING,\r\n    icon: CalendarMonthIcon,\r\n    pageComponent: FTScheduling,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.OPERATIONS_MANAGER, Roles.PRACTICE_MANAGER, Roles.RSS],\r\n  },\r\n  {\r\n    sortOrder: 3,\r\n    label: 'Pending Payments',\r\n    path: Paths.PENDING_PAYMENTS,\r\n    icon: PaymentsIcon,\r\n    pageComponent: PendingPayments,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.OPERATIONS_MANAGER, Roles.PRACTICE_MANAGER, Roles.RSS],\r\n  },\r\n  {\r\n    sortOrder: 4,\r\n    label: 'Profile',\r\n    path: Paths.DVM_PROFILE,\r\n    icon: AccountBox,\r\n    pageComponent: DvmDetails,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.DVM],\r\n  },\r\n  {\r\n    sortOrder: 5,\r\n    label: 'Locations',\r\n    path: Paths.LOCATIONS,\r\n    icon: LocationOnOutlinedIcon,\r\n    pageComponent: Locations,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.RSS, Roles.PRACTICE_MANAGER],\r\n  },\r\n  {\r\n    sortOrder: 6,\r\n    label: 'Legal Entities',\r\n    path: Paths.LEGALENTITIES,\r\n    icon: StoreTwoTone,\r\n    pageComponent: EntityManagement,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN],\r\n  },\r\n  {\r\n    sortOrder: 7,\r\n    label: 'Holidays',\r\n    path: Paths.HOLIDAYS,\r\n    icon: CelebrationOutlinedIcon,\r\n    pageComponent: Holidays,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.RSS],\r\n  },\r\n  {\r\n    sortOrder: 8,\r\n    label: 'DVMs',\r\n    path: Paths.DVMS,\r\n    icon: GroupsTwoTone,\r\n    pageComponent: Dvms,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN, Roles.RSS],\r\n  },\r\n  {\r\n    sortOrder: 9,\r\n    label: 'Users',\r\n    path: Paths.USERS,\r\n    icon: AdminPanelSettingsTwoTone,\r\n    pageComponent: Users,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN],\r\n  },\r\n  {\r\n    sortOrder: 10,\r\n    label: 'Activity',\r\n    path: Paths.ACTIVITY,\r\n    icon: RuleTwoTone,\r\n    pageComponent: Activity,\r\n    allowedRoles: [Roles.SYSTEM_ADMIN],\r\n  },\r\n];\r\n","import { AccountInfo, AuthenticationResult } from '@azure/msal-browser';\r\nimport { useAccount, useMsal } from '@azure/msal-react';\r\nimport { AxiosResponse } from 'axios';\r\nimport React, { createContext, FC, useEffect, useState } from 'react';\r\nimport { Roles } from '../constants';\r\nimport { authFetch } from '../fetch';\r\nimport { setLocalStorage, removeLocalStorage, token_key } from '../helpers';\r\nimport { IUser, IValidateUser } from '../models';\r\n\r\ninterface IUserContext {\r\n  setUser: (user: IUser | null) => void;\r\n  user: IUser | null;\r\n  account: AccountInfo | null;\r\n  isDVM: boolean;\r\n  isDVMPending: boolean;\r\n  isDVMContractor: boolean;\r\n  isDVMEmployee: boolean;\r\n  isActive: boolean;\r\n  isSysAdmin: boolean;\r\n  isRSS: boolean;\r\n  isPracticeManager: boolean;\r\n  isFetching: boolean;\r\n  getUserInfo: any;\r\n  isUserInAnyValidRole: boolean;\r\n  isSetUp: boolean;\r\n  isDVMDeactivated: boolean;\r\n}\r\n\r\ninterface IUserContextHandlerProps {\r\n  children: React.ReactNode;\r\n}\r\n\r\nexport const UserContext = createContext<IUserContext>({\r\n  setUser: () => {},\r\n  user: null,\r\n  isDVM: false,\r\n  isDVMPending: false,\r\n  isDVMContractor: false,\r\n  isDVMEmployee: false,\r\n  isActive: false,\r\n  isSysAdmin: false,\r\n  isRSS: false,\r\n  isPracticeManager: false,\r\n  isFetching: true,\r\n  isUserInAnyValidRole: false,\r\n  getUserInfo: null,\r\n  account: null,\r\n  isSetUp: true,\r\n  isDVMDeactivated: true,\r\n});\r\n\r\nexport const UserContextHandler: FC<IUserContextHandlerProps> = ({ children }) => {\r\n  const { accounts } = useMsal();\r\n  const account = useAccount(accounts[0] ?? {});\r\n\r\n  const [user, setUser] = useState<IUser | null>(null);\r\n  const [isFetching, setFetching] = useState<boolean>(true);\r\n  const [isSetUp, setIsSetUp] = useState(true);\r\n\r\n  const getUserInfo = async () => {\r\n    setFetching(true);\r\n    if (!account) {\r\n      setFetching(false);\r\n      return;\r\n    }\r\n\r\n    try {\r\n      // Had to move this\r\n      const DVM: AxiosResponse<{ isSetUp: boolean }> = await authFetch.get('/user/IsSetUp');\r\n\r\n      setIsSetUp(DVM.data.isSetUp);\r\n\r\n      const validation: AxiosResponse<IValidateUser> = await authFetch.get('/user/validate');\r\n\r\n      // We're having some race conditions when dealing with app roles\r\n      // Information isn't propagating through azure as fast as we need it to\r\n      // so we're injecting a short delay.\r\n      if (validation.data.value.forceTokenRefresh) {\r\n        let holder: AuthenticationResult | null = null;\r\n        do {\r\n          await new Promise(res => setTimeout(res, 1000));\r\n          holder = await authFetch.forceRefresh();\r\n        } while (!holder!.idTokenClaims.hasOwnProperty('roles'));\r\n        //This is here to force the msal account to update.\r\n        // if you have a better way, do it\r\n        window.location.reload();\r\n      }\r\n\r\n      await handleSetUser({\r\n        account,\r\n        validation: {\r\n          ...validation.data,\r\n        },\r\n      });\r\n    } catch (error) {\r\n      console.error(error);\r\n    } finally {\r\n      setFetching(false);\r\n    }\r\n  };\r\n\r\n  const handleSetUser = async (user: IUser | null) => {\r\n    if (user) {\r\n      await setLocalStorage(`${token_key}`, user);\r\n      setUser(user);\r\n    } else {\r\n      await removeLocalStorage(`${token_key}`);\r\n      setUser(null);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    getUserInfo();\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [account]);\r\n\r\n  return (\r\n    // This should be where the signed in user's state lives. Testing user state should be as simple as setting these fields to true or false\r\n    <UserContext.Provider\r\n      value={{\r\n        user: user,\r\n        account: account,\r\n        setUser: handleSetUser,\r\n        isFetching,\r\n        isActive: !!user?.validation?.value?.isActive,\r\n        isDVM: !isFetching && !!user?.account.idTokenClaims?.roles?.includes('DVM'),\r\n        isDVMPending:\r\n          !!user?.account.idTokenClaims?.roles?.includes('DVM') &&\r\n          user?.validation?.value?.dvmInformation?.dvmStatus === 'Pending' &&\r\n          user?.validation?.value?.isActive,\r\n        isDVMContractor: user?.validation?.value?.dvmInformation?.dvmType === 'Contractor',\r\n        isDVMEmployee: user?.validation?.value?.dvmInformation?.dvmType === 'Employee',\r\n        isUserInAnyValidRole:\r\n          !!account?.idTokenClaims?.roles && account?.idTokenClaims?.roles?.length > 0,\r\n        isSysAdmin:\r\n          !isFetching && !!user?.account.idTokenClaims?.roles?.includes(Roles.SYSTEM_ADMIN),\r\n        isRSS: !isFetching && !!user?.account.idTokenClaims?.roles?.includes(Roles.RSS),\r\n        isPracticeManager: !isFetching && !!user?.account.idTokenClaims?.roles?.includes(Roles.PRACTICE_MANAGER),\r\n        getUserInfo: getUserInfo,\r\n        isSetUp: isSetUp,\r\n        isDVMDeactivated: user?.validation?.value?.dvmInformation?.dvmStatus === 'Deactivated',\r\n      }}\r\n    >\r\n      {children}\r\n    </UserContext.Provider>\r\n  );\r\n};\r\n","import React, { createContext, FC, ReactNode, useCallback, useContext, useMemo } from 'react';\r\nimport { useSyncState } from '../helpers';\r\n\r\ninterface ILoad {\r\n  set(key: string): void;\r\n  isLoading(keys?: string[]): boolean;\r\n  remove(key: string): void;\r\n}\r\n\r\nconst LoadContext = createContext<ILoad>(null as unknown as ILoad);\r\n\r\n/**\r\n * Designed so that multiple loader states don't have to be instantiated inside of each component.\r\n * This is designed to simplify the following scenario:\r\n * const [isLoadingThis, setIsLoadingThis] = useState<boolean>(false);\r\n * const [isLoadingThat, setIsLoadingThat] = useState<boolean>(false);\r\n * const [isLoadingTheOtherThing, setIsLoadingTheOtherThing] = useState<boolean>(false);\r\n *\r\n * Instead, you'll have a single variable that is stored in local state, is available to all components,\r\n * and manages all of your various loading elements like so:\r\n *\r\n * const load = useLoadState();\r\n *\r\n * const apiCall1 = async () => {\r\n *  load.set('apiCall1');\r\n *  await apiCall1();\r\n *  load.remove('apiCall1');\r\n * }\r\n *\r\n * const apiCall2 = async () => {\r\n *  load.set('apiCall2');\r\n *  await apiCall2();\r\n *  load.remove('apiCall2');\r\n * }\r\n *\r\n * <Loader isLoading={load.isLoading()} />\r\n *\r\n * Or check load state based on your specific key(s) (1-n keys)\r\n * <Loader isLoading={load.isLoading([ 'apiCall1', 'apiCall2', 'etc' ])} />\r\n */\r\n\r\nexport const useLoadState = (): ILoad => useContext(LoadContext);\r\n\r\nexport const LoadProvider: FC<{ children: ReactNode }> = ({ children }) => {\r\n  const loadKeys: { set: (newValue: string[]) => void; get: () => string[] } = useSyncState([]);\r\n\r\n  const set: ILoad['set'] = useCallback((key: string) => {\r\n    loadKeys?.set([ ...loadKeys?.get(), key ]);\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [loadKeys]);\r\n\r\n  const isLoading: ILoad['isLoading'] = useCallback((keys?: string[]) => {\r\n    if (keys?.length) {\r\n      return loadKeys?.get()?.some((loadKey: string) => keys?.includes(loadKey));\r\n    } else {\r\n      return !!loadKeys?.get()?.length;\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [loadKeys]);\r\n\r\n  const remove: ILoad['remove'] = useCallback((key: string) => {\r\n    loadKeys?.set(loadKeys?.get()?.filter((loadKey: string) => loadKey === key))\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [loadKeys]);\r\n\r\n  const load: ILoad = useMemo(\r\n    () => ({ set, isLoading, remove }),\r\n    [set, isLoading, remove]\r\n  );\r\n\r\n  return (\r\n    <LoadContext.Provider value={load}>\r\n      {children}\r\n    </LoadContext.Provider>\r\n  );\r\n};\r\n","import { useState } from 'react';\r\n\r\n// Ensures that state variables can always have the latest values read to mimic synchronicity;\r\n// note: will not work with truly async values, like values returning from an API response\r\nexport const useSyncState = (initialValue: any) => {\r\n  const [trait, updateTrait] = useState(initialValue);\r\n\r\n  let current = trait;\r\n\r\n  const get = () => current;\r\n\r\n  const set = (newValue: any) => {\r\n    current = newValue;\r\n    updateTrait(newValue);\r\n    return current;\r\n  }\r\n\r\n  return {\r\n    get,\r\n    set,\r\n  }\r\n};\r\n","import React, { createContext, Dispatch, FC, SetStateAction, useMemo, useState } from 'react';\r\nimport { theme } from '../styles';\r\nimport { useMediaQuery } from '@mui/material';\r\nimport { SIDENAV_WIDTH_EXPANDED, SIDENAV_WIDTH_COLLAPSED } from '../components';\r\n\r\ninterface INavContext {\r\n  isExpanded: boolean;\r\n  setIsExpanded: Dispatch<SetStateAction<boolean>>;\r\n  sideNavWidth: number;\r\n}\r\n\r\ninterface INavContextHandlerProps {\r\n  children: React.ReactNode;\r\n}\r\n\r\nexport const NavContext = createContext<INavContext>({\r\n  isExpanded: false,\r\n  setIsExpanded: () => {},\r\n  sideNavWidth: 0,\r\n});\r\n\r\nexport const NavContextHandler: FC<INavContextHandlerProps> = ({ children }) => {\r\n  const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n  const isMobile = useMediaQuery(`(max-width: ${theme.breakpoints.values.mobile}px)`);\r\n\r\n  const sideNavWidth = useMemo(() => {\r\n    if (isExpanded && isMobile) {\r\n      // Show Icons and Labels\r\n      return SIDENAV_WIDTH_EXPANDED;\r\n    }\r\n    if (isExpanded) {\r\n      // Show Icons and Labels\r\n      return SIDENAV_WIDTH_EXPANDED;\r\n    } else if (!isExpanded) {\r\n      // Only show Icons\r\n      return SIDENAV_WIDTH_COLLAPSED;\r\n    } else {\r\n      // Hide completely\r\n      return 0;\r\n    }\r\n  }, [isExpanded, isMobile]);\r\n\r\n  return (\r\n    <NavContext.Provider\r\n      value={{\r\n        isExpanded,\r\n        setIsExpanded,\r\n        sideNavWidth,\r\n      }}\r\n    >\r\n      {children}\r\n    </NavContext.Provider>\r\n  );\r\n};\r\n","import React, { FC, useContext } from 'react';\r\nimport { Redirect, Route, RouteProps } from 'react-router-dom';\r\nimport { UserContext } from '../../context';\r\n\r\nexport interface IPrivateRoute extends RouteProps {\r\n  allowedRoles?: string[];\r\n  redirectTo?: string;\r\n}\r\nexport const PrivateRoute: FC<IPrivateRoute> = (props: IPrivateRoute) => {\r\n  const { user, isFetching } = useContext(UserContext);\r\n  if (isFetching) {\r\n    return null;\r\n  }\r\n\r\n  if (!user && !isFetching) {\r\n    return <Redirect to={`/${props.redirectTo ?? 'not-found'}`} />;\r\n  }\r\n\r\n  if (user?.account.idTokenClaims?.roles?.some(role => props.allowedRoles?.includes(role))) {\r\n    return <Route {...props} />;\r\n  }\r\n  return <Redirect to={`/${props.redirectTo ?? 'not-found'}`} />;\r\n};\r\n","import { Typography, Grid } from '@mui/material';\r\nimport CircularProgress, { CircularProgressProps } from '@mui/material/CircularProgress';\r\nimport { alpha, Theme } from '@mui/material/styles';\r\nimport { createStyles, makeStyles } from '@mui/styles';\r\nimport clsx from 'clsx';\r\nimport React, { FC } from 'react';\r\n\r\ninterface IHeaderLoader {\r\n  loaderWrapperClassName?: string;\r\n  position?: 'centered' | 'left' | 'top-center';\r\n  size?: 'small' | 'medium' | 'large';\r\n  subtitle?: string;\r\n  title?: string;\r\n  topOffset?: number;\r\n  type?: 'fullscreen' | 'inline' | 'overlay';\r\n  loadingText?: string;\r\n}\r\n\r\ntype ILoader = IHeaderLoader & Omit<CircularProgressProps, 'variant'>;\r\n\r\n/**\r\n * A presentational CircularProgress indicator.\r\n *\r\n * @usage\r\n * ```TypeScript\r\n * const Component: FC = () => {\r\n *   const [isLoading, setIsLoading] = useState(true);\r\n *   const [resources, setResources] = useState<Resource[]>([]);\r\n *   useEffect(() => {\r\n *     fetchResource().then(x => setResource(x)).finally(() => setIsLoading(false));\r\n *   }, []);\r\n *   if (isLoading) return <Loader title=\"Loading xyz data...\" />;\r\n *   return <div> ... </div>;\r\n * };\r\n * ```\r\n */\r\nexport const HeaderLoader: FC<ILoader> = ({\r\n  children,\r\n  loaderWrapperClassName = '',\r\n  subtitle,\r\n  title,\r\n  loadingText = 'Loading...',\r\n  ...props\r\n}) => {\r\n  const classes = useStyles(props);\r\n  return (\r\n    <div className={classes.container}>\r\n      {title && (\r\n        <>\r\n          <Typography className={classes.headerText} variant=\"h2\">\r\n            {title}\r\n          </Typography>\r\n          <hr />\r\n        </>\r\n      )}\r\n      {subtitle && <Grid className={classes.subtitleText}>{subtitle}</Grid>}\r\n      <div\r\n        className={clsx(classes.loader, loaderWrapperClassName)}\r\n        data-testid={props.id}\r\n        role=\"alert\"\r\n      >\r\n        <div className={classes.inner}>\r\n          <CircularProgress\r\n            {...props}\r\n            className={clsx(classes.progress, props.className)}\r\n            size={props.size === 'large' ? 18 : props.size === 'small' ? 10 : 14}\r\n            variant=\"indeterminate\"\r\n          />\r\n          <div className={classes.text}>\r\n            {children}\r\n            {!children && (\r\n              <>\r\n                <Typography className={classes.title} variant=\"body1\">\r\n                  {loadingText}\r\n                </Typography>\r\n              </>\r\n            )}\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst useStyles = makeStyles<Theme, ILoader>((theme: Theme) => {\r\n  return createStyles({\r\n    container: {\r\n      padding: theme.spacing(3),\r\n    },\r\n    headerText: { position: 'relative', zIndex: 1502, color: theme.palette.common.black },\r\n    subtitleText: { position: 'relative', zIndex: 1502 },\r\n    inner: {\r\n      alignItems: 'center',\r\n      display: 'flex',\r\n      flexShrink: 1,\r\n      flexWrap: 'wrap',\r\n      justifyContent: props =>\r\n        props.position === 'top-center'\r\n          ? 'center'\r\n          : props.position === 'centered'\r\n          ? 'center'\r\n          : 'flex-start',\r\n      marginTop: props => props.topOffset && props.topOffset + '%',\r\n      width: '100%',\r\n    },\r\n    loader: {\r\n      alignItems: props => (props.position === 'centered' ? 'center' : 'flex-start'),\r\n      backgroundColor: props =>\r\n        props.type === 'fullscreen' || props.type === 'overlay'\r\n          ? alpha(theme.palette.background.paper, 0.75)\r\n          : '',\r\n      bottom: 0,\r\n      display: 'flex',\r\n      fontSize: props =>\r\n        props.size === 'large' ? '1.25rem' : props.size === 'small' ? '0.875rem' : '1rem',\r\n      height: props => (props.position === 'centered' ? '100%' : 'auto'),\r\n      left: 0,\r\n      position: props =>\r\n        props.type === 'fullscreen' ? 'fixed' : props.type === 'overlay' ? 'absolute' : 'static',\r\n      right: 0,\r\n      top: 0,\r\n      width: '100%',\r\n      zIndex: theme.zIndex.tooltip + 1,\r\n    },\r\n    progress: {\r\n      color: theme.palette.primary.main,\r\n      margin: theme.spacing(0, 1, 0, 0),\r\n    },\r\n    subtitle: {\r\n      color: theme.palette.grey[800],\r\n      fontSize: props =>\r\n        props.size === 'large' ? '0.875rem' : props.size === 'small' ? '0.625rem' : '0.75rem',\r\n      margin: theme.spacing(0.25, 0, 0),\r\n      textTransform: 'uppercase',\r\n    },\r\n    text: {\r\n      maxWidth: 230, // this is needed for long subtitles (to force that text to wrap)\r\n    },\r\n    title: {\r\n      color: theme.palette.primary.main,\r\n      fontSize: props =>\r\n        props.size === 'large' ? '1.25rem' : props.size === 'small' ? '0.875rem' : '1rem',\r\n      margin: 0,\r\n    },\r\n  });\r\n});\r\n","import { Component, ErrorInfo, ReactNode } from 'react';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\nimport { logError } from '../../services';\r\n\r\ninterface Props extends RouteComponentProps {\r\n  children?: ReactNode;\r\n}\r\n\r\ninterface State {\r\n  hasError: boolean;\r\n  error: string;\r\n}\r\n\r\nclass ErrorBoundary extends Component<Props, State> {\r\n  public state: State = {\r\n    hasError: false,\r\n    error: '',\r\n  };\r\n\r\n  public static getDerivedStateFromError(error: Error): State {\r\n    // Update state so the next render will show the fallback UI.\r\n    return { hasError: true, error: error.message };\r\n  }\r\n\r\n  public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\r\n    // Log the error to app insights.\r\n    logError(error, 'React Render Error');\r\n    // This should provide the component stack trace for the above error.\r\n    logError(errorInfo, 'React Render Error Info');\r\n    this.setState({ error: error.message });\r\n  }\r\n\r\n  public render() {\r\n    if (this.state.hasError) {\r\n      this.setState({ hasError: false });\r\n      this.props.history.push('/error', { error: this.state.error });\r\n    }\r\n\r\n    return this.props.children;\r\n  }\r\n}\r\n\r\nexport default withRouter(ErrorBoundary);\r\n","import { FC } from 'react';\r\nimport { Page } from '../../components';\r\nimport { Grid, Link } from '@mui/material';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nexport const ErrorPage: FC = () => {\r\n  const history = useHistory();\r\n  //@ts-ignore\r\n  const errorMessage = history.location.state?.error;\r\n  return (\r\n    <Page title={'Something went wrong'}>\r\n      <Grid container spacing={3}>\r\n        <Grid item>\r\n          {errorMessage\r\n            ? errorMessage\r\n            : 'This page has encountered an error and it has been logged into our system. Please return to the home page or try again.'}{' '}\r\n          If you continue to experience problems, contact{' '}\r\n          <Link href=\"mailto:relief@vetcher.com\">\r\n            relief@vetcher.com\r\n          </Link>\r\n        </Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n","import { FC, useContext, useEffect, useState } from 'react';\r\nimport { Loader, Page } from '../../components';\r\nimport { Grid } from '@mui/material';\r\nimport { useSnackbar } from 'notistack';\r\nimport { useMsal } from '@azure/msal-react';\r\nimport { setTimeout } from 'timers';\r\nimport { verifyPendingEmail } from '../../fetch';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { UserContext } from '../../context/user';\r\n\r\nexport const VerifyEmail: FC = () => {\r\n  const { enqueueSnackbar } = useSnackbar();\r\n\r\n  const location = useLocation();\r\n  const queryParameters = new URLSearchParams(location.search);\r\n  const [isVerifyingEmail, setIsVerifyingEmail] = useState(true);\r\n\r\n  const { instance } = useMsal();\r\n  const [errorMessage, setErrorMessage] = useState('');\r\n\r\n  const { isDVM } = useContext(UserContext);\r\n  const verifyEmail = async (dvmId: string, email: string, code: string) => {\r\n    try {\r\n      setIsVerifyingEmail(true);\r\n\r\n      await verifyPendingEmail(dvmId, email, code);\r\n      enqueueSnackbar(`Email successfully updated!`, {\r\n        variant: 'success',\r\n      });\r\n      if (isDVM) {\r\n        setTimeout(() => {\r\n          instance.logoutRedirect();\r\n        }, 5000);\r\n      }\r\n    } catch (error: any) {\r\n      const errorMessage = error?.response?.data?.Detail;\r\n      console.log('Error verifying email: ', errorMessage ?? error.message ?? error);\r\n      setErrorMessage(errorMessage ?? 'Email was not updated.');\r\n      enqueueSnackbar(errorMessage ?? `Email was not updated.`, {\r\n        variant: 'error',\r\n      });\r\n    } finally {\r\n      setIsVerifyingEmail(false);\r\n    }\r\n  };\r\n\r\n  const email = queryParameters.get('email')?.toString();\r\n  const code = queryParameters.get('code')?.toString();\r\n  const dvmId = queryParameters.get('dvmId')?.toString();\r\n  useEffect(() => {\r\n    if (email && code && dvmId) {\r\n      verifyEmail(dvmId ?? '', email ?? '', code ?? '');\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [email, code, dvmId]);\r\n\r\n  return (\r\n    <Page title={'Verify Email'}>\r\n      <Grid container spacing={3}>\r\n        {isVerifyingEmail && <Loader position=\"centered\" type=\"fullscreen\" />}\r\n        <Grid item>{'Please wait while we verify your email.' || errorMessage}</Grid>\r\n      </Grid>\r\n    </Page>\r\n  );\r\n};\r\n","import { InteractionType } from '@azure/msal-browser';\r\nimport { MsalAuthenticationTemplate } from '@azure/msal-react';\r\nimport { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';\r\nimport { FC, useEffect, useContext } from 'react';\r\nimport ReactGA from 'react-ga4';\r\nimport { BrowserRouter as Router, Route, Switch, useHistory, useLocation } from 'react-router-dom';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport { Error } from '@mui/icons-material';\r\nimport Slide from '@mui/material/Slide';\r\nimport { UserContextHandler, LoadProvider, NavContextHandler, UserContext } from './context';\r\nimport {\r\n  Home,\r\n  ReliefScheduling,\r\n  FTScheduling,\r\n  PendingPayments,\r\n  Locations,\r\n  LocationsDetails,\r\n  Dvms,\r\n  DvmPending,\r\n  NotFound,\r\n  Holidays,\r\n  DvmDetails,\r\n  Users,\r\n  Activity,\r\n  EntityManagement,\r\n  DvmDisabled,\r\n  PrivacyPolicy,\r\n  TermsAndConditions,\r\n} from './pages';\r\nimport { theme } from './styles';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers';\r\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\r\nimport { PrivateRoute } from './components/skeleton/private-route';\r\nimport { Roles, Paths } from './constants';\r\nimport { Loader } from './components';\r\nimport buildSettings from './buildSettings.json';\r\nimport { LoadScript } from '@react-google-maps/api';\r\nimport { HeaderLoader } from './components/loader/header-loader';\r\nimport ErrorBoundary from './components/error-handling/error-boundary';\r\nimport { ErrorPage } from './pages/error';\r\nimport { VerifyEmail } from './pages/verify-email/verify-email';\r\nimport { QueryClient, QueryClientProvider } from 'react-query';\r\n\r\nconst { REACT_APP_GA_TRACKING } = require('./buildSettings.json');\r\n\r\ndeclare global {\r\n  interface Window {\r\n    ga: any;\r\n  }\r\n}\r\n\r\nconst initializeGoogleAnalytics = () => {\r\n  if (!window.ga && REACT_APP_GA_TRACKING) {\r\n    ReactGA.initialize(REACT_APP_GA_TRACKING, {\r\n      gtagOptions: {\r\n        titleCase: false,\r\n      },\r\n    });\r\n  }\r\n};\r\n\r\n// define public facing paths\r\nconst publicPaths = ['/privacy-policy', '/terms-and-conditions'];\r\n\r\nconst AuthWrapper: React.FC = ({ children }) => {\r\n  const location = useLocation();\r\n  // Check if the current route is one of the public paths\r\n  const isPublicRoute = publicPaths.includes(location.pathname);\r\n\r\n  if (isPublicRoute) {\r\n    return <>{children}</>; // Render children without authentication wrapper\r\n  }\r\n\r\n  return (\r\n    <MsalAuthenticationTemplate\r\n      interactionType={InteractionType.Redirect}\r\n      errorComponent={ErrorPage}\r\n    >\r\n      {children}\r\n    </MsalAuthenticationTemplate>\r\n  );\r\n};\r\n\r\nexport const App: FC = () => {\r\n  useEffect(() => {\r\n    initializeGoogleAnalytics();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    //@ts-ignore TypeScript is complaining, but this is the best fix I've found so far. More info => https://github.com/facebook/create-react-app/issues/11771#issuecomment-1059644333\r\n    window.process = { ...window.process };\r\n  }, []);\r\n\r\n  // Create a client\r\n  const queryClient = new QueryClient({\r\n    defaultOptions: {\r\n      queries: {\r\n        cacheTime: 0, // no caching of api calls,\r\n        retry: false, // no retry on failed api calls\r\n        retryOnMount: false, // the query will not be retried on mount if it contains an error\r\n        staleTime: Infinity, // no caching of api calls\r\n        refetchOnMount: false, // the query will not refetch on mount.\r\n        refetchOnWindowFocus: false, // the query will not refetch on window focus.\r\n      },\r\n    },\r\n  });\r\n\r\n  return (\r\n    <StyledEngineProvider injectFirst>\r\n      <ThemeProvider theme={theme}>\r\n        <Router>\r\n          <QueryClientProvider client={queryClient}>\r\n            <ErrorBoundary>\r\n              <AuthWrapper>\r\n                <LoadProvider>\r\n                  <LocalizationProvider dateAdapter={AdapterDateFns}>\r\n                    <NavContextHandler>\r\n                      <UserContextHandler>\r\n                        {/* @ts-ignore - This solves the type problem and won't break on the next install (suggested solution is to manually change the installed package), but this documents the reason this is throwing an error => https://github.com/iamhosseindhv/notistack/issues/485#issuecomment-1128778222 */}\r\n                        <SnackbarProvider\r\n                          iconVariant={{\r\n                            error: <Error style={{ marginRight: '5px' }} />,\r\n                          }}\r\n                          maxSnack={3}\r\n                          anchorOrigin={{\r\n                            vertical: 'bottom',\r\n                            horizontal: 'center',\r\n                          }}\r\n                          TransitionComponent={Slide}\r\n                          dense={false}\r\n                        >\r\n                          <LoadScript\r\n                            loadingElement={<Loader position=\"centered\" type=\"fullscreen\" />}\r\n                            googleMapsApiKey={`${buildSettings.REACT_APP_GOOGLE_KEY}`}\r\n                          >\r\n                            <Routes />\r\n                          </LoadScript>\r\n                        </SnackbarProvider>\r\n                      </UserContextHandler>\r\n                    </NavContextHandler>\r\n                  </LocalizationProvider>\r\n                </LoadProvider>\r\n              </AuthWrapper>\r\n            </ErrorBoundary>\r\n          </QueryClientProvider>\r\n        </Router>\r\n      </ThemeProvider>\r\n    </StyledEngineProvider>\r\n  );\r\n};\r\n\r\nconst Routes: FC = () => {\r\n  const history = useHistory();\r\n  const currentRoute = useLocation();\r\n  const {\r\n    user,\r\n    isDVM,\r\n    isDVMPending,\r\n    isUserInAnyValidRole,\r\n    isActive,\r\n    account,\r\n    isFetching,\r\n    isSysAdmin,\r\n    isSetUp,\r\n    isDVMDeactivated,\r\n  } = useContext(UserContext);\r\n\r\n  // Redirects based on the User's Roles and Privileges\r\n  useEffect(() => {\r\n    // Avoid redirection for public routes\r\n    if (publicPaths.includes(currentRoute.pathname)) {\r\n      return;\r\n    }\r\n    // If the user is not in a valid role or not active, redirect to the 404 page\r\n    if ((!isUserInAnyValidRole || !isActive) && !isFetching) {\r\n      history.push(Paths.NOT_FOUND);\r\n    } else {\r\n      if (isDVM) {\r\n        if (isDVMDeactivated) {\r\n          history.push(Paths.DVM_DEACTIVATED);\r\n        } else if (isDVMPending) {\r\n          // If the user is a DVM with Pending status, redirect to the Pending DVM page\r\n          history.push(Paths.DVM_PENDING);\r\n        } else if (\r\n          user?.validation?.value?.dvmInformation?.dvmType === 'Employee' &&\r\n          user?.validation?.value?.dvmInformation?.dvmStatus === 'Active' &&\r\n          currentRoute.pathname === Paths.HOME &&\r\n          !isSysAdmin\r\n        ) {\r\n          // If user is Active DVM Employee and not a SysAdmin and we are on the home page, redirect them to their profile.\r\n          history.push(Paths.DVM_PROFILE);\r\n        } else {\r\n          return;\r\n        }\r\n      } else {\r\n        return;\r\n      }\r\n    }\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [user, account, isFetching]);\r\n\r\n  if (isFetching && isSetUp) {\r\n    return <Loader position=\"centered\" type=\"fullscreen\" />;\r\n  }\r\n  // isFetching && isDVM && !isSetUp\r\n  if (isFetching && !isSetUp) {\r\n    return (\r\n      <HeaderLoader\r\n        title=\"Registration In Progress\"\r\n        subtitle=\"Please wait while we setup your account for the first time. This may take a couple minutes.\"\r\n        position=\"centered\"\r\n        type=\"fullscreen\"\r\n      />\r\n    );\r\n  }\r\n\r\n  return (\r\n    <Switch>\r\n      <Route exact path={'/'} component={Home} />\r\n      <Route exact path={'/not-found'} component={NotFound} />\r\n      <Route exact path={'/error'} component={ErrorPage} />\r\n      <Route exact path={'/privacy-policy'} component={PrivacyPolicy} />\r\n      <Route exact path={'/terms-and-conditions'} component={TermsAndConditions} />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.DVM]}\r\n        path={'/verify-email'}\r\n        component={VerifyEmail}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.DVM]}\r\n        path={'/dvm-pending'}\r\n        component={DvmPending}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.DVM]}\r\n        path={'/dvm-deactivated'}\r\n        component={DvmDisabled}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS]}\r\n        path={'/relief-scheduling'}\r\n        component={ReliefScheduling}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[\r\n          Roles.SYSTEM_ADMIN,\r\n          Roles.PRACTICE_MANAGER,\r\n          Roles.OPERATIONS_MANAGER,\r\n          Roles.RSS,\r\n        ]}\r\n        path={'/ft-scheduling'}\r\n        component={FTScheduling}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[\r\n          Roles.SYSTEM_ADMIN,\r\n          Roles.PRACTICE_MANAGER,\r\n          Roles.OPERATIONS_MANAGER,\r\n          Roles.RSS,\r\n        ]}\r\n        path={'/pending-payments'}\r\n        component={PendingPayments}\r\n      />\r\n      <PrivateRoute exact allowedRoles={[Roles.DVM]} path={'/profile'} component={DvmDetails} />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS, Roles.PRACTICE_MANAGER]}\r\n        path={'/locations'}\r\n        component={Locations}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS, Roles.PRACTICE_MANAGER]}\r\n        path={'/locations/:locationId'}\r\n        component={LocationsDetails}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS, Roles.PRACTICE_MANAGER]}\r\n        path={'/locations/new-location'}\r\n        component={LocationsDetails}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN]}\r\n        path={'/legal-entities'}\r\n        component={EntityManagement}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS]}\r\n        path={'/dvms'}\r\n        component={Dvms}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS]}\r\n        path={'/dvms/:dvmId'}\r\n        component={DvmDetails}\r\n      />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN, Roles.RSS]}\r\n        path={'/holidays'}\r\n        component={Holidays}\r\n      />\r\n      <PrivateRoute exact allowedRoles={[Roles.SYSTEM_ADMIN]} path={'/users'} component={Users} />\r\n      <PrivateRoute\r\n        exact\r\n        allowedRoles={[Roles.SYSTEM_ADMIN]}\r\n        path={'/activity'}\r\n        component={Activity}\r\n      />\r\n      <Route exact component={NotFound} />\r\n    </Switch>\r\n  );\r\n};\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n  if (onPerfEntry && onPerfEntry instanceof Function) {\r\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n      getCLS(onPerfEntry);\r\n      getFID(onPerfEntry);\r\n      getFCP(onPerfEntry);\r\n      getLCP(onPerfEntry);\r\n      getTTFB(onPerfEntry);\r\n    });\r\n  }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import { PublicClientApplication } from '@azure/msal-browser';\r\nimport { MsalProvider } from '@azure/msal-react';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport './index.css';\r\nimport { App } from './App';\r\nimport { msalConfig } from './authConfig';\r\nimport reportWebVitals from './reportWebVitals';\r\n\r\n/**\r\n * MSAL should be instantiated outside of the component tree to prevent it from being re-instantiated on re-renders.\r\n * For more, visit: https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/docs/getting-started.md\r\n */\r\nexport const msalInstance = new PublicClientApplication(msalConfig);\r\n\r\n// Account selection logic is app dependent. Adjust as needed for different use cases.\r\nconst accounts = msalInstance.getAllAccounts();\r\n\r\nif (accounts.length > 0) {\r\n  msalInstance.setActiveAccount(accounts[0]);\r\n}\r\n\r\nReactDOM.render(\r\n  <React.StrictMode>\r\n    <MsalProvider instance={msalInstance}>\r\n      <App />\r\n    </MsalProvider>\r\n  </React.StrictMode>,\r\n  document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}