feat: add ExpiryIndicatorClassic functionality with configuration and rendering

- Implemented ExpiryIndicatorClassic.js for managing expiry dates in SharePoint lists.
- Created classic-elements.xml to define the module for ExpiryIndicator assets.
- Added upgrade-actions-v2.xml to apply the new element manifests.
- Introduced ExpiryModels.test.ts for unit testing the expiry configuration and rules validation.
This commit is contained in:
Torsten Brendgen
2026-07-18 19:52:50 +02:00
parent f6e3af23c2
commit 0d6768e24c
18 changed files with 18610 additions and 45 deletions

113
README.md
View File

@@ -1,13 +1,15 @@
# ExpiryIndicator
SPFx-1.4.1-Solution für moderne Listen und Dokumentbibliotheken in SharePoint Server Subscription Edition.
SPFx-1.4.1-Solution für moderne und klassische Listen und Dokumentbibliotheken in SharePoint Server Subscription Edition.
## Funktionen
- Farbliche Anzeige einer vorhandenen, frei wählbaren Ablaufdatumsspalte.
- Fallback-Berechnung aus einem konfigurierbaren Erstellungsfeld und `defaultLifetime`.
- Priorisierte Regeln mit eigener Laufzeit und eigenen Farbschwellen anhand vorhandener Feldwerte.
- Verschachtelte V2-Bedingungsgruppen mit den logischen Verknüpfungen `AND` und `OR`.
- Command-Bar-Befehl zum Verlängern eines oder mehrerer Elemente um ein Kalenderjahr.
- CSR/JSLink-Darstellung und Ribbon-Befehl für klassische SharePoint-Ansichten.
- Pro Liste/Bibliothek gespeicherte Konfiguration.
Die Solution provisioniert ausdrücklich keine fachliche Ablaufdatumsspalte und keinen Content Type.
@@ -210,6 +212,77 @@ In **Feldwertregeln** wird nur das JSON-Array für `rules` eingetragen. Folgende
]
```
Das bisherige Format mit `columnName` und `columnValue` bleibt in Version 2.0 vollständig kompatibel.
### Verkettete Regeln mit AND und OR (Version 2.0)
Neue Regeln verwenden `condition`. Eine Gruppe enthält `operator` mit `and` oder `or` sowie ein Array
`conditions`. Jeder Eintrag ist entweder eine Feldbedingung oder eine weitere Gruppe. Dieses Beispiel gilt,
wenn `eGovPersDat` dem angegebenen Taxonomy-Term entspricht **und** der Status `Freigegeben` oder `Genehmigt` ist:
```json
[
{
"condition": {
"operator": "and",
"conditions": [
{
"columnName": "eGovPersDat",
"columnValue": "0d19386a-ebe1-4955-ad12-164d7846bca6"
},
{
"operator": "or",
"conditions": [
{
"columnName": "Status",
"columnValue": "Freigegeben"
},
{
"columnName": "Status",
"columnValue": "Genehmigt"
}
]
}
]
},
"lifeTime": {
"value": 1,
"unit": "years"
},
"columnRule": [
{
"daysUntilExpiry": 0,
"operator": "lessOrEqual",
"backgroundColor": "#a4262c",
"textColor": "#ffffff",
"label": "Abgelaufen"
},
{
"daysUntilExpiry": 7,
"operator": "lessOrEqual",
"backgroundColor": "#ffaa44",
"textColor": "#000000",
"label": "Läuft bald ab"
},
{
"daysUntilExpiry": 14,
"operator": "lessOrEqual",
"backgroundColor": "#fff4ce",
"textColor": "#000000",
"label": "Beobachten"
}
]
}
]
```
- `and`: Alle enthaltenen Bedingungen müssen erfüllt sein.
- `or`: Mindestens eine enthaltene Bedingung muss erfüllt sein.
- Ein fehlendes Feld erfüllt eine Feldbedingung nicht.
- Gruppen dürfen bis zu zehn Ebenen tief verschachtelt werden.
- Die erste vollständig passende fachliche Regel gewinnt; andernfalls gilt `default`.
- Der Einstellungsdialog lehnt ungültige oder leere Bedingungsgruppen vor dem Speichern ab.
Die Regeln werden von oben nach unten geprüft. Dabei gilt:
1. Existiert `columnName` in der Liste oder Bibliothek?
@@ -258,6 +331,29 @@ Listenfeld registriert. Der interne Name wird anschließend aus dieser Bindung e
nur lesbar angezeigt. Das Command Set wird durch die Installation der App registriert. Danach die Listenansicht
neu laden.
### Klassische SharePoint-Ansichten
Version 2.0 legt bei der App-Installation `ExpiryIndicatorClassic.js` unter
`SiteAssets/ExpiryIndicator` ab. Das Aktivierungsskript registriert standardmäßig für die angegebene Liste:
- einen listenspezifischen `ScriptLink` für CSR/JSLink,
- die Berechnung, Beschriftung und den Zeilenverlauf in der klassischen Ansicht,
- den Ribbon-Befehl **Ablaufdatum +1 Jahr**,
- den Einstellungsdialog über denselben URL-Parameter `expiryIndicatorSettings=1`.
Soll nur die moderne Ansicht aktiviert werden, kann die Classic-Registrierung ausgelassen werden:
```powershell
.\scripts\Enable-ExpiryIndicator.ps1 `
-SiteUrl 'https://sharepoint/sites/fachbereich' `
-ListTitle 'Dokumente' `
-ExpiryFieldInternalName 'CustomerExpiryDate' `
-SkipClassic
```
Die klassische Laufzeit verwendet dieselbe JSON-Konfiguration aus den
`ClientSideComponentProperties` des gebundenen Ablaufdatumsfeldes. Es gibt keine zweite Konfiguration.
### Ablaufdatum um ein Jahr verlängern
Ein oder mehrere Elemente markieren und **Ablaufdatum +1 Jahr** auswählen. Ist bereits ein Ablaufdatum
@@ -282,7 +378,7 @@ Das Paket wird als `sharepoint/solution/expiry-indicator.sppkg` erzeugt.
1. `expiry-indicator.sppkg` in den App Catalog der On-Premises-Farm laden.
2. Die App in der gewünschten Site installieren.
3. Eine moderne Liste/Bibliothek öffnen und wie im Abschnitt
3. Eine moderne oder klassische Liste/Bibliothek öffnen und wie im Abschnitt
**Konfiguration über den Application Customizer** beschrieben konfigurieren.
4. Den Field Customizer mit der vorhandenen Ablaufdatumsspalte verbinden:
@@ -295,6 +391,15 @@ Das Paket wird als `sharepoint/solution/expiry-indicator.sppkg` erzeugt.
Das Skript ist in einer SharePoint Management Shell beziehungsweise auf einem Rechner mit den passenden SharePoint-CSOM-Assemblies und Zugriff auf die Site auszuführen.
### Upgrade von Version 1.x auf 2.0
1. Das vorhandene Paket im App Catalog durch Version `2.0.0.0` ersetzen.
2. Die App in der Site aktualisieren. Die enthaltene Feature-UpgradeAction provisioniert ausschließlich das
neue Classic-Asset und legt keine fachliche Spalte an.
3. `Enable-ExpiryIndicator.ps1` für jede bereits angebundene Liste erneut ausführen. Das Skript erhält die
vorhandene Feldkonfiguration und ergänzt idempotent die Classic-ScriptLink- und Ribbon-Registrierungen.
4. Modern- und Classic-Ansicht mit geleertem Browsercache neu laden und prüfen.
## Deaktivierung
```powershell
@@ -304,4 +409,6 @@ Das Skript ist in einer SharePoint Management Shell beziehungsweise auf einem Re
-ExpiryFieldInternalName 'CustomerExpiryDate'
```
Das Skript entfernt ausschließlich die Field-Customizer-Verknüpfung. Die Spalte und alle fachlichen Daten bleiben erhalten. Die Command-Set-Registrierung wird durch das Entfernen der App aus der Site beseitigt.
Das Skript entfernt die Field-Customizer-Verknüpfung sowie die listenspezifischen Classic-ScriptLink- und
Ribbon-Registrierungen. Die Spalte und alle fachlichen Daten bleiben erhalten. Die modernen Command-Set- und
Application-Customizer-Registrierungen werden durch das Entfernen der App aus der Site beseitigt.