aboutsummaryrefslogtreecommitdiff
path: root/build/static/js/main.47fd8d39.chunk.js.map
blob: 5dc27b048c8ba50e4673967540648d7dae7d5cf0 (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","getAuthToken","Promise","resolver","chrome","identity","interactive","token","getCalendars","fetch","access_token","method","async","then","response","json","data","items","getColors","GCalendar","calId","name","classCallCheck","this","syncToken","cache","createClass","key","value","e","ks","dateToCacheKey","start","ke","Date","end","getTime","getSlot","slotEndDate","slotStartDate","s","results","console","log","push","getSlotEvents","apply","toConsumableArray","_this","resultsPerRequest","arguments","length","undefined","singleFetch","pageToken","maxResults","status","catch","nextPageToken","nextSyncToken","getEvents","r","pm_results","resolve","eventId","getEvent","all","forEach","dateTime","addEvent","removeEvent","_this2","sync","getCachedEvents","date","Math","floor","Pattern","isRegex","label","get","RegExp","emptyPattern","anyPattern","PatternEntry","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","pitems","options","p0","isEmpty","palette","primary","dark","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","handleChangePage","setState","handleChangeRowsPerPage","_this$props","patterns","_this$state","nDummy","min","rows","slice","p","TableRow_default","onMouseOver","activePattern","onMouseOut","CustomText","TableCell_default","onUpdatePattern","deleteButtonShow","deleteButtonHide","DeleteOutlined_default","deleteIcon","onClick","onRemovePattern","Table_default","patternTable","TableHead_default","TableBody_default","colSpan","TablePagination_default","rowsPerPageOptions","component","count","backIconButtonProps","aria-label","nextIconButtonProps","onChangePage","onChangeRowsPerPage","position","right","display","cursor","overflowX","overflowY","minWidth","default_chart_data","Dashboard","timeRange","gapi","updatePattern","removePattern","splice","newPattern","analyze","startDate","endDate","toDate","event_pms","_loop","events","all_events","cal_results","_loop2","calName","filter","regex","test","filterPatterns","summary","hasOwnProperty","duration","background","alert","loadPatterns","colors","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.47fd8d39.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 getColors(token) {\n    return fetch(`${gapi_base}/colors?${to_params({access_token: token})}`,\n        { method: 'GET', async: true })\n        .then(response => response.json());\n}\n\nfunction getEvent(calId, eventId, token) {\n    return fetch(`${gapi_base}/calendars/${calId}/events/${eventId}?${to_params({access_token: token})}`,\n        { method: 'GET', async: true })\n        .then(response => response.json());\n}\n\nfunction getEvents(calId, token, syncToken, resultsPerRequest = '') {\n    let results = [];\n    const singleFetch = (pageToken, syncToken) => fetch(`${gapi_base}/calendars/${calId}/events?${to_params({\n            access_token: token,\n            pageToken,\n            syncToken,\n            maxResults: resultsPerRequest\n        })}`, { method: 'GET', async: true })\n            .then(response => {\n                if (response.status === 200)\n                    return response.json();\n                else throw {};\n            })\n            .catch(e => e)\n            .then(data => {\n                if (!data.items)\n                    return ({\n                        nextSyncToken: '',\n                        results: []\n                    });\n                results.push(...data.items);\n                if (data.nextPageToken) {\n                    return singleFetch(data.nextPageToken, '');\n                } else {\n                    return ({\n                        nextSyncToken: data.nextSyncToken,\n                        results\n                    });\n                }\n            })\n\n    return singleFetch('', syncToken);\n}\n\nexport class GCalendar {\n    constructor(calId, name) {\n        this.calId = calId;\n        this.name = name;\n        this.token = getAuthToken();\n        this.syncToken = '';\n        this.cache = {};\n    }\n\n    static dateToCacheKey(date) {\n        return Math.floor(date / 8.64e7);\n    }\n\n    getSlot(k) {\n        if (!this.cache[k])\n            this.cache[k] = {};\n        return this.cache[k];\n    }\n\n    static slotStartDate(k) { return new Date(k * 8.64e7); }\n    static slotEndDate(k) { return new Date((k + 1) * 8.64e7); }\n\n    addEvent(e) {\n        let ks = GCalendar.dateToCacheKey(e.start);\n        let ke = GCalendar.dateToCacheKey(new Date(e.end.getTime() - 1));\n        if (ks === ke)\n            this.getSlot(ks)[e.id] = {\n                start: e.start,\n                end: e.end,\n                id: e.id };\n        else\n        {\n            this.getSlot(ks)[e.id] = {\n                start: e.start,\n                end: GCalendar.slotEndDate(ks),\n                id: e.id };\n            this.getSlot(ke)[e.id] = {\n                start: GCalendar.slotStartDate(ke),\n                end: e.end,\n                id: e.id };\n            for (let k = ks + 1; k < ke; k++)\n                this.getSlot(k)[e.id] = {\n                    start: GCalendar.slotStartDate(k),\n                    end: GCalendar.slotEndDate(k),\n                    id: e.id };\n        }\n    }\n\n    removeEvent(e) {\n        let ks = GCalendar.dateToCacheKey(e.start);\n        let ke = GCalendar.dateToCacheKey(new Date(e.end.getTime() - 1));\n        for (let k = ks; k <= ke; k++)\n            delete this.getSlot(k)[e.id];\n    }\n\n    getSlotEvents(k, start, end) {\n        let s = this.getSlot(k);\n        let results = [];\n        for (let id in s) {\n            if (!(s[id].start >= end || s[id].end <= start))\n            {\n                let nstart = s[id].start < start ? start: s[id].start;\n                let nend = s[id].end > end ? end: s[id].end;\n                if (nstart > nend) console.log(s[id], start, end);\n                results.push({\n                    id,\n                    start: s[id].start < start ? start: s[id].start,\n                    end: s[id].end > end ? end: s[id].end\n                });\n            }\n        }\n        return results;\n    }\n\n    getCachedEvents(start, end) {\n        let ks = GCalendar.dateToCacheKey(start);\n        let ke = GCalendar.dateToCacheKey(new Date(end.getTime() - 1));\n        let results = this.getSlotEvents(ks, start, end);\n        for (let k = ks + 1; k < ke; k++)\n        {\n            let s = this.getSlot(k);\n            for (let id in s)\n                results.push(s[id]);\n        }\n        if (ke > ks)\n            results.push(...this.getSlotEvents(ke, start, end));\n        return results;\n    }\n\n    sync() {\n        return this.token.then(token => getEvents(this.calId, token, this.syncToken).then(r => {\n            this.syncToken = r.nextSyncToken;\n            let pm_results = r.results.map(e => e.start ? Promise.resolve(e) : getEvent(this.calId, e.id, token));\n            return Promise.all(pm_results).then(results => results.forEach(e => {\n                e.start = new Date(e.start.dateTime);\n                e.end = new Date(e.end.dateTime);\n                if (e.status === 'confirmed')\n                    this.addEvent(e);\n                else if (e.status === 'cancelled')\n                    this.removeEvent(e);\n            }));\n        }));\n    }\n\n    getEvents(start, end) {\n        return this.sync().then(() => this.getCachedEvents(start, end));\n    }\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.props.onUpdatePattern(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.props.onRemovePattern(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    onRemovePattern: PropTypes.func.isRequired,\n    onUpdatePattern: PropTypes.func.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    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.toDate();\n        let end = this.state.endDate.toDate();\n        console.log(start, end);\n        let event_pms = [];\n        for (let id in this.cached.calendars)\n            event_pms.push(this.cached.calendars[id].cal.getEvents(start, end).then(\n                r => { return { id, events: r } }));\n\n        Promise.all(event_pms).then(all_events => {\n            let events = {};\n            let results = {}; // pattern idx => time\n            let cal_results = {}; // cal id => time\n            all_events.forEach(e => events[e.id] = e.events);\n            for (let i = 0; i < this.state.patterns.length; i++)\n                results[i] = 0;\n            for (let id in this.cached.calendars) {\n                if (!events[id]) continue;\n                let patterns = filterPatterns(this.state.patterns, this.cached.calendars[id].name);\n                events[id].forEach(event => {\n                    patterns.forEach(p => {\n                        if (!p.event.regex.test(event.summary)) return;\n                        if (!cal_results.hasOwnProperty(id)) {\n                            cal_results[id] = 0;\n                        }\n                        let duration = (event.end - event.start) / 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            //console.log(patternGraphData, calendarGraphData);\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                    color: colors[item.colorId],\n                    cal: new gapi.GCalendar(item.id, item.summary)\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\n                                            patterns={this.state.patterns}\n                                            cached={this.cached}\n                                            onRemovePattern={this.removePattern}\n                                            onUpdatePattern={this.updatePattern} />\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