# Dynamic Poll Ein eigenstaendiges, mit SharePoint Server Subscription Edition kompatibles SPFx-1.4.1-WebPart fuer einfache Umfragen. Die Funktion orientiert sich am PnP-Beispiel `react-dynamic-poll`, ist aber fuer die vorhandene Legacy-Toolchain und klassische SharePoint-REST-Endpunkte umgesetzt. ## Funktionen - alle aktiven Umfragen anhand von Aktiv-Flag sowie optionalem Start- und Enddatum - umschaltbare Darstellung mehrerer aktiver Umfragen als Accordion oder Slider mit Punktenavigation - konfigurierbarer WebPart-Titel - vollstaendige Spaltenzuordnung im Property Pane - Content-Type-Hub-taugliche Verbindung zwischen Umfragen und Antworten ueber einen stabilen Textschluessel - genau eine Antwort je angemeldetem Benutzer und Umfrage - unmittelbare Ergebnisanzeige mit Stimmen und Prozentwerten - optional sichtbare Ergebnisse vor der eigenen Abstimmung - konfigurierbares Aktualisierungsintervall - barrierearme Radio-Auswahl, Statusmeldungen und Ergebnisbalken - SharePoint-Theme-Farben statt fest verdrahteter Portal-Farben ## Voraussetzungen - SharePoint Server Subscription Edition mit SPFx 1.4.1 - Node.js 8.17.0 und npm 6.x fuer den Build - SharePoint Management Shell fuer die Listenbereitstellung ## Listen bereitstellen In der SharePoint Management Shell auf einem SharePoint-Server ausfuehren: ```powershell .\deployment\Initialize-DynamicPollLists.ps1 ` -SiteUrl 'http://portal.contoso.local/sites/DEINE-SITE' ``` Das Skript ist idempotent und legt standardmaessig diese Listen an: - `Polls`: `PollKey`, `Title`, `Question`, `Options` (mehrzeiliger Nur-Text), `StartDate`, `EndDate`, `IsActive` - `Poll Answers`: `PollKey` (Text), `UserKey` (Text), `Answer` Die Benutzer des WebParts benoetigen Leserechte auf `Polls` sowie Lese- und Hinzufuegerechte auf `Poll Answers`. Fuer die Ergebnisberechnung muessen sie die vorhandenen Antworten lesen koennen. ## Umfrage anlegen In `Polls` ein Element mit Frage anlegen und in `Options` jede Antwortmoeglichkeit in eine eigene Zeile schreiben, zum Beispiel: ```text Ja Nein Anderer Termin ``` Leerzeilen und doppelte Eintraege werden ignoriert. `IsActive` aktivieren; Start- und Enddatum koennen leer bleiben. Sind mehrere Umfragen gleichzeitig aktiv, werden sie nach Startdatum sortiert und entsprechend dem im Property Pane gewählten Accordion- oder Slider-Modus angezeigt. Danach das WebPart auf einer modernen Seite einfuegen, im Property Pane die Listen `Polls` und `Poll Answers` auswaehlen und die Spalten zuordnen. Bekannte Standardnamen werden automatisch vorbelegt. ## Verwendung mit dem Inhaltstyp-Katalog Die beiden Listen duerfen aus zentral verteilten Inhaltstypen und Websitespalten aufgebaut werden. Fuer die Beziehung wird absichtlich kein Lookup verwendet: Der Poll-Schluessel enthaelt einen eindeutigen, dauerhaften Textwert und derselbe Wert wird beim Abstimmen in die zugeordnete Textspalte der Antwortliste geschrieben. Ein Lookup verweist auf die ID einer konkreten Liste und kann deshalb nicht verlaesslich ueber den Content Type Hub auf andere Websitesammlungen verteilt werden. Im Inhaltstyp-Katalog sollten dafuer zwei getrennte Websitespalten angelegt werden: eine eindeutige/indexierte Schluesselspalte fuer die Poll-Liste und eine nicht eindeutige Verweisspalte fuer die Antwortliste. Die Verweisspalte darf nicht eindeutig sein, weil mehrere Benutzer dieselbe Umfrage beantworten. Interne Namen wie `PollDefinitionKey` und `PollReferenceKey` sind daher ebenso moeglich und werden im Property Pane zugeordnet. ### Empfohlene Struktur der Poll-Liste | Interner Name | Typ | Einstellung / Verwendung | |---|---|---| | `PollDefinitionKey` | Eine Textzeile | Pflichtfeld, indiziert und eindeutig; dauerhafter Schluessel der Umfrage | | `Title` | Eine Textzeile | Optionaler Titel der Umfrage | | `Question` | Eine Textzeile oder mehrere Textzeilen | Pflichtfeld; angezeigte Frage | | `OptionsText` | Mehrere Textzeilen, Nur-Text | Pflichtfeld; eine Antwortmoeglichkeit pro Zeile | | `StartDate` | Datum und Uhrzeit | Optionaler Beginn der Anzeige | | `EndDate` | Datum und Uhrzeit | Optionales Ende der Anzeige | | `IsActive` | Ja/Nein | Aktiviert die Umfrage; empfohlener Standardwert `Nein` | Beispiel fuer einen stabilen `PollDefinitionKey`: ```text Poll-2026-Sommerfest ``` Der Schluessel darf nach Beginn der Abstimmung nicht mehr geaendert werden, weil die Antworten diesen Wert als Verbindung zur Umfrage speichern. ### Empfohlene Struktur der Antwortliste | Interner Name | Typ | Einstellung / Verwendung | |---|---|---| | `PollReferenceKey` | Eine Textzeile | Pflichtfeld und indiziert, aber **nicht eindeutig**; enthaelt den Poll-Schluessel | | `UserKey` | Eine Textzeile | Pflichtfeld und indiziert; Login, E-Mail oder anderer stabiler Benutzerschluessel | | `Answer` | Eine Textzeile | Pflichtfeld; ausgewaehlte Antwortmoeglichkeit | | `Title` | SharePoint-Standardspalte | Wird vom WebPart nicht benoetigt und kann optional oder ausgeblendet sein | `PollReferenceKey` darf nicht eindeutig sein, da mehrere Benutzer dieselbe Umfrage beantworten. Fuer `PollDefinitionKey` und `PollReferenceKey` muessen im Inhaltstyp-Katalog zwei verschiedene Websitespalten mit unterschiedlichen Feld-IDs angelegt werden. Dadurch kann nur der Schluessel der Poll-Liste eindeutig sein, waehrend die Antwortliste denselben Wert mehrfach speichern darf. ### Zuordnung im Property Pane Poll-Liste: | Property-Pane-Feld | Empfohlene Spalte | |---|---| | Stabiler Schluessel | `PollDefinitionKey` | | Titel | `Title` | | Frage | `Question` | | Antwortoptionen | `OptionsText` | | Startdatum | `StartDate` | | Enddatum | `EndDate` | | Aktiv | `IsActive` | Antwortliste: | Property-Pane-Feld | Empfohlene Spalte | |---|---| | Umfrageschluessel | `PollReferenceKey` | | Benutzerschluessel | `UserKey` | | Ausgewaehlte Antwort | `Answer` | Das mitgelieferte Provisionierungsskript verwendet fuer lokal erzeugte Listen aus Kompatibilitaetsgruenden in beiden Listen den internen Namen `PollKey`. Bei zentral verteilten Inhaltstypen ist die oben beschriebene Trennung in `PollDefinitionKey` und `PollReferenceKey` vorzuziehen. Die internen Spaltennamen duerfen abweichen. Im Property Pane lassen sich Umfrageschluessel, Titel, Frage, Antwortoptionen, Zeitfenster, Aktiv-Flag sowie Umfrageschluessel, Benutzer und Antwort der Antwortliste frei zuordnen. Fuer vorhandene Installationen bleibt ein bestehendes `Poll`-Lookup lesbar: In diesem Fall muss als Umfrageschluessel `ID` und als Antwortschluessel das Lookup `Poll` ausgewaehlt werden. Empfohlen ist die Migration auf die beiden Textspalten `PollKey`. Neue Inhaltstypen benoetigen keine Lookup-Spalte. Ein bestehendes Lookup dient ausschliesslich der Rueckwaertskompatibilitaet und sollte nach der Migration nicht mehr fuer neue Antworten verwendet werden. ## Paket bauen ```powershell npm install npm run package ``` Das fertige Paket liegt unter `sharepoint/solution/dynamic-poll-web-part.sppkg`. ## Hinweise Der Benutzerschluessel wird in der zugeordneten Spalte (standardmaessig `UserKey`) gespeichert. Die doppelte Stimmabgabe wird vor dem Schreiben geprueft. Zwei exakt gleichzeitige Requests desselben Benutzers lassen sich ohne serverseitige Eindeutigkeitsregel dennoch nicht vollstaendig ausschliessen. Nach einem Upgrade muss das Provisionierungsskript erneut ausgefuehrt werden. Es legt `PollKey`, `UserKey` und das mehrzeilige `OptionsText` an, uebernimmt vorhandene Werte und blendet das alte Poll-Lookup sowie die alte Choice-Spalte in den Formularen aus. Das Skript legt bei neuen Installationen kein Lookup mehr an.