From 58325e85833cb2b5bb83ea3e85a3bde70b721ac9 Mon Sep 17 00:00:00 2001 From: Carsten Graf Date: Wed, 18 Feb 2026 10:22:44 +0100 Subject: [PATCH] Ersetzt durch added, farben --- Spalten.txt | 1 + mssql-mcp-readonly.js | 6 ++-- public/dev.html | 71 ++++++++++++++++++++++++++++++++++----- public/index.html | 2 +- services/searchService.js | 13 ++++--- status.txt | 5 +++ 6 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 status.txt diff --git a/Spalten.txt b/Spalten.txt index b5e4d8a..89bd03a 100644 --- a/Spalten.txt +++ b/Spalten.txt @@ -6,4 +6,5 @@ Ben8 (Deutscher Text) Hersteller Text -> Text aus der tabelle TEXT durch TextId verknüpft PrsVK -> Aus Tabelle TSSAEF verknüpft durch Teil +Ersatz (Ersetzte durch) -> Aus Tabelle TSSAEF, Spalte Ersatz diff --git a/mssql-mcp-readonly.js b/mssql-mcp-readonly.js index 7785bf5..69c3cfe 100644 --- a/mssql-mcp-readonly.js +++ b/mssql-mcp-readonly.js @@ -207,8 +207,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { t.Ben7, t.Ben8, t.Hersteller, + t.Stat, txt.Text AS [Text], - ts.PrsVk AS PrsVK + ts.PrsVk AS PrsVK, + ts.Ersatz AS Ersatz FROM TEILE t WITH (NOLOCK) OUTER APPLY ( SELECT TOP 1 [Text] @@ -217,7 +219,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { ORDER BY LfdNr ) txt OUTER APPLY ( - SELECT TOP 1 PrsVk + SELECT TOP 1 PrsVk, Ersatz FROM TSSAEF WITH (NOLOCK) WHERE Teil = t.Teil ORDER BY ISN diff --git a/public/dev.html b/public/dev.html index 4e1d431..6fc790a 100644 --- a/public/dev.html +++ b/public/dev.html @@ -160,12 +160,40 @@ } .record { - background: #f9f9f9; - padding: 15px; + display: flex; margin-bottom: 10px; border-radius: 6px; - border-left: 4px solid #667eea; + overflow: hidden; + background: #f9f9f9; } + .record-status-bar { + width: 16px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 8px 0; + } + .record-status-label { + writing-mode: vertical-rl; + text-orientation: mixed; + transform: rotate(180deg); + color: rgba(255,255,255,0.95); + font-size: 11px; + font-weight: 600; + white-space: nowrap; + letter-spacing: 0.5px; + } + .record-body { + flex: 1; + padding: 15px; + } + /* Status-Farben (siehe status.txt): aktiv=grün, inaktiv/löschbar=rot, prüfbar=orange, pseudoteil=grün */ + .record-status-bar.record--aktiv { background: #2e7d32; } + .record-status-bar.record--inaktiv { background: #c62828; } + .record-status-bar.record--loeschbar { background: #c62828; } + .record-status-bar.record--pruefbar { background: #e65100; } + .record-status-bar.record--pseudoteil { background: #2e7d32; } .record-field { display: flex; @@ -396,11 +424,37 @@ { key: 'Ben8', label: 'Deutscher Text' }, { key: 'Hersteller', label: 'Hersteller' }, { key: 'Text', label: 'Zusatztext' }, - { key: 'PrsVK', label: 'Verkaufspreis in €' } + { key: 'PrsVK', label: 'Verkaufspreis in €' }, + { key: 'Ersatz', label: 'Ersetzt durch' } ]; + function getStatusClass(stat) { + const s = (stat == null ? '' : String(stat).trim()); + if (s === 'i') return 'record--inaktiv'; + if (s === 'l') return 'record--loeschbar'; + if (s === 'L') return 'record--pruefbar'; + if (s === 'p') return 'record--pseudoteil'; + return 'record--aktiv'; // "" oder leer = aktiv + } + + function getStatusLabel(stat) { + const s = (stat == null ? '' : String(stat).trim()); + if (s === 'i') return 'Inaktiv'; + if (s === 'l') return 'Löschbar'; + if (s === 'L') return 'Prüfbar'; + if (s === 'p') return 'Pseudoteil'; + return 'Aktiv'; + } + function renderRecord(record) { - let html = '
'; + const statusClass = getStatusClass(record.Stat); + const statusLabel = getStatusLabel(record.Stat); + let html = ` +
+
+ ${escapeHtml(statusLabel)} +
+
`; for (const { key, label } of DISPLAY_COLUMNS) { if (!(key in record)) continue; const value = record[key]; @@ -409,10 +463,11 @@
${escapeHtml(label)}: ${displayValue} -
- `; +
`; } - html += '
'; + html += ` +
+ `; return html; } diff --git a/public/index.html b/public/index.html index 9c46a74..a74b974 100644 --- a/public/index.html +++ b/public/index.html @@ -1,4 +1,4 @@ - +# diff --git a/services/searchService.js b/services/searchService.js index 73931e0..a18f15c 100644 --- a/services/searchService.js +++ b/services/searchService.js @@ -20,8 +20,8 @@ const TEILE_SEARCH_COLUMNS = [ 'Hersteller' ]; -// Ausgabe-Spalten für Suchergebnisse (nur diese 8 Felder, siehe Spalten.txt) -// Text aus TEXT (TEILE.MemoID = TEXT.TextId), PrsVK aus TSSAEF (Teil = Teil) +// Ausgabe-Spalten für Suchergebnisse (siehe Spalten.txt) +// Text aus TEXT (TEILE.MemoID = TEXT.TextId), PrsVK + Ersatz aus TSSAEF (Teil = Teil) const TEILE_OUTPUT_COLUMNS = [ 'Teil', 'Bez', @@ -30,7 +30,8 @@ const TEILE_OUTPUT_COLUMNS = [ 'Ben8', 'Hersteller', 'Text', // aus Tabelle TEXT - 'PrsVK' // aus Tabelle TSSAEF + 'PrsVK', // aus Tabelle TSSAEF + 'Ersatz' // aus Tabelle TSSAEF (Ersetzte durch) ]; const SEARCH_CONFIG = [ @@ -100,8 +101,10 @@ const fullTextSearch = async (searchTerm) => { t.Ben7, t.Ben8, t.Hersteller, + t.Stat, txt.Text AS [Text], - ts.PrsVk AS PrsVK + ts.PrsVk AS PrsVK, + ts.Ersatz AS Ersatz FROM [${tableConfig.tableName}] t WITH (NOLOCK) OUTER APPLY ( SELECT TOP 1 [Text] @@ -110,7 +113,7 @@ const fullTextSearch = async (searchTerm) => { ORDER BY LfdNr ) txt OUTER APPLY ( - SELECT TOP 1 PrsVk + SELECT TOP 1 PrsVk, Ersatz FROM TSSAEF WITH (NOLOCK) WHERE Teil = t.Teil ORDER BY ISN diff --git a/status.txt b/status.txt new file mode 100644 index 0000000..c7935ed --- /dev/null +++ b/status.txt @@ -0,0 +1,5 @@ +i = inaktiv -> rot +"" = aktiv -> grün +L = prüfbar -> orange +l = löschbar -> rot +p = pseudoteil -> grün \ No newline at end of file