mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 14:32:22 -04:00
Use browserLinksSupported preference
This commit is contained in:
parent
759ed17963
commit
5a987d77b2
10 changed files with 51 additions and 22 deletions
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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}`}>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue