Uitrol 27-09-2026 18:00

This commit is contained in:
jf
2026-09-27 18:00:17 +02:00
parent de4ff128cb
commit 73d57ed17a
7 changed files with 331 additions and 5 deletions
+2 -2
View File
@@ -278,8 +278,8 @@
@onkeydown="e => ToetsAsync(e, () => TegelOpenenAsync(item))">
<div class="rij">
<div class="groei">
<span class="groot" title="@item.Title">@item.Title</span>
<div class="zacht">@Tonen.Categorie(item.Category)</div>
<span class="groot">@Tonen.Categorie(item.Category)</span>
<div class="zacht" title="@item.Title">@item.Title</div>
@* stopPropagation, want anders opent een druk op de prullenbak ook meteen
het scherm met de inhoud. *@
+4 -1
View File
@@ -298,9 +298,12 @@
<Button x:Name="KnopGelijk" Content="Gelijkzetten aan Gitea" Margin="0,0,10,0"
ToolTip="Zet de projectmap exact gelijk aan Gitea (origin/main). Lokale, nog niet gepushte wijzigingen gaan van main af, maar worden eerst veiliggesteld op een reddingsboei-tak."
Click="KnopGelijk_Click" />
<Button x:Name="KnopRelease" Content="Release maken…"
<Button x:Name="KnopRelease" Content="Release maken…" Margin="0,0,10,0"
ToolTip="Maakt van de huidige main een releaseversie: branch release/x.y.z en tag vX.Y.Z, en pusht die naar Gitea."
Click="KnopRelease_Click" />
<Button x:Name="KnopInstel" Content="Instellingen"
ToolTip="Server, mappen, testadres, Chrome en Gitea-gegevens (uitroller.json)."
Click="KnopInstel_Click" />
</StackPanel>
</StackPanel>
</TabItem>
@@ -966,6 +966,23 @@ public partial class Hoofdvenster : Window
await GiteaKnopBijwerkenAsync(true);
}
/// <summary>Server, mappen, testadres, Chrome en Gitea-gegevens (uitroller.json). Na opslaan
/// het venster verversen: de doelregel, of versturen nu kan, en de Gitea-timer/-knop.</summary>
private void KnopInstel_Click(object sender, RoutedEventArgs e)
{
var venster = new Instellingenvenster(_instellingen) { Owner = this };
if (venster.ShowDialog() != true) return;
Doelregel.Text = $"Server: {_instellingen.Server}:{_instellingen.Poort} • " +
$"Project: {_instellingen.Projectmap}";
KnopProef.IsEnabled = _instellingen.KanVersturen;
Meld("Instellingen opgeslagen.", false);
GiteaTimerInstellen();
_ = GiteaKnopBijwerkenAsync(true);
}
private void ZetGiteaBezig(bool bezig)
{
_giteaBezig = bezig;
@@ -66,6 +66,11 @@ public class Instellingen
new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? new Instellingen();
}
/// <summary>Schrijft de instellingen terug naar uitroller.json in de map boven de exe
/// (de blijvende plek, zie <see cref="Pad"/>).</summary>
public void Bewaar() =>
File.WriteAllText(Pad, JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true }));
/// <summary>
/// Wat er mankeert om te kunnen bouwen en inpakken. Null als dat kan.
///
@@ -0,0 +1,217 @@
<Window x:Class="MijnBesluit.Uitroller.Instellingenvenster"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Instellingen" Height="620" Width="560"
Icon="uitroller.ico"
WindowStartupLocation="CenterOwner" Background="#F4F5F7"
TextOptions.TextFormattingMode="Ideal" UseLayoutRounding="True"
FontFamily="Segoe UI">
<!-- Zelfde palet en stijlen als Hoofdvenster.xaml, hier los gehouden omdat dit een eigen
venster is (geen gedeeld resource-woordenboek in dit project). -->
<Window.Resources>
<SolidColorBrush x:Key="Vlak" Color="#FFFFFF" />
<SolidColorBrush x:Key="Rand" Color="#E3E6EC" />
<SolidColorBrush x:Key="RandDonker" Color="#D5D9E0" />
<SolidColorBrush x:Key="Tekst" Color="#23262B" />
<SolidColorBrush x:Key="TekstDof" Color="#6B7280" />
<SolidColorBrush x:Key="Accent" Color="#8FA12E" />
<SolidColorBrush x:Key="AccentDonker" Color="#728226" />
<SolidColorBrush x:Key="Hover" Color="#EEF0F3" />
<SolidColorBrush x:Key="Ingedrukt" Color="#E4E7EC" />
<Style TargetType="Button">
<Setter Property="Background" Value="{StaticResource Vlak}" />
<Setter Property="Foreground" Value="{StaticResource Tekst}" />
<Setter Property="BorderBrush" Value="{StaticResource RandDonker}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="14,7" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="rand" Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="8" Padding="{TemplateBinding Padding}"
TextElement.Foreground="{TemplateBinding Foreground}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="rand" Property="Background" Value="{StaticResource Hover}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="rand" Property="Background" Value="{StaticResource Ingedrukt}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="Primair" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Background" Value="{StaticResource Accent}" />
<Setter Property="Foreground" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource Accent}" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="rand" Background="{TemplateBinding Background}" CornerRadius="8"
Padding="{TemplateBinding Padding}" TextElement.Foreground="{TemplateBinding Foreground}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="rand" Property="Background" Value="{StaticResource AccentDonker}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TextBox">
<Setter Property="Padding" Value="8,6" />
<Setter Property="FontSize" Value="13" />
<Setter Property="BorderBrush" Value="{StaticResource RandDonker}" />
<Setter Property="Background" Value="{StaticResource Vlak}" />
</Style>
<Style TargetType="GroupBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GroupBox">
<StackPanel>
<TextBlock Text="{TemplateBinding Header}" FontSize="12" FontWeight="SemiBold"
Foreground="{StaticResource TekstDof}" Margin="2,0,0,6" />
<Border Background="{StaticResource Vlak}" BorderBrush="{StaticResource Rand}"
BorderThickness="1" CornerRadius="10" Padding="14">
<ContentPresenter />
</Border>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="VeldLabel" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource TekstDof}" />
<Setter Property="Margin" Value="0,0,0,3" />
<Setter Property="FontSize" Value="12" />
</Style>
</Window.Resources>
<Grid Margin="18">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="0,0,0,14">
<TextBlock Text="Instellingen" FontSize="20" FontWeight="Bold" Foreground="{StaticResource Tekst}" />
<TextBlock Text="Deze staan in uitroller.json, in de map boven de exe (overleeft een build)."
Foreground="{StaticResource TekstDof}" Margin="0,4,0,0" TextWrapping="Wrap" />
</StackPanel>
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel>
<GroupBox Header="Server en geheim" Margin="0,0,0,14">
<StackPanel>
<TextBlock Text="Server" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldServer" Margin="0,0,0,10" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="14" />
<ColumnDefinition Width="120" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="Geheim" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldGeheim" />
</StackPanel>
<StackPanel Grid.Column="2">
<TextBlock Text="Poort" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldPoort" />
</StackPanel>
</Grid>
</StackPanel>
</GroupBox>
<GroupBox Header="Mappen" Margin="0,0,0,14">
<StackPanel>
<TextBlock Text="Projectmap" Style="{StaticResource VeldLabel}" />
<Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" x:Name="VeldProjectmap" />
<Button Grid.Column="2" Content="Bladeren…" Click="Bladeren_Projectmap" />
</Grid>
<TextBlock Text="Publicatiemap" Style="{StaticResource VeldLabel}" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" x:Name="VeldPublicatiemap" />
<Button Grid.Column="2" Content="Bladeren…" Click="Bladeren_Publicatiemap" />
</Grid>
</StackPanel>
</GroupBox>
<GroupBox Header="Lokaal testen" Margin="0,0,0,14">
<StackPanel>
<TextBlock Text="Testadres (van MijnBesluit.Web, launchSettings.json)" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldTestadres" Margin="0,0,0,10" />
<TextBlock Text="Chrome.exe (leeg = de gewone plek)" Style="{StaticResource VeldLabel}" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" x:Name="VeldChrome" />
<Button Grid.Column="2" Content="Bladeren…" Click="Bladeren_Chrome" />
</Grid>
</StackPanel>
</GroupBox>
<GroupBox Header="Gitea (alleen invullen als de git-remote 'origin' ontbreekt of niet te ontleden is)">
<StackPanel>
<TextBlock Text="Basis-URL" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldGiteaUrl" Margin="0,0,0,10" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="14" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="Eigenaar" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldGiteaEigenaar" />
</StackPanel>
<StackPanel Grid.Column="2">
<TextBlock Text="Repo" Style="{StaticResource VeldLabel}" />
<TextBox x:Name="VeldGiteaRepo" />
</StackPanel>
</Grid>
</StackPanel>
</GroupBox>
</StackPanel>
</ScrollViewer>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,16,0,0">
<Button Content="Annuleren" Margin="0,0,10,0" Click="Annuleren_Click" />
<Button Content="Opslaan" Style="{StaticResource Primair}" Click="Opslaan_Click" />
</StackPanel>
</Grid>
</Window>
@@ -0,0 +1,84 @@
using System.Windows;
namespace MijnBesluit.Uitroller;
/// <summary>
/// Bewerkt uitroller.json. Eenvoudiger dan RenH's Instellingenvenster: MijnBesluit heeft één
/// server en geen omgevingen/repo's-lijst, dus dit is alleen een formulier met de velden uit
/// <see cref="Instellingen"/>, geen tabellen om regels toe te voegen of te verwijderen.
///
/// Opslaan schrijft een nieuw <see cref="Instellingen"/>-object terug via
/// <see cref="Instellingen.Bewaar"/>; Hoofdvenster leest na het sluiten opnieuw in met
/// <see cref="Instellingen.Lees"/>.
/// </summary>
public partial class Instellingenvenster : Window
{
private readonly Instellingen _instellingen;
public Instellingenvenster(Instellingen instellingen)
{
InitializeComponent();
_instellingen = instellingen;
VeldenVullen();
}
private void VeldenVullen()
{
VeldServer.Text = _instellingen.Server;
VeldPoort.Text = _instellingen.Poort.ToString();
VeldGeheim.Text = _instellingen.Geheim;
VeldProjectmap.Text = _instellingen.Projectmap;
VeldPublicatiemap.Text = _instellingen.Publicatiemap;
VeldTestadres.Text = _instellingen.Testadres;
VeldChrome.Text = _instellingen.Chrome ?? "";
VeldGiteaUrl.Text = _instellingen.GiteaUrl ?? "";
VeldGiteaEigenaar.Text = _instellingen.GiteaEigenaar ?? "";
VeldGiteaRepo.Text = _instellingen.GiteaRepo ?? "";
}
private static void Kies(System.Windows.Controls.TextBox veld)
{
var dlg = new Microsoft.Win32.OpenFolderDialog { Title = "Kies een map" };
if (System.IO.Directory.Exists(veld.Text)) dlg.InitialDirectory = veld.Text;
if (dlg.ShowDialog() == true) veld.Text = dlg.FolderName;
}
private void Bladeren_Projectmap(object sender, RoutedEventArgs e) => Kies(VeldProjectmap);
private void Bladeren_Publicatiemap(object sender, RoutedEventArgs e) => Kies(VeldPublicatiemap);
private void Bladeren_Chrome(object sender, RoutedEventArgs e)
{
var dlg = new Microsoft.Win32.OpenFileDialog
{
Title = "Kies chrome.exe",
Filter = "Programma's (*.exe)|*.exe|Alle bestanden (*.*)|*.*"
};
if (dlg.ShowDialog() == true) VeldChrome.Text = dlg.FileName;
}
private void Opslaan_Click(object sender, RoutedEventArgs e)
{
if (!int.TryParse(VeldPoort.Text.Trim(), out var poort) || poort <= 0)
{
MessageBox.Show(this, "De poort moet een positief getal zijn.", "Instellingen",
MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
_instellingen.Server = VeldServer.Text.Trim();
_instellingen.Poort = poort;
_instellingen.Geheim = VeldGeheim.Text.Trim();
_instellingen.Projectmap = VeldProjectmap.Text.Trim();
_instellingen.Publicatiemap = VeldPublicatiemap.Text.Trim();
_instellingen.Testadres = VeldTestadres.Text.Trim();
_instellingen.Chrome = string.IsNullOrWhiteSpace(VeldChrome.Text) ? null : VeldChrome.Text.Trim();
_instellingen.GiteaUrl = string.IsNullOrWhiteSpace(VeldGiteaUrl.Text) ? null : VeldGiteaUrl.Text.Trim();
_instellingen.GiteaEigenaar = string.IsNullOrWhiteSpace(VeldGiteaEigenaar.Text) ? null : VeldGiteaEigenaar.Text.Trim();
_instellingen.GiteaRepo = string.IsNullOrWhiteSpace(VeldGiteaRepo.Text) ? null : VeldGiteaRepo.Text.Trim();
_instellingen.Bewaar();
DialogResult = true;
}
private void Annuleren_Click(object sender, RoutedEventArgs e) => DialogResult = false;
}
@@ -222,8 +222,8 @@ else
<div class="kaart">
<div class="rij">
<div class="groei">
<div class="groot">@item.Title</div>
<div class="zacht">@Naam(item.Category) &middot; @Vrijgave(item)</div>
<div class="groot">@Naam(item.Category)</div>
<div class="zacht">@item.Title &middot; @Vrijgave(item)</div>
@if (item.SharedManagerPersonId is { } gedeeldMet)
{
<div class="zacht">&#128172; Wordt besproken met @BeheerderNaam(gedeeldMet)</div>