@allurereport/web-allure2
Version:
The static files for Allure Classic Report
50 lines (42 loc) • 1.58 kB
JavaScript
import { View } from "backbone.marionette";
import { interpolateRgb } from "d3-interpolate";
import { scaleLinear, scaleOrdinal } from "d3-scale";
import { last } from "underscore";
import TrendChartView from "@/components/graph-trend-chart/TrendChartView.js";
import { className, regions } from "@/decorators/index.js";
import duration from "@/helpers/duration.js";
import template from "./DurationTrendWidgetView.hbs";
import "./styles.scss";
({
chart: ".duration-trend__chart",
})
("duration-trend")
class DurationTrendWidgetView extends View {
template = template;
onRender() {
const key = "duration";
const values = this.model.map((model) => model.get("data")[key]);
const lastExtremum = Math.min(
...[(d) => d >= 0, (d) => d <= 0].map((op) =>
values.reduce((m, c, i) => (op(c - values[i - 1]) ? i : m), last(values)),
),
);
const amplitude = Math.max(...values) - Math.min(...values);
const lastDelta = values[lastExtremum] - last(values);
const level = scaleLinear().domain([0, Math.max(amplitude, 0.25 * Math.max(...values))]);
level.range(lastDelta > 0 ? ["#c4cac6", "#31a354"] : ["#cdc5c4", "#e34a33"]).interpolate(interpolateRgb);
const colors = scaleOrdinal().range([level(Math.abs(lastDelta))]);
this.showChildView(
"chart",
new TrendChartView({
model: this.model,
hidePoints: true,
hideLines: true,
colors,
keys: [key],
yTickFormat: (d) => duration(d, 2),
}),
);
}
}
export default DurationTrendWidgetView;