add settingsViewModel, implement name and first weekday

This commit is contained in:
marlon-erler
2024-07-20 02:00:00 +02:00
parent 7ceb77e032
commit 6d7d9e5250
6 changed files with 214 additions and 15 deletions
+2 -2
View File
@@ -25,13 +25,13 @@ export default class SettingsModel {
restoreUsername(): void {
const path = storageKeys.username;
const content = this.storageModel.restore(path);
this.username == content ?? "";
this.username = content ?? "";
}
restoreFirstDayofWeek(): void {
const path = storageKeys.firstDayOfWeek;
const content = this.storageModel.restoreStringifiable(path);
this.firstDayOfWeek == content ?? 0;
this.firstDayOfWeek = content ?? 0;
}
// init
+9
View File
@@ -0,0 +1,9 @@
import * as React from "bloatless-react";
export function Option(text: string, value: string, selectedOnCreate: boolean) {
return (
<option value={value} toggle:selected={selectedOnCreate}>
{text}
</option>
);
}
+23 -7
View File
@@ -2,9 +2,11 @@ import "./homePage.css";
import * as React from "bloatless-react";
import { Option } from "./Components/option";
import SettingsViewModel from "../ViewModel/settingsViewModel";
import { translations } from "./translations";
export function HomePage() {
export function HomePage(settingsViewModel: SettingsViewModel) {
// sections
const overviewSection = (
<div id="overview-section">
@@ -45,9 +47,7 @@ export function HomePage() {
<span class="icon">inbox</span>
<div>
<b>{translations.homePage.mailboxHeadline}</b>
<span class="error">
{translations.homePage.mailboxDisabled}
</span>
<span class="error">{translations.homePage.mailboxDisabled}</span>
</div>
</div>
@@ -67,11 +67,18 @@ export function HomePage() {
<span class="icon">account_circle</span>
<div>
<span>{translations.homePage.yourNameLabel}</span>
<input></input>
<input
bind:value={settingsViewModel.nameInput}
on:enter={settingsViewModel.setName}
></input>
</div>
</label>
<div class="flex-row justify-end">
<button class="width-50">
<button
class="width-50"
on:click={settingsViewModel.setName}
toggle:disabled={settingsViewModel.cannotSetName}
>
{translations.homePage.setNameButton}
<span class="icon">check</span>
</button>
@@ -83,7 +90,16 @@ export function HomePage() {
<span class="icon">calendar_month</span>
<div>
<span>{translations.homePage.firstDayOfWeekLabel}</span>
<select></select>
<select bind:value={settingsViewModel.firstDayOfWeekInput}>
{...translations.regional.weekdays.full.map((weekdayName, i) =>
Option(
weekdayName,
i.toString(),
i == settingsViewModel.firstDayOfWeekInput.value
)
)}
</select>
<span class="icon">arrow_drop_down</span>
</div>
</label>
+40
View File
@@ -0,0 +1,40 @@
import * as React from "bloatless-react";
import SettingsModel from "../Model/settingsModel";
export default class SettingsViewModel {
settingsModel: SettingsModel;
// state
nameInput: React.State<string> = new React.State("");
firstDayOfWeekInput: React.State<number> = new React.State(0);
// toggles
cannotSetName = React.createProxyState(
[this.nameInput],
() =>
this.nameInput.value == "" ||
this.nameInput.value == this.settingsModel.username
);
// set
setName = (): void => {
this.settingsModel.setName(this.nameInput.value);
this.nameInput.callSubscriptions();
};
setFirstDayofWeek = (): void => {
this.settingsModel.setFirstDayOfWeek(this.firstDayOfWeekInput.value);
};
// init
constructor(settingsModel: SettingsModel) {
this.settingsModel = settingsModel;
this.nameInput.value = settingsModel.username;
this.firstDayOfWeekInput.value = settingsModel.firstDayOfWeek;
// subscriptions
this.firstDayOfWeekInput.subscribe(this.setFirstDayofWeek);
}
}
+7 -3
View File
@@ -1,16 +1,20 @@
import ConnectionModel from "./Model/connectionModel";
import { HomePage } from "./View/homePage";
import { MainPage } from "./View/mainPage";
import SettingsModel from "./Model/settingsModel";
import SettingsViewModel from "./ViewModel/settingsViewModel";
import StorageModel from "./Model/storageModel";
// models
const storageModel = new StorageModel();
const settingsModel = new SettingsModel(storageModel);
const connectionModel = new ConnectionModel({
connectionChangeHandler() {},
messageHandler(data) {},
});
// viewModels
const settingsViewModel = new SettingsViewModel(settingsModel);
// view
document
.querySelector("main")!
.append(HomePage());
document.querySelector("main")!.append(HomePage(settingsViewModel));