mirror of https://github.com/microsoft/vscode.git
notifications - add and use `withSeverityPrefix` (#251067)
This commit is contained in:
parent
433220e98a
commit
da3bdf1b14
|
@ -3,6 +3,7 @@
|
|||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { localize } from '../../../nls.js';
|
||||
import { IAction } from '../../../base/common/actions.js';
|
||||
import { Event } from '../../../base/common/event.js';
|
||||
import BaseSeverity from '../../../base/common/severity.js';
|
||||
|
@ -472,3 +473,19 @@ export class NoOpProgress implements INotificationProgress {
|
|||
total(value: number): void { }
|
||||
worked(value: number): void { }
|
||||
}
|
||||
|
||||
export function withSeverityPrefix(label: string, severity: Severity): string {
|
||||
|
||||
// Add severity prefix to match WCAG 4.1.3 Status
|
||||
// Messages requirements.
|
||||
|
||||
if (severity === Severity.Error) {
|
||||
return localize('severityPrefix.error', "Error: {0}", label);
|
||||
}
|
||||
|
||||
if (severity === Severity.Warning) {
|
||||
return localize('severityPrefix.warning', "Warning: {0}", label);
|
||||
}
|
||||
|
||||
return localize('severityPrefix.info', "Info: {0}", label);
|
||||
}
|
||||
|
|
|
@ -13,9 +13,10 @@ import { IAccessibilitySignalService, AccessibilitySignal } from '../../../../pl
|
|||
import { ICommandService } from '../../../../platform/commands/common/commands.js';
|
||||
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
|
||||
import { IListService, WorkbenchList } from '../../../../platform/list/browser/listService.js';
|
||||
import { getNotificationFromContext, getSeverityPrefix } from './notificationsCommands.js';
|
||||
import { getNotificationFromContext } from './notificationsCommands.js';
|
||||
import { NotificationFocusedContext } from '../../../common/contextkeys.js';
|
||||
import { INotificationViewItem } from '../../../common/notifications.js';
|
||||
import { withSeverityPrefix } from '../../../../platform/notification/common/notification.js';
|
||||
|
||||
export class NotificationAccessibleView implements IAccessibleViewImplementation {
|
||||
readonly priority = 90;
|
||||
|
@ -56,14 +57,10 @@ export class NotificationAccessibleView implements IAccessibleViewImplementation
|
|||
function getContentForNotification(): string | undefined {
|
||||
const notification = getNotificationFromContext(listService);
|
||||
const message = notification?.message.original.toString();
|
||||
if (!notification) {
|
||||
if (!notification || !message) {
|
||||
return;
|
||||
}
|
||||
// Add severity prefix to match WCAG 4.1.3 Status Messages requirements
|
||||
const severityPrefix = getSeverityPrefix(notification.severity);
|
||||
const messageWithSeverity = `${severityPrefix}${message}`;
|
||||
|
||||
return notification.source ? localize('notification.accessibleViewSrc', '{0} Source: {1}', messageWithSeverity, notification.source) : localize('notification.accessibleView', '{0}', messageWithSeverity);
|
||||
return withSeverityPrefix(notification.source ? localize('notification.accessibleViewSrc', '{0} Source: {1}', message, notification.source) : message, notification.severity);
|
||||
}
|
||||
const content = getContentForNotification();
|
||||
if (!content) {
|
||||
|
|
|
@ -13,7 +13,7 @@ import { localize, localize2 } from '../../../../nls.js';
|
|||
import { IListService, WorkbenchList } from '../../../../platform/list/browser/listService.js';
|
||||
import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js';
|
||||
import { NotificationFocusedContext, NotificationsCenterVisibleContext, NotificationsToastsVisibleContext } from '../../../common/contextkeys.js';
|
||||
import { INotificationService, INotificationSourceFilter, NotificationsFilter, Severity } from '../../../../platform/notification/common/notification.js';
|
||||
import { INotificationService, INotificationSourceFilter, NotificationsFilter } from '../../../../platform/notification/common/notification.js';
|
||||
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
|
||||
import { ActionRunner, IAction, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from '../../../../base/common/actions.js';
|
||||
import { IQuickInputService, IQuickPickItem } from '../../../../platform/quickinput/common/quickInput.js';
|
||||
|
@ -88,16 +88,6 @@ export function getNotificationFromContext(listService: IListService, context?:
|
|||
return undefined;
|
||||
}
|
||||
|
||||
export function getSeverityPrefix(severity: Severity): string {
|
||||
if (severity === Severity.Error) {
|
||||
return localize('severityPrefix.error', "Error: ");
|
||||
} else if (severity === Severity.Warning) {
|
||||
return localize('severityPrefix.warning', "Warning: ");
|
||||
} else {
|
||||
return localize('severityPrefix.info', "Info: ");
|
||||
}
|
||||
}
|
||||
|
||||
export function registerNotificationCommands(center: INotificationsCenterController, toasts: INotificationsToastController, model: NotificationsModel): void {
|
||||
|
||||
// Show Notifications Cneter
|
||||
|
|
|
@ -18,9 +18,10 @@ import { assertReturnsAllDefined } from '../../../../base/common/types.js';
|
|||
import { NotificationFocusedContext } from '../../../common/contextkeys.js';
|
||||
import { Disposable } from '../../../../base/common/lifecycle.js';
|
||||
import { AriaRole } from '../../../../base/browser/ui/aria/aria.js';
|
||||
import { getSeverityPrefix, NotificationActionRunner } from './notificationsCommands.js';
|
||||
import { NotificationActionRunner } from './notificationsCommands.js';
|
||||
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
|
||||
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
|
||||
import { withSeverityPrefix } from '../../../../platform/notification/common/notification.js';
|
||||
|
||||
export interface INotificationsListOptions extends IListOptions<INotificationViewItem> {
|
||||
readonly widgetAriaLabel?: string;
|
||||
|
@ -245,11 +246,13 @@ export class NotificationsList extends Disposable {
|
|||
}
|
||||
|
||||
export class NotificationAccessibilityProvider implements IListAccessibilityProvider<INotificationViewItem> {
|
||||
|
||||
constructor(
|
||||
private readonly _options: INotificationsListOptions,
|
||||
@IKeybindingService private readonly _keybindingService: IKeybindingService,
|
||||
@IConfigurationService private readonly _configurationService: IConfigurationService
|
||||
) { }
|
||||
|
||||
getAriaLabel(element: INotificationViewItem): string {
|
||||
let accessibleViewHint: string | undefined;
|
||||
const keybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView')?.getAriaLabel();
|
||||
|
@ -257,20 +260,17 @@ export class NotificationAccessibilityProvider implements IListAccessibilityProv
|
|||
accessibleViewHint = keybinding ? localize('notificationAccessibleViewHint', "Inspect the response in the accessible view with {0}", keybinding) : localize('notificationAccessibleViewHintNoKb', "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding");
|
||||
}
|
||||
|
||||
// Add severity prefix to match WCAG 4.1.3 Status Messages requirements
|
||||
const severityPrefix = getSeverityPrefix(element.severity);
|
||||
const messageWithSeverity = `${severityPrefix}${element.message.raw}`;
|
||||
|
||||
if (!element.source) {
|
||||
return accessibleViewHint ? localize('notificationAriaLabelHint', "{0}, notification, {1}", messageWithSeverity, accessibleViewHint) : localize('notificationAriaLabel', "{0}, notification", messageWithSeverity);
|
||||
return withSeverityPrefix(accessibleViewHint ? localize('notificationAriaLabelHint', "{0}, notification, {1}", element.message.raw, accessibleViewHint) : localize('notificationAriaLabel', "{0}, notification", element.message.raw), element.severity);
|
||||
}
|
||||
|
||||
return accessibleViewHint ? localize('notificationWithSourceAriaLabelHint', "{0}, source: {1}, notification, {2}", messageWithSeverity, element.source, accessibleViewHint) : localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", messageWithSeverity, element.source);
|
||||
return withSeverityPrefix(accessibleViewHint ? localize('notificationWithSourceAriaLabelHint', "{0}, source: {1}, notification, {2}", element.message.raw, element.source, accessibleViewHint) : localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", element.message.raw, element.source), element.severity);
|
||||
}
|
||||
|
||||
getWidgetAriaLabel(): string {
|
||||
return this._options.widgetAriaLabel ?? localize('notificationsList', "Notifications List");
|
||||
}
|
||||
|
||||
getRole(): AriaRole {
|
||||
return 'dialog'; // https://github.com/microsoft/vscode/issues/82728
|
||||
}
|
||||
|
|
|
@ -16,9 +16,9 @@ import { NOTIFICATIONS_TOAST_BORDER, NOTIFICATIONS_BACKGROUND } from '../../../c
|
|||
import { IThemeService, Themable } from '../../../../platform/theme/common/themeService.js';
|
||||
import { widgetShadow } from '../../../../platform/theme/common/colorRegistry.js';
|
||||
import { IEditorGroupsService } from '../../../services/editor/common/editorGroupsService.js';
|
||||
import { getSeverityPrefix, INotificationsToastController } from './notificationsCommands.js';
|
||||
import { INotificationsToastController } from './notificationsCommands.js';
|
||||
import { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
|
||||
import { Severity, NotificationsFilter, NotificationPriority } from '../../../../platform/notification/common/notification.js';
|
||||
import { Severity, NotificationsFilter, NotificationPriority, withSeverityPrefix } from '../../../../platform/notification/common/notification.js';
|
||||
import { ScrollbarVisibility } from '../../../../base/common/scrollable.js';
|
||||
import { ILifecycleService, LifecyclePhase } from '../../../services/lifecycle/common/lifecycle.js';
|
||||
import { IHostService } from '../../../services/host/browser/host.js';
|
||||
|
@ -200,14 +200,11 @@ export class NotificationsToasts extends Themable implements INotificationsToast
|
|||
const notificationList = this.instantiationService.createInstance(NotificationsList, notificationToast, {
|
||||
verticalScrollMode: ScrollbarVisibility.Hidden,
|
||||
widgetAriaLabel: (() => {
|
||||
// Add severity prefix to match WCAG 4.1.3 Status Messages requirements
|
||||
const severityPrefix = getSeverityPrefix(item.severity);
|
||||
const messageWithSeverity = `${severityPrefix}${item.message.raw}`;
|
||||
|
||||
if (!item.source) {
|
||||
return localize('notificationAriaLabel', "{0}, notification", messageWithSeverity);
|
||||
return withSeverityPrefix(localize('notificationAriaLabel', "{0}, notification", item.message.raw), item.severity);
|
||||
}
|
||||
return localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", messageWithSeverity, item.source);
|
||||
|
||||
return withSeverityPrefix(localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", item.message.raw, item.source), item.severity);
|
||||
})()
|
||||
});
|
||||
itemDisposables.add(notificationList);
|
||||
|
|
|
@ -24,7 +24,6 @@ export class NotebookAccessibleView implements IAccessibleViewImplementation {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
export function getAccessibleOutputProvider(editorService: IEditorService) {
|
||||
const activePane = editorService.activeEditorPane;
|
||||
const notebookEditor = getNotebookEditorFromEditorPane(activePane);
|
||||
|
|
Loading…
Reference in New Issue