foxygit / digitalskrivare_merge Log in
commits tags

/src/Remiss.App/MottagningDialog.cs · 3.78 KB

raw
using System.Drawing;
using System.Windows.Forms;
using Remiss.Core.Models;

namespace Remiss.App;

/// <summary>
/// Steg [1]: sökbar lista över mottagningar. Byggd helt i kod – ingen designer.
/// Avbryt (Esc / stäng / knapp) ger <see cref="DialogResult.Cancel"/> och
/// <see cref="SelectedMottagning"/> = null, vilket anroparen tolkar som "städa och avsluta".
/// </summary>
public sealed class MottagningDialog : Form
{
    private readonly IReadOnlyList<Mottagning> _all;
    private readonly TextBox _search = new();
    private readonly ListBox _list = new();
    private readonly Button _ok = new();
    private readonly Button _cancel = new();

    public Mottagning? SelectedMottagning { get; private set; }

    public MottagningDialog(IReadOnlyList<Mottagning> mottagningar)
    {
        _all = mottagningar;

        Text = "Välj mottagning";
        StartPosition = FormStartPosition.CenterScreen;
        FormBorderStyle = FormBorderStyle.Sizable;
        MinimizeBox = false;
        MaximizeBox = false;
        ShowInTaskbar = true;
        MinimumSize = new Size(420, 360);
        ClientSize = new Size(460, 520);

        var layout = new TableLayoutPanel
        {
            Dock = DockStyle.Fill,
            ColumnCount = 1,
            RowCount = 3,
            Padding = new Padding(12),
        };
        layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 30));
        layout.RowStyles.Add(new RowStyle(SizeType.Percent, 100));
        layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 48));

        _search.Dock = DockStyle.Fill;
        _search.PlaceholderText = "Sök mottagning eller HSA-id…";
        _search.TextChanged += (_, _) => ApplyFilter();
        _search.KeyDown += SearchKeyDown;

        _list.Dock = DockStyle.Fill;
        _list.IntegralHeight = false;
        _list.DoubleClick += (_, _) => TryAccept();
        _list.SelectedIndexChanged += (_, _) => _ok.Enabled = _list.SelectedItem is Mottagning;

        _ok.Text = "OK";
        _ok.Enabled = false;
        _ok.AutoSize = true;
        _ok.Padding = new Padding(12, 4, 12, 4);
        _ok.Click += (_, _) => TryAccept();

        _cancel.Text = "Avbryt";
        _cancel.AutoSize = true;
        _cancel.Padding = new Padding(12, 4, 12, 4);
        _cancel.DialogResult = DialogResult.Cancel;

        var buttons = new FlowLayoutPanel
        {
            Dock = DockStyle.Fill,
            FlowDirection = FlowDirection.RightToLeft,
        };
        buttons.Controls.Add(_cancel);
        buttons.Controls.Add(_ok);

        layout.Controls.Add(_search, 0, 0);
        layout.Controls.Add(_list, 0, 1);
        layout.Controls.Add(buttons, 0, 2);
        Controls.Add(layout);

        AcceptButton = _ok;
        CancelButton = _cancel;

        ApplyFilter();
    }

    private void ApplyFilter()
    {
        var query = _search.Text.Trim();

        IEnumerable<Mottagning> matches = string.IsNullOrEmpty(query)
            ? _all
            : _all.Where(m =>
                m.Namn.Contains(query, StringComparison.CurrentCultureIgnoreCase) ||
                m.HsaId.Contains(query, StringComparison.OrdinalIgnoreCase));

        _list.BeginUpdate();
        _list.Items.Clear();
        foreach (var m in matches)
            _list.Items.Add(m);
        _list.EndUpdate();

        if (_list.Items.Count > 0)
            _list.SelectedIndex = 0;

        _ok.Enabled = _list.SelectedItem is Mottagning;
    }

    private void SearchKeyDown(object? sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Down && _list.Items.Count > 0)
        {
            _list.Focus();
            e.Handled = true;
        }
    }

    private void TryAccept()
    {
        if (_list.SelectedItem is not Mottagning m)
            return;

        SelectedMottagning = m;
        DialogResult = DialogResult.OK;
        Close();
    }
}