Die Notizen-App ist als schnelles, intuitives Aufnahme- und Organisationswerkzeug gedacht. Sie unterstützt den Alltag, indem Informationen schnell erfasst, strukturiert und wiedergefunden werden können – ohne den Aufwand klassischer Papierzettel.

In vielen Arbeitsabläufen entstehen Notizen spontan – bei Gesprächen, im Betrieb, im Projektmanagement oder bei kurzen Ideen. Genau deshalb muss diese Funktion schnell, leicht verständlich und überall nutzbar sein. Die Anwendung fokussiert sich auf den Kern: Inhalte schnell erfassen, ohne den Überblick zu verlieren.
Das Notiz-Feature ist eine digitale Notiz- und Dokumentationsfunktion für den Alltag in einer Webanwendung. Es erlaubt Nutzern, schnell Informationen festzuhalten, Inhalte zu strukturieren, Bilder und Textdateien anzuhängen und handschriftliche Einträge zu erstellen. Die Funktion ist bewusst so aufgebaut, dass sie für Endanwender einfach und schnell nutzbar ist, aber gleichzeitig als flexibler Baustein für eine größere Produktivitäts- und Kalender-Umgebung dient.
Im aktuellen Projekt ist das Feature eng in das Portal integriert und wird direkt im Kontext von Workflows verwendet: neben Notizbüchern, schnellen Notizen, Handzettel-ähnlichen Skizzen und Textdateien.
Das Notiz-Feature ersetzt lose Papiernotizen, unfertige Textblöcke und verstreute Informationen. Die Nutzer können:
Die größte Stärke besteht darin, dass es keine „separate App“ für Notizen braucht, sondern direkt in den Arbeitsprozess eingebettet ist. Das heißt:
Das Feature ist in einer Blazor WebAssembly-Anwendung eingebettet. Die UI liegt in der Komponente:
mkaWebCenter.Client/kApp-features/Notizen/Notizen_RouteView.razorDie Logik für das Speichern, Laden und Verwalten der Daten liegt im Backend im Bereich:
mkaWebCenter/app_routes/api/KalenderApi.csmkaWebCenter/app_data/KalenderRepository.csmkaWebCenter/app_base/services/NotizFileService.csDas System ist modular aufgebaut:
Das Feature unterstützt eine Mischung aus strukturierten und unstrukturierten Inhalten:
Das ist besonders wichtig, weil es das Feature sowohl als „einfaches Aufschreiben“ als auch als „dokumentationsfreundliche Sammelstelle“ nutzbar macht.
Im Notizen_RouteView.razor gibt es mehrere zentrale Bereiche:
Der Nutzer kann Notizen nach Notizbüchern filtern. Das macht die Übersicht deutlich besser, wenn mehrere Themen parallel geführt werden.
<div class="notizbuch-bar">
<button class="notizbuch-chip @(_filterNotizbuchId is null ? "active" : "")" @onclick="() => SetFilter(null)">Alle Notizen</button>
@foreach (var buch in _notizbuecher)
{
<button class="notizbuch-chip @(_filterNotizbuchId == buch.Id ? "active" : "")" title="@buch.Beschreibung" @onclick="() => SetFilter(buch.Id)">📓 @buch.Name</button>
}
</div>
Wirkung:
Ein Notiz-Editor erlaubt Text, Titel und optionales Notizbuch.
<label>Titel</label>
<input @bind="_editNotiz.Titel" placeholder="Titel der Notiz" />
<label>Text</label>
<textarea rows="8" @bind="_editNotiz.Text" placeholder="Dein Notiztext…"></textarea>
Das ist der Kern des Features: Wenn ein Nutzer eine Notiz öffnet, kann er im selben Formular alles verwalten, was zu dieser Notiz gehört.
Notizen können mit eingebetteten Bildern erweitert werden.
<label>Bilder</label>
<div class="notiz-bilder">
@foreach (var bild in _editNotiz.Bilder)
{
<div class="notiz-bild">
<img src="@bild.DateiPfad" alt="@bild.DateiName" />
<button class="btn-del" title="Bild löschen" @onclick="() => DeleteBildAsync(bild)">✕</button>
</div>
}
<label class="bild-upload">
+ Bild
<InputFile OnChange="OnBildSelected" accept="image/*" multiple hidden />
</label>
</div>
Das ist wichtig, weil Notizen oft nicht nur Text sind: Screenshots, Dokumentenbilder, Visions, Skizzen und Markierungen sind im Alltag üblich.
Das Projekt erlaubt zusätzlich das Hochladen und Bearbeiten von Text- und Markdown-Dateien.
<label>Textdateien</label>
<div class="notiz-textdateien">
@foreach (var datei in _editNotiz.TextDateien)
{
<div class="notiz-textdatei @(_openTextDatei?.Id == datei.Id ? "open" : "")" title="Öffnen und bearbeiten" @onclick="() => OpenTextDateiAsync(datei)">
<span>📄 @datei.DateiName</span>
<button class="btn-del" title="Datei löschen" @onclick="() => DeleteTextDateiAsync(datei)" @onclick:stopPropagation>✕</button>
</div>
}
</div>
Das dient vor allem als Übergang von „flüchtiger Notiz“ zu „dokumentierter Information“.
Das Feature unterstützt handschriftliche Einträge und Whiteboard-ähnliche Skizzen. Diese Inhalte sind ein echter Mehrwert, weil sie visuell und sehr schnell erfasst werden können.
<label>Handschriftliche Notizen</label>
<div class="notiz-inks">
@foreach (var ink in _editNotiz.Inks)
{
<div class="notiz-ink" title="Öffnen und bearbeiten" @onclick="() => OpenInk(ink)">
@if (!string.IsNullOrEmpty(ink.PreviewPfad))
{
<img src="@AppendVersion(ink.PreviewPfad, ink.GeaendertAm?.Ticks ?? ink.ErstelltAm.Ticks)" alt="Skizze" />
}
</div>
}
<button class="ink-new" @onclick="OpenNewInk">✍️ Neue Skizze (Infinite Canvas)</button>
</div>
Das ist besonders attraktiv für:
Das Backend nutzt die API-Endpunkte aus KalenderApi.cs.
group.MapPost("/notizen", async (KalenderNotizSaveRequest request, KalenderRepository repo, NotizFileService files) =>
{
var notiz = new KalenderNotiz_dbm
{
UserId = request.UserId,
Datum = request.Datum.Date,
Titel = string.IsNullOrWhiteSpace(request.Titel) ? null : request.Titel.Trim(),
ErstelltAm = DateTime.Now
};
var id = repo.InsertKalenderNotiz(notiz);
if (id <= 0) return Results.Problem("Kalendernotiz konnte nicht angelegt werden.");
notiz.Id = id;
notiz.StrokesPfad = await files.SaveKalenderNotizStrokesAsync(id, request.StrokesJson);
if (!string.IsNullOrWhiteSpace(request.PreviewPngBase64))
notiz.PreviewPfad = await files.SaveKalenderNotizPreviewAsync(id, request.PreviewPngBase64);
repo.UpdateKalenderNotiz(notiz);
return Results.Ok(ToDto(notiz));
});
KalenderNotizSaveRequest enthält die Daten der neuen Notiz.group.MapGet("/notizen", (int userId, int jahr, int monat, KalenderRepository repo) =>
{
var notizen = repo.GetKalenderNotizenByUserIdAndMonth(userId, jahr, monat).Select(ToDto).ToList();
return Results.Ok(notizen);
});
Das ist wichtig, weil Notizen oft nach Datum, Zeit oder Monat abgefragt werden. In einer Kalender- oder Workflow-Umgebung ist das sehr hilfreich.
Die Speicherung von Assets erfolgt nicht automatisch in der Datenbank, sondern über NotizFileService.
Dieser Service kümmert sich um:
public async Task<string> SaveKalenderNotizStrokesAsync(int notizId, string strokesJson)
{
var dir = GetKalenderNotizDir(notizId);
Directory.CreateDirectory(dir);
var file = Path.Combine(dir, "strokes.json");
await File.WriteAllTextAsync(file, strokesJson ?? "{}");
return file;
}
Ein zentraler Teil des Features ist die Notizbuch-Logik. Nutzer können Notizen nicht nur einzeln verwalten, sondern in thematischen Sammlungen organisieren.
Beispiel aus der UI:
<button class="notizbuch-chip @(_filterNotizbuchId is null ? "active" : "")" @onclick="() => SetFilter(null)">Alle Notizen</button>
Das ist wichtig für reale Projekte, weil Nutzer oft nach Themen arbeiten:
Ohne diese Struktur würde die Notizliste schnell unübersichtlich.
Das Feature ist bereits stark, aber es kann noch weiter ausgebaut werden:
Das Notiz-Feature ist kein bloßes Textfeld, sondern ein kleines, aber leistungsfähiges Arbeitswerkzeug. Es verbindet:
Das macht es für Endanwender sehr angenehm und für Entwickler als Grundlage für weitere Produktivitätsfunktionen sehr wertvoll.
mkaWebCenter.Client/kApp-features/Notizen/Notizen_RouteView.razormkaWebCenter/app_routes/api/KalenderApi.csmkaWebCenter/app_data/KalenderRepository.csmkaWebCenter/app_base/services/NotizFileService.csWenn du möchtest, kann ich dir als Nächstes noch eine zweite Version dieses Dokuments in „Projekt-Readme-Format“ erstellen, also mit kürzerem Überblick, Architektur-Schema und einer Team-Übersicht für Stakeholder statt für Entwickler.
Die Verbindung zum Server wurde unterbrochen.
Die Verbindung konnte nicht automatisch wiederhergestellt werden.
Die Sitzung muss aus Sicherheitsgründen erneut bestätigt werden.
Aus Sicherheitsgründen wird die Verbindung erst nach einem bewussten Klick auf Neu verbinden erneut aufgebaut.