From eb1ad7ba1ea582341671197d057e2b59074976bd Mon Sep 17 00:00:00 2001 From: Torsten Brendgen Date: Tue, 18 Aug 2026 21:06:28 +0200 Subject: [PATCH] =?UTF-8?q?Aktualisiere=20Versionsnummer=20auf=203.2.0=20i?= =?UTF-8?q?n=20README.md,=20package.json,=20package-lock.json=20und=20pack?= =?UTF-8?q?age-solution.json.=20F=C3=BCge=20Provisionierungsfeature=20f?= =?UTF-8?q?=C3=BCr=20moderne=20PortalSettings.aspx=20hinzu=20und=20integri?= =?UTF-8?q?ere=20zugeh=C3=B6rige=20Tests.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 ++++++++++------------- ToDo.md | 7 ++++--- config/package-solution.json | 17 +++++++++++++++-- deployment/Add-PortalSettingsPage.ps1 | 2 +- package-lock.json | 2 +- package.json | 2 +- sharepoint/assets/PortalSettings.aspx | 16 ++++++++++++++++ sharepoint/assets/elements.xml | 14 ++++++++++++++ sharepoint/assets/upgrade-actions.xml | 3 +++ tests/validate-static-assets.js | 23 ++++++++++++++++++++--- 10 files changed, 85 insertions(+), 24 deletions(-) create mode 100644 sharepoint/assets/PortalSettings.aspx create mode 100644 sharepoint/assets/elements.xml create mode 100644 sharepoint/assets/upgrade-actions.xml diff --git a/README.md b/README.md index 336088a..ae94563 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ PortalSettings V3 ist ein providerbasiertes SPFx-WebPart für SharePoint Server | Eigenschaft | Wert | |---|---| -| Version | 3.1.0 | +| Version | 3.2.0 | | SharePoint Framework | 1.4.1 | | Build-Node | 8.17.0 | | npm | 6.x | | Gulp | lokal 3.9.1 | | Komponente | Client-Side WebPart | -Die frühere provisionierte `PortalSettings.aspx` und der leere Application Customizer wurden entfernt. Die Oberfläche wird vollständig vom WebPart erzeugt und verwendet kein `innerHTML`. +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. ## Unterstützte Solutions @@ -164,22 +164,20 @@ sharepoint/solution/portal-settings.sppkg ## Installation -1. `portal-settings.sppkg` im App Catalog durch Version `3.1.0.0` ersetzen. +1. `portal-settings.sppkg` im App Catalog durch Version `3.2.0.0` ersetzen. 2. Die App im Root Web der gewünschten Site Collection installieren oder aktualisieren. -3. Eine moderne Seite erstellen. -4. Das WebPart **Portal Settings** einmal auf der Seite hinzufügen. -5. Die Seite veröffentlichen und nur für die gewünschte Administratorgruppe verlinken. +3. Die App provisioniert automatisch die veröffentlichte Seite `SitePages/PortalSettings.aspx` mit dem WebPart. +4. Eine bereits vorhandene `PortalSettings.aspx` wird nicht überschrieben. Optional kann eine Seite per PnP PowerShell erzeugt werden: ```powershell .\deployment\Add-PortalSettingsPage.ps1 ` -SiteUrl 'http://clshp001/sites/target' ` - -PageName 'PortalSettingsV3' ` -Publish ``` -Die Standardseite heißt absichtlich `PortalSettingsV3.aspx`, damit die alte V2-Seite während der Abnahme erhalten bleiben kann. +Das Skript bleibt als Reparaturweg erhalten und verwendet standardmäßig ebenfalls `PortalSettings.aspx`. ## Migration von V2 @@ -191,11 +189,10 @@ V3 liest die vorhandenen Konfigurationsorte direkt weiter: Es ist keine Datenmigration in eine neue Liste erforderlich. Empfohlenes Vorgehen: -1. V3-Paket installieren. -2. `PortalSettingsV3.aspx` parallel zur alten Seite bereitstellen. -3. Alle drei Provider laden und Konfigurationen testweise speichern. -4. Root Web und Subwebs prüfen. -5. Erst danach die alte `PortalSettings.aspx` löschen oder archivieren. +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. +3. Falls eine vorhandene Seite das WebPart noch nicht enthält, das PnP-Skript als Reparaturweg ausführen. +4. Alle Provider laden, Konfigurationen testweise speichern und Root Web sowie Subwebs prüfen. ## Diagnose diff --git a/ToDo.md b/ToDo.md index b346713..f38e462 100644 --- a/ToDo.md +++ b/ToDo.md @@ -2,7 +2,7 @@ Stand: 21.07.2026 Branch: `dev-3.0` -Zielversion: 3.1.0 +Zielversion: 3.2.0 ## Architektur @@ -51,7 +51,8 @@ Zielversion: 3.1.0 - [x] Versionen auf 3.0.0 angehoben. - [x] Node-Engine auf SPFx-1.4.1-Buildumgebung begrenzt. -- [x] Alte Feature-, Upgrade-, 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] Altes Gulp-Copy-Task entfernt. - [x] Serve-Konfiguration auf WebPart Workbench umgestellt. - [x] Tests laufen vor der Paketierung. @@ -74,7 +75,7 @@ Zielversion: 3.1.0 - [ ] Ship-Paket mit Node.js 8.17.0 erstellen. - [ ] App im Root Web aktualisieren. -- [ ] Moderne `PortalSettingsV3.aspx` provisionieren. +- [ ] Automatisch provisionierte `PortalSettings.aspx` und enthaltenes WebPart prüfen. - [ ] MegaMenu-Termsets laden und speichern. - [ ] CustomBranding laden und schemaerhaltend speichern. - [ ] ExpiryIndicator-Standard speichern. diff --git a/config/package-solution.json b/config/package-solution.json index a5509dd..167fe7d 100644 --- a/config/package-solution.json +++ b/config/package-solution.json @@ -3,9 +3,22 @@ "solution": { "name": "portal-settings-client-side-solution", "id": "1c98e32d-bb7b-43b7-9625-074d6e4ea286", - "version": "3.1.0.0", + "version": "3.2.0.0", "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": { "zippedPackage": "solution/portal-settings.sppkg" diff --git a/deployment/Add-PortalSettingsPage.ps1 b/deployment/Add-PortalSettingsPage.ps1 index 19089d8..a929311 100644 --- a/deployment/Add-PortalSettingsPage.ps1 +++ b/deployment/Add-PortalSettingsPage.ps1 @@ -2,7 +2,7 @@ param( [Parameter(Mandatory = $true)] [string]$SiteUrl, - [string]$PageName = 'PortalSettingsV3', + [string]$PageName = 'PortalSettings', [switch]$Publish ) diff --git a/package-lock.json b/package-lock.json index 1f0ad71..28827f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "portal-settings", - "version": "3.1.0", + "version": "3.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 23dde93..92ad000 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "portal-settings", - "version": "3.1.0", + "version": "3.2.0", "private": true, "main": "lib/index.js", "engines": { diff --git a/sharepoint/assets/PortalSettings.aspx b/sharepoint/assets/PortalSettings.aspx new file mode 100644 index 0000000..edb5378 --- /dev/null +++ b/sharepoint/assets/PortalSettings.aspx @@ -0,0 +1,16 @@ +<%@ Page language="C#" Inherits="Microsoft.SharePoint.WebControls.ClientSidePage, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> +<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> + + + + + + diff --git a/sharepoint/assets/elements.xml b/sharepoint/assets/elements.xml new file mode 100644 index 0000000..fc0dedd --- /dev/null +++ b/sharepoint/assets/elements.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/sharepoint/assets/upgrade-actions.xml b/sharepoint/assets/upgrade-actions.xml new file mode 100644 index 0000000..400d2a6 --- /dev/null +++ b/sharepoint/assets/upgrade-actions.xml @@ -0,0 +1,3 @@ + + + diff --git a/tests/validate-static-assets.js b/tests/validate-static-assets.js index 5990c5e..611dbec 100644 --- a/tests/validate-static-assets.js +++ b/tests/validate-static-assets.js @@ -15,19 +15,36 @@ var config = json('config/config.json'); var copyAssets = json('config/copy-assets.json'); var manifest = json('src/webparts/portalSettings/PortalSettingsWebPart.manifest.json'); 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 = [ 'src/ui/Dom.ts', 'src/ui/DynamicFormRenderer.ts', 'src/ui/PortalSettingsApp.ts' ].map(read).join('\n'); -assert(packageJson.version === '3.1.0', 'Package-Version ist nicht 3.1.0.'); -assert(solution.version === '3.1.0.0', 'Solution-Version ist nicht 3.1.0.0.'); -assert(!solution.features, 'Alte ASPX-Feature-Assets sind noch registriert.'); +assert(packageJson.version === '3.2.0', 'Package-Version ist nicht 3.2.0.'); +assert(solution.version === '3.2.0.0', 'Solution-Version ist nicht 3.2.0.0.'); +assert(solution.features && solution.features.length === 1, 'Das Seiten-Provisioning-Feature fehlt.'); +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(copyAssets.deployCdnPath === 'temp/deploy', 'Ship-Assets werden nicht nach temp/deploy geschrieben.'); 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(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(sourceFiles.indexOf('innerHTML') < 0, 'UI darf innerHTML nicht verwenden.'); ['themePrimary', 'neutralPrimary', 'neutralLight', 'white'].forEach(function (slot) {