From 6d1e36a2ae91247950c79e8bcc9192118fa4dd9b Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Wed, 7 Oct 2026 08:52:05 +0200 Subject: [PATCH] Aggiungi la lista personalizzata di codici nella fase 2 In alternativa al file del gestionale si possono digitare i codici uno alla volta (Invio/Aggiungi, Canc per togliere). Tutto a valle legge solo _righeCorrenti, quindi basta una nuova sorgente; la selezione della griglia mantiene il colore verde/rosso della verifica. Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 1 + PrepStep/Form1.cs | 133 +++++++++++++++++++++++++++++++++++++++--- PrepStep/GuidaForm.cs | 5 +- docs/architettura.md | 2 +- docs/guida-utente.md | 8 ++- 5 files changed, 138 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6796b09..165ce44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ aderisce a [Semantic Versioning](https://semver.org/lang/it/). ### Aggiunto +- Fase 2: modalità "Lista personalizzata" per inserire i codici a mano, uno alla volta, in alternativa al file del gestionale. - Docs-as-code: `scripts/CheckDocs.cs`, markdownlint, `docs/README.md` (indice Diátaxis e fonte unica). - Nuovi doc: `tutorial-primo-giro`, `risoluzione-problemi`, `sviluppo`, `rilascio`, `glossario` e registro delle decisioni `docs/decisioni/` (6 ADR). diff --git a/PrepStep/Form1.cs b/PrepStep/Form1.cs index 22c1356..c528551 100644 --- a/PrepStep/Form1.cs +++ b/PrepStep/Form1.cs @@ -12,6 +12,11 @@ public partial class Form1 : Form private readonly Button _btnTrovaPrt = new(); private readonly Button _btnVerifica = new(); private readonly FlowLayoutPanel _rigaVerifica = new(); + private readonly FlowLayoutPanel _rigaFile = new(); + private readonly FlowLayoutPanel _rigaCustom = new(); + private readonly RadioButton _rbFile = new() { Text = "Da file del gestionale", Checked = true, AutoSize = true }; + private readonly RadioButton _rbCustom = new() { Text = "Lista personalizzata", AutoSize = true }; + private readonly TextBox _txtCodice = new() { Width = 220, Margin = new Padding(0, 3, 8, 0) }; private readonly ListView _lstAnteprimaAsm = new(); private readonly Label _lblStatus = new(); private readonly Label _lblDb = new(); @@ -50,7 +55,7 @@ public partial class Form1 : Form private string? _dbPath; private string? _cartellaLavoro; - private string? _percorsoInputCorrente; + private bool _ripristinoModalita; private List<(string Componente, string Descrizione)>? _righeCorrenti; private Dictionary>? _ultimaVerifica; private string? _ultimaCartellaRaw; @@ -266,7 +271,12 @@ public partial class Form1 : Form return; } - _percorsoInputCorrente = null; + AzzeraDistinta(); + VaiAllaFase(1); + } + + private void AzzeraDistinta() + { _righeCorrenti = null; _ultimaCartellaRaw = null; _ultimaVerifica = null; @@ -275,8 +285,68 @@ public partial class Form1 : Form _lstAnteprimaAsm.Items.Clear(); ImpostaStatoImport("", Color.Black); _rigaVerifica.Visible = false; + } - VaiAllaFase(1); + private void CambiaModalitaDistinta() + { + if (_ripristinoModalita) + return; + if (_gridImport.Rows.Count > 0 && MessageBox.Show(this, + "Cambiando modalità la distinta corrente viene azzerata. Continuare?", "Distinta", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + { + _ripristinoModalita = true; + (_rbCustom.Checked ? _rbFile : _rbCustom).Checked = true; + _ripristinoModalita = false; + return; + } + AzzeraDistinta(); + _rigaFile.Visible = _rbFile.Checked; + _rigaCustom.Visible = _rbCustom.Checked; + AggiornaStatoAvanti(); + } + + private void AggiungiCodice() + { + string codice = _txtCodice.Text.Trim(); + if (codice.Length == 0) + return; + _righeCorrenti ??= new(); + if (_righeCorrenti.Any(r => string.Equals(r.Componente, codice, StringComparison.OrdinalIgnoreCase))) + { + _txtCodice.SelectAll(); + return; + } + _righeCorrenti.Add((codice, "")); + _gridImport.Rows.Add(codice, ""); + InvalidaVerifica(); + _txtCodice.Clear(); + _txtCodice.Focus(); + } + + private void RimuoviCodiceSelezionato() + { + if (_gridImport.CurrentRow is not { } riga || _righeCorrenti is null) + return; + _righeCorrenti.RemoveAt(riga.Index); // griglia e lista hanno lo stesso ordine + _gridImport.Rows.Remove(riga); + InvalidaVerifica(); + } + + /// La lista è cambiata: la verifica presenza e il raw già creato non valgono più. + private void InvalidaVerifica() + { + _ultimaVerifica = null; + _ultimaCartellaRaw = null; + _gridRaw.Rows.Clear(); + foreach (DataGridViewRow r in _gridImport.Rows) + { + r.DefaultCellStyle.BackColor = Color.Empty; + r.DefaultCellStyle.SelectionBackColor = Color.Empty; + r.DefaultCellStyle.SelectionForeColor = Color.Empty; + } + _rigaVerifica.Visible = _righeCorrenti is { Count: > 0 }; + AggiornaStatoAvanti(); } private Panel BuildFaseDatabase() @@ -400,12 +470,51 @@ public partial class Form1 : Form }; contenuto.Controls.Add(lblIstruzioni); - var rigaImporta = new FlowLayoutPanel + var rigaModalita = new FlowLayoutPanel { AutoSize = true, FlowDirection = FlowDirection.LeftToRight, Margin = new Padding(0, 0, 0, 8), }; + rigaModalita.Controls.Add(_rbFile); + rigaModalita.Controls.Add(_rbCustom); + _rbCustom.CheckedChanged += (_, _) => CambiaModalitaDistinta(); + contenuto.Controls.Add(rigaModalita); + + _rigaCustom.AutoSize = true; + _rigaCustom.FlowDirection = FlowDirection.LeftToRight; + _rigaCustom.Margin = new Padding(0, 0, 0, 8); + _rigaCustom.Visible = false; + var btnAggiungi = new Button { Text = "Aggiungi", Margin = new Padding(0, 0, 8, 0) }; + UiStile.Secondario(btnAggiungi); + btnAggiungi.Click += (_, _) => AggiungiCodice(); + _txtCodice.KeyDown += (_, e) => + { + if (e.KeyCode != Keys.Enter) + return; + e.SuppressKeyPress = true; + AggiungiCodice(); + }; + _rigaCustom.Controls.Add(_txtCodice); + _rigaCustom.Controls.Add(btnAggiungi); + _rigaCustom.Controls.Add(new Label + { + AutoSize = true, + ForeColor = SystemColors.GrayText, + Margin = new Padding(0, 9, 0, 0), + Text = "Digita un codice e premi Invio (Canc sulla riga per toglierlo)", + }); + contenuto.Controls.Add(_rigaCustom); + _gridImport.KeyDown += (_, e) => + { + if (e.KeyCode == Keys.Delete && _rbCustom.Checked) + RimuoviCodiceSelezionato(); + }; + + var rigaImporta = _rigaFile; + rigaImporta.AutoSize = true; + rigaImporta.FlowDirection = FlowDirection.LeftToRight; + rigaImporta.Margin = new Padding(0, 0, 0, 8); var btnSfoglia = new Button { Text = "Scegli file distinta...", @@ -646,10 +755,15 @@ public partial class Form1 : Form private void ImportaDistinta(string percorso) { + if (_rbCustom.Checked) + { + _rbFile.Checked = true; // chiede conferma se c'è una lista; se rifiuta resta in custom + if (_rbCustom.Checked) + return; + } try { var (_, righe) = DistintaBaseImporter.ConvertiInCsv(percorso, _cartellaLavoro!); - _percorsoInputCorrente = percorso; _righeCorrenti = righe; _gridImport.Rows.Clear(); @@ -666,7 +780,6 @@ public partial class Form1 : Form } catch (Exception ex) { - _percorsoInputCorrente = null; _righeCorrenti = null; _gridImport.Rows.Clear(); ImpostaStatoImport($"Errore durante la conversione: {ex.Message}", Color.DarkRed); @@ -694,16 +807,20 @@ public partial class Form1 : Form foreach (DataGridViewRow riga in _gridImport.Rows) { string componente = (string)riga.Cells["componente"].Value!; - riga.DefaultCellStyle.BackColor = trovati.ContainsKey(componente) + var colore = trovati.ContainsKey(componente) ? Color.FromArgb(198, 239, 206) : Color.FromArgb(255, 199, 206); + // la selezione mantiene il colore verde/rosso, altrimenti il blu nasconde l'esito + riga.DefaultCellStyle.BackColor = colore; + riga.DefaultCellStyle.SelectionBackColor = colore; + riga.DefaultCellStyle.SelectionForeColor = Color.Black; } AggiornaStatoAvanti(); } private void CreaCartellaRaw() { - if (_percorsoInputCorrente is null || _righeCorrenti is null) + if (_righeCorrenti is null) return; // L'assieme generale è già una riga di _righeCorrenti (aggiunta da diff --git a/PrepStep/GuidaForm.cs b/PrepStep/GuidaForm.cs index 20035ad..57d685d 100644 --- a/PrepStep/GuidaForm.cs +++ b/PrepStep/GuidaForm.cs @@ -104,7 +104,10 @@ public class GuidaForm : Form [ "Carica la distinta: trascina il file .xls nella finestra, oppure premi " + "\"Scegli file distinta...\". Le righe importate compaiono nella griglia " + - "(Componente/Descrizione) e viene scritto un CSV nella cartella di lavoro.", + "(Componente/Descrizione) e viene scritto un CSV nella cartella di lavoro. " + + "In alternativa scegli \"Lista personalizzata\" e digita i codici uno alla " + + "volta (Invio per aggiungere, Canc per togliere): nessun CSV, l'assieme " + + "generale va inserito a mano.", "Verifica la presenza dei file sul server: compare solo dopo un import " + "riuscito. Cerca ogni componente nel database — le righe della griglia si " + "colorano di verde (trovato) o rosso (non trovato nell'indice).", diff --git a/docs/architettura.md b/docs/architettura.md index cfbd051..16fab51 100644 --- a/docs/architettura.md +++ b/docs/architettura.md @@ -94,7 +94,7 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`. | # | Fase | Bottone → metodo | Cosa fa | |---|---|---|---| | 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync` | Crea/aggiorna `cad_index.db` scansionando la share; un pallino verde/rosso accanto al titolo indica se un DB è caricato. La cartella di lavoro non è mostrata qui (cambiabile in qualunque momento da "File → Scegli cartella di lavoro...") | - | 2 | Importa Distinta Base | selezione file/drag&drop → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv`, poi "Verifica presenza" → `VerificaCodiciNelDb` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro; "Verifica presenza" (visibile solo dopo un import riuscito) cerca i componenti nell'indice e colora le righe della griglia — è quella che sblocca "Avanti", non il solo import | + | 2 | Importa Distinta Base | selezione file/drag&drop → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv`, poi "Verifica presenza" → `VerificaCodiciNelDb` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro (oppure "Lista personalizzata": codici digitati uno alla volta con `AggiungiCodice`, solo in memoria, senza CSV; tutto a valle legge solo `_righeCorrenti`); "Verifica presenza" (visibile solo dopo un import riuscito) cerca i componenti nell'indice e colora le righe della griglia — è quella che sblocca "Avanti", non il solo import | | 3 | Crea cartella raw | "Crea cartella raw" → `CreaCartellaRaw` | `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela) → `raw/` dentro la cartella di lavoro | | 4 | Trova componenti referenziati | "Trova componenti referenziati" → `TrovaPrtReferenziati` → `RisolviAlberoComponenti` | Legge i `.asm` in `raw/`, risolve ricorsivamente sotto-assiemi/parti nell'indice e li copia anch'essi in `raw/`, insieme ai componenti soppressi e ai modelli citati per riferimento esterno che servono a Creo per aprire l'assieme | | 5 | Verifica completezza | (ingresso in fase) → `AggiornaAnteprimaAsm` | Mostra le icone trascinabili dei `.asm` della distinta già in `raw/`, da trascinare su Creo per l'esportazione STEP (Distributed Batch) | diff --git a/docs/guida-utente.md b/docs/guida-utente.md index 254c8ab..132e017 100644 --- a/docs/guida-utente.md +++ b/docs/guida-utente.md @@ -76,7 +76,13 @@ Premi **Avanti** quando il database è caricato. oppure premi **Scegli file distinta...** e selezionalo da Esplora risorse. Le righe importate compaiono nella griglia (Componente/Descrizione) e viene scritto un CSV nella cartella di lavoro. -- **2. Verifica la presenza dei file sul server**: compare solo dopo un import riuscito. + In alternativa scegli **Lista personalizzata**: digita un codice e premi **Invio** (o + **Aggiungi**) per inserirlo, ripeti per ogni codice; **Canc** sulla riga selezionata lo + toglie. La lista non scrive nessun CSV e, passando da una modalità all'altra, viene azzerata + (con conferma). Inserisci anche l'assieme generale, se serve: qui non viene aggiunto da solo. +- **2. Verifica la presenza dei file sul server**: compare solo dopo un import riuscito + (o dopo il primo codice aggiunto alla lista personalizzata; ogni modifica della lista + richiede di rifare la verifica). Premila per cercare ogni componente nel database — le righe della griglia si colorano di verde (trovato) o rosso (non trovato nell'indice).