Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 1x 1x 1x 15x 14x 14x 14x 14x 14x 14x 14x 14x 1x 14x 14x 14x 14x | /**
* Copyright (c) Siemens 2016 - 2025
* SPDX-License-Identifier: MIT
*/
import { inject, Injectable } from '@angular/core';
import {
createModalConfig,
ModalDependencyInjectionOptions,
SiModalService
} from '@siemens/element-ng/modal';
import { Observable, Subscriber, Subscription, switchMap, take } from 'rxjs';
import { ActionDialog, ActionDialogReturnType } from './si-action-dialog.types';
import { SiAlertDialogComponent } from './si-alert-dialog/si-alert-dialog.component';
import { SiConfirmationDialogComponent } from './si-confirmation-dialog/si-confirmation-dialog.component';
import { SiDeleteConfirmationDialogComponent } from './si-delete-confirmation-dialog/si-delete-confirmation-dialog.component';
import { SiEditDiscardDialogComponent } from './si-edit-discard-dialog/si-edit-discard-dialog.component';
const ACTION_DIALOG_COMPONENT: Record<ActionDialog['type'], new (...args: any[]) => any> = {
'alert': SiAlertDialogComponent,
'confirmation': SiConfirmationDialogComponent,
'delete-confirm': SiDeleteConfirmationDialogComponent,
'edit-discard': SiEditDiscardDialogComponent
};
const ACTION_DIALOG_DEFAULT_CLOSE_VALUE: Record<ActionDialog['type'], string> = {
'alert': 'confirm',
'confirmation': 'decline',
'delete-confirm': 'cancel',
'edit-discard': 'cancel'
};
/**
* The service provides convenient methods to show common modal dialogs.
* All return an observable, which emit the dialog results. After emitting,
* the observables complete. Therefore, clients do not need to unsubscribe.
*/
@Injectable({ providedIn: 'root' })
export class SiActionDialogService {
private modalService = inject(SiModalService);
/**
* Shows an action dialog
* @param dialog - The dialog configuration
* @param diOptions - Optional DI configuration.
* @returns Observable for the result of the dialog. Need to `subscribe()` to show the dialog
*/
showActionDialog<T extends ActionDialog>(
dialog: T,
diOptions?: ModalDependencyInjectionOptions
): Observable<ActionDialogReturnType<T>> {
return new Observable<ActionDialogReturnType<T>>(subscriber => {
const { type, delayDismiss, ...inputs } = dialog;
const config = createModalConfig(inputs);
config.keyboard = true;
config.messageInsteadOfAutoHide = !!delayDismiss;
Object.assign(config, diOptions);
const modalRef = this.modalService.show(
ACTION_DIALOG_COMPONENT[type],
config,
ACTION_DIALOG_DEFAULT_CLOSE_VALUE[type] as ActionDialogReturnType<T>
);
let subscription: Subscription | undefined;
if (delayDismiss) {
// `any`because TS cannot infer types correctly
subscription = modalRef.message
.pipe(take(1), switchMap(delayDismiss as any))
.subscribe(modalRef.hide);
}
// ModalRef always allows emitting undefined. But we know that we don't emit undefined here, so do typecast.
modalRef.hidden.subscribe(subscriber as Subscriber<ActionDialogReturnType<T> | undefined>);
return () => {
subscription?.unsubscribe();
modalRef.detach();
};
});
}
}
|