HTML-Ansicht: Klick auf Kachel soll Datensatz öffnen (ui.popupRecord reagiert nicht)
Hallo zusammen,
ich habe mir in einer Formel eine HTML-Historie gebaut, um vergangene Chargen/Datensätze übersichtlich als scrollbare Liste darzustellen. Das funktioniert visuell und vom Scrolling her auch wunderbar (siehe Screenshot).

Mein Problem: Ich schaffe es einfach nicht, die einzelnen Kacheln klickbar zu machen, um den verknüpften Datensatz zu öffnen. Ich beisse mir hier gerade die Zähne aus.
Das Szenario:
Umgebung: Ninox Private Cloud.
Element: Berechnungsfeld (Formel) mit
html(...).Ziel: Klick auf ein
<div>oder<button>innerhalb des HTMLs soll den entsprechenden Datensatz öffnen.
Was ich schon versucht habe: Ich weiss, dass openRecord() im HTML-Kontext nicht funktioniert und man stattdessen ui.popupRecord('ID') nutzen muss. Ich habe diverse Varianten durchprobiert:
Klassisches
onclick="ui.popupRecord('ID')"in einem<div>.Nutzung von
<button>Elementen.Nutzung von
<a>Tags mithref="javascript:ui.popupRecord(...)".Diverse Escaping-Varianten für die Anführungszeichen (einfache, doppelte, maskierte), um Syntaxfehler zu vermeiden.
Der Code läuft ohne Fehlermeldung, die Liste wird angezeigt, aber der Klick wird vom Browser/Ninox einfach ignoriert oder nicht ausgeführt.
// ... (vorherige Berechnungen) ...
let myId := text(i);
// Versuch mit Button und Platzhalter-Replace gegen Syntax-Fehler
let myTemplate := "
<button class='h-btn' onclick='ui.popupRecord(""PLATZHALTER"")'>
<div class='h-content'>
</div>
</button>";
let s1 := replace(myTemplate, "PLATZHALTER", myId);
// ...
Hat jemand einen Tipp, wie man in der Private Cloud sicher einen openRecord-Befehl aus einem HTML-Feld abfeuert? Gibt es da eine spezielle Syntax oder Restriktionen bei Inline-Javascript?
Vielen Dank für eure Unterstützung!
Stephan
5 Antworten
-
Moin,
ich habe eine sehr ähnliche Anfrage gerade hier beantwortet:
https://forum.ninox.de/t/h7ypbh7/openfullscreen-in-formel
Wenn du trotzdem nicht weiterkommst, sag nochmal Bescheid. -
Salü
Danke dir für den Link – der hat mir als Ausgangspunkt auf jeden Fall weitergeholfen. Nach einigem Herumprobieren und mit Unterstützung von KI habe ich es schliesslich geschafft, die Datensätze so einzubinden, dass sie nun über die einzelnen Kacheln direkt angesprochen und geöffnet werden können.
Hier der vollstaendige Code, den ich aktuell verwende. Vielleicht ist er ja auch für andere hilfreich:let myArt := Artikel.Artikelnummer; let myRoom := Konfektionierungsraum; let mySize := Artikel.Bezeichnung2; let rawList := (select Chargenreport where Artikel.Artikelnummer = myArt and Konfektionierungsraum = myRoom and Artikel.Bezeichnung2 = mySize and 'Datensatz verworfen' != true and 'Erfassung abgeschlossen' = true and Status_Filter = "Ok" and 'Status Statisik' = "Ok"); let relatedRecords := rsort(rawList order by _HF_StoppDatumGesamt); let vCount := cnt(relatedRecords); if vCount = 0 then html("<div style='padding:10px; color:grey; font-family:sans-serif;'>Keine Historie gefunden.</div>") else let vAllOut := relatedRecords._HF_OutputProMinute; let vGlobalAvg := if avg(vAllOut) = null then 0 else avg(vAllOut) end; let css := " <style> .h-main { font-family: -apple-system, BlinkMacSystemFont, sans-serif; width: 100%; } .h-header { font-size: 10px; font-weight: 700; color: #9ca3af; margin-bottom: 8px; display: flex; justify-content: space-between; text-transform: uppercase; } .h-btn { display: block; width: 100%; background: #fff; border: 1px solid #e5e7eb; border-radius: 6px; margin-bottom: 6px; padding: 8px; box-shadow: 0 1px 2px rgba(0,0,0,0.03); text-align: left; cursor: pointer; position: relative; } .h-btn:hover { background-color: #f9fafb; border-color: #d1d5db; } .h-btn:active { background-color: #f3f4f6; border-color: #3b82f6; } .h-content { pointer-events: none; } .h-row { display: flex; justify-content: space-between; margin-bottom: 4px; } .txt-head { font-size: 11px; font-weight: 600; color: #374151; } .txt-sub { font-size: 11px; color: #6b7280; } /* SAFARI FIX: Feste Höhe, font-size 0 */ .bar-bg { width: 100%; height: 6px; background: #f3f4f6; border-radius: 3px; display: flex; overflow: hidden; margin-top: 4px; font-size: 0px; } .bar-seg { height: 100%; display: inline-block; } </style>"; let htmlCards := for i in relatedRecords do let vSetup := if i._HF_EinrichtDauerStunden = null then 0 else number(i._HF_EinrichtDauerStunden) end; let vClean := if i._HF_ReinigungsDauerStunden = null then 0 else number(i._HF_ReinigungsDauerStunden) end; let vProd := if i._HF_KonfDauerStunden = null then 0 else number(i._HF_KonfDauerStunden) end; let myOut := if i._HF_OutputProMinute = null then 0 else number(i._HF_OutputProMinute) end; let vMenge := if i.BuchungsmengeBlending = null then 0 else number(i.BuchungsmengeBlending) end; let vSum := vSetup + vClean + vProd; let vBase := if vSum = 0 then 1 else vSum end; "// CSS FIX: Komma durch Punkt ersetzen für Safari (z.B. 5,5% -> 5.5%)"; let wC := replace(format(vClean / vBase * 100, "0.0"), ",", "."); let wS := replace(format(vSetup / vBase * 100, "0.0"), ",", "."); let wP := replace(format(vProd / vBase * 100, "0.0"), ",", "."); let tIcon := "➡"; let tClass := "color:#d97706"; if myOut > vGlobalAvg * 1.02 then tIcon := "⬆"; tClass := "color:#059669" else if myOut < vGlobalAvg * 0.98 then tIcon := "⬇"; tClass := "color:#dc2626" end end; let myId := string(i); let tpl := " <button type='button' class='h-btn' onclick='ui.popupRecord(""ID_PH"")'> <div class='h-content'> <div class='h-row'> <span class='txt-head'>DATE_PH</span> <span class='txt-head'>Charge: CH_PH</span> </div> <div class='h-row'> <span class='txt-sub'>MENGE_PH Stk</span> <span class='txt-sub' style='color:#111;'>SUM_PHh</span> </div> <div class='h-row'> <span class='txt-sub'>Output: <b style='STYLE_PH'>OUT_PH ICON_PH</b></span> <span></span> </div> <div class='bar-bg'> <div class='bar-seg' style='background-color:#3b82f6; width:WC_PH%;'> </div> <div class='bar-seg' style='background-color:#f59e0b; width:WS_PH%;'> </div> <div class='bar-seg' style='background-color:#10b981; width:WP_PH%;'> </div> </div> </div> </button>"; let s1 := replace(tpl, "ID_PH", myId); let s2 := replace(s1, "DATE_PH", format(i._HF_StoppDatumGesamt, "DD.MM.YY")); let s3 := replace(s2, "CH_PH", i.Chargennummer); let s4 := replace(s3, "STYLE_PH", tClass); let s5 := replace(s4, "OUT_PH", format(myOut, "#,##0.0")); let s6 := replace(s5, "ICON_PH", tIcon); let s7 := replace(s6, "SUM_PH", format(vSum, "#,##0.0")); let s8 := replace(s7, "WC_PH", wC); let s9 := replace(s8, "WS_PH", wS); let s10 := replace(s9, "WP_PH", wP); replace(s10, "MENGE_PH", format(vMenge, "#,##0")) end; html(css + "<div class='h-main'>" + "<div class='h-header'>" + "<span>Historie (" + vCount + ")</span>" + "<span>Ø " + format(vGlobalAvg, "0.0") + "/min</span>" + "</div>" + join(htmlCards, "") + "</div>") end
Content aside
- vor 11 StundenZuletzt aktiv
- 5Antworten
- 51Ansichten
-
3
Folge bereits
