Aktualisiere Versionsnummer auf 3.2.6 in README.md, package.json, package-lock.json und package-solution.json. Passe Tests an, um die neuen Versionen zu validieren und ändere den HTTP-Header in PortalSettingsDataService für die Speicherung von Root-Web-Eigenschaften.

This commit is contained in:
Torsten Brendgen
2026-08-23 21:46:33 +02:00
parent e8fa3c2924
commit 3cc8364ad4
7 changed files with 19 additions and 10 deletions
+2 -2
View File
@@ -6,7 +6,7 @@ PortalSettings V3 ist ein providerbasiertes SPFx-WebPart für SharePoint Server
| Eigenschaft | Wert | | Eigenschaft | Wert |
|---|---| |---|---|
| Version | 3.2.5 | | Version | 3.2.6 |
| 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 |
@@ -171,7 +171,7 @@ sharepoint/solution/portal-settings.sppkg
## Installation ## Installation
1. `portal-settings.sppkg` im App Catalog durch Version `3.2.5.0` ersetzen. 1. `portal-settings.sppkg` im App Catalog durch Version `3.2.6.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 Seite mit dem PnP-PowerShell-Skript erzeugen beziehungsweise reparieren: 3. Die Seite mit dem PnP-PowerShell-Skript erzeugen beziehungsweise reparieren:
+2 -2
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.5 Zielversion: 3.2.6
## Architektur ## Architektur
@@ -79,7 +79,7 @@ Zielversion: 3.2.5
- [ ] Per PnP-Skript 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. - [x] ExpiryIndicator-Standard über SharePoint-SE-kompatibles POST ohne MERGE/PATCH speichern.
- [ ] Expiry-Bindung hinzufügen, lokal konfigurieren und wieder auf Vererbung stellen. - [ ] Expiry-Bindung hinzufügen, lokal konfigurieren und wieder auf Vererbung stellen.
- [ ] Bedienung mit Tastatur, 200-Prozent-Zoom und Windows-Hochkontrast prüfen. - [ ] Bedienung mit Tastatur, 200-Prozent-Zoom und Windows-Hochkontrast prüfen.
- [ ] Alte V2-Seite nach erfolgreicher Parallelabnahme archivieren oder entfernen. - [ ] Alte V2-Seite nach erfolgreicher Parallelabnahme archivieren oder entfernen.
+1 -1
View File
@@ -3,7 +3,7 @@
"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.5.0", "version": "3.2.6.0",
"includeClientSideAssets": true, "includeClientSideAssets": true,
"skipFeatureDeployment": false "skipFeatureDeployment": false
}, },
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "portal-settings", "name": "portal-settings",
"version": "3.2.5", "version": "3.2.6",
"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.5", "version": "3.2.6",
"private": true, "private": true,
"main": "lib/index.js", "main": "lib/index.js",
"engines": { "engines": {
+3 -1
View File
@@ -302,7 +302,9 @@ export class PortalSettingsDataService {
const body: any = { '__metadata': { 'type': 'SP.PropertyValues' } }; const body: any = { '__metadata': { 'type': 'SP.PropertyValues' } };
body[this.encodePropertyName(key)] = value; body[this.encodePropertyName(key)] = value;
return this.context.spHttpClient.post(this.siteUrl + '/_api/web/AllProperties', SPHttpClient.configurations.v1, { return this.context.spHttpClient.post(this.siteUrl + '/_api/web/AllProperties', SPHttpClient.configurations.v1, {
headers: this.writeHeaders('MERGE'), body: JSON.stringify(body) // SP.PropertyValues accepts POST, but SharePoint Server SE rejects the
// MERGE override because it is handled as an unsupported HTTP PATCH.
headers: this.writeHeaders(), body: JSON.stringify(body)
}).then((response: SPHttpClientResponse): Promise<void> => this.ensureOk(response, 'Der Site-Collection-Standard konnte nicht gespeichert werden.')); }).then((response: SPHttpClientResponse): Promise<void> => this.ensureOk(response, 'Der Site-Collection-Standard konnte nicht gespeichert werden.'));
} }
+9 -2
View File
@@ -21,9 +21,13 @@ var sourceFiles = [
'src/ui/PortalSettingsApp.ts' 'src/ui/PortalSettingsApp.ts'
].map(read).join('\n'); ].map(read).join('\n');
var dataService = read('src/services/PortalSettingsDataService.ts'); var dataService = read('src/services/PortalSettingsDataService.ts');
var rootPropertyWriter = dataService.substring(
dataService.indexOf('private saveRootProperty'),
dataService.indexOf('private findAction')
);
assert(packageJson.version === '3.2.5', 'Package-Version ist nicht 3.2.5.'); assert(packageJson.version === '3.2.6', 'Package-Version ist nicht 3.2.6.');
assert(solution.version === '3.2.5.0', 'Solution-Version ist nicht 3.2.5.0.'); assert(solution.version === '3.2.6.0', 'Solution-Version ist nicht 3.2.6.0.');
assert(!solution.features, 'Das inkompatible Seiten-Provisioning-Feature darf nicht paketiert werden.'); assert(!solution.features, 'Das inkompatible Seiten-Provisioning-Feature darf nicht paketiert werden.');
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.');
@@ -36,6 +40,9 @@ assert(dataService.indexOf('/_api/site/rootweb/UserCustomActions') >= 0 &&
'Root-Web-Actions werden nicht für die Provider-Erkennung berücksichtigt.'); 'Root-Web-Actions werden nicht für die Provider-Erkennung berücksichtigt.');
assert(dataService.indexOf('body.Sequence = provider.storage.action.sequence') >= 0, assert(dataService.indexOf('body.Sequence = provider.storage.action.sequence') >= 0,
'Bestehende Actions werden nicht auf die Provider-Sequence aktualisiert.'); 'Bestehende Actions werden nicht auf die Provider-Sequence aktualisiert.');
assert(rootPropertyWriter.indexOf('headers: this.writeHeaders(), body: JSON.stringify(body)') >= 0 &&
rootPropertyWriter.indexOf("writeHeaders('MERGE')") < 0,
'Root-Web-Properties müssen mit POST ohne MERGE/PATCH gespeichert werden.');
['themePrimary', 'neutralPrimary', 'neutralLight', 'white'].forEach(function (slot) { ['themePrimary', 'neutralPrimary', 'neutralLight', 'white'].forEach(function (slot) {
assert(styles.indexOf('[theme: ' + slot + ', default:') >= 0, 'Themeslot fehlt: ' + slot); assert(styles.indexOf('[theme: ' + slot + ', default:') >= 0, 'Themeslot fehlt: ' + slot);
}); });