From 3cc8364ad439dd7620b4370405fc010666b891f5 Mon Sep 17 00:00:00 2001 From: Torsten Brendgen Date: Sun, 23 Aug 2026 21:46:33 +0200 Subject: [PATCH] =?UTF-8?q?Aktualisiere=20Versionsnummer=20auf=203.2.6=20i?= =?UTF-8?q?n=20README.md,=20package.json,=20package-lock.json=20und=20pack?= =?UTF-8?q?age-solution.json.=20Passe=20Tests=20an,=20um=20die=20neuen=20V?= =?UTF-8?q?ersionen=20zu=20validieren=20und=20=C3=A4ndere=20den=20HTTP-Hea?= =?UTF-8?q?der=20in=20PortalSettingsDataService=20f=C3=BCr=20die=20Speiche?= =?UTF-8?q?rung=20von=20Root-Web-Eigenschaften.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- ToDo.md | 4 ++-- config/package-solution.json | 2 +- package-lock.json | 2 +- package.json | 2 +- src/services/PortalSettingsDataService.ts | 4 +++- tests/validate-static-assets.js | 11 +++++++++-- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e7b4b1d..3ced42f 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ PortalSettings V3 ist ein providerbasiertes SPFx-WebPart für SharePoint Server | Eigenschaft | Wert | |---|---| -| Version | 3.2.5 | +| Version | 3.2.6 | | SharePoint Framework | 1.4.1 | | Build-Node | 8.17.0 | | npm | 6.x | @@ -171,7 +171,7 @@ sharepoint/solution/portal-settings.sppkg ## 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. 3. Die Seite mit dem PnP-PowerShell-Skript erzeugen beziehungsweise reparieren: diff --git a/ToDo.md b/ToDo.md index 34cc7fb..85a4213 100644 --- a/ToDo.md +++ b/ToDo.md @@ -2,7 +2,7 @@ Stand: 21.07.2026 Branch: `dev-3.0` -Zielversion: 3.2.5 +Zielversion: 3.2.6 ## Architektur @@ -79,7 +79,7 @@ Zielversion: 3.2.5 - [ ] Per PnP-Skript provisionierte `PortalSettings.aspx` und enthaltenes WebPart prüfen. - [ ] MegaMenu-Termsets laden und 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. - [ ] Bedienung mit Tastatur, 200-Prozent-Zoom und Windows-Hochkontrast prüfen. - [ ] Alte V2-Seite nach erfolgreicher Parallelabnahme archivieren oder entfernen. diff --git a/config/package-solution.json b/config/package-solution.json index 77534e5..f664317 100644 --- a/config/package-solution.json +++ b/config/package-solution.json @@ -3,7 +3,7 @@ "solution": { "name": "portal-settings-client-side-solution", "id": "1c98e32d-bb7b-43b7-9625-074d6e4ea286", - "version": "3.2.5.0", + "version": "3.2.6.0", "includeClientSideAssets": true, "skipFeatureDeployment": false }, diff --git a/package-lock.json b/package-lock.json index 7f8f6be..8e32c35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "portal-settings", - "version": "3.2.5", + "version": "3.2.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 54d30e3..adb3f04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "portal-settings", - "version": "3.2.5", + "version": "3.2.6", "private": true, "main": "lib/index.js", "engines": { diff --git a/src/services/PortalSettingsDataService.ts b/src/services/PortalSettingsDataService.ts index 3c8a751..d1b6ee7 100644 --- a/src/services/PortalSettingsDataService.ts +++ b/src/services/PortalSettingsDataService.ts @@ -302,7 +302,9 @@ export class PortalSettingsDataService { const body: any = { '__metadata': { 'type': 'SP.PropertyValues' } }; body[this.encodePropertyName(key)] = value; 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 => this.ensureOk(response, 'Der Site-Collection-Standard konnte nicht gespeichert werden.')); } diff --git a/tests/validate-static-assets.js b/tests/validate-static-assets.js index c4e6465..c42ba25 100644 --- a/tests/validate-static-assets.js +++ b/tests/validate-static-assets.js @@ -21,9 +21,13 @@ var sourceFiles = [ 'src/ui/PortalSettingsApp.ts' ].map(read).join('\n'); 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(solution.version === '3.2.5.0', 'Solution-Version ist nicht 3.2.5.0.'); +assert(packageJson.version === '3.2.6', 'Package-Version ist nicht 3.2.6.'); +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(!!config.bundles['portal-settings-web-part'], 'WebPart-Bundle fehlt.'); 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.'); assert(dataService.indexOf('body.Sequence = provider.storage.action.sequence') >= 0, '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) { assert(styles.indexOf('[theme: ' + slot + ', default:') >= 0, 'Themeslot fehlt: ' + slot); });