Aktualisiere Versionsnummer auf 3.2.2 in README.md, package.json, package-lock.json und package-solution.json. Entferne inkompatibles Seiten-Provisioning-Feature und passe Tests entsprechend an.

This commit is contained in:
Torsten Brendgen
2026-08-18 22:03:55 +02:00
parent 84307cd078
commit 094f0933e7
6 changed files with 17 additions and 51 deletions
+7 -11
View File
@@ -6,14 +6,14 @@ PortalSettings V3 ist ein providerbasiertes SPFx-WebPart für SharePoint Server
| Eigenschaft | Wert | | Eigenschaft | Wert |
|---|---| |---|---|
| Version | 3.2.1 | | Version | 3.2.2 |
| SharePoint Framework | 1.4.1 | | SharePoint Framework | 1.4.1 |
| Build-Node | 8.17.0 | | Build-Node | 8.17.0 |
| npm | 6.x | | npm | 6.x |
| Gulp | lokal 3.9.1 | | Gulp | lokal 3.9.1 |
| Komponente | Client-Side WebPart | | Komponente | Client-Side WebPart |
Die Oberfläche wird vollständig vom WebPart erzeugt und verwendet kein `innerHTML`. Ein schlankes SharePoint-Feature provisioniert beim Installieren der App im Root-Web automatisch die moderne `SitePages/PortalSettings.aspx` und platziert dort genau eine Instanz des WebParts. Die Oberfläche wird vollständig vom WebPart erzeugt und verwendet kein `innerHTML`. Die moderne `SitePages/PortalSettings.aspx` wird bewusst per PnP-PowerShell provisioniert, damit das SPFx-WebPart auf SharePoint Server zuverlässig registriert bleibt.
## Unterstützte Solutions ## Unterstützte Solutions
@@ -165,12 +165,9 @@ sharepoint/solution/portal-settings.sppkg
## Installation ## Installation
1. `portal-settings.sppkg` im App Catalog durch Version `3.2.1.0` ersetzen. 1. `portal-settings.sppkg` im App Catalog durch Version `3.2.2.0` ersetzen.
2. Die App im Root Web der gewünschten Site Collection installieren oder aktualisieren. 2. Die App im Root Web der gewünschten Site Collection installieren oder aktualisieren.
3. Die App provisioniert automatisch die veröffentlichte Seite `SitePages/PortalSettings.aspx` mit dem WebPart. 3. Die Seite mit dem PnP-PowerShell-Skript erzeugen beziehungsweise reparieren:
4. Eine bereits vorhandene `PortalSettings.aspx` wird nicht überschrieben.
Optional kann eine Seite per PnP PowerShell erzeugt werden:
```powershell ```powershell
.\deployment\Add-PortalSettingsPage.ps1 ` .\deployment\Add-PortalSettingsPage.ps1 `
@@ -178,7 +175,7 @@ Optional kann eine Seite per PnP PowerShell erzeugt werden:
-Publish -Publish
``` ```
Das Skript bleibt als Reparaturweg erhalten und verwendet standardmäßig ebenfalls `PortalSettings.aspx`. Das Skript verwendet standardmäßig `PortalSettings.aspx` und platziert dort das Portal-Settings-WebPart.
## Migration von V2 ## Migration von V2
@@ -191,9 +188,8 @@ V3 liest die vorhandenen Konfigurationsorte direkt weiter:
Es ist keine Datenmigration in eine neue Liste erforderlich. Empfohlenes Vorgehen: Es ist keine Datenmigration in eine neue Liste erforderlich. Empfohlenes Vorgehen:
1. Paket aktualisieren und die App im Root-Web aktualisieren. 1. Paket aktualisieren und die App im Root-Web aktualisieren.
2. Fehlt `PortalSettings.aspx`, wird sie durch das Feature angelegt. Eine vorhandene Seite bleibt unverändert. 2. Das PnP-Skript ausführen, wenn `PortalSettings.aspx` fehlt oder das WebPart noch nicht enthält.
3. Falls eine vorhandene Seite das WebPart noch nicht enthält, das PnP-Skript als Reparaturweg ausführen. 3. Alle Provider laden, Konfigurationen testweise speichern und Root Web sowie Subwebs prüfen.
4. Alle Provider laden, Konfigurationen testweise speichern und Root Web sowie Subwebs prüfen.
## Diagnose ## Diagnose
+3 -3
View File
@@ -2,7 +2,7 @@
Stand: 21.07.2026 Stand: 21.07.2026
Branch: `dev-3.0` Branch: `dev-3.0`
Zielversion: 3.2.1 Zielversion: 3.2.2
## Architektur ## Architektur
@@ -53,7 +53,7 @@ Zielversion: 3.2.1
- [x] Versionen auf 3.0.0 angehoben. - [x] Versionen auf 3.0.0 angehoben.
- [x] Node-Engine auf SPFx-1.4.1-Buildumgebung begrenzt. - [x] Node-Engine auf SPFx-1.4.1-Buildumgebung begrenzt.
- [x] Alte monolithische Seiten-, Copy- und Azure-Assets entfernt. - [x] Alte monolithische Seiten-, Copy- und Azure-Assets entfernt.
- [x] Schlankes Feature zur automatischen Provisionierung der modernen PortalSettings.aspx ergänzt. - [x] Automatisches Feature-Provisioning wegen fehlender WebPart-Registrierung auf SharePoint Server zurückgenommen.
- [x] Altes Gulp-Copy-Task entfernt. - [x] Altes Gulp-Copy-Task entfernt.
- [x] Serve-Konfiguration auf WebPart Workbench umgestellt. - [x] Serve-Konfiguration auf WebPart Workbench umgestellt.
- [x] Tests laufen vor der Paketierung. - [x] Tests laufen vor der Paketierung.
@@ -76,7 +76,7 @@ Zielversion: 3.2.1
- [ ] Ship-Paket mit Node.js 8.17.0 erstellen. - [ ] Ship-Paket mit Node.js 8.17.0 erstellen.
- [ ] App im Root Web aktualisieren. - [ ] App im Root Web aktualisieren.
- [ ] Automatisch provisionierte `PortalSettings.aspx` und enthaltenes WebPart prüfen. - [ ] Per PnP-Skript provisionierte `PortalSettings.aspx` und enthaltenes WebPart prüfen.
- [ ] MegaMenu-Termsets laden und speichern. - [ ] MegaMenu-Termsets laden und speichern.
- [ ] CustomBranding laden und schemaerhaltend speichern. - [ ] CustomBranding laden und schemaerhaltend speichern.
- [ ] ExpiryIndicator-Standard speichern. - [ ] ExpiryIndicator-Standard speichern.
+2 -15
View File
@@ -3,22 +3,9 @@
"solution": { "solution": {
"name": "portal-settings-client-side-solution", "name": "portal-settings-client-side-solution",
"id": "1c98e32d-bb7b-43b7-9625-074d6e4ea286", "id": "1c98e32d-bb7b-43b7-9625-074d6e4ea286",
"version": "3.2.1.0", "version": "3.2.2.0",
"includeClientSideAssets": true, "includeClientSideAssets": true,
"skipFeatureDeployment": false, "skipFeatureDeployment": false
"features": [
{
"title": "Portal Settings Page",
"description": "Provisioniert die moderne PortalSettings.aspx im Root-Web.",
"id": "71841e33-8bbd-4007-83a6-d950453226a2",
"version": "3.2.0.0",
"assets": {
"elementManifests": ["elements.xml"],
"elementFiles": ["PortalSettings.aspx"],
"upgradeActions": ["upgrade-actions.xml"]
}
}
]
}, },
"paths": { "paths": {
"zippedPackage": "solution/portal-settings.sppkg" "zippedPackage": "solution/portal-settings.sppkg"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "portal-settings", "name": "portal-settings",
"version": "3.2.1", "version": "3.2.2",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "portal-settings", "name": "portal-settings",
"version": "3.2.1", "version": "3.2.2",
"private": true, "private": true,
"main": "lib/index.js", "main": "lib/index.js",
"engines": { "engines": {
+3 -20
View File
@@ -15,9 +15,6 @@ var config = json('config/config.json');
var copyAssets = json('config/copy-assets.json'); var copyAssets = json('config/copy-assets.json');
var manifest = json('src/webparts/portalSettings/PortalSettingsWebPart.manifest.json'); var manifest = json('src/webparts/portalSettings/PortalSettingsWebPart.manifest.json');
var styles = read('src/webparts/portalSettings/PortalSettings.scss'); var styles = read('src/webparts/portalSettings/PortalSettings.scss');
var pageAsset = read('sharepoint/assets/PortalSettings.aspx');
var elements = read('sharepoint/assets/elements.xml');
var upgradeActions = read('sharepoint/assets/upgrade-actions.xml');
var sourceFiles = [ var sourceFiles = [
'src/ui/Dom.ts', 'src/ui/Dom.ts',
'src/ui/DynamicFormRenderer.ts', 'src/ui/DynamicFormRenderer.ts',
@@ -25,27 +22,13 @@ var sourceFiles = [
].map(read).join('\n'); ].map(read).join('\n');
var dataService = read('src/services/PortalSettingsDataService.ts'); var dataService = read('src/services/PortalSettingsDataService.ts');
assert(packageJson.version === '3.2.1', 'Package-Version ist nicht 3.2.1.'); assert(packageJson.version === '3.2.2', 'Package-Version ist nicht 3.2.2.');
assert(solution.version === '3.2.1.0', 'Solution-Version ist nicht 3.2.1.0.'); assert(solution.version === '3.2.2.0', 'Solution-Version ist nicht 3.2.2.0.');
assert(solution.features && solution.features.length === 1, 'Das Seiten-Provisioning-Feature fehlt.'); assert(!solution.features, 'Das inkompatible Seiten-Provisioning-Feature darf nicht paketiert werden.');
assert(solution.features[0].assets.elementManifests.indexOf('elements.xml') >= 0 &&
solution.features[0].assets.elementFiles.indexOf('PortalSettings.aspx') >= 0 &&
solution.features[0].assets.upgradeActions.indexOf('upgrade-actions.xml') >= 0,
'Die Provisioning-Assets sind nicht vollständig registriert.');
assert(!!config.bundles['portal-settings-web-part'], 'WebPart-Bundle fehlt.'); assert(!!config.bundles['portal-settings-web-part'], 'WebPart-Bundle fehlt.');
assert(copyAssets.deployCdnPath === 'temp/deploy', 'Ship-Assets werden nicht nach temp/deploy geschrieben.'); assert(copyAssets.deployCdnPath === 'temp/deploy', 'Ship-Assets werden nicht nach temp/deploy geschrieben.');
assert(manifest.componentType === 'WebPart', 'Komponente ist kein WebPart.'); assert(manifest.componentType === 'WebPart', 'Komponente ist kein WebPart.');
assert(!fs.existsSync(path.join(root, 'src/assets/PortalSettings.aspx')), 'Alte ASPX-Seite ist noch vorhanden.'); assert(!fs.existsSync(path.join(root, 'src/assets/PortalSettings.aspx')), 'Alte ASPX-Seite ist noch vorhanden.');
assert(pageAsset.indexOf('Microsoft.SharePoint.WebControls.ClientSidePage') >= 0,
'Das provisionierte Asset ist keine moderne SharePoint-Seite.');
assert(elements.indexOf('Url="PortalSettings.aspx"') >= 0 && elements.indexOf('RootWebOnly="TRUE"') >= 0 &&
elements.indexOf('IgnoreIfAlreadyExists="TRUE"') >= 0 && elements.indexOf('Level="Published"') >= 0,
'PortalSettings.aspx wird nicht sicher im Root-Web provisioniert.');
assert(elements.indexOf('CanvasContent1') >= 0 &&
elements.indexOf('c41d05ec-0682-4af0-b807-649806ed56b3') >= 0,
'Das PortalSettings-WebPart fehlt im provisionierten Canvas.');
assert(upgradeActions.indexOf('71841e33-8bbd-4007-83a6-d950453226a2\\elements.xml') >= 0,
'Die Upgrade-Provisionierung fehlt.');
assert(!fs.existsSync(path.join(root, 'src/extensions/portalSettings/PortalSettingsApplicationCustomizer.ts')), 'Alter Application Customizer ist noch vorhanden.'); assert(!fs.existsSync(path.join(root, 'src/extensions/portalSettings/PortalSettingsApplicationCustomizer.ts')), 'Alter Application Customizer ist noch vorhanden.');
assert(sourceFiles.indexOf('innerHTML') < 0, 'UI darf innerHTML nicht verwenden.'); assert(sourceFiles.indexOf('innerHTML') < 0, 'UI darf innerHTML nicht verwenden.');
assert(dataService.indexOf('/_api/site/rootweb/UserCustomActions') >= 0 && assert(dataService.indexOf('/_api/site/rootweb/UserCustomActions') >= 0 &&