anki/ts/graphs/GraphsPage.svelte

142 lines
3.8 KiB
Svelte
Raw Normal View History

<script context="module">
// import _ from "./graph-helpers.scss";
</script>
<script lang="typescript">
import type { I18n } from "anki/i18n";
import type pb from "anki/backend_proto";
import { getGraphData, RevlogRange } from "./graph-helpers";
2020-06-27 11:24:49 +02:00
export let i18n: I18n;
2020-06-30 08:23:46 +02:00
export let nightMode: boolean;
export let graphs: any[];
2020-06-27 11:24:49 +02:00
2020-12-22 22:25:47 +01:00
export let search: string;
export let revlogRange: RevlogRange;
export let withRangeBox: boolean;
2020-12-22 22:25:47 +01:00
let dataPromise;
let days;
2020-06-22 12:28:36 +02:00
enum SearchRange {
Deck = 1,
Collection = 2,
Custom = 3,
}
let displayedSearch = search;
2020-06-22 12:28:36 +02:00
let searchRange: SearchRange = SearchRange.Deck;
let refreshing = true;
2020-06-22 12:28:36 +02:00
$: {
if (refreshing) {
dataPromise = getGraphData(search, days);
console.log(dataPromise)
refreshing = false;
}
}
$: {
// refresh if either of these change
search;
days;
refreshing = true;
}
2020-06-22 12:28:36 +02:00
$: {
switch (searchRange as SearchRange) {
case SearchRange.Deck:
search = displayedSearch = "deck:current";
2020-06-22 12:28:36 +02:00
break;
case SearchRange.Collection:
search = displayedSearch = "";
2020-06-22 12:28:36 +02:00
break;
case SearchRange.Custom:
break;
}
}
$: {
2020-06-27 07:35:34 +02:00
switch (revlogRange as RevlogRange) {
case RevlogRange.Year:
days = 365;
break;
2020-06-27 07:35:34 +02:00
case RevlogRange.All:
days = 0;
break;
}
}
const searchKeyUp = (e: KeyboardEvent) => {
// fetch data on enter
if (e.key == "Enter") {
2020-06-29 07:11:46 +02:00
const wasSame = search == displayedSearch;
search = displayedSearch;
2020-06-29 07:11:46 +02:00
if (wasSame) {
// force a refresh (user may have changed current deck, etc)
refreshing = true;
2020-06-29 07:11:46 +02:00
}
}
};
2020-06-27 14:10:56 +02:00
2020-07-06 10:29:35 +02:00
const year = i18n.tr(i18n.TR.STATISTICS_RANGE_1_YEAR_HISTORY);
2020-06-28 05:46:17 +02:00
const deck = i18n.tr(i18n.TR.STATISTICS_RANGE_DECK);
const collection = i18n.tr(i18n.TR.STATISTICS_RANGE_COLLECTION);
const searchLabel = i18n.tr(i18n.TR.STATISTICS_RANGE_SEARCH);
2020-07-06 10:29:35 +02:00
const all = i18n.tr(i18n.TR.STATISTICS_RANGE_ALL_HISTORY);
</script>
{#if withRangeBox}
<div class="range-box">
<div class="range-box-inner">
<label>
<input type="radio" bind:group={searchRange} value={SearchRange.Deck} />
{deck}
</label>
<label>
<input
type="radio"
bind:group={searchRange}
value={SearchRange.Collection} />
{collection}
</label>
2020-06-26 07:34:21 +02:00
<input
type="text"
bind:value={displayedSearch}
on:keyup={searchKeyUp}
on:focus={() => {
2020-06-27 13:45:16 +02:00
searchRange = SearchRange.Custom;
}}
placeholder={searchLabel} />
</div>
<div class="range-box-inner">
<label>
<input type="radio" bind:group={revlogRange} value={RevlogRange.Year} />
{year}
</label>
<label>
<input type="radio" bind:group={revlogRange} value={RevlogRange.All} />
{all}
</label>
</div>
2020-06-26 07:34:21 +02:00
</div>
<div class="range-box-pad" />
{/if}
{#await dataPromise}
2020-12-25 20:07:52 +01:00
<div class="spin"></div>
{:then sourceData}
<div tabindex="-1" class="no-focus-outline">
{#each graphs as Graph}
<Graph {sourceData} {revlogRange} {i18n} {nightMode} />
{/each}
</div>
{:catch error}
<script>
alert({i18n.tr(i18n.TR.STATISTICS_ERROR_FETCHING)});
</script>
{/await}