Use browserLinksSupported preference

This commit is contained in:
Henrik Giesel 2021-01-25 17:36:04 +01:00
parent 759ed17963
commit 5a987d77b2
10 changed files with 51 additions and 22 deletions

View file

@ -10,13 +10,16 @@
import GraphRangeRadios from "./GraphRangeRadios.svelte"; import GraphRangeRadios from "./GraphRangeRadios.svelte";
import TableData from "./TableData.svelte"; import TableData from "./TableData.svelte";
import { createEventDispatcher } from "svelte"; import { createEventDispatcher } from "svelte";
import type { PreferenceStore } from "./preferences";
export let sourceData: pb.BackendProto.GraphsOut | null = null; export let sourceData: pb.BackendProto.GraphsOut | null = null;
export let i18n: I18n; export let i18n: I18n;
export let preferences: PreferenceStore;
let histogramData = null as HistogramData | null; let histogramData = null as HistogramData | null;
let tableData: TableDatum[] = []; let tableData: TableDatum[] = [];
let graphRange: GraphRange = GraphRange.Month; let graphRange: GraphRange = GraphRange.Month;
let { browserLinksSupported } = preferences;
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@ -26,7 +29,13 @@
} }
$: if (addedData) { $: if (addedData) {
[histogramData, tableData] = buildHistogram(addedData, graphRange, i18n, dispatch); [histogramData, tableData] = buildHistogram(
addedData,
graphRange,
i18n,
dispatch,
$browserLinksSupported
);
} }
const title = i18n.tr(i18n.TR.STATISTICS_ADDED_TITLE); const title = i18n.tr(i18n.TR.STATISTICS_ADDED_TITLE);
@ -42,7 +51,7 @@
<GraphRangeRadios bind:graphRange {i18n} revlogRange={RevlogRange.All} /> <GraphRangeRadios bind:graphRange {i18n} revlogRange={RevlogRange.All} />
</div> </div>
<HistogramGraph data={histogramData} {i18n} on:search /> <HistogramGraph data={histogramData} {i18n} />
<TableData {i18n} {tableData} /> <TableData {i18n} {tableData} />
</div> </div>

View file

@ -7,17 +7,25 @@
import type { TableDatum } from "./graph-helpers"; import type { TableDatum } from "./graph-helpers";
import TableData from "./TableData.svelte"; import TableData from "./TableData.svelte";
import { createEventDispatcher } from "svelte"; import { createEventDispatcher } from "svelte";
import type { PreferenceStore } from "./preferences";
export let sourceData: pb.BackendProto.GraphsOut | null = null; export let sourceData: pb.BackendProto.GraphsOut | null = null;
export let i18n: I18n; export let i18n: I18n;
export let preferences: PreferenceStore;
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
let histogramData = null as HistogramData | null; let histogramData = null as HistogramData | null;
let tableData: TableDatum[] = []; let tableData: TableDatum[] = [];
let { browserLinksSupported } = preferences;
$: if (sourceData) { $: if (sourceData) {
[histogramData, tableData] = prepareData(gatherData(sourceData), i18n, dispatch); [histogramData, tableData] = prepareData(
gatherData(sourceData),
i18n,
dispatch,
$browserLinksSupported
);
} }
const title = i18n.tr(i18n.TR.STATISTICS_CARD_EASE_TITLE); const title = i18n.tr(i18n.TR.STATISTICS_CARD_EASE_TITLE);
@ -29,7 +37,7 @@
<div class="subtitle">{subtitle}</div> <div class="subtitle">{subtitle}</div>
<HistogramGraph data={histogramData} {i18n} on:search /> <HistogramGraph data={histogramData} {i18n} />
<TableData {i18n} {tableData} /> <TableData {i18n} {tableData} />
</div> </div>

View file

@ -10,9 +10,11 @@
import GraphRangeRadios from "./GraphRangeRadios.svelte"; import GraphRangeRadios from "./GraphRangeRadios.svelte";
import TableData from "./TableData.svelte"; import TableData from "./TableData.svelte";
import { createEventDispatcher } from "svelte"; import { createEventDispatcher } from "svelte";
import type { PreferenceStore } from "./preferences";
export let sourceData: pb.BackendProto.GraphsOut | null = null; export let sourceData: pb.BackendProto.GraphsOut | null = null;
export let i18n: I18n; export let i18n: I18n;
export let preferences: PreferenceStore;
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@ -21,6 +23,7 @@
let tableData: TableDatum[] = [] as any; let tableData: TableDatum[] = [] as any;
let backlog: boolean = true; let backlog: boolean = true;
let graphRange: GraphRange = GraphRange.Month; let graphRange: GraphRange = GraphRange.Month;
let { browserLinksSupported } = preferences;
$: if (sourceData) { $: if (sourceData) {
graphData = gatherData(sourceData); graphData = gatherData(sourceData);
@ -33,6 +36,7 @@
backlog, backlog,
i18n, i18n,
dispatch, dispatch,
$browserLinksSupported
)); ));
} }
@ -57,7 +61,7 @@
<GraphRangeRadios bind:graphRange {i18n} revlogRange={RevlogRange.All} /> <GraphRangeRadios bind:graphRange {i18n} revlogRange={RevlogRange.All} />
</div> </div>
<HistogramGraph data={histogramData} {i18n} on:search /> <HistogramGraph data={histogramData} {i18n} />
<TableData {i18n} {tableData} /> <TableData {i18n} {tableData} />
</div> </div>

View file

@ -1,5 +1,4 @@
<script lang="typescript"> <script lang="typescript">
import { createEventDispatcher } from "svelte";
import type { HistogramData } from "./histogram-graph"; import type { HistogramData } from "./histogram-graph";
import { histogramGraph } from "./histogram-graph"; import { histogramGraph } from "./histogram-graph";
import AxisTicks from "./AxisTicks.svelte"; import AxisTicks from "./AxisTicks.svelte";
@ -10,12 +9,10 @@
export let data: HistogramData | null = null; export let data: HistogramData | null = null;
export let i18n: I18n; export let i18n: I18n;
const dispatch = createEventDispatcher();
let bounds = defaultGraphBounds(); let bounds = defaultGraphBounds();
let svg = null as HTMLElement | SVGElement | null; let svg = null as HTMLElement | SVGElement | null;
$: histogramGraph(svg as SVGElement, bounds, data, dispatch); $: histogramGraph(svg as SVGElement, bounds, data);
</script> </script>
<svg bind:this={svg} viewBox={`0 0 ${bounds.width} ${bounds.height}`}> <svg bind:this={svg} viewBox={`0 0 ${bounds.width} ${bounds.height}`}>

View file

@ -13,9 +13,11 @@
import type { TableDatum } from "./graph-helpers"; import type { TableDatum } from "./graph-helpers";
import TableData from "./TableData.svelte"; import TableData from "./TableData.svelte";
import { createEventDispatcher } from "svelte"; import { createEventDispatcher } from "svelte";
import type { PreferenceStore } from "./preferences";
export let sourceData: pb.BackendProto.GraphsOut | null = null; export let sourceData: pb.BackendProto.GraphsOut | null = null;
export let i18n: I18n; export let i18n: I18n;
export let preferences: PreferenceStore;
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@ -23,13 +25,20 @@
let histogramData = null as HistogramData | null; let histogramData = null as HistogramData | null;
let tableData: TableDatum[] = []; let tableData: TableDatum[] = [];
let range = IntervalRange.Percentile95; let range = IntervalRange.Percentile95;
let { browserLinksSupported } = preferences;
$: if (sourceData) { $: if (sourceData) {
intervalData = gatherIntervalData(sourceData); intervalData = gatherIntervalData(sourceData);
} }
$: if (intervalData) { $: if (intervalData) {
[histogramData, tableData] = prepareIntervalData(intervalData, range, i18n, dispatch); [histogramData, tableData] = prepareIntervalData(
intervalData,
range,
i18n,
dispatch,
$browserLinksSupported
);
} }
const title = i18n.tr(i18n.TR.STATISTICS_INTERVALS_TITLE); const title = i18n.tr(i18n.TR.STATISTICS_INTERVALS_TITLE);
@ -62,7 +71,7 @@
</label> </label>
</div> </div>
<HistogramGraph data={histogramData} {i18n} on:search /> <HistogramGraph data={histogramData} {i18n} />
<TableData {i18n} {tableData} /> <TableData {i18n} {tableData} />
</div> </div>

View file

@ -44,6 +44,7 @@ export function buildHistogram(
range: GraphRange, range: GraphRange,
i18n: I18n, i18n: I18n,
dispatch: any, dispatch: any,
browserLinksSupported: boolean
): [HistogramData | null, TableDatum[]] { ): [HistogramData | null, TableDatum[]] {
// get min/max // get min/max
const total = data.daysAdded.length; const total = data.daysAdded.length;
@ -127,7 +128,7 @@ export function buildHistogram(
bins, bins,
total: totalInPeriod, total: totalInPeriod,
hoverText, hoverText,
onClick, onClick: browserLinksSupported ? onClick : null,
colourScale, colourScale,
showArea: true, showArea: true,
}, },

View file

@ -41,6 +41,7 @@ export function prepareData(
data: GraphData, data: GraphData,
i18n: I18n, i18n: I18n,
dispatch: any, dispatch: any,
browserLinksSupported: boolean
): [HistogramData | null, TableDatum[]] { ): [HistogramData | null, TableDatum[]] {
// get min/max // get min/max
const allEases = data.eases; const allEases = data.eases;
@ -94,7 +95,7 @@ export function prepareData(
bins, bins,
total, total,
hoverText, hoverText,
onClick, onClick: browserLinksSupported ? onClick : null,
colourScale, colourScale,
showArea: false, showArea: false,
xTickFormat, xTickFormat,

View file

@ -75,8 +75,7 @@ export interface FutureDueOut {
function makeQuery(start: number, end: number): string { function makeQuery(start: number, end: number): string {
if (start === end) { if (start === end) {
return `"prop:due=${start}"`; return `"prop:due=${start}"`;
} } else {
else {
const fromQuery = `"prop:due>=${start}"`; const fromQuery = `"prop:due>=${start}"`;
const tillQuery = `"prop:due<=${end}"`; const tillQuery = `"prop:due<=${end}"`;
return `${fromQuery} AND ${tillQuery}`; return `${fromQuery} AND ${tillQuery}`;
@ -89,6 +88,7 @@ export function buildHistogram(
backlog: boolean, backlog: boolean,
i18n: I18n, i18n: I18n,
dispatch: any, dispatch: any,
browserLinksSupported: boolean
): FutureDueOut { ): FutureDueOut {
const output = { histogramData: null, tableData: [] }; const output = { histogramData: null, tableData: [] };
// get min/max // get min/max
@ -190,7 +190,7 @@ export function buildHistogram(
bins, bins,
total, total,
hoverText, hoverText,
onClick, onClick: browserLinksSupported ? onClick : null,
showArea: true, showArea: true,
colourScale, colourScale,
binValue, binValue,

View file

@ -25,7 +25,7 @@ export interface HistogramData {
cumulative: number, cumulative: number,
percent: number percent: number
) => string; ) => string;
onClick?: (data: Bin<number, number>) => void; onClick: ((data: Bin<number, number>) => void) | null;
showArea: boolean; showArea: boolean;
colourScale: ScaleSequential<string>; colourScale: ScaleSequential<string>;
binValue?: (bin: Bin<any, any>) => number; binValue?: (bin: Bin<any, any>) => number;
@ -35,7 +35,7 @@ export interface HistogramData {
export function histogramGraph( export function histogramGraph(
svgElem: SVGElement, svgElem: SVGElement,
bounds: GraphBounds, bounds: GraphBounds,
data: HistogramData | null, data: HistogramData | null
): void { ): void {
const svg = select(svgElem); const svg = select(svgElem);
const trans = svg.transition().duration(600) as any; const trans = svg.transition().duration(600) as any;
@ -162,8 +162,6 @@ export function histogramGraph(
.on("mouseout", hideTooltip); .on("mouseout", hideTooltip);
if (data.onClick) { if (data.onClick) {
hoverzone hoverzone.attr("class", "clickable").on("click", data.onClick);
.attr("class", "clickable")
.on("click", data.onClick);
} }
} }

View file

@ -72,6 +72,7 @@ export function prepareIntervalData(
range: IntervalRange, range: IntervalRange,
i18n: I18n, i18n: I18n,
dispatch: any, dispatch: any,
browserLinksSupported: boolean
): [HistogramData | null, TableDatum[]] { ): [HistogramData | null, TableDatum[]] {
// get min/max // get min/max
const allIntervals = data.intervals; const allIntervals = data.intervals;
@ -161,13 +162,14 @@ export function prepareIntervalData(
value: meanIntervalString, value: meanIntervalString,
}, },
]; ];
return [ return [
{ {
scale, scale,
bins, bins,
total: totalInPeriod, total: totalInPeriod,
hoverText, hoverText,
onClick, onClick: browserLinksSupported ? onClick : null,
colourScale, colourScale,
showArea: true, showArea: true,
}, },