aboutsummaryrefslogtreecommitdiff
path: root/build/static/js/main.be3162b4.chunk.js.map
blob: a629b34859c481462205952f8f70981a3f41c934 (plain) (blame)
1
{"version":3,"sources":["Logo.js","gapi.js","pattern.js","Chart.js","RegexField.js","theme.js","PatternTable.js","App.js","serviceWorker.js","index.js"],"names":["Logo","props","react_default","a","createElement","xmlns","viewBox","version","style","id","transform","points","fill","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontFamily","gapi_base","to_params","dict","Object","entries","map","_ref","_ref2","slicedToArray","k","v","concat","encodeURIComponent","join","getCalendars","token","fetch","access_token","method","async","then","response","json","data","items","getColors","Pattern","isRegex","value","label","classCallCheck","this","createClass","key","get","RegExp","emptyPattern","anyPattern","PatternEntry","name","idx","calPattern","eventPattern","cal","event","defaultPatternEntry","customizedLabel","cx","cy","x","y","anchor","dx","dy","textAnchor","withStyles","theme","pieChart","margin","Grid_default","container","spacing","item","xs","lg","className","classes","patternTableWrapper","PieChart","width","height","Pie","patternGraphData","dataKey","outerRadius","deepOrange","Tooltip","formatter","toFixed","calendarGraphData","innerRadius","cyan","d","i","Cell","color","RegexField","_this","pitems","options","p0","isEmpty","palette","primary","dark","push","MenuItem_default","fieldRegex","fieldNoRegex","FormControl_default","Select_default","onChange","target","TextField_default","React","Component","RegexFieldWithStyles","marginRight","createMuiTheme","light","orange","main","contrastText","typography","useNextVariants","patternHead","field","elem","TextField","withTheme","cached","calendars","any","PatternTable","state","page","rowsPerPage","setState","_this2","_this$props","patterns","_this$state","nDummy","Math","min","length","rows","slice","p","TableRow_default","onMouseOver","activePattern","onMouseOut","s","CustomText","TableCell_default","updatePattern","deleteButtonShow","deleteButtonHide","DeleteOutlined_default","deleteIcon","onClick","removePattern","Table_default","patternTable","TableHead_default","TableBody_default","colSpan","TablePagination_default","rowsPerPageOptions","component","count","backIconButtonProps","aria-label","nextIconButtonProps","onChangePage","handleChangePage","onChangeRowsPerPage","handleChangeRowsPerPage","position","right","display","cursor","overflowX","overflowY","minWidth","default_chart_data","Dashboard","timeRange","Promise","resolver","chrome","identity","getAuthToken","interactive","splice","newPattern","toConsumableArray","analyze","startDate","endDate","start","toISOString","end","event_pms","_loop","calId","timeMin","timeMax","status","catch","e","console","log","events","all","results","cal_results","_loop2","calName","filter","regex","test","filterPatterns","forEach","summary","undefined","duration","Date","dateTime","background","alert","loadPatterns","colors","gapi","calendar","cals","colorId","styles","root","AppBar_default","appBar","Toolbar_default","toolbar","Typography_default","variant","noWrap","title","verticalAlign","content","appBarSpacer","CssBaseline_default","md","fullWidth","FormGroup_default","gutterBottom","IconButton_default","marginBottom","marginLeft","AddCircle_default","src_PatternTable","textAlign","react_dates","startDateId","endDateId","onDatesChange","_ref3","focusedInput","onFocusChange","isOutsideRange","buttonSpacer","Button_default","Chart","zIndex","drawer","transition","transitions","create","easing","sharp","leavingScreen","flexGrow","sectionTitle","flex","mixins","padding","unit","overflow","fab","Boolean","window","location","hostname","match","ReactDOM","render","App","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.be3162b4.chunk.js","sourcesContent":["import React from 'react';\nexport default (props) =>\n  <svg\n     xmlns=\"http://www.w3.org/2000/svg\"\n     viewBox=\"0 0 98.905998 93.557997\"\n     version=\"1.1\"\n     style={props.style}>\n    <g id=\"g13\"\n       transform=\"translate(-153.533,-203.047)\">\n      <g id=\"g29\">\n        <g\n           id=\"g27\">\n          <polygon\n             id=\"polygon7\"\n             points=\"252.439,241.924 234.556,288.703 185.103,296.605 153.533,257.728 171.416,210.949 220.869,203.047 \"\n             style={{fill: '#ff8000'}} />\n          <g\n             id=\"g11\"\n             transform=\"translate(167.24355,224.20734)\">\n            <text\n               id=\"text9\"\n                style={{fontStyle:'normal',\n                    fontVariant:'normal',\n                    fontWeight:'normal',\n                    fontStretch:'normal',\n                    fontSize:75,\n                    fontFamily:'TypoPRO Fantasque Sans Mono',\n                    fill:'#ffeade'}}\n               transform=\"translate(0.586,49.072)\">Cr</text>\n          </g>\n        </g>\n      </g>\n    </g>\n  </svg>\n","/* global chrome */\nconst gapi_base = 'https://www.googleapis.com/calendar/v3';\n\nfunction to_params(dict) {\n    return Object.entries(dict).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&');\n}\n\nexport function getAuthToken() {\n    return new Promise(resolver =>\n        chrome.identity.getAuthToken(\n            {interactive: true}, token => resolver(token)));\n}\n\nexport function getCalendars(token) {\n    return fetch(gapi_base + '/users/me/calendarList?' + to_params({access_token: token}),\n            { method: 'GET', async: true })\n        .then(response => response.json())\n        .then(data => data.items);\n}\n\nexport function genEventsGetter(calId, timeMin, timeMax) {\n    return token => fetch(gapi_base + '/calendars/' + calId + '/events?' + to_params({\n        access_token: token,\n        timeMin,\n        timeMax\n    }), { method: 'GET', async: true })\n        .then(response => {\n            if (response.status === 200)\n                return response.json()\n            else throw `got response ${response.status}`;\n        })\n        .catch(e => { console.log(e); return []; })\n        .then(data => data.items);\n}\n\nexport function getColors(token) {\n    return fetch(gapi_base + '/colors?' + to_params({access_token: token}), { method: 'GET', async: true })\n        .then(response => response.json());\n}\n","export class Pattern {\n    constructor(id, isRegex, value, label) {\n        this.id = id;\n        this.isRegex = isRegex;\n        this.value = value;\n        this.label = label;\n    }\n\n    get regex() { return new RegExp(this.isRegex ? this.value : `^${this.value}$`); }\n    get isEmpty() { return this.label === null; }\n    static emptyPattern = () => new Pattern(0, true, '', null);\n    static anyPattern = () => new Pattern('any', true, '.*', 'Any');\n}\n\nexport class PatternEntry {\n    constructor(name, idx, calPattern, eventPattern) {\n        this.name = name;\n        this.idx = idx;\n        this.cal = calPattern;\n        this.event = eventPattern;\n    }\n\n    static defaultPatternEntry = (idx) => new PatternEntry('', idx, Pattern.emptyPattern(), Pattern.anyPattern());\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Grid from '@material-ui/core/Grid';\nimport deepOrange from '@material-ui/core/colors/deepOrange';\nimport cyan from '@material-ui/core/colors/cyan';\nimport { PieChart, Pie, Cell, Tooltip } from 'recharts';\n\nconst styles = theme => ({\n    pieChart: {\n        margin: '0 auto',\n    }\n});\n\nfunction customizedLabel(props) {\n    const {cx, cy, x, y, fill, name} = props;\n    let anchor = \"middle\";\n    const EPS = 2;\n    let dx = 0;\n    let dy = 0;\n    if (x < cx - EPS) {\n        dx = -5;\n        anchor = \"end\"\n    } else if (x > cx + EPS) {\n        dx = 5;\n        anchor = \"start\";\n    }\n\n    if (y < cy - EPS) {\n        dy = -5;\n    } else if (y > cy + EPS) {\n        dy = 10;\n    }\n\n    return (<text x={x} y={y} dx={dx} dy={dy} fill={fill} textAnchor={anchor}>{`${name}`}</text>);\n}\n\nfunction ChromiclePieChart(props) {\n    return (\n    <Grid container spacing={0}>\n      <Grid item xs={12} lg={6}>\n        <div className={props.classes.patternTableWrapper}>\n        <PieChart width={400} height={250} className={props.classes.pieChart}>\n          <Pie data={props.patternGraphData}\n               dataKey='value'\n               cx={200}\n               cy={125}\n               outerRadius={60}\n               fill={deepOrange[300]}\n               label={customizedLabel}/>\n          <Tooltip formatter={(value) => `${value.toFixed(2)} hr`}/>\n        </PieChart>\n        </div>\n      </Grid>\n      <Grid item xs={12} lg={6}>\n        <div className={props.classes.patternTableWrapper}>\n        <PieChart width={400} height={250} className={props.classes.pieChart}>\n          <Pie data={props.calendarGraphData}\n               dataKey='value'\n               cx={200}\n               cy={125}\n               innerRadius={40}\n               outerRadius={70}\n               fill={cyan[300]}\n               label={customizedLabel}>\n            {props.calendarGraphData.map((d, i) => <Cell key={i} fill={d.color}/>)}\n          </Pie>\n          <Tooltip formatter={(value) => `${value.toFixed(2)} hr`}/>\n        </PieChart>\n        </div>\n      </Grid>\n    </Grid>);\n}\n\nChromiclePieChart.propTypes = {\n    patternGraphData: PropTypes.array.isRequired,\n    calendarGraphData: PropTypes.array.isRequired,\n};\n\nexport default withStyles(styles)(ChromiclePieChart);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport { Pattern } from './pattern';\n\nconst styles = theme => ({\n    fieldNoRegex: {\n        width: 200\n    },\n    fieldRegex: {\n        marginRight: '0.5em'\n    }\n});\n\nclass RegexField extends React.Component {\n    render() {\n        const { classes } = this.props;\n        let items = [];\n        var pitems = this.props.options;\n        const p0 = new Pattern.emptyPattern();\n        pitems[p0.id] = p0;\n        for (let id in pitems)\n        {\n            const label = !pitems[id].isEmpty ? pitems[id].label :\n                <span style={{color: this.props.theme.palette.primary.dark}}>Custom</span>;\n            items.push(<MenuItem key={id} value={id}>{label}</MenuItem>);\n        }\n        const selectOnClick = event => {\n            let value;\n            if (pitems[event.target.value].label == null) {\n                value = new Pattern(0, true,\n                    this.props.value.isRegex ?\n                    this.props.value.value :\n                    `^${this.props.value.value}$`, null);\n            } else {\n                value = pitems[event.target.value];\n            }\n            this.props.onChange({target: {value}});\n        };\n\n        const regexTextOnChange = event => this.props.onChange({\n            target: { value: new Pattern(0, true, event.target.value, null)}});\n\n        const className = this.props.value.isRegex ? classes.fieldRegex: classes.fieldNoRegex;\n        return (\n            <FormControl>\n                <span>\n                    <Select\n                        value={this.props.value.id}\n                        onChange={selectOnClick}\n                        className={className}>{items}\n                    </Select>\n                    {this.props.value.label == null && (\n                        <TextField\n                            value={this.props.value.value}\n                            onChange={regexTextOnChange} />\n                    )}\n                </span>\n            </FormControl>);\n    }\n}\n\nRegexField.propTypes = {\n    classes: PropTypes.object.isRequired,\n};\n\nconst RegexFieldWithStyles = withStyles(styles)(RegexField);\n\nexport function CalendarField(props) {\n    let options = {};\n    for (let id in props.cached.calendars) {\n        options[id] = new Pattern(id, false,\n            props.cached.calendars[id].name,\n            props.cached.calendars[id].name);\n    }\n    return (\n        <RegexFieldWithStyles\n            value={props.value}\n            options={options}\n            onChange={props.onChange}\n            theme={props.theme} />);\n}\n\nexport function EventField(props) {\n    let any = Pattern.anyPattern();\n    let options = {};\n    options[any.id] = any;\n    return (\n        <RegexFieldWithStyles\n            value={props.value}\n            options={options}\n            onChange={props.onChange}\n            theme={props.theme} />);\n}\n","import { createMuiTheme } from '@material-ui/core/styles';\nimport orange from '@material-ui/core/colors/orange';\n\nconst theme = createMuiTheme({\n    palette: {\n        primary: {\n            light: orange[300],\n            main: orange[500],\n            dark: orange[700],\n            contrastText: \"#fff\"\n        }\n    },\n    typography: {\n        useNextVariants: true,\n    }\n});\n\nexport default theme;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles, withTheme } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableRow from '@material-ui/core/TableRow';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TablePagination from '@material-ui/core/TablePagination';\nimport DeleteOutlinedIcon from '@material-ui/icons/DeleteOutlined';\nimport { CalendarField, EventField } from './RegexField';\nimport theme from './theme';\n\nconst styles = theme => ({\n    deleteButtonShow: {\n        position: 'absolute',\n        right: 0,\n        height: 48\n    },\n    deleteButtonHide: {\n        display: 'none'\n    },\n    deleteIcon: {\n        height: '100%',\n        cursor: 'pointer'\n    },\n    patternTableWrapper: {\n        overflowX: 'auto',\n        overflowY: 'hidden'\n    },\n    patternTable: {\n        minWidth: 600\n    }\n});\n\nconst patternHead = [\n    {label: \"Name\", field: \"name\", elem: TextField},\n    {label: \"Calendar\", field: \"cal\", elem: withTheme(theme)(CalendarField)},\n    {label: \"Event\", field: 'event', elem: withTheme(theme)(EventField)}];\n\nclass PatternTable extends React.Component {\n    state = {\n        page: 0,\n        rowsPerPage: 5,\n    };\n\n    handleChangePage(event, page) {\n        this.setState({ page });\n    }\n\n    handleChangeRowsPerPage(event) {\n        this.setState({ rowsPerPage: event.target.value });\n    }\n\n    render() {\n        const { classes, cached, patterns } = this.props;\n        const { rowsPerPage, page } = this.state;\n        const nDummy = rowsPerPage - Math.min(rowsPerPage, patterns.length - page * rowsPerPage);\n        let rows = patterns.slice(page * rowsPerPage, (page + 1) * rowsPerPage).map(p => (\n            <TableRow\n                onMouseOver={() => this.setState({ activePattern: p.idx })}\n                onMouseOut={() => this.setState({ activePattern: null })}>\n                {\n                    patternHead.map(s => {\n                        const CustomText = s.elem;\n                        return (\n                            <TableCell>\n                                <CustomText\n                                    value={p[s.field]}\n                                    cached={cached}\n                                    onChange={event => this.updatePattern(s.field, p.idx, event.target.value)}/>\n                            </TableCell>)})\n                }\n                <span className={this.state.activePattern === p.idx ? classes.deleteButtonShow : classes.deleteButtonHide}>\n                    <DeleteOutlinedIcon\n                        className={classes.deleteIcon}\n                        onClick={() => this.removePattern(p.idx)} />\n                </span>\n            </TableRow>));\n\n        return (\n            <div>\n                <div className={classes.patternTableWrapper}>\n                    <Table className={classes.patternTable}>\n                        <TableHead>\n                            <TableRow>{patternHead.map((s, i) => (<TableCell key={i}>{s.label}</TableCell>))}</TableRow>\n                        </TableHead>\n                        <TableBody>\n                            {rows}\n                            {\n                                nDummy > 0 && (\n                                    <TableRow style={{ height: 48 * nDummy }}>\n                                        <TableCell colSpan={patternHead.length} />\n                                    </TableRow>)\n                            }\n                        </TableBody>\n                    </Table>\n                </div>\n                <TablePagination\n                    rowsPerPageOptions={[5, 10, 25]}\n                    component=\"div\"\n                    count={patterns.length}\n                    rowsPerPage={rowsPerPage}\n                    page={page}\n                    backIconButtonProps={{'aria-label': 'Previous Page'}}\n                    nextIconButtonProps={{'aria-label': 'Next Page'}}\n                    onChangePage={this.handleChangePage}\n                    onChangeRowsPerPage={this.handleChangeRowsPerPage} />\n            </div>);\n    }\n}\n\n\nPatternTable.propTypes = {\n    classes: PropTypes.object.isRequired,\n    patterns: PropTypes.array.isRequired,\n    cached: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(PatternTable);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport 'typeface-roboto';\nimport 'react-dates/initialize';\nimport 'react-dates/lib/css/_datepicker.css';\nimport { DateRangePicker } from 'react-dates';\nimport { withStyles } from '@material-ui/core/styles';\nimport { MuiThemeProvider } from '@material-ui/core/styles';\nimport cyan from '@material-ui/core/colors/cyan';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport Grid from '@material-ui/core/Grid';\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\nimport IconButton from '@material-ui/core/IconButton';\nimport Logo from './Logo';\nimport * as gapi from './gapi';\nimport { Pattern, PatternEntry } from './pattern';\nimport PieChart from './Chart';\nimport PatternTable from './PatternTable';\nimport theme from './theme';\n\nconst default_chart_data = [\n    {name: 'Work', value: 10, color: cyan[300]},\n    {name: 'Wasted', value: 10, color: cyan[300]}];\n\nfunction filterPatterns(patterns, calName) {\n    return patterns.filter(p => {\n        return p.cal.regex.test(calName);\n    });\n}\n\nconst styles = theme => ({\n    root: {\n        display: 'flex',\n        height: '100vh',\n    },\n    appBar: {\n        zIndex: theme.zIndex.drawer + 1,\n        transition: theme.transitions.create(['width', 'margin'], {\n            easing: theme.transitions.easing.sharp,\n            duration: theme.transitions.duration.leavingScreen,\n        }),\n    },\n    title: {\n        flexGrow: 1,\n    },\n    sectionTitle: {\n        flex: '0 0 auto'\n    },\n    appBarSpacer: theme.mixins.toolbar,\n    content: {\n        flexGrow: 1,\n        padding: theme.spacing.unit * 3,\n        overflow: 'auto',\n    },\n    buttonSpacer: {\n        marginBottom: theme.spacing.unit * 4,\n    },\n    fab: {\n        margin: theme.spacing.unit,\n    },\n});\n\nclass Dashboard extends React.Component {\n    state = {\n        patterns: [],\n        timeRange: null,\n        token: gapi.getAuthToken(),\n        patternGraphData: default_chart_data,\n        calendarGraphData: default_chart_data,\n        activePattern: null\n    };\n\n    cached = {\n        calendars: {}\n    };\n\n    handleChangePage = (event, page) => {\n        this.setState({ page });\n    };\n\n    handleChangeRowsPerPage = event => {\n        this.setState({ rowsPerPage: event.target.value });\n    };\n\n    updatePattern = (field, idx, value) => {\n        let patterns = this.state.patterns;\n        patterns[idx][field] = value;\n        this.setState({ patterns });\n    };\n\n    removePattern = idx => {\n        let patterns = this.state.patterns;\n        patterns.splice(idx, 1);\n        for (let i = 0; i < patterns.length; i++)\n            patterns[i].idx = i;\n        this.setState({ patterns });\n    };\n\n    newPattern = () => {\n        let patterns = [PatternEntry.defaultPatternEntry(), ...this.state.patterns];\n        for (let i = 1; i < patterns.length; i++)\n            patterns[i].idx = i;\n        this.setState({ patterns });\n    };\n\n    analyze = () => {\n        if (!(this.state.startDate && this.state.endDate)) {\n            alert(\"Please choose a valid time range.\");\n            return;\n        }\n        let start = this.state.startDate.toISOString();\n        let end = this.state.endDate.toISOString();\n        let event_pms = [];\n        for (let id in this.cached.calendars) {\n            event_pms.push(\n                this.state.token\n                .then(gapi.genEventsGetter(id, start, end))\n                .then(items => this.cached.calendars[id].events = items));\n        }\n\n        Promise.all(event_pms).then(() => {\n            let results = {}; // pattern idx => time\n            let cal_results = {}; // cal id => time\n            for (let i = 0; i < this.state.patterns.length; i++)\n                results[i] = 0;\n            for (let id in this.cached.calendars) {\n                let patterns = filterPatterns(this.state.patterns, this.cached.calendars[id].name);\n                if (!this.cached.calendars[id].events) continue;\n                this.cached.calendars[id].events.forEach(event => {\n                    if (event.status !== \"confirmed\") return;\n                    patterns.forEach(p => {\n                        if (!p.event.regex.test(event.summary)) return;\n                        if (cal_results[id] === undefined) {\n                            cal_results[id] = 0;\n                        }\n                        let duration = (new Date(event.end.dateTime) - new Date(event.start.dateTime)) / 60000;\n                        results[p.idx] += duration;\n                        cal_results[id] += duration;\n                    });\n                });\n            }\n            let patternGraphData = [];\n            let calendarGraphData = [];\n            for (let i = 0; i < this.state.patterns.length; i++) {\n                patternGraphData.push({ name: this.state.patterns[i].name, value: results[i] / 60.0 });\n            }\n            for (let id in cal_results) {\n                calendarGraphData.push({\n                    name: this.cached.calendars[id].name,\n                    value: (cal_results[id] / 60.0),\n                    color: this.cached.calendars[id].color.background});\n            }\n            this.setState({ patternGraphData, calendarGraphData });\n        });\n    };\n\n    loadPatterns = () => {\n        let token = this.state.token;\n        let colors = token.then(gapi.getColors).then(color => {\n            return color.calendar;\n        });\n        let cals = token.then(gapi.getCalendars);\n        Promise.all([colors, cals]).then(([colors, items]) => {\n            items.forEach(item => {\n                this.cached.calendars[item.id] = {\n                    name: item.summary,\n                    events: {},\n                    color: colors[item.colorId]\n                };\n            });\n            this.setState({ patterns: items.map((item, idx) => {\n                return new PatternEntry(item.summary, idx,\n                    new Pattern(item.id, false, item.summary, item.summary),\n                    Pattern.anyPattern());\n            })});\n        });\n    };\n\n    render() {\n        const { classes } = this.props;\n\n        return (\n            <MuiThemeProvider theme={theme}>\n                <div className={classes.root}>\n                    <AppBar\n                        position=\"absolute\"\n                        className={classes.appBar}>\n                        <Toolbar className={classes.toolbar}>\n                            <Typography component=\"h1\" variant=\"h6\" color=\"inherit\" noWrap className={classes.title}>\n                                <Logo style={{width: '2em', verticalAlign: 'bottom', marginRight: '0.2em'}}/>Chromicle\n                            </Typography>\n                        </Toolbar>\n                    </AppBar>\n                    <main className={classes.content}>\n                        <div className={classes.appBarSpacer} />\n                        <Grid container  spacing={16}>\n                            <CssBaseline />\n                            <Grid item md={6} xs={12}>\n                                <FormControl fullWidth={true}>\n                                    <FormGroup>\n                                        <Typography variant=\"h6\" component=\"h1\" gutterBottom>\n                                            Event Patterns\n                                            <IconButton\n                                                style={{marginBottom: '0.12em', marginLeft: '0.5em'}}\n                                                onClick={() => this.newPattern()}><AddCircleIcon /></IconButton>\n                                        </Typography>\n                                        <PatternTable patterns={this.state.patterns} cached={this.cached} />\n                                    </FormGroup>\n                                    <FormGroup>\n                                        <Typography variant=\"h6\" component=\"h1\" gutterBottom>\n                                            Time Range\n                                        </Typography>\n                                        <div style={{textAlign: 'center'}}>\n                                            <DateRangePicker\n                                                startDate={this.state.startDate}\n                                                startDateId=\"start_date_id\"\n                                                endDate={this.state.endDate}\n                                                endDateId=\"end_date_id\"\n                                                onDatesChange={({ startDate, endDate }) => {\n                                                    this.setState({ startDate, endDate });\n                                                }} \n                                                focusedInput={this.state.focusedInput}\n                                                onFocusChange={focusedInput => this.setState({ focusedInput })}\n                                                isOutsideRange={() => false}/>\n                                        </div>\n                                    </FormGroup>\n                                    <div className={classes.buttonSpacer} />\n                                    <Grid container spacing={16}>\n                                        <Grid item md={6} xs={12}>\n                                            <FormGroup>\n                                                <Button variant=\"contained\" color=\"primary\" onClick={this.loadPatterns}>Load</Button>\n                                            </FormGroup>\n                                        </Grid>\n                                        <Grid item md={6} xs={12}>\n                                            <FormGroup>\n                                                <Button variant=\"contained\" color=\"primary\" onClick={this.analyze}>Analyze</Button>\n                                            </FormGroup>\n                                        </Grid>\n                                    </Grid>\n                                </FormControl>\n                            </Grid>\n                            <Grid item md={6} xs={12}>\n                                <Typography variant=\"h6\" component=\"h1\" gutterBottom>\n                                    Graph\n                                </Typography>\n                                <PieChart\n                                    patternGraphData={this.state.patternGraphData}\n                                    calendarGraphData={this.state.calendarGraphData}/>\n                            </Grid>\n                        </Grid>\n                    </main>\n                </div>\n            </MuiThemeProvider>);\n    }\n}\n\nDashboard.propTypes = {\n    classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(Dashboard);\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.1/8 is considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit http://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl)\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}