{"version":3,"sources":["services/api.js","data-model/config.js","utils/index.js","components/TabletAndMobileView/TabletAndMobileView.js","components/TabletAndMobileView/index.js","components/DesktopView/DesktopView.js","components/DesktopView/index.js","components/InputItem/InputItem.js","components/InputItem/index.js","components/RadioCard/RadioCard.js","components/RadioCard/index.js","components/VirtualizedList/VirtualizedList.js","components/Loader/Loader.js","components/Loader/index.js","components/OrderForm/OrderForm.js","components/OrderForm/index.js","App.js","index.js"],"names":["_URL","window","location","hostname","constructor","getData","async","startDate","endDate","fullURL","concat","res","fetch","method","headers","ok","Error","status","json","getPrices","ids","getContacts","searchStr","requestForm","body","JSON","stringify","data","groups","id","value","title","transformSelectedItems","arr","date","prices","map","item","price","TimeSlotId","filter","priceItem","locationInfo","Title","parseInt","StartTime","Price","PricingType","Date","format","EndTime","Resources","Id","Name","TimeSlotFixReducer","available","split","Status","titleArray","resourceNumber","length","isNaN","PriceFixReducer","StandardPrice","StandardPriceStr","useStyles","makeStyles","headerTop","display","headerTopLeft","justifyContent","alignItems","width","padding","border","borderBottom","headerTopRight","borderLeft","textAlign","headerBottom","headerBottomLeft","background","headerBottomRight","itemsContainer","itemsSidebar","borderTop","itemsContent","select","fontFamily","fontSize","lineHeight","borderBottomColor","menuItem","calendarInput","inputRoot","underline","transition","borderColor","popoverRoot","maxWidth","minWidth","color","selectUnderline","formBtn","position","top","right","transform","TabletAndMobileView","props","to","from","maxDate","currentDate","selectedItems","handleOpenModal","handleDateChange","handleSelectedItems","classes","currentGroup","setCurrentGroup","useState","serviceGroups","timeSlotMap","Map","forEach","key","get","group","find","push","set","sort","a","b","currentGroupItems","timeMap","results","idx","keys","items","activeSlots","timeMapItem","ct","today","moment","isAfter","isSame","isSlotActive","text","isItemSelected","selectedItem","React","createElement","className","style","onClick","KeyboardDatePicker","autoOk","disablePast","onChange","shouldDisableDate","day","variant","InputProps","root","PopoverProps","paper","disableToolbar","Select","event","target","MenuItem","Button","borderRight","itemsRoot","flexDirection","itemsSideBar","icons","borderRadius","opacity","dataText","todayButton","marginLeft","headerTopRightContainer","paddingRight","rowRight","DesktopView","isToday","setPrevDay","setNextDay","setTodayDay","s","timeMapItems","values","pickedSlot","cursor","createSlots","marginRight","IconButton","disabled","NavigateBeforeIcon","Typography","isSameOrAfter","NavigateNextIcon","times","i","t","createTimeLine","InputItem","_ref","label","name","component","hint","validate","inputWrapper","inputLabel","htmlFor","inputItem","inputHint","Field","Object","assign","autoComplete","inputStyle","resize","theme","itemCard","margin","itemCardHeader","radio","radioChecked","formControlLabel","formControlLabelRoot","flexBasis","cardHeaderTitle","fontWeight","textTransform","cardDateTitle","closeBtn","radioGroup","itemCardContainer","flexWrap","breakpoints","down","RadioCard","config","removeSelectedItem","arrayHelpers","orderInfo","reduce","c","Cost","index","splice","join","el","remove","CloseIcon","RadioGroup","e","setFieldValue","FormControlLabel","control","Radio","checked","PriceRepresentation","option","createFilterOptions","matchFrom","Fields","lastname","firstname","renderRow","cloneElement","overflow","textOverflow","whiteSpace","forwardRef","ref","children","other","useTheme","smUp","useMediaQuery","up","itemCount","Array","isArray","itemSize","outerElementType","useMemo","props2","ref2","FixedSizeList","height","Math","min","maxHeight","itemData","innerElementType","overscanCount","Loader","left","outline","overflowY","cardContent","header","actions","paddingLeft","inputRow","marginBottom","textItem","textareaLabel","textareaItem","error","lastNameError","paddingTop","submit","formControlLabelCheckbox","progress","disabledSubmitButton","customGridContainer","customGridItem","paddingBottom","gridRadioContainer","gridRadio","cardHeaderAction","marginTop","closeButton","cardHeaderRoot","ValidationSchema","Yup","shape","lastName","required","firstName","number","charAt","substr","matches","sendEmail","email","responseMsg","OrderForm","openModal","handleCloseModal","fetchData","removeAllSelectedItems","setPrices","setRequestForm","enqueueSnackbar","closeSnackbar","useSnackbar","responseAction","useEffect","selectedItemsID","api","then","Prices","Modal","onClose","open","Card","clsx","Formik","initialValues","company","sendSms","additionalInformation","ReserveOwner","validationSchema","onSubmit","formData","success","autoHideDuration","anchorOrigin","vertical","horizontal","action","Form","CardHeader","Divider","CardContent","Grid","container","spacing","lg","xs","errors","onBlur","handleBlur","validateField","FieldArray","render","CardActions","CircularProgress","size","isValid","type","App","setData","loading","setLoading","setCurrentDate","prevDate","setPrevDate","setSelectedItems","setOpenModal","isTabletOrMobileDevice","query","useCallback","cloneCurrentDate","clone","add","mounted","zIndex","bottom","curDate","fullData","isDateEqual","rest","prevItems","MuiPickersUtilsProvider","utils","MomentUtils","SnackbarProvider","ReactDOM","document","getElementById"],"mappings":"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","file":"static/js/main.2a0509ec.chunk.js","sourcesContent":["const productionEnv = window.location.hostname === 'hcrcalendar.varaa.online';\r\nlet _URL = productionEnv ? 'https://harraste.varaa.online/Free' : 'https://holidayclub-qa.azurewebsites.net/Free';\r\n\r\nclass Api {\r\n    getData = async (startDate, endDate) => {\r\n        const fullURL = `${_URL}/Reservation/Calendar?startDate=${startDate}&endDate=${endDate}`;\r\n\r\n        const res = await fetch(fullURL, {\r\n            method: 'GET',\r\n            headers: {\r\n                'Accept': 'application/json',\r\n                'Content-Type': 'application/json',\r\n                'cache-control': 'no-cache',\r\n            }\r\n        });\r\n\r\n        if (!res.ok) {\r\n            throw new Error(`Couldn't fetch ${fullURL}, received ${res.status}`)\r\n        }\r\n\r\n        return await res.json();\r\n    }\r\n\r\n    getPrices = async (ids) => {\r\n        const fullURL = `${_URL}/Prices?timeSlotIds=${ids}`;\r\n\r\n        const res = await fetch(fullURL, {\r\n            method: 'GET',\r\n            headers: {\r\n                'Accept': 'application/json',\r\n                'Content-Type': 'application/json',\r\n                'cache-control': 'no-cache',\r\n            }\r\n        });\r\n\r\n        if (!res.ok) {\r\n            throw new Error(`Couldn't fetch ${fullURL}, received ${res.status}`)\r\n        }\r\n\r\n        return await res.json();\r\n    }\r\n\r\n    getContacts = async (searchStr) => {\r\n        const fullURL = `${_URL}/Contact?name=${searchStr}`;\r\n\r\n        const res = await fetch(fullURL, {\r\n            method: 'GET',\r\n            headers: {\r\n                'Accept': 'application/json',\r\n                'Content-Type': 'application/json',\r\n                'cache-control': 'no-cache',\r\n            }\r\n        });\r\n\r\n        if (!res.ok) {\r\n            throw new Error(`Couldn't fetch ${fullURL}, received ${res.status}`)\r\n        }\r\n\r\n        return await res.json();\r\n    }\r\n\r\n    requestForm = async (data) => {\r\n        const fullURL = `${_URL}/Reservation/Reserve`;\r\n\r\n        const res = await fetch(fullURL, {\r\n            method: 'POST',\r\n            headers: {\r\n                'Accept': 'application/json',\r\n                'Content-Type': 'application/json',\r\n                'cache-control': 'no-cache',\r\n            },\r\n            body: JSON.stringify(data)\r\n        })\r\n\r\n        if (!res.ok) {\r\n            throw new Error(`Couldn't send ${fullURL}, received ${res.status}`)\r\n        }\r\n\r\n        return await res.json();\r\n    }\r\n}\r\n\r\nexport default new Api();","const groups = [\r\n  {id: 1, value: 'Keilailu', title: 'Keilarata'},\r\n  {id: 2, value: 'Squash', title: 'Squashkenttä'},\r\n  {id: 3, value: 'Sulkapallo', title: 'Sulkapallokenttä'},\r\n  {id: 4, value: 'Tennis', title: 'Tenniskenttä'},\r\n  {id: 5, value: 'Padel outside', title: 'Padel-ulkokenttä'},\r\n  {id: 6, value: 'Outdoor Tennis', title: 'Padel-sisäkenttä'},\r\n  // {id: 6, value: 'Fatbike', title: 'Fatbikes'},\r\n  // {id: 7, value: 'E-Fatbike', title: 'E-Fatbikes'},\r\n  // {id: 8, value: 'Tennistykki', title: 'Tennistykki'},\r\n  {id: 9, value: 'Golfsimulaattori', title: 'Golfsimulaattori'},\r\n  // {id: 10, value: 'Pickleball', title: 'Pickleball'},\r\n  // {id: 11, value: 'Jopo 1', title: 'Jopo 1'},\r\n  // {id: 12, value: 'Jopo 2', title: 'Jopo 2'},\r\n  // {id: 13, value: 'Jopo 3', title: 'Jopo 3'},\r\n  // {id: 14, value: 'Jopo 4', title: 'Jopo 4'},\r\n  // {id: 15, value: 'Jopo 5', title: 'Jopo 5'},\r\n  // {id: 16, value: 'Jopo 6', title: 'Jopo 6'},\r\n  // {id: 17, value: 'Jopo 7', title: 'Jopo 7'},\r\n  // {id: 18, value: 'Jopo 8', title: 'Jopo 8'},\r\n  // {id: 19, value: 'Jopo 9', title: 'Jopo 9'},\r\n  // {id: 20, value: 'Jopo 10', title: 'Jopo 10'},\r\n  // {id: 21, value: 'Jopo 11', title: 'Jopo 11'},\r\n  // {id: 22, value: 'Jopo 12', title: 'Jopo 12'},\r\n  // {id: 23, value: 'Jopo 13', title: 'Jopo 13'},\r\n  // {id: 24, value: 'Jopo 14', title: 'Jopo 14'},\r\n  // {id: 25, value: 'Jopo 15', title: 'Jopo 15'},\r\n  // {id: 26, value: 'Jopo', title: 'Jopo'},\r\n];\r\n\r\nexport {groups};\r\n","import {func} from 'prop-types';\r\n\r\nfunction transformSelectedItems(arr, date, prices) {\r\n    return arr.map(item => {\r\n        const [price] = prices['Prices'][item.TimeSlotId].filter((priceItem) => {\r\n            if (item.locationInfo.Title === 'Padel outside') {\r\n                if (parseInt(item.StartTime) < 15) {\r\n                    return priceItem.Price === 26;\r\n                }\r\n\r\n                return priceItem.Price === 30;\r\n            }\r\n\r\n            return priceItem.PricingType === 'Hinta';\r\n        });\r\n        return {\r\n            \"TimeSlotId\": item.TimeSlotId,\r\n            \"Date\": item.Date || date.format('YYYY-MM-DDT00:00:00'),\r\n            \"StartTime\": item.StartTime,\r\n            \"EndTime\": item.EndTime,\r\n            \"ResourceId\": item.Resources[0].Id,\r\n            \"Cost\": `${price.Price} ${price.PricingType}`,\r\n            \"Resources\": [\r\n                {\r\n                    \"Id\": item.Resources[0].Id,\r\n                    \"Name\": item.Resources[0].Name,\r\n                }\r\n            ],\r\n            \"locationInfo\": {\r\n                \"id\": item.locationInfo[\"Id\"],\r\n                \"address\": \"\",\r\n                \"title\": item.locationInfo[\"Title\"]\r\n            },\r\n            \"ReserveOwner\": \"\"\r\n        }\r\n    })\r\n}\r\n\r\nfunction TimeSlotFixReducer(item) {\r\n    item.available = true;\r\n\r\n    if (item.locationInfo.Title === 'Outdoor Tennis' && item.Resources[0].Name === 'Padel-sisäkenttä 2') {\r\n        item.available = false\r\n    }\r\n\r\n    if (item.Resources[0].Name.split(' ')[0] === 'E-Fatbike') {\r\n        item.locationInfo.Title = 'E-Fatbike'\r\n    }\r\n\r\n    if (item.Resources[0].Name === 'Pickleball') {\r\n        if (parseInt(item.StartTime) > 21) {\r\n            item.Status = 2\r\n        }\r\n    }\r\n\r\n    if (item.locationInfo.Title === 'Squash') {\r\n        const titleArray = item.Resources[0].Name.split(' ');\r\n        const resourceNumber = parseInt(titleArray[titleArray.length - 1], 10);\r\n        if (!isNaN(resourceNumber) && resourceNumber > 1) {\r\n            item.Status = 2\r\n        }\r\n    }\r\n\r\n    if (item.locationInfo.Title === 'Tennis') {\r\n        const titleArray = item.Resources[0].Name.split(' ');\r\n        const resourceNumber = parseInt(titleArray[titleArray.length - 1], 10);\r\n        if (!isNaN(resourceNumber) && resourceNumber > 5) {\r\n            item.Status = 2\r\n        }\r\n    }\r\n\r\n    return item;\r\n}\r\n\r\nfunction PriceFixReducer(item) {\r\n    if (!item.StandardPrice) {\r\n        item.StandardPrice = 0;\r\n    }\r\n\r\n    item.StandardPriceStr = `${item.StandardPrice} €`;\r\n\r\n    if (!item.StandardPrice && item.locationInfo.Title === 'Outdoor Tennis') {\r\n        item.StandardPriceStr = '';\r\n    }\r\n\r\n    if (item.locationInfo.Title === 'Padel outside') {\r\n        if (parseInt(item.StartTime) < 15) {\r\n            item.StandardPrice = 26;\r\n            item.StandardPriceStr = '26 €';\r\n        } else {\r\n            item.StandardPrice = 30;\r\n            item.StandardPriceStr = '30 €';\r\n        }\r\n    }\r\n\r\n    if (item.locationInfo.Title === 'Jopo') {\r\n        item.StandardPriceStr = '15€ 3h';\r\n    }\r\n\r\n    return item;\r\n}\r\n\r\nexport {\r\n    transformSelectedItems,\r\n    TimeSlotFixReducer,\r\n    PriceFixReducer\r\n}\r\n","import React, { useState } from 'react';\r\nimport {\r\n    Select,\r\n    MenuItem,\r\n    Button\r\n} from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { groups } from '../../data-model/config';\r\nimport {\r\n    KeyboardDatePicker,\r\n} from '@material-ui/pickers';\r\nimport {PriceFixReducer, TimeSlotFixReducer} from '../../utils';\r\nimport moment from 'moment';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n    headerTop: {\r\n        display: 'flex'\r\n    },\r\n    headerTopLeft: {\r\n        display: 'flex',\r\n        justifyContent: 'center',\r\n        alignItems: 'center',\r\n        width: 120,\r\n        padding: '15px 10px',\r\n        border: '1px solid #c5c5c5',\r\n        borderBottom: 'none'\r\n    },\r\n    headerTopRight: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        width: 'calc(100% - 120px)',\r\n        padding: '15px 10px',\r\n        border: '1px solid #c5c5c5',\r\n        borderLeft: 'none',\r\n        borderBottom: 'none',\r\n        textAlign: 'center'\r\n    },\r\n    headerBottom: {\r\n        display: 'flex'\r\n    },\r\n    headerBottomLeft: {\r\n        display: 'flex',\r\n        justifyContent: 'center',\r\n        alignItems: 'center',\r\n        width: 120,\r\n        padding: '15px 10px',\r\n        background: 'rgba(0, 0, 0, 0.1)',\r\n        border: '1px solid #c5c5c5'\r\n    },\r\n    headerBottomRight: {\r\n        width: 'calc(100% - 120px)',\r\n        padding: '15px 10px',\r\n        border: '1px solid #c5c5c5',\r\n        borderLeft: 'none',\r\n        textAlign: 'center'\r\n    },\r\n    itemsContainer: {\r\n        display: 'flex',\r\n    },\r\n    itemsSidebar: {\r\n        width: 120,\r\n        padding: '15px 10px',\r\n        border: '1px solid #c5c5c5',\r\n        borderTop: 'none',\r\n        textAlign: 'center'\r\n    },\r\n    itemsContent: {\r\n        width: 'calc(100% - 120px)',\r\n        padding: '15px 10px',\r\n        border: '1px solid #c5c5c5',\r\n        borderTop: 'none',\r\n        borderLeft: 'none',\r\n        textAlign: 'center'\r\n    },\r\n    select: {\r\n        width: '100%',\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px',\r\n        '&::after': {\r\n            borderBottomColor: 'rgb(192, 0, 0)'\r\n        }\r\n    },\r\n    menuItem: {\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px',\r\n    },\r\n    calendarInput: {\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px',\r\n        textAlign: 'center',\r\n    },\r\n    inputRoot: {\r\n        width: '100%',\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px',\r\n        '& .MuiInputBase-input': {\r\n            textAlign: 'center'\r\n        }\r\n    },\r\n    underline: {\r\n        transition: '.2s ease-in-out',\r\n        '&:hover:not(.Mui-disabled):before': {\r\n            borderColor: '#cd3333'\r\n        },\r\n        '&::after': {\r\n            borderColor: '#c00000'\r\n        }\r\n    },\r\n    popoverRoot: {\r\n        '& .MuiPickersBasePicker-pickerView': {\r\n            maxWidth: '285px',\r\n            minWidth: '275px'\r\n        },\r\n        '& .MuiIconButton-root': {\r\n            padding: 5\r\n        },\r\n        '& .MuiTypography-body1': {\r\n            fontFamily: 'MetaPro',\r\n            fontSize: '16px',\r\n            lineHeight: '20px',\r\n        },\r\n        '& .MuiTypography-caption': {\r\n            fontFamily: 'MetaPro',\r\n            fontSize: '16px',\r\n            lineHeight: '20px',\r\n        },\r\n        '& .MuiTypography-body2': {\r\n            fontFamily: 'MetaPro',\r\n            fontSize: '16px',\r\n            lineHeight: '20px',\r\n        },\r\n        '& .MuiPickersDay-daySelected': {\r\n            background: '#c00000',\r\n        },\r\n        '& .MuiPickersDay-current.MuiPickersDay-daySelected': {\r\n            color: '#fff',\r\n            background: '#c00000',\r\n        },\r\n        '& .MuiPickersDay-current': {\r\n            color: '#c00000'\r\n        }\r\n    },\r\n    selectUnderline: {\r\n        '&::after': {\r\n            borderColor: '#c00000'\r\n        }\r\n    },\r\n    formBtn: {\r\n        position: 'fixed',\r\n        top: '50%',\r\n        right: -14,\r\n        padding: '4px 8px',\r\n        fontSize: 16,\r\n        fontFamily: 'MetaPro',\r\n        background: 'rgb(62, 25, 25)',\r\n        color: '#fff',\r\n        textAlign: 'center',\r\n        transform: 'translateY(-50%) rotate(-90deg)',\r\n        '&:hover': {\r\n            background: 'rgb(62, 25, 25)',\r\n        }\r\n    },\r\n}))\r\n\r\n// const\r\n\r\nconst TabletAndMobileView = (props) => {\r\n    const {\r\n        to,\r\n        from,\r\n        data,\r\n        maxDate,\r\n        currentDate,\r\n        selectedItems,\r\n        handleOpenModal,\r\n        handleDateChange,\r\n        handleSelectedItems,\r\n    } = props;\r\n    const classes = useStyles();\r\n\r\n    let [currentGroup, setCurrentGroup] = useState(groups[0]);\r\n    const serviceGroups = [];\r\n    const timeSlotMap = new Map();\r\n    data.forEach(item => {\r\n        item = {...TimeSlotFixReducer(item)};\r\n\r\n        const key = item.locationInfo.Title === 'Jopo' ? item.Resources[0].Name : item.locationInfo.Title;\r\n        const value = timeSlotMap.get(key);\r\n\r\n        if (!value) {\r\n            const group = groups.find(group => group.value === key);\r\n\r\n            if (group) {\r\n                serviceGroups.push(group);\r\n            }\r\n        }\r\n\r\n        if (item.available) {\r\n            timeSlotMap.set(key, !value ? [item] : [...value, item]);\r\n        }\r\n    });\r\n\r\n    serviceGroups.sort((a,b) => {\r\n        return a.id - b.id;\r\n    });\r\n\r\n    let currentGroupItems = timeSlotMap.get(currentGroup.value);\r\n\r\n    if (!currentGroupItems) {\r\n        setCurrentGroup(serviceGroups[0]);\r\n    }\r\n\r\n    const timeMap = new Map();\r\n    let results = [];\r\n\r\n    if (currentGroupItems) {\r\n        currentGroupItems.forEach((item, idx) => {\r\n            const value = timeMap.get(item.StartTime);\r\n            if (parseInt(item.StartTime, 10) >= from && parseInt(item.EndTime, 10) <= to) {\r\n                timeMap.set(item.StartTime, !value ? [item] : [...value, item]);\r\n            }\r\n        })\r\n\r\n        for (let key of timeMap.keys()) {\r\n            const items = timeMap.get(key);\r\n            items[0] = PriceFixReducer(items[0]);\r\n            // const activeSlots = items.filter(item => item.Status === 1);\r\n            const activeSlots = items.filter(timeMapItem => {\r\n                const ct = currentDate.format('HH.mm');\r\n                const today = moment();\r\n\r\n                if (today.isAfter(maxDate)) {\r\n                    return false\r\n                }\r\n\r\n                if (currentDate.isSame(maxDate, 'day')) {\r\n                    return timeMapItem.Status === 1 && timeMapItem.StartTime < 12;\r\n                }\r\n\r\n                if (currentDate.isSame(today, 'day')) {\r\n                    return timeMapItem.Status === 1 && ct < timeMapItem.StartTime;\r\n                }\r\n\r\n                return timeMapItem.Status === 1;\r\n            });\r\n            const isSlotActive = !!activeSlots.length;\r\n            const text = isSlotActive ? (items[0].StandardPriceStr === 0 ? '' : items[0].StandardPriceStr) : '';\r\n            const isItemSelected = selectedItems.filter(selectedItem => {\r\n                return items.filter(item => item.TimeSlotId === selectedItem.TimeSlotId).length !== 0;\r\n            }).length !== 0;\r\n\r\n            results.push(\r\n                <div\r\n                    key={key}\r\n                    className={classes.itemsContainer}\r\n                >\r\n                    <div\r\n                        className={classes.itemsSidebar}\r\n                    >\r\n                        {key}\r\n                    </div>\r\n                    <div\r\n                        className={classes.itemsContent}\r\n                        style={{\r\n                            background: isItemSelected ? '#c00000' : (isSlotActive ? '#fff' : '#c5c5c5'),\r\n                            color: isItemSelected ? '#fff' : 'inherit'\r\n                        }}\r\n                        onClick={isSlotActive ? () => handleSelectedItems(activeSlots[0], isItemSelected) : () => {}}\r\n                    >\r\n                        {text}\r\n                    </div>\r\n                </div>\r\n            )\r\n        }\r\n    }\r\n\r\n    const handleGroupChange = (event) => {\r\n        const [item] = groups.filter(group => group.title === event.target.value);\r\n        setCurrentGroup(item);\r\n    }\r\n\r\n    return (\r\n        <div>\r\n            <div className={classes.headerTop}>\r\n                <div className={classes.headerTopLeft}>\r\n                    Valitse haluamasi palvelu ja ajankohta kalenterista\r\n                </div>\r\n                <div className={classes.headerTopRight}>\r\n                    <KeyboardDatePicker\r\n                        autoOk\r\n                        maxDate={maxDate}\r\n                        disablePast\r\n                        value={currentDate}\r\n                        format=\"DD.MM.YYYY\"\r\n                        onChange={handleDateChange}\r\n                        shouldDisableDate={day => day.isAfter(maxDate)}\r\n                        variant=\"inline\"\r\n                        InputProps={{\r\n                            classes: {\r\n                                root: classes.inputRoot,\r\n                                underline: classes.underline\r\n                            }\r\n                        }}\r\n                        PopoverProps={{\r\n                            classes: {\r\n                                paper: classes.popoverRoot\r\n                            }\r\n                        }}\r\n                        disableToolbar\r\n                    />\r\n                </div>\r\n            </div>\r\n            <div className={classes.headerBottom}>\r\n                <div className={classes.headerBottomLeft}></div>\r\n                <div className={classes.headerBottomRight}>\r\n                    <Select\r\n                        className={classes.select}\r\n                        onChange={handleGroupChange}\r\n                        value={currentGroup.title}\r\n                    >\r\n                        {serviceGroups.map(group => {\r\n                            return (\r\n                                <MenuItem\r\n                                    className={classes.menuItem}\r\n                                    key={group.id}\r\n                                    value={group.title}\r\n                                >\r\n                                    {group.title}\r\n                                </MenuItem>\r\n                            )\r\n                        })}\r\n                    </Select>\r\n                </div>\r\n            </div>\r\n            <div>\r\n                {results}\r\n            </div>\r\n            {selectedItems.length ? (\r\n                <Button\r\n                    className={classes.formBtn}\r\n                    onClick={handleOpenModal}\r\n                >\r\n                    Varaa\r\n                </Button>\r\n            ) : null}\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default TabletAndMobileView;\r\n","import TabletAndMobileView from './TabletAndMobileView';\r\n\r\nexport default TabletAndMobileView;","import React from 'react';\r\nimport NavigateNextIcon from '@material-ui/icons/NavigateNext';\r\nimport NavigateBeforeIcon from '@material-ui/icons/NavigateBefore';\r\nimport {\r\n    IconButton,\r\n    Typography,\r\n    Button\r\n} from '@material-ui/core';\r\nimport {\r\n    KeyboardDatePicker,\r\n} from '@material-ui/pickers';\r\nimport { groups } from '../../data-model/config';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport moment from 'moment';\r\nimport {PriceFixReducer, TimeSlotFixReducer} from '../../utils';\r\n\r\nconst useStyles = makeStyles({\r\n    headerTop: {\r\n        display: 'flex',\r\n    },\r\n    headerTopLeft: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        justifyContent: 'center',\r\n        width: 175,\r\n        padding: 10,\r\n        borderRight: '1px solid #c5c5c5',\r\n        borderLeft: '1px solid #c5c5c5',\r\n        borderBottom: 'none',\r\n        textAlign: 'center'\r\n    },\r\n    headerTopRight: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        width: 'calc(100% - 175px)',\r\n        padding: 10,\r\n        borderBottom: 'none',\r\n        borderLeft: 'none'\r\n    },\r\n    headerBottom: {\r\n        display: 'flex',\r\n    },\r\n    headerBottomLeft: {\r\n        width: 175,\r\n        padding: 10,\r\n        border: '1px solid #c5c5c5',\r\n        background: 'rgba(0, 0, 0, 0.1)',\r\n        borderTop: 'none',\r\n        textAlign: 'center'\r\n    },\r\n    headerBottomRight: {\r\n        display: 'flex',\r\n        width: 'calc(100% - 175px)',\r\n        borderBottom: '1px solid #c5c5c5',\r\n        borderTop: 'none',\r\n    },\r\n    itemsRoot: {\r\n        display: 'flex',\r\n        flexDirection: 'column'\r\n    },\r\n    itemsSideBar: {\r\n        width: 175,\r\n        borderRight: '1px solid #c5c5c5',\r\n        borderBottom: '1px solid #c5c5c5',\r\n        textAlign: 'center'\r\n    },\r\n    itemsContainer: {\r\n        width: 'calc(100% - 175px)'\r\n    },\r\n    icons: {\r\n        padding: 3,\r\n        borderRadius: 3,\r\n        background: '#c00000',\r\n        color: '#fff',\r\n        transition: '.2s ease-in-out',\r\n        '&:hover': {\r\n            background: '#cd3333'\r\n        },\r\n        '&.Mui-disabled': {\r\n            background: 'rgb(192, 0, 0)',\r\n            color: '#fff',\r\n            opacity: '0.3'\r\n        }\r\n    },\r\n    dataText: {\r\n        padding: 5,\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px'\r\n    },\r\n    calendarInput: {\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px'\r\n    },\r\n    todayButton: {\r\n        marginLeft: 10,\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px',\r\n        background: '#c00000',\r\n        color: '#fff',\r\n        transition: '.2s ease-in-out',\r\n        '&:hover': {\r\n            background: '#cd3333'\r\n        }\r\n    },\r\n    inputRoot: {\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        lineHeight: '20px',\r\n    },\r\n    underline: {\r\n        transition: '.2s ease-in-out',\r\n        '&:hover:not(.Mui-disabled):before': {\r\n            borderColor: '#cd3333'\r\n        },\r\n        '&::after': {\r\n            borderColor: '#c00000'\r\n        }\r\n    },\r\n    popoverRoot: {\r\n        '& .MuiPickersBasePicker-pickerView': {\r\n            maxWidth: '285px',\r\n            minWidth: '275px',\r\n            padding: '0 8px'\r\n        },\r\n        '& .MuiIconButton-root': {\r\n            padding: 3\r\n        },\r\n        '& .MuiTypography-body1': {\r\n            fontFamily: 'MetaPro',\r\n            fontSize: '16px',\r\n            lineHeight: '20px',\r\n        },\r\n        '& .MuiTypography-caption': {\r\n            fontFamily: 'MetaPro',\r\n            fontSize: '16px',\r\n            lineHeight: '20px',\r\n        },\r\n        '& .MuiTypography-body2': {\r\n            fontFamily: 'MetaPro',\r\n            fontSize: '16px',\r\n            lineHeight: '20px',\r\n        },\r\n        '& .MuiPickersDay-daySelected': {\r\n            background: '#c00000',\r\n        },\r\n        '& .MuiPickersDay-current.MuiPickersDay-daySelected': {\r\n            color: '#fff',\r\n            background: '#c00000',\r\n        },\r\n        '& .MuiPickersDay-current': {\r\n            color: '#c00000'\r\n        }\r\n    },\r\n    formBtn: {\r\n        padding: '4px 8px',\r\n        fontSize: 16,\r\n        fontFamily: 'MetaPro',\r\n        background: '#c00000',\r\n        color: '#fff',\r\n        textAlign: 'center'\r\n    },\r\n    headerTopRightContainer: {\r\n        display: 'flex',\r\n        justifyContent: 'space-between',\r\n        alignItems: 'center',\r\n        paddingRight: 10,\r\n        border: '1px solid #c5c5c5',\r\n        borderLeft: 'none'\r\n    },\r\n    rowRight: {\r\n        display: 'flex',\r\n        width: 'calc(100% - 175px)',\r\n        '&:hover': {\r\n            '&>div': {\r\n                background: '#d8d8d8'\r\n            }\r\n        }\r\n    }\r\n})\r\n\r\nfunction createTimeLine(from, to) {\r\n    const times = [];\r\n    const width = 100 / (to - from);\r\n\r\n    for (let i = from; i <= to; i++) {\r\n        const t = i < 10 ? `0${i}` : i;\r\n        times.push((\r\n            <div\r\n                key={t}\r\n                style={{\r\n                    width: `${width}%`,\r\n                    padding: 10,\r\n                    background: i % 2 === 0 ? '#fff' : 'rgba(0, 0, 0, 0.1)',\r\n                    borderRight: '1px solid #c5c5c5',\r\n                    textAlign: 'center'\r\n                }}\r\n            >\r\n                {`${t}.00`}\r\n            </div>\r\n        ))\r\n    }\r\n\r\n    return times\r\n}\r\n\r\nconst DesktopView = (props) => {\r\n    const {\r\n        to,\r\n        from,\r\n        data,\r\n        isToday,\r\n        maxDate,\r\n        setPrevDay,\r\n        setNextDay,\r\n        setTodayDay,\r\n        currentDate,\r\n        selectedItems,\r\n        handleOpenModal,\r\n        handleDateChange,\r\n        handleSelectedItems,\r\n    } = props;\r\n    const classes = useStyles();\r\n    const timeSlotMap = new Map();\r\n\r\n    data.forEach(item => {\r\n        item = {...TimeSlotFixReducer(item)};\r\n\r\n        if (item.available && parseInt(item.StartTime) >= from && parseInt(item.EndTime) <= to) {\r\n            const key = item.locationInfo.Title === 'Jopo' ? item.Resources[0].Name : item.locationInfo.Title;\r\n            const value = timeSlotMap.get(key);\r\n            timeSlotMap.set(key, !value ? [item] : [...value, item]);\r\n        }\r\n    });\r\n\r\n    const createSlots = items => {\r\n        const timeMap = new Map();\r\n        items.forEach(s => {\r\n            const key = s.StartTime;\r\n            const value = timeMap.get(key);\r\n            timeMap.set(key, !value ? [s] : [...value, s]);\r\n        })\r\n\r\n        const results = [];\r\n\r\n        for (let timeMapItems of timeMap.values()) {\r\n            timeMapItems[0] = PriceFixReducer(timeMapItems[0]);\r\n\r\n            const activeSlots = timeMapItems.filter(timeMapItem => {\r\n                const ct = currentDate.format('HH.mm');\r\n                const today = moment();\r\n\r\n                if (today.isAfter(maxDate)) {\r\n                    return false\r\n                }\r\n\r\n                if (currentDate.isSame(maxDate, 'day')) {\r\n                    return timeMapItem.Status === 1 && timeMapItem.StartTime < 12;\r\n                }\r\n\r\n                if (currentDate.isSame(today, 'day')) {\r\n                    return timeMapItem.Status === 1 && ct < timeMapItem.StartTime;\r\n                }\r\n\r\n                return timeMapItem.Status === 1;\r\n            });\r\n            const isSlotActive = activeSlots.length !== 0;\r\n            const text = isSlotActive ? (timeMapItems[0].StandardPriceStr === 0 ? null : timeMapItems[0].StandardPriceStr) : null;\r\n            const isItemSelected = selectedItems.filter(selectedItem => {\r\n                return timeMapItems.filter(timeMapItem => timeMapItem.TimeSlotId === selectedItem.TimeSlotId).length !== 0;\r\n            }).length !== 0;\r\n\r\n            results.push(\r\n                {\r\n                    'StartTime': timeMapItems[0].StartTime,\r\n                    'EndTime': timeMapItems[0].EndTime,\r\n                    text,\r\n                    isSlotActive,\r\n                    isItemSelected,\r\n                    pickedSlot: isSlotActive ? [activeSlots[0]] : []\r\n                }\r\n            )\r\n        }\r\n\r\n        return results.map((item, idx) => {\r\n            const text = item.text;\r\n            const isSlotActive = item.isSlotActive;\r\n            const width = 100 / (to - from);\r\n            const isItemSelected = item.isItemSelected;\r\n\r\n            return (\r\n                <div\r\n                    key={idx}\r\n                    style={{\r\n                        display: 'flex',\r\n                        justifyContent: 'center',\r\n                        alignItems: 'center',\r\n                        width: `${width}%`,\r\n                        padding: 6,\r\n                        borderRight: '1px solid #c5c5c5',\r\n                        borderBottom: '1px solid #c5c5c5',\r\n                        background: isItemSelected ? '#c00000' : (isSlotActive ? '#fff' : '#c5c5c5'),\r\n                        color: isItemSelected ? '#fff' : 'inherit',\r\n                        cursor: isSlotActive ? 'pointer': 'default'\r\n                    }}\r\n                    onClick={isSlotActive ? () => handleSelectedItems(item.pickedSlot[0], isItemSelected) : null}\r\n                >\r\n                    {text}\r\n                </div>\r\n            )\r\n        })\r\n    }\r\n\r\n    const res = groups.map((group, idx) => {\r\n        const items = timeSlotMap.get(group.value);\r\n\r\n        if (!items) {\r\n            return;\r\n        }\r\n\r\n        return (\r\n            <div\r\n                key={group.title}\r\n                style={{\r\n                    display: 'flex',\r\n                }}\r\n            >\r\n                <div\r\n                    style={{\r\n                        width: 175,\r\n                        padding: 10,\r\n                        background: idx % 2 === 0 ? '#fff' : 'rgba(0, 0, 0, 0.1)',\r\n                        borderRight: '1px solid #c5c5c5',\r\n                        borderBottom: '1px solid #c5c5c5',\r\n                        borderLeft: '1px solid #c5c5c5'\r\n                    }}\r\n                >\r\n                    {group.title}\r\n                </div>\r\n                <div\r\n                    className={classes.rowRight}\r\n                >\r\n                    {createSlots(items)}\r\n                </div>\r\n            </div>\r\n        )\r\n    })\r\n\r\n    return (\r\n        <div>\r\n            <div className=\"header\">\r\n                <div\r\n                    className={classes.headerTopRightContainer}\r\n                >\r\n                    <div className={classes.headerTop}>\r\n                        <div className={classes.headerTopLeft}>\r\n                            Valitse haluamasi palvelu ja ajankohta kalenterista\r\n\t\t\t\t\t\t\t          </div>\r\n                        <div className={classes.headerTopRight}>\r\n                            <div style={{\r\n                                display: 'flex',\r\n                                alignItems: 'center',\r\n                                marginRight: 10\r\n                            }}>\r\n                                <IconButton\r\n                                    className={classes.icons}\r\n                                    onClick={setPrevDay}\r\n                                    disabled={moment().format('YYYY-MM-DD') === currentDate.format('YYYY-MM-DD')}\r\n                                >\r\n                                    <NavigateBeforeIcon />\r\n                                </IconButton>\r\n                                <Typography\r\n                                    className={classes.dataText}\r\n                                >\r\n                                    {currentDate.format('dddd DD MMMM YYYY')}\r\n                                </Typography>\r\n                                <IconButton\r\n                                    className={classes.icons}\r\n                                    onClick={setNextDay}\r\n                                    disabled={currentDate.isSameOrAfter(maxDate)}\r\n                                >\r\n                                    <NavigateNextIcon />\r\n                                </IconButton>\r\n                            </div>\r\n                            <KeyboardDatePicker\r\n                                autoOk\r\n                                value={currentDate}\r\n                                maxDate={maxDate}\r\n                                disablePast\r\n                                onChange={handleDateChange}\r\n                                shouldDisableDate={day => day.isAfter(maxDate)}\r\n                                variant=\"inline\"\r\n                                InputProps={{\r\n                                    classes: {\r\n                                        root: classes.inputRoot,\r\n                                        underline: classes.underline\r\n                                    }\r\n                                }}\r\n                                PopoverProps={{\r\n                                    classes: {\r\n                                        paper: classes.popoverRoot\r\n                                    }\r\n                                }}\r\n                                disableToolbar\r\n                            />\r\n                            {!isToday ? (\r\n                                <Button\r\n                                    className={classes.todayButton}\r\n                                    onClick={setTodayDay}\r\n                                >\r\n                                    Takaisin tähän päivään\r\n\t\t\t\t\t\t\t\t\t              </Button>\r\n                            ) : null}\r\n                        </div>\r\n                    </div>\r\n                    {selectedItems.length ? (\r\n                        <Button\r\n                            className={classes.formBtn}\r\n                            onClick={handleOpenModal}\r\n                        >\r\n                            Varaa\r\n                        </Button>\r\n                    ) : null}\r\n                </div>\r\n                <div className={classes.headerBottom}>\r\n                    <div className={classes.headerBottomLeft}></div>\r\n                    <div className={classes.headerBottomRight}>\r\n                        {createTimeLine(from, to)}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div className={classes.itemsRoot}>\r\n                {res}\r\n            </div>\r\n        </div>\r\n    )\r\n}\r\n\r\nexport default DesktopView;\r\n","import DesktopView from './DesktopView';\r\n\r\nexport default DesktopView;","import React from 'react';\r\nimport { Field } from 'formik';\r\n\r\nconst InputItem = ({ id, label, name, disabled = false, classes, component = \"input\", hint = false, validate = () => {}, ...props}) => {\r\n  return (\r\n    <div className={classes.inputWrapper}>\r\n        <div className={classes.inputLabel}>\r\n            <label htmlFor={id}>{label}</label>\r\n        </div>\r\n        <div className={classes.inputItem}>\r\n          {hint ? (<div className={classes.inputHint}>{hint}</div>) : null }\r\n            <Field\r\n                disabled={disabled}\r\n                component={component}\r\n                autoComplete=\"off\"\r\n                className={classes.inputStyle}\r\n                validate={validate}\r\n                style={{\r\n                    border: '1px solid rgba(0, 0, 0, 0.3)',\r\n                    resize: 'none'\r\n                }}\r\n                id={id}\r\n                name={name}\r\n                {...props}\r\n            />\r\n        </div>\r\n    </div>\r\n)}\r\n\r\nexport default InputItem;","import InputItem from './InputItem';\r\n\r\nexport default InputItem;","import React from 'react';\r\nimport {\r\n    IconButton,\r\n    RadioGroup,\r\n    Radio,\r\n    FormControlLabel,\r\n    makeStyles\r\n} from '@material-ui/core';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport moment from 'moment';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n    itemCard: {\r\n        position: 'relative',\r\n        width: 220,\r\n        margin: 10,\r\n        padding: 10,\r\n        border: '2px dotted #e5e5e5',\r\n    },\r\n    itemCardHeader: {\r\n        display: 'flex',\r\n    },\r\n    radio: {\r\n        padding: 2,\r\n        color: '#c5c5c5'\r\n    },\r\n    radioChecked: {\r\n        color: '#999'\r\n    },\r\n    formControlLabel: {\r\n        fontSize: 18,\r\n        fontFamily: 'MetaPro'\r\n    },\r\n    formControlLabelRoot: {\r\n        margin: 0,\r\n        flexBasis: '50%'\r\n    },\r\n    cardHeaderTitle: {\r\n        margin: 0,\r\n        marginRight: 10,\r\n        fontSize: 16,\r\n        fontWeight: 'bold',\r\n        color: '#747479',\r\n        textTransform: 'capitalize'\r\n    },\r\n    cardDateTitle: {\r\n        textTransform: 'capitalize'\r\n    },\r\n    closeBtn: {\r\n        position: 'absolute',\r\n        top: 0,\r\n        right: 0,\r\n        padding: 3\r\n    },\r\n    radioGroup: {\r\n        justifyContent: 'space-between',\r\n        flexDirection: 'row'\r\n    },\r\n    itemCardContainer: {\r\n        display: 'flex',\r\n        flexWrap: 'wrap',\r\n        width: '100%',\r\n        [theme.breakpoints.down('sm')]: {\r\n            justifyContent: 'center'\r\n        }\r\n    },\r\n}))\r\n\r\nconst RadioCard = ({currentDate, config, removeSelectedItem, prices, arrayHelpers}) => {\r\n    const classes = useStyles();\r\n\r\n    return (\r\n        <div style={{\r\n            display: 'flex',\r\n            flexDirection: 'column',\r\n            width: '100%'\r\n        }}>\r\n            <div className={classes.itemCardHeader}>\r\n                <p className={classes.cardHeaderTitle}>\r\n                    Yhteensä:\r\n                    {\" \"}\r\n                    {config.values.orderInfo.reduce((s, c) => {\r\n                        return s + parseInt(c.Cost)\r\n                    }, 0)} €\r\n                </p>\r\n            </div>\r\n            <div className={classes.itemCardContainer}>\r\n                {config.values.orderInfo.map((item, index) => {\r\n                    let title = item.Resources[0].Name;\r\n                    if (item.locationInfo.title !== 'Jopo') {\r\n                        const titleArray = item.Resources[0].Name.split(' ');\r\n                        if (!isNaN(parseInt(titleArray[titleArray.length - 1], 10))) {\r\n                            title = titleArray.splice(0, titleArray.length - 1).join(' ')\r\n                        }\r\n                    }\r\n\r\n                    let price = prices['Prices'][item.TimeSlotId];\r\n\r\n                    if (item.locationInfo.title === 'Padel outside') {\r\n                        if (parseInt(item.StartTime) < 15) {\r\n                            price = prices['Prices'][item.TimeSlotId].filter(el => el.Price === 26);\r\n                        } else {\r\n                            price = prices['Prices'][item.TimeSlotId].filter(el => el.Price === 30);\r\n                        }\r\n                    }\r\n\r\n                    const name = `orderInfo[${index}].Cost`;\r\n                    return (\r\n                        <div className={classes.itemCard} key={item.TimeSlotId}>\r\n                            <IconButton\r\n                                className={classes.closeBtn}\r\n                                onClick={() => {\r\n                                    removeSelectedItem(item.TimeSlotId);\r\n                                    arrayHelpers.remove(index);\r\n                                }}\r\n                            >\r\n                                <CloseIcon />\r\n                            </IconButton>\r\n                            <p>{title}</p>\r\n                            <p className={classes.cardDateTitle}>{moment(item.Date).format('dddd DD MMMM YYYY')} Klo {`${item.StartTime} - ${item.EndTime}`}</p>\r\n                            {item.locationInfo.title === 'Jopo'\r\n                                ?\r\n                                <p>15€ 3h</p>\r\n                                :\r\n                                <RadioGroup\r\n                                    className={classes.radioGroup}\r\n                                    key={item.TimeSlotId}\r\n                                    value={item.Cost}\r\n                                    name={name}\r\n                                    onChange={(e) => config.setFieldValue(name, e.target.value)}\r\n                                >\r\n                                    {price.map(item => (\r\n                                        <div\r\n                                            key={item.PricingType}\r\n                                            style={{\r\n                                                display: 'flex',\r\n                                                flexDirection: 'column',\r\n                                            }}\r\n                                        >\r\n                                            <FormControlLabel\r\n                                                classes={{\r\n                                                    root: classes.formControlLabelRoot,\r\n                                                    label: classes.formControlLabel\r\n                                                }}\r\n                                                control={\r\n                                                    <Radio\r\n                                                        classes={{\r\n                                                            root: classes.radio,\r\n                                                            checked: classes.radioChecked\r\n                                                        }}\r\n                                                        color=\"default\"\r\n                                                    />\r\n                                                }\r\n                                                label={item.Price ? `${item.Price} ${item.PriceRepresentation}` : 'Voimassa olevan hinnaston mukaan'}\r\n                                                value={`${item.Price} ${item.PricingType}`}\r\n                                            />\r\n                                            <span style={{ fontSize: 14 }}>{item.PricingType}</span>\r\n                                            {item.PricingType === \"Hohtokeilailu\" && <span style={{ fontSize: 12 }}>Hohtokeilailua keskiviikkona, perjantaina ja lauantaina klo 21.00</span>}\r\n                                        </div>\r\n                                    ))}\r\n                                </RadioGroup>}\r\n                        </div>\r\n                    )\r\n                })}\r\n            </div>\r\n        </div>\r\n    )\r\n};\r\n\r\nexport default RadioCard;\r\n","import RadioCard from './RadioCard';\r\n\r\nexport default RadioCard;","import React, { useState, useEffect } from 'react';\r\nimport useDebounce from '../../custom-hooks/useDebounce';\r\nimport Autocomplete from '@material-ui/lab/Autocomplete';\r\nimport { createFilterOptions } from '@material-ui/lab/Autocomplete';\r\nimport { TextField, CircularProgress, useMediaQuery } from '@material-ui/core';\r\nimport { useTheme, makeStyles } from '@material-ui/core/styles';\r\nimport { FixedSizeList } from 'react-window';\r\nimport api from '../../services/api';\r\n\r\nconst useStyles = makeStyles(() => ({\r\n\troot: {\r\n\t\tfontSize: 16,\r\n\t\tfontFamily: 'MetaPro'\r\n\t},\r\n\toption: {\r\n\t\tfontSize: 16,\r\n\t\tfontFamily: 'MetaPro',\r\n\t\t'&::before': {\r\n\t\t\tdisplay: 'none'\r\n\t\t}\r\n\t}\r\n}))\r\n\r\nconst filterOptions = createFilterOptions({\r\n\tmatchFrom: 'start',\r\n\tstringify: option => `${option.Fields.lastname} ${option.Fields.firstname}`\r\n})\r\n\r\nfunction renderRow(props) {\r\n\tconst { data, index, style } = props;\r\n\treturn React.cloneElement(data[index], {\r\n\t\tstyle: {\r\n\t\t\toverflow: 'hidden',\r\n\t\t\ttextOverflow: 'ellipsis',\r\n\t\t\twhiteSpace: 'nowrap',\r\n\t\t\tdisplay: 'block',\r\n\t\t\t...style,\r\n\t\t},\r\n\t});\r\n}\r\n\r\nconst ListboxComponent = React.forwardRef(function ListboxComponent(props, ref) {\r\n\tconst { children, ...other } = props;\r\n\tconst theme = useTheme();\r\n\tconst smUp = useMediaQuery(theme.breakpoints.up('sm'));\r\n\tconst itemCount = Array.isArray(children) ? children.length : 0;\r\n\tconst itemSize = smUp ? 36 : 48;\r\n\r\n\tconst outerElementType = React.useMemo(() => {\r\n\t\treturn React.forwardRef((props2, ref2) => <div ref={ref2} {...props2} {...other} />);\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t<div ref={ref}>\r\n\t\t\t<FixedSizeList\r\n\t\t\t\tstyle={{ padding: 0, height: Math.min(8, itemCount) * itemSize, maxHeight: 'auto' }}\r\n\t\t\t\titemData={children}\r\n\t\t\t\theight={250}\r\n\t\t\t\twidth=\"100%\"\r\n\t\t\t\touterElementType={outerElementType}\r\n\t\t\t\tinnerElementType=\"ul\"\r\n\t\t\t\titemSize={itemSize}\r\n\t\t\t\toverscanCount={5}\r\n\t\t\t\titemCount={itemCount}\r\n\t\t\t>\r\n\t\t\t\t{renderRow}\r\n\t\t\t</FixedSizeList>\r\n\t\t</div>\r\n\t);\r\n});\r\n\r\nconst VirtualizedList = ({prices, config}) => {\r\n\tconst classes = useStyles();\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst [contacts, setContacts] = useState([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst debounceSearchTerm = useDebounce(config.values.lastName, 500);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (debounceSearchTerm) {\r\n\t\t\tsetLoading(true);\r\n\r\n\t\t\tapi.getContacts(debounceSearchTerm)\r\n\t\t\t\t.then(contacts => {\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t\tsetContacts(contacts.Data);\r\n\t\t\t\t})\r\n\t\t} else {\r\n\t\t\tsetContacts([]);\r\n\t\t}\r\n\t}, [debounceSearchTerm]);\r\n\r\n\treturn (\r\n\t\t<Autocomplete\r\n\t\t\tstyle={{\r\n\t\t\t\twidth: '100%',\r\n\t\t\t\tpadding: '4px 6px',\r\n\t\t\t\tfontFamily: 'MetaPro',\r\n\t\t\t\tfontSize: '16px',\r\n\t\t\t\tbackground: '#fafafa',\r\n\t\t\t\tborder: '1px solid rgba(0, 0, 0, 0.3)',\r\n\t\t\t\tborderRadius: 3,\r\n\t\t\t\tcolor: '#1d1d1b',\r\n\t\t\t\toutline: 'none',\r\n\t\t\t}}\r\n\t\t\tclasses={{\r\n\t\t\t\toption: classes.option,\r\n\t\t\t\tinput: classes.option\r\n\t\t\t}}\r\n\t\t\tonChange={(e, value) => {\r\n\t\t\t\tif (!value) {\r\n\t\t\t\t\tconfig.setValues({\r\n\t\t\t\t\t\t...config.values,\r\n\t\t\t\t\t\t'firstName': '',\r\n\t\t\t\t\t\t'lastName': '',\r\n\t\t\t\t\t\t'number': '',\r\n\t\t\t\t\t\t'ReserveOwner': '',\r\n\t\t\t\t\t\t'company': '',\r\n\t\t\t\t\t\t'Hinta/Osakashinta': 'False'\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst { firstname, lastname, telephone1, parentcustomerid, uds_isshareowner } = value.Fields;\r\n\t\t\t\tconst shareowner = uds_isshareowner === 'False' ? 'Hinta' : 'Osakashinta';\r\n\t\t\t\tconst mapedOrderInfo = config.values.orderInfo.map(item => {\r\n\t\t\t\t\tconst [currentPrice] = prices['Prices'][item.TimeSlotId].filter(v => v.PricingType === shareowner);\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\t...item,\r\n\t\t\t\t\t\t'Cost': `${currentPrice.Price} ${currentPrice.PricingType}`\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tconfig.setValues({\r\n\t\t\t\t\t...config.values,\r\n\t\t\t\t\t'firstName': firstname,\r\n\t\t\t\t\t'lastName': lastname,\r\n\t\t\t\t\t'company': parentcustomerid || '',\r\n\t\t\t\t\t'number': telephone1,\r\n\t\t\t\t\t'ReserveOwner': value.Id || '',\r\n\t\t\t\t\t'Hinta/Osakashinta': uds_isshareowner,\r\n\t\t\t\t\t'orderInfo': mapedOrderInfo,\r\n\t\t\t\t})\r\n\t\t\t}}\r\n\t\t\topen={open}\r\n\t\t\tonOpen={() => {\r\n\t\t\t\tsetOpen(true)\r\n\t\t\t}}\r\n\t\t\tonClose={() => {\r\n\t\t\t\tsetOpen(false);\r\n\t\t\t}}\r\n\t\t\tfilterOptions={filterOptions}\r\n\t\t\tgetOptionLabel={option => `${option.Fields.lastname}`}\r\n\t\t\trenderOption={option => (\r\n\t\t\t\t`${option.Fields.lastname} ${option.Fields.firstname}`\r\n\t\t\t)}\r\n\t\t\tonInputChange={(e, v) => config.setFieldValue('lastName', v)}\r\n\t\t\tdisableListWrap\r\n\t\t\tListboxComponent={ListboxComponent}\r\n\t\t\toptions={contacts}\r\n\t\t\tloading={loading}\r\n\t\t\tfreeSolo\r\n\t\t\trenderInput={params => {\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\tvariant=\"standard\"\r\n\t\t\t\t\t\tclasses={{ root: classes.root }}\r\n\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\tInputProps={{\r\n\t\t\t\t\t\t\t...params.InputProps,\r\n\t\t\t\t\t\t\tdisableUnderline: true,\r\n\t\t\t\t\t\t\tstyle: {\r\n\t\t\t\t\t\t\t\tpaddingRight: 30\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tendAdornment: (\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{loading ? <CircularProgress color=\"inherit\" size={20} /> : null}\r\n\t\t\t\t\t\t\t\t\t{params.InputProps.endAdornment}\r\n\t\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t)\r\n\t\t\t}}\r\n\t\t/>\r\n\t)\r\n}\r\n\r\nexport default VirtualizedList;","import React from 'react';\r\nimport './loader.css';\r\n\r\nconst Loader = () => (\r\n    <div className=\"loadingio-spinner-ellipsis-7tigfk2cggw\">\r\n        <div className=\"ldio-fhyz1gceyev\">\r\n            <div></div>\r\n            <div></div>\r\n            <div></div>\r\n            <div></div>\r\n            <div></div>\r\n        </div>\r\n    </div>\r\n)\r\n\r\nexport default Loader;","import Loader from './Loader';\r\n\r\nexport default Loader;","import React, { useState, useEffect } from 'react';\r\nimport {\r\n    Modal,\r\n    Card,\r\n    CardHeader,\r\n    Divider,\r\n    CardContent,\r\n    CardActions,\r\n    Grid,\r\n    Button,\r\n    Checkbox,\r\n    CircularProgress,\r\n    IconButton\r\n} from '@material-ui/core';\r\nimport { useSnackbar } from 'notistack';\r\nimport InputItem from '../InputItem';\r\nimport clsx from 'clsx';\r\nimport { Formik, Form, FieldArray } from 'formik';\r\nimport { makeStyles, FormControlLabel } from '@material-ui/core';\r\nimport RadioCard from '../RadioCard';\r\nimport VirtualizedList from '../VirtualizedList';\r\nimport { transformSelectedItems } from '../../utils';\r\nimport Loader from '../Loader';\r\nimport * as Yup from 'yup';\r\nimport api from '../../services/api';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport {func} from 'prop-types';\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n    root: {\r\n        position: 'absolute',\r\n        top: '50%',\r\n        left: '50%',\r\n        width: '80%',\r\n        maxWidth: '100%',\r\n        maxHeight: '100%',\r\n        transform: 'translate(-50%, -50%)',\r\n        outline: 'none',\r\n        overflowY: 'auto',\r\n    },\r\n    cardContent: {\r\n        [theme.breakpoints.down('md')]: {\r\n            padding: 10\r\n        }\r\n    },\r\n    header: {\r\n        [theme.breakpoints.down('md')]: {\r\n            fontSize: 21,\r\n            fontFamily: 'MetaPro',\r\n        }\r\n    },\r\n    actions: {\r\n        justifyContent: 'flex-end',\r\n        paddingLeft: 20,\r\n        paddingRight: 20,\r\n        [theme.breakpoints.down('md')]: {\r\n            padding: 10\r\n        },\r\n        [theme.breakpoints.down('sm')]: {\r\n            alignItems: 'flex-end',\r\n            flexDirection: 'column'\r\n        }\r\n    },\r\n    label: {\r\n        marginRight: 15\r\n    },\r\n    inputWrapper: {\r\n        display: 'flex',\r\n        [theme.breakpoints.down('md')]: {\r\n            flexDirection: 'column'\r\n        }\r\n    },\r\n    inputRow: {\r\n        marginBottom: 24,\r\n    },\r\n    textItem: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        width: '22%'\r\n    },\r\n    inputLabel: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        width: '16%',\r\n        [theme.breakpoints.down('md')]: {\r\n            width: '100%',\r\n        }\r\n    },\r\n    textareaLabel: {\r\n        display: 'flex',\r\n        alignItems: 'center',\r\n        width: '33%',\r\n        [theme.breakpoints.down('md')]: {\r\n            width: '100%',\r\n        }\r\n    },\r\n    inputItem: {\r\n        position: 'relative',\r\n        width: '84%',\r\n        padding: 5,\r\n        [theme.breakpoints.down('md')]: {\r\n            width: '100%',\r\n            padding: '5px 0'\r\n        }\r\n    },\r\n    inputHint: {\r\n        position: 'absolute',\r\n        top: '-14px',\r\n        right: 0,\r\n        fontSize: '12px',\r\n        lineHeight: '14px',\r\n        [theme.breakpoints.down('md')]: {\r\n            position: 'relative',\r\n            top: 'auto',\r\n            marginBottom: 5\r\n        }\r\n    },\r\n    textareaItem: {\r\n        width: '67%',\r\n        padding: 5,\r\n        [theme.breakpoints.down('md')]: {\r\n            width: '100%',\r\n            padding: '5px 0'\r\n        }\r\n    },\r\n    inputStyle: {\r\n        width: '100%',\r\n        padding: '8px 12px',\r\n        fontFamily: 'MetaPro',\r\n        fontSize: 16,\r\n        background: '#fafafa',\r\n        borderRadius: 3,\r\n        color: '#1d1d1b',\r\n        outline: 'none',\r\n        [theme.breakpoints.down('md')]: {\r\n            color: '#000'\r\n        },\r\n        '&:disabled': {\r\n            background: 'rgba(0, 0, 0, 0.15)'\r\n        }\r\n    },\r\n    error: {\r\n        paddingLeft: '18%',\r\n        color: 'red',\r\n        [theme.breakpoints.down('md')]: {\r\n            padding: '5px 0'\r\n        }\r\n    },\r\n    lastNameError: {\r\n        paddingTop: 5,\r\n        color: 'red',\r\n        [theme.breakpoints.down('md')]: {\r\n            padding: '5px 0'\r\n        }\r\n    },\r\n    submit: {\r\n        fontFamily: 'MetaPro',\r\n        fontSize: '16px',\r\n        background: '#c00000',\r\n        color: '#fff',\r\n        transition: '.25s ease-in-out',\r\n        '&:hover': {\r\n            background: '#c00000',\r\n        },\r\n        '&.Mui-disabled': {\r\n            color: '#fff'\r\n        }\r\n    },\r\n    formControlLabelCheckbox: {\r\n        fontSize: 18,\r\n        fontFamily: 'MetaPro',\r\n        [theme.breakpoints.down('sm')]: {\r\n            fontSize: 14\r\n        }\r\n    },\r\n    radio: {\r\n        padding: 5,\r\n        color: '#c5c5c5'\r\n    },\r\n    progress: {\r\n        color: 'rgb(192, 0, 0)'\r\n    },\r\n    disabledSubmitButton: {\r\n        color: '#fff',\r\n        opacity: '0.3'\r\n    },\r\n    customGridContainer: {\r\n        alignItems: 'stretch'\r\n    },\r\n    customGridItem: {\r\n        paddingTop: '0 !important',\r\n        paddingBottom: '0 !important'\r\n    },\r\n    gridRadioContainer: {\r\n        flexDirection: 'row',\r\n        paddingLeft: '18%',\r\n        [theme.breakpoints.down('sm')]: {\r\n            paddingLeft: 12,\r\n            paddingRight: 12\r\n        }\r\n    },\r\n    gridRadio: {\r\n        flexBasis: 'auto'\r\n    },\r\n    cardHeaderAction: {\r\n        marginTop: 0,\r\n        marginRight: 0\r\n    },\r\n    closeButton: {\r\n        padding: 6\r\n    },\r\n    cardHeaderRoot: {\r\n        [theme.breakpoints.down('md')]: {\r\n            padding: 8\r\n        }\r\n    }\r\n}));\r\n\r\nconst ValidationSchema = Yup.object().shape({\r\n    lastName: Yup.string()\r\n        .required('* - Pakollinen kenttä'),\r\n    firstName: Yup.string()\r\n        .required('* - Pakollinen kenttä'),\r\n    number: Yup.string()\r\n    .transform(function(value) {\r\n        if (value.charAt(0) === '0') {\r\n            value = `+358${value.substr(1)}`\r\n        }\r\n        return value;\r\n    })\r\n        .required('* - Pakollinen kenttä')\r\n        .matches(/^(\\+?(358)[.\\s-]?[0-9]{2}?[.\\s-]?[0-9]{3}?[.\\s-]?[0-9]{2}?[.\\s-]?[0-9]{2}?)$|(\\+?(380)[.\\s-]?[0-9]{2}?[.\\s-]?[0-9]{3}?[.\\s-]?[0-9]{2}?[.\\s-]?[0-9]{2}?)$/, 'kirjoita matkapuhelinnumero kansainvälisessä muodossa (+358xxxxxxxxxx)'),\r\n    sendEmail: Yup.bool(),\r\n    email: Yup.string()\r\n        .email('Väärä sähköpostiosoite'),\r\n    // email: Yup.string()\r\n    //     .when('sendEmail', {\r\n    //         is: (sendEmail) => sendEmail === true,\r\n    //         then: Yup.string()\r\n    //             .email('Väärä sähköpostiosoite')\r\n    //             .required('Pakollinen kenttä')\r\n    //     })\r\n})\r\n\r\nconst responseMsg = {\r\n    success: 'Kiitos tekemästäsi harrastevarauksesta. Saat hetken kuluttua vahvistuksen tekstiviestinä matkapuhelimeesi ja sähköpostina, mikäli annoit sen tiedot. Voit nyt varata seuraavan vuoron, mikäli haluat. Poistu painamalla \"OK\".'\r\n}\r\n\r\nconst OrderForm = ({ openModal, handleCloseModal, selectedItems, currentDate, removeSelectedItem, fetchData, removeAllSelectedItems }) => {\r\n    const classes = useStyles();\r\n    const [prices, setPrices] = useState(null);\r\n    const [requestForm, setRequestForm] = useState(false);\r\n    const { enqueueSnackbar, closeSnackbar } = useSnackbar();\r\n\r\n    const responseAction = key => (\r\n        <Button onClick={() => { closeSnackbar(key) }}>OK</Button>\r\n    )\r\n\r\n    useEffect(() => {\r\n        let mounted = true;\r\n\r\n        if (mounted) {\r\n            const selectedItemsID = selectedItems.map(item => item.TimeSlotId).join(',');\r\n\r\n            api.getPrices(selectedItemsID)\r\n                .then(prices => {\r\n                    const res = {Prices: {}};\r\n                    for (let key in prices.Prices) {\r\n                        if (!prices.Prices[key].length) {\r\n                          prices.Prices[key].push({\r\n                            PricingType: 'Hinta',\r\n                            Price: 0,\r\n                            PriceRepresentation: '€',\r\n                          });\r\n                        }\r\n                        res.Prices[key] = prices.Prices[key].filter(item => item.PricingType !== 'Osakashinta' && item.PricingType !== 'Osakashohto')\r\n                    }\r\n\r\n                    setPrices(res);\r\n                })\r\n        }\r\n    }, []);\r\n\r\n    if (selectedItems.length === 0) {\r\n        handleCloseModal();\r\n    }\r\n\r\n    return (\r\n        <Modal\r\n            onClose={handleCloseModal}\r\n            open={openModal}\r\n        >\r\n            {prices ? (\r\n                <Card\r\n                    className={clsx(classes.root)}\r\n                >\r\n                    <Formik\r\n                        // enableReinitialize\r\n                        initialValues={{\r\n                            lastName: \"\",\r\n                            firstName: \"\",\r\n                            company: \"\",\r\n                            email: \"\",\r\n                            number: \"\",\r\n                            sendEmail: true,\r\n                            sendSms: true,\r\n                            additionalInformation: '',\r\n                            \"Hinta/Osakashinta\": \"False\",\r\n                            ReserveOwner: \"\",\r\n                            orderInfo: transformSelectedItems(selectedItems, currentDate, prices)\r\n                        }}\r\n                        validationSchema={ValidationSchema}\r\n                        onSubmit={(values) => {\r\n                            setRequestForm(true);\r\n                            const formData = {\r\n                                \"IsUnAuth\": true,\r\n                                \"FirstName\": values.firstName,\r\n                                \"LastName\": values.lastName,\r\n                                \"Email\": values.email,\r\n                                \"SendEmail\": values.sendEmail,\r\n                                \"SendSms\": values.sendSms,\r\n                                \"Phone\": values.number,\r\n                                \"Company\": values.company,\r\n                                \"buyerComment2\": values.additionalInformation,\r\n                                \"orderInfo\": values.orderInfo.map(item => {\r\n                                    return {\r\n                                        ...item,\r\n                                        \"Cost\": parseInt(item.Cost),\r\n                                        \"ReserveOwner\": values.ReserveOwner\r\n                                    }\r\n                                })\r\n                            };\r\n\r\n                            api.requestForm(formData)\r\n                                .then(status => {\r\n                                    if (status.success) {\r\n                                        removeAllSelectedItems();\r\n                                        fetchData();\r\n                                        setRequestForm(false);\r\n                                        enqueueSnackbar(responseMsg.success, {\r\n                                            variant: 'success',\r\n                                            autoHideDuration: 12000,\r\n                                            anchorOrigin: {\r\n                                                vertical: 'bottom',\r\n                                                horizontal: 'right',\r\n                                            },\r\n                                            action: responseAction,\r\n                                        });\r\n                                        handleCloseModal();\r\n                                    }\r\n                                })\r\n                        }}\r\n                    >\r\n                        {(config) => (\r\n                            <Form>\r\n                                <CardHeader\r\n                                    classes={{\r\n                                        root: classes.cardHeaderRoot,\r\n                                        title: classes.header,\r\n                                        action: classes.cardHeaderAction\r\n                                    }}\r\n                                    action={\r\n                                        <IconButton\r\n                                            className={classes.closeButton}\r\n                                            onClick={handleCloseModal}\r\n                                        >\r\n                                            <CloseIcon />\r\n                                        </IconButton>\r\n                                    }\r\n                                    title=\"Haluatko varata tämän palvelun?\"\r\n                                />\r\n                                <Divider />\r\n                                <CardContent\r\n                                    className={classes.cardContent}\r\n                                >\r\n                                    <Grid\r\n                                        className={classes.customGridContainer}\r\n                                        container\r\n                                        spacing={3}\r\n                                    >\r\n                                        <Grid\r\n                                            item\r\n                                            lg={6}\r\n                                            xs={12}\r\n                                        >\r\n                                            {/*<div className={classes.inputWrapper}>*/}\r\n                                            {/*    <div className={classes.inputLabel}>*/}\r\n                                            {/*        <label htmlFor=\"lastName\">Sukunimi *</label>*/}\r\n                                            {/*    </div>*/}\r\n                                            {/*    <div className={classes.inputItem}>*/}\r\n                                            {/*        <VirtualizedList*/}\r\n                                            {/*            config={config}*/}\r\n                                            {/*            prices={prices}*/}\r\n                                            {/*        />*/}\r\n                                            {/*        {config.errors.lastName && config.touched.lastName ? (*/}\r\n                                            {/*            <div className={classes.lastNameError}>{config.errors.lastName}</div>*/}\r\n                                            {/*        ) : null}*/}\r\n                                            {/*    </div>*/}\r\n                                            {/*</div>*/}\r\n                                            <div className={classes.inputRow}>\r\n                                                <InputItem\r\n                                                    id=\"lastName\"\r\n                                                    name=\"lastName\"\r\n                                                    label=\"Sukunimi *\"\r\n                                                    classes={classes}\r\n                                                />\r\n                                                {config.errors.lastName && config.values.lastName ? (\r\n                                                    <div className={classes.error}>{config.errors.lastName}</div>\r\n                                                ) : null}\r\n                                            </div>\r\n\r\n                                            <InputItem\r\n                                                // disabled={!config.values.lastName}\r\n                                                id=\"firstname\"\r\n                                                name=\"firstName\"\r\n                                                label=\"Etunimi *\"\r\n                                                classes={classes}\r\n                                            />\r\n                                            {config.errors.firstName && config.values.lastName ? (\r\n                                                <div className={classes.error}>{config.errors.firstName}</div>\r\n                                            ) : null}\r\n                                        </Grid>\r\n                                        <Grid\r\n                                            item\r\n                                            lg={6}\r\n                                            xs={12}\r\n                                        >\r\n                                            <div className={classes.inputRow}>\r\n                                                <InputItem\r\n                                                    // disabled={!config.values.lastName}\r\n                                                    id=\"number\"\r\n                                                    name=\"number\"\r\n                                                    label=\"Matkapuhelin­numero *\"\r\n                                                    hint=\"kirjoita matkapuhelinnumero kansainvälisessä muodossa (+358xxxxxxxxxx)\"\r\n                                                    onBlur={e => {\r\n                                                        let value = e.target.value;\r\n                                                        config.handleBlur(e)\r\n                                                        if (value.charAt(0) === '0') {\r\n                                                            value = `+358${value.substr(1)}`\r\n                                                        }\r\n                                                        config.values.number = value;\r\n                                                        config.validateField('number');\r\n                                                    }}\r\n                                                    classes={classes}\r\n                                                />\r\n                                                {config.errors.number && config.values.lastName ? (\r\n                                                    <div className={classes.error}>{config.errors.number}</div>\r\n                                                ) : null}\r\n                                            </div>\r\n\r\n\r\n                                            <InputItem\r\n                                                // disabled={!config.values.lastName}\r\n                                                id=\"email\"\r\n                                                name=\"email\"\r\n                                                label=\"Sähköposti\"\r\n                                                classes={classes}\r\n                                            />\r\n                                            {config.errors.email && config.values.lastName && config.values.sendEmail ? (\r\n                                                <div className={classes.error}>{config.errors.email}</div>\r\n                                            ) : null}\r\n                                        </Grid>\r\n                                        <Grid\r\n                                            item\r\n                                            lg={6}\r\n                                            xs={12}\r\n                                        >\r\n                                            <InputItem\r\n                                                // disabled={!config.values.lastName}\r\n                                                id=\"company\"\r\n                                                name=\"company\"\r\n                                                label=\"Yritys\"\r\n                                                classes={classes}\r\n                                            />\r\n                                        </Grid>\r\n                                        <Grid\r\n                                            item\r\n                                            lg={6}\r\n                                            xs={12}\r\n                                        >\r\n                                            <InputItem\r\n                                                // disabled={!config.values.lastName}\r\n                                                component=\"textarea\"\r\n                                                id=\"additionalInformation\"\r\n                                                name=\"additionalInformation\"\r\n                                                label=\"Lisätieto\"\r\n                                                classes={classes}\r\n                                            />\r\n                                        </Grid>\r\n                                    </Grid>\r\n                                </CardContent>\r\n                                <Divider />\r\n                                <CardContent\r\n                                    className={classes.cardContent}\r\n                                >\r\n                                    <Grid\r\n                                        container\r\n                                    >\r\n                                        <FieldArray\r\n                                            name=\"orderInfo\"\r\n                                            render={arrayHelpers => (\r\n                                                <RadioCard\r\n                                                    config={config}\r\n                                                    currentDate={currentDate}\r\n                                                    prices={prices}\r\n                                                    removeSelectedItem={removeSelectedItem}\r\n                                                    arrayHelpers={arrayHelpers}\r\n                                                />\r\n                                            )}\r\n                                        />\r\n                                    </Grid>\r\n                                </CardContent>\r\n                                <Divider />\r\n                                <CardActions className={classes.actions}>\r\n                                    {/*<FormControlLabel*/}\r\n                                    {/*    classes={{*/}\r\n                                    {/*        label: classes.formControlLabelCheckbox*/}\r\n                                    {/*    }}*/}\r\n                                    {/*    control={*/}\r\n                                    {/*        <Checkbox*/}\r\n                                    {/*            style={{*/}\r\n                                    {/*                padding: 5*/}\r\n                                    {/*            }}*/}\r\n                                    {/*            color=\"default\"*/}\r\n                                    {/*            classes={{*/}\r\n                                    {/*                checked: classes.radioChecked*/}\r\n                                    {/*            }}*/}\r\n                                    {/*            checked={config.values.sendEmail}*/}\r\n                                    {/*            name=\"sendEmail\"*/}\r\n                                    {/*            onChange={config.handleChange}*/}\r\n                                    {/*            value={config.values.sendEmail}*/}\r\n                                    {/*        />*/}\r\n                                    {/*    }*/}\r\n                                    {/*    label=\"Lähettää Vahvistuksen Asiakkaalle\"*/}\r\n                                    {/*/>*/}\r\n                                    {requestForm ? (\r\n                                        <CircularProgress\r\n                                            className={classes.progress}\r\n                                            size={28}\r\n                                        />\r\n                                    ) : (\r\n                                            <Button\r\n                                                disabled={!(config.isValid && config.values.lastName)}\r\n                                                classes={{\r\n                                                    root: classes.submit,\r\n                                                    disabled: classes.disabledSubmitButton\r\n                                                }}\r\n                                                type=\"submit\"\r\n                                            >\r\n                                                OK\r\n                                        </Button>\r\n                                        )}\r\n                                </CardActions>\r\n                            </Form>\r\n                        )}\r\n                    </Formik>\r\n                </Card>\r\n            ) : (\r\n                    <div style={{\r\n                        display: 'flex',\r\n                        justifyContent: 'center',\r\n                        alignItems: 'center',\r\n                        height: '100%'\r\n                    }}>\r\n                        <Loader />\r\n                    </div>\r\n                )}\r\n\r\n        </Modal>\r\n    )\r\n}\r\n\r\nexport default OrderForm;","import OrderForm from './OrderForm';\r\n\r\nexport default OrderForm;","import React, { useState, useEffect, useCallback } from 'react';\r\nimport MomentUtils from '@date-io/moment';\r\nimport moment from 'moment';\r\nimport { MuiPickersUtilsProvider } from '@material-ui/pickers';\r\nimport { Modal, CardContent, Grid } from '@material-ui/core';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport api from './services/api';\r\nimport TabletAndMobileView from './components/TabletAndMobileView';\r\nimport DesktopView from './components/DesktopView';\r\nimport { useMediaQuery } from 'react-responsive';\r\nimport OrderForm from './components/OrderForm';\r\nimport Loader from './components/Loader';\r\nimport 'moment/locale/fi';\r\n\r\nconst App = () => {\r\n\tconst [data, setData] = useState(null);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [currentDate, setCurrentDate] = useState(moment());\r\n\tconst [prevDate, setPrevDate] = useState(moment());\r\n\tconst [selectedItems, setSelectedItems] = useState([]);\r\n\tconst [openModal, setOpenModal] = useState(false);\r\n\tconst isTabletOrMobileDevice = useMediaQuery({\r\n\t\tquery: '(max-width: 1224px)'\r\n\t});\r\n\r\n\tconst fetchData = useCallback(() => {\r\n\t\tsetLoading(true);\r\n\t\tconst cloneCurrentDate = currentDate.clone();\r\n\t\t\tapi.getData(cloneCurrentDate.format('M-D-YYYY'), cloneCurrentDate.add(1, 'days').format('M-D-YYYY'))\r\n\t\t\t\t.then(data => {\r\n\t\t\t\t\tsetData(data)\r\n\t\t\t\t\tsetPrevDate(currentDate)\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t})\r\n\t}, [currentDate])\r\n\r\n\tuseEffect(() => {\r\n\t\tlet mounted = true;\r\n\t\tif (mounted) {\r\n\t\t\tfetchData()\r\n\t\t}\r\n\r\n\t\treturn () => {\r\n\t\t\tmounted = false;\r\n\t\t}\r\n\t}, [fetchData])\r\n\r\n\tconst setPrevDay = () => {\r\n\t\tsetCurrentDate(prevDate => moment(prevDate).add(-1, 'days'))\r\n\t}\r\n\r\n\tconst setNextDay = () => {\r\n\t\tsetCurrentDate(prevDate => moment(prevDate).add(1, 'days'))\r\n\t}\r\n\r\n\tconst handleDateChange = date => {\r\n\t\tsetCurrentDate(moment(date))\r\n\t}\r\n\r\n\tconst setTodayDay = () => {\r\n\t\tsetCurrentDate(moment());\r\n\t}\r\n\r\n\tconst handleSelectedItems = (item, isItemSelected) => {\r\n\t\titem.Date = curDate.format('YYYY-MM-DDT00:00:00');\r\n\t\tsetSelectedItems(prevItems => {\r\n\t\t\treturn isItemSelected ? prevItems.filter(el => el.TimeSlotId !== item.TimeSlotId) : [...prevItems, item];\r\n\t\t})\r\n\t}\r\n\r\n\tconst removeSelectedItem = (id) => {\r\n\t\tsetSelectedItems(prevItems => {\r\n\t\t\treturn prevItems.filter(item => item.TimeSlotId !== id);\r\n\t\t})\r\n\t}\r\n\r\n\tconst handleOpenModal = () => {\r\n\t\tsetOpenModal(true);\r\n\t}\r\n\r\n\tconst handleCloseModal = () => {\r\n\t\tsetOpenModal(false);\r\n\t}\r\n\r\n\tconst removeAllSelectedItems = () => {\r\n\t\tsetSelectedItems([]);\r\n\t}\r\n\r\n\tif (!data) return (\r\n\t\t<div style={{\r\n\t\t\tposition: 'fixed',\r\n\t\t\tzIndex: 1300,\r\n\t\t\tright: 0,\r\n\t\t\tleft: 0,\r\n\t\t\ttop: 0,\r\n\t\t\tbottom: 0,\r\n\t\t\tbackground: 'lightgrey'\r\n\t\t}}>\r\n\t\t\t<div style={{\r\n\t\t\t\tdisplay: 'flex',\r\n\t\t\t\tjustifyContent: 'center',\r\n\t\t\t\talignItems: 'center',\r\n\t\t\t\theight: '100%'\r\n\t\t\t}}>\r\n\t\t\t\t<Loader />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t)\r\n\r\n\tconst curDate = prevDate.format('YYYY-MM-DDT00:00:00') in data['Calendar'] ? prevDate : currentDate;\r\n\tconst fullData = data[\"Calendar\"][`${curDate.format('YYYY-MM-DDT00:00:00')}`];\r\n\tconst isToday = prevDate.format('YYYY-MM-DD') === moment().format('YYYY-MM-DD');\r\n\t// const from = parseInt(fullData[0].StartTime);\r\n\tconst from = 9;\r\n\tconst to = parseInt(fullData[fullData.length - 1].EndTime);\r\n\tconst isDateEqual = currentDate.format('YYYY-MM-DD') === prevDate.format('YYYY-MM-DD');\r\n\tconst maxDate = moment('2024-09-16');\r\n\t// const maxDate = moment().add(1, 'y').set({\r\n\t// \t'M': 11,\r\n\t// \t'D': 30\r\n\t// });\r\n\tconst rest = {\r\n\t\tmaxDate,\r\n\t\tdata: fullData,\r\n\t\tfrom,\r\n\t\tto,\r\n\t\tsetPrevDay,\r\n\t\tsetNextDay,\r\n\t\thandleDateChange,\r\n\t\thandleOpenModal,\r\n\t\tsetTodayDay,\r\n\t\tcurrentDate: curDate,\r\n\t\tisToday,\r\n\t\tselectedItems,\r\n\t\thandleSelectedItems,\r\n\t}\r\n\r\n\treturn (\r\n\t\t<MuiPickersUtilsProvider utils={MomentUtils}>\r\n\t\t\t<SnackbarProvider>\r\n\t\t\t\t<CardContent>\r\n\t\t\t\t\t<Grid container spacing={3}>\r\n\t\t\t\t\t\t<Grid item lg={6} xs={12}>\r\n\t\t\t\t\t\t\t<p>Voit varata harrastevuoron tästä kalenterista. Keilavuoro\r\n\t\t\t\t\t\t\t\tmaksetaan suoraan keilahallille ja pallopelivuorot voit maksaa\r\n\t\t\t\t\t\t\t\tkeilahallille, vastaanottoon tai hoitovastaanottoon R-Kioskin\r\n\t\t\t\t\t\t\t\tyhteydessä.</p>\r\n\t\t\t\t\t\t\t<p>Vuoron voit perua kuluitta 3 h ennen vuoron alkua.\r\n\t\t\t\t\t\t\t\tOsakashinnan saat näyttämällä osakaskortin maksun\r\n\t\t\t\t\t\t\t\tyhteydessä.</p>\r\n\t\t\t\t\t\t\t<p>Huomioithan, että Viikko-osakkeen harrastevuoroja ei voi\r\n\t\t\t\t\t\t\t\tkäyttää netissä varattuun vuoroon vaan vaihdot on tehtävä\r\n\t\t\t\t\t\t\t\tpuhelimitse.</p>\r\n\t\t\t\t\t\t</Grid>\r\n\t\t\t\t\t</Grid>\r\n\t\t\t\t</CardContent>\r\n\t\t\t\t{isTabletOrMobileDevice ? (\r\n\t\t\t\t\t<TabletAndMobileView {...rest} />\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<DesktopView {...rest} />\r\n\t\t\t\t)}\r\n\t\t\t\t{openModal ? (\r\n\t\t\t\t\t<OrderForm\r\n\t\t\t\t\t\tremoveAllSelectedItems={removeAllSelectedItems}\r\n\t\t\t\t\t\tcurrentDate={curDate}\r\n\t\t\t\t\t\topenModal={openModal}\r\n\t\t\t\t\t\thandleCloseModal={handleCloseModal}\r\n\t\t\t\t\t\tselectedItems={selectedItems}\r\n\t\t\t\t\t\tremoveSelectedItem={removeSelectedItem}\r\n\t\t\t\t\t\tfetchData={fetchData}\r\n\t\t\t\t\t/>\r\n\t\t\t\t) : null}\r\n\t\t\t\t<Modal\r\n\t\t\t\t\topen={!isDateEqual || loading}\r\n\t\t\t\t>\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\tdisplay: 'flex',\r\n\t\t\t\t\t\t\tjustifyContent: 'center',\r\n\t\t\t\t\t\t\talignItems: 'center',\r\n\t\t\t\t\t\t\theight: '100%',\r\n\t\t\t\t\t\t\tfontSize: 36,\r\n\t\t\t\t\t\t\tfontWeight: 'bold',\r\n\t\t\t\t\t\t\tcolor: '#fff'\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Loader />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</Modal>\r\n\t\t\t</SnackbarProvider>\r\n\t\t</MuiPickersUtilsProvider>\r\n\t)\r\n}\r\n\r\nexport default App;\r\n","import 'react-app-polyfill/ie11';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport \"./fonts/fonts.css\";\r\nimport './index.css';\r\nimport App from './App';\r\n\r\nReactDOM.render(\r\n    <App />, \r\n    document.getElementById('root')\r\n);"],"sourceRoot":""}