anki/ts/graphs/RangeBox.svelte

153 lines
3.7 KiB
Svelte
Raw Normal View History

2020-12-25 22:29:42 +01:00
<script lang="typescript">
2020-12-26 18:24:24 +01:00
import { createEventDispatcher } from "svelte";
2021-03-21 22:35:53 +01:00
import type { Writable } from "svelte/store";
2020-12-25 22:29:42 +01:00
import InputBox from "./InputBox.svelte";
2020-12-25 22:59:11 +01:00
import type { I18n } from "anki/i18n";
import { RevlogRange, daysToRevlogRange } from "./graph-helpers";
2020-12-25 22:29:42 +01:00
enum SearchRange {
Deck = 1,
Collection = 2,
Custom = 3,
}
export let i18n: I18n;
2021-03-21 22:35:53 +01:00
export let loading: boolean;
2020-12-25 22:29:42 +01:00
2021-03-21 22:35:53 +01:00
export let days: Writable<number>;
export let search: Writable<string>;
2020-12-25 22:29:42 +01:00
let revlogRange = daysToRevlogRange($days);
let searchRange = $search === "deck:current"
2020-12-26 18:24:24 +01:00
? SearchRange.Deck
: $search === ""
2020-12-26 18:24:24 +01:00
? SearchRange.Collection
: SearchRange.Custom;
2020-12-25 22:29:42 +01:00
let displayedSearch = $search;
2020-12-25 22:29:42 +01:00
$: {
switch (searchRange as SearchRange) {
case SearchRange.Deck:
2021-03-21 22:35:53 +01:00
displayedSearch = "deck:current";
search.set(displayedSearch);
2020-12-25 22:29:42 +01:00
break;
case SearchRange.Collection:
displayedSearch = "";
2021-03-21 22:35:53 +01:00
search.set(displayedSearch);
2020-12-25 22:29:42 +01:00
break;
}
}
$: {
switch (revlogRange as RevlogRange) {
case RevlogRange.Year:
2021-03-21 22:35:53 +01:00
days.set(365);
2020-12-25 22:29:42 +01:00
break;
case RevlogRange.All:
2021-03-21 22:35:53 +01:00
days.set(0);
2020-12-25 22:29:42 +01:00
break;
}
}
2021-03-21 22:35:53 +01:00
const searchKeyUp = (event: KeyboardEvent) => {
2020-12-25 22:29:42 +01:00
// fetch data on enter
2021-03-21 22:35:53 +01:00
if (event.key === "Enter") {
search.set(displayedSearch);
2020-12-25 22:29:42 +01:00
}
};
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>
<style lang="scss">
.range-box {
position: fixed;
z-index: 1;
top: 0;
width: 100%;
color: var(--text-fg);
background: var(--window-bg);
padding: 0.5em;
@media print {
position: absolute;
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
}
}
.spin {
display: inline-block;
position: absolute;
font-size: 2em;
animation: spin;
animation-duration: 1s;
animation-iteration-count: infinite;
opacity: 0;
2021-03-21 22:35:53 +01:00
&.loading {
opacity: 0.5;
transition: opacity 1s;
}
}
.range-box-pad {
height: 2em;
}
</style>
2020-12-25 22:29:42 +01:00
<div class="range-box">
2021-03-21 22:35:53 +01:00
<div class="spin" class:loading></div>
2020-12-25 22:59:11 +01:00
<InputBox>
2020-12-25 22:29:42 +01:00
<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={() => {
2020-12-26 18:24:24 +01:00
searchRange = SearchRange.Custom;
2020-12-25 22:29:42 +01:00
}}
placeholder={searchLabel} />
</InputBox>
2020-12-25 22:29:42 +01:00
<InputBox>
2020-12-25 22:29:42 +01:00
<label>
<input type="radio" bind:group={revlogRange} value={RevlogRange.Year} />
{year}
</label>
<label>
<input type="radio" bind:group={revlogRange} value={RevlogRange.All} />
{all}
</label>
</InputBox>
2020-12-25 22:29:42 +01:00
</div>
<div class="range-box-pad" />