import { Component, ElementRef, afterNextRender, inject, input, viewChild } from '@angular/core'; import { I18nService } from '@core/i18n.service'; import { DialogsService, type ConfirmRequest } from '@core/dialogs.service'; import { cycleFocus } from '@core/focus-cycle'; import { FocusService } from '@core/focus.service'; @Component({ selector: 'app-confirm-dialog', template: `
`, }) export class ConfirmDialog { readonly i18n = inject(I18nService); readonly request = input.required(); private readonly confirmBtn = viewChild.required>('confirmBtn'); private readonly dialogs = inject(DialogsService); private readonly focus = inject(FocusService); constructor() { afterNextRender(() => this.confirmBtn().nativeElement.focus()); } /** Esc cancels (and stops here — see PromptDialog); Tab stays inside. */ onKeydown(event: KeyboardEvent): void { if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); this.cancel(); } else { cycleFocus(event.currentTarget as Element, event); } } submit(): void { const req = this.request(); this.close(); req.onConfirm(); } cancel(): void { this.close(); } private close(): void { this.dialogs.confirm.set(null); this.focus.bump(); } }