feat(TecanWorklist): GWL-Vorschau in die Library ziehen - #332
Merged
Conversation
Storybook renders src/Provider directly, so it never ran the antd.less import that src/index.ts gives consumers. Every story showed antd components unstyled, which made visual review misleading.
TecanWorklist renders a Tecan Gemini worklist as a code view, grouped into the steps its C; comments describe. The commands carrying out a step stay collapsed behind "Befehle anzeigen", and the gutter keeps the true source line numbers so the collapsed view still points at the file. Highlights the command letter, the pipetted volume and the rack positions. The field indexes come from MLL\Utils\Tecan, so no grammar and no parser dependency is needed - parseGwl is a field map. The line numbers render as CSS generated content: user-select: none alone still lands in the clipboard, and a copied selection has to be valid GWL again. For the same reason the C; prefix stays visible. TecanWorklistPreview adds a selection on top, for the case where the worklist does not exist yet. It offers tip counts rather than Tecans, because the tip count is what shapes the worklist. Which device serves a tip count is the consumer's mapping, passed in and handed back unchanged. A worklist that already exists needs no selection and renders through TecanWorklist directly. Loading and empty states belong to the consumer, which holds the query - the components take the finished worklist string.
MasterMixRack in php-utils uses CoordinateSystem2x16NoJ, and limes-api derives MasterMixBlockItem coordinates from it, so everything from K down sat one row too low and Q wells fell out of the lookup unnoticed. Also hardens the worklist rendering the review turned up: highlighting now requires the field count a command letter serializes, and a step without a comment always shows its commands so a worklist without any C; line does not render an empty card.
MasterMixRack in php-utils uses CoordinateSystem2x16NoJ, whose rows run A-I and K-Q, and limes-api derives the MasterMixBlockItem coordinates from it. Rendering those against a row list containing J put everything from K onwards one row too low, and Q wells fell out of the position lookup without any error. COORDINATE_SYSTEM_2X16 stays as it is, so this only adds a coordinate system rather than changing one.
Comments restating a name or a type were removed, the remaining ones carry a why: the php-utils field indexes, the clipboard constraint on the gutter, the always-visible undocumented step. Dropped three parseGwl tests that were subsets of others: the cut-short command and the too-many-fields command exercise the same guard, a second comment mid-worklist is already covered by the grouping test, and the field-count drift test reads the whole fixture anyway.
Follows the layout of src/Plate: a PascalCase file per component, lowercase files for helpers.
…ng them A COMMAND constant translates the letters once, so the field index maps and the color map read themselves. An isUndocumented binding replaces the comment on the always-visible step.
PIPETTING_COMMAND_COLOR says which commands get a color. fieldRole takes an object, so its two numbers cannot be swapped at the call site. The story docs went nowhere without autodocs and only repeated the story name.
Toggling the commands re-parsed the whole worklist, which is free for a 34 line example and is not for a real dilution run. Collapsing the commands again is now covered too, and GwlCommandLine stops being exported to nobody.
simbig
commented
Aug 24, 2026
simbig
requested review from
spawnia
and
a lite review from Copilot
and removed request for
Copilot
August 24, 2026 11:01
spawnia
reviewed
Aug 24, 2026
The barrel already imports antd.less, so Storybook no longer needs its own stylesheet import. Links the php-utils class the MM coordinate system mirrors, rather than naming it.
simbig
marked this pull request as ready for review
August 24, 2026 14:15
spawnia
approved these changes
Aug 24, 2026
github-actions Bot
pushed a commit
that referenced
this pull request
Aug 24, 2026
# [20.7.0](v20.6.1...v20.7.0) (2026-08-24) ### Features * **TecanWorklist:** GWL-Vorschau in die Library ziehen ([#332](#332)) ([3f664bd](3f664bd))
|
🎉 This PR is included in version 20.7.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Zieht die GWL-Vorschau aus NeMo in die Library, ohne den dortigen Editor-Stack mitzunehmen. NeMo rendert Worklists über CodeMirror plus einen generierten lezer-Parser; für reines Anzeigen ist das deutlich mehr, als die Grammatik hergibt.
parseGwlist deshalb eine Feldtabelle, keine Grammatik, und die Feldindizes für Volumen und Positionen stammen ausMLL\Utils\Tecan. Keine neue Dependency.Zwei Komponenten statt einer, weil es drei Use Cases gibt und nur einer davon eine Auswahl braucht:
TecanWorklist— reiner Renderer, nimmt nur den String. Deckt „bestehende GWL anzeigen" ab, und mittoolbarauch den Fall, dass das Gerät feststeht und der Consumer es benennen will.TecanWorklistPreview— legt die Auswahl darüber, für den Fall, dass die GWL noch nicht existiert. Angeboten werden Tip-Counts, nicht Tecans, weil der Tip-Count die GWL formt. Welches Gerät einen Tip-Count bedient, ist das Mapping des Consumers und wird unverändert zurückgegeben.Bewusste Entscheidungen, die im Diff nicht selbst erklärt sind:
user-select: noneallein landet in Chromium trotzdem im Clipboard, und eine kopierte Selektion muss wieder gültige GWL sein. Aus demselben Grund bleibt dasC;vor Kommentaren sichtbar statt weggeschnitten.loadingund der Leerzustand gehören zum Consumer, der die Query hält, nicht in die Komponente.parseGwlprüft die Feldanzahl, die ein Befehlsbuchstabe lautMLL\Utils\Tecanserialisiert (A/Dgenau 10,Rmindestens 16 wegen der optional angehängten ausgeschlossenen Zielpositionen). Passt sie nicht, fällt die Zeile auf ungefärbte Felder zurück, statt eine falsche Zahl als Volumen einzufärben. Ein Fallback und kein Throw, weil ein reiner Renderer den Subtree des Consumers nicht mitreißen soll — der Testhighlights a volume in every pipetting command of a worklistschlägt an, falls die Serialisierung in php-utils wandert und der stumme Fallback sonst niemandem auffällt.C;eine komplett leere Karte, und nichts deutet darauf hin, dass es etwas aufzuklappen gibt.Die Beispiel-Worklist endet auf
Q2, was erst mit dem MM-Rack aus #333 stimmt — das ist inzwischen gemergt und in20.6.1released.Nicht-funktional mit drin: Storybook hat
src/Providerdirekt importiert und lief damit nie durch denantd.less-Import aussrc/index.ts— alle Stories zeigten antd-Komponenten unstyled, was die visuelle Review irreführend machte. Der Import geht jetzt über den Barrel, wie von @spawnia vorgeschlagen.Vorschau
Story
TecanWorklist/Preview, Befehle aufgeklappt:Test Plan
Was CI nicht abdeckt: in der Story
TecanWorklist/Previewdie Befehle aufklappen, den Codeblock mit der Maus markieren und kopieren. Im Clipboard muss wortwörtlich die GWL stehen — ohne Zeilennummern und mitC;vor den Kommentaren.