2020-12-25 22:29:42 +01:00
|
|
|
<script lang="typescript">
|
2020-12-26 18:24:24 +01:00
|
|
|
import { createEventDispatcher } from "svelte";
|
2020-12-25 22:29:42 +01:00
|
|
|
|
2021-03-21 13:47:52 +01:00
|
|
|
import InputBox from "./InputBox.svelte";
|
|
|
|
|
2020-12-25 22:59:11 +01:00
|
|
|
import type { I18n } from "anki/i18n";
|
2021-01-23 13:54:21 +01:00
|
|
|
import { RevlogRange, daysToRevlogRange } from "./graph-helpers";
|
2020-12-25 22:29:42 +01:00
|
|
|
|
|
|
|
enum SearchRange {
|
|
|
|
Deck = 1,
|
|
|
|
Collection = 2,
|
|
|
|
Custom = 3,
|
|
|
|
}
|
|
|
|
|
2021-01-26 12:41:22 +01:00
|
|
|
type UpdateEventMap = {
|
|
|
|
update: { days: number; search: string; searchRange: SearchRange };
|
|
|
|
};
|
|
|
|
|
2020-12-25 22:29:42 +01:00
|
|
|
export let i18n: I18n;
|
2020-12-25 22:59:11 +01:00
|
|
|
export let active: boolean;
|
|
|
|
|
|
|
|
export let days: number;
|
|
|
|
export let search: string;
|
2020-12-25 22:29:42 +01:00
|
|
|
|
2021-01-26 12:41:22 +01:00
|
|
|
const dispatch = createEventDispatcher<UpdateEventMap>();
|
2020-12-25 22:29:42 +01:00
|
|
|
|
2021-01-23 13:54:21 +01:00
|
|
|
let revlogRange = daysToRevlogRange(days);
|
2020-12-26 18:24:24 +01:00
|
|
|
let searchRange: SearchRange =
|
|
|
|
search === "deck:current"
|
|
|
|
? SearchRange.Deck
|
|
|
|
: search === ""
|
|
|
|
? SearchRange.Collection
|
|
|
|
: SearchRange.Custom;
|
2020-12-25 22:29:42 +01:00
|
|
|
|
|
|
|
let displayedSearch = search;
|
|
|
|
|
|
|
|
const update = () => {
|
2020-12-26 18:24:24 +01:00
|
|
|
dispatch("update", {
|
2020-12-25 22:29:42 +01:00
|
|
|
days: days,
|
|
|
|
search: search,
|
|
|
|
searchRange: searchRange,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
$: {
|
|
|
|
switch (searchRange as SearchRange) {
|
|
|
|
case SearchRange.Deck:
|
|
|
|
search = displayedSearch = "deck:current";
|
2020-12-26 18:24:24 +01:00
|
|
|
update();
|
2020-12-25 22:29:42 +01:00
|
|
|
break;
|
|
|
|
case SearchRange.Collection:
|
|
|
|
search = displayedSearch = "";
|
2020-12-26 18:24:24 +01:00
|
|
|
update();
|
2020-12-25 22:29:42 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$: {
|
|
|
|
switch (revlogRange as RevlogRange) {
|
|
|
|
case RevlogRange.Year:
|
|
|
|
days = 365;
|
2020-12-26 18:24:24 +01:00
|
|
|
update();
|
2020-12-25 22:29:42 +01:00
|
|
|
break;
|
|
|
|
case RevlogRange.All:
|
|
|
|
days = 0;
|
2020-12-26 18:24:24 +01:00
|
|
|
update();
|
2020-12-25 22:29:42 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const searchKeyUp = (e: KeyboardEvent) => {
|
|
|
|
// fetch data on enter
|
|
|
|
if (e.key == "Enter") {
|
|
|
|
search = displayedSearch;
|
2020-12-26 18:24:24 +01:00
|
|
|
update();
|
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>
|
|
|
|
|
2021-03-21 13:47:52 +01:00
|
|
|
<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;
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
opacity: 0.5;
|
|
|
|
transition: opacity 1s;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.range-box-pad {
|
|
|
|
height: 2em;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
|
2020-12-25 22:29:42 +01:00
|
|
|
<div class="range-box">
|
2020-12-25 22:59:11 +01:00
|
|
|
<div class="spin" class:active>◐</div>
|
|
|
|
|
2021-03-21 13:47:52 +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} />
|
2021-03-21 13:47:52 +01:00
|
|
|
</InputBox>
|
2020-12-25 22:29:42 +01:00
|
|
|
|
2021-03-21 13:47:52 +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>
|
2021-03-21 13:47:52 +01:00
|
|
|
</InputBox>
|
2020-12-25 22:29:42 +01:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="range-box-pad" />
|