diff options
Diffstat (limited to 'src/graph.ts')
-rw-r--r-- | src/graph.ts | 133 |
1 files changed, 67 insertions, 66 deletions
diff --git a/src/graph.ts b/src/graph.ts index d5a65b2..8b385a3 100644 --- a/src/graph.ts +++ b/src/graph.ts @@ -1,6 +1,6 @@ +import { defaultChartColor } from './theme'; import { GCalendarEvent, GCalendarMeta } from './gapi'; import { PatternEntry } from './pattern'; -import { defaultChartColor} from './theme'; export type PatternGraphData = { name: string, @@ -15,11 +15,13 @@ export type GraphData = { data: PatternGraphData[] }; -export function getGraphData( +export async function getGraphData( start: Date, end: Date, patterns: PatternEntry[], calendars: { [id: string]: GCalendarMeta }, - calEventsGetter: (id: string, start: Date, end: Date) => Promise<GCalendarEvent[]>) { - if (start >= end) return Promise.resolve({ patternGraphData: [], calendarGraphData: [] }); + calEventsGetter: (id: string, start: Date, end: Date) => Promise<GCalendarEvent[]>): + Promise<{ patternGraphData: PatternGraphData[], calendarGraphData: PatternGraphData[] }> { + + if (start >= end) return { patternGraphData: [], calendarGraphData: [] }; let event_pms = []; for (let id in calendars) { @@ -29,69 +31,68 @@ export function getGraphData( event_pms.push(calEventsGetter(id, start, end) .then(r => { return { id, events: r, filtered }; })); } - return Promise.all(event_pms).then(all_events => { - let events: {[id: string]: GCalendarEvent[]} = {}; - let patternsByCal: {[id: string]: PatternEntry[]} = {}; - let results: {[idx: number]: number} = {}; - let cal_results: {[id: string]: number} = {}; + let all_events = await Promise.all(event_pms); - all_events.forEach(e => { - events[e.id] = e.events; - patternsByCal[e.id] = e.filtered; - }); + let events: {[id: string]: GCalendarEvent[]} = {}; + let patternsByCal: {[id: string]: PatternEntry[]} = {}; + let results: {[idx: number]: number} = {}; + let cal_results: {[id: string]: number} = {}; - for (let i = 0; i < patterns.length; i++) - results[i] = 0; - for (let id in calendars) { - if (!events[id]) continue; - events[id].forEach(event => { - patternsByCal[id].forEach(p => { - if (!p.event.regex.test(event.summary)) { - console.log(event.summary, p.event.regex); - return; - } - if (!cal_results.hasOwnProperty(id)) { - cal_results[id] = 0; - } - let duration = (event.end.getTime() - event.start.getTime()) / 60000; - results[p.idx] += duration; - cal_results[id] += duration; - }); - }); - } - let patternGraphData = []; - let calendarGraphData = []; - const filterMarginal = (data: PatternGraphData[]) => { - let sum = 0; - let majorParts = []; - let minorSum = 0; - data.forEach(d => sum += d.value); - data.forEach(d => { - let ratio = d.value / sum; - if (ratio < 1e-2) minorSum += d.value; - else majorParts.push(d); - }); - majorParts.push({ - name: 'Other', - value: minorSum, - color: defaultChartColor, - }); - return majorParts; - }; - for (let i = 0; i < patterns.length; i++) { - patternGraphData.push({ - name: patterns[i].name, - value: results[i] / 60.0, - color: patterns[i].color.background}); - } - for (let id in cal_results) { - calendarGraphData.push({ - name: calendars[id].name, - value: (cal_results[id] / 60.0), - color: calendars[id].color.background}); - } - return {start, end, - patternGraphData: filterMarginal(patternGraphData), - calendarGraphData: filterMarginal(calendarGraphData) }; + all_events.forEach(e => { + events[e.id] = e.events; + patternsByCal[e.id] = e.filtered; }); + + for (let i = 0; i < patterns.length; i++) + results[i] = 0; + for (let id in calendars) { + if (!events[id]) continue; + events[id].forEach(event => { + patternsByCal[id].forEach(p => { + if (!p.event.regex.test(event.summary)) { + console.log(event.summary, p.event.regex); + return; + } + if (!cal_results.hasOwnProperty(id)) { + cal_results[id] = 0; + } + let duration = (event.end.getTime() - event.start.getTime()) / 60000; + results[p.idx] += duration; + cal_results[id] += duration; + }); + }); + } + let patternGraphData = []; + let calendarGraphData = []; + const filterMarginal = (data: PatternGraphData[]) => { + let sum = 0; + let majorParts = []; + let minorSum = 0; + data.forEach(d => sum += d.value); + data.forEach(d => { + let ratio = d.value / sum; + if (ratio < 1e-2) minorSum += d.value; + else majorParts.push(d); + }); + majorParts.push({ + name: 'Other', + value: minorSum, + color: defaultChartColor, + }); + return majorParts; + }; + for (let i = 0; i < patterns.length; i++) { + patternGraphData.push({ + name: patterns[i].name, + value: results[i] / 60.0, + color: patterns[i].color.background}); + } + for (let id in cal_results) { + calendarGraphData.push({ + name: calendars[id].name, + value: (cal_results[id] / 60.0), + color: calendars[id].color.background}); + } + return {patternGraphData: filterMarginal(patternGraphData), + calendarGraphData: filterMarginal(calendarGraphData) }; } |