155 lines
7.4 KiB
Markdown
155 lines
7.4 KiB
Markdown
# 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.
|