diff --git a/README.md b/README.md index e55a0de..d056c0b 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.2.1 | +| Version | 3.2.2 | | SharePoint Framework | 1.4.1 | | Build-Node | 8.17.0 | | npm | 6.x | | Gulp | lokal 3.9.1 | | 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 @@ -165,12 +165,9 @@ sharepoint/solution/portal-settings.sppkg ## 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. -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: +3. Die Seite mit dem PnP-PowerShell-Skript erzeugen beziehungsweise reparieren: ```powershell .\deployment\Add-PortalSettingsPage.ps1 ` @@ -178,7 +175,7 @@ Optional kann eine Seite per PnP PowerShell erzeugt werden: -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 @@ -191,9 +188,8 @@ V3 liest die vorhandenen Konfigurationsorte direkt weiter: Es ist keine Datenmigration in eine neue Liste erforderlich. Empfohlenes Vorgehen: 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. +2. Das PnP-Skript ausführen, wenn `PortalSettings.aspx` fehlt oder das WebPart noch nicht enthält. +3. Alle Provider laden, Konfigurationen testweise speichern und Root Web sowie Subwebs prüfen. ## Diagnose diff --git a/ToDo.md b/ToDo.md index 9d3dee6..1224a34 100644 --- a/ToDo.md +++ b/ToDo.md @@ -2,7 +2,7 @@ Stand: 21.07.2026 Branch: `dev-3.0` -Zielversion: 3.2.1 +Zielversion: 3.2.2 ## Architektur @@ -53,7 +53,7 @@ Zielversion: 3.2.1 - [x] Versionen auf 3.0.0 angehoben. - [x] Node-Engine auf SPFx-1.4.1-Buildumgebung begrenzt. - [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] Serve-Konfiguration auf WebPart Workbench umgestellt. - [x] Tests laufen vor der Paketierung. @@ -76,7 +76,7 @@ Zielversion: 3.2.1 - [ ] Ship-Paket mit Node.js 8.17.0 erstellen. - [ ] 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. - [ ] CustomBranding laden und schemaerhaltend speichern. - [ ] ExpiryIndicator-Standard speichern. diff --git a/config/package-solution.json b/config/package-solution.json index 01c895d..d4dd341 100644 --- a/config/package-solution.json +++ b/config/package-solution.json @@ -3,22 +3,9 @@ "solution": { "name": "portal-settings-client-side-solution", "id": "1c98e32d-bb7b-43b7-9625-074d6e4ea286", - "version": "3.2.1.0", + "version": "3.2.2.0", "includeClientSideAssets": true, - "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"] - } - } - ] + "skipFeatureDeployment": false }, "paths": { "zippedPackage": "solution/portal-settings.sppkg" diff --git a/package-lock.json b/package-lock.json index 63f46bf..6cb8087 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "portal-settings", - "version": "3.2.1", + "version": "3.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5c98f66..9819b0f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "portal-settings", - "version": "3.2.1", + "version": "3.2.2", "private": true, "main": "lib/index.js", "engines": { diff --git a/tests/validate-static-assets.js b/tests/validate-static-assets.js index 6fc5901..d60014c 100644 --- a/tests/validate-static-assets.js +++ b/tests/validate-static-assets.js @@ -15,9 +15,6 @@ 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', @@ -25,27 +22,13 @@ var sourceFiles = [ ].map(read).join('\n'); var dataService = read('src/services/PortalSettingsDataService.ts'); -assert(packageJson.version === '3.2.1', 'Package-Version ist nicht 3.2.1.'); -assert(solution.version === '3.2.1.0', 'Solution-Version ist nicht 3.2.1.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(packageJson.version === '3.2.2', 'Package-Version ist nicht 3.2.2.'); +assert(solution.version === '3.2.2.0', 'Solution-Version ist nicht 3.2.2.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.'); 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.'); assert(dataService.indexOf('/_api/site/rootweb/UserCustomActions') >= 0 &&