2023-11-17 00:05:35 +00:00
|
|
|
<script lang="ts">
|
2023-11-30 20:53:37 +00:00
|
|
|
import { PUBLIC_BASE_URL } from '$lib/config';
|
2023-11-21 20:22:29 +00:00
|
|
|
import { createEventDispatcher } from 'svelte';
|
2023-11-17 00:05:35 +00:00
|
|
|
|
|
|
|
import { _ } from 'svelte-i18n';
|
|
|
|
import {
|
2023-11-19 19:27:22 +00:00
|
|
|
Button,
|
2023-11-17 00:05:35 +00:00
|
|
|
Card,
|
|
|
|
CardBody,
|
2023-11-19 19:27:22 +00:00
|
|
|
CardHeader,
|
|
|
|
CardTitle,
|
|
|
|
Col,
|
2023-11-17 00:05:35 +00:00
|
|
|
Form,
|
|
|
|
FormText,
|
|
|
|
Input,
|
|
|
|
InputGroup,
|
|
|
|
InputGroupText,
|
2023-11-19 19:27:22 +00:00
|
|
|
Label,
|
|
|
|
Row
|
2023-11-17 00:05:35 +00:00
|
|
|
} from 'sveltestrap';
|
|
|
|
|
|
|
|
export let settings;
|
2023-11-17 02:15:23 +00:00
|
|
|
|
2023-11-21 15:05:00 +00:00
|
|
|
const wifiTxPowerMap = new Map<string, number>([
|
|
|
|
['Default', 80],
|
|
|
|
['19.5dBm', 78], // 19.5dBm
|
|
|
|
['19dBm', 76], // 19dBm
|
|
|
|
['18.5dBm', 74], // 18.5dBm
|
|
|
|
['17dBm', 68], // 17dBm
|
|
|
|
['15dBm', 60], // 15dBm
|
|
|
|
['13dBm', 52], // 13dBm
|
|
|
|
['11dBm', 44], // 11dBm
|
|
|
|
['8.5dBm', 34], // 8.5dBm
|
|
|
|
['7dBm', 28], // 7dBm
|
|
|
|
['5dBm', 20] // 5dBm
|
|
|
|
]);
|
|
|
|
|
2023-11-21 20:22:29 +00:00
|
|
|
const dispatch = createEventDispatcher();
|
|
|
|
|
2023-11-24 23:42:37 +00:00
|
|
|
const handleReset = (e: Event) => {
|
|
|
|
e.preventDefault();
|
|
|
|
dispatch('formReset');
|
|
|
|
};
|
|
|
|
|
2023-11-19 19:27:22 +00:00
|
|
|
const onSave = async (e: Event) => {
|
|
|
|
e.preventDefault();
|
|
|
|
let formSettings = $settings;
|
2023-11-17 02:15:23 +00:00
|
|
|
|
2023-11-19 19:27:22 +00:00
|
|
|
delete formSettings['gitRev'];
|
|
|
|
delete formSettings['ip'];
|
|
|
|
delete formSettings['lastBuildTime'];
|
2023-11-17 02:15:23 +00:00
|
|
|
|
2023-11-19 19:27:22 +00:00
|
|
|
await fetch(`${PUBLIC_BASE_URL}/api/json/settings`, {
|
2023-11-17 02:15:23 +00:00
|
|
|
method: 'PATCH',
|
2023-11-19 19:27:22 +00:00
|
|
|
headers: {
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
},
|
2023-11-17 02:15:23 +00:00
|
|
|
body: JSON.stringify(formSettings)
|
2023-11-21 20:22:29 +00:00
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
dispatch('showToast', {
|
|
|
|
color: 'success',
|
|
|
|
text: $_('section.settings.settingsSaved')
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
dispatch('showToast', {
|
|
|
|
color: 'danger',
|
|
|
|
text: $_('section.settings.errorSavingSettings')
|
|
|
|
});
|
|
|
|
});
|
2023-11-19 19:27:22 +00:00
|
|
|
};
|
2023-11-17 00:05:35 +00:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<Col>
|
|
|
|
<Card>
|
|
|
|
<CardHeader>
|
2023-11-17 02:15:23 +00:00
|
|
|
<CardTitle>{$_('section.settings.title', { default: 'Settings' })}</CardTitle>
|
2023-11-17 00:05:35 +00:00
|
|
|
</CardHeader>
|
|
|
|
<CardBody>
|
2023-11-17 02:15:23 +00:00
|
|
|
<Form on:submit={onSave}>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="fgColor" size="sm"
|
|
|
|
>{$_('section.settings.textColor', { default: 'Text color' })}</Label
|
|
|
|
>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
type="select"
|
2023-11-17 02:15:23 +00:00
|
|
|
bind:value={$settings.fgColor}
|
2023-11-17 00:05:35 +00:00
|
|
|
name="select"
|
|
|
|
id="fgColor"
|
|
|
|
bsSize="sm"
|
|
|
|
class="form-select-sm"
|
|
|
|
>
|
2023-11-19 19:27:22 +00:00
|
|
|
<option value="0">{$_('colors.black')}</option>
|
|
|
|
<option value="65535">{$_('colors.white')}</option>
|
2023-11-17 00:05:35 +00:00
|
|
|
</Input>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="bgColor" size="sm">{$_('section.settings.backgroundColor')}</Label>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
type="select"
|
|
|
|
bind:value={$settings.bgColor}
|
|
|
|
name="select"
|
|
|
|
id="bgColor"
|
|
|
|
bsSize="sm"
|
|
|
|
class="form-select-sm"
|
|
|
|
>
|
2023-11-19 19:27:22 +00:00
|
|
|
<option value="0">{$_('colors.black')}</option>
|
|
|
|
<option value="65535">{$_('colors.white')}</option>
|
2023-11-17 00:05:35 +00:00
|
|
|
</Input>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="timePerScreen" size="sm">{$_('section.settings.timePerScreen')}</Label>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<InputGroup size="sm">
|
2023-11-24 23:42:37 +00:00
|
|
|
<Input
|
|
|
|
type="number"
|
|
|
|
id="timePerScreen"
|
|
|
|
min={1}
|
|
|
|
step="1"
|
|
|
|
bind:value={$settings.timePerScreen}
|
|
|
|
/>
|
2023-11-19 19:27:22 +00:00
|
|
|
<InputGroupText>{$_('time.minutes')}</InputGroupText>
|
2023-11-17 00:05:35 +00:00
|
|
|
</InputGroup>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="fullRefreshMin" size="sm"
|
|
|
|
>{$_('section.settings.fullRefreshEvery')}</Label
|
|
|
|
>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<InputGroup size="sm">
|
2023-11-24 23:42:37 +00:00
|
|
|
<Input
|
|
|
|
type="number"
|
|
|
|
id="fullRefreshMin"
|
|
|
|
min={1}
|
|
|
|
step="1"
|
|
|
|
bind:value={$settings.fullRefreshMin}
|
|
|
|
/>
|
2023-11-19 19:27:22 +00:00
|
|
|
<InputGroupText>{$_('time.minutes')}</InputGroupText>
|
2023-11-17 00:05:35 +00:00
|
|
|
</InputGroup>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="minSecPriceUpd" size="sm"
|
|
|
|
>{$_('section.settings.timeBetweenPriceUpdates')}</Label
|
|
|
|
>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<InputGroup size="sm">
|
2023-11-24 23:42:37 +00:00
|
|
|
<Input
|
|
|
|
type="number"
|
|
|
|
id="minSecPriceUpd"
|
|
|
|
min={1}
|
|
|
|
step="1"
|
|
|
|
bind:value={$settings.minSecPriceUpd}
|
|
|
|
/>
|
2023-11-19 19:27:22 +00:00
|
|
|
<InputGroupText>{$_('time.seconds')}</InputGroupText>
|
2023-11-17 00:05:35 +00:00
|
|
|
</InputGroup>
|
2023-11-19 19:27:22 +00:00
|
|
|
<FormText>{$_('section.settings.shortAmountsWarning')}</FormText>
|
2023-11-17 00:05:35 +00:00
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="tzOffset" size="sm">{$_('section.settings.timezoneOffset')}</Label>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<InputGroup size="sm">
|
|
|
|
<Input
|
|
|
|
type="number"
|
|
|
|
step="1"
|
|
|
|
name="tzOffset"
|
|
|
|
id="tzOffset"
|
|
|
|
bind:value={$settings.tzOffset}
|
|
|
|
/>
|
2023-11-19 19:27:22 +00:00
|
|
|
<InputGroupText>{$_('time.minutes')}</InputGroupText>
|
2023-11-17 00:05:35 +00:00
|
|
|
</InputGroup>
|
2023-11-19 19:27:22 +00:00
|
|
|
<FormText>{$_('section.settings.tzOffsetHelpText')}</FormText>
|
2023-11-17 00:05:35 +00:00
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="ledBrightness" size="sm">{$_('section.settings.ledBrightness')}</Label>
|
2023-11-17 00:05:35 +00:00
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
type="range"
|
|
|
|
name="ledBrightness"
|
|
|
|
id="ledBrightness"
|
2023-11-19 19:27:22 +00:00
|
|
|
bind:value={$settings.ledBrightness}
|
2023-11-17 00:05:35 +00:00
|
|
|
min={0}
|
|
|
|
max={255}
|
|
|
|
step={1}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
2024-05-08 21:38:56 +00:00
|
|
|
{#if $settings.hasFrontlight}
|
|
|
|
<Row>
|
|
|
|
<Label md={6} for="flMaxBrightness" size="sm"
|
|
|
|
>{$_('section.settings.flMaxBrightness')}</Label
|
|
|
|
>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
type="range"
|
|
|
|
name="flMaxBrightness"
|
|
|
|
id="flMaxBrightness"
|
|
|
|
bind:value={$settings.flMaxBrightness}
|
|
|
|
min={0}
|
|
|
|
max={4095}
|
|
|
|
step={1}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
|
|
|
{/if}
|
2023-11-17 00:05:35 +00:00
|
|
|
<Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Label md={6} for="hostnamePrefix" size="sm"
|
|
|
|
>{$_('section.settings.hostnamePrefix')}</Label
|
|
|
|
>
|
|
|
|
<Col md="6">
|
2023-11-17 00:05:35 +00:00
|
|
|
<Input
|
|
|
|
type="text"
|
|
|
|
bind:value={$settings.hostnamePrefix}
|
|
|
|
name="hostnamePrefix"
|
|
|
|
id="hostnamePrefix"
|
|
|
|
bsSize="sm"
|
2023-11-19 19:27:22 +00:00
|
|
|
></Input>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
2023-11-21 15:05:00 +00:00
|
|
|
<Row>
|
|
|
|
<Label md={6} for="wifiTxPower" size="sm"
|
|
|
|
>{$_('section.settings.wifiTxPower', { default: 'WiFi Tx Power' })}</Label
|
|
|
|
>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
type="select"
|
|
|
|
bind:value={$settings.txPower}
|
|
|
|
name="select"
|
|
|
|
id="fgColor"
|
|
|
|
bsSize="sm"
|
|
|
|
class="form-select-sm"
|
|
|
|
>
|
|
|
|
{#each wifiTxPowerMap as [key, value]}
|
|
|
|
<option {value}>{key}</option>
|
|
|
|
{/each}
|
|
|
|
</Input>
|
|
|
|
<FormText>{$_('section.settings.wifiTxPowerText')}</FormText>
|
|
|
|
</Col>
|
|
|
|
</Row>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Row>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="ledTestOnPower"
|
|
|
|
bind:checked={$settings.ledTestOnPower}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.ledPowerOnTest')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="ledFlashOnUpd"
|
|
|
|
bind:checked={$settings.ledFlashOnUpd}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.ledFlashOnBlock')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="stealFocus"
|
|
|
|
bind:checked={$settings.stealFocus}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.StealFocusOnNewBlock')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="mcapBigChar"
|
|
|
|
bind:checked={$settings.mcapBigChar}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.useBigCharsMcap')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="otaEnabled"
|
|
|
|
bind:checked={$settings.otaEnabled}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label="{$_('section.settings.otaUpdates')} ({$_('restartRequired')})"
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="mdnsEnabled"
|
|
|
|
bind:checked={$settings.mdnsEnabled}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label="{$_('section.settings.enableMdns')} ({$_('restartRequired')})"
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="fetchEurPrice"
|
|
|
|
bind:checked={$settings.fetchEurPrice}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label="{$_('section.settings.fetchEuroPrice')} ({$_('restartRequired')})"
|
|
|
|
/>
|
2023-11-17 00:05:35 +00:00
|
|
|
</Col>
|
2024-03-10 11:21:25 +00:00
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="useBlkCountdown"
|
|
|
|
bind:checked={$settings.useBlkCountdown}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.useBlkCountdown')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="useSatsSymbol"
|
|
|
|
bind:checked={$settings.useSatsSymbol}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.useSatsSymbol')}
|
|
|
|
/>
|
|
|
|
</Col>
|
2024-03-11 20:09:15 +00:00
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="suffixPrice"
|
|
|
|
bind:checked={$settings.suffixPrice}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.suffixPrice')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="disableLeds"
|
|
|
|
bind:checked={$settings.disableLeds}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.disableLeds')}
|
|
|
|
/>
|
|
|
|
</Col>
|
2024-05-08 21:38:56 +00:00
|
|
|
<Col md="6">
|
|
|
|
<Input
|
2024-05-08 22:54:55 +00:00
|
|
|
id="ownDataSource"
|
|
|
|
bind:checked={$settings.ownDataSource}
|
2024-05-08 21:38:56 +00:00
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
2024-05-08 22:54:55 +00:00
|
|
|
label="{$_('section.settings.ownDataSource')} ({$_('restartRequired')})"
|
2024-05-08 21:38:56 +00:00
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
{#if $settings.hasFrontlight}
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="flAlwaysOn"
|
|
|
|
bind:checked={$settings.flAlwaysOn}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={$_('section.settings.flAlwaysOn')}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
{/if}
|
2023-11-17 00:05:35 +00:00
|
|
|
</Row>
|
2023-11-17 02:15:23 +00:00
|
|
|
|
2023-11-19 19:27:22 +00:00
|
|
|
<Row>
|
|
|
|
<h3>{$_('section.settings.screens')}</h3>
|
|
|
|
{#if $settings.screens}
|
|
|
|
{#each $settings.screens as s}
|
|
|
|
<Col md="6">
|
|
|
|
<Input
|
|
|
|
id="screens_{s.id}"
|
|
|
|
bind:checked={s.enabled}
|
|
|
|
type="switch"
|
|
|
|
bsSize="sm"
|
|
|
|
label={s.name}
|
|
|
|
/>
|
|
|
|
</Col>
|
|
|
|
{/each}
|
|
|
|
{/if}
|
|
|
|
</Row>
|
2023-11-24 23:42:37 +00:00
|
|
|
<Button on:click={handleReset} color="secondary">{$_('button.reset')}</Button>
|
2023-11-19 19:27:22 +00:00
|
|
|
<Button color="primary">{$_('button.save')}</Button>
|
2023-11-17 00:05:35 +00:00
|
|
|
</Form>
|
|
|
|
</CardBody>
|
|
|
|
</Card>
|
|
|
|
</Col>
|