import { Component, ElementRef, afterNextRender, computed, inject, input, viewChild, } from '@angular/core'; import { NgIcon } from '@ng-icons/core'; import { I18nService } from '@core/i18n.service'; import { DialogsService, type OverwriteChoice, type OverwriteRequest } from '@core/dialogs.service'; import { FocusService } from '@core/focus.service'; @Component({ selector: 'app-overwrite-dialog', imports: [NgIcon], template: `

{{ isDir() ? i18n.t('dialogs.mergeFolder') : i18n.t('dialogs.replace') }} "{{ request().srcEntry.name }}"?

@if (request().total > 1) { {{ i18n.t('dialogs.ofTotal', { index: request().index, total: request().total }) }} }

@if (isDir()) { {{ i18n.t('dialogs.overwriteDirBody') }} } @else { {{ i18n.t('dialogs.overwriteFileBody') }} }

@for (side of comparison(); track side.label) {
{{ i18n.t('dialogs.' + side.label) }} @if (side.newer) { {{ i18n.t('dialogs.newer') }} }
{{ isDir() ? '—' : i18n.size(side.entry.size) }}
{{ i18n.date(side.entry.mtime) }}
}
@if (request().total > 1) {
}
`, }) export class OverwriteDialog { readonly i18n = inject(I18nService); readonly request = input.required(); private readonly dialogs = inject(DialogsService); private readonly focus = inject(FocusService); private readonly primaryBtn = viewChild.required>('primaryBtn'); constructor() { afterNextRender(() => this.primaryBtn().nativeElement.focus()); } readonly isDir = computed(() => this.request().srcEntry.type === 'dir'); readonly comparison = computed(() => { const { srcEntry, dstEntry } = this.request(); return [ { label: 'source', entry: srcEntry, newer: srcEntry.mtime > dstEntry.mtime }, { label: 'destination', entry: dstEntry, newer: dstEntry.mtime > srcEntry.mtime }, ]; }); pick(choice: OverwriteChoice): void { const req = this.request(); this.dialogs.overwrite.set(null); this.focus.bump(); req.resolve(choice); } }