Teilnehmerliste als Tabelle
Für eine Sitzungseinladung oder ein Protokoll erfasst der Sachbearbeiter die Teilnehmenden im Forms-Dialog. Im Dokument erscheinen sie als Tabelle mit Name, Kürzel und Rolle. Die Anzahl Zeilen richtet sich nach der Anzahl Teilnehmenden.
Ergebnis
- Forms-Dialog: Liste der Teilnehmenden; jeder Eintrag mit Vorname, Name, Kürzel sowie den Rollen Sitzungsleitung und Protokoll.
- Dokument: Tabelle mit Kopfzeile und einer Zeile pro Teilnehmenden, darunter ein Satz mit der Anzahl.
- Ohne Teilnehmende wird die Inhaltszeile der Tabelle ausgeblendet.
Bausteine
| Baustein | Aufgabe in diesem Beispiel | Referenz |
|---|---|---|
| Forms (Inhaltsvorlage) | ObjectCollection Participants mit Schema und Trefferliste | Forms |
| Fields (Inhaltsvorlage) | WordTableRows-Field ParticipantRows erzeugt die Zeilen; Text-Field ParticipantCount zählt | Fields, Builder API |
| Word-Inhaltsvorlage | Tabelle mit Kopfzeile und einer Inhaltszeile; Inhaltszeile und Feld binden | Zugriff auf primedocs-Felder |
Datenfluss
Schritt 1: Forms mit der Liste der Teilnehmenden
In der Inhaltsvorlage die Dokumentfunktion Forms aktivieren:
<FormsConfiguration>
<Elements>
<ObjectCollection Id="Participants" Label="Teilnehmende">
<Schema>
<Text Id="FirstName" Label="Vorname" />
<Text Id="LastName" Label="Name" />
<Text Id="Alias" Label="Kürzel" />
<YesNo Id="IsLead" Label="Sitzungsleitung" />
<YesNo Id="TakesMinutes" Label="Protokoll" />
</Schema>
<Summary>
<Field Id="FirstName" />
<Field Id="LastName" />
<Field Id="Alias" />
</Summary>
</ObjectCollection>
</Elements>
</FormsConfiguration>
Die Beschriftungen stehen direkt im Label, damit die Konfiguration ohne Vorarbeit läuft. Für mehrsprachige Vorlagen stattdessen translate-Label mit einem Schlüssel aus den globalen Übersetzungen verwenden.
Warum eine ObjectCollection: Sie nimmt beliebig viele gleichartige Einträge auf. Jeder Eintrag hat die Felder des Schema; Summary bestimmt, welche davon in der Liste des Dialogs erscheinen.
Schritt 2: Fields für Tabellenzeilen und Anzahl
In der Inhaltsvorlage die Dokumentfunktion Fields aktivieren:
<FieldsConfiguration>
<Fields>
<WordTableRows Name="ParticipantRows">
<Code><![CDATA[
function main() {
const builder = $.wordTableRows.getBuilder();
const participants = $("Forms.Participants");
for (const participant of participants) {
const roles = $.joinNonEmpty(", ",
participant.IsLead ? "Sitzungsleitung" : "",
participant.TakesMinutes ? "Protokoll" : "");
builder.append(
$.joinNonEmpty(" ", participant.FirstName, participant.LastName),
participant.Alias,
roles
);
}
return builder.build();
}
]]></Code>
</WordTableRows>
<Text Name="ParticipantCount">
<Code>
function main() {
return $("Forms.Participants").length.toString();
}
</Code>
</Text>
</Fields>
</FieldsConfiguration>
$("Forms.Participants")liefert ein Array;for … ofdurchläuft jeden Eintrag.IsLeadundTakesMinutessindBoolean.- Jeder Aufruf von
append(…)erzeugt eine Zeile. Die Anzahl Argumente entspricht den Zellen der Inhaltszeile aus Schritt 3 und muss bei jedem Aufruf gleich sein. build()ist der letzte Aufruf. Ohne Teilnehmende liefert er keine Zeile, und die Inhaltszeile wird ausgeblendet.ParticipantCount:.lengthist eine Zahl, einText-Field muss einenStringzurückgeben, darum.toString().
Schritt 3: Tabelle in der Word-Vorlage
- In der Inhaltsvorlage eine Tabelle mit zwei Zeilen anlegen: eine Kopfzeile mit den Spaltentiteln Name, Kürzel und Rolle sowie darunter eine leere Inhaltszeile. Die Kopfzeile wird nicht gebunden.
- Die Inhaltszeile vollständig markieren, auf «Feld binden» klicken und
ParticipantRowswählen. primedocs erzeugt für jeden Eintrag eine Kopie dieser Zeile; ihre drei Zellen entsprechen den drei Argumenten vonappend(…). - Unter der Tabelle einen Satz schreiben, z. B. «An der Sitzung nehmen … Personen teil.», den Cursor an die Stelle der Anzahl setzen und
ParticipantCountbinden.
Testen
- Vorlage im Vorlageneditor testen. Im Forms-Dialog füllt die Schaltfläche für Testdaten auch die Liste mit Beispieleinträgen. Die Tabelle zeigt eine Zeile pro Eintrag, der Satz die passende Anzahl.
- Rollen: Bei einem Eintrag beide Rollen setzen. Die Zelle zeigt beide Bezeichnungen, durch Komma getrennt.
- Leere Liste: Alle Einträge entfernen. Die Inhaltszeile ist im generierten Dokument nicht sichtbar; der Satz zeigt
0.
Varianten
Teilnehmende aus einer Datenquelle: Der ObjectCollection einen Block DataProviders geben, wie im Beispiel Brief mit Empfänger aus einer Adressdatenquelle. Field und Tabelle bleiben gleich.
Formatierte Zellen: Der Builder nimmt auch FormattedText, WordContent und InlineWordContent an, z. B. den Namen mit fettem Nachnamen: $.formattedText.parse("<p>{{first}} <b>{{last}}</b></p>", { first: participant.FirstName, last: participant.LastName }).
Zeilen in einem Snippet: Enthält ein WordContent-Snippet die Tabelle, erhält die Inhaltszeile dort den Platzhalter primedocs.SnippetTableRowsPlaceholder=<Name>, und das Field übergibt die Zeilen im Mapping von getWordContent. Siehe Platzhalter im WordContent-Snippet.
Liste statt Tabelle: Ein Text-Field, das die Namen mit map() und join(", ") zusammensetzt. Siehe Objects und ObjectCollections im Code.
Stolpersteine
| Symptom | Ursache | Lösung |
|---|---|---|
| Das Field lässt sich nicht binden | Nicht genau eine vollständige Tabellenzeile markiert | Die ganze Inhaltszeile markieren, nicht einzelne Zellen |
| Fehler bei der Generierung wegen der Zellenzahl | append(…) wurde mit unterschiedlich vielen Argumenten aufgerufen | Immer gleich viele Argumente übergeben, leere Zellen als "" |
| Tabelle zeigt nur die Kopfzeile | Keine Teilnehmenden erfasst; die Inhaltszeile wird ausgeblendet | Gewolltes Verhalten; sonst im Forms-Dialog Einträge erfassen |
| XML-Fehler beim Speichern der Konfiguration | < oder & im Code, z. B. in einem Vergleich a < b | Code in <![CDATA[ … ]]> setzen, wie in Schritt 2 |
Fehlermeldung zum Rückgabetyp bei ParticipantCount | .length ist eine Zahl | .toString() wie in Schritt 2 |