{"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":""}