Put RangeBox into its own component

This commit is contained in:
Henrik Giesel 2020-12-25 22:29:42 +01:00
parent 7b5e0134e5
commit ea68b5d801
3 changed files with 124 additions and 104 deletions

View File

@ -3,6 +3,7 @@
</script>
<script lang="typescript">
import RangeBox from './RangeBox.svelte'
import { afterUpdate } from 'svelte';
import type { I18n } from "anki/i18n";
@ -14,73 +15,24 @@
export let graphs: any[];
export let search: string;
export let revlogRange: RevlogRange;
export let days: number;
export let withRangeBox: boolean;
let dataPromise;
let days;
let dataPromise: Promise<pb.backend.GraphsOut>;
let revlogRange: RevlogRange;
enum SearchRange {
Deck = 1,
Collection = 2,
Custom = 3,
const refreshWith = (search, days, revlogRange) => {
dataPromise = getGraphData(search, days);
revlogRange = days > 365
? RevlogRange.All
: RevlogRange.Year;
}
let displayedSearch = search;
let searchRange: SearchRange = SearchRange.Deck;
let refreshing = true;
$: {
if (refreshing) {
dataPromise = getGraphData(search, days);
console.log(dataPromise)
refreshing = false;
}
const refresh = (event) => {
refreshWith(event.detail.search, event.detail.days)
}
$: {
// refresh if either of these change
search;
days;
refreshing = true;
}
$: {
switch (searchRange as SearchRange) {
case SearchRange.Deck:
search = displayedSearch = "deck:current";
break;
case SearchRange.Collection:
search = displayedSearch = "";
break;
case SearchRange.Custom:
break;
}
}
$: {
switch (revlogRange as RevlogRange) {
case RevlogRange.Year:
days = 365;
break;
case RevlogRange.All:
days = 0;
break;
}
}
const searchKeyUp = (e: KeyboardEvent) => {
// fetch data on enter
if (e.key == "Enter") {
const wasSame = search == displayedSearch;
search = displayedSearch;
if (wasSame) {
// force a refresh (user may have changed current deck, etc)
refreshing = true;
}
}
};
refreshWith(search, days)
let spinner: HTMLDivElement;
let graphsContainer: HTMLDivElement;
@ -94,51 +46,10 @@
graphsContainer.style.minHeight = '';
}
})
const year = i18n.tr(i18n.TR.STATISTICS_RANGE_1_YEAR_HISTORY);
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);
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>
<input
type="text"
bind:value={displayedSearch}
on:keyup={searchKeyUp}
on:focus={() => {
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>
</div>
<div class="range-box-pad" />
<RangeBox {i18n} {search} {days} on:update={refresh} />
{/if}
<div bind:this={graphsContainer} tabindex="-1" class="no-focus-outline">

109
ts/graphs/RangeBox.svelte Normal file
View File

@ -0,0 +1,109 @@
<script lang="typescript">
import { createEventDispatcher } from 'svelte';
import { RevlogRange } from "./graph-helpers";
enum SearchRange {
Deck = 1,
Collection = 2,
Custom = 3,
}
export let i18n: I18n;
const dispatch = createEventDispatcher();
let revlogRange: RevlogRange = RevlogRange.Year;
let searchRange: SearchRange = SearchRange.Deck;
let days;
let search;
let displayedSearch = search;
const update = () => {
dispatch('update', {
days: days,
search: search,
searchRange: searchRange,
});
};
$: {
switch (searchRange as SearchRange) {
case SearchRange.Deck:
search = displayedSearch = "deck:current";
update()
break;
case SearchRange.Collection:
search = displayedSearch = "";
update()
break;
}
}
$: {
switch (revlogRange as RevlogRange) {
case RevlogRange.Year:
days = 365;
update()
break;
case RevlogRange.All:
days = 0;
update()
break;
}
}
const searchKeyUp = (e: KeyboardEvent) => {
// fetch data on enter
if (e.key == "Enter") {
search = displayedSearch;
update()
}
};
const year = i18n.tr(i18n.TR.STATISTICS_RANGE_1_YEAR_HISTORY);
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);
const all = i18n.tr(i18n.TR.STATISTICS_RANGE_ALL_HISTORY);
</script>
<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>
<input
type="text"
bind:value={displayedSearch}
on:keyup={searchKeyUp}
on:focus={() => {
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>
</div>
<div class="range-box-pad" />

View File

@ -22,7 +22,7 @@ export function graphs(
target: HTMLDivElement,
graphs: any[], {
search = "deck:current",
revlogRange = RevlogRange.Year,
days = 365,
withRangeBox = true,
} = {},
): void {
@ -36,7 +36,7 @@ export function graphs(
graphs,
nightMode,
search,
revlogRange,
days,
withRangeBox,
},
});