aboutsummaryrefslogtreecommitdiff
path: root/build/static/js/main.9e0b7c77.chunk.js.map
diff options
context:
space:
mode:
Diffstat (limited to 'build/static/js/main.9e0b7c77.chunk.js.map')
-rw-r--r--build/static/js/main.9e0b7c77.chunk.js.map1
1 files changed, 0 insertions, 1 deletions
diff --git a/build/static/js/main.9e0b7c77.chunk.js.map b/build/static/js/main.9e0b7c77.chunk.js.map
deleted file mode 100644
index 1cd76bc..0000000
--- a/build/static/js/main.9e0b7c77.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"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","Pattern","isRegex","value","label","classCallCheck","this","createClass","key","get","RegExp","emptyPattern","anyPattern","revive","obj","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","calendars","any","PatternTable","state","page","rowsPerPage","handleChangePage","setState","handleChangeRowsPerPage","_this2","_this$props","patterns","_this$state","nDummy","Math","min","length","rows","slice","p","TableRow_default","onMouseOver","activePattern","onMouseOut","s","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","possibleConstructorReturn","getPrototypeOf","call","timeRange","gapi","updatePattern","sendMsg","type","removePattern","splice","newPattern","toConsumableArray","loadPatterns","loadCalendars","msg","requestCallback","hasOwnProperty","inFlight","ids","maxId","cb","t","pm","resolve","pop","port","postMessage","getCalEvents","start","end","getTime","e","Date","analyze","startDate","endDate","startOf","toDate","event_pms","cals","_loop","r","events","console","log","all","all_events","results","cal_results","forEach","_loop2","calName","filter","regex","test","filterPatterns","summary","duration","background","alert","load","colors","calendar","_ref3","colorId","runtime","connect","onMessage","addListener","getCallBack","assert","undefined","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","_ref4","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.9e0b7c77.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\nconst GApiError = {\n invalidSyncToken: 1,\n otherError: 2,\n};\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=100) {\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 if (response.status === 410)\n throw GApiError.invalidSyncToken;\n else throw GApiError.otherErrors;\n })\n .then(data => {\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 summary: e.summary};\n else\n {\n this.getSlot(ks)[e.id] = {\n start: e.start,\n end: GCalendar.slotEndDate(ks),\n id: e.id,\n summary: e.summary};\n this.getSlot(ke)[e.id] = {\n start: GCalendar.slotStartDate(ke),\n end: e.end,\n id: e.id,\n summary: e.summary};\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 summary: e.summary};\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 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 summary: s[id].summary\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 })).catch(e => {\n if (e === GApiError.invalidSyncToken) {\n this.syncToken = '';\n this.sync();\n } else throw e;\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 static revive = obj => new Pattern(obj.id, obj.isRegex, obj.value, obj.label);\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 static revive = obj => new PatternEntry(\n obj.name, obj.idx,\n Pattern.revive(obj.cal), Pattern.revive(obj.event));\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.calendars) {\n options[id] = new Pattern(id, false,\n props.calendars[id].name,\n props.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, calendars, 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 calendars={calendars}\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 calendars: PropTypes.object.isRequired,\n onRemovePattern: PropTypes.func.isRequired,\n onUpdatePattern: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles)(PatternTable);\n","/* global chrome */\nimport 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 calendars: [],\n timeRange: null,\n token: gapi.getAuthToken(),\n patternGraphData: default_chart_data,\n calendarGraphData: default_chart_data,\n activePattern: null\n };\n\n constructor(props) {\n super(props);\n let port = chrome.runtime.connect({name: 'main'});\n const getCallBack = t => this.requestCallback[t];\n port.onMessage.addListener(function(msg) {\n console.log(msg);\n let t = getCallBack(msg.type);\n let e = t.inFlight[msg.id];\n console.assert(e !== undefined);\n t.ids.push(msg.id);\n e(msg);\n });\n this.port = port;\n this.requestCallback = {};\n this.sendMsg({ type: 1 }).then(msg => {\n this.setState({ patterns: msg.data.map(p => PatternEntry.revive(p)) });\n });\n this.sendMsg({ type: 3 }).then(msg => {\n this.setState({ calendars: msg.data });\n });\n }\n\n updatePattern = (field, idx, value) => {\n let patterns = this.state.patterns;\n patterns[idx][field] = value;\n this.setState({ patterns });\n this.sendMsg({ type: 0, data: 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 this.sendMsg({ type: 0, data: patterns });\n };\n\n newPattern = () => {\n let patterns = [PatternEntry.defaultPatternEntry(0), ...this.state.patterns];\n for (let i = 1; i < patterns.length; i++)\n patterns[i].idx = i;\n this.setState({ patterns });\n this.sendMsg({ type: 0, data: patterns });\n };\n\n loadPatterns = patterns => {\n this.setState({ patterns });\n this.sendMsg({ type: 0, data: patterns });\n };\n\n loadCalendars = calendars => {\n this.setState({ calendars });\n this.sendMsg({ type: 5, data: calendars });\n };\n\n sendMsg = msg => {\n if (!this.requestCallback.hasOwnProperty(msg.type))\n this.requestCallback[msg.type] = {inFlight: {}, ids: [], maxId: 0};\n let t = this.requestCallback[msg.type];\n let cb;\n let pm = new Promise(resolve => { cb = resolve; });\n let id;\n if (t.ids.length > 0) {\n id = t.ids.pop();\n } else {\n id = t.maxId++;\n }\n t.inFlight[id] = cb;\n msg.id = id;\n this.port.postMessage(msg);\n return pm;\n }\n\n getCalEvents = (id, start, end) => {\n return this.sendMsg({ type: 4, data: { id,\n start: start.getTime(),\n end: end.getTime() } })\n .then(({ data }) => data.map(e => {\n return {\n id: e.id,\n start: new Date(e.start),\n end: new Date(e.end) }\n }));\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.startOf('day').toDate();\n let end = this.state.endDate.startOf('day').toDate();\n let event_pms = [];\n let cals = this.state.calendars;\n for (let id in cals)\n event_pms.push(this.getCalEvents(id, start, end)\n .then(r => { return { id, events: r }; }));\n console.log(cals);\n Promise.all(event_pms).then(all_events => {\n console.log(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 cals) {\n if (!events[id]) continue;\n let patterns = filterPatterns(this.state.patterns, cals[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: cals[id].name,\n value: (cal_results[id] / 60.0),\n color: cals[id].color.background});\n }\n console.log(patternGraphData, calendarGraphData);\n this.setState({ patternGraphData, calendarGraphData });\n });\n };\n\n load = () => {\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 var cals = {};\n items.forEach(item => {\n cals[item.id] = {\n name: item.summary,\n color: colors[item.colorId],\n //cal: new gapi.GCalendar(item.id, item.summary)\n }});\n this.loadCalendars(cals);\n this.loadPatterns(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 calendars={this.state.calendars}\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.load}>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 ===