Vorgänge: verknüpfte Dokumentation direkt zum Nachlesen öffnen
CI / build-and-test (push) Canceled after 0s
CI / build-and-test (push) Canceled after 0s
"Bearbeiten"-Button an jedem verknüpften bzw. verknüpfbaren Eintrag öffnet den bestehenden Dokumentations-Dialog, ohne den Vorgänge-Tab zu verlassen — bisher musste man dafür in den Schülerdatensatz wechseln. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -97,7 +97,8 @@ public partial class ClassTeacherCasesViewModel : ObservableObject
|
|||||||
var names = vorgang.StudentIds.Select(id => nameById.GetValueOrDefault(id, ""))
|
var names = vorgang.StudentIds.Select(id => nameById.GetValueOrDefault(id, ""))
|
||||||
.Where(n => n != "");
|
.Where(n => n != "");
|
||||||
var item = new VorgangItem(vorgang, string.Join(", ", names), LinkDocumentation,
|
var item = new VorgangItem(vorgang, string.Join(", ", names), LinkDocumentation,
|
||||||
UnlinkDocumentation, RemoveClassRegisterEntry) { IsRevealed = revealedIds.Contains(vorgang.Id) };
|
UnlinkDocumentation, RemoveClassRegisterEntry, EditDocumentation)
|
||||||
|
{ IsRevealed = revealedIds.Contains(vorgang.Id) };
|
||||||
|
|
||||||
var linkedIds = vorgang.DocumentationIds.ToHashSet();
|
var linkedIds = vorgang.DocumentationIds.ToHashSet();
|
||||||
foreach (var doc in allDocs.Where(d => linkedIds.Contains(d.Id)))
|
foreach (var doc in allDocs.Where(d => linkedIds.Contains(d.Id)))
|
||||||
@@ -169,6 +170,19 @@ public partial class ClassTeacherCasesViewModel : ObservableObject
|
|||||||
await LoadInternal();
|
await LoadInternal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Öffnet eine verknüpfte oder noch verknüpfbare Dokumentation im vollen Bearbeiten-Dialog, ohne
|
||||||
|
/// den Vorgänge-Tab zu verlassen (Nutzer-Feedback: bisher musste man dafür zum Nachlesen in den
|
||||||
|
/// Schülerdatensatz wechseln). Reine Bearbeitung der Dokumentation selbst — welche Vorgänge sie
|
||||||
|
/// verlinken, ändert sich dadurch nicht.
|
||||||
|
private async Task EditDocumentation(DocumentationItem doc)
|
||||||
|
{
|
||||||
|
if (OnEditDocumentation is null) return;
|
||||||
|
var result = await OnEditDocumentation(doc.Model.StudentId, _rosterStudentOptions, doc.Model);
|
||||||
|
if (result is null) return;
|
||||||
|
_documentation.Save(result);
|
||||||
|
await LoadInternal();
|
||||||
|
}
|
||||||
|
|
||||||
/// Dokumentation der Vorgangs-Schüler*innen, die noch nicht mit diesem Vorgang verknüpft ist —
|
/// Dokumentation der Vorgangs-Schüler*innen, die noch nicht mit diesem Vorgang verknüpft ist —
|
||||||
/// reine, ohne Repository-Zugriff testbare Filterlogik (gleiches Muster wie
|
/// reine, ohne Repository-Zugriff testbare Filterlogik (gleiches Muster wie
|
||||||
/// <see cref="ClassTeacherRosterRow.Build"/>).
|
/// <see cref="ClassTeacherRosterRow.Build"/>).
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ public partial class VorgangItem : ObservableObject
|
|||||||
private readonly Func<VorgangItem, DocumentationItem, Task> _onLink;
|
private readonly Func<VorgangItem, DocumentationItem, Task> _onLink;
|
||||||
private readonly Func<VorgangItem, DocumentationItem, Task> _onUnlink;
|
private readonly Func<VorgangItem, DocumentationItem, Task> _onUnlink;
|
||||||
private readonly Func<VorgangItem, VorgangClassRegisterEntryRow, Task> _onRemoveClassRegisterEntry;
|
private readonly Func<VorgangItem, VorgangClassRegisterEntryRow, Task> _onRemoveClassRegisterEntry;
|
||||||
|
private readonly Func<DocumentationItem, Task> _onEditDocumentation;
|
||||||
|
|
||||||
public Vorgang Model { get; }
|
public Vorgang Model { get; }
|
||||||
public string StudentNames { get; }
|
public string StudentNames { get; }
|
||||||
@@ -79,7 +80,8 @@ public partial class VorgangItem : ObservableObject
|
|||||||
public VorgangItem(Vorgang model, string studentNames,
|
public VorgangItem(Vorgang model, string studentNames,
|
||||||
Func<VorgangItem, DocumentationItem, Task> onLink,
|
Func<VorgangItem, DocumentationItem, Task> onLink,
|
||||||
Func<VorgangItem, DocumentationItem, Task> onUnlink,
|
Func<VorgangItem, DocumentationItem, Task> onUnlink,
|
||||||
Func<VorgangItem, VorgangClassRegisterEntryRow, Task> onRemoveClassRegisterEntry)
|
Func<VorgangItem, VorgangClassRegisterEntryRow, Task> onRemoveClassRegisterEntry,
|
||||||
|
Func<DocumentationItem, Task> onEditDocumentation)
|
||||||
{
|
{
|
||||||
Model = model;
|
Model = model;
|
||||||
StudentNames = studentNames;
|
StudentNames = studentNames;
|
||||||
@@ -87,10 +89,19 @@ public partial class VorgangItem : ObservableObject
|
|||||||
_onLink = onLink;
|
_onLink = onLink;
|
||||||
_onUnlink = onUnlink;
|
_onUnlink = onUnlink;
|
||||||
_onRemoveClassRegisterEntry = onRemoveClassRegisterEntry;
|
_onRemoveClassRegisterEntry = onRemoveClassRegisterEntry;
|
||||||
|
_onEditDocumentation = onEditDocumentation;
|
||||||
}
|
}
|
||||||
|
|
||||||
[RelayCommand] private void Reveal() => IsRevealed = !IsRevealed;
|
[RelayCommand] private void Reveal() => IsRevealed = !IsRevealed;
|
||||||
|
|
||||||
|
/// Öffnet den vollen Dokumentations-Dialog zum Nachlesen/Bearbeiten, ohne den Vorgänge-Tab zu
|
||||||
|
/// verlassen (Nutzer-Feedback: bisher musste man dafür in den Schülerdatensatz wechseln).
|
||||||
|
[RelayCommand]
|
||||||
|
private async Task EditDocumentation(DocumentationItem? doc)
|
||||||
|
{
|
||||||
|
if (doc is not null) await _onEditDocumentation(doc);
|
||||||
|
}
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private async Task Link(DocumentationItem? doc)
|
private async Task Link(DocumentationItem? doc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
<ItemsControl ItemsSource="{Binding LinkedDocumentation}">
|
<ItemsControl ItemsSource="{Binding LinkedDocumentation}">
|
||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate DataType="svm:DocumentationItem">
|
<DataTemplate DataType="svm:DocumentationItem">
|
||||||
<Grid ColumnDefinitions="70,*,Auto,Auto" Margin="0,2">
|
<Grid ColumnDefinitions="70,*,Auto,Auto,Auto" Margin="0,2">
|
||||||
<TextBlock Grid.Column="0" Text="{Binding DateDisplay}" FontSize="11" Opacity="0.5"/>
|
<TextBlock Grid.Column="0" Text="{Binding DateDisplay}" FontSize="11" Opacity="0.5"/>
|
||||||
<StackPanel Grid.Column="1">
|
<StackPanel Grid.Column="1">
|
||||||
<StackPanel Orientation="Horizontal" Spacing="6">
|
<StackPanel Orientation="Horizontal" Spacing="6">
|
||||||
@@ -111,7 +111,13 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Button Grid.Column="2" Content="Anzeigen" FontSize="10" Padding="6,2" Margin="0,0,4,0"
|
<Button Grid.Column="2" Content="Anzeigen" FontSize="10" Padding="6,2" Margin="0,0,4,0"
|
||||||
Command="{Binding RevealCommand}" IsVisible="{Binding !IsRevealed}"/>
|
Command="{Binding RevealCommand}" IsVisible="{Binding !IsRevealed}"/>
|
||||||
<Button Grid.Column="3" Content="Entfernen" FontSize="10" Padding="6,2"
|
<!-- Nutzer-Feedback: verknüpfte Einträge sollen sich zum Nachlesen direkt
|
||||||
|
hier öffnen lassen, ohne in den Schülerdatensatz wechseln zu müssen. -->
|
||||||
|
<Button Grid.Column="3" Content="Bearbeiten" FontSize="10" Padding="6,2" Margin="0,0,4,0"
|
||||||
|
IsVisible="{Binding IsRevealed}"
|
||||||
|
Command="{Binding $parent[ItemsControl].((vm:VorgangItem)DataContext).EditDocumentationCommand}"
|
||||||
|
CommandParameter="{Binding}"/>
|
||||||
|
<Button Grid.Column="4" Content="Entfernen" FontSize="10" Padding="6,2"
|
||||||
Command="{Binding $parent[ItemsControl].((vm:VorgangItem)DataContext).UnlinkCommand}"
|
Command="{Binding $parent[ItemsControl].((vm:VorgangItem)DataContext).UnlinkCommand}"
|
||||||
CommandParameter="{Binding}"/>
|
CommandParameter="{Binding}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -132,7 +138,7 @@
|
|||||||
<ItemsControl ItemsSource="{Binding AvailableDocumentation}">
|
<ItemsControl ItemsSource="{Binding AvailableDocumentation}">
|
||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate DataType="svm:DocumentationItem">
|
<DataTemplate DataType="svm:DocumentationItem">
|
||||||
<Grid ColumnDefinitions="70,*,Auto,Auto" Margin="0,2">
|
<Grid ColumnDefinitions="70,*,Auto,Auto,Auto" Margin="0,2">
|
||||||
<TextBlock Grid.Column="0" Text="{Binding DateDisplay}" FontSize="11" Opacity="0.5"/>
|
<TextBlock Grid.Column="0" Text="{Binding DateDisplay}" FontSize="11" Opacity="0.5"/>
|
||||||
<StackPanel Grid.Column="1">
|
<StackPanel Grid.Column="1">
|
||||||
<StackPanel Orientation="Horizontal" Spacing="6">
|
<StackPanel Orientation="Horizontal" Spacing="6">
|
||||||
@@ -144,7 +150,11 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Button Grid.Column="2" Content="Anzeigen" FontSize="10" Padding="6,2" Margin="0,0,4,0"
|
<Button Grid.Column="2" Content="Anzeigen" FontSize="10" Padding="6,2" Margin="0,0,4,0"
|
||||||
Command="{Binding RevealCommand}" IsVisible="{Binding !IsRevealed}"/>
|
Command="{Binding RevealCommand}" IsVisible="{Binding !IsRevealed}"/>
|
||||||
<Button Grid.Column="3" Content="Verknüpfen" FontSize="10" Padding="6,2"
|
<Button Grid.Column="3" Content="Bearbeiten" FontSize="10" Padding="6,2" Margin="0,0,4,0"
|
||||||
|
IsVisible="{Binding IsRevealed}"
|
||||||
|
Command="{Binding $parent[ItemsControl].((vm:VorgangItem)DataContext).EditDocumentationCommand}"
|
||||||
|
CommandParameter="{Binding}"/>
|
||||||
|
<Button Grid.Column="4" Content="Verknüpfen" FontSize="10" Padding="6,2"
|
||||||
Command="{Binding $parent[ItemsControl].((vm:VorgangItem)DataContext).LinkCommand}"
|
Command="{Binding $parent[ItemsControl].((vm:VorgangItem)DataContext).LinkCommand}"
|
||||||
CommandParameter="{Binding}"/>
|
CommandParameter="{Binding}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -1887,6 +1887,16 @@ eigenen Unterricht abfragt und deshalb mit den regulären Lehrkraft-Rechten funk
|
|||||||
einen neuen anlegen). `ClassTeacherDetailsViewModel` bekommt dafür `ClassTeacherCasesViewModel`
|
einen neuen anlegen). `ClassTeacherDetailsViewModel` bekommt dafür `ClassTeacherCasesViewModel`
|
||||||
per Konstruktor-Injection (Geschwister-VM-Zugriff für reine Datenabfragen statt Func-Hook, da
|
per Konstruktor-Injection (Geschwister-VM-Zugriff für reine Datenabfragen statt Func-Hook, da
|
||||||
keine UI im Spiel ist).
|
keine UI im Spiel ist).
|
||||||
|
- **Nachtrag:** Nutzer-Feedback — verknüpfte Dokumentation ließ sich nur als kurze Karte sehen,
|
||||||
|
zum Nachlesen musste man in den Schülerdatensatz wechseln. Statt eines neuen Seitenpanels
|
||||||
|
(`DockPanel`/`Dock="Right"`) oder eines eigenen Lese-Fensters wird der bereits vorhandene
|
||||||
|
`DocumentationDialog` wiederverwendet: "Bearbeiten"-Button an jedem verknüpften bzw. noch
|
||||||
|
verknüpfbaren Eintrag (nur sichtbar nach `IsRevealed`, gleiche Vertraulichkeits-Gate-Konvention
|
||||||
|
wie im Gruppen-Tab) öffnet ihn zum vollständigen Lesen/Bearbeiten, ohne den Vorgänge-Tab zu
|
||||||
|
verlassen. `VorgangItem` bekam dafür einen weiteren Callback (`onEditDocumentation`, gleiches
|
||||||
|
Konstruktor-Callback-Muster wie `onLink`/`onUnlink`), `ClassTeacherCasesViewModel.EditDocumentation`
|
||||||
|
speichert das Ergebnis direkt über `IDocumentationRepository`, unabhängig davon, welche Vorgänge
|
||||||
|
den Eintrag verlinken.
|
||||||
**Bewusst zurückgestellt ("Runde 2", Nutzer-Wunsch):** dass ein bearbeiteter/geschlossener Vorgang
|
**Bewusst zurückgestellt ("Runde 2", Nutzer-Wunsch):** dass ein bearbeiteter/geschlossener Vorgang
|
||||||
automatisch den `PatternScore` dämpft, sowie Trend-Indikatoren ("bewegt sich wieder in die
|
automatisch den `PatternScore` dämpft, sowie Trend-Indikatoren ("bewegt sich wieder in die
|
||||||
falsche Richtung", z.B. Fehlzeiten oder Konflikt-Einträge nehmen erneut zu) — reines Anlegen/
|
falsche Richtung", z.B. Fehlzeiten oder Konflikt-Einträge nehmen erneut zu) — reines Anlegen/
|
||||||
|
|||||||
Reference in New Issue
Block a user