/** * Note builder functions for SequenceDiagram * @module Mermaid/builders/SequenceDiagram/functions/getNotes */ import { DiagramStore } from '../../core/DiagramStore'; import { sanitizeLabel } from '../../core/sanitize'; import type { NoteBuilder, NoteAction, NoteSideTarget, NoteOverTarget } from '../types'; /** * Create a single note action */ function createNoteAction( store: DiagramStore, position: string, ): NoteAction { return { msg(text: string) { store.add(`Note ${position}: ${sanitizeLabel(text)}`); }, }; } /** * Create note targets for left/right positions */ function createNoteSideTarget
( store: DiagramStore, position: 'left' | 'right', participants: readonly P[], ): NoteSideTarget
{ const target = {} as NoteSideTarget
; participants.forEach((p) => { target[p] = createNoteAction(store, `${position} of ${p}`); }); return target; } /** * Create note targets for "over" position (can span multiple participants) */ function createNoteOverTarget
( store: DiagramStore, participants: readonly P[], ): NoteOverTarget
{ const target = {} as NoteOverTarget
;
participants.forEach((first) => {
// Create object with msg for single participant note
const obj = {
msg(text: string) {
store.add(`Note over ${first}: ${sanitizeLabel(text)}`);
},
} as NoteAction & { [K in P]: NoteAction };
// Add targets for spanning to other participants
participants.forEach((second) => {
if (first !== second) {
(obj as Record (
store: DiagramStore,
participants: readonly P[],
): NoteBuilder {
return {
leftOf: createNoteSideTarget(store, 'left', participants),
rightOf: createNoteSideTarget(store, 'right', participants),
over: createNoteOverTarget(store, participants),
};
}