@myrmidon/gve-core 6.0.1 → 6.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/models.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-base-text.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-api.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/validators/svg-validators.ts","../../../../projects/myrmidon/gve-core/src/lib/services/settings.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-graphviz.service.ts","../../../../projects/myrmidon/gve-core/src/public-api.ts","../../../../projects/myrmidon/gve-core/src/myrmidon-gve-core.ts"],"sourcesContent":["import { MatDialogConfig } from \"@angular/material/dialog\";\r\n\r\n//#region From GVE SNAPSHOT CORE\r\n/**\r\n * A labeled ID. This can be used when a feature is from a closed set,\r\n * and you want to provide localized or human-readable labels for the\r\n * possible values.\r\n */\r\nexport interface LabeledId {\r\n id: string;\r\n label: string;\r\n}\r\n\r\n/**\r\n * A generic tree node.\r\n */\r\nexport interface TreeNode<T> {\r\n label: string;\r\n payload?: T;\r\n parent?: TreeNode<T>;\r\n children?: TreeNode<T>[];\r\n isExpanded?: boolean;\r\n}\r\n\r\n/**\r\n * Generic name=value feature.\r\n */\r\nexport interface Feature {\r\n name: string;\r\n value: string;\r\n setPolicy: FeatureSetPolicy;\r\n}\r\n\r\n/**\r\n * Operation feature set policy.\r\n */\r\nexport enum FeatureSetPolicy {\r\n multiple = 0,\r\n single,\r\n singleFirst,\r\n}\r\n\r\n/**\r\n * Operation feature.\r\n */\r\nexport interface OperationFeature extends Feature {\r\n isNegated?: boolean;\r\n isGlobal?: boolean;\r\n isShortLived?: boolean;\r\n}\r\n\r\n/**\r\n * Source about a text variant. This is typically used when\r\n * variants come from different witnesses.\r\n */\r\nexport interface OperationSource {\r\n id: string;\r\n type: string;\r\n rank?: number;\r\n note?: string;\r\n}\r\n\r\n/**\r\n * Generic metadata about a text variant generation operation.\r\n */\r\nexport interface OperationMetadata {\r\n type: OperationType;\r\n id: string;\r\n rank?: number;\r\n groupId?: string;\r\n features?: OperationFeature[];\r\n sources?: OperationSource[];\r\n}\r\n\r\n/**\r\n * Type of a text operation.\r\n */\r\nexport enum OperationType {\r\n replace = 0,\r\n delete,\r\n addBefore,\r\n addAfter,\r\n moveBefore,\r\n moveAfter,\r\n swap,\r\n annotate,\r\n}\r\n\r\n/**\r\n * Metadata of a char-based chain operation.\r\n */\r\nexport interface CharChainOperation extends OperationMetadata {\r\n at: number;\r\n atAsIndex?: boolean;\r\n // to is for move and swap only\r\n to?: number;\r\n toAsIndex?: boolean;\r\n inputTag?: string;\r\n outputTag?: string;\r\n run: number;\r\n toRun?: number;\r\n value?: string;\r\n // from DTO\r\n noTraceFeautures?: boolean;\r\n dsl?: string;\r\n}\r\n\r\n/**\r\n * A single character node in an operation execution result.\r\n */\r\nexport interface CharNode {\r\n id: number;\r\n index: number;\r\n label: string;\r\n data: string;\r\n sourceTag?: string;\r\n features?: Feature[];\r\n}\r\n\r\n/**\r\n * A text snapshot, including the base text and the operations that\r\n * have been applied to it.\r\n */\r\nexport interface Snapshot {\r\n text: string | CharNode[];\r\n operations: CharChainOperation[];\r\n}\r\n//#endregion\r\n\r\n/**\r\n * API call result wrapper.\r\n */\r\nexport interface ResultWrapper<T> {\r\n result?: T;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * PayloadMatDialogConfig is a MatDialogConfig with a payload, used\r\n * to pass data of type T to a dialog.\r\n */\r\nexport interface PayloadMatDialogConfig<T> extends MatDialogConfig {\r\n payload?: T;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { ColorToContrastPipe } from '@myrmidon/ngx-tools';\r\n\r\n/**\r\n * A single character from a base text.\r\n */\r\nexport interface BaseTextChar {\r\n id: number;\r\n value: string;\r\n label: string;\r\n color: string;\r\n oldColor?: string;\r\n borderColor: string;\r\n oldBorderColor?: string;\r\n emSize: number;\r\n}\r\n\r\n/**\r\n * Event emitted by the base text character component when a character\r\n * is clicked.\r\n */\r\nexport interface BaseTextCharEvent {\r\n char: BaseTextChar;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-char`\r\n *\r\n * A component that displays a single character from a base text.\r\n * Used by `gve-base-text-view`.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-char',\r\n imports: [MatRippleModule, ColorToContrastPipe],\r\n templateUrl: './base-text-char.component.html',\r\n styleUrl: './base-text-char.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BaseTextCharComponent {\r\n /**\r\n * The character to display.\r\n */\r\n public readonly char = input<BaseTextChar | undefined>();\r\n\r\n /**\r\n * Emitted when the character is clicked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n public readonly defaultColor = '#D8D8D8';\r\n public readonly defaultBorderColor = '#D8D8D8';\r\n public readonly defaultEmSize = 1.5;\r\n\r\n public onCharClick(event: MouseEvent): void {\r\n this.charPick.emit({ char: this.char()!, event });\r\n }\r\n}\r\n","@if (char()) {\r\n<div matRipple id=\"container\" (click)=\"onCharClick($event)\">\r\n <div\r\n id=\"c-label\"\r\n [style.fontSize]=\"char()!.emSize + 'em'\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n >\r\n {{ char()!.label }}\r\n </div>\r\n <div\r\n id=\"c-id\"\r\n [style.fontSize]=\"char()!.emSize / 2 + 'em'\"\r\n [style.color]=\"char()!.color | colorToContrast\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n [style.backgroundColor]=\"char()!.color\"\r\n >\r\n {{ char()!.id }}\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { debounceTime, distinctUntilChanged, Subject } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Clipboard } from '@angular/cdk/clipboard';\r\n\r\nimport {\r\n BaseTextChar,\r\n BaseTextCharComponent,\r\n BaseTextCharEvent,\r\n} from '../base-text-char/base-text-char.component';\r\nimport { CharNode } from '../../models';\r\n\r\n/**\r\n * A range in the base text.\r\n */\r\nexport interface BaseTextRange {\r\n at: number;\r\n run: number;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-view`\r\n *\r\n * A component to display a selectable base text. Its input is either a string or an\r\n * array of `CharNode`'s. The base text is the starting text in a set of transformations,\r\n * and is represented as a sequence of characters with optional metadata.\r\n * This component allows users to view and select characters or ranges of characters.\r\n * Used by the chain result view component and the base text editor component.\r\n *\r\n * - ▶️ `defaultColor` (`string`): the default color for the text.\r\n * - ▶️ `colorCallback` (callback): an optional callback to get the color of a\r\n * character node.\r\n * - ▶️ `defaultBorderColor` (`string`): the default border color for the text.\r\n * - ▶️ `borderColorCallback` (callback): an optional callback to get the border color\r\n * of a character node.\r\n * - ▶️ `selectionColor` (`string`): the color for the selected text.\r\n * - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next\r\n * to each line.\r\n * - ▶️ `text` (`string` | `CharNode[]`): the text to display.\r\n * - 🔥 `charPick` (`BaseTextCharEvent`): emitted when a character is picked.\r\n * - 🔥 `rangePick` (`BaseTextRange`): emitted when a range is picked.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-view',\r\n imports: [\r\n FormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n BaseTextCharComponent,\r\n ],\r\n templateUrl: './base-text-view.component.html',\r\n styleUrl: './base-text-view.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BaseTextViewComponent implements OnInit {\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private readonly _clipboard = inject(Clipboard);\r\n private readonly _snackBar = inject(MatSnackBar);\r\n private readonly _searchSubject = new Subject<string>();\r\n private _lastSelectedPosition?: number;\r\n private _selectionAnchor?: number;\r\n\r\n /**\r\n * The default color for the text.\r\n */\r\n public readonly defaultColor = input('#DBDBDB');\r\n\r\n /**\r\n * The default border color for the text.\r\n */\r\n public readonly defaultBorderColor = input('#DBDBDB');\r\n\r\n /**\r\n * The color for the selected text.\r\n */\r\n public readonly selectionColor = input('#3E92CC');\r\n\r\n /**\r\n * The color for search match highlights.\r\n */\r\n public readonly searchHighlightColor = input('#FFD54F');\r\n\r\n /**\r\n * True if line numbers should be displayed next to each line.\r\n */\r\n public readonly hasLineNumber = input(false);\r\n\r\n /**\r\n * The search query entered in the toolbar.\r\n */\r\n public readonly searchQuery = signal('');\r\n\r\n /**\r\n * The positions of search matches (start and length pairs).\r\n */\r\n private readonly searchMatches = signal<{ start: number; length: number }[]>(\r\n [],\r\n );\r\n\r\n /**\r\n * The text to display.\r\n */\r\n public readonly text = input<CharNode[]>([]);\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly colorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly borderColorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when a character is picked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n /**\r\n * Emitted when a range is picked. This is preceded by a character pick event.\r\n * The range is defined by the starting character and the number of characters.\r\n * The range is inclusive.\r\n */\r\n public readonly rangePick = output<BaseTextRange>();\r\n\r\n /**\r\n * The base characters organized by lines, computed from text input.\r\n */\r\n private readonly baseLines = computed(() => {\r\n return this.buildLines(\r\n this.text(),\r\n this.colorCallback(),\r\n this.borderColorCallback(),\r\n );\r\n });\r\n\r\n /**\r\n * Signal for tracking selected range state.\r\n */\r\n private readonly selectedRange = signal<{\r\n start: number;\r\n end: number;\r\n } | null>(null);\r\n\r\n /**\r\n * The lines with selection or search highlight state applied.\r\n * Search highlights take priority over selection when present.\r\n */\r\n public readonly lines = computed(() => {\r\n const base = this.baseLines();\r\n const range = this.selectedRange();\r\n const matches = this.searchMatches();\r\n\r\n // If there are search matches, highlight them instead of selection\r\n if (matches.length > 0) {\r\n let position = 0;\r\n return base.map((line) =>\r\n line.map((char) => {\r\n const currentPos = position++;\r\n const isMatch = matches.some(\r\n (m) => currentPos >= m.start && currentPos < m.start + m.length,\r\n );\r\n if (isMatch) {\r\n return {\r\n ...char,\r\n oldColor: char.oldColor || char.color,\r\n oldBorderColor: char.oldBorderColor || char.borderColor,\r\n color: this.searchHighlightColor(),\r\n borderColor: this.searchHighlightColor(),\r\n };\r\n }\r\n return char;\r\n }),\r\n );\r\n }\r\n\r\n // Otherwise, apply selection highlight if present\r\n if (!range) {\r\n return base;\r\n }\r\n\r\n const { start, end } = range;\r\n let position = 0;\r\n\r\n return base.map((line) =>\r\n line.map((char) => {\r\n const currentPos = position++;\r\n if (currentPos >= start && currentPos <= end) {\r\n return {\r\n ...char,\r\n oldColor: char.oldColor || char.color,\r\n oldBorderColor: char.oldBorderColor || char.borderColor,\r\n color: this.selectionColor(),\r\n borderColor: this.selectionColor(),\r\n };\r\n }\r\n return char;\r\n }),\r\n );\r\n });\r\n\r\n constructor() {\r\n // reset selection when text changes\r\n effect(() => {\r\n this.text();\r\n this._lastSelectedPosition = undefined;\r\n this._selectionAnchor = undefined;\r\n this.selectedRange.set(null);\r\n this.clearSearch();\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // Setup debounced search\r\n this._searchSubject\r\n .pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this._destroyRef),\r\n )\r\n .subscribe((query) => {\r\n this.performSearch(query);\r\n });\r\n }\r\n\r\n private buildLines(\r\n text: CharNode[],\r\n colorCallback?: (node: CharNode) => string | null,\r\n borderColorCallback?: (node: CharNode) => string | null,\r\n ): BaseTextChar[][] {\r\n if (!text || text.length === 0) {\r\n return [];\r\n }\r\n\r\n const newLines: BaseTextChar[][] = [];\r\n newLines.push([]);\r\n\r\n const nodes = text as CharNode[];\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const char: BaseTextChar = {\r\n id: nodes[i].id,\r\n value: nodes[i].data,\r\n label: nodes[i].label,\r\n color: colorCallback\r\n ? colorCallback(nodes[i]) || this.defaultColor()\r\n : this.defaultColor(),\r\n borderColor: borderColorCallback\r\n ? borderColorCallback(nodes[i]) || this.defaultBorderColor()\r\n : this.defaultBorderColor(),\r\n emSize: 1.5,\r\n };\r\n char.oldColor = char.color;\r\n char.oldBorderColor = char.borderColor;\r\n\r\n newLines[newLines.length - 1].push(char);\r\n\r\n if (char.value === '\\n') {\r\n newLines.push([]);\r\n }\r\n }\r\n\r\n return newLines;\r\n }\r\n\r\n public onCharPick(event: BaseTextCharEvent): void {\r\n // guard against null/undefined event.char\r\n if (!event?.char) {\r\n return;\r\n }\r\n\r\n // find the position of the clicked character in the flat array\r\n const clickedPosition = this.findCharPosition(event.char.id);\r\n if (clickedPosition === -1) {\r\n return; // character not found\r\n }\r\n\r\n // calculate selection state\r\n const isRangeSelection =\r\n this._lastSelectedPosition !== undefined &&\r\n this._lastSelectedPosition !== clickedPosition &&\r\n event.event?.ctrlKey;\r\n\r\n let rangeToEmit: BaseTextRange;\r\n\r\n if (isRangeSelection && this._lastSelectedPosition !== undefined) {\r\n // range selection: use positions, not IDs\r\n const minPos = Math.min(this._lastSelectedPosition, clickedPosition);\r\n const maxPos = Math.max(this._lastSelectedPosition, clickedPosition);\r\n\r\n // update selection range\r\n this.selectedRange.set({ start: minPos, end: maxPos });\r\n\r\n // emit range based on the first character's ID at minPos and the count\r\n const firstCharId = this.getCharIdAtPosition(minPos);\r\n rangeToEmit = { at: firstCharId, run: maxPos - minPos + 1 };\r\n } else {\r\n // single character selection\r\n this.selectedRange.set({ start: clickedPosition, end: clickedPosition });\r\n\r\n // update last selected character and position, and set anchor for keyboard navigation\r\n this._lastSelectedPosition = clickedPosition;\r\n this._selectionAnchor = clickedPosition;\r\n\r\n rangeToEmit = { at: event.char.id, run: 1 };\r\n }\r\n\r\n // emit events last, after all internal state is updated\r\n this.charPick.emit(event);\r\n this.rangePick.emit(rangeToEmit);\r\n }\r\n\r\n /**\r\n * Find the position (index in flat array) of a character by its ID.\r\n * Returns -1 if not found.\r\n */\r\n private findCharPosition(charId: number): number {\r\n const baseLines = this.baseLines();\r\n let position = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (char.id === charId) {\r\n return position;\r\n }\r\n position++;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Get the character ID at a specific position in the flat array.\r\n * Returns the ID or -1 if position is out of bounds.\r\n */\r\n private getCharIdAtPosition(position: number): number {\r\n const baseLines = this.baseLines();\r\n let currentPos = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (currentPos === position) {\r\n return char.id;\r\n }\r\n currentPos++;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Handle search input changes and trigger debounced search.\r\n */\r\n public onSearchInput(query: string): void {\r\n this.searchQuery.set(query);\r\n this._searchSubject.next(query);\r\n }\r\n\r\n /**\r\n * Perform the actual search and update match positions.\r\n */\r\n private performSearch(query: string): void {\r\n if (!query || query.length === 0) {\r\n this.searchMatches.set([]);\r\n return;\r\n }\r\n\r\n const text = this.text();\r\n if (!text || text.length === 0) {\r\n this.searchMatches.set([]);\r\n return;\r\n }\r\n\r\n // Build the full text string from CharNodes\r\n const fullText = text.map((node) => node.data).join('');\r\n\r\n // Find all matches (case-insensitive)\r\n const matches: { start: number; length: number }[] = [];\r\n const lowerQuery = query.toLowerCase();\r\n const lowerText = fullText.toLowerCase();\r\n let startIndex = 0;\r\n\r\n while (startIndex < lowerText.length) {\r\n const index = lowerText.indexOf(lowerQuery, startIndex);\r\n if (index === -1) {\r\n break;\r\n }\r\n matches.push({ start: index, length: query.length });\r\n startIndex = index + 1;\r\n }\r\n\r\n this.searchMatches.set(matches);\r\n }\r\n\r\n /**\r\n * Clear the search query and remove search highlights.\r\n */\r\n public clearSearch(): void {\r\n this.searchQuery.set('');\r\n this.searchMatches.set([]);\r\n }\r\n\r\n /**\r\n * Get the total number of characters in the text.\r\n */\r\n private getTotalCharCount(): number {\r\n return this.text().length;\r\n }\r\n\r\n /**\r\n * Get the character at a specific position.\r\n */\r\n private getCharAtPosition(position: number): BaseTextChar | null {\r\n const baseLines = this.baseLines();\r\n let currentPos = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (currentPos === position) {\r\n return char;\r\n }\r\n currentPos++;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Handle keyboard events for arrow key navigation.\r\n * - Left/Right: Move single selection to previous/next character\r\n * - Shift+Left/Right: Extend selection range\r\n */\r\n public onKeyDown(event: KeyboardEvent): void {\r\n const range = this.selectedRange();\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const totalChars = this.getTotalCharCount();\r\n if (totalChars === 0) {\r\n return;\r\n }\r\n\r\n let newStart: number = range.start;\r\n let newEnd: number = range.end;\r\n let handled = false;\r\n\r\n if (event.key === 'ArrowLeft') {\r\n if (event.shiftKey) {\r\n // Shift+Left: extend selection to the left from anchor\r\n if (this._selectionAnchor === undefined) {\r\n this._selectionAnchor = range.start;\r\n }\r\n // Determine which end to move based on anchor position\r\n if (range.end === this._selectionAnchor) {\r\n // Moving start to the left\r\n newStart = Math.max(0, range.start - 1);\r\n newEnd = range.end;\r\n } else {\r\n // Shrinking from right toward anchor, or extending left past anchor\r\n if (range.end > this._selectionAnchor) {\r\n // Shrink from right\r\n newStart = range.start;\r\n newEnd = range.end - 1;\r\n } else {\r\n // Extend left\r\n newStart = Math.max(0, range.start - 1);\r\n newEnd = range.end;\r\n }\r\n }\r\n handled = true;\r\n } else {\r\n // Left without shift: move to single selection one position left\r\n const currentPos = range.start;\r\n const newPos = Math.max(0, currentPos - 1);\r\n newStart = newPos;\r\n newEnd = newPos;\r\n this._selectionAnchor = newPos;\r\n this._lastSelectedPosition = newPos;\r\n handled = true;\r\n }\r\n } else if (event.key === 'ArrowRight') {\r\n if (event.shiftKey) {\r\n // Shift+Right: extend selection to the right from anchor\r\n if (this._selectionAnchor === undefined) {\r\n this._selectionAnchor = range.start;\r\n }\r\n // Determine which end to move based on anchor position\r\n if (range.start === this._selectionAnchor) {\r\n // Moving end to the right\r\n newStart = range.start;\r\n newEnd = Math.min(totalChars - 1, range.end + 1);\r\n } else {\r\n // Shrinking from left toward anchor, or extending right past anchor\r\n if (range.start < this._selectionAnchor) {\r\n // Shrink from left\r\n newStart = range.start + 1;\r\n newEnd = range.end;\r\n } else {\r\n // Extend right\r\n newStart = range.start;\r\n newEnd = Math.min(totalChars - 1, range.end + 1);\r\n }\r\n }\r\n handled = true;\r\n } else {\r\n // Right without shift: move to single selection one position right\r\n const currentPos = range.end;\r\n const newPos = Math.min(totalChars - 1, currentPos + 1);\r\n newStart = newPos;\r\n newEnd = newPos;\r\n this._selectionAnchor = newPos;\r\n this._lastSelectedPosition = newPos;\r\n handled = true;\r\n }\r\n }\r\n\r\n if (handled) {\r\n event.preventDefault();\r\n this.selectedRange.set({ start: newStart, end: newEnd });\r\n\r\n // Emit rangePick event\r\n const firstCharId = this.getCharIdAtPosition(newStart);\r\n const rangeToEmit: BaseTextRange = {\r\n at: firstCharId,\r\n run: newEnd - newStart + 1,\r\n };\r\n this.rangePick.emit(rangeToEmit);\r\n\r\n // Emit charPick for single selection\r\n if (newStart === newEnd) {\r\n const char = this.getCharAtPosition(newStart);\r\n if (char) {\r\n this.charPick.emit({\r\n char,\r\n event: null as unknown as MouseEvent,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Copy the currently selected text to the clipboard.\r\n */\r\n public copySelection(): void {\r\n const range = this.selectedRange();\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const text = this.text();\r\n if (!text || text.length === 0) {\r\n return;\r\n }\r\n\r\n // Extract the selected characters\r\n const selectedChars = text\r\n .slice(range.start, range.end + 1)\r\n .map((node) => node.data)\r\n .join('');\r\n\r\n this._clipboard.copy(selectedChars);\r\n this._snackBar.open('Text copied', 'OK', { duration: 2000 });\r\n }\r\n\r\n /**\r\n * Copy the currently selected range coordinates to the clipboard.\r\n * Format: \"ID\" for single character, \"IDxCOUNT\" for range.\r\n */\r\n public copyCoordinates(): void {\r\n const range = this.selectedRange();\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const text = this.text();\r\n if (!text || text.length === 0) {\r\n return;\r\n }\r\n\r\n const startId = text[range.start].id;\r\n const count = range.end - range.start + 1;\r\n\r\n const coords = count === 1 ? `${startId}` : `${startId}x${count}`;\r\n\r\n this._clipboard.copy(coords);\r\n this._snackBar.open(`Coordinates copied: ${coords}`, 'OK', {\r\n duration: 2000,\r\n });\r\n }\r\n\r\n /**\r\n * Check if there is an active selection.\r\n */\r\n public readonly hasSelection = computed(() => {\r\n return this.selectedRange() !== null;\r\n });\r\n\r\n /**\r\n * Get the total count of matched characters.\r\n */\r\n public readonly matchCount = computed(() => {\r\n const matches = this.searchMatches();\r\n return matches.reduce((sum, m) => sum + m.length, 0);\r\n });\r\n\r\n /**\r\n * Check if a search is active (query is not empty).\r\n */\r\n public readonly isSearchActive = computed(() => {\r\n return this.searchQuery().length > 0;\r\n });\r\n}\r\n","<!-- Toolbar -->\r\n<div class=\"toolbar\">\r\n <mat-form-field appearance=\"outline\" class=\"search-field\">\r\n <input\r\n matInput\r\n [ngModel]=\"searchQuery()\"\r\n (ngModelChange)=\"onSearchInput($event)\"\r\n placeholder=\"search\"\r\n />\r\n @if (searchQuery()) {\r\n <button\r\n type=\"button\"\r\n matSuffix\r\n mat-icon-button\r\n matTooltip=\"Clear search\"\r\n (click)=\"clearSearch()\"\r\n >\r\n <mat-icon class=\"mat-warn\">close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n\r\n @if (isSearchActive()) {\r\n <span class=\"match-count\" [class.no-matches]=\"matchCount() === 0\">\r\n {{ matchCount() }}\r\n </span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n mat-stroked-button\r\n matTooltip=\"Copy selection text to clipboard\"\r\n [disabled]=\"!hasSelection()\"\r\n (click)=\"copySelection()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n copy\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n mat-stroked-button\r\n matTooltip=\"Copy selection coordinates to clipboard\"\r\n [disabled]=\"!hasSelection()\"\r\n (click)=\"copyCoordinates()\"\r\n >\r\n <mat-icon>pin_drop</mat-icon>\r\n copy coords\r\n </button>\r\n</div>\r\n\r\n<!-- Text display -->\r\n<div id=\"text\" tabindex=\"0\" (keydown)=\"onKeyDown($event)\">\r\n @for (line of lines(); track $index) {\r\n <div class=\"line\">\r\n @if (hasLineNumber()) {\r\n <div class=\"nr\">\r\n {{ lines().indexOf(line) + 1 }}\r\n </div>\r\n }\r\n @for (c of line; track c.id) {\r\n <gve-base-text-char [char]=\"c\" (charPick)=\"onCharPick($event)\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\n// material\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport {\r\n Feature,\r\n FeatureSetPolicy,\r\n LabeledId,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\n/**\r\n * Features map. This is used for features from closed sets,\r\n * and lists the possible values for each feature.\r\n * The key is the feature name's ID, and the value is an array of\r\n * labeled IDs representing the allowed values for that feature.\r\n */\r\nexport interface FeatureMap {\r\n [key: string]: LabeledId[];\r\n}\r\n\r\n/**\r\n * 🔑 `gve-feature-editor`\r\n *\r\n * Component for editing a single feature, whose model is a name=value\r\n * pair, plus a set policy value which defines the desired behavior\r\n * when adding that feature to a set.\r\n * Used by `gve-feature-set-editor`.\r\n *\r\n * - ▶️ `feature` (`Feature`): the feature to edit.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of\r\n * features. Each item in the list is an object with _id_ and _label_\r\n * properties.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When\r\n * specified and the user selects a feature name present in the map keys,\r\n * the corresponding values will be used to populate the value selection.\r\n * - ▶️ `multiValuedFeatureIds` (`string[]`): the IDs of the features that are\r\n * multi-valued. Used to determine if the current feature being edited should\r\n * display multi-value controls.\r\n * - ▶️ `isVar`: true if the feature is a variant operation feature, which\r\n * has additional properties like negation, global, and short-lived.\r\n * - 🔥 `featureChange` (`Feature`): emitted when feature has changed.\r\n * - 🔥 `featureCancel`: emitted when the user cancels the feature editing.\r\n */\r\n@Component({\r\n selector: 'gve-feature-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './feature-editor.component.html',\r\n styleUrl: './feature-editor.component.css',\r\n})\r\nexport class FeatureEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _frozen?: boolean;\r\n\r\n @ViewChild('nameCtl') nameControl?: ElementRef;\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The feature to edit.\r\n */\r\n public readonly feature = model<Feature | OperationFeature | undefined>();\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(false);\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. Used to determine\r\n * if the current feature being edited should display multi-value controls.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Event emitted when the user cancels the feature editing.\r\n */\r\n public readonly featureCancel = output();\r\n\r\n public readonly nameIds = signal<LabeledId[] | undefined>(undefined);\r\n public readonly isMultiValued = signal<boolean>(false);\r\n\r\n public name: FormControl<string>;\r\n public value: FormControl<string>;\r\n public selectedValue: FormControl<string>;\r\n public setPolicy: FormControl<FeatureSetPolicy>;\r\n // var feature controls\r\n public isNegated: FormControl<boolean>;\r\n public isGlobal: FormControl<boolean>;\r\n public isShortLived: FormControl<boolean>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.name = formBuilder.control<string>('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.value = formBuilder.control('', {\r\n validators: [Validators.maxLength(5000)],\r\n nonNullable: true,\r\n });\r\n this.selectedValue = formBuilder.control('', {\r\n nonNullable: true,\r\n });\r\n this.setPolicy = formBuilder.control(FeatureSetPolicy.multiple, {\r\n nonNullable: true,\r\n });\r\n this.isNegated = formBuilder.control(false, { nonNullable: true });\r\n this.isGlobal = formBuilder.control(false, { nonNullable: true });\r\n this.isShortLived = formBuilder.control(false, { nonNullable: true });\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n value: this.value,\r\n selectedValue: this.selectedValue,\r\n setPolicy: this.setPolicy,\r\n isNegated: this.isNegated,\r\n isGlobal: this.isGlobal,\r\n isShortLived: this.isShortLived,\r\n });\r\n\r\n // when feature changes, update the form\r\n effect(() => {\r\n this.updateForm(this.feature());\r\n setTimeout(() => {\r\n this.nameControl?.nativeElement?.focus();\r\n this.nameIds.set(\r\n this.getLabeledIdsFor(this.name.value, this.featValues()),\r\n );\r\n }, 500);\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever the name changes, update the value selection and multi-valued status\r\n this._sub = this.name.valueChanges\r\n .pipe(debounceTime(300), distinctUntilChanged())\r\n .subscribe((name) => {\r\n if (!this._frozen && this.featNames()?.length) {\r\n this.value.reset();\r\n this.nameIds.set(this.getLabeledIdsFor(name, this.featValues()));\r\n }\r\n // Update multi-valued status\r\n const ids = this.multiValuedFeatureIds();\r\n this.isMultiValued.set(!!ids && ids.includes(name));\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(\r\n id?: string,\r\n featValues?: FeatureMap,\r\n ): LabeledId[] | undefined {\r\n if (!id) {\r\n return undefined;\r\n }\r\n console.log('getLabeledIdsFor', id, featValues);\r\n return featValues ? featValues![id] : undefined;\r\n }\r\n\r\n private updateForm(feature?: OperationFeature): void {\r\n if (!feature) {\r\n this.form.reset();\r\n this.isMultiValued.set(false);\r\n } else {\r\n this._frozen = true;\r\n this.name.setValue(feature.name);\r\n this.value.setValue(feature.value);\r\n this.setPolicy.setValue(feature.setPolicy || FeatureSetPolicy.multiple);\r\n this.isNegated.setValue(feature.isNegated || false);\r\n this.isGlobal.setValue(feature.isGlobal || false);\r\n this.isShortLived.setValue(feature.isShortLived || false);\r\n // Set multi-valued status based on feature name\r\n const ids = this.multiValuedFeatureIds();\r\n this.isMultiValued.set(!!ids && ids.includes(feature.name));\r\n this._frozen = false;\r\n }\r\n }\r\n\r\n public addValueToComposite(): void {\r\n if (!this.selectedValue.value) {\r\n return;\r\n }\r\n const currentValue = this.value.value.trim();\r\n const newValue = this.selectedValue.value.trim();\r\n if (currentValue) {\r\n this.value.setValue(currentValue + ' ' + newValue);\r\n } else {\r\n this.value.setValue(newValue);\r\n }\r\n this.selectedValue.reset();\r\n this.value.markAsDirty();\r\n }\r\n\r\n public cancel(): void {\r\n this.featureCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this.feature.set(\r\n this.isVar()\r\n ? {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n isNegated: this.isNegated.value,\r\n isGlobal: this.isGlobal.value,\r\n isShortLived: this.isShortLived.value,\r\n }\r\n : {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n },\r\n );\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n @if (featNames()?.length) {\r\n <!-- name (bound) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <mat-select #nameCtl [formControl]=\"name\">\r\n @for (i of featNames(); track i) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- name (free) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input #nameCtl matInput [formControl]=\"name\" />\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n }\r\n @if ($any(name).errors?.maxLength && (name.dirty || name.touched)) {\r\n <mat-error>name too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- value (bound) -->\r\n @if (nameIds()?.length) {\r\n @if (isMultiValued()) {\r\n <!-- multi-valued: select for picking + text for composite -->\r\n <mat-form-field>\r\n <mat-label>select value</mat-label>\r\n <mat-select [formControl]=\"selectedValue\">\r\n @for (e of nameIds(); track e) {\r\n <mat-option [value]=\"e.id\">{{ e.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Add selected value\"\r\n (click)=\"addValueToComposite()\"\r\n [disabled]=\"!selectedValue.value\"\r\n >\r\n <mat-icon class=\"mat-primary\">add</mat-icon>\r\n </button>\r\n <mat-form-field>\r\n <mat-label>composite value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n @if (\r\n $any(value).errors?.maxLength && (value.dirty || value.touched)\r\n ) {\r\n <mat-error>value too long</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- single-valued: just select -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <mat-select [formControl]=\"value\">\r\n @for (e of nameIds(); track e) {\r\n <mat-option [value]=\"e.id\">{{ e.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n } @else {\r\n <!-- value (free) -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n }\r\n @if ($any(value).errors?.maxLength && (value.dirty || value.touched)) {\r\n <mat-error>value too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- setPolicy -->\r\n <mat-form-field>\r\n <mat-label>set policy</mat-label>\r\n <mat-select [formControl]=\"setPolicy\">\r\n <mat-option [value]=\"0\">multiple</mat-option>\r\n <mat-option [value]=\"1\">single</mat-option>\r\n <mat-option [value]=\"2\">single first</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n @if (isVar()) {\r\n <div class=\"form-row\">\r\n <!-- isNegated -->\r\n <mat-checkbox [formControl]=\"isNegated\">negated</mat-checkbox>\r\n\r\n <!-- isShortLived -->\r\n <mat-checkbox [formControl]=\"isShortLived\">short-lived</mat-checkbox>\r\n\r\n <!-- isGlobal -->\r\n <mat-checkbox [formControl]=\"isGlobal\">global</mat-checkbox>\r\n </div>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n FeatureSetPolicy,\r\n LabeledId,\r\n Feature,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\nimport {\r\n FeatureEditorComponent,\r\n FeatureMap,\r\n} from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-editor`\r\n *\r\n * Component for editing a set of features. It shows a list of features,\r\n * allowing to edit each of them or adding new ones. Optionally you can\r\n * specify a list of feature names and values to use in the selection.\r\n * Used by base text editor and chain operation editor components.\r\n *\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is equal to or greater than the threshold. Default is 5.\r\n * - ▶️ `features` (`Feature[]`): the features to edit.\r\n * - ▶️ `multiValuedFeatureIds` (`string[]`): the IDs of the features that are\r\n * multi-valued. If a feature being edited is in this list, the feature editor\r\n * will allow adding multiple values to it.\r\n * - ▶️ `isVar`: true if the feature is a variant operation feature, which\r\n * has additional properties like negation, global, and short-lived.\r\n * - 🔥 `featuresChange` (`Feature[]`): emitted when features have changed.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n FlatLookupPipe,\r\n FeatureEditorComponent,\r\n ],\r\n templateUrl: './feature-set-editor.component.html',\r\n styleUrl: './feature-set-editor.component.css',\r\n})\r\nexport class FeatureSetEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n\r\n public readonly POLICIES = ['M', 'S', 'SF'];\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(true);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than or equal to the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>();\r\n\r\n /**\r\n * The features to edit.\r\n */\r\n public readonly features = model<Feature[] | OperationFeature[]>([]);\r\n\r\n public readonly editedFeature = signal<\r\n Feature | OperationFeature | undefined\r\n >(undefined);\r\n public readonly editedFeatureIndex = signal<number>(-1);\r\n public filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control<string | null>(null);\r\n\r\n // when features change, apply the filter\r\n effect(() => {\r\n this.applyFeatureFilter(this.features(), this.filter.value);\r\n });\r\n }\r\n\r\n private applyFeatureFilter(\r\n features: Feature[] | OperationFeature[],\r\n name?: string | null,\r\n ): void {\r\n this.filteredFeatures.set(\r\n features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n }) || [],\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n // when the filter changes, apply the filter\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(this.features(), value);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public addFeature(): void {\r\n this.editedFeature.set({\r\n name: '',\r\n value: '',\r\n setPolicy: FeatureSetPolicy.multiple,\r\n });\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n\r\n public editFeature(feature: Feature | OperationFeature): void {\r\n this.editedFeature.set(structuredClone(feature));\r\n this.editedFeatureIndex.set(this.features().indexOf(feature));\r\n }\r\n\r\n public deleteFeature(feature: Feature | OperationFeature): void {\r\n const index = this.features().indexOf(feature);\r\n if (index < 0) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n features.splice(index, 1);\r\n this.features.set(features);\r\n }\r\n\r\n public isFeatureMultiValued(feature?: Feature | OperationFeature): boolean {\r\n if (!feature || !this.multiValuedFeatureIds()) {\r\n return false;\r\n }\r\n return this.multiValuedFeatureIds()!.includes(feature.name);\r\n }\r\n\r\n public onFeatureChange(feature?: Feature | OperationFeature): void {\r\n if (!feature) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n\r\n for (let i = features.length - 1; i >= 0; i--) {\r\n if (features[i].name === feature.name) {\r\n if (\r\n feature.setPolicy === FeatureSetPolicy.single ||\r\n features[i].setPolicy === FeatureSetPolicy.single\r\n ) {\r\n features.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n if (this.editedFeatureIndex() === -1) {\r\n features.push(feature);\r\n } else {\r\n features.splice(this.editedFeatureIndex(), 1, feature);\r\n }\r\n\r\n this.onFeatureCancel();\r\n this.features.set(features);\r\n }\r\n\r\n public onFeatureCancel(): void {\r\n this.editedFeature.set(undefined);\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n}\r\n","<div>\r\n <div class=\"form-row\">\r\n <!-- filter -->\r\n @if (filterThreshold() === 0 || features().length >= filterThreshold()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"filter\" [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- add feature button -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Add a new feature\"\r\n (click)=\"addFeature()\"\r\n [class.in-row-button]=\"\r\n filterThreshold() === 0 || features()!.length >= filterThreshold()\r\n \"\r\n >\r\n <mat-icon>add</mat-icon>\r\n feature\r\n </button>\r\n </div>\r\n\r\n <!-- list -->\r\n @if (features().length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>feature</th>\r\n <th>value</th>\r\n <th>policy</th>\r\n @if (isVar()) {\r\n <th>flags</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track $index) {\r\n <tr [class.selected]=\"$index === editedFeatureIndex()\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Edit this feature\"\r\n (click)=\"editFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Delete this feature\"\r\n (click)=\"deleteFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @if (featNames()?.length) {\r\n <span>{{\r\n feature.name | flatLookup: featNames() : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </td>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup: featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n <td>\r\n <span>{{ POLICIES[feature.setPolicy] }}</span>\r\n </td>\r\n @if (isVar()) {\r\n <td>\r\n @if ($any(feature).isNegated) {\r\n <span class=\"icon\" matTooltip=\"Negated: remove if present\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </span>\r\n }\r\n @if ($any(feature).isGlobal) {\r\n <span class=\"icon\" matTooltip=\"Global: apply to whole output\">\r\n <mat-icon class=\"mat-primary\">public</mat-icon>\r\n </span>\r\n }\r\n @if ($any(feature).isShortLived) {\r\n <span\r\n class=\"icon\"\r\n matTooltip=\"Short-lived: removed on next operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">timer</mat-icon>\r\n </span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- editor -->\r\n @if (editedFeature()) {\r\n <mat-expansion-panel\r\n [disabled]=\"!editedFeature()\"\r\n [expanded]=\"editedFeature()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <span>{{ editedFeature()?.name || \"feature\" }}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-feature-editor\r\n [isVar]=\"isVar()\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n [featNames]=\"featNames()\"\r\n [featValues]=\"featValues()\"\r\n [feature]=\"editedFeature()\"\r\n (featureChange)=\"onFeatureChange($event)\"\r\n (featureCancel)=\"onFeatureCancel()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n</div>\r\n","import { CharNode } from '../models';\r\n\r\n/**\r\n * Service for base text operations.\r\n */\r\nexport class GveBaseTextService {\r\n private static readonly _asciiTable: { [key: string]: string } = {\r\n '\\u0007': '\\u21B5', // BEL (bell)\r\n '\\u0008': '\\u21B6', // BS (backspace)\r\n '\\u0009': '\\u2192', // HT (horizontal tab)\r\n '\\u000A': '\\u2193', // LF (line feed)\r\n '\\u000B': '\\u2194', // VT (vertical tab)\r\n '\\u000C': '\\u2195', // FF (form feed)\r\n '\\u000D': '\\u21A6', // CR (carriage return)\r\n '\\u0020': ' ', // Space\r\n '\\u007F': '~', // DEL (delete)\r\n };\r\n\r\n /**\r\n * Translate an ASCII special character to a printable character.\r\n *\r\n * @param c The character to translate.\r\n * @returns The translated character.\r\n */\r\n public static translateSpecialChar(c: string): string {\r\n return this._asciiTable[c] || c;\r\n }\r\n\r\n /**\r\n * Convert a string to the character nodes of a base text.\r\n *\r\n * @param text The text to convert to base characters.\r\n * @returns Character nodes for the given text.\r\n */\r\n public static stringToBaseChars(text?: string): CharNode[] {\r\n if (!text) {\r\n return [];\r\n }\r\n return text.split('').map((c, i) => {\r\n return {\r\n id: i + 1,\r\n label: this.translateSpecialChar(c),\r\n index: i,\r\n data: c,\r\n };\r\n });\r\n }\r\n}\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport {\r\n BaseTextViewComponent,\r\n BaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\nimport { CharNode, Feature } from '../../models';\r\nimport { GveBaseTextService } from '../../services/gve-base-text.service';\r\n\r\n/**\r\n * 🔑 `gve-base-text-editor`\r\n *\r\n * Editor for snapshot's base text. This can receive a string or an array\r\n * of `CharNode` objects, and lets the user edit the text, character by\r\n * character, optionally also setting its features.\r\n *\r\n * Used by the `gve-snapshot-editor` component.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n BaseTextViewComponent,\r\n FeatureSetEditorComponent,\r\n ],\r\n templateUrl: './base-text-editor.component.html',\r\n styleUrl: './base-text-editor.component.css',\r\n})\r\nexport class BaseTextEditorComponent {\r\n /**\r\n * The text to edit. In input this can be a string, an array of `CharNode`\r\n * objects, or undefined. In output this will be an array of `CharNode`\r\n * objects.\r\n */\r\n public readonly text = input.required({\r\n transform: (value: CharNode[] | string | undefined) => {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n return GveBaseTextService.stringToBaseChars(value);\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it. Passed down to feature editors.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Emitted for the edited text as an array of `CharNode`'s whenever it changes.\r\n */\r\n public readonly textChange = output<CharNode[]>();\r\n\r\n public readonly selectedChar = signal<CharNode | undefined>(undefined);\r\n public readonly selectedCharLabel = signal<string | undefined>(undefined);\r\n public readonly textRange = signal<BaseTextRange | undefined>(undefined);\r\n\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _dialogService: DialogService,\r\n ) {\r\n this.userText = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(10000)],\r\n });\r\n this.form = formBuilder.group({\r\n userText: this.userText,\r\n });\r\n\r\n effect(() => {\r\n this.resetSelectedChar();\r\n if (!this.text()) {\r\n this.userText.reset();\r\n } else {\r\n this.userText.setValue(\r\n this.text()!\r\n .map((c) => c.data)\r\n .join(''),\r\n );\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n private resetSelectedChar(): void {\r\n this.selectedChar.set(undefined);\r\n this.selectedCharLabel.set(undefined);\r\n }\r\n\r\n public onSelectedChar(event: BaseTextCharEvent): void {\r\n this.selectedChar.set(this.text()!.find((c) => c.id === event.char.id));\r\n this.selectedCharLabel.set(event.char.label);\r\n }\r\n\r\n public onFeaturesChange(features: Feature[]): void {\r\n const char = this.selectedChar();\r\n if (!char) {\r\n return;\r\n }\r\n const chars = this.text()!.map((c) =>\r\n c.id === char.id ? { ...c, features } : c,\r\n );\r\n this.selectedChar.set({ ...char, features });\r\n this.textChange.emit(chars);\r\n }\r\n\r\n public onRangePick(range: BaseTextRange) {\r\n this.textRange.set(range);\r\n }\r\n\r\n public setTextFromUser(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Reset text?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.textChange.emit(\r\n GveBaseTextService.stringToBaseChars(this.userText.value),\r\n );\r\n }\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n @if ( $any(userText).errors?.required && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text required</mat-error>\r\n } @if ( $any(userText).errors?.maxLength && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text() || []\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange.set($event)\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange()) {\r\n <div id=\"text-range\">{{ textRange()!.at }} × {{ textRange()!.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar()) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar()!.features || []\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { Observable, catchError } from 'rxjs';\r\n\r\nimport { ErrorService, EnvService } from '@myrmidon/ngx-tools';\r\n\r\nimport { CharChainOperation, CharNode, OperationFeature, ResultWrapper } from '../models';\r\n\r\n/**\r\n * Execution step of a char-based chain operation.\r\n */\r\nexport interface ChainOperationContextStep {\r\n /**\r\n * The operation that was executed.\r\n */\r\n operation: CharChainOperation;\r\n /**\r\n * The input version tag.\r\n */\r\n inputTag: string;\r\n /**\r\n * The output version tag.\r\n */\r\n outputTag: string;\r\n /**\r\n * The string synthetically representing the resulting text\r\n * version.\r\n */\r\n result?: string;\r\n /**\r\n * The features emitted up to the executed operation.\r\n * These are the features of the text as a whole, and\r\n * those belonging to specific nodes, each keyed under\r\n * a string built with `v` + output version tag + `_`\r\n * + node ID (e.g. `v1_2` for node with ID 2 at version 1).\r\n */\r\n featureSet: {\r\n features: OperationFeature[];\r\n nodeFeatures: Record<string, OperationFeature[]>;\r\n };\r\n /**\r\n * The reference node IDs of the operation which was\r\n * executed.\r\n */\r\n refNodeIds: number[];\r\n}\r\n\r\n/**\r\n * Result of execution of a char-based chain.\r\n */\r\nexport interface CharChainResult {\r\n /**\r\n * The base text, as an array of character nodes or string.\r\n * This is not returned by the API, but can be supplied\r\n * by the caller for rendering purposes.\r\n */\r\n text?: CharNode[] | string;\r\n /**\r\n * The execution steps of the chain.\r\n */\r\n steps: ChainOperationContextStep[];\r\n /**\r\n * The chain dump, which is the text representation of the chain.\r\n */\r\n chainDump: string;\r\n /**\r\n * The list of all unique tags in the chain.\r\n */\r\n chainTags: string[];\r\n /**\r\n * The sets of nodes in their order, for each version tag.\r\n * These nodes are collected by following the path defined\r\n * by the set of links of each version tag; so each of the\r\n * sets contains only the nodes used at that step to build\r\n * the text version, with their features up to that stage.\r\n */\r\n taggedNodes: { [key: string]: CharNode[] };\r\n}\r\n\r\n/**\r\n * The input and output tags of a char-based chain operation.\r\n */\r\nexport interface ChainOperationTags {\r\n inputTag: string;\r\n outputTag: string;\r\n}\r\n\r\n/**\r\n * The node of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainNode {\r\n id: number;\r\n label: string;\r\n data: string;\r\n sourceTag?: string;\r\n}\r\n\r\n/**\r\n * The link of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainLink {\r\n tag: string;\r\n sourceId: number;\r\n targetId: number;\r\n}\r\n\r\n/**\r\n * The character-based chain, as resulting from running operations\r\n * on a base text, used for diagnostic or demonstration purposes.\r\n */\r\nexport interface CharChain {\r\n nodes: CharChainNode[];\r\n links: CharChainLink[];\r\n}\r\n\r\n/**\r\n * Service to interact with the GVE API.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveApiService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService,\r\n ) {}\r\n\r\n /**\r\n * Parse the specified text into operations. Each operation is a line\r\n * of the text.\r\n * @param text The text to parse.\r\n * @returns The operations.\r\n */\r\n public parseOperations(\r\n text: string,\r\n ): Observable<ResultWrapper<CharChainOperation[]>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainOperation[]>>(\r\n `${this._env.get('apiUrl')}text/operations/parse`,\r\n {\r\n text,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Run operations on the specified text.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public runOperations(\r\n text: CharNode[],\r\n operations: CharChainOperation[],\r\n ): Observable<ResultWrapper<CharChainResult>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainResult>>(\r\n `${this._env.get('apiUrl')}text/operations/run`,\r\n {\r\n text,\r\n operations,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the input and output tags for the given operations.\r\n *\r\n * @param operations The operations.\r\n * @returns Result wrapper.\r\n */\r\n public getTags(\r\n operations: CharChainOperation[],\r\n ): Observable<ResultWrapper<string[]>> {\r\n return this._http\r\n .post<ResultWrapper<string[]>>(\r\n `${this._env.get('apiUrl')}text/operations/tags`,\r\n {\r\n operations,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the chain corresponding to the operations run on the\r\n * specified text. This is used for diagnostic or demonstration\r\n * purposes.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public getChain(\r\n text: CharNode[],\r\n operations: CharChainOperation[],\r\n ): Observable<ResultWrapper<CharChain>> {\r\n return this._http\r\n .post<ResultWrapper<CharChain>>(\r\n `${this._env.get('apiUrl')}text/operations/run/chain`,\r\n {\r\n text,\r\n operations,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n input,\r\n OnInit,\r\n Optional,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharChainOperation, PayloadMatDialogConfig } from '../../models';\r\nimport { GveApiService } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-batch-operation-editor`\r\n *\r\n * A component to edit a batch of operations. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `preset` (`string`): the optional preset text to parse.\r\n * - 🔥 `operationsChange` (`CharChainOperation[]`): event emitted when operations change.\r\n */\r\n@Component({\r\n selector: 'gve-batch-operation-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './batch-operation-editor.component.html',\r\n styleUrl: './batch-operation-editor.component.css',\r\n})\r\nexport class BatchOperationEditorComponent implements OnInit {\r\n public readonly busy = signal<boolean>(false);\r\n public readonly parseError = signal<string | undefined>(undefined);\r\n\r\n public text: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n /**\r\n * The preset text to parse if any. Usually you start with a blank\r\n * text, but sometimes you might want to pre-set it.\r\n */\r\n public readonly preset = input<string | undefined>();\r\n\r\n /**\r\n * Emitted when operations change.\r\n */\r\n public readonly operationsChange = output<CharChainOperation[]>();\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<BatchOperationEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ preset?: string }>,\r\n ) {\r\n this.text = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(2000),\r\n ]);\r\n this.form = formBuilder.group({\r\n inputOps: this.text,\r\n });\r\n\r\n effect(() => {\r\n this.parseOperations(this.preset() || undefined);\r\n });\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.preset) {\r\n this.parseOperations(this.data?.payload?.preset);\r\n }\r\n }\r\n\r\n public parseOperations(text?: string): void {\r\n if (this.busy() || !text) {\r\n return;\r\n }\r\n this.busy.set(true);\r\n this.parseError.set(undefined);\r\n\r\n this._api.parseOperations(text).subscribe({\r\n next: (wrapper) => {\r\n if (wrapper.error) {\r\n this.parseError.set(wrapper.error);\r\n return;\r\n }\r\n this.operationsChange.emit(wrapper.result || []);\r\n if (this.dialogRef) {\r\n this.dialogRef.close(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n this.parseError.set(error.message);\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Add Operations</h2>\r\n </div>\r\n }\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"text\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n @if (parseError()) {\r\n <div class=\"error\">{{ parseError() }}</div>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>&gt;[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>&gt;]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong>&lt;&gt;</strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or output tags,\r\n separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>&#x40;</code> to AT to use character indexes (0-N)\r\n rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>, separated by\r\n space, where:\r\n </li>\r\n <li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove feature (no\r\n value). Suffixes: <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple), <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text into operations\"\r\n [disabled]=\"!text.value || busy()\"\r\n (click)=\"parseOperations(text.value!)\"\r\n >\r\n batch add\r\n </button>\r\n </div>\r\n </fieldset>\r\n</div>\r\n","\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LabeledId, OperationSource } from '../../models';\r\n\r\n/**\r\n * 🔑 `gve-operation-source-editor`\r\n *\r\n * A component to edit an operation source.\r\n * Used by chain operation editor component.\r\n *\r\n * - ▶️ `source` (`OperationSource`): the source to edit.\r\n * - ▶️ `ids` (`LabeledId[]`): the list of source IDs, when using a closed\r\n * list for them.\r\n * - ▶️ `types` (`LabeledId[]`): the list of source types, when using a closed\r\n * list for them.\r\n * - 🔥 `sourceChange` (`EventEmitter<OperationSource>`): the event emitted\r\n * when the source changes.\r\n * - 🔥 `sourceCancel` (`EventEmitter<void>`): the event emitted when the\r\n * edit is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-operation-source-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule\r\n],\r\n templateUrl: './operation-source-editor.component.html',\r\n styleUrl: './operation-source-editor.component.css',\r\n})\r\nexport class OperationSourceEditorComponent {\r\n /**\r\n * The source to edit.\r\n */\r\n public readonly source = model<OperationSource | undefined>();\r\n\r\n /**\r\n * The list of source IDs when it's a closed set.\r\n */\r\n public readonly ids = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The list of source types when it's a closed set.\r\n */\r\n public readonly types = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The event emitted when the edit is canceled.\r\n */\r\n public sourceCancel = output();\r\n\r\n public id: FormControl<string>;\r\n public type: FormControl<string>;\r\n public rank: FormControl<number>;\r\n public note: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.id = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.type = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.rank = new FormControl(0, {\r\n nonNullable: true,\r\n });\r\n this.note = new FormControl(null, {\r\n validators: [Validators.maxLength(1000)],\r\n });\r\n this.form = formBuilder.group({\r\n id: this.id,\r\n type: this.type,\r\n rank: this.rank,\r\n note: this.note,\r\n });\r\n\r\n // when source changes, update form\r\n effect(() => {\r\n this.updateForm(this.source());\r\n });\r\n }\r\n\r\n private updateForm(source?: OperationSource): void {\r\n if (!source) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.id.setValue(source.id);\r\n this.type.setValue(source.type);\r\n this.rank.setValue(source.rank || 0);\r\n this.note.setValue(source.note || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public cancel(): void {\r\n this.sourceCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.source.set({\r\n id: this.id.value,\r\n type: this.type.value,\r\n rank: this.rank.value,\r\n note: this.note.value || undefined,\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <!-- id (bound) -->\r\n @if (ids()?.length) {\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <mat-select [formControl]=\"id\">\r\n @for (i of ids(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- id (free) -->\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <input matInput [formControl]=\"id\" />\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n } @if ($any(id.errors)?.maxLength && (id.dirty || id.touched)) {\r\n <mat-error>id too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- type (bound) -->\r\n @if (types()?.length) {\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n @for (i of types(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- type (free) -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <input matInput [formControl]=\"type\" />\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n } @if ($any(type.errors)?.maxLength && (type.dirty || type.touched)) {\r\n <mat-error>type too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput [formControl]=\"note\" class=\"long-text\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Validators for SVG.\r\n */\r\nexport class SvgValidators {\r\n /**\r\n * Validator for a valid SVG `g` root element in GVE.\r\n */\r\n static rootGValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n const parser = new DOMParser();\r\n let error = null;\r\n let svgRoot;\r\n\r\n try {\r\n const doc = parser.parseFromString(control.value, 'image/svg+xml');\r\n svgRoot =\r\n doc.documentElement.nodeName === 'svg' ? doc.documentElement : null;\r\n } catch (e) {\r\n error = { svgInvalid: { value: control.value } };\r\n }\r\n\r\n if (!error && svgRoot) {\r\n const gElements = svgRoot.getElementsByTagName('g');\r\n if (gElements.length !== 1 || svgRoot.childNodes.length > 1) {\r\n error = { svgInvalidRoot: { value: control.value } };\r\n }\r\n }\r\n\r\n return error;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Service to store and retrieve dynamic settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingsService {\r\n private readonly _cache: Map<string, unknown> = new Map<string, unknown>();\r\n private readonly _subject: BehaviorSubject<string | null> =\r\n new BehaviorSubject<string | null>(null);\r\n\r\n /**\r\n * Observable emitting the key of the setting that has changed.\r\n */\r\n public get settingChange$(): Observable<string | null> {\r\n return this._subject.asObservable();\r\n }\r\n\r\n /**\r\n * Prefix to scope the keys. This prefix is used internally to scope the keys\r\n * so that they cannot conflict with other keys in the local storage.\r\n * The prefix is totally transparent to the user of the service, who should\r\n * use the keys without the prefix.\r\n */\r\n public keyPrefix?: string;\r\n\r\n /**\r\n * True to persist the settings in the local storage by default.\r\n */\r\n public persistDefault = false;\r\n\r\n /**\r\n * Scopes the key by prefixing it with the keyPrefix if any.\r\n *\r\n * @param key The key to scope.\r\n * @returns The scoped key.\r\n */\r\n private getScopedKey(key: string): string {\r\n return this.keyPrefix ? this.keyPrefix + key : key;\r\n }\r\n\r\n private isPersist(persist?: boolean): boolean {\r\n return persist === undefined ? this.persistDefault : persist;\r\n }\r\n\r\n /**\r\n * Sets a setting's value.\r\n *\r\n * @param key The key.\r\n * @param value The value.\r\n * @param persist True to persist this setting in local storage.\r\n */\r\n public set(key: string, value: any, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.set(key, value);\r\n if (this.isPersist(persist) && value !== undefined) {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } catch (e) {\r\n console.error(`Error saving key \"${key}\" to localStorage`, e);\r\n }\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Set multiple settings at once from the specified settings object.\r\n *\r\n * @param settings The settings to set.\r\n * @param persist True to persist these settings in local storage.\r\n */\r\n public setFrom(\r\n settings: { [key: string]: any } | undefined | null,\r\n persist?: boolean\r\n ): void {\r\n if (!settings) {\r\n return;\r\n }\r\n for (const key in settings) {\r\n if (settings.hasOwnProperty(key)) {\r\n this.set(key, settings[key], persist);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get a setting's value of type T.\r\n *\r\n * @param key The key.\r\n * @param defaultValue The default value to get when the setting\r\n * is not found in the store.\r\n * @returns The value.\r\n */\r\n public get<T>(key: string, defaultValue?: any, persist?: boolean): T {\r\n key = this.getScopedKey(key);\r\n\r\n // immediately return value from cache\r\n if (this._cache.has(key)) {\r\n return this._cache.get(key) as T;\r\n }\r\n\r\n // try loading value from local storage\r\n if (this.isPersist(persist)) {\r\n const value = localStorage.getItem(key);\r\n if (value) {\r\n try {\r\n const parsedValue = JSON.parse(value) as T;\r\n this._cache.set(key, parsedValue);\r\n return parsedValue;\r\n } catch (e) {\r\n console.error(\r\n `Error parsing value for key \"${key}\" from localStorage`,\r\n e\r\n );\r\n }\r\n }\r\n }\r\n\r\n // not found, return default value\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Check if a key exists in the store.\r\n *\r\n * @param key The key.\r\n * @param persist True to check if the key exists in local storage.\r\n * @returns True if the key exists in the store.\r\n */\r\n public contains(key: string, persist?: boolean): boolean {\r\n key = this.getScopedKey(key);\r\n if (this._cache.has(key)) {\r\n return true;\r\n }\r\n return this.isPersist(persist) && localStorage.getItem(key) !== null;\r\n }\r\n\r\n /**\r\n * Get all the keys of the settings in the store.\r\n *\r\n * @param persist True to include keys from local storage.\r\n * @returns The keys of the settings in the store.\r\n */\r\n public getKeys(persist?: boolean): string[] {\r\n const keys: Set<string> = new Set<string>();\r\n\r\n // collect keys from local storage\r\n if (this.isPersist(persist)) {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && (!this.keyPrefix || key.startsWith(this.keyPrefix))) {\r\n keys.add(key);\r\n }\r\n }\r\n }\r\n\r\n // collect keys from cache\r\n this._cache.forEach((_, key) => keys.add(key));\r\n\r\n // return keys as array\r\n return Array.from(keys);\r\n }\r\n\r\n /**\r\n * Remove a setting if present.\r\n *\r\n * @param key The key.\r\n * @param persist True to remove the setting from local storage.\r\n */\r\n public remove(key: string, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.delete(key);\r\n\r\n if (this.isPersist(persist)) {\r\n localStorage.removeItem(key);\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Clear all settings. Warning: this will remove all settings from the\r\n * local storage if no key prefix is set.\r\n *\r\n * @param persist True to remove all settings from local storage.\r\n */\r\n public clear(persist?: boolean): void {\r\n // remove from local storage all the settings\r\n const removedKeys: Set<string> = new Set<string>();\r\n\r\n if (this.isPersist(persist)) {\r\n if (this.keyPrefix) {\r\n // collect keys to remove from local storage\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(this.keyPrefix)) {\r\n removedKeys.add(key);\r\n }\r\n }\r\n // remove collected keys from local storage\r\n removedKeys.forEach((key) => localStorage.removeItem(key));\r\n } else {\r\n localStorage.clear();\r\n }\r\n }\r\n\r\n // remove from cache all the items emitting change events\r\n this._cache.forEach((_, key) => {\r\n this._cache.delete(key);\r\n this._subject.next(key);\r\n removedKeys.delete(key);\r\n });\r\n\r\n // emit changes for the remaining removed keys\r\n // for when the cache was not in sync with the local storage\r\n removedKeys.forEach((key) => this._subject.next(key));\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, filter } from 'rxjs/operators';\r\n\r\n// material\r\nimport { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n// vendor\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { customAlphabet } from 'nanoid';\r\n\r\n// myrmidon\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport {\r\n CharChainOperation,\r\n Feature,\r\n OperationFeature,\r\n OperationType,\r\n OperationSource,\r\n Snapshot,\r\n LabeledId,\r\n} from '../../models';\r\n\r\n// local\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\nimport { OperationSourceEditorComponent } from '../operation-source-editor/operation-source-editor.component';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { SvgValidators } from '../../validators/svg-validators';\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\nimport { BaseTextRange } from '../base-text-view/base-text-view.component';\r\n\r\n/**\r\n * Definitions for features, including names and values.\r\n */\r\nexport interface FeatureDefinitions {\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n names?: LabeledId[];\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n values?: FeatureMap;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-chain-operation-editor`\r\n *\r\n * A component for editing a variant generation operation.\r\n * Used by the `gve-snapshot-editor` component.\r\n * - ▶️ `operation` (`CharChainOperation`): the operation to edit.\r\n * - ▶️ `snapshot` (`Snapshot`): the snapshot the operation refers to.\r\n * - ▶️ `hidePreview` (`boolean`): whether to hide the preview request button.\r\n * - 🔥 `operationChange` (`CharChainOperation`): emitted when the operation\r\n * is changed.\r\n * - 🔥 `operationPreview` (`CharChainOperation`): emitted when the operation\r\n * preview is requested.\r\n * - 🔥 `operationCancel` (`void`): emitted when operation editing is cancelled.\r\n *\r\n * The editor is composed of many sections:\r\n * - **general**:\r\n * - ID: each operation has an ID, automatically assigned. This is not used in\r\n * the context of the operation or of its transformations, but is provided as a\r\n * reference.\r\n * - at and run: coordinates for the selection of the base text targeted by\r\n * this operation. Check `idx` when `at` is index-based rather than ID-based.\r\n * - to and to-run: a second coordinate, used by some operations.\r\n * - value: the text value argument, for those operations requiring it.\r\n * - rank and group ID.\r\n * - input and output tags.\r\n * - features. These are metadata attached to this operation, and can be any\r\n * type of name=value pairs.\r\n * - **sources**: sources are a special type of metadata used when your text\r\n * versions come from more than a single source. In this case, you can specify\r\n * the source(s) for each operation, just like in a traditional apparatus you\r\n * specify witnesses for each variant. Each source has an ID, a type, a\r\n * probability rank (0=not specified, else 1-N), and an optional free text note.\r\n * - **diplomatic**: SVG `g` code. The diplomatic section is the approximate\r\n * diplomatic representation of the layout of the annotated text. It essentially\r\n * consists in a freely editable SVG code, always grouped into a single root `g`\r\n * element, encoding all the graphical traits representing this operation.\r\n * The visual part of each operation can be placed everywhere on the snapshot,\r\n * as specified by its coordinates.\r\n * - **elements**: features of any of the SVG code elements having an ID.\r\n * The elements section lists all the SVG elements having an `id` attribute in\r\n * the SVG code of the diplomatic section. The ID allows you to attach\r\n * any number of features (metadata modeled as name=value pairs) to each of\r\n * these elements. Among these features, you may use `style` or `class` for\r\n * renditional purposes, and any other name for your own metadata. Note that\r\n * element IDs will be required also when dealing with animations. So, ensure\r\n * to assign an ID to each element you want to animate.\r\n * - **dp feats**: diplomatic features: these are features (metadata modeled\r\n * as name=value pairs) for the diplomatic representation of this operation\r\n * as a whole.\r\n */\r\n@Component({\r\n selector: 'gve-chain-operation-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n ClipboardModule,\r\n MatBadgeModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n FeatureSetEditorComponent,\r\n OperationSourceEditorComponent,\r\n ],\r\n templateUrl: './chain-operation-editor.component.html',\r\n styleUrl: './chain-operation-editor.component.css',\r\n})\r\nexport class ChainOperationEditorComponent implements OnInit, OnDestroy {\r\n private readonly _subs: Subscription[];\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n\r\n /**\r\n * The operation to edit.\r\n */\r\n public readonly operation = model<CharChainOperation | undefined>();\r\n\r\n /**\r\n * The snapshot the operation refers to.\r\n */\r\n public readonly snapshot = input<Snapshot | undefined>();\r\n\r\n /**\r\n * Whether to hide the preview request button.\r\n */\r\n public readonly hidePreview = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Set when the edited operation's text range is to be patched.\r\n */\r\n public readonly rangePatch = input<BaseTextRange | undefined>();\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it. Passed down to feature editors.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Emitted when the operation is changed.\r\n */\r\n public readonly operationChange = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when the operation preview is requested.\r\n */\r\n public readonly operationPreview = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when operation editing is cancelled.\r\n */\r\n public readonly operationCancel = output();\r\n\r\n public readonly tabIndex = signal<number>(0);\r\n public readonly id = signal<string | undefined>(undefined);\r\n public readonly hasTo = signal<boolean>(false);\r\n public readonly hasToRun = signal<boolean>(false);\r\n public readonly hasValue = signal<boolean>(false);\r\n // elements parsed from SVG and having an id attribute;\r\n // we can attach features to each of these elements\r\n public readonly elements = signal<SVGElement[]>([]);\r\n public readonly editedElementId = signal<string | undefined>(undefined);\r\n // source\r\n public readonly editedSource = signal<OperationSource | undefined>(undefined);\r\n public readonly editedSourceIndex = signal<number>(-1);\r\n\r\n // general\r\n public rank: FormControl<number>;\r\n public groupId: FormControl<string | null>;\r\n public features: FormControl<Feature[]>;\r\n public sources: FormControl<OperationSource[]>;\r\n public type: FormControl<OperationType>;\r\n public at: FormControl<number>;\r\n public atAsIndex: FormControl<boolean>;\r\n public to: FormControl<number>;\r\n public toAsIndex: FormControl<boolean>;\r\n public inputTag: FormControl<string | null>;\r\n public outputTag: FormControl<string | null>;\r\n public run: FormControl<number>;\r\n public toRun: FormControl<number>;\r\n public value: FormControl<string | null>;\r\n // svg\r\n public svg: FormControl<string>;\r\n // elements\r\n public elementFeatures: FormControl<Record<string, Feature[]>>;\r\n // diplomatic\r\n public newTextHidden: FormControl<boolean>;\r\n public dpFeatures: FormControl<Feature[]>;\r\n // root\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _clipboard: Clipboard,\r\n private _settings: SettingsService,\r\n private _dialogService: DialogService,\r\n ) {\r\n this._subs = [];\r\n // general\r\n this.rank = formBuilder.control<number>(0, { nonNullable: true });\r\n this.groupId = formBuilder.control<string | null>(null);\r\n this.features = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n this.sources = formBuilder.control<OperationSource[]>([], {\r\n nonNullable: true,\r\n });\r\n this.type = formBuilder.control<OperationType>(OperationType.replace, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.at = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.atAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.to = formBuilder.control<number>(0, { nonNullable: true });\r\n this.toAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.inputTag = formBuilder.control<string | null>(null);\r\n this.outputTag = formBuilder.control<string | null>(null);\r\n this.run = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.toRun = formBuilder.control<number>(0, { nonNullable: true });\r\n this.value = formBuilder.control<string | null>(null);\r\n\r\n // svg\r\n this.svg = formBuilder.control<string>('', {\r\n validators: [SvgValidators.rootGValidator()],\r\n nonNullable: true,\r\n });\r\n this.elementFeatures = formBuilder.control<Record<string, Feature[]>>(\r\n {},\r\n { nonNullable: true },\r\n );\r\n this.newTextHidden = formBuilder.control<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.dpFeatures = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n\r\n this.form = formBuilder.group({\r\n rank: this.rank,\r\n groupId: this.groupId,\r\n features: this.features,\r\n sources: this.sources,\r\n type: this.type,\r\n at: this.at,\r\n atAsIndex: this.atAsIndex,\r\n to: this.to,\r\n toAsIndex: this.toAsIndex,\r\n inputTag: this.inputTag,\r\n outputTag: this.outputTag,\r\n run: this.run,\r\n toRun: this.toRun,\r\n value: this.value,\r\n svg: this.svg,\r\n elementFeatures: this.elementFeatures,\r\n newTextHidden: this.newTextHidden,\r\n dpFeatures: this.dpFeatures,\r\n });\r\n\r\n // when operation changes, update form\r\n effect(() => {\r\n this.updateForm(this.operation());\r\n });\r\n\r\n // when rangePatch changes, patch operation range (at and run,\r\n // resetting atAsIndex to false)\r\n effect(() => {\r\n const range = this.rangePatch();\r\n\r\n if (range) {\r\n console.log('patching range', range);\r\n\r\n this.at.setValue(range.at);\r\n this.at.markAsDirty();\r\n this.at.updateValueAndValidity();\r\n\r\n this.atAsIndex.setValue(false);\r\n this.atAsIndex.markAsDirty();\r\n this.atAsIndex.updateValueAndValidity();\r\n\r\n this.run.setValue(range.run);\r\n this.run.markAsDirty();\r\n this.run.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever svg or base change, update preview\r\n this._subs.push(\r\n this.form.valueChanges\r\n .pipe(\r\n filter((changes) => 'svg' in changes || 'snapshot' in changes),\r\n debounceTime(500),\r\n )\r\n .subscribe(() => {\r\n this.requestPreview();\r\n }),\r\n );\r\n\r\n // whenever type changes, update args UI\r\n this._subs.push(\r\n this.type.valueChanges.subscribe(() => this.updateArgsUI()),\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n for (const sub of this._subs) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n private toggleLfEscape(\r\n text: string | null | undefined,\r\n on: boolean,\r\n ): string | null | undefined {\r\n if (!text) return text;\r\n return on ? text.replace(/\\\\/g, '\\n') : text.replace(/\\n/g, '\\\\');\r\n }\r\n\r\n private hasTextChanges(snapshot?: Snapshot): boolean {\r\n if ((!snapshot && this.snapshot()) || (snapshot && !this.snapshot())) {\r\n return true;\r\n }\r\n if (snapshot?.text !== this.snapshot()?.text) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public onFeaturesChange(features: OperationFeature[]): void {\r\n this.features.setValue(features);\r\n this.features.markAsDirty();\r\n }\r\n\r\n public onDpFeaturesChange(features: Feature[]): void {\r\n this.dpFeatures.setValue(features);\r\n this.dpFeatures.markAsDirty();\r\n }\r\n\r\n // #region sources\r\n public addSource(): void {\r\n this.editedSource.set({ id: '', type: '' });\r\n this.editedSourceIndex.set(-1);\r\n }\r\n\r\n public editSource(index: number): void {\r\n this.editedSourceIndex.set(index);\r\n this.editedSource.set(structuredClone(this.sources.value[index]));\r\n }\r\n\r\n public closeSource(): void {\r\n this.editedSourceIndex.set(-1);\r\n this.editedSource.set(undefined);\r\n }\r\n\r\n public onSourceChange(source: OperationSource): void {\r\n const sources = [...this.sources.value];\r\n if (this.editedSourceIndex() === -1) {\r\n sources.push(source);\r\n } else {\r\n sources[this.editedSourceIndex()] = source;\r\n }\r\n this.sources.setValue(sources);\r\n this.closeSource();\r\n }\r\n // #endregion\r\n\r\n private updateArgsUI(): void {\r\n let to = false,\r\n toRun = false,\r\n value = false;\r\n switch (this.type.value) {\r\n case OperationType.moveAfter:\r\n case OperationType.moveBefore:\r\n to = true;\r\n break;\r\n case OperationType.swap:\r\n to = true;\r\n toRun = true;\r\n break;\r\n case OperationType.addAfter:\r\n case OperationType.addBefore:\r\n case OperationType.replace:\r\n value = true;\r\n break;\r\n }\r\n this.hasTo.set(to);\r\n this.hasToRun.set(toRun);\r\n this.hasValue.set(value);\r\n\r\n if (!to) {\r\n this.to.reset();\r\n }\r\n if (!toRun) {\r\n this.toRun.reset();\r\n }\r\n if (!value) {\r\n this.value.reset();\r\n }\r\n }\r\n\r\n private updateForm(operation?: CharChainOperation | null): void {\r\n if (!operation) {\r\n this.form.reset();\r\n this.updateArgsUI();\r\n return;\r\n }\r\n\r\n // get or generate ID\r\n if (operation.id) {\r\n this.id.set(operation.id);\r\n } else {\r\n this.id.set(this._nanoid());\r\n }\r\n\r\n this.rank.setValue(operation.rank || 0);\r\n this.groupId.setValue(operation.groupId || null);\r\n this.features.setValue(operation.features || []);\r\n this.sources.setValue(operation.sources || []);\r\n\r\n this.type.setValue(operation.type);\r\n this.at.setValue(operation.at);\r\n this.atAsIndex.setValue(operation.atAsIndex || false);\r\n this.to.setValue(operation.to || 0);\r\n this.toAsIndex.setValue(operation.toAsIndex || false);\r\n this.inputTag.setValue(operation.inputTag || null);\r\n this.outputTag.setValue(operation.outputTag || null);\r\n this.run.setValue(operation.run);\r\n this.toRun.setValue(operation.toRun || 0);\r\n // escape line feeds in value for editing\r\n this.value.setValue(this.toggleLfEscape(operation.value, true) || null);\r\n\r\n this.form.markAsPristine();\r\n\r\n this.updateArgsUI();\r\n }\r\n\r\n public cancel(): void {\r\n this.operationCancel.emit();\r\n }\r\n\r\n private getOperation(): CharChainOperation {\r\n return {\r\n rank: this.rank.value || undefined,\r\n groupId: this.groupId.value || undefined,\r\n features: this.features.value?.length ? this.features.value : undefined,\r\n sources: this.sources.value?.length ? this.sources.value : undefined,\r\n id: this.id()!,\r\n type: this.type.value,\r\n at: this.at.value,\r\n atAsIndex: this.atAsIndex.value || undefined,\r\n to: this.to.value || undefined,\r\n toAsIndex: this.toAsIndex.value || undefined,\r\n inputTag: this.inputTag.value || undefined,\r\n outputTag: this.outputTag.value || undefined,\r\n run: this.run.value,\r\n toRun: this.toRun.value || undefined,\r\n // un-escape line feeds in value for storage\r\n value: this.toggleLfEscape(this.value.value, false) || undefined,\r\n };\r\n }\r\n\r\n public requestPreview(): void {\r\n this.operationPreview.emit(this.getOperation());\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n\r\n this.operation.set(this.getOperation());\r\n this.operationChange.emit(this.operation()!);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group [selectedIndex]=\"tabIndex()\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id() }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\"\r\n ><mat-icon>layers</mat-icon> replace</mat-option\r\n >\r\n <mat-option [value]=\"1\"\r\n ><mat-icon>close</mat-icon>delete</mat-option\r\n >\r\n <mat-option [value]=\"2\"\r\n ><mat-icon>last_page</mat-icon>add-before</mat-option\r\n >\r\n <mat-option [value]=\"3\"\r\n ><mat-icon>first_page</mat-icon>add-after</mat-option\r\n >\r\n <mat-option [value]=\"4\"\r\n ><mat-icon>login</mat-icon>move-before</mat-option\r\n >\r\n <mat-option [value]=\"5\"\r\n ><mat-icon>logout</mat-icon>move-after</mat-option\r\n >\r\n <mat-option [value]=\"6\"\r\n ><mat-icon>compare_arrows</mat-icon>swap</mat-option\r\n >\r\n <mat-option [value]=\"7\"\r\n ><mat-icon>edit_note</mat-icon>annotate</mat-option\r\n >\r\n </mat-select>\r\n @if ($any(type).errors?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n @if ($any(at).errors?.required && (at.dirty || at.touched)) {\r\n <mat-error>at required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n @if ($any(run).errors?.required && (run.dirty || run.touched)) {\r\n <mat-error>run required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n @if ($any(to).errors?.required && (to.dirty || to.touched)) {\r\n <mat-error>to required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n @if (\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n ) {\r\n <mat-error>to run required</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n }\r\n\r\n <!-- value -->\r\n @if (hasValue()) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n @if ($any(rank).errors?.required && (rank.dirty || rank.touched)) {\r\n <mat-error>rank required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n @if (\r\n $any(groupId).errors?.required && (groupId.dirty || groupId.touched)\r\n ) {\r\n <mat-error>group ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [featNames]=\"featureDefs()?.names\"\r\n [featValues]=\"featureDefs()?.values\"\r\n [features]=\"features.value\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr [class.selected]=\"s === editedSource()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (editedSource()) {\r\n <!-- source editor -->\r\n <mat-expansion-panel\r\n [disabled]=\"!editedSource()\"\r\n [expanded]=\"editedSource()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource()\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview()) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, Input, signal } from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n Feature,\r\n LabeledId,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-view`\r\n *\r\n * A component to display a list of features.\r\n * Used by the chain result view component.\r\n *\r\n * - ▶️ `features` (`Feature[]`): the features to display.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n FlatLookupPipe,\r\n ],\r\n templateUrl: './feature-set-view.component.html',\r\n styleUrl: './feature-set-view.component.css',\r\n})\r\nexport class FeatureSetViewComponent {\r\n private _sub?: Subscription;\r\n\r\n /**\r\n * The features.\r\n */\r\n public readonly features = input<Feature[] | OperationFeature[]>([]);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n public readonly filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control(null);\r\n\r\n // when features change, reset the filter and apply it\r\n effect(() => {\r\n const features = this.features();\r\n this.filter.reset();\r\n this.applyFeatureFilter();\r\n });\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures.set(\r\n this.features().filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n })\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(value);\r\n });\r\n this.applyFeatureFilter();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n}\r\n","<div>\r\n <!-- filter -->\r\n <div>\r\n @if (filterThreshold() === 0 || features()!.length > filterThreshold()) {\r\n <div class=\"form-row\">\r\n <mat-form-field id=\"filter\">\r\n <mat-label>filter</mat-label>\r\n <input matInput [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n <span id=\"badge\">{{ filteredFeatures().length }}</span>\r\n </div>\r\n }\r\n\r\n <!-- list -->\r\n @if (filteredFeatures().length) {\r\n <table>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track $index) {\r\n <tr>\r\n <th>\r\n @if (featNames()?.length) {\r\n <span>{{\r\n feature.name | flatLookup: featNames() : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </th>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup: featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { ChainOperationContextStep } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-steps-map`\r\n *\r\n * A map of steps in a chain operation context. This shows the list of\r\n * steps in the execution of a set of operations, and allows the user to\r\n * pick a step to view.\r\n *\r\n * Used by the `gve-chain-result-view` component.\r\n *\r\n * - ▶️ `steps` (`ChainOperationContextStep[]`): the steps to display.\r\n * - ▶️ `selectedStep` (`ChainOperationContextStep`): the step that is\r\n * currently selected.\r\n * - ▶️ `textFontSize` (`string`): the font size of the steps text.\r\n * - 🔥 `selectedStepChange` (`ChainOperationContextStep`): emitted when\r\n * the selectd step has been changed by the user. This is not emitted\r\n * when the selected step is changed programmatically, unless this is\r\n * the first time the steps are set. In that case, the last step is\r\n * automatically selected.\r\n */\r\n@Component({\r\n selector: 'gve-steps-map',\r\n imports: [MatButtonModule, MatRippleModule, MatTooltipModule],\r\n templateUrl: './steps-map.component.html',\r\n styleUrl: './steps-map.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StepsMapComponent implements AfterViewInit {\r\n // track view initialization\r\n private _viewInitialized = signal(false);\r\n // track whether we've processed the steps/selection\r\n private _selectionProcessed = signal(false);\r\n\r\n // the lines of each version text, keyed under the output tag\r\n public readonly lines = signal<{ [key: string]: string[] }>({});\r\n\r\n /**\r\n * The steps to display.\r\n */\r\n public readonly steps = input<ChainOperationContextStep[]>([]);\r\n\r\n /**\r\n * The step that is currently selected.\r\n */\r\n public readonly selectedStep = model<ChainOperationContextStep | undefined>();\r\n\r\n /**\r\n * The font size of the steps text.\r\n */\r\n public readonly textFontSize = input('0.8em');\r\n\r\n constructor() {\r\n // handle steps updates\r\n effect(() => {\r\n const currentSteps = this.steps();\r\n if (currentSteps && currentSteps.length > 0) {\r\n this.updateLines(currentSteps);\r\n } else {\r\n this.lines.set({});\r\n }\r\n\r\n // reset selection processing when steps change\r\n this._selectionProcessed.set(false);\r\n });\r\n\r\n // handle synchronization between steps and selectedStep\r\n effect(() => {\r\n // only proceed if view is initialized and we haven't processed selection yet\r\n if (this._viewInitialized() && !this._selectionProcessed()) {\r\n const currentSteps = this.steps();\r\n const currentSelectedStep = this.selectedStep();\r\n\r\n // if we have steps, handle selection\r\n if (currentSteps && currentSteps.length > 0) {\r\n if (currentSelectedStep) {\r\n // if we have both inputs, verify selection is valid\r\n this.validateAndSetSelection(currentSelectedStep);\r\n } else {\r\n // auto-select last step if no selection provided\r\n this.selectedStep.set(currentSteps[currentSteps.length - 1]);\r\n }\r\n\r\n // mark as processed\r\n this._selectionProcessed.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private validateAndSetSelection(step: ChainOperationContextStep): void {\r\n const currentSteps = this.steps();\r\n\r\n // check if the selected step exists in the steps array\r\n const stepExists = currentSteps.some((s) => s.outputTag === step.outputTag);\r\n\r\n if (stepExists) {\r\n // valid selection, keep it\r\n this.selectedStep.set(step);\r\n } else {\r\n // invalid selection, default to last step\r\n const lastStep = currentSteps[currentSteps.length - 1];\r\n this.selectedStep.set(lastStep);\r\n }\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for selection processing\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n private updateLines(steps: ChainOperationContextStep[] | undefined) {\r\n if (!steps) {\r\n this.lines.set({});\r\n return;\r\n }\r\n\r\n const lines: { [key: string]: string[] } = {};\r\n for (let i = 0; i < steps.length; i++) {\r\n const step = this.steps()![i];\r\n lines[step.outputTag] = step.result?.split('\\n') || [];\r\n }\r\n this.lines.set(lines);\r\n }\r\n\r\n public onStepClick(step: ChainOperationContextStep) {\r\n this.selectedStep.set(step);\r\n }\r\n}\r\n","<div>\r\n @if (steps().length) { @for (step of steps(); track step.outputTag) {\r\n <div\r\n matRipple\r\n class=\"step form-row\"\r\n [class.selected]=\"step === selectedStep()\"\r\n (click)=\"onStepClick(step)\"\r\n >\r\n <!-- tag -->\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} &#x25b6; </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <!-- text lines -->\r\n <div class=\"text\" [style.fontSize]=\"textFontSize()\">\r\n @for (line of lines()[step.outputTag]; track $index) {\r\n <div class=\"line\">{{ line }}</div>\r\n }\r\n <div></div>\r\n </div>\r\n </div>\r\n } }\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport {\r\n CharNode,\r\n Feature,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\nimport { FeatureSetViewComponent } from '../feature-set-view/feature-set-view.component';\r\nimport { StepsMapComponent } from '../steps-map/steps-map.component';\r\nimport {\r\n BaseTextViewComponent,\r\n BaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChainResult,\r\n} from '../../services/gve-api.service';\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport { MatTooltip } from \"@angular/material/tooltip\";\r\n\r\n/**\r\n * 🔑 `gve-chain-result-view`\r\n *\r\n * Component to display a chain result. This provides a version picker\r\n * by staged version or simple step, and shows the selected step's text\r\n * and features, plus a steps map. User can pick a step from both the\r\n * pickers or the map.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `result` (`CharChainResult`): the result to display.\r\n * - 🔥 `stepPick` (`ChainOperationContextStep`): emitted when a\r\n * result's step is picked by the user.\r\n */\r\n@Component({\r\n selector: 'gve-chain-result-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n FeatureSetViewComponent,\r\n StepsMapComponent,\r\n BaseTextViewComponent,\r\n MatTooltip\r\n],\r\n templateUrl: './chain-result-view.component.html',\r\n styleUrl: './chain-result-view.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChainResultViewComponent\r\n implements OnInit, OnDestroy, AfterViewInit\r\n{\r\n private _subs?: Subscription[];\r\n // track if we've already performed step selection\r\n private _stepSelectionDone = signal(false);\r\n // track if component view is initialized\r\n private _viewInitialized = signal(false);\r\n\r\n /**\r\n * The result to display.\r\n */\r\n public readonly result = input<CharChainResult | undefined>();\r\n\r\n /**\r\n * The index of the initial step to display after the result is set.\r\n * If the index is negative, it is counted from the end of the steps.\r\n */\r\n public readonly initialStepIndex = input<number | undefined>();\r\n\r\n /**\r\n * Emitted when a result's step is picked by the user.\r\n */\r\n public readonly stepPick = output<ChainOperationContextStep>();\r\n\r\n public readonly versionTags = signal<string[]>([]);\r\n public readonly tags = signal<string[]>([]);\r\n public readonly step = signal<ChainOperationContextStep | undefined>(\r\n undefined\r\n );\r\n public readonly selection = signal<string | undefined>(undefined);\r\n public readonly selectionFeatures = signal<OperationFeature[]>([]);\r\n public readonly selectionRange = signal<BaseTextRange | undefined>(\r\n undefined\r\n );\r\n\r\n /**\r\n * True to disable range picking. For instance the snapshot editor,\r\n * which uses rangePick to set the edited operation's range, disables\r\n * this when no operation is being edited.\r\n */\r\n public readonly disabledRangePick = input<boolean>(true);\r\n\r\n /**\r\n * Emitted when a range is picked.\r\n */\r\n public readonly rangePick = output<BaseTextRange>();\r\n\r\n public versionTag: FormControl<string | null>;\r\n public tag: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // bind callback methods\r\n this.getCharColor = this.getCharColor.bind(this);\r\n // this.getCharBorderColor = this.getCharBorderColor.bind(this);\r\n\r\n this.versionTag = formBuilder.control<string | null>(null);\r\n this.tag = formBuilder.control<string | null>(null);\r\n\r\n // when result changes, update the form\r\n effect(() => {\r\n this.updateForm(this.result());\r\n // select the initial step if set\r\n this.selectInitialStep(this.initialStepIndex());\r\n });\r\n\r\n // when either the result or initialStepIndex changes, try to select a step\r\n effect(() => {\r\n // only proceed if we haven't already done selection and view is ready\r\n if (!this._stepSelectionDone() && this._viewInitialized()) {\r\n const currentResult = this.result();\r\n const currentIndex = this.initialStepIndex();\r\n\r\n // if we have both pieces of data needed for selection, do it\r\n if (currentResult?.steps?.length && currentIndex !== undefined) {\r\n this.doInitialStepSelection(currentResult, currentIndex);\r\n this._stepSelectionDone.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private doInitialStepSelection(\r\n result: CharChainResult,\r\n initialStepIndex: number\r\n ): void {\r\n // calculate the effective index (handling negative indices)\r\n const effectiveIndex =\r\n initialStepIndex < 0\r\n ? result.steps.length + initialStepIndex\r\n : initialStepIndex;\r\n\r\n // ensure the index is valid\r\n if (effectiveIndex >= 0 && effectiveIndex < result.steps.length) {\r\n const targetStep = result.steps[effectiveIndex];\r\n\r\n // if we have a tag control (which we do based on your code)\r\n if (targetStep.outputTag) {\r\n // using the tag control ensures all the necessary updates happen\r\n this.tag.setValue(targetStep.outputTag);\r\n }\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [\r\n // whenever the staged version tag changes, update the tag\r\n this.versionTag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.tag.setValue(this.getTagFromVersion(value) || null);\r\n }),\r\n\r\n // whenever the tag changes, update the step\r\n this.tag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.selectionFeatures.set([]); // reset selection features\r\n this.step.set(\r\n this.result()?.steps.find((step) => step.outputTag === value)\r\n );\r\n if (this.step()) {\r\n this.stepPick.emit(this.step()!);\r\n }\r\n }),\r\n ];\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for initial selection\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n public getCharColor(node: CharNode): string | null {\r\n const features = this.getNodeFeatures(node.id);\r\n return features?.some(\r\n (f) => f.name === '$seg-out' || f.name === '$seg2-out'\r\n )\r\n ? 'orange'\r\n : null;\r\n }\r\n\r\n private selectInitialStep(initialStepIndex?: number): void {\r\n if (initialStepIndex !== undefined && this.result()?.steps) {\r\n this.step.set(\r\n this.result()!.steps[\r\n initialStepIndex < 0\r\n ? this.result()!.steps.length + initialStepIndex\r\n : initialStepIndex\r\n ]\r\n );\r\n } else {\r\n this.step.set(undefined);\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subs?.forEach((sub) => sub.unsubscribe());\r\n }\r\n\r\n private updateVersionTags(): void {\r\n if (!this.result()) {\r\n this.versionTags.set([]);\r\n return;\r\n }\r\n\r\n // extract version tags from result steps features named 'version'\r\n const tags = new Set<string>();\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version') {\r\n tags.add(feature.value);\r\n }\r\n }\r\n }\r\n this.versionTags.set(Array.from(tags).sort());\r\n }\r\n\r\n private getTagFromVersion(version?: string | null): string | undefined {\r\n if (!this.result() || !version) {\r\n return undefined;\r\n }\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version' && feature.value === version) {\r\n return step.outputTag;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private updateForm(result?: CharChainResult): void {\r\n this.selectionFeatures.set([]);\r\n\r\n if (!result) {\r\n this.step.set(undefined);\r\n this.selection.set(undefined);\r\n this.tags.set([]);\r\n this.versionTags.set([]);\r\n } else {\r\n this.tags.set(result.chainTags.filter((t) => t.length > 0 && t !== 'v0'));\r\n this.updateVersionTags();\r\n }\r\n\r\n // reset step selection tracking when result changes\r\n this._stepSelectionDone.set(false);\r\n }\r\n\r\n private getNodeFeatures(id: number): Feature[] {\r\n if (!this.step()) {\r\n return [];\r\n }\r\n return (\r\n this.step()!.featureSet.nodeFeatures[this.step()!.outputTag + '_' + id] ||\r\n []\r\n );\r\n }\r\n\r\n private findNode(id: number): CharNode | null {\r\n if (!this.step()) {\r\n return null;\r\n }\r\n for (let key of Object.keys(this.result()!.taggedNodes)) {\r\n const node = this.result()!.taggedNodes[key].find((n) => n.id === id);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public onTextCharPick(event: BaseTextCharEvent): void {\r\n const features = this.getNodeFeatures(event.char.id);\r\n const node = this.findNode(event.char.id)!;\r\n this.selection.set(`${event.char.label} (${node.sourceTag})`);\r\n this.selectionFeatures.set([...features]);\r\n\r\n this.selectionRange.set({ at: event.char.id, run: 1 });\r\n }\r\n\r\n public onTextRangePick(range: BaseTextRange): void {\r\n if (range.run === 1) {\r\n // already handled by onStepCharPick\r\n return;\r\n }\r\n this.selection.set(range.at + '×' + range.run);\r\n this.selectionRange.set(range);\r\n const end = range.at + range.run;\r\n\r\n const features: Feature[] = [];\r\n const tagNodes = this.result()!.taggedNodes[this.tag.value!];\r\n\r\n for (let node of tagNodes) {\r\n // if in range, intersect features\r\n if (node.id >= range.at && node.id < end) {\r\n const nodeFeatures = this.getNodeFeatures(node.id);\r\n\r\n if (node.id === range.at) {\r\n for (let f of nodeFeatures) {\r\n features.push(f);\r\n }\r\n } else {\r\n // features = intersection of features and charFeatures\r\n features.splice(\r\n 0,\r\n features.length,\r\n ...features.filter((f) =>\r\n nodeFeatures.some((cf) => cf.name === f.name)\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.selectionFeatures.set(features);\r\n }\r\n\r\n public onStepChange(step?: ChainOperationContextStep): void {\r\n this.selectionFeatures.set([]);\r\n if (step) {\r\n // setting the tag will trigger the step change\r\n this.tag.setValue(step.outputTag);\r\n }\r\n }\r\n\r\n public pickRange(): void {\r\n if (this.selectionRange()) {\r\n this.rangePick.emit(this.selectionRange()!);\r\n }\r\n }\r\n}\r\n","@if (result()) {\r\n<div id=\"container\">\r\n <div id=\"bar\" class=\"form-row\">\r\n <!-- version -->\r\n @if (versionTags().length) {\r\n <mat-form-field>\r\n <mat-label>stage</mat-label>\r\n <mat-select [formControl]=\"versionTag\">\r\n <mat-option [value]=\"null\">-</mat-option>\r\n @for (t of versionTags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- tag -->\r\n @if (tags().length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- range picker -->\r\n @if (selectionRange()) {\r\n <div class=\"range\">\r\n {{ selectionRange()!.at }}×{{ selectionRange()!.run }}\r\n </div>\r\n @if (!disabledRangePick()) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Pick this range for the edited operation\"\r\n (click)=\"pickRange()\"\r\n [disabled]=\"disabledRangePick()\"\r\n >\r\n <mat-icon class=\"mat-warn\">file_open</mat-icon>\r\n </button>\r\n } }\r\n </div>\r\n\r\n <!-- step -->\r\n @if (step()) {\r\n <div id=\"step\">\r\n <!-- text -->\r\n <div id=\"text\">\r\n <gve-base-text-view\r\n [text]=\"result()!.taggedNodes[step()!.outputTag]\"\r\n [colorCallback]=\"getCharColor\"\r\n [hasLineNumber]=\"true\"\r\n (charPick)=\"onTextCharPick($event)\"\r\n (rangePick)=\"onTextRangePick($event)\"\r\n />\r\n </div>\r\n <!-- features -->\r\n <div id=\"feats\" class=\"form-row-top\">\r\n <div id=\"g-feats\">\r\n <div class=\"feat-header\">{{ step()!.outputTag }}</div>\r\n <gve-feature-set-view [features]=\"step()!.featureSet.features\" />\r\n </div>\r\n <div id=\"n-feats\">\r\n @if (selectionFeatures().length) {\r\n <div class=\"feat-header\">{{ selection() }}</div>\r\n <gve-feature-set-view [features]=\"selectionFeatures()\" />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- steps map -->\r\n <div id=\"map\">\r\n <gve-steps-map\r\n [steps]=\"result()!.steps\"\r\n [selectedStep]=\"step()\"\r\n (selectedStepChange)=\"onStepChange($event)\"\r\n />\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n model,\r\n OnInit,\r\n Optional,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharNode, PayloadMatDialogConfig } from '../../models';\r\nimport { GveBaseTextService } from '../../services/gve-base-text.service';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-text-editor`\r\n *\r\n * A component to edit a snapshot text. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `text` (`CharNode[]`): the text to edit.\r\n * - 🔥 `textChange` (`CharNode[]`): event emitted when text changes.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './snapshot-text-editor.component.html',\r\n styleUrl: './snapshot-text-editor.component.css',\r\n})\r\nexport class SnapshotTextEditorComponent implements OnInit {\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public readonly text = model<CharNode[]>([]);\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<SnapshotTextEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ text?: CharNode[] }>,\r\n ) {\r\n this.userText = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(5000)],\r\n });\r\n this.form = new FormGroup({\r\n userText: this.userText,\r\n });\r\n\r\n // when text changes, update the user text\r\n effect(() => {\r\n this.updateUserText(this.text());\r\n });\r\n }\r\n\r\n private updateUserText(nodes: CharNode[]): void {\r\n this.userText.setValue(nodes.map((node) => node.data).join(''));\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.text) {\r\n this.text.set(this.data.payload.text);\r\n }\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n\r\n public copyToClipboard(): void {\r\n const json = JSON.stringify(\r\n GveBaseTextService.stringToBaseChars(this.userText.value),\r\n );\r\n navigator.clipboard.writeText(json);\r\n this._snackbar.open('Copied JSON code to clipboard', undefined, { duration: 2000 });\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userText.setValue(this.userText.value.trim());\r\n if (!this.userText.value) {\r\n return;\r\n }\r\n this.text.set(GveBaseTextService.stringToBaseChars(this.userText.value));\r\n this.dialogRef?.close(this.text());\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Set Base Text</h2>\r\n </div>\r\n }\r\n <form [formGroup]=\"form\" (submit)=\"save()\">\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>base text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"8\"></textarea>\r\n @if (\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n ) {\r\n <mat-error>text required</mat-error>\r\n }\r\n @if (\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n ) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Copy JSON to clipboard\"\r\n [disabled]=\"form.invalid\"\r\n (click)=\"copyToClipboard()\"\r\n >\r\n JSON\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Set base text\"\r\n [disabled]=\"form.invalid\"\r\n (click)=\"save()\"\r\n >\r\n set\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n</div>\r\n","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDialog, MatDialogClose } from '@angular/material/dialog';\r\n\r\nimport { customAlphabet } from 'nanoid';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport {\r\n DEFAULT_SETTINGS,\r\n GveRenditionSettings,\r\n GveSnapshotRendition,\r\n} from '@myrmidon/gve-snapshot-rendition';\r\n\r\nimport {\r\n BaseTextViewComponent,\r\n BaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationEditorComponent,\r\n FeatureDefinitions,\r\n} from '../chain-operation-editor/chain-operation-editor.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChain,\r\n CharChainResult,\r\n GveApiService,\r\n} from '../../services/gve-api.service';\r\nimport { ChainResultViewComponent } from '../chain-result-view/chain-result-view.component';\r\nimport { BatchOperationEditorComponent } from '../batch-operation-editor/batch-operation-editor.component';\r\nimport { SnapshotTextEditorComponent } from '../snapshot-text-editor/snapshot-text-editor.component';\r\nimport { CharChainOperation, CharNode, Snapshot } from '../../models';\r\nimport { GveBaseTextService } from '../../services/gve-base-text.service';\r\n\r\n// default snapshot view title\r\nconst VIEW_TITLE = 'preview';\r\n\r\n// suffix for IDs of SVG elements to be made transparent at first rendition\r\nconst SVG_TRANSP_SUFFIX = '_t';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-editor`\r\n *\r\n * A component to edit a text snapshot. This is the top level component in the GVE core\r\n * library.\r\n *\r\n * - ▶️ `snapshot` (`Snapshot`): the snapshot to edit.\r\n * - ▶️ `batchOps` (`string`): the batch operations text to set for the editor.\r\n * - ▶️ `noSave` (`boolean`): true to disable saving.\r\n * - 🔥 `snapshotChange` (`Snapshot`): emitted when the user saves the edited snapshot.\r\n * - 🔥 `snapshotCancel` (`void`): emitted when the user cancels the snapshot editing.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-editor',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatSliderModule,\r\n MatSlideToggle,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ChainOperationEditorComponent,\r\n ChainResultViewComponent,\r\n BaseTextViewComponent,\r\n FlatLookupPipe,\r\n MatDialogClose\r\n],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './snapshot-editor.component.html',\r\n styleUrl: './snapshot-editor.component.css',\r\n})\r\nexport class SnapshotEditorComponent {\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _previewing?: boolean;\r\n private _stepPickFrozen?: boolean;\r\n\r\n /**\r\n * Reference to the snapshot rendition web component.\r\n * Using viewChild signal to handle conditionally rendered element -\r\n * the element only exists when result() is truthy.\r\n */\r\n public readonly renditionRef =\r\n viewChild<ElementRef<GveSnapshotRendition>>('rendition');\r\n\r\n /**\r\n * The snapshot to edit.\r\n */\r\n public readonly snapshot = model<Snapshot | undefined>();\r\n\r\n /**\r\n * The batch operations text to set for the editor.\r\n */\r\n public readonly batchOps = input<string | undefined>();\r\n\r\n /**\r\n * True to disable saving.\r\n */\r\n public readonly noSave = input<boolean | undefined>();\r\n\r\n /**\r\n * True to enable debug mode for view rendition.\r\n */\r\n public readonly debug = input<boolean | undefined>();\r\n\r\n /**\r\n * True to not show character decoration according to the trace\r\n * features in nodes.\r\n */\r\n public readonly noDecoration = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it. Passed down to feature editors.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Settings for rendering the snapshot. These are passed to the snapshot rendition\r\n * component.\r\n */\r\n public readonly renditionSettings =\r\n input<GveRenditionSettings>(DEFAULT_SETTINGS);\r\n\r\n /**\r\n * Emitted when the user cancels the snapshot editing.\r\n */\r\n public readonly snapshotCancel = output();\r\n\r\n // base text\r\n public baseText: FormControl<CharNode[]>;\r\n // operations\r\n public operations: FormControl<CharChainOperation[]>;\r\n public form: FormGroup;\r\n\r\n public readonly featDetails: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true },\r\n );\r\n public readonly autoRun: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true },\r\n );\r\n\r\n public readonly chain = signal<CharChain | undefined>(undefined);\r\n\r\n // the currently picked base text range\r\n public readonly textRange = signal<BaseTextRange | undefined>(undefined);\r\n // the lines count for the current base text\r\n public readonly lineCount = signal<number>(0);\r\n // the currently edited operation\r\n public readonly editedOp = signal<CharChainOperation | undefined>(undefined);\r\n public readonly editedOpIndex = signal<number>(-1);\r\n // the patch to apply to the edited operation's range\r\n public readonly editedOpRangePatch = signal<BaseTextRange | undefined>(\r\n undefined,\r\n );\r\n\r\n public readonly busy = signal<boolean>(false);\r\n\r\n public readonly opTypeMap = {\r\n 0: 'replace',\r\n 1: 'delete',\r\n 2: 'add-before',\r\n 3: 'add-after',\r\n 4: 'move-before',\r\n 5: 'move-after',\r\n 6: 'swap',\r\n 7: 'annotate',\r\n };\r\n\r\n // operations execution result\r\n public readonly result = signal<CharChainResult | undefined>(undefined);\r\n public readonly resultOperationId = signal<string | undefined>(undefined);\r\n public readonly initialStepIndex = signal<number>(-1);\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n private _dialog: MatDialog,\r\n private _dialogService: DialogService,\r\n private _snackbar: MatSnackBar,\r\n ) {\r\n // base text\r\n this.baseText = new FormControl<CharNode[]>([], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n });\r\n // operations\r\n this.operations = new FormControl<CharChainOperation[]>([], {\r\n nonNullable: true,\r\n });\r\n\r\n // form\r\n this.form = formBuilder.group({\r\n baseText: this.baseText,\r\n operations: this.operations,\r\n });\r\n\r\n // when snapshot changes, update the form\r\n effect(() => {\r\n this.updateForm(this.snapshot());\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n });\r\n\r\n // when rendition element becomes available (conditionally rendered),\r\n // initialize its settings and event listeners\r\n effect(() => {\r\n const rendition = this.renditionRef()?.nativeElement;\r\n if (rendition) {\r\n this.initRendition(rendition);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initialize rendition settings and event listeners when the element becomes available.\r\n * Called via effect since the element is conditionally rendered.\r\n */\r\n private initRendition(rendition: GveSnapshotRendition): void {\r\n console.log('GveSnapshotRendition.version:', GveSnapshotRendition.version);\r\n\r\n // set initial settings\r\n this.applyRenditionSettings();\r\n\r\n // listen to version change events\r\n rendition.addEventListener('versionTagChange', (event: Event) => {\r\n const customEvent = event as CustomEvent;\r\n console.log('Version changed:', customEvent.detail);\r\n });\r\n }\r\n\r\n /**\r\n * Apply settings to the rendition component.\r\n */\r\n private applyRenditionSettings(): void {\r\n const rendition = this.renditionRef()?.nativeElement;\r\n if (!rendition) {\r\n return;\r\n }\r\n\r\n const settings = this.renditionSettings();\r\n settings.debug = this.debug() || false;\r\n rendition.settings = settings as GveRenditionSettings;\r\n }\r\n\r\n /**\r\n * Update the snapshot rendition component with the current result data.\r\n */\r\n private updateRendition(): void {\r\n const rendition = this.renditionRef()?.nativeElement;\r\n const result = this.result();\r\n if (rendition && result) {\r\n // update settings with latest rendition settings\r\n this.applyRenditionSettings();\r\n // supply the base text (not returned by API, must be provided by caller)\r\n result.text = this.baseText.value;\r\n // set data\r\n rendition.data = result;\r\n }\r\n }\r\n\r\n /**\r\n * Set the view data for the snapshot view.\r\n *\r\n * @param snapshot The optional snapshot data to use. If not provided,\r\n * a snapshot will be created from the form data.\r\n * @param title The optional title to set for the view.\r\n */\r\n private setViewData(snapshot?: Snapshot, title = VIEW_TITLE): void {\r\n console.log('set view data');\r\n\r\n // get the snapshot to use\r\n if (!snapshot) {\r\n snapshot = this.getSnapshot();\r\n }\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\r\n this.initialStepIndex.set(-1);\r\n\r\n if (!snapshot) {\r\n this.form.reset();\r\n } else {\r\n if (Array.isArray(snapshot.text)) {\r\n this.baseText.setValue(snapshot.text);\r\n } else {\r\n this.baseText.setValue(\r\n GveBaseTextService.stringToBaseChars(snapshot.text),\r\n );\r\n }\r\n this.operations.setValue(snapshot.operations);\r\n }\r\n this.updateLineCount(this.baseText.value);\r\n\r\n this.form.markAsPristine();\r\n }\r\n\r\n // #region base text\r\n public inputBaseText(): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(SnapshotTextEditorComponent, {\r\n data: { payload: { text: [...this.baseText.value] } },\r\n width: '80%',\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((text: CharNode[]) => {\r\n if (text?.length) {\r\n // update the form control and reset the current text range\r\n this.baseText.setValue(text);\r\n this.baseText.updateValueAndValidity();\r\n this.baseText.markAsDirty();\r\n this.textRange.set(undefined);\r\n\r\n // update the line count\r\n this.updateLineCount(text);\r\n\r\n // remove all operations and update the view data\r\n this.removeAllOperations();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the line count based on the received text.\r\n * @param text The text to use for counting lines.\r\n */\r\n private updateLineCount(text: CharNode[]) {\r\n if (!text.length) {\r\n this.lineCount.set(0);\r\n } else {\r\n this.lineCount.set(text.filter((c) => c.data === '\\n').length + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by the base text editor to pick a text range.\r\n * @param range The picked range.\r\n * @param applyToOp True to also apply the picked range to the edited operation.\r\n */\r\n public onRangePick(range?: BaseTextRange, applyToOp = false): void {\r\n this.textRange.set(range);\r\n\r\n if (applyToOp) {\r\n this.editedOpRangePatch.set({ ...range } as BaseTextRange);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region operations\r\n /**\r\n * Edit a new operation.\r\n */\r\n public editNewOperation() {\r\n // create a new operation and edit it, using as the initial range\r\n // the base text range if any\r\n const range = this.textRange();\r\n\r\n this.editedOp.set({\r\n id: this._nanoid(),\r\n type: 0,\r\n at: range?.at || 0,\r\n run: range?.run || 1,\r\n });\r\n this.editedOpIndex.set(-1);\r\n }\r\n\r\n /**\r\n * Edit (a copy of) the operation at the specified index.\r\n * @param index The operation index.\r\n */\r\n public editOperation(index: number) {\r\n this.editedOpIndex.set(index);\r\n this.editedOp.set(structuredClone(this.operations.value[index]));\r\n }\r\n\r\n /**\r\n * Close the currently edited operation.\r\n */\r\n private closeEditedOperation() {\r\n this.editedOpIndex.set(-1);\r\n this.editedOp.set(undefined);\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to cancel\r\n * the current operation edits.\r\n */\r\n public onOperationCancel() {\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to change\r\n * the currently edited operation, or add a new one if that\r\n * was a new operation.\r\n * @param op The changed operation.\r\n */\r\n public onOperationChange(op?: CharChainOperation | null) {\r\n if (!op) {\r\n return;\r\n }\r\n console.log('operation change');\r\n const operations = [...this.operations.value];\r\n\r\n // replace or add the operation\r\n let i = this.editedOpIndex();\r\n if (this.editedOpIndex() > -1) {\r\n operations.splice(this.editedOpIndex(), 1, op);\r\n } else {\r\n operations.push(op);\r\n i = operations.length - 1;\r\n }\r\n\r\n // update the operations form control\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // run to the edited operation if auto-run is enabled\r\n if (this.autoRun.value) {\r\n this.runTo(i);\r\n }\r\n\r\n // close the edited operation\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Delete the operation at the specified index.\r\n * @param index The index of the operation to delete.\r\n */\r\n public deleteOperation(index: number) {\r\n this._dialogService\r\n .confirm(\r\n 'Confirm Deletion',\r\n `Delete operation \"${this.operations.value[index].id}\"?`,\r\n )\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n // close the edited operation if it is the one being deleted\r\n if (this.editedOpIndex() === index) {\r\n this.closeEditedOperation();\r\n }\r\n // reset the result operation ID if it is the one being deleted\r\n if (this.resultOperationId() === this.operations.value[index].id) {\r\n this.resultOperationId.set(undefined);\r\n }\r\n // delete the operation and update the form control\r\n const operations = [...this.operations.value];\r\n operations.splice(index, 1);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Duplicate the operation at the specified index, inserting the copy\r\n * immediately after the original.\r\n * @param index The index of the operation to duplicate.\r\n */\r\n public duplicateOperation(index: number): void {\r\n const operations = [...this.operations.value];\r\n const clone = structuredClone(operations[index]);\r\n clone.id = this._nanoid();\r\n operations.splice(index + 1, 0, clone);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Move the operation at the specified index up by one position.\r\n * @param index The index of the operation to move up.\r\n */\r\n public moveOperationUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const operations = [...this.operations.value];\r\n const op = operations.splice(index, 1)[0];\r\n operations.splice(index - 1, 0, op);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Move the operation at the specified index down by one position.\r\n * @param index The index of the operation to move down.\r\n */\r\n public moveOperationDown(index: number): void {\r\n const operations = [...this.operations.value];\r\n if (index >= operations.length - 1) {\r\n return;\r\n }\r\n const op = operations.splice(index, 1)[0];\r\n operations.splice(index + 1, 0, op);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n }\r\n\r\n public copyOperationsJson() {\r\n const json = JSON.stringify(this.operations.value, null, 2);\r\n navigator.clipboard.writeText(json).then(() => {\r\n this._snackbar.open('Operations JSON copied to clipboard', 'OK', {\r\n duration: 3000,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Parse the operations from their text and append them to the current\r\n * snapshot operations.\r\n */\r\n public parseOperations() {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(BatchOperationEditorComponent, {\r\n data: { preset: this.batchOps },\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((batchOps: CharChainOperation[]) => {\r\n if (batchOps) {\r\n const operations = [...this.operations.value];\r\n operations.push(...batchOps);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove all the operations, close the edited operation and update the view data.\r\n */\r\n private removeAllOperations(): void {\r\n this.resultOperationId.set(undefined);\r\n this.closeEditedOperation();\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.setViewData();\r\n this.result.set(undefined);\r\n }\r\n\r\n /**\r\n * Remove all the operations.\r\n */\r\n public clearOperations(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Remove all operations?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.removeAllOperations();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Parse all the id attributes from the received SVG code and\r\n * return them as an array.\r\n *\r\n * @param svg The SVG content to parse or undefined.\r\n * @returns Array of IDs found in the SVG content or undefined.\r\n */\r\n private parseSvgIds(svg?: string): string[] | undefined {\r\n if (!svg) {\r\n return undefined;\r\n }\r\n\r\n const regex = /<[^>]+\\bid=([\"'])(.*?)\\1/g;\r\n const ids: string[] = [];\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(svg)) !== null) {\r\n ids.push(match[2]);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n private getTransparentIds(g?: string): string[] | undefined {\r\n if (!g) {\r\n return undefined;\r\n }\r\n return this.parseSvgIds(g)?.filter((id) => id.endsWith(SVG_TRANSP_SUFFIX));\r\n }\r\n\r\n /**\r\n * Supply operation nodes to the snapshot text nodes. An execution result is\r\n * a compact object, so that to build a snapshot accumulating all the nodes\r\n * and their features up to the last executed operation, we need to start\r\n * with the base text nodes, and then examine each execution step in the\r\n * result. Each step contains only those nodes used by the version of the\r\n * text corresponding to its stage. Among them, some are new nodes, and some\r\n * are base text nodes. Also, the step contains the full set of features\r\n * current at its time, both for the text as a whole and for each node.\r\n * This method accumulates the nodes and their features up to the specified\r\n * step, updating the features of the nodes already present in the snapshot\r\n * text nodes, and adding the new nodes.\r\n *\r\n * @param snapshot The snapshot to supply the nodes to.\r\n * @param result The operations execution result.\r\n * @param tag The output tag of the operation to supply the nodes from.\r\n */\r\n private supplyOpNodes(\r\n snapshot: Snapshot,\r\n result: CharChainResult,\r\n tag: string,\r\n ): void {\r\n // get the original nodes from the snapshot base text\r\n const nodes = snapshot.text as CharNode[];\r\n\r\n // find the max ID in the original nodes, so that any ID greater than it\r\n // belongs to new nodes\r\n const maxOriginalId = nodes.reduce((max, n) => Math.max(max, n.id), 0);\r\n const stepIndex = result.steps.findIndex((s) => s.outputTag === tag);\r\n\r\n // for each step up to the specified one, add the nodes introduced by the step\r\n // and update the features from each step node that is already present\r\n for (let i = 0; i <= stepIndex; i++) {\r\n // get the nodes of the step\r\n const stepNodes = result.taggedNodes[result.steps[i].outputTag];\r\n\r\n for (const stepNode of stepNodes) {\r\n // if the node was added, add it\r\n if (\r\n stepNode.id > maxOriginalId &&\r\n !nodes.find((n) => n.id === stepNode.id)\r\n ) {\r\n nodes.push(stepNode);\r\n } else {\r\n // if the node was already in the original nodes, update its features\r\n const existing = nodes.findIndex((n) => n.id === stepNode.id);\r\n if (existing > -1) {\r\n nodes[existing].features = stepNode.features;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // update the snapshot text nodes\r\n snapshot.text = nodes;\r\n }\r\n\r\n /**\r\n * Run the operations up to the specified index (included).\r\n * This is called when:\r\n * - a preview is requested by the operation editor.\r\n * - the currently edited operation is saved.\r\n * - the user picks a step in the chain result view.\r\n * - runToLast is called, which happens when:\r\n * - setting the snapshot.\r\n * - parsing a batch of operations.\r\n * - deleting an operation.\r\n *\r\n * @param index The index of the operation to run to.\r\n * @param lastOperation The operation to use in place of the existing\r\n * operation in the snapshot at index. This is used when previewing\r\n * the edited operation from within the operation editor.\r\n * @returns A promise that resolves to the execution result.\r\n */\r\n public runTo(index: number, lastOperation?: CharChainOperation): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n console.log('run to: ' + index);\r\n\r\n // get the snapshot to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n\r\n // remove from the snapshot the operations past the specified index,\r\n // also replacing the last operation when this was received as a parameter\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n lastOperation = snapshot.operations[index];\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n\r\n // update result operation ID\r\n this.resultOperationId.set(snapshot.operations[index].id);\r\n\r\n // run the operations\r\n this.busy.set(true);\r\n this.initialStepIndex.set(index);\r\n this._api\r\n .runOperations(snapshot.text as CharNode[], snapshot.operations)\r\n .subscribe({\r\n next: (wrapper) => {\r\n // handle operation (non-fatal) error or result\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n return;\r\n }\r\n\r\n // set the result\r\n console.log('result:', wrapper.result);\r\n this.result.set(wrapper.result);\r\n\r\n // update the rendition component\r\n this.updateRendition();\r\n\r\n // supply the last operation output tag from its result step if not set\r\n if (!lastOperation.outputTag) {\r\n const step = wrapper.result!.steps.find(\r\n (s) => s.operation.id === lastOperation.id,\r\n );\r\n lastOperation.outputTag = step!.outputTag;\r\n }\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(\r\n snapshot,\r\n wrapper.result!,\r\n lastOperation.outputTag,\r\n );\r\n\r\n // update the view data\r\n this.setViewData(snapshot, lastOperation!.outputTag);\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Run the operations up to the last operation if any, updating the\r\n * execution result. The execution result is always the result from\r\n * all the operations, as users must be able to browse across its steps.\r\n */\r\n public runToLast(): void {\r\n if (this.operations.value.length) {\r\n this.runTo(this.operations.value.length - 1);\r\n } else {\r\n this.setViewData();\r\n this.result.set(undefined);\r\n }\r\n }\r\n\r\n /**\r\n * Update the snapshot view by running the operations up to the\r\n * currently edited operation if any.\r\n *\r\n * @param operation The operation being previewed.\r\n */\r\n public onOperationPreview(operation: CharChainOperation): void {\r\n // no multiple previews or previewing a new operation or auto-run disabled\r\n if (this._previewing || this.editedOpIndex() < 0 || !this.autoRun.value) {\r\n return;\r\n }\r\n this._previewing = true;\r\n setTimeout(() => {\r\n this.runTo(this.editedOpIndex(), operation);\r\n this._previewing = false;\r\n }, 0);\r\n }\r\n // #endregion\r\n\r\n /**\r\n * Handle the event fired by the chain result view to pick a step.\r\n *\r\n * @param step The step to pick.\r\n */\r\n public onStepPick(step: ChainOperationContextStep): void {\r\n const result = this.result();\r\n if (!result || this._stepPickFrozen) {\r\n return;\r\n }\r\n\r\n // get base text snapshot\r\n const snapshot = this.getSnapshot();\r\n\r\n // get the step index\r\n const index = snapshot.operations.findIndex(\r\n (o) => o.id === step.operation.id,\r\n );\r\n\r\n // remove snapshot operations after the picked step to avoid\r\n // their visuals creep into the snapshot view\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n\r\n // update result operation ID\r\n this.resultOperationId.set(snapshot.operations[index].id);\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(snapshot, result, step.outputTag);\r\n\r\n // update the view data\r\n this.setViewData(snapshot, step.outputTag);\r\n }\r\n\r\n /**\r\n * Emit the cancel event for this snapshot edit.\r\n */\r\n public close(): void {\r\n this.snapshotCancel.emit();\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data.\r\n *\r\n * @returns New snapshot object.\r\n */\r\n private getSnapshot(): Snapshot {\r\n const snapshot: Snapshot = {\r\n // snapshot nodes might be changed, so we copy them\r\n // to avoid changing the original snapshot\r\n text: structuredClone(this.baseText.value),\r\n operations: structuredClone(this.operations.value),\r\n };\r\n\r\n return snapshot;\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data and emit it\r\n * in the snapshot change event.\r\n */\r\n public save(): void {\r\n if (this.form.invalid || this.noSave()) {\r\n return;\r\n }\r\n this.snapshot.set(this.getSnapshot());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>article</mat-icon> <span class=\"label\">text</span>\r\n </ng-template>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <!-- base text -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"mat-warn\"\r\n matTooltip=\"Enter base text\"\r\n (click)=\"inputBaseText()\"\r\n [disabled]=\"busy()\"\r\n >\r\n <mat-icon>edit</mat-icon> base text\r\n </button>\r\n\r\n @if (textRange()) {\r\n <span id=\"text-range\"\r\n >{{ textRange()!.at }}×{{ textRange()!.run }}</span\r\n >\r\n }\r\n </div>\r\n\r\n <!-- text characters -->\r\n <gve-base-text-view\r\n [text]=\"baseText.value\"\r\n [hasLineNumber]=\"true\"\r\n (rangePick)=\"onRangePick($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>edit</mat-icon> <span class=\"label\">operations</span>\r\n </ng-template>\r\n\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- feat details -->\r\n <mat-slide-toggle\r\n [formControl]=\"featDetails\"\r\n matTooltip=\"Toggle feature details\"\r\n >feat. details</mat-slide-toggle\r\n >\r\n <!-- auto run on edit -->\r\n <mat-slide-toggle\r\n [formControl]=\"autoRun\"\r\n matTooltip=\"Auto-run operations on edit\"\r\n >auto-run</mat-slide-toggle\r\n >\r\n\r\n <div class=\"form-row right\">\r\n <!-- copy ops JSON -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy operations as JSON to clipboard\"\r\n [disabled]=\"!operations.value.length || busy()\"\r\n (click)=\"copyOperationsJson()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n\r\n <!-- remove ops -->\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy()\"\r\n (click)=\"clearOperations()\"\r\n >\r\n <mat-icon>delete_forever</mat-icon> clear\r\n </button>\r\n\r\n <!-- batch add ops -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n matTooltip=\"Add a batch of operations\"\r\n class=\"mat-primary\"\r\n [disabled]=\"busy()\"\r\n (click)=\"parseOperations()\"\r\n >\r\n <mat-icon>post_add</mat-icon> batch\r\n </button>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n matTooltip=\"Add a new operation\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th>nr.</th>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (\r\n operation of operations.value;\r\n track operation.id;\r\n let index = $index\r\n ) {\r\n <tr\r\n [class.selected]=\"operation.id === resultOperationId()\"\r\n [class.edited]=\"operation.id === editedOp()?.id\"\r\n >\r\n <td class=\"fit-width\">{{ index + 1 }}.</td>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n <!-- duplicate -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"duplicateOperation(index)\"\r\n matTooltip=\"Duplicate operation\"\r\n >\r\n <mat-icon>control_point_duplicate</mat-icon>\r\n </button>\r\n <!-- move up -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"moveOperationUp(index)\"\r\n matTooltip=\"Move operation up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- move down -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"moveOperationDown(index)\"\r\n matTooltip=\"Move operation down\"\r\n [disabled]=\"index === operations.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup: opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>\r\n @if (operation.features?.length) {\r\n @if (featDetails.value) {\r\n <div class=\"form-row\">\r\n @for (\r\n feat of operation.features;\r\n track $index;\r\n let i = $index\r\n ) {\r\n <div class=\"feature\">\r\n <span class=\"fname\">{{\r\n feat.name\r\n | flatLookup\r\n : featureDefs()?.names\r\n : \"id\"\r\n : \"label\"\r\n }}</span\r\n >=<span class=\"fvalue\">{{\r\n feat.value\r\n | flatLookup\r\n : featureDefs()?.values?.[feat.name]\r\n : \"id\"\r\n : \"label\"\r\n }}</span>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n {{ operation.features?.length }}\r\n }\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n @if (editedOp()) {\r\n <mat-expansion-panel\r\n [expanded]=\"editedOp()\"\r\n [disabled]=\"!editedOp()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n >operation {{ editedOp()?.id }}</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [featureDefs]=\"featureDefs()\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n [hidePreview]=\"editedOpIndex() === -1\"\r\n [operation]=\"editedOp()\"\r\n [rangePatch]=\"editedOpRangePatch()\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- progress -->\r\n <div>\r\n @if (busy()) {\r\n <mat-progress-bar mode=\"indeterminate\" />\r\n }\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result()) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result()!\"\r\n [initialStepIndex]=\"initialStepIndex()\"\r\n [disabledRangePick]=\"editedOp() ? false : true\"\r\n (stepPick)=\"onStepPick($event)\"\r\n (rangePick)=\"onRangePick($event, true)\"\r\n />\r\n </fieldset>\r\n }\r\n\r\n <!-- snapshot view -->\r\n @if (result()) {\r\n <div id=\"preview\">\r\n <gve-snapshot-rendition #rendition class=\"rendition\">\r\n </gve-snapshot-rendition>\r\n </div>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave()) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n","import { Injectable } from '@angular/core';\r\nimport { CharChain, CharChainNode } from './gve-api.service';\r\n\r\n// You can use this online tool to visualize the graph:\r\n// https://dreampuf.github.io/GraphvizOnline\r\n// You can also append ?engine=dot#... where ... is the graphviz code.\r\n\r\n// https://graphviz.org/docs/attr-types/rankdir\r\nexport type GraphvizRankdir = 'TB' | 'LR' | 'BT' | 'RL';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveGraphvizService {\r\n private hashString(str: string): number {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n hash = hash & hash; // convert to 32bit integer\r\n }\r\n return Math.abs(hash);\r\n }\r\n\r\n private hslToRgb(hue: number, saturation: number, lightness: number): string {\r\n const chroma =\r\n ((1 - Math.abs((2 * lightness) / 100 - 1)) * saturation) / 100;\r\n const x = chroma * (1 - Math.abs(((hue / 60) % 2) - 1));\r\n const m = lightness / 100 - chroma / 2;\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n\r\n if (hue >= 0 && hue < 60) {\r\n r = chroma;\r\n g = x;\r\n } else if (hue >= 60 && hue < 120) {\r\n r = x;\r\n g = chroma;\r\n } else if (hue >= 120 && hue < 180) {\r\n g = chroma;\r\n b = x;\r\n } else if (hue >= 180 && hue < 240) {\r\n g = x;\r\n b = chroma;\r\n } else if (hue >= 240 && hue < 300) {\r\n r = x;\r\n b = chroma;\r\n } else if (hue >= 300 && hue < 360) {\r\n r = chroma;\r\n b = x;\r\n }\r\n\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\r\n }\r\n\r\n private getColorForTag(tag: string): string {\r\n const hash = this.hashString(tag);\r\n const hue = (hash * 137) % 360; // Use a prime number to spread out the hues\r\n const saturation = 60 + (hash % 40); // Saturation between 60% and 100%\r\n const lightness = 50 + (hash % 30); // Lightness between 50% and 80%\r\n return this.hslToRgb(hue, saturation, lightness);\r\n }\r\n\r\n private getExcludedNodeIds(chain: CharChain, tags?: string[]): Set<number> {\r\n // get only the desired links\r\n const links = chain.links.filter((link) =>\r\n tags ? tags.includes(link.tag) : true\r\n );\r\n // return all the nodes not referenced by the links\r\n const excluded = new Set<number>();\r\n chain.nodes.forEach((node) => {\r\n excluded.add(node.id);\r\n });\r\n links.forEach((link) => {\r\n excluded.delete(link.sourceId);\r\n excluded.delete(link.targetId);\r\n });\r\n return excluded;\r\n }\r\n\r\n /**\r\n * Represent the received chain as a Graphviz digraph.\r\n *\r\n * @param chain The source chain if any.\r\n * @param tags The tags to show. When set, only the links with these tags are shown.\r\n * @param rankdir The rank direction.\r\n * @returns Graphviz representation of the chain.\r\n */\r\n public generateGraph(\r\n chain?: CharChain,\r\n tags?: string[],\r\n rankdir: GraphvizRankdir = 'LR'\r\n ): string {\r\n if (!chain) {\r\n return 'digraph G {}';\r\n }\r\n\r\n const sb: string[] = [];\r\n const excludedNodeIds = this.getExcludedNodeIds(chain, tags);\r\n\r\n sb.push('digraph G {');\r\n sb.push(' bgcolor=transparent;');\r\n sb.push(' node [style=filled];');\r\n sb.push(` rankdir=${rankdir};`);\r\n chain.nodes.forEach((node) => {\r\n // note that in label we must escape the double quotes\r\n sb.push(\r\n ` ${node.id} [label=\"${node.label === '\"' ? '\"' : node.label}\"` +\r\n (node.sourceTag\r\n ? ` fillcolor=\"${this.getColorForTag(node.sourceTag)}\"`\r\n : '') +\r\n (node.sourceTag && excludedNodeIds.has(node.id)\r\n ? ` xlabel=\"${node.sourceTag}\"`\r\n : '') +\r\n '];'\r\n );\r\n });\r\n chain.links.forEach((link) => {\r\n if (\r\n !link.sourceId ||\r\n !link.targetId ||\r\n (tags && !tags.includes(link.tag))\r\n ) {\r\n return;\r\n }\r\n const color = this.getColorForTag(link.tag);\r\n sb.push(\r\n ` ${link.sourceId} -> ${link.targetId} [label=\"${link.tag}\", color=\"${color}\"];`\r\n );\r\n });\r\n sb.push('}');\r\n return sb.join('\\n');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of gve-core\r\n */\r\n\r\nexport * from './lib/models';\r\nexport * from './lib/components/base-text-char/base-text-char.component';\r\nexport * from './lib/components/base-text-editor/base-text-editor.component';\r\nexport * from './lib/components/base-text-view/base-text-view.component';\r\nexport * from './lib/components/batch-operation-editor/batch-operation-editor.component';\r\nexport * from './lib/components/chain-operation-editor/chain-operation-editor.component';\r\nexport * from './lib/components/chain-result-view/chain-result-view.component';\r\nexport * from './lib/components/feature-editor/feature-editor.component';\r\nexport * from './lib/components/feature-set-editor/feature-set-editor.component';\r\nexport * from './lib/components/feature-set-view/feature-set-view.component';\r\nexport * from './lib/components/operation-source-editor/operation-source-editor.component';\r\nexport * from './lib/components/snapshot-editor/snapshot-editor.component';\r\nexport * from './lib/components/snapshot-text-editor/snapshot-text-editor.component';\r\nexport * from './lib/components/steps-map/steps-map.component';\r\n\r\nexport * from './lib/services/gve-api.service';\r\nexport * from './lib/services/gve-base-text.service';\r\nexport * from './lib/services/gve-graphviz.service';\r\nexport * from './lib/services/settings.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i5","i6","i8","i7","i2","i4","debounceTime","i3.SettingsService","i9","i10","i11","i12","i13","i2.GveApiService"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/models.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-char/base-text-char.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-view/base-text-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-editor/feature-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-editor/feature-set-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-base-text.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/base-text-editor/base-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-api.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/batch-operation-editor/batch-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/operation-source-editor/operation-source-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/validators/svg-validators.ts","../../../../projects/myrmidon/gve-core/src/lib/services/settings.service.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-operation-editor/chain-operation-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/feature-set-view/feature-set-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/steps-map/steps-map.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/chain-result-view/chain-result-view.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-text-editor/snapshot-text-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/snapshot-editor/snapshot-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-graphviz.service.ts","../../../../projects/myrmidon/gve-core/src/public-api.ts","../../../../projects/myrmidon/gve-core/src/myrmidon-gve-core.ts"],"sourcesContent":["import { MatDialogConfig } from \"@angular/material/dialog\";\r\n\r\n//#region From GVE SNAPSHOT CORE\r\n/**\r\n * A labeled ID. This can be used when a feature is from a closed set,\r\n * and you want to provide localized or human-readable labels for the\r\n * possible values.\r\n */\r\nexport interface LabeledId {\r\n id: string;\r\n label: string;\r\n}\r\n\r\n/**\r\n * A generic tree node.\r\n */\r\nexport interface TreeNode<T> {\r\n label: string;\r\n payload?: T;\r\n parent?: TreeNode<T>;\r\n children?: TreeNode<T>[];\r\n isExpanded?: boolean;\r\n}\r\n\r\n/**\r\n * Generic name=value feature.\r\n */\r\nexport interface Feature {\r\n name: string;\r\n value: string;\r\n setPolicy: FeatureSetPolicy;\r\n}\r\n\r\n/**\r\n * Operation feature set policy.\r\n */\r\nexport enum FeatureSetPolicy {\r\n multiple = 0,\r\n single,\r\n singleFirst,\r\n}\r\n\r\n/**\r\n * Operation feature.\r\n */\r\nexport interface OperationFeature extends Feature {\r\n isNegated?: boolean;\r\n isGlobal?: boolean;\r\n isShortLived?: boolean;\r\n}\r\n\r\n/**\r\n * Source about a text variant. This is typically used when\r\n * variants come from different witnesses.\r\n */\r\nexport interface OperationSource {\r\n id: string;\r\n type: string;\r\n rank?: number;\r\n note?: string;\r\n}\r\n\r\n/**\r\n * Generic metadata about a text variant generation operation.\r\n */\r\nexport interface OperationMetadata {\r\n type: OperationType;\r\n id: string;\r\n rank?: number;\r\n groupId?: string;\r\n features?: OperationFeature[];\r\n sources?: OperationSource[];\r\n}\r\n\r\n/**\r\n * Type of a text operation.\r\n */\r\nexport enum OperationType {\r\n replace = 0,\r\n delete,\r\n addBefore,\r\n addAfter,\r\n moveBefore,\r\n moveAfter,\r\n swap,\r\n annotate,\r\n}\r\n\r\n/**\r\n * Metadata of a char-based chain operation.\r\n */\r\nexport interface CharChainOperation extends OperationMetadata {\r\n at: number;\r\n atAsIndex?: boolean;\r\n // to is for move and swap only\r\n to?: number;\r\n toAsIndex?: boolean;\r\n inputTag?: string;\r\n outputTag?: string;\r\n run: number;\r\n toRun?: number;\r\n value?: string;\r\n // from DTO\r\n noTraceFeautures?: boolean;\r\n dsl?: string;\r\n}\r\n\r\n/**\r\n * A single character node in an operation execution result.\r\n */\r\nexport interface CharNode {\r\n id: number;\r\n index: number;\r\n label: string;\r\n data: string;\r\n sourceTag?: string;\r\n features?: Feature[];\r\n}\r\n\r\n/**\r\n * A text snapshot, including the base text and the operations that\r\n * have been applied to it.\r\n */\r\nexport interface Snapshot {\r\n text: string | CharNode[];\r\n operations: CharChainOperation[];\r\n}\r\n//#endregion\r\n\r\n/**\r\n * API call result wrapper.\r\n */\r\nexport interface ResultWrapper<T> {\r\n result?: T;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * PayloadMatDialogConfig is a MatDialogConfig with a payload, used\r\n * to pass data of type T to a dialog.\r\n */\r\nexport interface PayloadMatDialogConfig<T> extends MatDialogConfig {\r\n payload?: T;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { ColorToContrastPipe } from '@myrmidon/ngx-tools';\r\n\r\n/**\r\n * A single character from a base text.\r\n */\r\nexport interface BaseTextChar {\r\n id: number;\r\n value: string;\r\n label: string;\r\n color: string;\r\n oldColor?: string;\r\n borderColor: string;\r\n oldBorderColor?: string;\r\n emSize: number;\r\n}\r\n\r\n/**\r\n * Event emitted by the base text character component when a character\r\n * is clicked.\r\n */\r\nexport interface BaseTextCharEvent {\r\n char: BaseTextChar;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-char`\r\n *\r\n * A component that displays a single character from a base text.\r\n * Used by `gve-base-text-view`.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-char',\r\n imports: [MatRippleModule, ColorToContrastPipe],\r\n templateUrl: './base-text-char.component.html',\r\n styleUrl: './base-text-char.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BaseTextCharComponent {\r\n /**\r\n * The character to display.\r\n */\r\n public readonly char = input<BaseTextChar | undefined>();\r\n\r\n /**\r\n * Emitted when the character is clicked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n public readonly defaultColor = '#D8D8D8';\r\n public readonly defaultBorderColor = '#D8D8D8';\r\n public readonly defaultEmSize = 1.5;\r\n\r\n public onCharClick(event: MouseEvent): void {\r\n this.charPick.emit({ char: this.char()!, event });\r\n }\r\n}\r\n","@if (char()) {\r\n<div matRipple id=\"container\" (click)=\"onCharClick($event)\">\r\n <div\r\n id=\"c-label\"\r\n [style.fontSize]=\"char()!.emSize + 'em'\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n >\r\n {{ char()!.label }}\r\n </div>\r\n <div\r\n id=\"c-id\"\r\n [style.fontSize]=\"char()!.emSize / 2 + 'em'\"\r\n [style.color]=\"char()!.color | colorToContrast\"\r\n [style.borderColor]=\"char()!.borderColor\"\r\n [style.backgroundColor]=\"char()!.color\"\r\n >\r\n {{ char()!.id }}\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { debounceTime, distinctUntilChanged, Subject } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Clipboard } from '@angular/cdk/clipboard';\r\n\r\nimport {\r\n BaseTextChar,\r\n BaseTextCharComponent,\r\n BaseTextCharEvent,\r\n} from '../base-text-char/base-text-char.component';\r\nimport { CharNode } from '../../models';\r\n\r\n/**\r\n * A range in the base text.\r\n */\r\nexport interface BaseTextRange {\r\n at: number;\r\n run: number;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-base-text-view`\r\n *\r\n * A component to display a selectable base text. Its input is either a string or an\r\n * array of `CharNode`'s. The base text is the starting text in a set of transformations,\r\n * and is represented as a sequence of characters with optional metadata.\r\n * This component allows users to view and select characters or ranges of characters.\r\n * Used by the chain result view component and the base text editor component.\r\n *\r\n * - ▶️ `defaultColor` (`string`): the default color for the text.\r\n * - ▶️ `colorCallback` (callback): an optional callback to get the color of a\r\n * character node.\r\n * - ▶️ `defaultBorderColor` (`string`): the default border color for the text.\r\n * - ▶️ `borderColorCallback` (callback): an optional callback to get the border color\r\n * of a character node.\r\n * - ▶️ `selectionColor` (`string`): the color for the selected text.\r\n * - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next\r\n * to each line.\r\n * - ▶️ `text` (`string` | `CharNode[]`): the text to display.\r\n * - 🔥 `charPick` (`BaseTextCharEvent`): emitted when a character is picked.\r\n * - 🔥 `rangePick` (`BaseTextRange`): emitted when a range is picked.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-view',\r\n imports: [\r\n FormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n BaseTextCharComponent,\r\n ],\r\n templateUrl: './base-text-view.component.html',\r\n styleUrl: './base-text-view.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BaseTextViewComponent implements OnInit {\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private readonly _clipboard = inject(Clipboard);\r\n private readonly _snackBar = inject(MatSnackBar);\r\n private readonly _searchSubject = new Subject<string>();\r\n private _lastSelectedPosition?: number;\r\n private _selectionAnchor?: number;\r\n\r\n /**\r\n * The default color for the text.\r\n */\r\n public readonly defaultColor = input('#DBDBDB');\r\n\r\n /**\r\n * The default border color for the text.\r\n */\r\n public readonly defaultBorderColor = input('#DBDBDB');\r\n\r\n /**\r\n * The color for the selected text.\r\n */\r\n public readonly selectionColor = input('#3E92CC');\r\n\r\n /**\r\n * The color for search match highlights.\r\n */\r\n public readonly searchHighlightColor = input('#FFD54F');\r\n\r\n /**\r\n * True if line numbers should be displayed next to each line.\r\n */\r\n public readonly hasLineNumber = input(false);\r\n\r\n /**\r\n * The search query entered in the toolbar.\r\n */\r\n public readonly searchQuery = signal('');\r\n\r\n /**\r\n * The positions of search matches (start and length pairs).\r\n */\r\n private readonly searchMatches = signal<{ start: number; length: number }[]>(\r\n [],\r\n );\r\n\r\n /**\r\n * The text to display.\r\n */\r\n public readonly text = input<CharNode[]>([]);\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly colorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * An optional callback to get the color of a character node.\r\n * Return null to use the default color.\r\n */\r\n public readonly borderColorCallback = input<\r\n ((node: CharNode) => string | null) | undefined\r\n >();\r\n\r\n /**\r\n * Emitted when a character is picked.\r\n */\r\n public readonly charPick = output<BaseTextCharEvent>();\r\n\r\n /**\r\n * Emitted when a range is picked. This is preceded by a character pick event.\r\n * The range is defined by the starting character and the number of characters.\r\n * The range is inclusive.\r\n */\r\n public readonly rangePick = output<BaseTextRange>();\r\n\r\n /**\r\n * The base characters organized by lines, computed from text input.\r\n */\r\n private readonly baseLines = computed(() => {\r\n return this.buildLines(\r\n this.text(),\r\n this.colorCallback(),\r\n this.borderColorCallback(),\r\n );\r\n });\r\n\r\n /**\r\n * Signal for tracking selected range state.\r\n */\r\n private readonly selectedRange = signal<{\r\n start: number;\r\n end: number;\r\n } | null>(null);\r\n\r\n /**\r\n * The lines with selection or search highlight state applied.\r\n * Search highlights take priority over selection when present.\r\n */\r\n public readonly lines = computed(() => {\r\n const base = this.baseLines();\r\n const range = this.selectedRange();\r\n const matches = this.searchMatches();\r\n\r\n // If there are search matches, highlight them instead of selection\r\n if (matches.length > 0) {\r\n let position = 0;\r\n return base.map((line) =>\r\n line.map((char) => {\r\n const currentPos = position++;\r\n const isMatch = matches.some(\r\n (m) => currentPos >= m.start && currentPos < m.start + m.length,\r\n );\r\n if (isMatch) {\r\n return {\r\n ...char,\r\n oldColor: char.oldColor || char.color,\r\n oldBorderColor: char.oldBorderColor || char.borderColor,\r\n color: this.searchHighlightColor(),\r\n borderColor: this.searchHighlightColor(),\r\n };\r\n }\r\n return char;\r\n }),\r\n );\r\n }\r\n\r\n // Otherwise, apply selection highlight if present\r\n if (!range) {\r\n return base;\r\n }\r\n\r\n const { start, end } = range;\r\n let position = 0;\r\n\r\n return base.map((line) =>\r\n line.map((char) => {\r\n const currentPos = position++;\r\n if (currentPos >= start && currentPos <= end) {\r\n return {\r\n ...char,\r\n oldColor: char.oldColor || char.color,\r\n oldBorderColor: char.oldBorderColor || char.borderColor,\r\n color: this.selectionColor(),\r\n borderColor: this.selectionColor(),\r\n };\r\n }\r\n return char;\r\n }),\r\n );\r\n });\r\n\r\n constructor() {\r\n // reset selection when text changes\r\n effect(() => {\r\n this.text();\r\n this._lastSelectedPosition = undefined;\r\n this._selectionAnchor = undefined;\r\n this.selectedRange.set(null);\r\n this.clearSearch();\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // Setup debounced search\r\n this._searchSubject\r\n .pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this._destroyRef),\r\n )\r\n .subscribe((query) => {\r\n this.performSearch(query);\r\n });\r\n }\r\n\r\n private buildLines(\r\n text: CharNode[],\r\n colorCallback?: (node: CharNode) => string | null,\r\n borderColorCallback?: (node: CharNode) => string | null,\r\n ): BaseTextChar[][] {\r\n if (!text || text.length === 0) {\r\n return [];\r\n }\r\n\r\n const newLines: BaseTextChar[][] = [];\r\n newLines.push([]);\r\n\r\n const nodes = text as CharNode[];\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const char: BaseTextChar = {\r\n id: nodes[i].id,\r\n value: nodes[i].data,\r\n label: nodes[i].label,\r\n color: colorCallback\r\n ? colorCallback(nodes[i]) || this.defaultColor()\r\n : this.defaultColor(),\r\n borderColor: borderColorCallback\r\n ? borderColorCallback(nodes[i]) || this.defaultBorderColor()\r\n : this.defaultBorderColor(),\r\n emSize: 1.5,\r\n };\r\n char.oldColor = char.color;\r\n char.oldBorderColor = char.borderColor;\r\n\r\n newLines[newLines.length - 1].push(char);\r\n\r\n if (char.value === '\\n') {\r\n newLines.push([]);\r\n }\r\n }\r\n\r\n return newLines;\r\n }\r\n\r\n public onCharPick(event: BaseTextCharEvent): void {\r\n // guard against null/undefined event.char\r\n if (!event?.char) {\r\n return;\r\n }\r\n\r\n // find the position of the clicked character in the flat array\r\n const clickedPosition = this.findCharPosition(event.char.id);\r\n if (clickedPosition === -1) {\r\n return; // character not found\r\n }\r\n\r\n // calculate selection state\r\n const isRangeSelection =\r\n this._lastSelectedPosition !== undefined &&\r\n this._lastSelectedPosition !== clickedPosition &&\r\n event.event?.ctrlKey;\r\n\r\n let rangeToEmit: BaseTextRange;\r\n\r\n if (isRangeSelection && this._lastSelectedPosition !== undefined) {\r\n // range selection: use positions, not IDs\r\n const minPos = Math.min(this._lastSelectedPosition, clickedPosition);\r\n const maxPos = Math.max(this._lastSelectedPosition, clickedPosition);\r\n\r\n // update selection range\r\n this.selectedRange.set({ start: minPos, end: maxPos });\r\n\r\n // emit range based on the first character's ID at minPos and the count\r\n const firstCharId = this.getCharIdAtPosition(minPos);\r\n rangeToEmit = { at: firstCharId, run: maxPos - minPos + 1 };\r\n } else {\r\n // single character selection\r\n this.selectedRange.set({ start: clickedPosition, end: clickedPosition });\r\n\r\n // update last selected character and position, and set anchor for keyboard navigation\r\n this._lastSelectedPosition = clickedPosition;\r\n this._selectionAnchor = clickedPosition;\r\n\r\n rangeToEmit = { at: event.char.id, run: 1 };\r\n }\r\n\r\n // emit events last, after all internal state is updated\r\n this.charPick.emit(event);\r\n this.rangePick.emit(rangeToEmit);\r\n }\r\n\r\n /**\r\n * Find the position (index in flat array) of a character by its ID.\r\n * Returns -1 if not found.\r\n */\r\n private findCharPosition(charId: number): number {\r\n const baseLines = this.baseLines();\r\n let position = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (char.id === charId) {\r\n return position;\r\n }\r\n position++;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Get the character ID at a specific position in the flat array.\r\n * Returns the ID or -1 if position is out of bounds.\r\n */\r\n private getCharIdAtPosition(position: number): number {\r\n const baseLines = this.baseLines();\r\n let currentPos = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (currentPos === position) {\r\n return char.id;\r\n }\r\n currentPos++;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * Handle search input changes and trigger debounced search.\r\n */\r\n public onSearchInput(query: string): void {\r\n this.searchQuery.set(query);\r\n this._searchSubject.next(query);\r\n }\r\n\r\n /**\r\n * Perform the actual search and update match positions.\r\n */\r\n private performSearch(query: string): void {\r\n if (!query || query.length === 0) {\r\n this.searchMatches.set([]);\r\n return;\r\n }\r\n\r\n const text = this.text();\r\n if (!text || text.length === 0) {\r\n this.searchMatches.set([]);\r\n return;\r\n }\r\n\r\n // Build the full text string from CharNodes\r\n const fullText = text.map((node) => node.data).join('');\r\n\r\n // Find all matches (case-insensitive)\r\n const matches: { start: number; length: number }[] = [];\r\n const lowerQuery = query.toLowerCase();\r\n const lowerText = fullText.toLowerCase();\r\n let startIndex = 0;\r\n\r\n while (startIndex < lowerText.length) {\r\n const index = lowerText.indexOf(lowerQuery, startIndex);\r\n if (index === -1) {\r\n break;\r\n }\r\n matches.push({ start: index, length: query.length });\r\n startIndex = index + 1;\r\n }\r\n\r\n this.searchMatches.set(matches);\r\n }\r\n\r\n /**\r\n * Clear the search query and remove search highlights.\r\n */\r\n public clearSearch(): void {\r\n this.searchQuery.set('');\r\n this.searchMatches.set([]);\r\n }\r\n\r\n /**\r\n * Get the total number of characters in the text.\r\n */\r\n private getTotalCharCount(): number {\r\n return this.text().length;\r\n }\r\n\r\n /**\r\n * Get the character at a specific position.\r\n */\r\n private getCharAtPosition(position: number): BaseTextChar | null {\r\n const baseLines = this.baseLines();\r\n let currentPos = 0;\r\n\r\n for (const line of baseLines) {\r\n for (const char of line) {\r\n if (currentPos === position) {\r\n return char;\r\n }\r\n currentPos++;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Handle keyboard events for arrow key navigation.\r\n * - Left/Right: Move single selection to previous/next character\r\n * - Shift+Left/Right: Extend selection range\r\n */\r\n public onKeyDown(event: KeyboardEvent): void {\r\n const range = this.selectedRange();\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const totalChars = this.getTotalCharCount();\r\n if (totalChars === 0) {\r\n return;\r\n }\r\n\r\n let newStart: number = range.start;\r\n let newEnd: number = range.end;\r\n let handled = false;\r\n\r\n if (event.key === 'ArrowLeft') {\r\n if (event.shiftKey) {\r\n // Shift+Left: extend selection to the left from anchor\r\n if (this._selectionAnchor === undefined) {\r\n this._selectionAnchor = range.start;\r\n }\r\n // Determine which end to move based on anchor position\r\n if (range.end === this._selectionAnchor) {\r\n // Moving start to the left\r\n newStart = Math.max(0, range.start - 1);\r\n newEnd = range.end;\r\n } else {\r\n // Shrinking from right toward anchor, or extending left past anchor\r\n if (range.end > this._selectionAnchor) {\r\n // Shrink from right\r\n newStart = range.start;\r\n newEnd = range.end - 1;\r\n } else {\r\n // Extend left\r\n newStart = Math.max(0, range.start - 1);\r\n newEnd = range.end;\r\n }\r\n }\r\n handled = true;\r\n } else {\r\n // Left without shift: move to single selection one position left\r\n const currentPos = range.start;\r\n const newPos = Math.max(0, currentPos - 1);\r\n newStart = newPos;\r\n newEnd = newPos;\r\n this._selectionAnchor = newPos;\r\n this._lastSelectedPosition = newPos;\r\n handled = true;\r\n }\r\n } else if (event.key === 'ArrowRight') {\r\n if (event.shiftKey) {\r\n // Shift+Right: extend selection to the right from anchor\r\n if (this._selectionAnchor === undefined) {\r\n this._selectionAnchor = range.start;\r\n }\r\n // Determine which end to move based on anchor position\r\n if (range.start === this._selectionAnchor) {\r\n // Moving end to the right\r\n newStart = range.start;\r\n newEnd = Math.min(totalChars - 1, range.end + 1);\r\n } else {\r\n // Shrinking from left toward anchor, or extending right past anchor\r\n if (range.start < this._selectionAnchor) {\r\n // Shrink from left\r\n newStart = range.start + 1;\r\n newEnd = range.end;\r\n } else {\r\n // Extend right\r\n newStart = range.start;\r\n newEnd = Math.min(totalChars - 1, range.end + 1);\r\n }\r\n }\r\n handled = true;\r\n } else {\r\n // Right without shift: move to single selection one position right\r\n const currentPos = range.end;\r\n const newPos = Math.min(totalChars - 1, currentPos + 1);\r\n newStart = newPos;\r\n newEnd = newPos;\r\n this._selectionAnchor = newPos;\r\n this._lastSelectedPosition = newPos;\r\n handled = true;\r\n }\r\n }\r\n\r\n if (handled) {\r\n event.preventDefault();\r\n this.selectedRange.set({ start: newStart, end: newEnd });\r\n\r\n // Emit rangePick event\r\n const firstCharId = this.getCharIdAtPosition(newStart);\r\n const rangeToEmit: BaseTextRange = {\r\n at: firstCharId,\r\n run: newEnd - newStart + 1,\r\n };\r\n this.rangePick.emit(rangeToEmit);\r\n\r\n // Emit charPick for single selection\r\n if (newStart === newEnd) {\r\n const char = this.getCharAtPosition(newStart);\r\n if (char) {\r\n this.charPick.emit({\r\n char,\r\n event: null as unknown as MouseEvent,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Copy the currently selected text to the clipboard.\r\n */\r\n public copySelection(): void {\r\n const range = this.selectedRange();\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const text = this.text();\r\n if (!text || text.length === 0) {\r\n return;\r\n }\r\n\r\n // Extract the selected characters\r\n const selectedChars = text\r\n .slice(range.start, range.end + 1)\r\n .map((node) => node.data)\r\n .join('');\r\n\r\n this._clipboard.copy(selectedChars);\r\n this._snackBar.open('Text copied', 'OK', { duration: 2000 });\r\n }\r\n\r\n /**\r\n * Copy the currently selected range coordinates to the clipboard.\r\n * Format: \"ID\" for single character, \"IDxCOUNT\" for range.\r\n */\r\n public copyCoordinates(): void {\r\n const range = this.selectedRange();\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const text = this.text();\r\n if (!text || text.length === 0) {\r\n return;\r\n }\r\n\r\n const startId = text[range.start].id;\r\n const count = range.end - range.start + 1;\r\n\r\n const coords = count === 1 ? `${startId}` : `${startId}x${count}`;\r\n\r\n this._clipboard.copy(coords);\r\n this._snackBar.open(`Coordinates copied: ${coords}`, 'OK', {\r\n duration: 2000,\r\n });\r\n }\r\n\r\n /**\r\n * Check if there is an active selection.\r\n */\r\n public readonly hasSelection = computed(() => {\r\n return this.selectedRange() !== null;\r\n });\r\n\r\n /**\r\n * Get the total count of matched characters.\r\n */\r\n public readonly matchCount = computed(() => {\r\n const matches = this.searchMatches();\r\n return matches.reduce((sum, m) => sum + m.length, 0);\r\n });\r\n\r\n /**\r\n * Check if a search is active (query is not empty).\r\n */\r\n public readonly isSearchActive = computed(() => {\r\n return this.searchQuery().length > 0;\r\n });\r\n}\r\n","<!-- Toolbar -->\r\n<div class=\"toolbar\">\r\n <mat-form-field appearance=\"outline\" class=\"search-field\">\r\n <input\r\n matInput\r\n [ngModel]=\"searchQuery()\"\r\n (ngModelChange)=\"onSearchInput($event)\"\r\n placeholder=\"search\"\r\n />\r\n @if (searchQuery()) {\r\n <button\r\n type=\"button\"\r\n matSuffix\r\n mat-icon-button\r\n matTooltip=\"Clear search\"\r\n (click)=\"clearSearch()\"\r\n >\r\n <mat-icon class=\"mat-warn\">close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n\r\n @if (isSearchActive()) {\r\n <span class=\"match-count\" [class.no-matches]=\"matchCount() === 0\">\r\n {{ matchCount() }}\r\n </span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n mat-stroked-button\r\n matTooltip=\"Copy selection text to clipboard\"\r\n [disabled]=\"!hasSelection()\"\r\n (click)=\"copySelection()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n copy\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n mat-stroked-button\r\n matTooltip=\"Copy selection coordinates to clipboard\"\r\n [disabled]=\"!hasSelection()\"\r\n (click)=\"copyCoordinates()\"\r\n >\r\n <mat-icon>pin_drop</mat-icon>\r\n copy coords\r\n </button>\r\n</div>\r\n\r\n<!-- Text display -->\r\n<div id=\"text\" tabindex=\"0\" (keydown)=\"onKeyDown($event)\">\r\n @for (line of lines(); track $index) {\r\n <div class=\"line\">\r\n @if (hasLineNumber()) {\r\n <div class=\"nr\">\r\n {{ lines().indexOf(line) + 1 }}\r\n </div>\r\n }\r\n @for (c of line; track c.id) {\r\n <gve-base-text-char [char]=\"c\" (charPick)=\"onCharPick($event)\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\n// material\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport {\r\n Feature,\r\n FeatureSetPolicy,\r\n LabeledId,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\n/**\r\n * Features map. This is used for features from closed sets,\r\n * and lists the possible values for each feature.\r\n * The key is the feature name's ID, and the value is an array of\r\n * labeled IDs representing the allowed values for that feature.\r\n */\r\nexport interface FeatureMap {\r\n [key: string]: LabeledId[];\r\n}\r\n\r\n/**\r\n * 🔑 `gve-feature-editor`\r\n *\r\n * Component for editing a single feature, whose model is a name=value\r\n * pair, plus a set policy value which defines the desired behavior\r\n * when adding that feature to a set.\r\n * Used by `gve-feature-set-editor`.\r\n *\r\n * - ▶️ `feature` (`Feature`): the feature to edit.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of\r\n * features. Each item in the list is an object with _id_ and _label_\r\n * properties.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When\r\n * specified and the user selects a feature name present in the map keys,\r\n * the corresponding values will be used to populate the value selection.\r\n * - ▶️ `multiValuedFeatureIds` (`string[]`): the IDs of the features that are\r\n * multi-valued. Used to determine if the current feature being edited should\r\n * display multi-value controls.\r\n * - ▶️ `isVar`: true if the feature is a variant operation feature, which\r\n * has additional properties like negation, global, and short-lived.\r\n * - 🔥 `featureChange` (`Feature`): emitted when feature has changed.\r\n * - 🔥 `featureCancel`: emitted when the user cancels the feature editing.\r\n */\r\n@Component({\r\n selector: 'gve-feature-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './feature-editor.component.html',\r\n styleUrl: './feature-editor.component.css',\r\n})\r\nexport class FeatureEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _frozen?: boolean;\r\n\r\n @ViewChild('nameCtl') nameControl?: ElementRef;\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The feature to edit.\r\n */\r\n public readonly feature = model<Feature | OperationFeature | undefined>();\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(false);\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. Used to determine\r\n * if the current feature being edited should display multi-value controls.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>([\r\n 'r_hints',\r\n ]);\r\n\r\n /**\r\n * Event emitted when the user cancels the feature editing.\r\n */\r\n public readonly featureCancel = output();\r\n\r\n public readonly nameIds = signal<LabeledId[] | undefined>(undefined);\r\n public readonly isMultiValued = signal<boolean>(false);\r\n\r\n public name: FormControl<string>;\r\n public value: FormControl<string>;\r\n public selectedValue: FormControl<string>;\r\n public setPolicy: FormControl<FeatureSetPolicy>;\r\n // var feature controls\r\n public isNegated: FormControl<boolean>;\r\n public isGlobal: FormControl<boolean>;\r\n public isShortLived: FormControl<boolean>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.name = formBuilder.control<string>('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.value = formBuilder.control('', {\r\n validators: [Validators.maxLength(5000)],\r\n nonNullable: true,\r\n });\r\n this.selectedValue = formBuilder.control('', {\r\n nonNullable: true,\r\n });\r\n this.setPolicy = formBuilder.control(FeatureSetPolicy.multiple, {\r\n nonNullable: true,\r\n });\r\n this.isNegated = formBuilder.control(false, { nonNullable: true });\r\n this.isGlobal = formBuilder.control(false, { nonNullable: true });\r\n this.isShortLived = formBuilder.control(false, { nonNullable: true });\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n value: this.value,\r\n selectedValue: this.selectedValue,\r\n setPolicy: this.setPolicy,\r\n isNegated: this.isNegated,\r\n isGlobal: this.isGlobal,\r\n isShortLived: this.isShortLived,\r\n });\r\n\r\n // when feature changes, update the form\r\n effect(() => {\r\n this.updateForm(this.feature());\r\n setTimeout(() => {\r\n this.nameControl?.nativeElement?.focus();\r\n this.nameIds.set(\r\n this.getLabeledIdsFor(this.name.value, this.featValues()),\r\n );\r\n }, 500);\r\n });\r\n\r\n // diagnostic logging for multiValuedFeatureIds\r\n effect(() => {\r\n console.log(\r\n '[FeatureEditor] multiValuedFeatureIds:',\r\n this.multiValuedFeatureIds(),\r\n 'isMultiValued:',\r\n this.isMultiValued(),\r\n );\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever the name changes, update the value selection and multi-valued status\r\n this._sub = this.name.valueChanges\r\n .pipe(debounceTime(300), distinctUntilChanged())\r\n .subscribe((name) => {\r\n if (!this._frozen && this.featNames()?.length) {\r\n this.value.reset();\r\n this.nameIds.set(this.getLabeledIdsFor(name, this.featValues()));\r\n }\r\n // Update multi-valued status\r\n const ids = this.multiValuedFeatureIds();\r\n this.isMultiValued.set(!!ids && ids.includes(name));\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(\r\n id?: string,\r\n featValues?: FeatureMap,\r\n ): LabeledId[] | undefined {\r\n if (!id) {\r\n return undefined;\r\n }\r\n console.log('getLabeledIdsFor', id, featValues);\r\n return featValues ? featValues![id] : undefined;\r\n }\r\n\r\n private updateForm(feature?: OperationFeature): void {\r\n if (!feature) {\r\n this.form.reset();\r\n this.isMultiValued.set(false);\r\n } else {\r\n this._frozen = true;\r\n this.name.setValue(feature.name);\r\n this.value.setValue(feature.value);\r\n this.setPolicy.setValue(feature.setPolicy || FeatureSetPolicy.multiple);\r\n this.isNegated.setValue(feature.isNegated || false);\r\n this.isGlobal.setValue(feature.isGlobal || false);\r\n this.isShortLived.setValue(feature.isShortLived || false);\r\n // Set multi-valued status based on feature name\r\n const ids = this.multiValuedFeatureIds();\r\n this.isMultiValued.set(!!ids && ids.includes(feature.name));\r\n this._frozen = false;\r\n }\r\n }\r\n\r\n public addValueToComposite(): void {\r\n if (!this.selectedValue.value) {\r\n return;\r\n }\r\n const currentValue = this.value.value.trim();\r\n const newValue = this.selectedValue.value.trim();\r\n if (currentValue) {\r\n this.value.setValue(currentValue + ' ' + newValue);\r\n } else {\r\n this.value.setValue(newValue);\r\n }\r\n this.selectedValue.reset();\r\n this.value.markAsDirty();\r\n }\r\n\r\n public cancel(): void {\r\n this.featureCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this.feature.set(\r\n this.isVar()\r\n ? {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n isNegated: this.isNegated.value,\r\n isGlobal: this.isGlobal.value,\r\n isShortLived: this.isShortLived.value,\r\n }\r\n : {\r\n name: this.name.value.trim(),\r\n value: this.value.value.trim(),\r\n setPolicy: this.setPolicy.value,\r\n },\r\n );\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n @if (featNames()?.length) {\r\n <!-- name (bound) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <mat-select #nameCtl [formControl]=\"name\">\r\n @for (i of featNames(); track i) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- name (free) -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input #nameCtl matInput [formControl]=\"name\" />\r\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\r\n <mat-error>name required</mat-error>\r\n }\r\n @if ($any(name).errors?.maxLength && (name.dirty || name.touched)) {\r\n <mat-error>name too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- value (bound) -->\r\n @if (nameIds()?.length) {\r\n @if (isMultiValued()) {\r\n <!-- multi-valued: select for picking + text for composite -->\r\n <mat-form-field>\r\n <mat-label>select value</mat-label>\r\n <mat-select [formControl]=\"selectedValue\">\r\n @for (e of nameIds(); track e) {\r\n <mat-option [value]=\"e.id\">{{ e.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Add selected value\"\r\n (click)=\"addValueToComposite()\"\r\n [disabled]=\"!selectedValue.value\"\r\n >\r\n <mat-icon class=\"mat-primary\">add</mat-icon>\r\n </button>\r\n <mat-form-field>\r\n <mat-label>composite value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n @if (\r\n $any(value).errors?.maxLength && (value.dirty || value.touched)\r\n ) {\r\n <mat-error>value too long</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- single-valued: just select -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <mat-select [formControl]=\"value\">\r\n @for (e of nameIds(); track e) {\r\n <mat-option [value]=\"e.id\">{{ e.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n } @else {\r\n <!-- value (free) -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n <mat-error>value required</mat-error>\r\n }\r\n @if ($any(value).errors?.maxLength && (value.dirty || value.touched)) {\r\n <mat-error>value too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- setPolicy -->\r\n <mat-form-field>\r\n <mat-label>set policy</mat-label>\r\n <mat-select [formControl]=\"setPolicy\">\r\n <mat-option [value]=\"0\">multiple</mat-option>\r\n <mat-option [value]=\"1\">single</mat-option>\r\n <mat-option [value]=\"2\">single first</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n @if (isVar()) {\r\n <div class=\"form-row\">\r\n <!-- isNegated -->\r\n <mat-checkbox [formControl]=\"isNegated\">negated</mat-checkbox>\r\n\r\n <!-- isShortLived -->\r\n <mat-checkbox [formControl]=\"isShortLived\">short-lived</mat-checkbox>\r\n\r\n <!-- isGlobal -->\r\n <mat-checkbox [formControl]=\"isGlobal\">global</mat-checkbox>\r\n </div>\r\n }\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n FeatureSetPolicy,\r\n LabeledId,\r\n Feature,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\nimport {\r\n FeatureEditorComponent,\r\n FeatureMap,\r\n} from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-editor`\r\n *\r\n * Component for editing a set of features. It shows a list of features,\r\n * allowing to edit each of them or adding new ones. Optionally you can\r\n * specify a list of feature names and values to use in the selection.\r\n * Used by base text editor and chain operation editor components.\r\n *\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is equal to or greater than the threshold. Default is 5.\r\n * - ▶️ `features` (`Feature[]`): the features to edit.\r\n * - ▶️ `multiValuedFeatureIds` (`string[]`): the IDs of the features that are\r\n * multi-valued. If a feature being edited is in this list, the feature editor\r\n * will allow adding multiple values to it.\r\n * - ▶️ `isVar`: true if the feature is a variant operation feature, which\r\n * has additional properties like negation, global, and short-lived.\r\n * - 🔥 `featuresChange` (`Feature[]`): emitted when features have changed.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n FlatLookupPipe,\r\n FeatureEditorComponent,\r\n ],\r\n templateUrl: './feature-set-editor.component.html',\r\n styleUrl: './feature-set-editor.component.css',\r\n})\r\nexport class FeatureSetEditorComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n\r\n public readonly POLICIES = ['M', 'S', 'SF'];\r\n\r\n /**\r\n * True if the feature is a variant operation feature, which has\r\n * additional properties like negation, global, and short-lived.\r\n */\r\n public readonly isVar = input(true);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than or equal to the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>([\r\n 'r_hints',\r\n ]);\r\n\r\n /**\r\n * The features to edit.\r\n */\r\n public readonly features = model<Feature[] | OperationFeature[]>([]);\r\n\r\n public readonly editedFeature = signal<\r\n Feature | OperationFeature | undefined\r\n >(undefined);\r\n public readonly editedFeatureIndex = signal<number>(-1);\r\n public filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control<string | null>(null);\r\n\r\n // when features change, apply the filter\r\n effect(() => {\r\n this.applyFeatureFilter(this.features(), this.filter.value);\r\n });\r\n\r\n // diagnostic logging for multiValuedFeatureIds\r\n effect(() => {\r\n console.log(\r\n '[FeatureSetEditor] multiValuedFeatureIds:',\r\n this.multiValuedFeatureIds(),\r\n );\r\n });\r\n }\r\n\r\n private applyFeatureFilter(\r\n features: Feature[] | OperationFeature[],\r\n name?: string | null,\r\n ): void {\r\n this.filteredFeatures.set(\r\n features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n }) || [],\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n // when the filter changes, apply the filter\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(this.features(), value);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public addFeature(): void {\r\n this.editedFeature.set({\r\n name: '',\r\n value: '',\r\n setPolicy: FeatureSetPolicy.multiple,\r\n });\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n\r\n public editFeature(feature: Feature | OperationFeature): void {\r\n this.editedFeature.set(structuredClone(feature));\r\n this.editedFeatureIndex.set(this.features().indexOf(feature));\r\n }\r\n\r\n public deleteFeature(feature: Feature | OperationFeature): void {\r\n const index = this.features().indexOf(feature);\r\n if (index < 0) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n features.splice(index, 1);\r\n this.features.set(features);\r\n }\r\n\r\n public isFeatureMultiValued(feature?: Feature | OperationFeature): boolean {\r\n if (!feature || !this.multiValuedFeatureIds()) {\r\n return false;\r\n }\r\n return this.multiValuedFeatureIds()!.includes(feature.name);\r\n }\r\n\r\n public onFeatureChange(feature?: Feature | OperationFeature): void {\r\n if (!feature) {\r\n return;\r\n }\r\n const features = [...this.features()];\r\n\r\n for (let i = features.length - 1; i >= 0; i--) {\r\n if (features[i].name === feature.name) {\r\n if (\r\n feature.setPolicy === FeatureSetPolicy.single ||\r\n features[i].setPolicy === FeatureSetPolicy.single\r\n ) {\r\n features.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n if (this.editedFeatureIndex() === -1) {\r\n features.push(feature);\r\n } else {\r\n features.splice(this.editedFeatureIndex(), 1, feature);\r\n }\r\n\r\n this.onFeatureCancel();\r\n this.features.set(features);\r\n }\r\n\r\n public onFeatureCancel(): void {\r\n this.editedFeature.set(undefined);\r\n this.editedFeatureIndex.set(-1);\r\n }\r\n}\r\n","<div>\r\n <div class=\"form-row\">\r\n <!-- filter -->\r\n @if (filterThreshold() === 0 || features().length >= filterThreshold()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"filter\" [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- add feature button -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Add a new feature\"\r\n (click)=\"addFeature()\"\r\n [class.in-row-button]=\"\r\n filterThreshold() === 0 || features()!.length >= filterThreshold()\r\n \"\r\n >\r\n <mat-icon>add</mat-icon>\r\n feature\r\n </button>\r\n </div>\r\n\r\n <!-- list -->\r\n @if (features().length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>feature</th>\r\n <th>value</th>\r\n <th>policy</th>\r\n @if (isVar()) {\r\n <th>flags</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track $index) {\r\n <tr [class.selected]=\"$index === editedFeatureIndex()\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Edit this feature\"\r\n (click)=\"editFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Delete this feature\"\r\n (click)=\"deleteFeature(feature)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n @if (featNames()?.length) {\r\n <span>{{\r\n feature.name | flatLookup: featNames() : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </td>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup: featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n <td>\r\n <span>{{ POLICIES[feature.setPolicy] }}</span>\r\n </td>\r\n @if (isVar()) {\r\n <td>\r\n @if ($any(feature).isNegated) {\r\n <span class=\"icon\" matTooltip=\"Negated: remove if present\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </span>\r\n }\r\n @if ($any(feature).isGlobal) {\r\n <span class=\"icon\" matTooltip=\"Global: apply to whole output\">\r\n <mat-icon class=\"mat-primary\">public</mat-icon>\r\n </span>\r\n }\r\n @if ($any(feature).isShortLived) {\r\n <span\r\n class=\"icon\"\r\n matTooltip=\"Short-lived: removed on next operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">timer</mat-icon>\r\n </span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- editor -->\r\n @if (editedFeature()) {\r\n <mat-expansion-panel\r\n [disabled]=\"!editedFeature()\"\r\n [expanded]=\"editedFeature()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <span>{{ editedFeature()?.name || \"feature\" }}</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-feature-editor\r\n [isVar]=\"isVar()\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n [featNames]=\"featNames()\"\r\n [featValues]=\"featValues()\"\r\n [feature]=\"editedFeature()\"\r\n (featureChange)=\"onFeatureChange($event)\"\r\n (featureCancel)=\"onFeatureCancel()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n</div>\r\n","import { CharNode } from '../models';\r\n\r\n/**\r\n * Service for base text operations.\r\n */\r\nexport class GveBaseTextService {\r\n private static readonly _asciiTable: { [key: string]: string } = {\r\n '\\u0007': '\\u21B5', // BEL (bell)\r\n '\\u0008': '\\u21B6', // BS (backspace)\r\n '\\u0009': '\\u2192', // HT (horizontal tab)\r\n '\\u000A': '\\u2193', // LF (line feed)\r\n '\\u000B': '\\u2194', // VT (vertical tab)\r\n '\\u000C': '\\u2195', // FF (form feed)\r\n '\\u000D': '\\u21A6', // CR (carriage return)\r\n '\\u0020': ' ', // Space\r\n '\\u007F': '~', // DEL (delete)\r\n };\r\n\r\n /**\r\n * Translate an ASCII special character to a printable character.\r\n *\r\n * @param c The character to translate.\r\n * @returns The translated character.\r\n */\r\n public static translateSpecialChar(c: string): string {\r\n return this._asciiTable[c] || c;\r\n }\r\n\r\n /**\r\n * Convert a string to the character nodes of a base text.\r\n *\r\n * @param text The text to convert to base characters.\r\n * @returns Character nodes for the given text.\r\n */\r\n public static stringToBaseChars(text?: string): CharNode[] {\r\n if (!text) {\r\n return [];\r\n }\r\n return text.split('').map((c, i) => {\r\n return {\r\n id: i + 1,\r\n label: this.translateSpecialChar(c),\r\n index: i,\r\n data: c,\r\n };\r\n });\r\n }\r\n}\r\n","import { Component, effect, input, output, signal } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport {\r\n BaseTextViewComponent,\r\n BaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\nimport { CharNode, Feature } from '../../models';\r\nimport { GveBaseTextService } from '../../services/gve-base-text.service';\r\n\r\n/**\r\n * 🔑 `gve-base-text-editor`\r\n *\r\n * Editor for snapshot's base text. This can receive a string or an array\r\n * of `CharNode` objects, and lets the user edit the text, character by\r\n * character, optionally also setting its features.\r\n *\r\n * Used by the `gve-snapshot-editor` component.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n BaseTextViewComponent,\r\n FeatureSetEditorComponent,\r\n ],\r\n templateUrl: './base-text-editor.component.html',\r\n styleUrl: './base-text-editor.component.css',\r\n})\r\nexport class BaseTextEditorComponent {\r\n /**\r\n * The text to edit. In input this can be a string, an array of `CharNode`\r\n * objects, or undefined. In output this will be an array of `CharNode`\r\n * objects.\r\n */\r\n public readonly text = input.required({\r\n transform: (value: CharNode[] | string | undefined) => {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n return GveBaseTextService.stringToBaseChars(value);\r\n }\r\n return undefined;\r\n },\r\n });\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it. Passed down to feature editors.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>();\r\n\r\n /**\r\n * Emitted for the edited text as an array of `CharNode`'s whenever it changes.\r\n */\r\n public readonly textChange = output<CharNode[]>();\r\n\r\n public readonly selectedChar = signal<CharNode | undefined>(undefined);\r\n public readonly selectedCharLabel = signal<string | undefined>(undefined);\r\n public readonly textRange = signal<BaseTextRange | undefined>(undefined);\r\n\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _dialogService: DialogService,\r\n ) {\r\n this.userText = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(10000)],\r\n });\r\n this.form = formBuilder.group({\r\n userText: this.userText,\r\n });\r\n\r\n effect(() => {\r\n this.resetSelectedChar();\r\n if (!this.text()) {\r\n this.userText.reset();\r\n } else {\r\n this.userText.setValue(\r\n this.text()!\r\n .map((c) => c.data)\r\n .join(''),\r\n );\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n private resetSelectedChar(): void {\r\n this.selectedChar.set(undefined);\r\n this.selectedCharLabel.set(undefined);\r\n }\r\n\r\n public onSelectedChar(event: BaseTextCharEvent): void {\r\n this.selectedChar.set(this.text()!.find((c) => c.id === event.char.id));\r\n this.selectedCharLabel.set(event.char.label);\r\n }\r\n\r\n public onFeaturesChange(features: Feature[]): void {\r\n const char = this.selectedChar();\r\n if (!char) {\r\n return;\r\n }\r\n const chars = this.text()!.map((c) =>\r\n c.id === char.id ? { ...c, features } : c,\r\n );\r\n this.selectedChar.set({ ...char, features });\r\n this.textChange.emit(chars);\r\n }\r\n\r\n public onRangePick(range: BaseTextRange) {\r\n this.textRange.set(range);\r\n }\r\n\r\n public setTextFromUser(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Reset text?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.textChange.emit(\r\n GveBaseTextService.stringToBaseChars(this.userText.value),\r\n );\r\n }\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n @if ( $any(userText).errors?.required && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text required</mat-error>\r\n } @if ( $any(userText).errors?.maxLength && (userText.dirty ||\r\n userText.touched) ) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text() || []\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange.set($event)\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange()) {\r\n <div id=\"text-range\">{{ textRange()!.at }} × {{ textRange()!.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar()) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar()!.features || []\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { Observable, catchError } from 'rxjs';\r\n\r\nimport { ErrorService, EnvService } from '@myrmidon/ngx-tools';\r\n\r\nimport { CharChainOperation, CharNode, OperationFeature, ResultWrapper } from '../models';\r\n\r\n/**\r\n * Execution step of a char-based chain operation.\r\n */\r\nexport interface ChainOperationContextStep {\r\n /**\r\n * The operation that was executed.\r\n */\r\n operation: CharChainOperation;\r\n /**\r\n * The input version tag.\r\n */\r\n inputTag: string;\r\n /**\r\n * The output version tag.\r\n */\r\n outputTag: string;\r\n /**\r\n * The string synthetically representing the resulting text\r\n * version.\r\n */\r\n result?: string;\r\n /**\r\n * The features emitted up to the executed operation.\r\n * These are the features of the text as a whole, and\r\n * those belonging to specific nodes, each keyed under\r\n * a string built with `v` + output version tag + `_`\r\n * + node ID (e.g. `v1_2` for node with ID 2 at version 1).\r\n */\r\n featureSet: {\r\n features: OperationFeature[];\r\n nodeFeatures: Record<string, OperationFeature[]>;\r\n };\r\n /**\r\n * The reference node IDs of the operation which was\r\n * executed.\r\n */\r\n refNodeIds: number[];\r\n}\r\n\r\n/**\r\n * Result of execution of a char-based chain.\r\n */\r\nexport interface CharChainResult {\r\n /**\r\n * The base text, as an array of character nodes or string.\r\n * This is not returned by the API, but can be supplied\r\n * by the caller for rendering purposes.\r\n */\r\n text?: CharNode[] | string;\r\n /**\r\n * The execution steps of the chain.\r\n */\r\n steps: ChainOperationContextStep[];\r\n /**\r\n * The chain dump, which is the text representation of the chain.\r\n */\r\n chainDump: string;\r\n /**\r\n * The list of all unique tags in the chain.\r\n */\r\n chainTags: string[];\r\n /**\r\n * The sets of nodes in their order, for each version tag.\r\n * These nodes are collected by following the path defined\r\n * by the set of links of each version tag; so each of the\r\n * sets contains only the nodes used at that step to build\r\n * the text version, with their features up to that stage.\r\n */\r\n taggedNodes: { [key: string]: CharNode[] };\r\n}\r\n\r\n/**\r\n * The input and output tags of a char-based chain operation.\r\n */\r\nexport interface ChainOperationTags {\r\n inputTag: string;\r\n outputTag: string;\r\n}\r\n\r\n/**\r\n * The node of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainNode {\r\n id: number;\r\n label: string;\r\n data: string;\r\n sourceTag?: string;\r\n}\r\n\r\n/**\r\n * The link of a character-based chain, used for diagnostic\r\n * or demonstration purposes.\r\n */\r\nexport interface CharChainLink {\r\n tag: string;\r\n sourceId: number;\r\n targetId: number;\r\n}\r\n\r\n/**\r\n * The character-based chain, as resulting from running operations\r\n * on a base text, used for diagnostic or demonstration purposes.\r\n */\r\nexport interface CharChain {\r\n nodes: CharChainNode[];\r\n links: CharChainLink[];\r\n}\r\n\r\n/**\r\n * Service to interact with the GVE API.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveApiService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService,\r\n ) {}\r\n\r\n /**\r\n * Parse the specified text into operations. Each operation is a line\r\n * of the text.\r\n * @param text The text to parse.\r\n * @returns The operations.\r\n */\r\n public parseOperations(\r\n text: string,\r\n ): Observable<ResultWrapper<CharChainOperation[]>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainOperation[]>>(\r\n `${this._env.get('apiUrl')}text/operations/parse`,\r\n {\r\n text,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Run operations on the specified text.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public runOperations(\r\n text: CharNode[],\r\n operations: CharChainOperation[],\r\n ): Observable<ResultWrapper<CharChainResult>> {\r\n return this._http\r\n .post<ResultWrapper<CharChainResult>>(\r\n `${this._env.get('apiUrl')}text/operations/run`,\r\n {\r\n text,\r\n operations,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the input and output tags for the given operations.\r\n *\r\n * @param operations The operations.\r\n * @returns Result wrapper.\r\n */\r\n public getTags(\r\n operations: CharChainOperation[],\r\n ): Observable<ResultWrapper<string[]>> {\r\n return this._http\r\n .post<ResultWrapper<string[]>>(\r\n `${this._env.get('apiUrl')}text/operations/tags`,\r\n {\r\n operations,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Get the chain corresponding to the operations run on the\r\n * specified text. This is used for diagnostic or demonstration\r\n * purposes.\r\n *\r\n * @param text The base text.\r\n * @param operations The operations to run.\r\n * @returns Result wrapper.\r\n */\r\n public getChain(\r\n text: CharNode[],\r\n operations: CharChainOperation[],\r\n ): Observable<ResultWrapper<CharChain>> {\r\n return this._http\r\n .post<ResultWrapper<CharChain>>(\r\n `${this._env.get('apiUrl')}text/operations/run/chain`,\r\n {\r\n text,\r\n operations,\r\n },\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n input,\r\n OnInit,\r\n Optional,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharChainOperation, PayloadMatDialogConfig } from '../../models';\r\nimport { GveApiService } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-batch-operation-editor`\r\n *\r\n * A component to edit a batch of operations. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `preset` (`string`): the optional preset text to parse.\r\n * - 🔥 `operationsChange` (`CharChainOperation[]`): event emitted when operations change.\r\n */\r\n@Component({\r\n selector: 'gve-batch-operation-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './batch-operation-editor.component.html',\r\n styleUrl: './batch-operation-editor.component.css',\r\n})\r\nexport class BatchOperationEditorComponent implements OnInit {\r\n public readonly busy = signal<boolean>(false);\r\n public readonly parseError = signal<string | undefined>(undefined);\r\n\r\n public text: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n /**\r\n * The preset text to parse if any. Usually you start with a blank\r\n * text, but sometimes you might want to pre-set it.\r\n */\r\n public readonly preset = input<string | undefined>();\r\n\r\n /**\r\n * Emitted when operations change.\r\n */\r\n public readonly operationsChange = output<CharChainOperation[]>();\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<BatchOperationEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ preset?: string }>,\r\n ) {\r\n this.text = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(2000),\r\n ]);\r\n this.form = formBuilder.group({\r\n inputOps: this.text,\r\n });\r\n\r\n effect(() => {\r\n this.parseOperations(this.preset() || undefined);\r\n });\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.preset) {\r\n this.parseOperations(this.data?.payload?.preset);\r\n }\r\n }\r\n\r\n public parseOperations(text?: string): void {\r\n if (this.busy() || !text) {\r\n return;\r\n }\r\n this.busy.set(true);\r\n this.parseError.set(undefined);\r\n\r\n this._api.parseOperations(text).subscribe({\r\n next: (wrapper) => {\r\n if (wrapper.error) {\r\n this.parseError.set(wrapper.error);\r\n return;\r\n }\r\n this.operationsChange.emit(wrapper.result || []);\r\n if (this.dialogRef) {\r\n this.dialogRef.close(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n this.parseError.set(error.message);\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Add Operations</h2>\r\n </div>\r\n }\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"text\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n @if (parseError()) {\r\n <div class=\"error\">{{ parseError() }}</div>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>&gt;[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>&gt;]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong>&lt;&gt;</strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or output tags,\r\n separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>&#x40;</code> to AT to use character indexes (0-N)\r\n rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>, separated by\r\n space, where:\r\n </li>\r\n <li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove feature (no\r\n value). Suffixes: <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple), <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text into operations\"\r\n [disabled]=\"!text.value || busy()\"\r\n (click)=\"parseOperations(text.value!)\"\r\n >\r\n batch add\r\n </button>\r\n </div>\r\n </fieldset>\r\n</div>\r\n","\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { LabeledId, OperationSource } from '../../models';\r\n\r\n/**\r\n * 🔑 `gve-operation-source-editor`\r\n *\r\n * A component to edit an operation source.\r\n * Used by chain operation editor component.\r\n *\r\n * - ▶️ `source` (`OperationSource`): the source to edit.\r\n * - ▶️ `ids` (`LabeledId[]`): the list of source IDs, when using a closed\r\n * list for them.\r\n * - ▶️ `types` (`LabeledId[]`): the list of source types, when using a closed\r\n * list for them.\r\n * - 🔥 `sourceChange` (`EventEmitter<OperationSource>`): the event emitted\r\n * when the source changes.\r\n * - 🔥 `sourceCancel` (`EventEmitter<void>`): the event emitted when the\r\n * edit is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-operation-source-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule\r\n],\r\n templateUrl: './operation-source-editor.component.html',\r\n styleUrl: './operation-source-editor.component.css',\r\n})\r\nexport class OperationSourceEditorComponent {\r\n /**\r\n * The source to edit.\r\n */\r\n public readonly source = model<OperationSource | undefined>();\r\n\r\n /**\r\n * The list of source IDs when it's a closed set.\r\n */\r\n public readonly ids = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The list of source types when it's a closed set.\r\n */\r\n public readonly types = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The event emitted when the edit is canceled.\r\n */\r\n public sourceCancel = output();\r\n\r\n public id: FormControl<string>;\r\n public type: FormControl<string>;\r\n public rank: FormControl<number>;\r\n public note: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.id = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.type = new FormControl('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.rank = new FormControl(0, {\r\n nonNullable: true,\r\n });\r\n this.note = new FormControl(null, {\r\n validators: [Validators.maxLength(1000)],\r\n });\r\n this.form = formBuilder.group({\r\n id: this.id,\r\n type: this.type,\r\n rank: this.rank,\r\n note: this.note,\r\n });\r\n\r\n // when source changes, update form\r\n effect(() => {\r\n this.updateForm(this.source());\r\n });\r\n }\r\n\r\n private updateForm(source?: OperationSource): void {\r\n if (!source) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.id.setValue(source.id);\r\n this.type.setValue(source.type);\r\n this.rank.setValue(source.rank || 0);\r\n this.note.setValue(source.note || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public cancel(): void {\r\n this.sourceCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.source.set({\r\n id: this.id.value,\r\n type: this.type.value,\r\n rank: this.rank.value,\r\n note: this.note.value || undefined,\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <!-- id (bound) -->\r\n @if (ids()?.length) {\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <mat-select [formControl]=\"id\">\r\n @for (i of ids(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- id (free) -->\r\n <mat-form-field>\r\n <mat-label>id</mat-label>\r\n <input matInput [formControl]=\"id\" />\r\n @if ($any(id.errors)?.required && (id.dirty || id.touched)) {\r\n <mat-error>ID required</mat-error>\r\n } @if ($any(id.errors)?.maxLength && (id.dirty || id.touched)) {\r\n <mat-error>id too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- type (bound) -->\r\n @if (types()?.length) {\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n @for (i of types(); track i.id) {\r\n <mat-option [value]=\"i.id\">{{ i.label }}</mat-option>\r\n }\r\n </mat-select>\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else {\r\n <!-- type (free) -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <input matInput [formControl]=\"type\" />\r\n @if ($any(type.errors)?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n } @if ($any(type.errors)?.maxLength && (type.dirty || type.touched)) {\r\n <mat-error>type too long</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea matInput [formControl]=\"note\" class=\"long-text\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Accept changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\n\r\n/**\r\n * Validators for SVG.\r\n */\r\nexport class SvgValidators {\r\n /**\r\n * Validator for a valid SVG `g` root element in GVE.\r\n */\r\n static rootGValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n const parser = new DOMParser();\r\n let error = null;\r\n let svgRoot;\r\n\r\n try {\r\n const doc = parser.parseFromString(control.value, 'image/svg+xml');\r\n svgRoot =\r\n doc.documentElement.nodeName === 'svg' ? doc.documentElement : null;\r\n } catch (e) {\r\n error = { svgInvalid: { value: control.value } };\r\n }\r\n\r\n if (!error && svgRoot) {\r\n const gElements = svgRoot.getElementsByTagName('g');\r\n if (gElements.length !== 1 || svgRoot.childNodes.length > 1) {\r\n error = { svgInvalidRoot: { value: control.value } };\r\n }\r\n }\r\n\r\n return error;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Service to store and retrieve dynamic settings.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingsService {\r\n private readonly _cache: Map<string, unknown> = new Map<string, unknown>();\r\n private readonly _subject: BehaviorSubject<string | null> =\r\n new BehaviorSubject<string | null>(null);\r\n\r\n /**\r\n * Observable emitting the key of the setting that has changed.\r\n */\r\n public get settingChange$(): Observable<string | null> {\r\n return this._subject.asObservable();\r\n }\r\n\r\n /**\r\n * Prefix to scope the keys. This prefix is used internally to scope the keys\r\n * so that they cannot conflict with other keys in the local storage.\r\n * The prefix is totally transparent to the user of the service, who should\r\n * use the keys without the prefix.\r\n */\r\n public keyPrefix?: string;\r\n\r\n /**\r\n * True to persist the settings in the local storage by default.\r\n */\r\n public persistDefault = false;\r\n\r\n /**\r\n * Scopes the key by prefixing it with the keyPrefix if any.\r\n *\r\n * @param key The key to scope.\r\n * @returns The scoped key.\r\n */\r\n private getScopedKey(key: string): string {\r\n return this.keyPrefix ? this.keyPrefix + key : key;\r\n }\r\n\r\n private isPersist(persist?: boolean): boolean {\r\n return persist === undefined ? this.persistDefault : persist;\r\n }\r\n\r\n /**\r\n * Sets a setting's value.\r\n *\r\n * @param key The key.\r\n * @param value The value.\r\n * @param persist True to persist this setting in local storage.\r\n */\r\n public set(key: string, value: any, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.set(key, value);\r\n if (this.isPersist(persist) && value !== undefined) {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } catch (e) {\r\n console.error(`Error saving key \"${key}\" to localStorage`, e);\r\n }\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Set multiple settings at once from the specified settings object.\r\n *\r\n * @param settings The settings to set.\r\n * @param persist True to persist these settings in local storage.\r\n */\r\n public setFrom(\r\n settings: { [key: string]: any } | undefined | null,\r\n persist?: boolean\r\n ): void {\r\n if (!settings) {\r\n return;\r\n }\r\n for (const key in settings) {\r\n if (settings.hasOwnProperty(key)) {\r\n this.set(key, settings[key], persist);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get a setting's value of type T.\r\n *\r\n * @param key The key.\r\n * @param defaultValue The default value to get when the setting\r\n * is not found in the store.\r\n * @returns The value.\r\n */\r\n public get<T>(key: string, defaultValue?: any, persist?: boolean): T {\r\n key = this.getScopedKey(key);\r\n\r\n // immediately return value from cache\r\n if (this._cache.has(key)) {\r\n return this._cache.get(key) as T;\r\n }\r\n\r\n // try loading value from local storage\r\n if (this.isPersist(persist)) {\r\n const value = localStorage.getItem(key);\r\n if (value) {\r\n try {\r\n const parsedValue = JSON.parse(value) as T;\r\n this._cache.set(key, parsedValue);\r\n return parsedValue;\r\n } catch (e) {\r\n console.error(\r\n `Error parsing value for key \"${key}\" from localStorage`,\r\n e\r\n );\r\n }\r\n }\r\n }\r\n\r\n // not found, return default value\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Check if a key exists in the store.\r\n *\r\n * @param key The key.\r\n * @param persist True to check if the key exists in local storage.\r\n * @returns True if the key exists in the store.\r\n */\r\n public contains(key: string, persist?: boolean): boolean {\r\n key = this.getScopedKey(key);\r\n if (this._cache.has(key)) {\r\n return true;\r\n }\r\n return this.isPersist(persist) && localStorage.getItem(key) !== null;\r\n }\r\n\r\n /**\r\n * Get all the keys of the settings in the store.\r\n *\r\n * @param persist True to include keys from local storage.\r\n * @returns The keys of the settings in the store.\r\n */\r\n public getKeys(persist?: boolean): string[] {\r\n const keys: Set<string> = new Set<string>();\r\n\r\n // collect keys from local storage\r\n if (this.isPersist(persist)) {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && (!this.keyPrefix || key.startsWith(this.keyPrefix))) {\r\n keys.add(key);\r\n }\r\n }\r\n }\r\n\r\n // collect keys from cache\r\n this._cache.forEach((_, key) => keys.add(key));\r\n\r\n // return keys as array\r\n return Array.from(keys);\r\n }\r\n\r\n /**\r\n * Remove a setting if present.\r\n *\r\n * @param key The key.\r\n * @param persist True to remove the setting from local storage.\r\n */\r\n public remove(key: string, persist?: boolean): void {\r\n key = this.getScopedKey(key);\r\n this._cache.delete(key);\r\n\r\n if (this.isPersist(persist)) {\r\n localStorage.removeItem(key);\r\n }\r\n this._subject.next(key);\r\n }\r\n\r\n /**\r\n * Clear all settings. Warning: this will remove all settings from the\r\n * local storage if no key prefix is set.\r\n *\r\n * @param persist True to remove all settings from local storage.\r\n */\r\n public clear(persist?: boolean): void {\r\n // remove from local storage all the settings\r\n const removedKeys: Set<string> = new Set<string>();\r\n\r\n if (this.isPersist(persist)) {\r\n if (this.keyPrefix) {\r\n // collect keys to remove from local storage\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(this.keyPrefix)) {\r\n removedKeys.add(key);\r\n }\r\n }\r\n // remove collected keys from local storage\r\n removedKeys.forEach((key) => localStorage.removeItem(key));\r\n } else {\r\n localStorage.clear();\r\n }\r\n }\r\n\r\n // remove from cache all the items emitting change events\r\n this._cache.forEach((_, key) => {\r\n this._cache.delete(key);\r\n this._subject.next(key);\r\n removedKeys.delete(key);\r\n });\r\n\r\n // emit changes for the remaining removed keys\r\n // for when the cache was not in sync with the local storage\r\n removedKeys.forEach((key) => this._subject.next(key));\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, filter } from 'rxjs/operators';\r\n\r\n// material\r\nimport { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n// vendor\r\nimport { NgeMonacoModule } from '@cisstech/nge/monaco';\r\nimport { customAlphabet } from 'nanoid';\r\n\r\n// myrmidon\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport {\r\n CharChainOperation,\r\n Feature,\r\n OperationFeature,\r\n OperationType,\r\n OperationSource,\r\n Snapshot,\r\n LabeledId,\r\n} from '../../models';\r\n\r\n// local\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\r\nimport { OperationSourceEditorComponent } from '../operation-source-editor/operation-source-editor.component';\r\nimport { SettingsService } from '../../services/settings.service';\r\nimport { SvgValidators } from '../../validators/svg-validators';\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\nimport { BaseTextRange } from '../base-text-view/base-text-view.component';\r\n\r\n/**\r\n * Definitions for features, including names and values.\r\n */\r\nexport interface FeatureDefinitions {\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n names?: LabeledId[];\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n values?: FeatureMap;\r\n}\r\n\r\n/**\r\n * 🔑 `gve-chain-operation-editor`\r\n *\r\n * A component for editing a variant generation operation.\r\n * Used by the `gve-snapshot-editor` component.\r\n * - ▶️ `operation` (`CharChainOperation`): the operation to edit.\r\n * - ▶️ `snapshot` (`Snapshot`): the snapshot the operation refers to.\r\n * - ▶️ `hidePreview` (`boolean`): whether to hide the preview request button.\r\n * - 🔥 `operationChange` (`CharChainOperation`): emitted when the operation\r\n * is changed.\r\n * - 🔥 `operationPreview` (`CharChainOperation`): emitted when the operation\r\n * preview is requested.\r\n * - 🔥 `operationCancel` (`void`): emitted when operation editing is cancelled.\r\n *\r\n * The editor is composed of many sections:\r\n * - **general**:\r\n * - ID: each operation has an ID, automatically assigned. This is not used in\r\n * the context of the operation or of its transformations, but is provided as a\r\n * reference.\r\n * - at and run: coordinates for the selection of the base text targeted by\r\n * this operation. Check `idx` when `at` is index-based rather than ID-based.\r\n * - to and to-run: a second coordinate, used by some operations.\r\n * - value: the text value argument, for those operations requiring it.\r\n * - rank and group ID.\r\n * - input and output tags.\r\n * - features. These are metadata attached to this operation, and can be any\r\n * type of name=value pairs.\r\n * - **sources**: sources are a special type of metadata used when your text\r\n * versions come from more than a single source. In this case, you can specify\r\n * the source(s) for each operation, just like in a traditional apparatus you\r\n * specify witnesses for each variant. Each source has an ID, a type, a\r\n * probability rank (0=not specified, else 1-N), and an optional free text note.\r\n * - **diplomatic**: SVG `g` code. The diplomatic section is the approximate\r\n * diplomatic representation of the layout of the annotated text. It essentially\r\n * consists in a freely editable SVG code, always grouped into a single root `g`\r\n * element, encoding all the graphical traits representing this operation.\r\n * The visual part of each operation can be placed everywhere on the snapshot,\r\n * as specified by its coordinates.\r\n * - **elements**: features of any of the SVG code elements having an ID.\r\n * The elements section lists all the SVG elements having an `id` attribute in\r\n * the SVG code of the diplomatic section. The ID allows you to attach\r\n * any number of features (metadata modeled as name=value pairs) to each of\r\n * these elements. Among these features, you may use `style` or `class` for\r\n * renditional purposes, and any other name for your own metadata. Note that\r\n * element IDs will be required also when dealing with animations. So, ensure\r\n * to assign an ID to each element you want to animate.\r\n * - **dp feats**: diplomatic features: these are features (metadata modeled\r\n * as name=value pairs) for the diplomatic representation of this operation\r\n * as a whole.\r\n */\r\n@Component({\r\n selector: 'gve-chain-operation-editor',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n ClipboardModule,\r\n MatBadgeModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgeMonacoModule,\r\n FeatureSetEditorComponent,\r\n OperationSourceEditorComponent,\r\n ],\r\n templateUrl: './chain-operation-editor.component.html',\r\n styleUrl: './chain-operation-editor.component.css',\r\n})\r\nexport class ChainOperationEditorComponent implements OnInit, OnDestroy {\r\n private readonly _subs: Subscription[];\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n\r\n /**\r\n * The operation to edit.\r\n */\r\n public readonly operation = model<CharChainOperation | undefined>();\r\n\r\n /**\r\n * The snapshot the operation refers to.\r\n */\r\n public readonly snapshot = input<Snapshot | undefined>();\r\n\r\n /**\r\n * Whether to hide the preview request button.\r\n */\r\n public readonly hidePreview = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * Set when the edited operation's text range is to be patched.\r\n */\r\n public readonly rangePatch = input<BaseTextRange | undefined>();\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it. Passed down to feature editors.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>([\r\n 'r_hints',\r\n ]);\r\n\r\n /**\r\n * Emitted when the operation is changed.\r\n */\r\n public readonly operationChange = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when the operation preview is requested.\r\n */\r\n public readonly operationPreview = output<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when operation editing is cancelled.\r\n */\r\n public readonly operationCancel = output();\r\n\r\n public readonly tabIndex = signal<number>(0);\r\n public readonly id = signal<string | undefined>(undefined);\r\n public readonly hasTo = signal<boolean>(false);\r\n public readonly hasToRun = signal<boolean>(false);\r\n public readonly hasValue = signal<boolean>(false);\r\n // elements parsed from SVG and having an id attribute;\r\n // we can attach features to each of these elements\r\n public readonly elements = signal<SVGElement[]>([]);\r\n public readonly editedElementId = signal<string | undefined>(undefined);\r\n // source\r\n public readonly editedSource = signal<OperationSource | undefined>(undefined);\r\n public readonly editedSourceIndex = signal<number>(-1);\r\n\r\n // general\r\n public rank: FormControl<number>;\r\n public groupId: FormControl<string | null>;\r\n public features: FormControl<Feature[]>;\r\n public sources: FormControl<OperationSource[]>;\r\n public type: FormControl<OperationType>;\r\n public at: FormControl<number>;\r\n public atAsIndex: FormControl<boolean>;\r\n public to: FormControl<number>;\r\n public toAsIndex: FormControl<boolean>;\r\n public inputTag: FormControl<string | null>;\r\n public outputTag: FormControl<string | null>;\r\n public run: FormControl<number>;\r\n public toRun: FormControl<number>;\r\n public value: FormControl<string | null>;\r\n // svg\r\n public svg: FormControl<string>;\r\n // elements\r\n public elementFeatures: FormControl<Record<string, Feature[]>>;\r\n // diplomatic\r\n public newTextHidden: FormControl<boolean>;\r\n public dpFeatures: FormControl<Feature[]>;\r\n // root\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _clipboard: Clipboard,\r\n private _settings: SettingsService,\r\n private _dialogService: DialogService,\r\n ) {\r\n this._subs = [];\r\n // general\r\n this.rank = formBuilder.control<number>(0, { nonNullable: true });\r\n this.groupId = formBuilder.control<string | null>(null);\r\n this.features = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n this.sources = formBuilder.control<OperationSource[]>([], {\r\n nonNullable: true,\r\n });\r\n this.type = formBuilder.control<OperationType>(OperationType.replace, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.at = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.atAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.to = formBuilder.control<number>(0, { nonNullable: true });\r\n this.toAsIndex = formBuilder.control<boolean>(false, { nonNullable: true });\r\n this.inputTag = formBuilder.control<string | null>(null);\r\n this.outputTag = formBuilder.control<string | null>(null);\r\n this.run = formBuilder.control<number>(0, {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n this.toRun = formBuilder.control<number>(0, { nonNullable: true });\r\n this.value = formBuilder.control<string | null>(null);\r\n\r\n // svg\r\n this.svg = formBuilder.control<string>('', {\r\n validators: [SvgValidators.rootGValidator()],\r\n nonNullable: true,\r\n });\r\n this.elementFeatures = formBuilder.control<Record<string, Feature[]>>(\r\n {},\r\n { nonNullable: true },\r\n );\r\n this.newTextHidden = formBuilder.control<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.dpFeatures = formBuilder.control<Feature[]>([], { nonNullable: true });\r\n\r\n this.form = formBuilder.group({\r\n rank: this.rank,\r\n groupId: this.groupId,\r\n features: this.features,\r\n sources: this.sources,\r\n type: this.type,\r\n at: this.at,\r\n atAsIndex: this.atAsIndex,\r\n to: this.to,\r\n toAsIndex: this.toAsIndex,\r\n inputTag: this.inputTag,\r\n outputTag: this.outputTag,\r\n run: this.run,\r\n toRun: this.toRun,\r\n value: this.value,\r\n svg: this.svg,\r\n elementFeatures: this.elementFeatures,\r\n newTextHidden: this.newTextHidden,\r\n dpFeatures: this.dpFeatures,\r\n });\r\n\r\n // when operation changes, update form\r\n effect(() => {\r\n this.updateForm(this.operation());\r\n });\r\n\r\n // diagnostic logging for multiValuedFeatureIds\r\n effect(() => {\r\n console.log(\r\n '[ChainOperationEditor] multiValuedFeatureIds:',\r\n this.multiValuedFeatureIds(),\r\n );\r\n });\r\n\r\n // when rangePatch changes, patch operation range (at and run,\r\n // resetting atAsIndex to false)\r\n effect(() => {\r\n const range = this.rangePatch();\r\n\r\n if (range) {\r\n console.log('patching range', range);\r\n\r\n this.at.setValue(range.at);\r\n this.at.markAsDirty();\r\n this.at.updateValueAndValidity();\r\n\r\n this.atAsIndex.setValue(false);\r\n this.atAsIndex.markAsDirty();\r\n this.atAsIndex.updateValueAndValidity();\r\n\r\n this.run.setValue(range.run);\r\n this.run.markAsDirty();\r\n this.run.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever svg or base change, update preview\r\n this._subs.push(\r\n this.form.valueChanges\r\n .pipe(\r\n filter((changes) => 'svg' in changes || 'snapshot' in changes),\r\n debounceTime(500),\r\n )\r\n .subscribe(() => {\r\n this.requestPreview();\r\n }),\r\n );\r\n\r\n // whenever type changes, update args UI\r\n this._subs.push(\r\n this.type.valueChanges.subscribe(() => this.updateArgsUI()),\r\n );\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n for (const sub of this._subs) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n private toggleLfEscape(\r\n text: string | null | undefined,\r\n on: boolean,\r\n ): string | null | undefined {\r\n if (!text) return text;\r\n return on ? text.replace(/\\\\/g, '\\n') : text.replace(/\\n/g, '\\\\');\r\n }\r\n\r\n private hasTextChanges(snapshot?: Snapshot): boolean {\r\n if ((!snapshot && this.snapshot()) || (snapshot && !this.snapshot())) {\r\n return true;\r\n }\r\n if (snapshot?.text !== this.snapshot()?.text) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public onFeaturesChange(features: OperationFeature[]): void {\r\n this.features.setValue(features);\r\n this.features.markAsDirty();\r\n }\r\n\r\n public onDpFeaturesChange(features: Feature[]): void {\r\n this.dpFeatures.setValue(features);\r\n this.dpFeatures.markAsDirty();\r\n }\r\n\r\n // #region sources\r\n public addSource(): void {\r\n this.editedSource.set({ id: '', type: '' });\r\n this.editedSourceIndex.set(-1);\r\n }\r\n\r\n public editSource(index: number): void {\r\n this.editedSourceIndex.set(index);\r\n this.editedSource.set(structuredClone(this.sources.value[index]));\r\n }\r\n\r\n public closeSource(): void {\r\n this.editedSourceIndex.set(-1);\r\n this.editedSource.set(undefined);\r\n }\r\n\r\n public onSourceChange(source: OperationSource): void {\r\n const sources = [...this.sources.value];\r\n if (this.editedSourceIndex() === -1) {\r\n sources.push(source);\r\n } else {\r\n sources[this.editedSourceIndex()] = source;\r\n }\r\n this.sources.setValue(sources);\r\n this.closeSource();\r\n }\r\n // #endregion\r\n\r\n private updateArgsUI(): void {\r\n let to = false,\r\n toRun = false,\r\n value = false;\r\n switch (this.type.value) {\r\n case OperationType.moveAfter:\r\n case OperationType.moveBefore:\r\n to = true;\r\n break;\r\n case OperationType.swap:\r\n to = true;\r\n toRun = true;\r\n break;\r\n case OperationType.addAfter:\r\n case OperationType.addBefore:\r\n case OperationType.replace:\r\n value = true;\r\n break;\r\n }\r\n this.hasTo.set(to);\r\n this.hasToRun.set(toRun);\r\n this.hasValue.set(value);\r\n\r\n if (!to) {\r\n this.to.reset();\r\n }\r\n if (!toRun) {\r\n this.toRun.reset();\r\n }\r\n if (!value) {\r\n this.value.reset();\r\n }\r\n }\r\n\r\n private updateForm(operation?: CharChainOperation | null): void {\r\n if (!operation) {\r\n this.form.reset();\r\n this.updateArgsUI();\r\n return;\r\n }\r\n\r\n // get or generate ID\r\n if (operation.id) {\r\n this.id.set(operation.id);\r\n } else {\r\n this.id.set(this._nanoid());\r\n }\r\n\r\n this.rank.setValue(operation.rank || 0);\r\n this.groupId.setValue(operation.groupId || null);\r\n this.features.setValue(operation.features || []);\r\n this.sources.setValue(operation.sources || []);\r\n\r\n this.type.setValue(operation.type);\r\n this.at.setValue(operation.at);\r\n this.atAsIndex.setValue(operation.atAsIndex || false);\r\n this.to.setValue(operation.to || 0);\r\n this.toAsIndex.setValue(operation.toAsIndex || false);\r\n this.inputTag.setValue(operation.inputTag || null);\r\n this.outputTag.setValue(operation.outputTag || null);\r\n this.run.setValue(operation.run);\r\n this.toRun.setValue(operation.toRun || 0);\r\n // escape line feeds in value for editing\r\n this.value.setValue(this.toggleLfEscape(operation.value, true) || null);\r\n\r\n this.form.markAsPristine();\r\n\r\n this.updateArgsUI();\r\n }\r\n\r\n public cancel(): void {\r\n this.operationCancel.emit();\r\n }\r\n\r\n private getOperation(): CharChainOperation {\r\n return {\r\n rank: this.rank.value || undefined,\r\n groupId: this.groupId.value || undefined,\r\n features: this.features.value?.length ? this.features.value : undefined,\r\n sources: this.sources.value?.length ? this.sources.value : undefined,\r\n id: this.id()!,\r\n type: this.type.value,\r\n at: this.at.value,\r\n atAsIndex: this.atAsIndex.value || undefined,\r\n to: this.to.value || undefined,\r\n toAsIndex: this.toAsIndex.value || undefined,\r\n inputTag: this.inputTag.value || undefined,\r\n outputTag: this.outputTag.value || undefined,\r\n run: this.run.value,\r\n toRun: this.toRun.value || undefined,\r\n // un-escape line feeds in value for storage\r\n value: this.toggleLfEscape(this.value.value, false) || undefined,\r\n };\r\n }\r\n\r\n public requestPreview(): void {\r\n this.operationPreview.emit(this.getOperation());\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n\r\n this.operation.set(this.getOperation());\r\n this.operationChange.emit(this.operation()!);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group [selectedIndex]=\"tabIndex()\">\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id() }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\"\r\n ><mat-icon>layers</mat-icon> replace</mat-option\r\n >\r\n <mat-option [value]=\"1\"\r\n ><mat-icon>close</mat-icon>delete</mat-option\r\n >\r\n <mat-option [value]=\"2\"\r\n ><mat-icon>last_page</mat-icon>add-before</mat-option\r\n >\r\n <mat-option [value]=\"3\"\r\n ><mat-icon>first_page</mat-icon>add-after</mat-option\r\n >\r\n <mat-option [value]=\"4\"\r\n ><mat-icon>login</mat-icon>move-before</mat-option\r\n >\r\n <mat-option [value]=\"5\"\r\n ><mat-icon>logout</mat-icon>move-after</mat-option\r\n >\r\n <mat-option [value]=\"6\"\r\n ><mat-icon>compare_arrows</mat-icon>swap</mat-option\r\n >\r\n <mat-option [value]=\"7\"\r\n ><mat-icon>edit_note</mat-icon>annotate</mat-option\r\n >\r\n </mat-select>\r\n @if ($any(type).errors?.required && (type.dirty || type.touched)) {\r\n <mat-error>type required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n @if ($any(at).errors?.required && (at.dirty || at.touched)) {\r\n <mat-error>at required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n @if ($any(run).errors?.required && (run.dirty || run.touched)) {\r\n <mat-error>run required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n @if ($any(to).errors?.required && (to.dirty || to.touched)) {\r\n <mat-error>to required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun()) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n @if (\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n ) {\r\n <mat-error>to run required</mat-error>\r\n }\r\n </mat-form-field>\r\n }\r\n }\r\n\r\n <!-- value -->\r\n @if (hasValue()) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n @if ($any(rank).errors?.required && (rank.dirty || rank.touched)) {\r\n <mat-error>rank required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n @if (\r\n $any(groupId).errors?.required && (groupId.dirty || groupId.touched)\r\n ) {\r\n <mat-error>group ID required</mat-error>\r\n }\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [featNames]=\"featureDefs()?.names\"\r\n [featValues]=\"featureDefs()?.values\"\r\n [features]=\"features.value\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr [class.selected]=\"s === editedSource()\">\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (editedSource()) {\r\n <!-- source editor -->\r\n <mat-expansion-panel\r\n [disabled]=\"!editedSource()\"\r\n [expanded]=\"editedSource()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource()\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n }\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview()) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, effect, input, Input, signal } from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport {\r\n Feature,\r\n LabeledId,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\nimport { FeatureMap } from '../feature-editor/feature-editor.component';\r\n\r\n/**\r\n * 🔑 `gve-feature-set-view`\r\n *\r\n * A component to display a list of features.\r\n * Used by the chain result view component.\r\n *\r\n * - ▶️ `features` (`Feature[]`): the features to display.\r\n * - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display\r\n * in the _name_ selection. This is used when you have a closed list of features.\r\n * - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified\r\n * and the user selects a feature name present in the map keys, the corresponding\r\n * values will be used to populate the value selection.\r\n * - ▶️ `filterThreshold` (`number`): the threshold at which the features filter\r\n * should become visible. If set to 0, the filter is always visible; if set to -1,\r\n * it is always invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n@Component({\r\n selector: 'gve-feature-set-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n FlatLookupPipe,\r\n ],\r\n templateUrl: './feature-set-view.component.html',\r\n styleUrl: './feature-set-view.component.css',\r\n})\r\nexport class FeatureSetViewComponent {\r\n private _sub?: Subscription;\r\n\r\n /**\r\n * The features.\r\n */\r\n public readonly features = input<Feature[] | OperationFeature[]>([]);\r\n\r\n /**\r\n * The list of feature names to display in the name selection.\r\n * This is used when you have a closed list of features.\r\n */\r\n public readonly featNames = input<LabeledId[] | undefined>();\r\n\r\n /**\r\n * The feature values map. When specified and the user selects a feature\r\n * name present in the map keys, the corresponding values will be used\r\n * to populate the value selection.\r\n */\r\n public readonly featValues = input<FeatureMap | undefined>();\r\n\r\n /**\r\n * The threshold at which the features filter should become visible.\r\n * If set to 0, the filter is always visible; if set to -1, it is always\r\n * invisible; otherwise, it gets visible when the number of features\r\n * is greater than the threshold. Default is 5.\r\n */\r\n public readonly filterThreshold = input(5);\r\n\r\n public readonly filteredFeatures = signal<Feature[] | OperationFeature[]>([]);\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control(null);\r\n\r\n // when features change, reset the filter and apply it\r\n effect(() => {\r\n const features = this.features();\r\n this.filter.reset();\r\n this.applyFeatureFilter();\r\n });\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures.set(\r\n this.features().filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\r\n })\r\n );\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._sub = this.filter.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(300))\r\n .subscribe((value) => {\r\n this.applyFeatureFilter(value);\r\n });\r\n this.applyFeatureFilter();\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n}\r\n","<div>\r\n <!-- filter -->\r\n <div>\r\n @if (filterThreshold() === 0 || features()!.length > filterThreshold()) {\r\n <div class=\"form-row\">\r\n <mat-form-field id=\"filter\">\r\n <mat-label>filter</mat-label>\r\n <input matInput [formControl]=\"filter\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"filter.reset()\"\r\n [disabled]=\"!filter.value\"\r\n [attr.aria-label]=\"'Reset filter'\"\r\n >\r\n <mat-icon color=\"warn\" class=\"mat-warn\">cancel</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n <span id=\"badge\">{{ filteredFeatures().length }}</span>\r\n </div>\r\n }\r\n\r\n <!-- list -->\r\n @if (filteredFeatures().length) {\r\n <table>\r\n <tbody>\r\n @for (feature of filteredFeatures(); track $index) {\r\n <tr>\r\n <th>\r\n @if (featNames()?.length) {\r\n <span>{{\r\n feature.name | flatLookup: featNames() : \"id\" : \"label\"\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.name }}</span>\r\n }\r\n </th>\r\n <td>\r\n @if (featValues()) {\r\n <span>{{\r\n feature.value | flatLookup: featValues()![feature.name]\r\n }}</span>\r\n } @else {\r\n <span>{{ feature.value }}</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { ChainOperationContextStep } from '../../services/gve-api.service';\r\n\r\n/**\r\n * 🔑 `gve-steps-map`\r\n *\r\n * A map of steps in a chain operation context. This shows the list of\r\n * steps in the execution of a set of operations, and allows the user to\r\n * pick a step to view.\r\n *\r\n * Used by the `gve-chain-result-view` component.\r\n *\r\n * - ▶️ `steps` (`ChainOperationContextStep[]`): the steps to display.\r\n * - ▶️ `selectedStep` (`ChainOperationContextStep`): the step that is\r\n * currently selected.\r\n * - ▶️ `textFontSize` (`string`): the font size of the steps text.\r\n * - 🔥 `selectedStepChange` (`ChainOperationContextStep`): emitted when\r\n * the selectd step has been changed by the user. This is not emitted\r\n * when the selected step is changed programmatically, unless this is\r\n * the first time the steps are set. In that case, the last step is\r\n * automatically selected.\r\n */\r\n@Component({\r\n selector: 'gve-steps-map',\r\n imports: [MatButtonModule, MatRippleModule, MatTooltipModule],\r\n templateUrl: './steps-map.component.html',\r\n styleUrl: './steps-map.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StepsMapComponent implements AfterViewInit {\r\n // track view initialization\r\n private _viewInitialized = signal(false);\r\n // track whether we've processed the steps/selection\r\n private _selectionProcessed = signal(false);\r\n\r\n // the lines of each version text, keyed under the output tag\r\n public readonly lines = signal<{ [key: string]: string[] }>({});\r\n\r\n /**\r\n * The steps to display.\r\n */\r\n public readonly steps = input<ChainOperationContextStep[]>([]);\r\n\r\n /**\r\n * The step that is currently selected.\r\n */\r\n public readonly selectedStep = model<ChainOperationContextStep | undefined>();\r\n\r\n /**\r\n * The font size of the steps text.\r\n */\r\n public readonly textFontSize = input('0.8em');\r\n\r\n constructor() {\r\n // handle steps updates\r\n effect(() => {\r\n const currentSteps = this.steps();\r\n if (currentSteps && currentSteps.length > 0) {\r\n this.updateLines(currentSteps);\r\n } else {\r\n this.lines.set({});\r\n }\r\n\r\n // reset selection processing when steps change\r\n this._selectionProcessed.set(false);\r\n });\r\n\r\n // handle synchronization between steps and selectedStep\r\n effect(() => {\r\n // only proceed if view is initialized and we haven't processed selection yet\r\n if (this._viewInitialized() && !this._selectionProcessed()) {\r\n const currentSteps = this.steps();\r\n const currentSelectedStep = this.selectedStep();\r\n\r\n // if we have steps, handle selection\r\n if (currentSteps && currentSteps.length > 0) {\r\n if (currentSelectedStep) {\r\n // if we have both inputs, verify selection is valid\r\n this.validateAndSetSelection(currentSelectedStep);\r\n } else {\r\n // auto-select last step if no selection provided\r\n this.selectedStep.set(currentSteps[currentSteps.length - 1]);\r\n }\r\n\r\n // mark as processed\r\n this._selectionProcessed.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private validateAndSetSelection(step: ChainOperationContextStep): void {\r\n const currentSteps = this.steps();\r\n\r\n // check if the selected step exists in the steps array\r\n const stepExists = currentSteps.some((s) => s.outputTag === step.outputTag);\r\n\r\n if (stepExists) {\r\n // valid selection, keep it\r\n this.selectedStep.set(step);\r\n } else {\r\n // invalid selection, default to last step\r\n const lastStep = currentSteps[currentSteps.length - 1];\r\n this.selectedStep.set(lastStep);\r\n }\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for selection processing\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n private updateLines(steps: ChainOperationContextStep[] | undefined) {\r\n if (!steps) {\r\n this.lines.set({});\r\n return;\r\n }\r\n\r\n const lines: { [key: string]: string[] } = {};\r\n for (let i = 0; i < steps.length; i++) {\r\n const step = this.steps()![i];\r\n lines[step.outputTag] = step.result?.split('\\n') || [];\r\n }\r\n this.lines.set(lines);\r\n }\r\n\r\n public onStepClick(step: ChainOperationContextStep) {\r\n this.selectedStep.set(step);\r\n }\r\n}\r\n","<div>\r\n @if (steps().length) { @for (step of steps(); track step.outputTag) {\r\n <div\r\n matRipple\r\n class=\"step form-row\"\r\n [class.selected]=\"step === selectedStep()\"\r\n (click)=\"onStepClick(step)\"\r\n >\r\n <!-- tag -->\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} &#x25b6; </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <!-- text lines -->\r\n <div class=\"text\" [style.fontSize]=\"textFontSize()\">\r\n @for (line of lines()[step.outputTag]; track $index) {\r\n <div class=\"line\">{{ line }}</div>\r\n }\r\n <div></div>\r\n </div>\r\n </div>\r\n } }\r\n</div>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport {\r\n CharNode,\r\n Feature,\r\n OperationFeature,\r\n} from '../../models';\r\n\r\nimport { FeatureSetViewComponent } from '../feature-set-view/feature-set-view.component';\r\nimport { StepsMapComponent } from '../steps-map/steps-map.component';\r\nimport {\r\n BaseTextViewComponent,\r\n BaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChainResult,\r\n} from '../../services/gve-api.service';\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport { MatTooltip } from \"@angular/material/tooltip\";\r\n\r\n/**\r\n * 🔑 `gve-chain-result-view`\r\n *\r\n * Component to display a chain result. This provides a version picker\r\n * by staged version or simple step, and shows the selected step's text\r\n * and features, plus a steps map. User can pick a step from both the\r\n * pickers or the map.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `result` (`CharChainResult`): the result to display.\r\n * - 🔥 `stepPick` (`ChainOperationContextStep`): emitted when a\r\n * result's step is picked by the user.\r\n */\r\n@Component({\r\n selector: 'gve-chain-result-view',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n FeatureSetViewComponent,\r\n StepsMapComponent,\r\n BaseTextViewComponent,\r\n MatTooltip\r\n],\r\n templateUrl: './chain-result-view.component.html',\r\n styleUrl: './chain-result-view.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChainResultViewComponent\r\n implements OnInit, OnDestroy, AfterViewInit\r\n{\r\n private _subs?: Subscription[];\r\n // track if we've already performed step selection\r\n private _stepSelectionDone = signal(false);\r\n // track if component view is initialized\r\n private _viewInitialized = signal(false);\r\n\r\n /**\r\n * The result to display.\r\n */\r\n public readonly result = input<CharChainResult | undefined>();\r\n\r\n /**\r\n * The index of the initial step to display after the result is set.\r\n * If the index is negative, it is counted from the end of the steps.\r\n */\r\n public readonly initialStepIndex = input<number | undefined>();\r\n\r\n /**\r\n * Emitted when a result's step is picked by the user.\r\n */\r\n public readonly stepPick = output<ChainOperationContextStep>();\r\n\r\n public readonly versionTags = signal<string[]>([]);\r\n public readonly tags = signal<string[]>([]);\r\n public readonly step = signal<ChainOperationContextStep | undefined>(\r\n undefined\r\n );\r\n public readonly selection = signal<string | undefined>(undefined);\r\n public readonly selectionFeatures = signal<OperationFeature[]>([]);\r\n public readonly selectionRange = signal<BaseTextRange | undefined>(\r\n undefined\r\n );\r\n\r\n /**\r\n * True to disable range picking. For instance the snapshot editor,\r\n * which uses rangePick to set the edited operation's range, disables\r\n * this when no operation is being edited.\r\n */\r\n public readonly disabledRangePick = input<boolean>(true);\r\n\r\n /**\r\n * Emitted when a range is picked.\r\n */\r\n public readonly rangePick = output<BaseTextRange>();\r\n\r\n public versionTag: FormControl<string | null>;\r\n public tag: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // bind callback methods\r\n this.getCharColor = this.getCharColor.bind(this);\r\n // this.getCharBorderColor = this.getCharBorderColor.bind(this);\r\n\r\n this.versionTag = formBuilder.control<string | null>(null);\r\n this.tag = formBuilder.control<string | null>(null);\r\n\r\n // when result changes, update the form\r\n effect(() => {\r\n this.updateForm(this.result());\r\n // select the initial step if set\r\n this.selectInitialStep(this.initialStepIndex());\r\n });\r\n\r\n // when either the result or initialStepIndex changes, try to select a step\r\n effect(() => {\r\n // only proceed if we haven't already done selection and view is ready\r\n if (!this._stepSelectionDone() && this._viewInitialized()) {\r\n const currentResult = this.result();\r\n const currentIndex = this.initialStepIndex();\r\n\r\n // if we have both pieces of data needed for selection, do it\r\n if (currentResult?.steps?.length && currentIndex !== undefined) {\r\n this.doInitialStepSelection(currentResult, currentIndex);\r\n this._stepSelectionDone.set(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private doInitialStepSelection(\r\n result: CharChainResult,\r\n initialStepIndex: number\r\n ): void {\r\n // calculate the effective index (handling negative indices)\r\n const effectiveIndex =\r\n initialStepIndex < 0\r\n ? result.steps.length + initialStepIndex\r\n : initialStepIndex;\r\n\r\n // ensure the index is valid\r\n if (effectiveIndex >= 0 && effectiveIndex < result.steps.length) {\r\n const targetStep = result.steps[effectiveIndex];\r\n\r\n // if we have a tag control (which we do based on your code)\r\n if (targetStep.outputTag) {\r\n // using the tag control ensures all the necessary updates happen\r\n this.tag.setValue(targetStep.outputTag);\r\n }\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [\r\n // whenever the staged version tag changes, update the tag\r\n this.versionTag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.tag.setValue(this.getTagFromVersion(value) || null);\r\n }),\r\n\r\n // whenever the tag changes, update the step\r\n this.tag.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n this.selectionFeatures.set([]); // reset selection features\r\n this.step.set(\r\n this.result()?.steps.find((step) => step.outputTag === value)\r\n );\r\n if (this.step()) {\r\n this.stepPick.emit(this.step()!);\r\n }\r\n }),\r\n ];\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n // signal that view is ready for initial selection\r\n setTimeout(() => {\r\n this._viewInitialized.set(true);\r\n });\r\n }\r\n\r\n public getCharColor(node: CharNode): string | null {\r\n const features = this.getNodeFeatures(node.id);\r\n return features?.some(\r\n (f) => f.name === '$seg-out' || f.name === '$seg2-out'\r\n )\r\n ? 'orange'\r\n : null;\r\n }\r\n\r\n private selectInitialStep(initialStepIndex?: number): void {\r\n if (initialStepIndex !== undefined && this.result()?.steps) {\r\n this.step.set(\r\n this.result()!.steps[\r\n initialStepIndex < 0\r\n ? this.result()!.steps.length + initialStepIndex\r\n : initialStepIndex\r\n ]\r\n );\r\n } else {\r\n this.step.set(undefined);\r\n }\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._subs?.forEach((sub) => sub.unsubscribe());\r\n }\r\n\r\n private updateVersionTags(): void {\r\n if (!this.result()) {\r\n this.versionTags.set([]);\r\n return;\r\n }\r\n\r\n // extract version tags from result steps features named 'version'\r\n const tags = new Set<string>();\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version') {\r\n tags.add(feature.value);\r\n }\r\n }\r\n }\r\n this.versionTags.set(Array.from(tags).sort());\r\n }\r\n\r\n private getTagFromVersion(version?: string | null): string | undefined {\r\n if (!this.result() || !version) {\r\n return undefined;\r\n }\r\n for (const step of this.result()!.steps) {\r\n for (const feature of step.featureSet.features) {\r\n if (feature.name === 'version' && feature.value === version) {\r\n return step.outputTag;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private updateForm(result?: CharChainResult): void {\r\n this.selectionFeatures.set([]);\r\n\r\n if (!result) {\r\n this.step.set(undefined);\r\n this.selection.set(undefined);\r\n this.tags.set([]);\r\n this.versionTags.set([]);\r\n } else {\r\n this.tags.set(result.chainTags.filter((t) => t.length > 0 && t !== 'v0'));\r\n this.updateVersionTags();\r\n }\r\n\r\n // reset step selection tracking when result changes\r\n this._stepSelectionDone.set(false);\r\n }\r\n\r\n private getNodeFeatures(id: number): Feature[] {\r\n if (!this.step()) {\r\n return [];\r\n }\r\n return (\r\n this.step()!.featureSet.nodeFeatures[this.step()!.outputTag + '_' + id] ||\r\n []\r\n );\r\n }\r\n\r\n private findNode(id: number): CharNode | null {\r\n if (!this.step()) {\r\n return null;\r\n }\r\n for (let key of Object.keys(this.result()!.taggedNodes)) {\r\n const node = this.result()!.taggedNodes[key].find((n) => n.id === id);\r\n if (node) {\r\n return node;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public onTextCharPick(event: BaseTextCharEvent): void {\r\n const features = this.getNodeFeatures(event.char.id);\r\n const node = this.findNode(event.char.id)!;\r\n this.selection.set(`${event.char.label} (${node.sourceTag})`);\r\n this.selectionFeatures.set([...features]);\r\n\r\n this.selectionRange.set({ at: event.char.id, run: 1 });\r\n }\r\n\r\n public onTextRangePick(range: BaseTextRange): void {\r\n if (range.run === 1) {\r\n // already handled by onStepCharPick\r\n return;\r\n }\r\n this.selection.set(range.at + '×' + range.run);\r\n this.selectionRange.set(range);\r\n const end = range.at + range.run;\r\n\r\n const features: Feature[] = [];\r\n const tagNodes = this.result()!.taggedNodes[this.tag.value!];\r\n\r\n for (let node of tagNodes) {\r\n // if in range, intersect features\r\n if (node.id >= range.at && node.id < end) {\r\n const nodeFeatures = this.getNodeFeatures(node.id);\r\n\r\n if (node.id === range.at) {\r\n for (let f of nodeFeatures) {\r\n features.push(f);\r\n }\r\n } else {\r\n // features = intersection of features and charFeatures\r\n features.splice(\r\n 0,\r\n features.length,\r\n ...features.filter((f) =>\r\n nodeFeatures.some((cf) => cf.name === f.name)\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.selectionFeatures.set(features);\r\n }\r\n\r\n public onStepChange(step?: ChainOperationContextStep): void {\r\n this.selectionFeatures.set([]);\r\n if (step) {\r\n // setting the tag will trigger the step change\r\n this.tag.setValue(step.outputTag);\r\n }\r\n }\r\n\r\n public pickRange(): void {\r\n if (this.selectionRange()) {\r\n this.rangePick.emit(this.selectionRange()!);\r\n }\r\n }\r\n}\r\n","@if (result()) {\r\n<div id=\"container\">\r\n <div id=\"bar\" class=\"form-row\">\r\n <!-- version -->\r\n @if (versionTags().length) {\r\n <mat-form-field>\r\n <mat-label>stage</mat-label>\r\n <mat-select [formControl]=\"versionTag\">\r\n <mat-option [value]=\"null\">-</mat-option>\r\n @for (t of versionTags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- tag -->\r\n @if (tags().length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags(); track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n <!-- range picker -->\r\n @if (selectionRange()) {\r\n <div class=\"range\">\r\n {{ selectionRange()!.at }}×{{ selectionRange()!.run }}\r\n </div>\r\n @if (!disabledRangePick()) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Pick this range for the edited operation\"\r\n (click)=\"pickRange()\"\r\n [disabled]=\"disabledRangePick()\"\r\n >\r\n <mat-icon class=\"mat-warn\">file_open</mat-icon>\r\n </button>\r\n } }\r\n </div>\r\n\r\n <!-- step -->\r\n @if (step()) {\r\n <div id=\"step\">\r\n <!-- text -->\r\n <div id=\"text\">\r\n <gve-base-text-view\r\n [text]=\"result()!.taggedNodes[step()!.outputTag]\"\r\n [colorCallback]=\"getCharColor\"\r\n [hasLineNumber]=\"true\"\r\n (charPick)=\"onTextCharPick($event)\"\r\n (rangePick)=\"onTextRangePick($event)\"\r\n />\r\n </div>\r\n <!-- features -->\r\n <div id=\"feats\" class=\"form-row-top\">\r\n <div id=\"g-feats\">\r\n <div class=\"feat-header\">{{ step()!.outputTag }}</div>\r\n <gve-feature-set-view [features]=\"step()!.featureSet.features\" />\r\n </div>\r\n <div id=\"n-feats\">\r\n @if (selectionFeatures().length) {\r\n <div class=\"feat-header\">{{ selection() }}</div>\r\n <gve-feature-set-view [features]=\"selectionFeatures()\" />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- steps map -->\r\n <div id=\"map\">\r\n <gve-steps-map\r\n [steps]=\"result()!.steps\"\r\n [selectedStep]=\"step()\"\r\n (selectedStepChange)=\"onStepChange($event)\"\r\n />\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n Component,\r\n effect,\r\n Inject,\r\n model,\r\n OnInit,\r\n Optional,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { CharNode, PayloadMatDialogConfig } from '../../models';\r\nimport { GveBaseTextService } from '../../services/gve-base-text.service';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-text-editor`\r\n *\r\n * A component to edit a snapshot text. This component can be used both in a dialog\r\n * and as a standalone component.\r\n *\r\n * - ▶️ `text` (`CharNode[]`): the text to edit.\r\n * - 🔥 `textChange` (`CharNode[]`): event emitted when text changes.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-text-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n ],\r\n templateUrl: './snapshot-text-editor.component.html',\r\n styleUrl: './snapshot-text-editor.component.css',\r\n})\r\nexport class SnapshotTextEditorComponent implements OnInit {\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public readonly text = model<CharNode[]>([]);\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n // this component can be used as a dialog\r\n @Optional()\r\n public dialogRef?: MatDialogRef<SnapshotTextEditorComponent>,\r\n @Optional()\r\n @Inject(MAT_DIALOG_DATA)\r\n public data?: PayloadMatDialogConfig<{ text?: CharNode[] }>,\r\n ) {\r\n this.userText = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(5000)],\r\n });\r\n this.form = new FormGroup({\r\n userText: this.userText,\r\n });\r\n\r\n // when text changes, update the user text\r\n effect(() => {\r\n this.updateUserText(this.text());\r\n });\r\n }\r\n\r\n private updateUserText(nodes: CharNode[]): void {\r\n this.userText.setValue(nodes.map((node) => node.data).join(''));\r\n this.userText.markAsPristine();\r\n this.userText.updateValueAndValidity();\r\n }\r\n\r\n public ngOnInit() {\r\n if (this.data?.payload?.text) {\r\n this.text.set(this.data.payload.text);\r\n }\r\n }\r\n\r\n public close(): void {\r\n this.dialogRef?.close();\r\n }\r\n\r\n public copyToClipboard(): void {\r\n const json = JSON.stringify(\r\n GveBaseTextService.stringToBaseChars(this.userText.value),\r\n );\r\n navigator.clipboard.writeText(json);\r\n this._snackbar.open('Copied JSON code to clipboard', undefined, { duration: 2000 });\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userText.setValue(this.userText.value.trim());\r\n if (!this.userText.value) {\r\n return;\r\n }\r\n this.text.set(GveBaseTextService.stringToBaseChars(this.userText.value));\r\n this.dialogRef?.close(this.text());\r\n }\r\n}\r\n","<div [style.padding]=\"dialogRef ? '8px' : '0'\">\r\n @if (dialogRef) {\r\n <div id=\"heading\">\r\n <h2>Set Base Text</h2>\r\n </div>\r\n }\r\n <form [formGroup]=\"form\" (submit)=\"save()\">\r\n <fieldset>\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>base text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"8\"></textarea>\r\n @if (\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n ) {\r\n <mat-error>text required</mat-error>\r\n }\r\n @if (\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n ) {\r\n <mat-error>text too long</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"form-row-center\">\r\n @if (dialogRef) {\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Close dialog\"\r\n (click)=\"close()\"\r\n >\r\n close\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Copy JSON to clipboard\"\r\n [disabled]=\"form.invalid\"\r\n (click)=\"copyToClipboard()\"\r\n >\r\n JSON\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Set base text\"\r\n [disabled]=\"form.invalid\"\r\n (click)=\"save()\"\r\n >\r\n set\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n</div>\r\n","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\r\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { customAlphabet } from 'nanoid';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport {\r\n DEFAULT_SETTINGS,\r\n GveRenditionSettings,\r\n GveSnapshotRendition,\r\n} from '@myrmidon/gve-snapshot-rendition';\r\n\r\nimport {\r\n BaseTextViewComponent,\r\n BaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport {\r\n ChainOperationEditorComponent,\r\n FeatureDefinitions,\r\n} from '../chain-operation-editor/chain-operation-editor.component';\r\nimport {\r\n ChainOperationContextStep,\r\n CharChain,\r\n CharChainResult,\r\n GveApiService,\r\n} from '../../services/gve-api.service';\r\nimport { ChainResultViewComponent } from '../chain-result-view/chain-result-view.component';\r\nimport { BatchOperationEditorComponent } from '../batch-operation-editor/batch-operation-editor.component';\r\nimport { SnapshotTextEditorComponent } from '../snapshot-text-editor/snapshot-text-editor.component';\r\nimport { CharChainOperation, CharNode, Snapshot } from '../../models';\r\nimport { GveBaseTextService } from '../../services/gve-base-text.service';\r\n\r\n// default snapshot view title\r\nconst VIEW_TITLE = 'preview';\r\n\r\n// suffix for IDs of SVG elements to be made transparent at first rendition\r\nconst SVG_TRANSP_SUFFIX = '_t';\r\n\r\n/**\r\n * 🔑 `gve-snapshot-editor`\r\n *\r\n * A component to edit a text snapshot. This is the top level component in the GVE core\r\n * library.\r\n *\r\n * - ▶️ `snapshot` (`Snapshot`): the snapshot to edit.\r\n * - ▶️ `batchOps` (`string`): the batch operations text to set for the editor.\r\n * - ▶️ `noSave` (`boolean`): true to disable saving.\r\n * - 🔥 `snapshotChange` (`Snapshot`): emitted when the user saves the edited snapshot.\r\n * - 🔥 `snapshotCancel` (`void`): emitted when the user cancels the snapshot editing.\r\n */\r\n@Component({\r\n selector: 'gve-snapshot-editor',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCheckboxModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatSliderModule,\r\n MatSlideToggle,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ChainOperationEditorComponent,\r\n ChainResultViewComponent,\r\n BaseTextViewComponent,\r\n FlatLookupPipe,\r\n ],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './snapshot-editor.component.html',\r\n styleUrl: './snapshot-editor.component.css',\r\n})\r\nexport class SnapshotEditorComponent {\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _previewing?: boolean;\r\n private _stepPickFrozen?: boolean;\r\n\r\n /**\r\n * Reference to the snapshot rendition web component.\r\n * Using viewChild signal to handle conditionally rendered element -\r\n * the element only exists when result() is truthy.\r\n */\r\n public readonly renditionRef =\r\n viewChild<ElementRef<GveSnapshotRendition>>('rendition');\r\n\r\n /**\r\n * The snapshot to edit.\r\n */\r\n public readonly snapshot = model<Snapshot | undefined>();\r\n\r\n /**\r\n * The batch operations text to set for the editor.\r\n */\r\n public readonly batchOps = input<string | undefined>();\r\n\r\n /**\r\n * True to disable saving.\r\n */\r\n public readonly noSave = input<boolean | undefined>();\r\n\r\n /**\r\n * True to enable debug mode for view rendition.\r\n */\r\n public readonly debug = input<boolean | undefined>();\r\n\r\n /**\r\n * True to not show character decoration according to the trace\r\n * features in nodes.\r\n */\r\n public readonly noDecoration = input<boolean | undefined>();\r\n\r\n /**\r\n * Definitions for features, including names and values.\r\n */\r\n public readonly featureDefs = input<FeatureDefinitions | undefined>();\r\n\r\n /**\r\n * The IDs of the features that are multi-valued. If a feature being\r\n * edited is in this list, the feature editor will allow adding multiple\r\n * values to it. Passed down to feature editors.\r\n */\r\n public readonly multiValuedFeatureIds = input<string[] | undefined>([\r\n 'r_hints',\r\n ]);\r\n\r\n /**\r\n * Settings for rendering the snapshot. These are passed to the snapshot rendition\r\n * component.\r\n */\r\n public readonly renditionSettings =\r\n input<GveRenditionSettings>(DEFAULT_SETTINGS);\r\n\r\n /**\r\n * Emitted when the user cancels the snapshot editing.\r\n */\r\n public readonly snapshotCancel = output();\r\n\r\n // base text\r\n public baseText: FormControl<CharNode[]>;\r\n // operations\r\n public operations: FormControl<CharChainOperation[]>;\r\n public form: FormGroup;\r\n\r\n public readonly featDetails: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true },\r\n );\r\n public readonly autoRun: FormControl<boolean> = new FormControl<boolean>(\r\n false,\r\n { nonNullable: true },\r\n );\r\n\r\n public readonly chain = signal<CharChain | undefined>(undefined);\r\n\r\n // the currently picked base text range\r\n public readonly textRange = signal<BaseTextRange | undefined>(undefined);\r\n // the lines count for the current base text\r\n public readonly lineCount = signal<number>(0);\r\n // the currently edited operation\r\n public readonly editedOp = signal<CharChainOperation | undefined>(undefined);\r\n public readonly editedOpIndex = signal<number>(-1);\r\n // the patch to apply to the edited operation's range\r\n public readonly editedOpRangePatch = signal<BaseTextRange | undefined>(\r\n undefined,\r\n );\r\n\r\n public readonly busy = signal<boolean>(false);\r\n\r\n public readonly opTypeMap = {\r\n 0: 'replace',\r\n 1: 'delete',\r\n 2: 'add-before',\r\n 3: 'add-after',\r\n 4: 'move-before',\r\n 5: 'move-after',\r\n 6: 'swap',\r\n 7: 'annotate',\r\n };\r\n\r\n // operations execution result\r\n public readonly result = signal<CharChainResult | undefined>(undefined);\r\n public readonly resultOperationId = signal<string | undefined>(undefined);\r\n public readonly initialStepIndex = signal<number>(-1);\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n private _dialog: MatDialog,\r\n private _dialogService: DialogService,\r\n private _snackbar: MatSnackBar,\r\n ) {\r\n // base text\r\n this.baseText = new FormControl<CharNode[]>([], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n });\r\n // operations\r\n this.operations = new FormControl<CharChainOperation[]>([], {\r\n nonNullable: true,\r\n });\r\n\r\n // form\r\n this.form = formBuilder.group({\r\n baseText: this.baseText,\r\n operations: this.operations,\r\n });\r\n\r\n // when snapshot changes, update the form\r\n effect(() => {\r\n this.updateForm(this.snapshot());\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n });\r\n\r\n // diagnostic logging for multiValuedFeatureIds\r\n effect(() => {\r\n console.log(\r\n '[SnapshotEditor] multiValuedFeatureIds:',\r\n this.multiValuedFeatureIds(),\r\n );\r\n });\r\n\r\n // when rendition element becomes available (conditionally rendered),\r\n // initialize its settings and event listeners\r\n effect(() => {\r\n const rendition = this.renditionRef()?.nativeElement;\r\n if (rendition) {\r\n this.initRendition(rendition);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initialize rendition settings and event listeners when the element becomes available.\r\n * Called via effect since the element is conditionally rendered.\r\n */\r\n private initRendition(rendition: GveSnapshotRendition): void {\r\n console.log('GveSnapshotRendition.version:', GveSnapshotRendition.version);\r\n\r\n // set initial settings\r\n this.applyRenditionSettings();\r\n\r\n // listen to version change events\r\n rendition.addEventListener('versionTagChange', (event: Event) => {\r\n const customEvent = event as CustomEvent;\r\n console.log('Version changed:', customEvent.detail);\r\n });\r\n }\r\n\r\n /**\r\n * Apply settings to the rendition component.\r\n */\r\n private applyRenditionSettings(): void {\r\n const rendition = this.renditionRef()?.nativeElement;\r\n if (!rendition) {\r\n return;\r\n }\r\n\r\n const settings = this.renditionSettings();\r\n settings.debug = this.debug() || false;\r\n rendition.settings = settings as GveRenditionSettings;\r\n }\r\n\r\n /**\r\n * Update the snapshot rendition component with the current result data.\r\n */\r\n private updateRendition(): void {\r\n const rendition = this.renditionRef()?.nativeElement;\r\n const result = this.result();\r\n if (rendition && result) {\r\n // update settings with latest rendition settings\r\n this.applyRenditionSettings();\r\n // supply the base text (not returned by API, must be provided by caller)\r\n result.text = this.baseText.value;\r\n // set data\r\n rendition.data = result;\r\n }\r\n }\r\n\r\n /**\r\n * Set the view data for the snapshot view.\r\n *\r\n * @param snapshot The optional snapshot data to use. If not provided,\r\n * a snapshot will be created from the form data.\r\n * @param title The optional title to set for the view.\r\n */\r\n private setViewData(snapshot?: Snapshot, title = VIEW_TITLE): void {\r\n console.log('set view data');\r\n\r\n // get the snapshot to use\r\n if (!snapshot) {\r\n snapshot = this.getSnapshot();\r\n }\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\r\n this.initialStepIndex.set(-1);\r\n\r\n if (!snapshot) {\r\n this.form.reset();\r\n } else {\r\n if (Array.isArray(snapshot.text)) {\r\n this.baseText.setValue(snapshot.text);\r\n } else {\r\n this.baseText.setValue(\r\n GveBaseTextService.stringToBaseChars(snapshot.text),\r\n );\r\n }\r\n this.operations.setValue(snapshot.operations);\r\n }\r\n this.updateLineCount(this.baseText.value);\r\n\r\n this.form.markAsPristine();\r\n }\r\n\r\n // #region base text\r\n public inputBaseText(): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(SnapshotTextEditorComponent, {\r\n data: { payload: { text: [...this.baseText.value] } },\r\n width: '80%',\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((text: CharNode[]) => {\r\n if (text?.length) {\r\n // update the form control and reset the current text range\r\n this.baseText.setValue(text);\r\n this.baseText.updateValueAndValidity();\r\n this.baseText.markAsDirty();\r\n this.textRange.set(undefined);\r\n\r\n // update the line count\r\n this.updateLineCount(text);\r\n\r\n // remove all operations and update the view data\r\n this.removeAllOperations();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the line count based on the received text.\r\n * @param text The text to use for counting lines.\r\n */\r\n private updateLineCount(text: CharNode[]) {\r\n if (!text.length) {\r\n this.lineCount.set(0);\r\n } else {\r\n this.lineCount.set(text.filter((c) => c.data === '\\n').length + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by the base text editor to pick a text range.\r\n * @param range The picked range.\r\n * @param applyToOp True to also apply the picked range to the edited operation.\r\n */\r\n public onRangePick(range?: BaseTextRange, applyToOp = false): void {\r\n this.textRange.set(range);\r\n\r\n if (applyToOp) {\r\n this.editedOpRangePatch.set({ ...range } as BaseTextRange);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region operations\r\n /**\r\n * Edit a new operation.\r\n */\r\n public editNewOperation() {\r\n // create a new operation and edit it, using as the initial range\r\n // the base text range if any\r\n const range = this.textRange();\r\n\r\n this.editedOp.set({\r\n id: this._nanoid(),\r\n type: 0,\r\n at: range?.at || 0,\r\n run: range?.run || 1,\r\n });\r\n this.editedOpIndex.set(-1);\r\n }\r\n\r\n /**\r\n * Edit (a copy of) the operation at the specified index.\r\n * @param index The operation index.\r\n */\r\n public editOperation(index: number) {\r\n this.editedOpIndex.set(index);\r\n this.editedOp.set(structuredClone(this.operations.value[index]));\r\n }\r\n\r\n /**\r\n * Close the currently edited operation.\r\n */\r\n private closeEditedOperation() {\r\n this.editedOpIndex.set(-1);\r\n this.editedOp.set(undefined);\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to cancel\r\n * the current operation edits.\r\n */\r\n public onOperationCancel() {\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Handle the event fired by the operation editor to change\r\n * the currently edited operation, or add a new one if that\r\n * was a new operation.\r\n * @param op The changed operation.\r\n */\r\n public onOperationChange(op?: CharChainOperation | null) {\r\n if (!op) {\r\n return;\r\n }\r\n console.log('operation change');\r\n const operations = [...this.operations.value];\r\n\r\n // replace or add the operation\r\n let i = this.editedOpIndex();\r\n if (this.editedOpIndex() > -1) {\r\n operations.splice(this.editedOpIndex(), 1, op);\r\n } else {\r\n operations.push(op);\r\n i = operations.length - 1;\r\n }\r\n\r\n // update the operations form control\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // run to the edited operation if auto-run is enabled\r\n if (this.autoRun.value) {\r\n this.runTo(i);\r\n }\r\n\r\n // close the edited operation\r\n this.closeEditedOperation();\r\n }\r\n\r\n /**\r\n * Delete the operation at the specified index.\r\n * @param index The index of the operation to delete.\r\n */\r\n public deleteOperation(index: number) {\r\n this._dialogService\r\n .confirm(\r\n 'Confirm Deletion',\r\n `Delete operation \"${this.operations.value[index].id}\"?`,\r\n )\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n // close the edited operation if it is the one being deleted\r\n if (this.editedOpIndex() === index) {\r\n this.closeEditedOperation();\r\n }\r\n // reset the result operation ID if it is the one being deleted\r\n if (this.resultOperationId() === this.operations.value[index].id) {\r\n this.resultOperationId.set(undefined);\r\n }\r\n // delete the operation and update the form control\r\n const operations = [...this.operations.value];\r\n operations.splice(index, 1);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Duplicate the operation at the specified index, inserting the copy\r\n * immediately after the original.\r\n * @param index The index of the operation to duplicate.\r\n */\r\n public duplicateOperation(index: number): void {\r\n const operations = [...this.operations.value];\r\n const clone = structuredClone(operations[index]);\r\n clone.id = this._nanoid();\r\n operations.splice(index + 1, 0, clone);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Move the operation at the specified index up by one position.\r\n * @param index The index of the operation to move up.\r\n */\r\n public moveOperationUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const operations = [...this.operations.value];\r\n const op = operations.splice(index, 1)[0];\r\n operations.splice(index - 1, 0, op);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Move the operation at the specified index down by one position.\r\n * @param index The index of the operation to move down.\r\n */\r\n public moveOperationDown(index: number): void {\r\n const operations = [...this.operations.value];\r\n if (index >= operations.length - 1) {\r\n return;\r\n }\r\n const op = operations.splice(index, 1)[0];\r\n operations.splice(index + 1, 0, op);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n }\r\n\r\n public copyOperationsJson() {\r\n const json = JSON.stringify(this.operations.value, null, 2);\r\n navigator.clipboard.writeText(json).then(() => {\r\n this._snackbar.open('Operations JSON copied to clipboard', 'OK', {\r\n duration: 3000,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Parse the operations from their text and append them to the current\r\n * snapshot operations.\r\n */\r\n public parseOperations() {\r\n if (this.busy()) {\r\n return;\r\n }\r\n\r\n const dialogRef = this._dialog.open(BatchOperationEditorComponent, {\r\n data: { preset: this.batchOps },\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((batchOps: CharChainOperation[]) => {\r\n if (batchOps) {\r\n const operations = [...this.operations.value];\r\n operations.push(...batchOps);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n // update the view data\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove all the operations, close the edited operation and update the view data.\r\n */\r\n private removeAllOperations(): void {\r\n this.resultOperationId.set(undefined);\r\n this.closeEditedOperation();\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.setViewData();\r\n this.result.set(undefined);\r\n }\r\n\r\n /**\r\n * Remove all the operations.\r\n */\r\n public clearOperations(): void {\r\n this._dialogService\r\n .confirm('Confirm', 'Remove all operations?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.removeAllOperations();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Parse all the id attributes from the received SVG code and\r\n * return them as an array.\r\n *\r\n * @param svg The SVG content to parse or undefined.\r\n * @returns Array of IDs found in the SVG content or undefined.\r\n */\r\n private parseSvgIds(svg?: string): string[] | undefined {\r\n if (!svg) {\r\n return undefined;\r\n }\r\n\r\n const regex = /<[^>]+\\bid=([\"'])(.*?)\\1/g;\r\n const ids: string[] = [];\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(svg)) !== null) {\r\n ids.push(match[2]);\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n private getTransparentIds(g?: string): string[] | undefined {\r\n if (!g) {\r\n return undefined;\r\n }\r\n return this.parseSvgIds(g)?.filter((id) => id.endsWith(SVG_TRANSP_SUFFIX));\r\n }\r\n\r\n /**\r\n * Supply operation nodes to the snapshot text nodes. An execution result is\r\n * a compact object, so that to build a snapshot accumulating all the nodes\r\n * and their features up to the last executed operation, we need to start\r\n * with the base text nodes, and then examine each execution step in the\r\n * result. Each step contains only those nodes used by the version of the\r\n * text corresponding to its stage. Among them, some are new nodes, and some\r\n * are base text nodes. Also, the step contains the full set of features\r\n * current at its time, both for the text as a whole and for each node.\r\n * This method accumulates the nodes and their features up to the specified\r\n * step, updating the features of the nodes already present in the snapshot\r\n * text nodes, and adding the new nodes.\r\n *\r\n * @param snapshot The snapshot to supply the nodes to.\r\n * @param result The operations execution result.\r\n * @param tag The output tag of the operation to supply the nodes from.\r\n */\r\n private supplyOpNodes(\r\n snapshot: Snapshot,\r\n result: CharChainResult,\r\n tag: string,\r\n ): void {\r\n // get the original nodes from the snapshot base text\r\n const nodes = snapshot.text as CharNode[];\r\n\r\n // find the max ID in the original nodes, so that any ID greater than it\r\n // belongs to new nodes\r\n const maxOriginalId = nodes.reduce((max, n) => Math.max(max, n.id), 0);\r\n const stepIndex = result.steps.findIndex((s) => s.outputTag === tag);\r\n\r\n // for each step up to the specified one, add the nodes introduced by the step\r\n // and update the features from each step node that is already present\r\n for (let i = 0; i <= stepIndex; i++) {\r\n // get the nodes of the step\r\n const stepNodes = result.taggedNodes[result.steps[i].outputTag];\r\n\r\n for (const stepNode of stepNodes) {\r\n // if the node was added, add it\r\n if (\r\n stepNode.id > maxOriginalId &&\r\n !nodes.find((n) => n.id === stepNode.id)\r\n ) {\r\n nodes.push(stepNode);\r\n } else {\r\n // if the node was already in the original nodes, update its features\r\n const existing = nodes.findIndex((n) => n.id === stepNode.id);\r\n if (existing > -1) {\r\n nodes[existing].features = stepNode.features;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // update the snapshot text nodes\r\n snapshot.text = nodes;\r\n }\r\n\r\n /**\r\n * Run the operations up to the specified index (included).\r\n * This is called when:\r\n * - a preview is requested by the operation editor.\r\n * - the currently edited operation is saved.\r\n * - the user picks a step in the chain result view.\r\n * - runToLast is called, which happens when:\r\n * - setting the snapshot.\r\n * - parsing a batch of operations.\r\n * - deleting an operation.\r\n *\r\n * @param index The index of the operation to run to.\r\n * @param lastOperation The operation to use in place of the existing\r\n * operation in the snapshot at index. This is used when previewing\r\n * the edited operation from within the operation editor.\r\n * @returns A promise that resolves to the execution result.\r\n */\r\n public runTo(index: number, lastOperation?: CharChainOperation): void {\r\n if (this.busy()) {\r\n return;\r\n }\r\n console.log('run to: ' + index);\r\n\r\n // get the snapshot to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n\r\n // remove from the snapshot the operations past the specified index,\r\n // also replacing the last operation when this was received as a parameter\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n lastOperation = snapshot.operations[index];\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n\r\n // update result operation ID\r\n this.resultOperationId.set(snapshot.operations[index].id);\r\n\r\n // run the operations\r\n this.busy.set(true);\r\n this.initialStepIndex.set(index);\r\n this._api\r\n .runOperations(snapshot.text as CharNode[], snapshot.operations)\r\n .subscribe({\r\n next: (wrapper) => {\r\n // handle operation (non-fatal) error or result\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n return;\r\n }\r\n\r\n // set the result\r\n console.log('result:', wrapper.result);\r\n this.result.set(wrapper.result);\r\n\r\n // update the rendition component\r\n this.updateRendition();\r\n\r\n // supply the last operation output tag from its result step if not set\r\n if (!lastOperation.outputTag) {\r\n const step = wrapper.result!.steps.find(\r\n (s) => s.operation.id === lastOperation.id,\r\n );\r\n lastOperation.outputTag = step!.outputTag;\r\n }\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(\r\n snapshot,\r\n wrapper.result!,\r\n lastOperation.outputTag,\r\n );\r\n\r\n // update the view data\r\n this.setViewData(snapshot, lastOperation!.outputTag);\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Run the operations up to the last operation if any, updating the\r\n * execution result. The execution result is always the result from\r\n * all the operations, as users must be able to browse across its steps.\r\n */\r\n public runToLast(): void {\r\n if (this.operations.value.length) {\r\n this.runTo(this.operations.value.length - 1);\r\n } else {\r\n this.setViewData();\r\n this.result.set(undefined);\r\n }\r\n }\r\n\r\n /**\r\n * Update the snapshot view by running the operations up to the\r\n * currently edited operation if any.\r\n *\r\n * @param operation The operation being previewed.\r\n */\r\n public onOperationPreview(operation: CharChainOperation): void {\r\n // no multiple previews or previewing a new operation or auto-run disabled\r\n if (this._previewing || this.editedOpIndex() < 0 || !this.autoRun.value) {\r\n return;\r\n }\r\n this._previewing = true;\r\n setTimeout(() => {\r\n this.runTo(this.editedOpIndex(), operation);\r\n this._previewing = false;\r\n }, 0);\r\n }\r\n // #endregion\r\n\r\n /**\r\n * Handle the event fired by the chain result view to pick a step.\r\n *\r\n * @param step The step to pick.\r\n */\r\n public onStepPick(step: ChainOperationContextStep): void {\r\n const result = this.result();\r\n if (!result || this._stepPickFrozen) {\r\n return;\r\n }\r\n\r\n // get base text snapshot\r\n const snapshot = this.getSnapshot();\r\n\r\n // get the step index\r\n const index = snapshot.operations.findIndex(\r\n (o) => o.id === step.operation.id,\r\n );\r\n\r\n // remove snapshot operations after the picked step to avoid\r\n // their visuals creep into the snapshot view\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n\r\n // update result operation ID\r\n this.resultOperationId.set(snapshot.operations[index].id);\r\n\r\n // update the snapshot text nodes with those introduced by operations\r\n this.supplyOpNodes(snapshot, result, step.outputTag);\r\n\r\n // update the view data\r\n this.setViewData(snapshot, step.outputTag);\r\n }\r\n\r\n /**\r\n * Emit the cancel event for this snapshot edit.\r\n */\r\n public close(): void {\r\n this.snapshotCancel.emit();\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data.\r\n *\r\n * @returns New snapshot object.\r\n */\r\n private getSnapshot(): Snapshot {\r\n const snapshot: Snapshot = {\r\n // snapshot nodes might be changed, so we copy them\r\n // to avoid changing the original snapshot\r\n text: structuredClone(this.baseText.value),\r\n operations: structuredClone(this.operations.value),\r\n };\r\n\r\n return snapshot;\r\n }\r\n\r\n /**\r\n * Get a snapshot from the form data and emit it\r\n * in the snapshot change event.\r\n */\r\n public save(): void {\r\n if (this.form.invalid || this.noSave()) {\r\n return;\r\n }\r\n this.snapshot.set(this.getSnapshot());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>article</mat-icon> <span class=\"label\">text</span>\r\n </ng-template>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <!-- base text -->\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"mat-warn\"\r\n matTooltip=\"Enter base text\"\r\n (click)=\"inputBaseText()\"\r\n [disabled]=\"busy()\"\r\n >\r\n <mat-icon>edit</mat-icon> base text\r\n </button>\r\n\r\n @if (textRange()) {\r\n <span id=\"text-range\"\r\n >{{ textRange()!.at }}×{{ textRange()!.run }}</span\r\n >\r\n }\r\n </div>\r\n\r\n <!-- text characters -->\r\n <gve-base-text-view\r\n [text]=\"baseText.value\"\r\n [hasLineNumber]=\"true\"\r\n (rangePick)=\"onRangePick($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>edit</mat-icon> <span class=\"label\">operations</span>\r\n </ng-template>\r\n\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- feat details -->\r\n <mat-slide-toggle\r\n [formControl]=\"featDetails\"\r\n matTooltip=\"Toggle feature details\"\r\n >feat. details</mat-slide-toggle\r\n >\r\n <!-- auto run on edit -->\r\n <mat-slide-toggle\r\n [formControl]=\"autoRun\"\r\n matTooltip=\"Auto-run operations on edit\"\r\n >auto-run</mat-slide-toggle\r\n >\r\n\r\n <div class=\"form-row right\">\r\n <!-- copy ops JSON -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy operations as JSON to clipboard\"\r\n [disabled]=\"!operations.value.length || busy()\"\r\n (click)=\"copyOperationsJson()\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n\r\n <!-- remove ops -->\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy()\"\r\n (click)=\"clearOperations()\"\r\n >\r\n <mat-icon>delete_forever</mat-icon> clear\r\n </button>\r\n\r\n <!-- batch add ops -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n matTooltip=\"Add a batch of operations\"\r\n class=\"mat-primary\"\r\n [disabled]=\"busy()\"\r\n (click)=\"parseOperations()\"\r\n >\r\n <mat-icon>post_add</mat-icon> batch\r\n </button>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n matTooltip=\"Add a new operation\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th>nr.</th>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (\r\n operation of operations.value;\r\n track operation.id;\r\n let index = $index\r\n ) {\r\n <tr\r\n [class.selected]=\"operation.id === resultOperationId()\"\r\n [class.edited]=\"operation.id === editedOp()?.id\"\r\n >\r\n <td class=\"fit-width\">{{ index + 1 }}.</td>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"mat-accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n <!-- duplicate -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"duplicateOperation(index)\"\r\n matTooltip=\"Duplicate operation\"\r\n >\r\n <mat-icon>control_point_duplicate</mat-icon>\r\n </button>\r\n <!-- move up -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"moveOperationUp(index)\"\r\n matTooltip=\"Move operation up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- move down -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"moveOperationDown(index)\"\r\n matTooltip=\"Move operation down\"\r\n [disabled]=\"index === operations.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup: opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>\r\n @if (operation.features?.length) {\r\n @if (featDetails.value) {\r\n <div class=\"form-row\">\r\n @for (\r\n feat of operation.features;\r\n track $index;\r\n let i = $index\r\n ) {\r\n <div class=\"feature\">\r\n <span class=\"fname\">{{\r\n feat.name\r\n | flatLookup\r\n : featureDefs()?.names\r\n : \"id\"\r\n : \"label\"\r\n }}</span\r\n >=<span class=\"fvalue\">{{\r\n feat.value\r\n | flatLookup\r\n : featureDefs()?.values?.[feat.name]\r\n : \"id\"\r\n : \"label\"\r\n }}</span>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n {{ operation.features?.length }}\r\n }\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n @if (editedOp()) {\r\n <mat-expansion-panel\r\n [expanded]=\"editedOp()\"\r\n [disabled]=\"!editedOp()\"\r\n >\r\n <mat-expansion-panel-header>\r\n <mat-panel-title\r\n >operation {{ editedOp()?.id }}</mat-panel-title\r\n >\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [featureDefs]=\"featureDefs()\"\r\n [multiValuedFeatureIds]=\"multiValuedFeatureIds()\"\r\n [hidePreview]=\"editedOpIndex() === -1\"\r\n [operation]=\"editedOp()\"\r\n [rangePatch]=\"editedOpRangePatch()\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- progress -->\r\n <div>\r\n @if (busy()) {\r\n <mat-progress-bar mode=\"indeterminate\" />\r\n }\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result()) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result()!\"\r\n [initialStepIndex]=\"initialStepIndex()\"\r\n [disabledRangePick]=\"editedOp() ? false : true\"\r\n (stepPick)=\"onStepPick($event)\"\r\n (rangePick)=\"onRangePick($event, true)\"\r\n />\r\n </fieldset>\r\n }\r\n\r\n <!-- snapshot view -->\r\n @if (result()) {\r\n <div id=\"preview\">\r\n <gve-snapshot-rendition #rendition class=\"rendition\">\r\n </gve-snapshot-rendition>\r\n </div>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave()) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n","import { Injectable } from '@angular/core';\r\nimport { CharChain, CharChainNode } from './gve-api.service';\r\n\r\n// You can use this online tool to visualize the graph:\r\n// https://dreampuf.github.io/GraphvizOnline\r\n// You can also append ?engine=dot#... where ... is the graphviz code.\r\n\r\n// https://graphviz.org/docs/attr-types/rankdir\r\nexport type GraphvizRankdir = 'TB' | 'LR' | 'BT' | 'RL';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GveGraphvizService {\r\n private hashString(str: string): number {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n hash = hash & hash; // convert to 32bit integer\r\n }\r\n return Math.abs(hash);\r\n }\r\n\r\n private hslToRgb(hue: number, saturation: number, lightness: number): string {\r\n const chroma =\r\n ((1 - Math.abs((2 * lightness) / 100 - 1)) * saturation) / 100;\r\n const x = chroma * (1 - Math.abs(((hue / 60) % 2) - 1));\r\n const m = lightness / 100 - chroma / 2;\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n\r\n if (hue >= 0 && hue < 60) {\r\n r = chroma;\r\n g = x;\r\n } else if (hue >= 60 && hue < 120) {\r\n r = x;\r\n g = chroma;\r\n } else if (hue >= 120 && hue < 180) {\r\n g = chroma;\r\n b = x;\r\n } else if (hue >= 180 && hue < 240) {\r\n g = x;\r\n b = chroma;\r\n } else if (hue >= 240 && hue < 300) {\r\n r = x;\r\n b = chroma;\r\n } else if (hue >= 300 && hue < 360) {\r\n r = chroma;\r\n b = x;\r\n }\r\n\r\n r = Math.round((r + m) * 255);\r\n g = Math.round((g + m) * 255);\r\n b = Math.round((b + m) * 255);\r\n\r\n return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\r\n }\r\n\r\n private getColorForTag(tag: string): string {\r\n const hash = this.hashString(tag);\r\n const hue = (hash * 137) % 360; // Use a prime number to spread out the hues\r\n const saturation = 60 + (hash % 40); // Saturation between 60% and 100%\r\n const lightness = 50 + (hash % 30); // Lightness between 50% and 80%\r\n return this.hslToRgb(hue, saturation, lightness);\r\n }\r\n\r\n private getExcludedNodeIds(chain: CharChain, tags?: string[]): Set<number> {\r\n // get only the desired links\r\n const links = chain.links.filter((link) =>\r\n tags ? tags.includes(link.tag) : true\r\n );\r\n // return all the nodes not referenced by the links\r\n const excluded = new Set<number>();\r\n chain.nodes.forEach((node) => {\r\n excluded.add(node.id);\r\n });\r\n links.forEach((link) => {\r\n excluded.delete(link.sourceId);\r\n excluded.delete(link.targetId);\r\n });\r\n return excluded;\r\n }\r\n\r\n /**\r\n * Represent the received chain as a Graphviz digraph.\r\n *\r\n * @param chain The source chain if any.\r\n * @param tags The tags to show. When set, only the links with these tags are shown.\r\n * @param rankdir The rank direction.\r\n * @returns Graphviz representation of the chain.\r\n */\r\n public generateGraph(\r\n chain?: CharChain,\r\n tags?: string[],\r\n rankdir: GraphvizRankdir = 'LR'\r\n ): string {\r\n if (!chain) {\r\n return 'digraph G {}';\r\n }\r\n\r\n const sb: string[] = [];\r\n const excludedNodeIds = this.getExcludedNodeIds(chain, tags);\r\n\r\n sb.push('digraph G {');\r\n sb.push(' bgcolor=transparent;');\r\n sb.push(' node [style=filled];');\r\n sb.push(` rankdir=${rankdir};`);\r\n chain.nodes.forEach((node) => {\r\n // note that in label we must escape the double quotes\r\n sb.push(\r\n ` ${node.id} [label=\"${node.label === '\"' ? '\"' : node.label}\"` +\r\n (node.sourceTag\r\n ? ` fillcolor=\"${this.getColorForTag(node.sourceTag)}\"`\r\n : '') +\r\n (node.sourceTag && excludedNodeIds.has(node.id)\r\n ? ` xlabel=\"${node.sourceTag}\"`\r\n : '') +\r\n '];'\r\n );\r\n });\r\n chain.links.forEach((link) => {\r\n if (\r\n !link.sourceId ||\r\n !link.targetId ||\r\n (tags && !tags.includes(link.tag))\r\n ) {\r\n return;\r\n }\r\n const color = this.getColorForTag(link.tag);\r\n sb.push(\r\n ` ${link.sourceId} -> ${link.targetId} [label=\"${link.tag}\", color=\"${color}\"];`\r\n );\r\n });\r\n sb.push('}');\r\n return sb.join('\\n');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of gve-core\r\n */\r\n\r\nexport * from './lib/models';\r\nexport * from './lib/components/base-text-char/base-text-char.component';\r\nexport * from './lib/components/base-text-editor/base-text-editor.component';\r\nexport * from './lib/components/base-text-view/base-text-view.component';\r\nexport * from './lib/components/batch-operation-editor/batch-operation-editor.component';\r\nexport * from './lib/components/chain-operation-editor/chain-operation-editor.component';\r\nexport * from './lib/components/chain-result-view/chain-result-view.component';\r\nexport * from './lib/components/feature-editor/feature-editor.component';\r\nexport * from './lib/components/feature-set-editor/feature-set-editor.component';\r\nexport * from './lib/components/feature-set-view/feature-set-view.component';\r\nexport * from './lib/components/operation-source-editor/operation-source-editor.component';\r\nexport * from './lib/components/snapshot-editor/snapshot-editor.component';\r\nexport * from './lib/components/snapshot-text-editor/snapshot-text-editor.component';\r\nexport * from './lib/components/steps-map/steps-map.component';\r\n\r\nexport * from './lib/services/gve-api.service';\r\nexport * from './lib/services/gve-base-text.service';\r\nexport * from './lib/services/gve-graphviz.service';\r\nexport * from './lib/services/settings.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i5","i6","i8","i7","i2","i4","debounceTime","i3.SettingsService","i9","i10","i11","i12","i13","i2.GveApiService"],"mappings":"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"}