Move the remaining Options to new ConfigEntry layout

This commit is contained in:
Henrik Giesel 2021-05-28 01:41:53 +02:00
parent d099b00918
commit 2d24003e6c
8 changed files with 299 additions and 157 deletions

View file

@ -4,7 +4,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import * as tr from "lib/i18n"; import * as tr from "lib/i18n";
import marked from "marked";
import TitledContainer from "./TitledContainer.svelte"; import TitledContainer from "./TitledContainer.svelte";
import ConfigEntry from "./ConfigEntry.svelte";
import HelpPopup from "./HelpPopup.svelte";
import SpinBox from "./SpinBox.svelte"; import SpinBox from "./SpinBox.svelte";
import SpinBoxFloat from "./SpinBoxFloat.svelte"; import SpinBoxFloat from "./SpinBoxFloat.svelte";
import type { DeckOptionsState } from "./lib"; import type { DeckOptionsState } from "./lib";
@ -15,62 +18,98 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<TitledContainer title={tr.deckConfigAdvancedTitle()}> <TitledContainer title={tr.deckConfigAdvancedTitle()}>
<SpinBox <ConfigEntry>
label={tr.schedulingMaximumInterval()} <span slot="left">
tooltip={tr.deckConfigMaximumIntervalTooltip()} {tr.schedulingMaximumInterval()}
min={1} <HelpPopup html={marked(tr.deckConfigMaximumIntervalTooltip())} />
max={365 * 100} </span>
defaultValue={defaults.maximumReviewInterval} <svelte:fragment slot="right">
bind:value={$config.maximumReviewInterval} <SpinBox
/> min={1}
max={365 * 100}
defaultValue={defaults.maximumReviewInterval}
bind:value={$config.maximumReviewInterval}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBoxFloat <ConfigEntry>
label={tr.schedulingStartingEase()} <span slot="left">
tooltip={tr.deckConfigStartingEaseTooltip()} {tr.schedulingStartingEase()}
min={1.31} <HelpPopup html={marked(tr.deckConfigStartingEaseTooltip())} />
max={5} </span>
defaultValue={defaults.initialEase} <svelte:fragment slot="right">
value={$config.initialEase} <SpinBoxFloat
on:changed={(evt) => ($config.initialEase = evt.detail.value)} min={1.31}
/> max={5}
defaultValue={defaults.initialEase}
value={$config.initialEase}
on:changed={(evt) => ($config.initialEase = evt.detail.value)}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBoxFloat <ConfigEntry>
label={tr.schedulingEasyBonus()} <span slot="left">
tooltip={tr.deckConfigEasyBonusTooltip()} {tr.schedulingEasyBonus()}
min={1} <HelpPopup html={marked(tr.deckConfigEasyBonusTooltip())} />
max={3} </span>
defaultValue={defaults.easyMultiplier} <svelte:fragment slot="right">
value={$config.easyMultiplier} <SpinBoxFloat
on:changed={(evt) => ($config.easyMultiplier = evt.detail.value)} min={1}
/> max={3}
defaultValue={defaults.easyMultiplier}
value={$config.easyMultiplier}
on:changed={(evt) => ($config.easyMultiplier = evt.detail.value)}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBoxFloat <ConfigEntry>
label={tr.schedulingIntervalModifier()} <span slot="left">
tooltip={tr.deckConfigIntervalModifierTooltip()} {tr.schedulingIntervalModifier()}
min={0.5} <HelpPopup html={marked(tr.deckConfigIntervalModifierTooltip())} />
max={2} </span>
defaultValue={defaults.intervalMultiplier} <svelte:fragment slot="right">
value={$config.intervalMultiplier} <SpinBoxFloat
on:changed={(evt) => ($config.intervalMultiplier = evt.detail.value)} min={0.5}
/> max={2}
defaultValue={defaults.intervalMultiplier}
value={$config.intervalMultiplier}
on:changed={(evt) => ($config.intervalMultiplier = evt.detail.value)}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBoxFloat <ConfigEntry>
label={tr.schedulingHardInterval()} <span slot="left">
tooltip={tr.deckConfigHardIntervalTooltip()} {tr.schedulingHardInterval()}
min={0.5} <HelpPopup html={marked(tr.deckConfigHardIntervalTooltip())} />
max={1.3} </span>
defaultValue={defaults.hardMultiplier} <svelte:fragment slot="right">
value={$config.hardMultiplier} <SpinBoxFloat
on:changed={(evt) => ($config.hardMultiplier = evt.detail.value)} min={0.5}
/> max={1.3}
defaultValue={defaults.hardMultiplier}
value={$config.hardMultiplier}
on:changed={(evt) => ($config.hardMultiplier = evt.detail.value)}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBoxFloat <ConfigEntry>
label={tr.schedulingNewInterval()} <span slot="left">
tooltip={tr.deckConfigNewIntervalTooltip()} {tr.schedulingNewInterval()}
min={0} <HelpPopup html={tr.deckConfigNewIntervalTooltip()} />
max={1} </span>
defaultValue={defaults.lapseMultiplier} <svelte:fragment slot="right">
value={$config.lapseMultiplier} <SpinBoxFloat
on:changed={(evt) => ($config.lapseMultiplier = evt.detail.value)} min={0}
/> max={1}
defaultValue={defaults.lapseMultiplier}
value={$config.lapseMultiplier}
on:changed={(evt) => ($config.lapseMultiplier = evt.detail.value)}
/>
</svelte:fragment>
</ConfigEntry>
</TitledContainer> </TitledContainer>

View file

@ -4,7 +4,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import * as tr from "lib/i18n"; import * as tr from "lib/i18n";
import marked from "marked";
import TitledContainer from "./TitledContainer.svelte"; import TitledContainer from "./TitledContainer.svelte";
import ConfigEntryFull from "./ConfigEntryFull.svelte";
import HelpPopup from "./HelpPopup.svelte";
import CheckBox from "./CheckBox.svelte"; import CheckBox from "./CheckBox.svelte";
import type { DeckOptionsState } from "./lib"; import type { DeckOptionsState } from "./lib";
@ -14,16 +17,24 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<TitledContainer title={tr.deckConfigAudioTitle()}> <TitledContainer title={tr.deckConfigAudioTitle()}>
<CheckBox <ConfigEntryFull>
label={tr.deckConfigDisableAutoplay()} <CheckBox
defaultValue={defaults.disableAutoplay} defaultValue={defaults.disableAutoplay}
bind:value={$config.disableAutoplay} bind:value={$config.disableAutoplay}
/> >
{tr.deckConfigDisableAutoplay()}
</CheckBox>
</ConfigEntryFull>
<CheckBox <ConfigEntryFull>
label={tr.schedulingAlwaysIncludeQuestionSideWhenReplaying()} <CheckBox
tooltip={tr.deckConfigAlwaysIncludeQuestionAudioTooltip()} defaultValue={defaults.skipQuestionWhenReplayingAnswer}
defaultValue={defaults.skipQuestionWhenReplayingAnswer} bind:value={$config.skipQuestionWhenReplayingAnswer}
bind:value={$config.skipQuestionWhenReplayingAnswer} >
/> {tr.schedulingAlwaysIncludeQuestionSideWhenReplaying()}
<HelpPopup
html={marked(tr.deckConfigAlwaysIncludeQuestionAudioTooltip())}
/>
</CheckBox>
</ConfigEntryFull>
</TitledContainer> </TitledContainer>

View file

@ -4,7 +4,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import * as tr from "lib/i18n"; import * as tr from "lib/i18n";
import marked from "marked";
import TitledContainer from "./TitledContainer.svelte"; import TitledContainer from "./TitledContainer.svelte";
import ConfigEntryFull from "./ConfigEntryFull.svelte";
import HelpPopup from "./HelpPopup.svelte";
import CheckBox from "./CheckBox.svelte"; import CheckBox from "./CheckBox.svelte";
import type { DeckOptionsState } from "./lib"; import type { DeckOptionsState } from "./lib";
@ -14,17 +17,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<TitledContainer title={tr.deckConfigBuryTitle()}> <TitledContainer title={tr.deckConfigBuryTitle()}>
<CheckBox <ConfigEntryFull>
label={tr.deckConfigBuryNewSiblings()} <CheckBox defaultValue={defaults.buryNew} bind:value={$config.buryNew}>
tooltip={tr.deckConfigBuryTooltip()} {tr.deckConfigBuryNewSiblings()}
defaultValue={defaults.buryNew} <HelpPopup html={marked(tr.deckConfigBuryTooltip())} />
bind:value={$config.buryNew} </CheckBox>
/> </ConfigEntryFull>
<CheckBox <ConfigEntryFull>
label={tr.deckConfigBuryReviewSiblings()} <CheckBox defaultValue={defaults.buryReviews} bind:value={$config.buryReviews}>
tooltip={tr.deckConfigBuryTooltip()} {tr.deckConfigBuryReviewSiblings()}
defaultValue={defaults.buryReviews} <HelpPopup html={marked(tr.deckConfigBuryTooltip())} />
bind:value={$config.buryReviews} </CheckBox>
/> </ConfigEntryFull>
</TitledContainer> </TitledContainer>

View file

@ -5,10 +5,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<script lang="ts"> <script lang="ts">
import RevertButton from "./RevertButton.svelte"; import RevertButton from "./RevertButton.svelte";
export let label: string;
export let value: boolean; export let value: boolean;
export let defaultValue: boolean; export let defaultValue: boolean;
</script> </script>
<label> <input type="checkbox" bind:checked={value} /> {label} </label> <label> <input type="checkbox" bind:checked={value} /> <slot /> </label>
<RevertButton bind:value {defaultValue} /> <RevertButton bind:value {defaultValue} />

View file

@ -0,0 +1,15 @@
<!--
Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
<script lang="ts">
import Row from "./Row.svelte";
export let id: string | undefined = undefined;
</script>
<Row {id}>
<div class="col-12 d-flex align-items-center">
<slot />
</div>
</Row>

View file

@ -4,7 +4,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import * as tr from "lib/i18n"; import * as tr from "lib/i18n";
import marked from "marked";
import TitledContainer from "./TitledContainer.svelte"; import TitledContainer from "./TitledContainer.svelte";
import ConfigEntry from "./ConfigEntry.svelte";
import HelpPopup from "./HelpPopup.svelte";
import EnumSelector from "./EnumSelector.svelte"; import EnumSelector from "./EnumSelector.svelte";
import type { DeckOptionsState } from "./lib"; import type { DeckOptionsState } from "./lib";
@ -37,43 +40,73 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<TitledContainer title={tr.deckConfigOrderingTitle()}> <TitledContainer title={tr.deckConfigOrderingTitle()}>
<EnumSelector <ConfigEntry>
label={tr.deckConfigNewGatherPriority()} <span slot="left">
tooltip={tr.deckConfigNewGatherPriorityTooltip()} {tr.deckConfigNewGatherPriority()}
choices={newGatherPriorityChoices} <HelpPopup html={marked(tr.deckConfigNewGatherPriorityTooltip())} />
defaultValue={defaults.newCardGatherPriority} </span>
bind:value={$config.newCardGatherPriority} <svelte:fragment slot="right">
/> <EnumSelector
choices={newGatherPriorityChoices}
defaultValue={defaults.newCardGatherPriority}
bind:value={$config.newCardGatherPriority}
/>
</svelte:fragment>
</ConfigEntry>
<EnumSelector <ConfigEntry>
label={tr.deckConfigNewCardSortOrder()} <span slot="left">
tooltip={tr.deckConfigNewCardSortOrderTooltip()} {tr.deckConfigNewCardSortOrder()}
choices={newSortOrderChoices} <HelpPopup html={marked(tr.deckConfigNewCardSortOrderTooltip())} />
defaultValue={defaults.newCardSortOrder} </span>
bind:value={$config.newCardSortOrder} <svelte:fragment slot="right">
/> <EnumSelector
choices={newSortOrderChoices}
defaultValue={defaults.newCardSortOrder}
bind:value={$config.newCardSortOrder}
/>
</svelte:fragment>
</ConfigEntry>
<EnumSelector <ConfigEntry>
label={tr.deckConfigNewReviewPriority()} <span slot="left">
tooltip={tr.deckConfigNewReviewPriorityTooltip()} {tr.deckConfigNewReviewPriority()}
choices={reviewMixChoices()} <HelpPopup html={marked(tr.deckConfigNewReviewPriorityTooltip())} />
defaultValue={defaults.newMix} </span>
bind:value={$config.newMix} <svelte:fragment slot="right">
/> <EnumSelector
choices={reviewMixChoices()}
defaultValue={defaults.newMix}
bind:value={$config.newMix}
/>
</svelte:fragment>
</ConfigEntry>
<EnumSelector <ConfigEntry>
label={tr.deckConfigInterdayStepPriority()} <span slot="left">
tooltip={tr.deckConfigInterdayStepPriorityTooltip()} {tr.deckConfigInterdayStepPriority()}
choices={reviewMixChoices()} <HelpPopup html={marked(tr.deckConfigInterdayStepPriorityTooltip())} />
defaultValue={defaults.interdayLearningMix} </span>
bind:value={$config.interdayLearningMix} <svelte:fragment slot="right">
/> <EnumSelector
choices={reviewMixChoices()}
defaultValue={defaults.interdayLearningMix}
bind:value={$config.interdayLearningMix}
/>
</svelte:fragment>
</ConfigEntry>
<EnumSelector <ConfigEntry>
label={tr.deckConfigReviewSortOrder()} <span slot="left">
tooltip={tr.deckConfigReviewSortOrderTooltip()} {tr.deckConfigReviewSortOrder()}
choices={reviewOrderChoices} <HelpPopup html={marked(tr.deckConfigReviewSortOrderTooltip())} />
defaultValue={defaults.reviewOrder} </span>
bind:value={$config.reviewOrder} <svelte:fragment slot="right">
/> <EnumSelector
choices={reviewOrderChoices}
defaultValue={defaults.reviewOrder}
bind:value={$config.reviewOrder}
/>
</svelte:fragment>
</ConfigEntry>
</TitledContainer>> </TitledContainer>>

View file

@ -4,7 +4,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import * as tr from "lib/i18n"; import * as tr from "lib/i18n";
import marked from "marked";
import TitledContainer from "./TitledContainer.svelte"; import TitledContainer from "./TitledContainer.svelte";
import ConfigEntry from "./ConfigEntry.svelte";
import Warnings from "./Warnings.svelte";
import HelpPopup from "./HelpPopup.svelte";
import SpinBox from "./SpinBox.svelte"; import SpinBox from "./SpinBox.svelte";
import EnumSelector from "./EnumSelector.svelte"; import EnumSelector from "./EnumSelector.svelte";
import StepsInput from "./StepsInput.svelte"; import StepsInput from "./StepsInput.svelte";
@ -29,36 +33,65 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<TitledContainer title={tr.schedulingLapses()}> <TitledContainer title={tr.schedulingLapses()}>
<StepsInput <ConfigEntry>
label={tr.deckConfigRelearningSteps()} <span slot="left">
tooltip={tr.deckConfigRelearningStepsTooltip()} {tr.deckConfigRelearningSteps()}<HelpPopup
defaultValue={defaults.relearnSteps} html={marked(tr.deckConfigRelearningStepsTooltip())}
value={$config.relearnSteps} />
on:changed={(evt) => ($config.relearnSteps = evt.detail.value)} </span>
/> <svelte:fragment slot="right">
<StepsInput
defaultValue={defaults.relearnSteps}
value={$config.relearnSteps}
on:changed={(evt) => ($config.relearnSteps = evt.detail.value)}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBox <ConfigEntry>
label={tr.schedulingMinimumInterval()} <span slot="left">
tooltip={tr.deckConfigMinimumIntervalTooltip()} {tr.schedulingMinimumInterval()}<HelpPopup
warnings={[stepsExceedMinimumInterval]} html={marked(tr.deckConfigMinimumIntervalTooltip())}
min={1} />
defaultValue={defaults.minimumLapseInterval} </span>
bind:value={$config.minimumLapseInterval} <svelte:fragment slot="right">
/> <SpinBox
min={1}
defaultValue={defaults.minimumLapseInterval}
bind:value={$config.minimumLapseInterval}
/>
</svelte:fragment>
</ConfigEntry>
<SpinBox <Warnings warnings={[stepsExceedMinimumInterval]} />
label={tr.schedulingLeechThreshold()}
tooltip={tr.deckConfigLeechThresholdTooltip()}
min={1}
defaultValue={defaults.leechThreshold}
bind:value={$config.leechThreshold}
/>
<EnumSelector <ConfigEntry>
label={tr.schedulingLeechAction()} <span slot="left">
tooltip={tr.deckConfigLeechActionTooltip()} {tr.schedulingLeechThreshold()}<HelpPopup
choices={leechChoices} html={marked(tr.deckConfigLeechThresholdTooltip())}
defaultValue={defaults.leechAction} />
bind:value={$config.leechAction} </span>
/> <svelte:fragment slot="right">
<SpinBox
min={1}
defaultValue={defaults.leechThreshold}
bind:value={$config.leechThreshold}
/>
</svelte:fragment>
</ConfigEntry>
<ConfigEntry wrap={true}>
<span slot="left">
{tr.schedulingLeechAction()}<HelpPopup
html={marked(tr.deckConfigLeechActionTooltip())}
/>
</span>
<svelte:fragment slot="right">
<EnumSelector
choices={leechChoices}
defaultValue={defaults.leechAction}
bind:value={$config.leechAction}
/>
</svelte:fragment>
</ConfigEntry>
</TitledContainer> </TitledContainer>

View file

@ -4,7 +4,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import * as tr from "lib/i18n"; import * as tr from "lib/i18n";
import marked from "marked";
import TitledContainer from "./TitledContainer.svelte"; import TitledContainer from "./TitledContainer.svelte";
import ConfigEntry from "./ConfigEntry.svelte";
import ConfigEntryFull from "./ConfigEntryFull.svelte";
import HelpPopup from "./HelpPopup.svelte";
import SpinBox from "./SpinBox.svelte"; import SpinBox from "./SpinBox.svelte";
import CheckBox from "./CheckBox.svelte"; import CheckBox from "./CheckBox.svelte";
import type { DeckOptionsState } from "./lib"; import type { DeckOptionsState } from "./lib";
@ -15,20 +19,25 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<TitledContainer title={tr.deckConfigTimerTitle()}> <TitledContainer title={tr.deckConfigTimerTitle()}>
<SpinBox <ConfigEntry>
label={tr.deckConfigMaximumAnswerSecs()} <span slot="left">
tooltip={tr.deckConfigMaximumAnswerSecsTooltip()} {tr.deckConfigMaximumAnswerSecs()}
min={30} <HelpPopup html={marked(tr.deckConfigMaximumAnswerSecsTooltip())} />
max={600} </span>
defaultValue={defaults.capAnswerTimeToSecs} <svelte:fragment slot="right">
bind:value={$config.capAnswerTimeToSecs} <SpinBox
/> min={30}
max={600}
defaultValue={defaults.capAnswerTimeToSecs}
bind:value={$config.capAnswerTimeToSecs}
/>
</svelte:fragment>
</ConfigEntry>
<CheckBox <ConfigEntryFull>
id="showAnswerTimer" <CheckBox defaultValue={defaults.showTimer} bind:value={$config.showTimer}>
label={tr.schedulingShowAnswerTimer()} {tr.schedulingShowAnswerTimer()}
tooltip={tr.deckConfigShowAnswerTimerTooltip()} <HelpPopup html={marked(tr.deckConfigShowAnswerTimerTooltip())} />
defaultValue={defaults.showTimer} </CheckBox>
bind:value={$config.showTimer} </ConfigEntryFull>
/>
</TitledContainer> </TitledContainer>