added 260907 version of worker toolkit
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
import Ember from 'ember';
|
||||
import moment from 'moment';
|
||||
import Colorable from 'flaredown/mixins/colorable';
|
||||
import Graphable from 'flaredown/components/chart/graphable';
|
||||
import * as d3 from "d3";
|
||||
|
||||
const {
|
||||
$,
|
||||
get,
|
||||
computed,
|
||||
Component,
|
||||
getProperties,
|
||||
} = Ember;
|
||||
|
||||
export default Component.extend(Colorable, Graphable, {
|
||||
colorId: '35',
|
||||
rangeDevider: 4,
|
||||
|
||||
yRulersMax: computed.max('yRulers'),
|
||||
yRulersMin: computed.min('yRulers'),
|
||||
dataValuesYMax: computed.max('dataValuesY'),
|
||||
dataValuesYMin: computed.min('dataValuesY'),
|
||||
|
||||
rulerStep: computed('dataValuesYMin', 'dataValuesYMax', function() {
|
||||
const {
|
||||
rangeDevider,
|
||||
dataValuesYMax,
|
||||
dataValuesYMin,
|
||||
} = getProperties(this, 'dataValuesYMax', 'dataValuesYMin', 'rangeDevider');
|
||||
|
||||
const result = Math.ceil((dataValuesYMax - dataValuesYMin) / rangeDevider);
|
||||
|
||||
return result || 1;
|
||||
}),
|
||||
|
||||
domainPadding: computed('yRulersMax', 'yRulersMin', function() {
|
||||
const { rangeDevider, yRulersMax, yRulersMin } = getProperties(this, 'rangeDevider', 'yRulersMax', 'yRulersMin');
|
||||
|
||||
return (yRulersMax - yRulersMin) / rangeDevider;
|
||||
}),
|
||||
|
||||
domain: computed('yRulersMax', 'yRulersMin', 'domainPadding', function() {
|
||||
const {
|
||||
yRulersMax,
|
||||
yRulersMin,
|
||||
domainPadding,
|
||||
} = getProperties(this, 'yRulersMax', 'yRulersMin', 'domainPadding');
|
||||
|
||||
return [
|
||||
yRulersMin - domainPadding,
|
||||
yRulersMax + domainPadding,
|
||||
];
|
||||
}),
|
||||
|
||||
points: computed('data', function() {
|
||||
const { data, xScale, yScale } = getProperties(this, 'data', 'xScale', 'yScale');
|
||||
|
||||
return(
|
||||
data
|
||||
.filter(item => $.isNumeric(item.y))
|
||||
.map(item => {
|
||||
const x = xScale(item.x);
|
||||
const y = yScale(item.y) - 4; // minus radius
|
||||
|
||||
return {
|
||||
x,
|
||||
y,
|
||||
tip: {
|
||||
label: item.y,
|
||||
x: x - 15,
|
||||
y: y - 10
|
||||
}
|
||||
};
|
||||
})
|
||||
);
|
||||
}),
|
||||
|
||||
yRulers: computed('data', function() {
|
||||
const {
|
||||
rulerStep,
|
||||
dataValuesYMax,
|
||||
dataValuesYMin,
|
||||
} = getProperties(this, 'dataValuesYMax', 'dataValuesYMin', 'rulerStep');
|
||||
|
||||
let result = [];
|
||||
const max = dataValuesYMax + rulerStep;
|
||||
|
||||
for (let i = dataValuesYMin; i < max; i += rulerStep) {
|
||||
result.pushObject(i);
|
||||
}
|
||||
|
||||
result = result.uniq();
|
||||
|
||||
if (result.length < 4) {
|
||||
result.pushObjects([dataValuesYMax + rulerStep, dataValuesYMin - rulerStep]);
|
||||
|
||||
let offset = dataValuesYMin - rulerStep;
|
||||
|
||||
offset = offset >= 0 ? 0 : offset;
|
||||
|
||||
return result.uniq().map(v => v - offset);
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}),
|
||||
|
||||
dataValuesY: computed('data', function() {
|
||||
const values = get(this, 'data')
|
||||
.filter(item => item.y || item.y === 0)
|
||||
.map(item => item.y)
|
||||
.compact();
|
||||
|
||||
return values.length ? values : [0, 100];
|
||||
}),
|
||||
|
||||
yScale: computed('data', function() {
|
||||
const { height, domain } = getProperties(this, 'height', 'domain');
|
||||
|
||||
return(
|
||||
d3
|
||||
.scale
|
||||
.linear()
|
||||
.range([height, 0])
|
||||
.domain(domain)
|
||||
);
|
||||
}),
|
||||
|
||||
data: computed('checkins', function() {
|
||||
const {
|
||||
field,
|
||||
checkins,
|
||||
timeline,
|
||||
} = getProperties(this, 'field', 'timeline', 'checkins');
|
||||
|
||||
return (timeline || []).map(day => {
|
||||
let filteredCheckins = checkins.filter((checkin) => (
|
||||
get(checkin, 'formattedDate') === moment(day).format("YYYY-MM-DD")
|
||||
))
|
||||
let coordinate = { x: day, y: null };
|
||||
|
||||
if (filteredCheckins.length) {
|
||||
let items = filteredCheckins.map((checkin) => (
|
||||
get(checkin, 'harveyBradshawIndex')
|
||||
)).filter(Boolean)
|
||||
|
||||
if (items.length) {
|
||||
let itemValues = items.map(checkin => get(checkin, field)).filter(Boolean)
|
||||
let value = itemValues.reduce((acc, val) => (acc + val), 0) / itemValues.length
|
||||
|
||||
coordinate.y = value
|
||||
}
|
||||
}
|
||||
|
||||
return coordinate;
|
||||
});
|
||||
}),
|
||||
});
|
||||
Reference in New Issue
Block a user