Aktualisiere Versionsnummer auf 3.0.2 in README.md, package.json, package-lock.json und package-solution.json. Füge neue Eigenschaften in IMegaMenuSettings hinzu und verbessere die Logik zur Handhabung von CustomBranding. Aktualisiere Tests zur Validierung der Änderungen.

This commit is contained in:
Torsten Brendgen
2026-08-18 14:53:03 +02:00
parent ff12b9c127
commit 64a157f7a8
12 changed files with 49 additions and 16 deletions
+28 -1
View File
@@ -1,6 +1,12 @@
import { ISettingsProvider } from '../core/ProviderContracts';
export interface IMegaMenuSettings {
schemaVersion: number;
portalSettings: {
providerKey: string;
contractVersion: number;
minimumPortalSettingsVersion: string;
};
termSetId: string;
termSetName: string;
cacheMinutes: number;
@@ -21,7 +27,16 @@ export const MegaMenuSettingsProvider: ISettingsProvider<IMegaMenuSettings> = {
'c0abbffb-355d-4d4e-bd38-9e15fb811506',
'abc3361f-bb2d-491f-aba3-cd51c19a299b'
],
storage: { kind: 'siteUserCustomAction' },
storage: {
kind: 'siteUserCustomAction',
action: {
name: 'MegaMenu',
title: 'MegaMenu Application Customizer',
description: 'MSFT-Custom-Solution:MegaMenu',
location: 'ClientSideExtension.ApplicationCustomizer',
sequence: 100
}
},
sections: [
{
key: 'navigation',
@@ -89,6 +104,12 @@ export const MegaMenuSettingsProvider: ISettingsProvider<IMegaMenuSettings> = {
}
],
createDefault: (): IMegaMenuSettings => ({
schemaVersion: 1,
portalSettings: {
providerKey: 'megamenu',
contractVersion: 1,
minimumPortalSettingsVersion: '3.0.0'
},
termSetId: '', termSetName: '', cacheMinutes: 15, cacheVersion: '1', menuMode: 'megaMenu', debug: false
}),
normalize: (value: any): IMegaMenuSettings => { // tslint:disable-line:no-any
@@ -96,6 +117,12 @@ export const MegaMenuSettingsProvider: ISettingsProvider<IMegaMenuSettings> = {
const minutes: number = Number(source.cacheMinutes);
const result: any = {}; // tslint:disable-line:no-any
Object.keys(source).forEach((key: string): void => { result[key] = source[key]; });
result.schemaVersion = 1;
result.portalSettings = {
providerKey: 'megamenu',
contractVersion: 1,
minimumPortalSettingsVersion: '3.0.0'
};
result.termSetId = typeof source.termSetId === 'string' ? source.termSetId.trim() : '';
result.termSetName = typeof source.termSetName === 'string' ? source.termSetName.trim() : '';
result.cacheMinutes = isFinite(minutes) ? Math.min(Math.max(Math.floor(minutes), 1), 1440) : 15;
+1 -1
View File
@@ -267,7 +267,7 @@ export class PortalSettingsDataService {
return this.context.spHttpClient.post(this.siteUrl + '/_api/site/UserCustomActions', SPHttpClient.configurations.v1, {
headers: this.writeHeaders(), body: JSON.stringify(body)
}).then((response: SPHttpClientResponse): Promise<any> => this.ensureJson(response,
'CustomBranding konnte nicht für die Site Collection registriert werden.'))
provider.displayName + ' konnte nicht für die Site Collection registriert werden.'))
.then((payload: any): IUserCustomActionInfo => {
const source: any = payload.d || payload;
return {
+5 -5
View File
@@ -125,7 +125,7 @@ export class PortalSettingsApp {
if (!item.registered) {
const registrationNotice: HTMLElement = createElement('div', 'ps3-status ps3-status-warning');
registrationNotice.setAttribute('role', 'status');
registrationNotice.textContent = 'CustomBranding ist noch nicht zentral registriert. Beim ersten Speichern legt PortalSettings die Site-Collection-Action an. Das CustomBranding-Paket muss zuvor im App Catalog bereitgestellt sein.';
registrationNotice.textContent = item.provider.displayName + ' ist noch nicht zentral registriert. Beim ersten Speichern legt PortalSettings die Site-Collection-Action an. Das zugehörige SPFx-Paket muss zuvor im App Catalog bereitgestellt sein.';
this.contentHost.appendChild(registrationNotice);
}
@@ -140,7 +140,7 @@ export class PortalSettingsApp {
const reset: HTMLButtonElement = createElement('button', 'ps3-button ps3-button-secondary', 'Änderungen verwerfen') as HTMLButtonElement;
reset.type = 'button'; reset.addEventListener('click', (): void => this.resetCurrent());
this.saveButton = createElement('button', 'ps3-button ps3-button-primary',
item.registered ? 'Konfiguration speichern' : 'CustomBranding aktivieren') as HTMLButtonElement;
item.registered ? 'Konfiguration speichern' : item.provider.displayName + ' aktivieren') as HTMLButtonElement;
this.saveButton.type = 'button'; this.saveButton.addEventListener('click', (): void => this.saveCurrent());
actions.appendChild(reset); actions.appendChild(this.saveButton); this.contentHost.appendChild(actions);
this.updateSaveState();
@@ -152,7 +152,7 @@ export class PortalSettingsApp {
empty.appendChild(createElement('h2', '', failed ? 'PortalSettings konnte nicht geladen werden' : 'Keine aktiven Provider gefunden'));
empty.appendChild(createElement('p', '', failed
? 'Prüfen Sie die Statusmeldung und die REST-Berechtigungen.'
: 'MegaMenu wird über seine zentrale Site-Collection-Action erkannt. CustomBranding kann direkt aktiviert werden; ExpiryIndicator wird über seinen Descriptor oder vorhandene Bindungen erkannt.'));
: 'MegaMenu und CustomBranding können direkt für die Site Collection aktiviert werden; ExpiryIndicator wird über seinen Descriptor oder vorhandene Bindungen erkannt.'));
this.contentHost.appendChild(empty);
}
@@ -164,13 +164,13 @@ export class PortalSettingsApp {
if (errors.length) { this.showStatus(errors.join(' '), 'danger', true); return; }
const question: string = wasRegistered
? 'Konfiguration für „' + item.provider.displayName + '“ speichern?'
: 'CustomBranding zentral für diese Site Collection aktivieren?';
: item.provider.displayName + ' zentral für diese Site Collection aktivieren?';
if (!window.confirm(question)) { return; }
this.saveButton.disabled = true; this.showStatus('Konfiguration wird gespeichert …', 'info', true);
this.dataService.save(item).then((): void => {
this.showStatus(wasRegistered
? 'Die Konfiguration wurde erfolgreich gespeichert.'
: 'CustomBranding wurde zentral aktiviert und gespeichert.', 'success');
: item.provider.displayName + ' wurde zentral aktiviert und gespeichert.', 'success');
this.renderTabs(); this.renderActive();
}).catch((error: Error): void => {
this.showStatus(error.message || String(error), 'danger', true); this.updateSaveState();
@@ -18,7 +18,6 @@ $green: "[theme: green, default: #107c10]";
.ps3-root {
box-sizing: border-box;
width: 100%;
background: $neutral-lighter-alt;
color: $neutral-primary;
font-family: 'Segoe UI', 'Segoe UI Web (West European)', sans-serif;
}