@myrmidon/gve-core 0.0.5 → 1.0.0
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.
- package/README.md +2 -0
- package/fesm2022/myrmidon-gve-core.mjs +370 -259
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/lib/components/batch-operation-editor/batch-operation-editor.component.d.ts +46 -0
- package/lib/components/chain-result-view/chain-result-view.component.d.ts +4 -1
- package/lib/components/feature-editor/feature-editor.component.d.ts +1 -1
- package/lib/components/feature-set-editor/feature-set-editor.component.d.ts +1 -1
- package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +11 -9
- package/lib/components/steps-map/steps-map.component.d.ts +2 -0
- package/lib/models.d.ts +8 -0
- package/lib/services/gve-api.service.d.ts +33 -0
- package/package.json +10 -12
- package/public-api.d.ts +1 -0
- package/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +0 -207
- package/esm2022/lib/components/animation-timeline-set/animation-timeline-set.component.mjs +0 -154
- package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +0 -184
- package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +0 -46
- package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +0 -115
- package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +0 -159
- package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +0 -570
- package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +0 -222
- package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +0 -200
- package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +0 -175
- package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +0 -100
- package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +0 -126
- package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +0 -131
- package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +0 -72
- package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +0 -863
- package/esm2022/lib/components/steps-map/steps-map.component.mjs +0 -77
- package/esm2022/lib/models.mjs +0 -2
- package/esm2022/lib/services/gve-api.service.mjs +0 -65
- package/esm2022/lib/services/settings.service.mjs +0 -87
- package/esm2022/lib/validators/svg-validators.mjs +0 -34
- package/esm2022/myrmidon-gve-core.mjs +0 -5
- package/esm2022/public-api.mjs +0 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.html","../../../../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/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/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/components/simple-tree/simple-tree.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/simple-tree/simple-tree.component.html","../../../../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/ln-heights-editor/ln-heights-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/ln-heights-editor/ln-heights-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.html","../../../../projects/myrmidon/gve-core/src/lib/services/gve-api.service.ts","../../../../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/public-api.ts","../../../../projects/myrmidon/gve-core/src/myrmidon-gve-core.ts"],"sourcesContent":["import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { CommonModule } from '@angular/common';\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 { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { GveAnimationTween, TweenType } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-animation-tween`\r\n *\r\n * A component to edit an animation tween.\r\n * Used by the `gve-animation-timeline` component.\r\n *\r\n * - ▶️ `tween` (`GveAnimationTween`): the tween to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - 🔥 `tweenChange` (`GveAnimationTween`): emitted when the tween is changed.\r\n * - 🔥 `tweenCancel` (`void`): emitted when the user cancels the edit.\r\n */\r\n@Component({\r\n selector: 'gve-animation-tween',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './animation-tween.component.html',\r\n styleUrl: './animation-tween.component.css',\r\n})\r\nexport class AnimationTweenComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _tween?: GveAnimationTween;\r\n\r\n /**\r\n * The tween to edit.\r\n */\r\n @Input()\r\n public get tween(): GveAnimationTween | undefined {\r\n return this._tween;\r\n }\r\n public set tween(value: GveAnimationTween | undefined | null) {\r\n if (this._tween === value) {\r\n return;\r\n }\r\n this._tween = value || undefined;\r\n this.updateForm(this._tween);\r\n }\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n @Input()\r\n public elementIds?: string[];\r\n\r\n /**\r\n * Emitted when the tween is changed.\r\n */\r\n @Output()\r\n public readonly tweenChange = new EventEmitter<GveAnimationTween>();\r\n\r\n /**\r\n * Emitted when the user cancels the edit.\r\n */\r\n @Output()\r\n public readonly tweenCancel = new EventEmitter<void>();\r\n\r\n public types = ['to', 'from', 'fromTo', 'set'];\r\n\r\n public label: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public type: FormControl<TweenType>;\r\n public selector: FormControl<string>;\r\n public vars: FormControl<string>;\r\n public vars2: FormControl<string | null>;\r\n public position: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public elementId: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.label = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.note = formBuilder.control(null);\r\n this.type = formBuilder.control('to', { nonNullable: true });\r\n this.selector = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(200)],\r\n });\r\n this.vars = formBuilder.control('{}', {\r\n nonNullable: true,\r\n validators: [Validators.required, this.jsonValidator],\r\n });\r\n this.vars2 = formBuilder.control(null, this.jsonValidator);\r\n this.position = formBuilder.control(null, Validators.maxLength(100));\r\n this.form = formBuilder.group({\r\n label: this.label,\r\n note: this.note,\r\n type: this.type,\r\n selector: this.selector,\r\n vars: this.vars,\r\n vars2: this.vars2,\r\n position: this.position,\r\n });\r\n\r\n this.elementId = formBuilder.control(null);\r\n }\r\n\r\n public ngOnInit(): void {\r\n // set selector when elementId changes\r\n this._sub = this.elementId.valueChanges\r\n .pipe(debounceTime(200), distinctUntilChanged())\r\n .subscribe((elementId) => {\r\n if (elementId) {\r\n this.selector.setValue('#' + elementId);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public onVarsChange(vars: string): void {\r\n this.vars.setValue(vars);\r\n this.vars.markAsDirty();\r\n this.vars.updateValueAndValidity();\r\n }\r\n\r\n public onVars2Change(vars: string): void {\r\n this.vars2.setValue(vars);\r\n this.vars2.markAsDirty();\r\n this.vars2.updateValueAndValidity();\r\n }\r\n\r\n public close(): void {\r\n this.tweenCancel.emit();\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(tween?: GveAnimationTween): void {\r\n if (!tween) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.label.setValue(tween.label);\r\n this.note.setValue(tween.note || null);\r\n this.type.setValue(tween.type);\r\n this.selector.setValue(tween.selector);\r\n this.vars.setValue(tween.vars || '{}');\r\n this.vars2.setValue(tween.vars2 || null);\r\n this.position.setValue(tween.position || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getTween(): GveAnimationTween {\r\n return {\r\n label: this.label.value,\r\n note: this.note.value?.trim() || undefined,\r\n type: this.type.value,\r\n selector: this.selector.value.trim(),\r\n vars: this.vars.value,\r\n vars2: this.vars2.value || undefined,\r\n position: this.position.value?.trim() || undefined,\r\n };\r\n }\r\n\r\n public openUrl(url: string): void {\r\n window.open(url, '_blank');\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this._tween = this.getTween();\r\n this.tweenChange.emit(this._tween);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.maxLength && (label.dirty || label.touched)\"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\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 *ngFor=\"let t of types\" [value]=\"t\">{{ t }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- position -->\r\n <mat-form-field>\r\n <mat-label>position</mat-label>\r\n <input matInput [formControl]=\"position\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n [attr.aria-label]=\"'Information about position'\"\r\n (click)=\"\r\n openUrl(\r\n 'https://gsap.com/docs/v3/GSAP/Timeline/#positioning-animations-in-a-timeline'\r\n )\r\n \"\r\n >\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n <mat-hint>time label < > += -=</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(position).errors?.maxLength &&\r\n (position.dirty || position.touched)\r\n \"\r\n >position too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- selector -->\r\n <mat-form-field>\r\n <mat-label>selector</mat-label>\r\n <input matInput [formControl]=\"selector\" />\r\n <mat-hint>CSS selector</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.required &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.maxLength &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- element id -->\r\n @if (elementIds?.length) {\r\n <mat-form-field>\r\n <mat-label>element ID</mat-label>\r\n <mat-select [formControl]=\"elementId\">\r\n <mat-option *ngFor=\"let id of elementIds\" [value]=\"id\">{{\r\n id\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars).errors?.required && (vars.dirty || vars.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 'fromTo') {\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>2nd vars</mat-label>\r\n <textarea matInput [formControl]=\"vars2\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.required && (vars2.dirty || vars2.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.json && (vars2.dirty || vars2.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close tween\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-icon-button\r\n matTooltip=\"Save tween\"\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 { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { CommonModule } from '@angular/common';\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\nimport { NgToolsModule, NgToolsValidators } from '@myrmidon/ng-tools';\r\nimport {\r\n GveAnimationTimeline,\r\n GveAnimationTween,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTweenComponent } from '../animation-tween/animation-tween.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline`\r\n *\r\n * A component to edit an animation timeline.\r\n * Used by the `gve-animation-timeline-set` component.\r\n *\r\n * - ▶️ `timeline` (`GveAnimationTimeline`): the animation timeline to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected\r\n * by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelineChange` (`GveAnimationTimeline`): emitted when the timeline\r\n * is changed.\r\n * - 🔥 `timelineCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\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 NgToolsModule,\r\n AnimationTweenComponent,\r\n ],\r\n templateUrl: './animation-timeline.component.html',\r\n styleUrl: './animation-timeline.component.css',\r\n})\r\nexport class AnimationTimelineComponent {\r\n private _timeline?: GveAnimationTimeline;\r\n\r\n /**\r\n * The animation timeline to edit.\r\n */\r\n @Input()\r\n public get timeline(): GveAnimationTimeline | undefined {\r\n return this._timeline;\r\n }\r\n public set timeline(value: GveAnimationTimeline | undefined | null) {\r\n this._timeline = value || undefined;\r\n this.updateForm(this._timeline);\r\n }\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n @Input()\r\n public elementIds?: string[];\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n @Input()\r\n public tags: string[] = [];\r\n\r\n /**\r\n * Emitted when the timeline is changed.\r\n */\r\n @Output()\r\n public readonly timelineChange = new EventEmitter<GveAnimationTimeline>();\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n @Output()\r\n public readonly timelineCancel = new EventEmitter<void>();\r\n\r\n public tag: FormControl<string>;\r\n public tweens: FormControl<GveAnimationTween[]>;\r\n public vars: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public editedTweenIndex = -1;\r\n public editedTween?: GveAnimationTween;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.tag = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.tweens = formBuilder.control([], {\r\n nonNullable: true,\r\n validators: NgToolsValidators.strictMinLengthValidator(1),\r\n });\r\n this.vars = formBuilder.control(null, this.jsonValidator);\r\n\r\n this.form = formBuilder.group({\r\n tag: this.tag,\r\n tweens: this.tweens,\r\n vars: this.vars,\r\n });\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(timeline: GveAnimationTimeline | undefined) {\r\n if (!timeline) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.tag.setValue(timeline.tag);\r\n this.tweens.setValue(timeline.tweens);\r\n this.vars.setValue(timeline.vars || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public addTween(): void {\r\n this.editedTweenIndex = -1;\r\n this.editedTween = {\r\n label: 'tween #' + (this.tweens.value.length + 1),\r\n type: 'to',\r\n selector: '',\r\n };\r\n }\r\n\r\n public editTween(index: number): void {\r\n this.editedTweenIndex = index;\r\n this.editedTween = this.tweens.value[index];\r\n }\r\n\r\n public deleteTween(index: number): void {\r\n this.tweens.setValue(this.tweens.value.filter((_, i) => i !== index));\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public closeTween(): void {\r\n this.editedTween = undefined;\r\n this.editedTweenIndex = -1;\r\n }\r\n\r\n public saveTween(tween: GveAnimationTween): void {\r\n if (this.editedTweenIndex === -1) {\r\n this.tweens.setValue([...this.tweens.value, tween]);\r\n } else {\r\n this.tweens.setValue(\r\n this.tweens.value.map((t, index) =>\r\n index === this.editedTweenIndex ? tween : t\r\n )\r\n );\r\n }\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n this.closeTween();\r\n }\r\n\r\n public moveTweenUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index - 1];\r\n tweens[index - 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public moveTweenDown(index: number): void {\r\n if (index >= this.tweens.value.length - 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index + 1];\r\n tweens[index + 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n private getTimeline(): GveAnimationTimeline {\r\n return {\r\n tag: this.tag.value || '',\r\n tweens: this.tweens.value,\r\n vars: this.vars.value || undefined,\r\n };\r\n }\r\n\r\n public close(): void {\r\n this.timelineCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this._timeline = this.getTimeline();\r\n this.timelineChange.emit(this._timeline);\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\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-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.maxLength && (tag.dirty || tag.touched)\"\r\n >tag too long</mat-error\r\n >\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- tweens -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- tween editor -->\r\n <mat-expansion-panel [expanded]=\"editedTween\" [disabled]=\"!editedTween\">\r\n @if (editedTween) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween {{ editedTween.label }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds\"\r\n [tween]=\"editedTween\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (tweenCancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close timeline\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save timeline\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { NgToolsModule } from '@myrmidon/ng-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 borderColor: 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 standalone: true,\r\n imports: [MatRippleModule, NgToolsModule],\r\n templateUrl: './base-text-char.component.html',\r\n styleUrl: './base-text-char.component.css',\r\n})\r\nexport class BaseTextCharComponent {\r\n private _char: BaseTextChar | undefined;\r\n\r\n public defaultColor = '#D8D8D8';\r\n public defaultBorderColor = '#D8D8D8';\r\n public defaultEmSize = 1.5;\r\n\r\n /**\r\n * The character to display.\r\n */\r\n @Input()\r\n public get char(): BaseTextChar | undefined {\r\n return this._char;\r\n }\r\n public set char(value: BaseTextChar | undefined | null) {\r\n this._char = value || undefined;\r\n }\r\n\r\n /**\r\n * Emitted when the character is clicked.\r\n */\r\n @Output()\r\n public charPick: EventEmitter<BaseTextCharEvent> =\r\n new EventEmitter<BaseTextCharEvent>();\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 { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\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, SnapshotViewService } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * A range in the base text.\r\n */\r\nexport interface VarBaseTextRange {\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.\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 * - ▶️ `defaultBorderColor` (`string`): the default border color for the text.\r\n * - ▶️ `selectionColor` (`string`): the color for the selected text.\r\n * - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next 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` (`VarBaseTextRange`): emitted when a range is picked.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-view',\r\n standalone: true,\r\n imports: [CommonModule, BaseTextCharComponent],\r\n templateUrl: './base-text-view.component.html',\r\n styleUrl: './base-text-view.component.css',\r\n})\r\nexport class BaseTextViewComponent {\r\n private _text?: string | CharNode[];\r\n private _lastSelectedChar?: BaseTextChar;\r\n\r\n /**\r\n * The default color for the text.\r\n */\r\n @Input()\r\n public defaultColor = '#DBDBDB';\r\n\r\n /**\r\n * The default border color for the text.\r\n */\r\n @Input()\r\n public defaultBorderColor = '#DBDBDB';\r\n\r\n /**\r\n * The color for the selected text.\r\n */\r\n @Input()\r\n public selectionColor = '#3E92CC';\r\n\r\n /**\r\n * True if line numbers should be displayed next to each line.\r\n */\r\n @Input()\r\n public hasLineNumber = false;\r\n\r\n /**\r\n * The text to display.\r\n */\r\n @Input()\r\n public get text(): string | CharNode[] | undefined {\r\n return this._text;\r\n }\r\n public set text(value: string | CharNode[] | undefined | null) {\r\n this._text = value || undefined;\r\n this.buildLines();\r\n }\r\n\r\n /**\r\n * Emitted when a character is picked.\r\n */\r\n @Output()\r\n public charPick: EventEmitter<BaseTextCharEvent> =\r\n new EventEmitter<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 @Output()\r\n public rangePick: EventEmitter<VarBaseTextRange> =\r\n new EventEmitter<VarBaseTextRange>();\r\n\r\n public lines: BaseTextChar[][] = [];\r\n\r\n private buildLines(): void {\r\n if (!this._text) {\r\n this.lines = [];\r\n return;\r\n }\r\n\r\n const newLines: BaseTextChar[][] = [];\r\n newLines.push([]);\r\n\r\n if (Array.isArray(this._text)) {\r\n const nodes = this._text as CharNode[];\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: this.defaultColor,\r\n borderColor: this.defaultBorderColor,\r\n emSize: 1.5,\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 } else {\r\n for (let i = 0; i < this._text.length; i++) {\r\n const char: BaseTextChar = {\r\n id: i + 1,\r\n value: this._text[i],\r\n label: SnapshotViewService.translateSpecialChar(this._text[i]),\r\n color: this.defaultColor,\r\n borderColor: this.defaultBorderColor,\r\n emSize: 1.5,\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\r\n this.lines = newLines;\r\n }\r\n\r\n private resetColors(): void {\r\n for (const line of this.lines) {\r\n for (const c of line) {\r\n c.color = this.defaultColor;\r\n c.borderColor = this.defaultBorderColor;\r\n }\r\n }\r\n }\r\n\r\n public onCharPick(event: BaseTextCharEvent): void {\r\n this.resetColors();\r\n\r\n if (\r\n this._lastSelectedChar &&\r\n this._lastSelectedChar !== event.char &&\r\n event.event.ctrlKey\r\n ) {\r\n const minId = Math.min(this._lastSelectedChar.id, event.char.id);\r\n const maxId = Math.max(this._lastSelectedChar.id, event.char.id);\r\n\r\n for (const line of this.lines) {\r\n for (const c of line) {\r\n if (c.id >= minId && c.id <= maxId) {\r\n c.color = this.selectionColor;\r\n c.borderColor = this.selectionColor;\r\n }\r\n }\r\n }\r\n\r\n this.charPick.emit(event);\r\n this.rangePick.emit({ at: minId, run: maxId - minId + 1 });\r\n return;\r\n } else {\r\n // select current char\r\n event.char.color = this.selectionColor;\r\n event.char.borderColor = this.selectionColor;\r\n this.charPick.emit(event);\r\n this.rangePick.emit({ at: event.char.id, run: 1 });\r\n }\r\n\r\n this._lastSelectedChar = event.char;\r\n }\r\n}\r\n","<div id=\"text\">\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 } @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 Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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\nimport { CommonModule } from '@angular/common';\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 '@myrmidon/gve-snapshot-view';\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, 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 * - 🔥 `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 standalone: true,\r\n imports: [\r\n CommonModule,\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 _feature?: OperationFeature;\r\n private _map?: FeatureMap;\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 @Input()\r\n public featNames: 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 @Input()\r\n public get featValues(): FeatureMap | undefined {\r\n return this._map;\r\n }\r\n public set featValues(value: FeatureMap | undefined | null) {\r\n this._map = value || undefined;\r\n this.nameIds = this.getLabeledIdsFor(this.name.value);\r\n }\r\n\r\n /**\r\n * The feature to edit.\r\n */\r\n @Input()\r\n public get feature(): Feature | OperationFeature | undefined {\r\n return this._feature;\r\n }\r\n public set feature(value: Feature | OperationFeature | undefined | null) {\r\n if (this._feature === value) {\r\n return;\r\n }\r\n this._feature = value || undefined;\r\n\r\n this.updateForm(this._feature);\r\n setTimeout(() => {\r\n this.nameControl?.nativeElement?.focus();\r\n }, 500);\r\n }\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 @Input()\r\n public isVar = false;\r\n\r\n /**\r\n * Event emitted when the user cancels the feature editing.\r\n */\r\n @Output()\r\n public featureCancel = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when the user saves the edited feature.\r\n */\r\n @Output()\r\n public featureChange = new EventEmitter<Feature | OperationFeature>();\r\n\r\n public name: FormControl<string>;\r\n public value: 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\r\n public form: FormGroup;\r\n\r\n public nameIds?: LabeledId[];\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.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 setPolicy: this.setPolicy,\r\n isNegated: this.isNegated,\r\n isGlobal: this.isGlobal,\r\n isShortLived: this.isShortLived,\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever the name changes, update the value selection\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 = this.getLabeledIdsFor(name);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(id?: string): LabeledId[] | undefined {\r\n if (!id) {\r\n return undefined;\r\n }\r\n return this.featValues ? this.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 } 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 this._frozen = false;\r\n }\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 = 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 this.featureChange.emit(this.feature);\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 <mat-option *ngFor=\"let i of featNames\" [value]=\"i.id\">{{\r\n i.label\r\n }}</mat-option>\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 <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >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 <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <mat-select [formControl]=\"value\">\r\n <mat-option *ngFor=\"let e of nameIds\" [value]=\"e.id\">{{\r\n e.label\r\n }}</mat-option>\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 } @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 } @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 { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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 { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\nimport {\r\n FeatureSetPolicy,\r\n LabeledId,\r\n Feature,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\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 greater than the threshold. Default is 5.\r\n * - ▶️ `features` (`Feature[]`): the features to edit.\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 standalone: true,\r\n imports: [\r\n CommonModule,\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 NgToolsModule,\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 private _features: Feature[] | OperationFeature[];\r\n private _editedFeatureIndex: number;\r\n\r\n public POLICIES = ['M', 'S', 'SF'];\r\n\r\n /**\r\n * True if the features are variable features.\r\n */\r\n @Input()\r\n public isVar = false;\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 @Input()\r\n public featNames: 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 @Input()\r\n public featValues: 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 @Input()\r\n public filterThreshold = 5;\r\n\r\n /**\r\n * The features to edit.\r\n */\r\n @Input()\r\n public get features(): Feature[] | OperationFeature[] {\r\n return this._features;\r\n }\r\n public set features(value: Feature[] | OperationFeature[]) {\r\n if (this._features === value) {\r\n return;\r\n }\r\n this._features = value;\r\n this.applyFeatureFilter(this.filter.value);\r\n }\r\n\r\n /**\r\n * Emitted when the features change.\r\n */\r\n @Output()\r\n public featuresChange = new EventEmitter<Feature[] | OperationFeature[]>();\r\n\r\n public editedFeature?: Feature | OperationFeature;\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n public filteredFeatures: Feature[] | OperationFeature[];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this._features = [];\r\n this.filteredFeatures = [];\r\n this.filter = formBuilder.control<string | null>(null);\r\n this._editedFeatureIndex = -1;\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures = this.features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\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 }\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 = {\r\n name: '',\r\n value: '',\r\n setPolicy: FeatureSetPolicy.multiple,\r\n };\r\n this._editedFeatureIndex = -1;\r\n }\r\n\r\n public editFeature(feature: Feature | OperationFeature): void {\r\n this.editedFeature = feature;\r\n this._editedFeatureIndex = 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 = features;\r\n this.featuresChange.emit(this.features);\r\n }\r\n\r\n public onFeatureChange(feature: Feature | OperationFeature): void {\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.features = features;\r\n this.editedFeature = undefined;\r\n this._editedFeatureIndex = -1;\r\n this.featuresChange.emit(this.features);\r\n }\r\n\r\n public onFeatureCancel(): void {\r\n this.editedFeature = undefined;\r\n this._editedFeatureIndex = -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>negated</th>\r\n <th>global</th>\r\n <th>short-lived</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (feature of filteredFeatures; track feature) {\r\n <tr>\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 <span>{{ $any(feature).isNegated ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n <td>\r\n <span>{{ $any(feature).isGlobal ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n <td>\r\n <span>{{ $any(feature).isShortLived ? \"yes\" : \"no\" }}</span>\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 <mat-expansion-panel [disabled]=\"!editedFeature\" [expanded]=\"editedFeature\">\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 [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</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } 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 {\r\n CharNode,\r\n Feature,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\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 standalone: true,\r\n imports: [\r\n CommonModule,\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 private _text: CharNode[] = [];\r\n\r\n /**\r\n * The text to edit. In input this can be a string, an array of `CharNode`\r\n * objects. In output this will be an array of `CharNode` objects.\r\n */\r\n @Input()\r\n public get text(): CharNode[] {\r\n return this._text;\r\n }\r\n public set text(value: string | CharNode[] | undefined | null) {\r\n this.resetSelectedChar();\r\n if (this._text === value) {\r\n return;\r\n }\r\n if (!value) {\r\n this._text = [];\r\n } else {\r\n this._text = Array.isArray(value)\r\n ? value\r\n : SnapshotViewService.stringToBaseChars(value);\r\n }\r\n }\r\n\r\n /**\r\n * Emitted for the edited text as an array of `CharNode`'s whenever it changes.\r\n */\r\n @Output()\r\n public readonly textChange = new EventEmitter<CharNode[]>();\r\n\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public selectedChar?: CharNode;\r\n public selectedCharLabel?: string;\r\n public textRange?: VarBaseTextRange;\r\n\r\n constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\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\r\n private resetSelectedChar(): void {\r\n this.selectedChar = undefined;\r\n this.selectedCharLabel = undefined;\r\n }\r\n\r\n public onSelectedChar(event: BaseTextCharEvent): void {\r\n this.selectedChar = this._text.find((c) => c.id === event.char.id);\r\n this.selectedCharLabel = event.char.label;\r\n }\r\n\r\n public onFeaturesChange(features: Feature[]): void {\r\n this.selectedChar!.features = features;\r\n this.textChange.emit(this._text);\r\n }\r\n\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange = range;\r\n }\r\n\r\n public patchTextFromUser(): void {\r\n // TODO\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.text = this.userText.value;\r\n this.textChange.emit(this._text);\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 <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >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 <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\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 = $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 (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } 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 '@myrmidon/gve-snapshot-view';\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 standalone: true,\r\n imports: [\r\n CommonModule,\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 private _source: OperationSource | undefined;\r\n\r\n /**\r\n * The source to edit.\r\n */\r\n @Input()\r\n public get source(): OperationSource | undefined {\r\n return this._source;\r\n }\r\n public set source(value: OperationSource | undefined | null) {\r\n if (this._source === value) {\r\n return;\r\n }\r\n this._source = value || undefined;\r\n this.updateForm(this._source);\r\n }\r\n\r\n /**\r\n * The list of source IDs when it's closed.\r\n */\r\n @Input()\r\n public ids?: LabeledId[];\r\n\r\n /**\r\n * The list of source types when it's closed.\r\n */\r\n @Input()\r\n public types?: LabeledId[];\r\n\r\n /**\r\n * The event emitted when the source changes.\r\n */\r\n @Output()\r\n public readonly sourceChange = new EventEmitter<\r\n OperationSource | undefined\r\n >();\r\n\r\n /**\r\n * The event emitted when the edit is canceled.\r\n */\r\n @Output()\r\n public sourceCancel = new EventEmitter<void>();\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\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 = {\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 this.sourceChange.emit(this._source);\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 { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { TreeNode } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-simple-tree`\r\n *\r\n * A simple tree component.\r\n *\r\n * - ▶️ `node` (`TreeNode<any>`): the node to display.\r\n * - ▶️ `selectedNode` (`TreeNode<any> | null`): the selected node.\r\n * - 🔥 `selectedNodeChange` (`EventEmitter<TreeNode<any> | null>`): the event\r\n * emitted when the selected node changes.\r\n */\r\n@Component({\r\n selector: 'gve-simple-tree',\r\n standalone: true,\r\n imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule],\r\n templateUrl: './simple-tree.component.html',\r\n styleUrl: './simple-tree.component.css',\r\n})\r\nexport class SimpleTreeComponent implements OnInit {\r\n private _node: TreeNode<any> | undefined;\r\n\r\n /**\r\n * The node to display.\r\n */\r\n @Input()\r\n public get node(): TreeNode<any> | undefined {\r\n return this._node;\r\n }\r\n public set node(value: TreeNode<any> | undefined) {\r\n if (this._node === value) {\r\n return;\r\n }\r\n this._node = value;\r\n this.level = this.calculateLevel(value);\r\n }\r\n\r\n /**\r\n * The selected node.\r\n */\r\n @Input()\r\n public selectedNode?: TreeNode<any> | null;\r\n\r\n /**\r\n * The event emitted when the selected node changes.\r\n */\r\n @Output() selectedNodeChange = new EventEmitter<TreeNode<any> | null>();\r\n\r\n public level: number = 0;\r\n\r\n public ngOnInit(): void {\r\n this.level = this.calculateLevel(this.node);\r\n }\r\n\r\n private calculateLevel(node: TreeNode<any> | undefined): number {\r\n let level = 0;\r\n if (node) {\r\n let n: TreeNode<any> | undefined = node;\r\n while (n.parent) {\r\n level++;\r\n n = n.parent;\r\n }\r\n }\r\n return level;\r\n }\r\n\r\n public selectNode(node: TreeNode<any>): void {\r\n this.selectedNode = node;\r\n this.selectedNodeChange.emit(node);\r\n }\r\n}\r\n","@if (node) {\r\n<div [style.margin-left]=\"level * 8 + 'px'\">\r\n <ng-template\r\n #tree\r\n let-node\r\n let-parentLevel=\"level\"\r\n let-selectedNode=\"selectedNode\"\r\n >\r\n <div\r\n [style.margin-left]=\"parentLevel * 8 + 'px'\"\r\n [class.selected]=\"node === selectedNode\"\r\n >\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"node.isExpanded = !node.isExpanded\"\r\n >\r\n <mat-icon>{{\r\n node.isExpanded ? \"expand_more\" : \"chevron_right\"\r\n }}</mat-icon>\r\n </button>\r\n <span class=\"label\" (click)=\"selectNode(node)\">\r\n {{ node.label }}\r\n </span>\r\n </div>\r\n <div *ngIf=\"node.children && node.isExpanded\">\r\n <ng-container *ngFor=\"let child of node.children\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n tree;\r\n context: {\r\n $implicit: child,\r\n level: parentLevel + 1,\r\n selectedNode: selectedNode\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- $implicit is the source of let-node -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n tree;\r\n context: { $implicit: node, level: level, selectedNode: selectedNode }\r\n \"\r\n ></ng-container>\r\n</div>\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Service to store and retrieve dynamic settings. On demand, settings can\r\n * be persisted in the local storage.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingsService {\r\n private readonly _cache: Map<string, any> = new Map<string, any>();\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 * 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 /**\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 = false) {\r\n key = this.getScopedKey(key);\r\n this._cache.set(key, value);\r\n if (persist && value) {\r\n localStorage.setItem(key, JSON.stringify(value));\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): 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);\r\n }\r\n\r\n // try loading value from local storage\r\n const value = localStorage.getItem(key);\r\n if (value) {\r\n const v = JSON.parse(value);\r\n this._cache.set(key, v);\r\n return value as T;\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 * @returns True if the key exists in the store.\r\n */\r\n public contains(key: string): boolean {\r\n key = this.getScopedKey(key);\r\n return this._cache.has(key) || localStorage.getItem(key) !== null;\r\n }\r\n\r\n /**\r\n * Remove a setting if present.\r\n *\r\n * @param key The key.\r\n */\r\n public remove(key: string): void {\r\n key = this.getScopedKey(key);\r\n this._cache.delete(key);\r\n localStorage.removeItem(key);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\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\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 { 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 { NgToolsModule } from '@myrmidon/ng-tools';\r\nimport { DialogService, NgMatToolsModule } from '@myrmidon/ng-mat-tools';\r\nimport {\r\n CharChainOperation,\r\n Feature,\r\n OperationFeature,\r\n OperationType,\r\n OperationSource,\r\n SnapshotBase,\r\n} from '@myrmidon/gve-snapshot-view';\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 { SimpleTreeComponent } from '../simple-tree/simple-tree.component';\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` (`SnapshotBase`): 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 standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n // material\r\n ClipboardModule,\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 // monaco\r\n NgeMonacoModule,\r\n NgToolsModule,\r\n NgMatToolsModule,\r\n // myrmex\r\n FeatureSetEditorComponent,\r\n SimpleTreeComponent,\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 // monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private _editorModel?: monaco.editor.ITextModel;\r\n private _editor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n private readonly _subs: Subscription[];\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n\r\n private _operation: CharChainOperation | undefined;\r\n private _editedSourceIndex = -1;\r\n private _snapshot: SnapshotBase | undefined;\r\n\r\n /**\r\n * The operation to edit.\r\n */\r\n @Input()\r\n public get operation(): CharChainOperation | undefined | null {\r\n return this._operation || undefined;\r\n }\r\n public set operation(value: CharChainOperation | undefined) {\r\n if (this._operation === value) {\r\n return;\r\n }\r\n this._operation = value;\r\n this.updateForm(value);\r\n }\r\n\r\n /**\r\n * The snapshot the operation refers to.\r\n */\r\n @Input()\r\n public get snapshot(): SnapshotBase | undefined {\r\n return this._snapshot;\r\n }\r\n public set snapshot(value: SnapshotBase | undefined | null) {\r\n if (this._snapshot === value) {\r\n return;\r\n }\r\n const dirty = this.hasTextChanges(value || undefined);\r\n this._snapshot = value || undefined;\r\n if (dirty) {\r\n this.requestPreview();\r\n this._editorModel?.setValue(this.svg.value || '');\r\n }\r\n }\r\n\r\n /**\r\n * Whether to hide the preview request button.\r\n */\r\n @Input()\r\n public hidePreview?: boolean;\r\n\r\n /**\r\n * Emitted when the operation is changed.\r\n */\r\n @Output()\r\n public readonly operationChange = new EventEmitter<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when the operation preview is requested.\r\n */\r\n @Output()\r\n public readonly operationPreview = new EventEmitter<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when operation editing is cancelled.\r\n */\r\n @Output()\r\n public readonly operationCancel = new EventEmitter<void>();\r\n\r\n public tabIndex: number = 0;\r\n public id?: string;\r\n public hasTo = false;\r\n public hasToRun = false;\r\n public hasValue = false;\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 dpFeatures: FormControl<Feature[]>;\r\n // root\r\n public form: FormGroup;\r\n\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 elements: SVGElement[];\r\n public editedElementId?: string;\r\n\r\n // source\r\n public editedSource?: OperationSource;\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.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 dpFeatures: this.dpFeatures,\r\n });\r\n\r\n // SVG elements\r\n this.elements = [];\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 this._disposables.forEach((d) => d.dispose());\r\n for (const sub of this._subs) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n private hasTextChanges(snapshot?: SnapshotBase): boolean {\r\n if ((!snapshot && this._snapshot) || (snapshot && !this._snapshot)) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.size?.width !== this._snapshot?.size?.width ||\r\n snapshot?.size?.height !== this._snapshot?.size?.height\r\n ) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.style !== this._snapshot?.style ||\r\n snapshot?.text !== this._snapshot?.text ||\r\n snapshot?.textStyle !== this._snapshot?.textStyle\r\n ) {\r\n return true;\r\n }\r\n // compare textOptions returning true if any different\r\n const options = snapshot?.textOptions;\r\n if (\r\n options?.lineHeightOffset !==\r\n this._snapshot?.textOptions?.lineHeightOffset ||\r\n options?.charSpacingOffset !==\r\n this._snapshot?.textOptions?.charSpacingOffset ||\r\n options?.spcWidthOffset !== this._snapshot?.textOptions?.spcWidthOffset\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public onCreateEditor(editor: monaco.editor.IEditor) {\r\n console.log('creating editor');\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._editorModel =\r\n this._editorModel || monaco.editor.createModel(this.svg.value, 'xml');\r\n editor.setModel(this._editorModel);\r\n this._editor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._editorModel.onDidChangeContent((e) => {\r\n console.log('change content');\r\n const code = this._editorModel!.getValue();\r\n if (code !== this.svg.value) {\r\n this.svg.setValue(code);\r\n this.svg.markAsDirty();\r\n this.svg.updateValueAndValidity();\r\n }\r\n })\r\n );\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 = { id: '', type: '' };\r\n this._editedSourceIndex = -1;\r\n }\r\n\r\n public editSource(index: number): void {\r\n this._editedSourceIndex = index;\r\n this.editedSource = this.sources.value[index];\r\n }\r\n\r\n public closeSource(): void {\r\n this._editedSourceIndex = -1;\r\n this.editedSource = 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 // #region svg\r\n public saveSvg(): void {\r\n if (!this.svg.value) {\r\n return;\r\n }\r\n const blob = new Blob([this.svg.value], { type: 'application/xml' });\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // create filename from date and time\r\n const now = new Date();\r\n const date = now.toISOString().split('T')[0];\r\n const time = now.toTimeString().split(' ')[0].replace(':', '-');\r\n a.download = `svg-${date}_${time}.svg`;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n public openSvgEditor(): void {\r\n const url = this._settings.get<string>(\r\n 'svg-editor',\r\n 'https://editor.method.ac/'\r\n // 'https://boxy-svg.com/app'\r\n );\r\n if (url) {\r\n if (this.svg.value) {\r\n this._clipboard.copy(this.svg.value);\r\n }\r\n window.open(url, '_blank');\r\n }\r\n }\r\n\r\n public loadSvg(): void {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.svg';\r\n input.onchange = () => {\r\n const file = input.files?.[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n this.svg.setValue(e.target?.result as string);\r\n };\r\n reader.readAsText(file);\r\n }\r\n };\r\n input.click();\r\n }\r\n\r\n public setSvgFromClipboard(): void {\r\n navigator.clipboard.readText().then((text) => {\r\n this.svg.setValue(text);\r\n });\r\n }\r\n\r\n private parseSvg(svg?: string): SVGElement[] {\r\n if (!svg) {\r\n return [];\r\n }\r\n try {\r\n // parse SVG code extracting all the SVG elements with an id attribute\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(svg, 'image/svg+xml');\r\n const elements = Array.from(doc.querySelectorAll('[id]'));\r\n\r\n // for each element, read x and y and add a transform with a translate\r\n // equal to -x and -y so that the element is at the origin. This is useful\r\n // so that the element can be previewed in its box without wasting space\r\n // just because it happens not to be placed at the SVG origin\r\n for (const element of elements) {\r\n const x = parseFloat(element.getAttribute('x') || '0');\r\n const y = parseFloat(element.getAttribute('y') || '0');\r\n element.setAttribute('transform', `translate(${-x},${-y})`);\r\n }\r\n\r\n return elements as SVGElement[];\r\n } catch (e) {\r\n this.svg.setErrors({ invalidSvg: true });\r\n return [];\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region element features\r\n public onTabIndexChange(index: number): void {\r\n this.tabIndex = index;\r\n if (index === 3) {\r\n this.elements = this.parseSvg(this.svg.value);\r\n }\r\n }\r\n\r\n public editElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const features = this.elementFeatures.value[id] || [];\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [id]: features,\r\n });\r\n this.editedElementId = id;\r\n }\r\n\r\n public deleteElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const elementFeatures = { ...this.elementFeatures.value };\r\n if (!elementFeatures[id]) {\r\n return;\r\n }\r\n\r\n this._dialogService\r\n .confirm('Confirm', 'Delete element features?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n delete elementFeatures[id];\r\n this.elementFeatures.setValue(elementFeatures);\r\n\r\n if (this.editedElementId === id) {\r\n this.editedElementId = undefined;\r\n }\r\n }\r\n });\r\n }\r\n\r\n public onElementFeaturesChange(features: Feature[]): void {\r\n if (this.editedElementId) {\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [this.editedElementId]: features,\r\n });\r\n }\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 = to;\r\n this.hasToRun = toRun;\r\n this.hasValue = 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): 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 = operation.id;\r\n } else {\r\n this.id = 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 this.dpFeatures.setValue(operation.diplomatics?.features || []);\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 this.value.setValue(operation.value || null);\r\n\r\n this.svg.setValue(operation.diplomatics?.g || '');\r\n this._editorModel?.setValue(this.svg.value || '');\r\n this.elementFeatures.setValue(operation.diplomatics?.elementFeatures || {});\r\n\r\n this.form.markAsPristine();\r\n\r\n this.elements = this.parseSvg(operation.diplomatics?.g);\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 diplomatics: {\r\n g: this.svg.value,\r\n features: this.dpFeatures.value,\r\n elementFeatures: this.elementFeatures.value,\r\n },\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 value: this.value.value || 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 = 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\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\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\"><mat-icon>layers</mat-icon> replace</mat-option>\r\n <mat-option [value]=\"1\"><mat-icon>close</mat-icon>delete</mat-option>\r\n <mat-option [value]=\"2\"><mat-icon>last_page</mat-icon>add-before</mat-option>\r\n <mat-option [value]=\"3\"><mat-icon>first_page</mat-icon>add-after</mat-option>\r\n <mat-option [value]=\"4\"><mat-icon>login</mat-icon>move-before</mat-option>\r\n <mat-option [value]=\"5\"><mat-icon>logout</mat-icon>move-after</mat-option>\r\n <mat-option [value]=\"6\"><mat-icon>compare_arrows</mat-icon>swap</mat-option>\r\n <mat-option [value]=\"7\"><mat-icon>edit_note</mat-icon>annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\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 <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\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 <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >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 [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\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>\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 <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\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 </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit element features\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete all element features\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n [disabled]=\"!$any(elementFeatures.value[e.id])?.length\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <span>{{$any(elementFeatures.value[e.id])?.length || 0}}</span>\r\n </td>\r\n <td class=\"feat-count\">{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\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, Input } from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\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 { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\nimport {\r\n Feature,\r\n LabeledId,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\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 standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n NgToolsModule,\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 private _features: Feature[] | OperationFeature[] = [];\r\n\r\n /**\r\n * The features.\r\n */\r\n @Input()\r\n public get features(): Feature[] | OperationFeature[] {\r\n return this._features;\r\n }\r\n public set features(value: Feature[] | OperationFeature[]) {\r\n if (this._features === value) {\r\n return;\r\n }\r\n this._features = value || undefined;\r\n this.filter.reset();\r\n this.applyFeatureFilter();\r\n }\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 @Input()\r\n public featNames: 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 @Input()\r\n public featValues: 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 @Input()\r\n public filterThreshold = 5;\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n public filteredFeatures: Feature[] | OperationFeature[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control(null);\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures = this._features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\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 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 <span>{{ 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 { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } 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 standalone: true,\r\n imports: [CommonModule, MatButtonModule, MatRippleModule, MatTooltipModule],\r\n templateUrl: './steps-map.component.html',\r\n styleUrl: './steps-map.component.css',\r\n})\r\nexport class StepsMapComponent {\r\n private _steps?: ChainOperationContextStep[];\r\n\r\n /**\r\n * The steps to display.\r\n */\r\n @Input()\r\n public get steps(): ChainOperationContextStep[] | undefined {\r\n return this._steps;\r\n }\r\n public set steps(value: ChainOperationContextStep[] | undefined | null) {\r\n if (this._steps === value) {\r\n return;\r\n }\r\n const first = this._steps === undefined;\r\n this.selectedStep = undefined;\r\n this._steps = value || undefined;\r\n\r\n if (first && this._steps?.length) {\r\n this.selectedStep = this._steps[this._steps.length - 1];\r\n this.selectedStepChange.emit(this.selectedStep);\r\n }\r\n }\r\n\r\n /**\r\n * The step that is currently selected.\r\n */\r\n @Input()\r\n public selectedStep: ChainOperationContextStep | undefined;\r\n\r\n /**\r\n * The font size of the steps text.\r\n */\r\n @Input()\r\n public textFontSize: string = '0.6em';\r\n\r\n /**\r\n * Emitted when the selected step has changed by user, or when\r\n * the steps are set for the first time.\r\n */\r\n @Output()\r\n public selectedStepChange = new EventEmitter<ChainOperationContextStep>();\r\n\r\n public onStepClick(step: ChainOperationContextStep) {\r\n this.selectedStep = step;\r\n this.selectedStepChange.emit(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 [ngClass]=\"{ selected: step === selectedStep }\"\r\n (click)=\"onStepClick(step)\"\r\n >\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} ▶ </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <div class=\"text\" [style.fontSize]=\"textFontSize\">{{ step.result }}</div>\r\n </div>\r\n } }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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 '@myrmidon/gve-snapshot-view';\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 VarBaseTextRange,\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\n\r\n/**\r\n * 🔑 `gve-chain-result-view`\r\n *\r\n * Component to display a chain result.\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 standalone: true,\r\n imports: [\r\n CommonModule,\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 ],\r\n templateUrl: './chain-result-view.component.html',\r\n styleUrl: './chain-result-view.component.css',\r\n})\r\nexport class ChainResultViewComponent implements OnInit, OnDestroy {\r\n private _subs?: Subscription[];\r\n private _result?: CharChainResult;\r\n private _initialStepIndex?: number;\r\n\r\n /**\r\n * The result to display.\r\n */\r\n @Input()\r\n public get result(): CharChainResult | undefined {\r\n return this._result;\r\n }\r\n public set result(value: CharChainResult | undefined | null) {\r\n if (this._result === value) {\r\n return;\r\n }\r\n this._result = value || undefined;\r\n this.updateForm(this._result);\r\n\r\n // select the initial step if set\r\n this.selectInitialStep();\r\n }\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 @Input()\r\n public get initialStepIndex(): number | undefined {\r\n return this._initialStepIndex;\r\n }\r\n public set initialStepIndex(value: number | undefined | null) {\r\n if (value === undefined || value === null) {\r\n this._initialStepIndex = undefined;\r\n this.step = undefined;\r\n } else {\r\n this._initialStepIndex = value;\r\n this.selectInitialStep();\r\n }\r\n }\r\n\r\n /**\r\n * Emitted when a result's step is picked by the user.\r\n */\r\n @Output()\r\n public stepPick = new EventEmitter<ChainOperationContextStep>();\r\n\r\n public versionTags: string[] = [];\r\n public tags: string[] = [];\r\n public versionTag: FormControl<string | null>;\r\n public tag: FormControl<string | null>;\r\n public step?: ChainOperationContextStep;\r\n public selection?: string;\r\n public selectionFeatures: OperationFeature[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.versionTag = formBuilder.control<string | null>(null);\r\n this.tag = formBuilder.control<string | null>(null);\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [\r\n // whenever the staged version tag changes, update the form\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.step = this._result?.steps.find(\r\n (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 private selectInitialStep(): void {\r\n if (this._initialStepIndex !== undefined && this._result?.steps) {\r\n this.step =\r\n this._result.steps[\r\n this._initialStepIndex < 0\r\n ? this._result.steps.length + this._initialStepIndex\r\n : this._initialStepIndex\r\n ];\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 = [];\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 = 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 = [];\r\n\r\n if (!result) {\r\n this.step = undefined;\r\n this.selection = undefined;\r\n this.tags = [];\r\n this.versionTags = [];\r\n } else {\r\n this.tags = result.chainTags;\r\n this.updateVersionTags();\r\n }\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 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 onStepCharPick(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 = `${event.char.label} (${node.sourceTag})`;\r\n this.selectionFeatures = [...features];\r\n }\r\n\r\n public onStepRangePick(range: VarBaseTextRange): void {\r\n if (range.run === 1) {\r\n // already handled by onStepCharPick\r\n return;\r\n }\r\n this.selection = range.at + '×' + range.run;\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 = features;\r\n }\r\n\r\n public onStepChange(step: ChainOperationContextStep): void {\r\n // setting the tag will trigger the step change\r\n this.tag.setValue(step.outputTag);\r\n this.selectionFeatures = [];\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 <mat-form-field *ngIf=\"versionTags?.length\">\r\n <mat-label>version</mat-label>\r\n <mat-select [formControl]=\"versionTag\">\r\n <mat-option [value]=\"null\">-</mat-option>\r\n <mat-option *ngFor=\"let t of versionTags\" [value]=\"t\">{{\r\n t\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- tag -->\r\n <mat-form-field *ngIf=\"tags?.length\">\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n <mat-option *ngFor=\"let t of tags\" [value]=\"t\">{{ t }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\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 (charPick)=\"onStepCharPick($event)\"\r\n (rangePick)=\"onStepRangePick($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 { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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 { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n/**\r\n * 🔑 `gve-ln-heights-editor`\r\n *\r\n * A component to edit line heights.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `lineCount` (`number`): the number of lines.\r\n * - ▶️ `heights` (`Record<number, number>`): the line heights.\r\n * - 🔥 `heightsChange` (`EventEmitter<Record<number, number>>`): the event\r\n * emitted when the heights change.\r\n */\r\n@Component({\r\n selector: 'gve-ln-heights-editor',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\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: './ln-heights-editor.component.html',\r\n styleUrl: './ln-heights-editor.component.css',\r\n})\r\nexport class LnHeightsEditorComponent implements OnInit, OnDestroy {\r\n private _subs?: Subscription[];\r\n private _heights?: Record<number, number>;\r\n private _lineCount: number = 0;\r\n\r\n public lineNumber: FormControl<number>;\r\n public height: FormControl<number>;\r\n\r\n /**\r\n * The total number of lines in the text.\r\n */\r\n @Input()\r\n public get lineCount(): number {\r\n return this._lineCount;\r\n }\r\n public set lineCount(value: number) {\r\n if (this._lineCount === value) return;\r\n this._lineCount = value;\r\n this.lineNumbers = Array.from({ length: value }, (_, i) => i + 1);\r\n }\r\n\r\n /**\r\n * The heights map of the lines. Each key is a line number and the value is\r\n * the height of the line.\r\n */\r\n @Input()\r\n public get heights(): Record<number, number> | undefined {\r\n return this._heights;\r\n }\r\n public set heights(value: Record<number, number> | undefined | null) {\r\n if (this._heights === value) return;\r\n this._heights = value || undefined;\r\n }\r\n\r\n /**\r\n * The event emitted when the heights change.\r\n */\r\n @Output()\r\n public readonly heightsChange: EventEmitter<\r\n Record<number, number> | undefined\r\n > = new EventEmitter();\r\n\r\n public lineNumbers: number[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.lineNumber = formBuilder.control(0, { nonNullable: true });\r\n this.height = formBuilder.control(0, { nonNullable: true });\r\n }\r\n\r\n private pruneHeights(): void {\r\n // remove all the heigths with value=0\r\n this._heights = Object.fromEntries(\r\n Object.entries(this._heights || {}).filter(([_, v]) => v !== 0)\r\n );\r\n // if heights are now empty, set to undefined\r\n if (Object.keys(this._heights).length === 0) {\r\n this._heights = undefined;\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [];\r\n // update heights[ln] when height changes and emit heightsChange\r\n this._subs.push(\r\n this.height.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) {\r\n this._heights = {};\r\n }\r\n this._heights[this.lineNumber.value] = value;\r\n this.pruneHeights();\r\n this.heightsChange.emit(this._heights);\r\n })\r\n );\r\n\r\n // update height when line number changes\r\n this._subs.push(\r\n this.lineNumber.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) return;\r\n this.height.setValue(this._heights[value] || 0);\r\n })\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 public reset(): void {\r\n this._heights = undefined;\r\n this.heightsChange.emit(undefined);\r\n }\r\n}\r\n","@if (lineNumbers.length) {\r\n<div class=\"form-row\">\r\n <!-- line number -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>line</mat-label>\r\n <mat-select [formControl]=\"lineNumber\">\r\n <mat-option *ngFor=\"let n of lineNumbers\" [value]=\"n\">\r\n {{ n }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n @if (lineNumber.value) {\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input matInput type=\"number\" [formControl]=\"height\" min=\"0\" />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- reset button -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Remove all the heights\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n</div>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\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\nimport { NgToolsModule } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\nimport { GveAnimationTimeline } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTimelineComponent } from '../animation-timeline/animation-timeline.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline-set`\r\n *\r\n * A component to edit a set of animation timelines.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `timelines` (`GveAnimationTimeline[]`): the animation timelines to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelinesChange` (`GveAnimationTimeline[]`): emitted when the timelines are changed.\r\n * - 🔥 `timelinesCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline-set',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\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 NgToolsModule,\r\n AnimationTimelineComponent,\r\n ],\r\n templateUrl: './animation-timeline-set.component.html',\r\n styleUrl: './animation-timeline-set.component.css',\r\n})\r\nexport class AnimationTimelineSetComponent {\r\n private _timelines: GveAnimationTimeline[] = [];\r\n public editedTimeline?: GveAnimationTimeline;\r\n\r\n /**\r\n * The animation timelines to edit.\r\n */\r\n @Input()\r\n public get timelines(): GveAnimationTimeline[] {\r\n return this._timelines;\r\n }\r\n public set timelines(value: GveAnimationTimeline[] | undefined | null) {\r\n if (this._timelines === value) {\r\n return;\r\n }\r\n this._timelines = value || [];\r\n this.updateForm(this._timelines);\r\n }\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n @Input()\r\n public elementIds?: string[];\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n @Input()\r\n public tags: string[] = [];\r\n\r\n /**\r\n * Emitted when the timelines are changed.\r\n */\r\n @Output()\r\n public readonly timelinesChange = new EventEmitter<GveAnimationTimeline[]>();\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n @Output()\r\n public readonly timelinesCancel = new EventEmitter<void>();\r\n\r\n public set: FormControl<GveAnimationTimeline[]>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\r\n this.set = formBuilder.control<GveAnimationTimeline[]>([], {\r\n nonNullable: true,\r\n });\r\n this.form = formBuilder.group({\r\n sets: this.set,\r\n });\r\n }\r\n\r\n private updateForm(animations: GveAnimationTimeline[]): void {\r\n if (!animations.length) {\r\n this.form.reset();\r\n } else {\r\n this.set.setValue(animations);\r\n this.set.markAsPristine();\r\n }\r\n }\r\n\r\n public closeTimeline(): void {\r\n this.editedTimeline = undefined;\r\n }\r\n\r\n public newTimeline(): void {\r\n this.editedTimeline = {\r\n tag: '',\r\n tweens: [],\r\n };\r\n }\r\n\r\n public editTimeline(index: number): void {\r\n this.editedTimeline = this._timelines[index];\r\n }\r\n\r\n public onTimelineChange(timeline: GveAnimationTimeline): void {\r\n const timelines = [...this.set.value];\r\n const i = timelines.findIndex((t) => t.tag === timeline!.tag);\r\n if (i === -1) {\r\n timelines.push(timeline);\r\n } else {\r\n timelines[i] = timeline;\r\n }\r\n this.closeTimeline();\r\n\r\n // sort timelines by tag\r\n timelines.sort((a, b) => a.tag.localeCompare(b.tag));\r\n this.set.setValue(timelines);\r\n this.set.markAsDirty();\r\n this.set.updateValueAndValidity();\r\n\r\n this._timelines = this.set.value;\r\n this.timelinesChange.emit(this._timelines);\r\n }\r\n\r\n public deleteTimeline(index: number): void {\r\n this._dialogService\r\n .confirm('Confirm Deletion', `Delete ${this.set.value[index].tag}?`)\r\n .subscribe((yes) => {\r\n if (yes) {\r\n const timelines = [...this.set.value];\r\n timelines.splice(index, 1);\r\n this.set.setValue(timelines);\r\n this.set.markAsDirty();\r\n this.set.updateValueAndValidity();\r\n this._timelines = this.set.value;\r\n this.timelinesChange.emit(this._timelines);\r\n }\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\r\n <!-- add -->\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n (click)=\"newTimeline()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tag</th>\r\n <th>tweens</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of set.value; track t.tag; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button type=\"button\" mat-icon-button (click)=\"editTimeline(index)\">\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button type=\"button\" mat-icon-button (click)=\"deleteTimeline(index)\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ t.tag }}</td>\r\n <td>{{ t.tweens.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- editor -->\r\n <mat-expansion-panel [disabled]=\"!editedTimeline\" [expanded]=\"editedTimeline\">\r\n <mat-expansion-panel-header>\r\n timeline {{ editedTimeline?.tag }}\r\n </mat-expansion-panel-header>\r\n <gve-animation-timeline\r\n [elementIds]=\"elementIds\"\r\n [tags]=\"tags\"\r\n [timeline]=\"editedTimeline\"\r\n (timelineChange)=\"onTimelineChange($event)\"\r\n (timelineCancel)=\"closeTimeline()\"\r\n />\r\n </mat-expansion-panel>\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/ng-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharNode,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { 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 operation: CharChainOperation;\r\n inputTag: string;\r\n outputTag: string;\r\n result?: string;\r\n featureSet: {\r\n features: OperationFeature[];\r\n nodeFeatures: Record<string, OperationFeature[]>;\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 steps: ChainOperationContextStep[];\r\n chainDump: string;\r\n chainTags: string[];\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 * 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","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\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 { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { customAlphabet } from 'nanoid';\r\n\r\nimport { NgToolsModule, deepCopy } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharNode,\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS,\r\n Feature,\r\n GveAnimationTimeline,\r\n GveVisualEvent,\r\n Snapshot,\r\n SnapshotViewComponent,\r\n SnapshotViewData,\r\n SnapshotViewRenderEvent,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { ChainOperationEditorComponent } from '../chain-operation-editor/chain-operation-editor.component';\r\nimport {\r\n ChainOperationContextStep,\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 { LnHeightsEditorComponent } from '../ln-heights-editor/ln-heights-editor.component';\r\nimport { BaseTextEditorComponent } from '../base-text-editor/base-text-editor.component';\r\nimport { AnimationTimelineSetComponent } from '../animation-timeline-set/animation-timeline-set.component';\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 standalone: true,\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 MatSnackBarModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgToolsModule,\r\n BaseTextEditorComponent,\r\n BaseTextViewComponent,\r\n ChainOperationEditorComponent,\r\n ChainResultViewComponent,\r\n LnHeightsEditorComponent,\r\n AnimationTimelineSetComponent,\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 implements OnInit {\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n private _snapshot?: Snapshot;\r\n private _renderer?: SnapshotViewService;\r\n private _previewing?: boolean;\r\n private _transparentIds?: string[];\r\n private _stepPickFrozen?: boolean;\r\n\r\n @ViewChild('snapshotView', { static: false })\r\n public snapshotView?: ElementRef<SnapshotViewComponent>;\r\n\r\n /**\r\n * The snapshot to edit.\r\n */\r\n @Input()\r\n public get snapshot(): Snapshot | undefined {\r\n return this._snapshot;\r\n }\r\n public set snapshot(value: Snapshot | undefined | null) {\r\n if (this._snapshot === value) {\r\n return;\r\n }\r\n this._snapshot = value || undefined;\r\n this.updateForm(this._snapshot);\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * The batch operations text to set for the editor.\r\n */\r\n @Input()\r\n public batchOps?: string;\r\n\r\n /**\r\n * True to disable saving.\r\n */\r\n @Input()\r\n public noSave?: boolean;\r\n\r\n /**\r\n * True to enable debug mode for view rendition.\r\n */\r\n @Input()\r\n public debug?: boolean;\r\n\r\n /**\r\n * Emitted when the user saves the edited snapshot.\r\n */\r\n @Output()\r\n public readonly snapshotChange: EventEmitter<Snapshot> = new EventEmitter();\r\n\r\n /**\r\n * Emitted when the user cancels the snapshot editing.\r\n */\r\n @Output()\r\n public readonly snapshotCancel = new EventEmitter<void>();\r\n\r\n // general\r\n public width: FormControl<number>;\r\n public height: FormControl<number>;\r\n public style: FormControl<string | null>;\r\n // base text\r\n public baseText: FormControl<CharNode[] | string>;\r\n public offsetX: FormControl<number>;\r\n public offsetY: FormControl<number>;\r\n public lineHeightOffset: FormControl<number>;\r\n public lnHeights: FormControl<Record<number, number> | null>;\r\n public charSpacingOffset: FormControl<number>;\r\n public spcWidthOffset: FormControl<number>;\r\n public textStyle: FormControl<string | null>;\r\n // operations\r\n public operations: FormControl<CharChainOperation[]>;\r\n public inputOps: FormControl<string | null>;\r\n public opStyle: FormControl<string | null>;\r\n public form: FormGroup;\r\n // image and defs\r\n public imageUrl: FormControl<string | null>;\r\n public imageOpacity: FormControl<number>;\r\n public imageX: FormControl<number>;\r\n public imageY: FormControl<number>;\r\n public imageWidth: FormControl<number>;\r\n public imageHeight: FormControl<number>;\r\n public defs: FormControl<string | null>;\r\n // timelines\r\n public timelines: FormControl<GveAnimationTimeline[]>;\r\n // list of operations output tags\r\n public opTags: string[] = [];\r\n // list of operation diplomatic.g element IDs\r\n public opElementIds: string[] = [];\r\n\r\n // the currently picked base text range\r\n public textRange?: VarBaseTextRange;\r\n // the lines count for the current base text\r\n public lineCount = 0;\r\n\r\n // the currently edited operation\r\n public editedOp?: CharChainOperation;\r\n public editedOpIndex = -1;\r\n\r\n public busy?: boolean;\r\n public parseError?: string;\r\n public 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 // snapshot view data\r\n public viewTitle = VIEW_TITLE;\r\n public viewData?: SnapshotViewData;\r\n public visualInfo?: string;\r\n public rulers = true;\r\n\r\n // operations execution result\r\n public result?: CharChainResult;\r\n public resultOperationId?: string;\r\n public initialStepIndex = -1;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _api: GveApiService,\r\n private _dialogService: DialogService,\r\n private _snackbar: MatSnackBar\r\n ) {\r\n // general\r\n this.width = new FormControl<number>(800, { nonNullable: true });\r\n this.height = new FormControl<number>(600, { nonNullable: true });\r\n this.style = new FormControl<string | null>(null);\r\n // base text\r\n this.baseText = new FormControl<CharNode[] | string>([], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n });\r\n this.offsetX = new FormControl<number>(0, { nonNullable: true });\r\n this.offsetY = new FormControl<number>(0, { nonNullable: true });\r\n this.lineHeightOffset = new FormControl<number>(\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS.lineHeightOffset,\r\n { nonNullable: true }\r\n );\r\n this.lnHeights = new FormControl<Record<number, number> | null>(null);\r\n this.charSpacingOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.spcWidthOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.textStyle = new FormControl<string | null>(null);\r\n\r\n // operations\r\n this.operations = new FormControl<CharChainOperation[]>([], {\r\n nonNullable: true,\r\n });\r\n this.inputOps = new FormControl<string | null>(null);\r\n this.opStyle = new FormControl<string | null>(null);\r\n // image\r\n this.imageUrl = new FormControl<string | null>(null);\r\n this.imageOpacity = new FormControl<number>(1, { nonNullable: true });\r\n this.imageX = new FormControl<number>(0, { nonNullable: true });\r\n this.imageY = new FormControl<number>(0, { nonNullable: true });\r\n this.imageWidth = new FormControl<number>(0, { nonNullable: true });\r\n this.imageHeight = new FormControl<number>(0, { nonNullable: true });\r\n this.defs = new FormControl<string | null>(null);\r\n\r\n // timelines\r\n this.timelines = new FormControl<GveAnimationTimeline[]>([], {\r\n nonNullable: true,\r\n });\r\n\r\n // form\r\n this.form = formBuilder.group({\r\n width: this.width,\r\n height: this.height,\r\n style: this.style,\r\n baseText: this.baseText,\r\n offsetX: this.offsetX,\r\n offsetY: this.offsetY,\r\n lineHeightOffset: this.lineHeightOffset,\r\n lnHeights: this.lnHeights,\r\n charSpacingOffset: this.charSpacingOffset,\r\n spcWidthOffset: this.spcWidthOffset,\r\n textStyle: this.textStyle,\r\n operations: this.operations,\r\n inputOps: this.inputOps,\r\n opStyle: this.opStyle,\r\n // image\r\n imageUrl: this.imageUrl,\r\n imageOpacity: this.imageOpacity,\r\n imageX: this.imageX,\r\n imageY: this.imageY,\r\n imageWidth: this.imageWidth,\r\n imageHeight: this.imageHeight,\r\n defs: this.defs,\r\n // timelines\r\n timelines: this.timelines,\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // if there are any batch operations, parse them into snapshot operations\r\n if (this.batchOps) {\r\n this.inputOps.setValue(this.batchOps);\r\n this.parseOperations();\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 // update view data\r\n this.viewTitle = title;\r\n this.visualInfo = undefined;\r\n this.viewData = {\r\n snapshot: snapshot,\r\n options: {\r\n debug: this.debug,\r\n delayedRender: true,\r\n showRulers: true,\r\n showGrid: true,\r\n panZoom: true,\r\n transparentIds: this._transparentIds,\r\n },\r\n };\r\n\r\n console.log('view data: ', this.viewData);\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\r\n this._transparentIds = undefined;\r\n this.initialStepIndex = -1;\r\n\r\n if (!snapshot) {\r\n this.form.reset();\r\n } else {\r\n this.width.setValue(snapshot.size.width);\r\n this.height.setValue(snapshot.size.height);\r\n this.style.setValue(snapshot.style || null);\r\n this.imageUrl.setValue(snapshot.image?.url || null);\r\n this.imageOpacity.setValue(snapshot.image?.opacity || 0);\r\n this.imageX.setValue(snapshot.image?.canvas?.x || 0);\r\n this.imageY.setValue(snapshot.image?.canvas?.y || 0);\r\n this.imageWidth.setValue(snapshot.image?.canvas?.width || 0);\r\n this.imageHeight.setValue(snapshot.image?.canvas?.height || 0);\r\n this.defs.setValue(snapshot.defs || null);\r\n this.baseText.setValue(snapshot.text);\r\n this.offsetX.setValue(snapshot.textOptions?.offset?.x || 0);\r\n this.offsetY.setValue(snapshot.textOptions?.offset?.y || 0);\r\n this.lineHeightOffset.setValue(snapshot.textOptions?.lineHeightOffset);\r\n this.lnHeights.setValue(snapshot.textOptions?.minLineHeights || null);\r\n this.charSpacingOffset.setValue(snapshot.textOptions?.charSpacingOffset);\r\n this.spcWidthOffset.setValue(snapshot.textOptions?.spcWidthOffset);\r\n this.textStyle.setValue(snapshot.textStyle || null);\r\n this.operations.setValue(snapshot.operations);\r\n this.inputOps.reset();\r\n this.opStyle.setValue(snapshot.opStyle || null);\r\n // timelines\r\n const timelines: GveAnimationTimeline[] = [];\r\n if (snapshot.timelines) {\r\n for (let tag in snapshot.timelines) {\r\n timelines.push(snapshot.timelines[tag]);\r\n }\r\n }\r\n this.timelines.setValue(timelines);\r\n }\r\n this.updateLineCount(this.baseText.value as CharNode[]);\r\n this.updateOpLists();\r\n\r\n this.form.markAsPristine();\r\n }\r\n\r\n // #region base text\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 = 0;\r\n } else {\r\n this.lineCount = 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 */\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange = range;\r\n }\r\n\r\n /**\r\n * Handle the event fired by the base text editor to change the base text.\r\n * @param text The text to set.\r\n */\r\n public onTextChange(text: CharNode[]) {\r\n console.log('text change: ' + text);\r\n\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 = 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 // #endregion\r\n\r\n // #region operations\r\n /**\r\n * Update the lists of operation output tags and element IDs by collecting\r\n * all the operation tags and the IDs of the elements in their diplomatic.g\r\n * SVG code if any.\r\n */\r\n private updateOpLists() {\r\n const tags = new Set<string>();\r\n const ids = new Set<string>();\r\n\r\n let n = 0;\r\n for (const op of this.operations.value) {\r\n // output tag\r\n n++;\r\n tags.add(op.outputTag || `v${n}`);\r\n\r\n // element IDs\r\n if (op.diplomatics?.g) {\r\n this.parseSvgIds(op.diplomatics.g)?.forEach((id) => ids.add(id));\r\n }\r\n }\r\n\r\n this.opTags = [...tags];\r\n this.opElementIds = [...ids];\r\n }\r\n\r\n /**\r\n * Edit a new operation.\r\n */\r\n public editNewOperation() {\r\n // create a new operation and edit it\r\n this.editedOp = {\r\n id: this._nanoid(),\r\n type: 0,\r\n at: this.textRange?.at || 0,\r\n run: this.textRange?.run || 1,\r\n };\r\n this.editedOpIndex = -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 = index;\r\n this.editedOp = deepCopy(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 = -1;\r\n this.editedOp = 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 async onOperationChange(op: CharChainOperation) {\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 // update the operation lists\r\n this.updateOpLists();\r\n\r\n // update the view data\r\n await this.runTo(i);\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 = 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 operation lists\r\n this.updateOpLists();\r\n\r\n // update the view data\r\n this.runToLast();\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 || !this.inputOps.value) {\r\n return;\r\n }\r\n this._dialogService\r\n .confirm('Confirm', 'Parse operations?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n this.busy = true;\r\n this.parseError = undefined;\r\n\r\n this._api.parseOperations(this.inputOps.value!).subscribe({\r\n next: (wrapper) => {\r\n const operations = [...this.operations.value];\r\n operations.push(...wrapper.result!);\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n // update the operation lists\r\n this.updateOpLists();\r\n // update the view data\r\n this.runToLast();\r\n },\r\n error: (error) => {\r\n this.parseError = error.message;\r\n },\r\n complete: () => {\r\n this.busy = false;\r\n },\r\n });\r\n }\r\n });\r\n }\r\n\r\n private removeAllOperations(): void {\r\n this.resultOperationId = undefined;\r\n this.closeEditedOperation();\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.opTags = [];\r\n this.opElementIds = [];\r\n this.setViewData();\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 /**\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 */\r\n public runTo(\r\n index: number,\r\n lastOperation?: CharChainOperation\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (this.busy) {\r\n return reject('Busy');\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 reject('No snapshot text');\r\n }\r\n\r\n // run operations up to the specified index, but replace the last\r\n // operation when this was received as a parameter\r\n const operations = [...this.operations.value];\r\n\r\n if (lastOperation) {\r\n operations.slice(0, index);\r\n operations.push(lastOperation);\r\n } else {\r\n operations.slice(0, index + 1);\r\n }\r\n\r\n this.busy = true;\r\n this.initialStepIndex = index;\r\n this._api\r\n .runOperations(snapshot.text as CharNode[], 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 reject(wrapper.error);\r\n return;\r\n }\r\n\r\n // extract the IDs from the last operation's diplomatics and filter\r\n // them so that only the ones ending with _t are kept. By convention,\r\n // all the IDs ending with this suffix are to be made invisible at\r\n // their first rendition (opacity=0). An animation will then make\r\n // them visible.\r\n this._transparentIds = this.parseSvgIds(\r\n operations[index].diplomatics?.g\r\n )?.filter((id) => id.endsWith(SVG_TRANSP_SUFFIX));\r\n\r\n this.setViewData(snapshot, snapshot.operations[index].outputTag);\r\n this.result = wrapper.result!;\r\n\r\n resolve();\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._transparentIds = undefined;\r\n this._snackbar.open('Error running operations', 'OK');\r\n reject(error);\r\n },\r\n complete: () => {\r\n this.busy = false;\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Run the operations up to the last operation if any.\r\n * Otherwise, just update the snapshot view.\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 }\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\r\n if (this._previewing || this.editedOpIndex < 0) {\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 * Build the snapshot at the specified execution step. This implies adding\r\n * the nodes introduced by the operations up to the specified step, and\r\n * updating the features of the nodes introduced by the specified step.\r\n * Also, the operations after the specified step are removed from the\r\n * snapshot.\r\n *\r\n * @param step The step to build the snapshot at.\r\n * @returns The snapshot at the specified step.\r\n */\r\n private buildSnapshotAtStep(\r\n step: ChainOperationContextStep\r\n ): Snapshot | null {\r\n // no result, nothing to do\r\n if (!this.result) {\r\n return null;\r\n }\r\n\r\n // get the currently edited snapshot\r\n const snapshot = this.getSnapshot();\r\n // find the max ID in snapshot.text (=original) nodes,\r\n // so that any ID greater than it belongs to new nodes\r\n const maxOriginalId = (snapshot.text as CharNode[]).reduce(\r\n (max, n) => Math.max(max, n.id),\r\n 0\r\n );\r\n // get a copy of the nodes of the snapshot base text\r\n const snapNodes: CharNode[] = deepCopy(snapshot.text as CharNode[]);\r\n\r\n // get the nodes of the picked step\r\n const stepNodes = this.result.taggedNodes[step.outputTag];\r\n\r\n // update the snapshot text nodes copies with the picked step nodes,\r\n // by updating their features if existing, or adding new nodes if not.\r\n for (const sn of stepNodes) {\r\n // find the node in the original snapshot text\r\n const i = snapNodes.findIndex((n) => n.id === sn.id);\r\n // if found, update its features, else add it\r\n if (i > -1) {\r\n snapNodes[i].features = sn.features;\r\n } else {\r\n // new node: we assume that it has a manually set position (x,y features)\r\n snapNodes.push(sn);\r\n }\r\n }\r\n\r\n // append nodes introduced *before* the picked step, if any\r\n // (those introduced by the picked step have already been added)\r\n const stepIndex = this.result.steps.indexOf(step);\r\n\r\n for (let i = 0; i < stepIndex; i++) {\r\n const stepNodes = this.result.taggedNodes[this.result.steps[i].outputTag];\r\n\r\n for (const n of stepNodes) {\r\n if (n.id > maxOriginalId && !snapNodes.find((x) => x.id === n.id)) {\r\n snapNodes.push(n);\r\n }\r\n }\r\n }\r\n\r\n // update the snapshot text nodes\r\n snapshot.text = snapNodes;\r\n\r\n // remove from the snapshot the operations after the picked step\r\n const i = snapshot.operations.findIndex((o) => o.id === step.operation.id);\r\n if (i > -1) {\r\n snapshot.operations = snapshot.operations.slice(0, i + 1);\r\n }\r\n\r\n return snapshot;\r\n }\r\n\r\n private playTimeline(tl: GveAnimationTimeline): void {\r\n const shadowRoot = this.snapshotView?.nativeElement?.shadowRoot;\r\n if (tl && shadowRoot) {\r\n console.log('play timeline', tl);\r\n this._renderer?.playTimeline(tl, undefined, shadowRoot);\r\n } else {\r\n if (!this.snapshotView) {\r\n console.warn('no snapshotView for timeline');\r\n } else {\r\n console.warn('no shadowRoot for timeline');\r\n }\r\n }\r\n }\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 async onStepPick(step: ChainOperationContextStep): Promise<void> {\r\n if (!this.result || this._stepPickFrozen) {\r\n return;\r\n }\r\n\r\n // get the currently edited snapshot\r\n const snapshot = this.buildSnapshotAtStep(step)!;\r\n // update result operation ID\r\n this.resultOperationId = step.operation.id;\r\n // update view data\r\n this.setViewData(snapshot, step.outputTag);\r\n\r\n // play animation if any\r\n const tl = this.timelines.value.find((t) => t.tag === step.outputTag);\r\n if (tl) {\r\n this._stepPickFrozen = true;\r\n\r\n // find the index of the picked step in the snapshot operations\r\n const i = snapshot.operations.findIndex(\r\n (o) => o.id === step.operation.id\r\n );\r\n // run the operations up to the picked step as we need to hide\r\n // those visuals to be revealed by the animation\r\n await this.runTo(i);\r\n this._stepPickFrozen = false;\r\n\r\n // play the timeline\r\n setTimeout(() => {\r\n this.playTimeline(tl);\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by a visual in the snapshot view.\r\n *\r\n * @param event The event.\r\n */\r\n public onVisualEvent(event: CustomEvent<GveVisualEvent>): void {\r\n const d = event.detail;\r\n\r\n if (d.event.type === 'mouseover') {\r\n const visual = d.source;\r\n const sb: string[] = [];\r\n sb.push('#' + visual.id);\r\n sb.push(` (${visual.type})`);\r\n if (visual.data?.label) {\r\n sb.push(': ');\r\n sb.push(visual.data.label);\r\n }\r\n if (visual.data?.features?.length) {\r\n sb.push(' ');\r\n sb.push(\r\n visual.data.features\r\n .map((f: Feature) => `${f.name}=${f.value}`)\r\n .join('\\n')\r\n );\r\n }\r\n this.visualInfo = sb.join('');\r\n }\r\n }\r\n\r\n /**\r\n * Handle the change of line heights by updating the form control.\r\n *\r\n * @param heights The line heights.\r\n */\r\n public onHeightsChange(heights: Record<number, number> | undefined): void {\r\n this.lnHeights.setValue(heights || null);\r\n this.lnHeights.markAsDirty();\r\n this.lnHeights.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Handle the change of timelines by updating the form control.\r\n *\r\n * @param timelines The timelines.\r\n */\r\n public onTimelinesChange(timelines: GveAnimationTimeline[]): void {\r\n this.timelines.setValue(timelines);\r\n this.timelines.markAsDirty();\r\n this.timelines.updateValueAndValidity();\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 * Handle the render event from the snapshot view to get a reference\r\n * to the renderer.\r\n *\r\n * @param event The rendition event.\r\n */\r\n public onSnapshotRender(event: CustomEvent<SnapshotViewRenderEvent>): void {\r\n this._renderer = (event.detail as SnapshotViewRenderEvent).renderer;\r\n }\r\n\r\n /**\r\n * Toggle rulers in the snapshot view.\r\n */\r\n public toggleRulers(): void {\r\n if (!this._renderer) {\r\n return;\r\n }\r\n this.rulers = this._renderer.toggleRulers();\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 size: {\r\n width: this.width.value,\r\n height: this.height.value,\r\n },\r\n style: this.style.value || undefined,\r\n defs: this.defs.value || undefined,\r\n text: this.baseText.value!,\r\n textStyle: this.textStyle.value || undefined,\r\n textOptions: {\r\n lineHeightOffset: this.lineHeightOffset.value,\r\n minLineHeights: this.lnHeights.value || undefined,\r\n charSpacingOffset: this.charSpacingOffset.value,\r\n spcWidthOffset: this.spcWidthOffset.value,\r\n offset: {\r\n x: this.offsetX.value,\r\n y: this.offsetY.value,\r\n },\r\n },\r\n operations: [...this.operations.value],\r\n opStyle: this.opStyle.value || undefined,\r\n };\r\n\r\n // image\r\n if (this.imageUrl.value) {\r\n snapshot.image = {\r\n url: this.imageUrl.value,\r\n opacity: this.imageOpacity.value || undefined,\r\n };\r\n if (\r\n this.imageX.value ||\r\n this.imageY.value ||\r\n this.imageWidth.value ||\r\n this.imageHeight.value\r\n ) {\r\n snapshot.image.canvas = {\r\n x: this.imageX.value,\r\n y: this.imageY.value,\r\n width: this.imageWidth.value,\r\n height: this.imageHeight.value,\r\n };\r\n }\r\n }\r\n\r\n // timelines\r\n if (this.timelines.value.length) {\r\n snapshot.timelines = {};\r\n this.timelines.value.forEach((t) => {\r\n snapshot.timelines![t.tag] = t;\r\n });\r\n } else {\r\n snapshot.timelines = undefined;\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 = this.getSnapshot();\r\n this.snapshotChange.emit(this._snapshot);\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 [expanded]=\"!baseText.value\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-base-text-editor\r\n [text]=\"baseText.value\"\r\n (textChange)=\"onTextChange($event)\"\r\n />\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div class=\"boxed\">\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount\"\r\n [heights]=\"lnHeights.value\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\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 <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary right\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\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></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 (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [ngClass]=\"{ selected: operation.id === resultOperationId }\"\r\n [ngClass]=\"{ edited: operation.id === editedOp?.id }\"\r\n >\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 </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>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n <mat-expansion-panel [expanded]=\"editedOp\" [disabled]=\"!editedOp\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [hidePreview]=\"editedOpIndex === -1\"\r\n [operation]=\"editedOp\"\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 <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- batch ops -->\r\n <div>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>batch operations</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <div id=\"batch-container\">\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]=\"inputOps\"\r\n placeholder=\"operations\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\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 clear\r\n </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=\"Parse text and add results to the operations\"\r\n [disabled]=\"!inputOps.value || busy\"\r\n (click)=\"parseOperations()\"\r\n >\r\n batch add\r\n </button>\r\n @if (parseError) {\r\n <span class=\"error\">{{ parseError }}</span>\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>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></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\r\n output tags, separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character\r\n indexes (0-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>,\r\n separated by space, where:\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\r\n feature (no value). Suffixes:\r\n <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple),\r\n <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 </ul>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>image</mat-icon> <span class=\"label\">image</span>\r\n </ng-template>\r\n\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img alt=\"background\" [src]=\"imageUrl.value\" width=\"600\" />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- timelines -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>animation</mat-icon> <span class=\"label\">animation</span>\r\n </ng-template>\r\n\r\n <gve-animation-timeline-set\r\n [tags]=\"opTags\"\r\n [elementIds]=\"opElementIds\"\r\n [timelines]=\"timelines.value\"\r\n (timelinesChange)=\"onTimelinesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- progress -->\r\n <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\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 (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n\r\n <!-- snapshot view -->\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n </legend>\r\n <gve-snapshot-view\r\n #snapshotView\r\n [debug]=\"debug\"\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div>\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\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","/*\r\n * Public API Surface of gve-core\r\n */\r\n\r\nexport * from './lib/models';\r\nexport * from './lib/components/animation-timeline/animation-timeline.component';\r\nexport * from './lib/components/animation-tween/animation-tween.component';\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/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/ln-heights-editor/ln-heights-editor.component';\r\nexport * from './lib/components/operation-source-editor/operation-source-editor.component';\r\nexport * from './lib/components/simple-tree/simple-tree.component';\r\nexport * from './lib/components/snapshot-editor/snapshot-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/settings.service';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i5","i7","i8","i9","i6","i2","i3","debounceTime","i3.SettingsService","i11","i12","i13","i15","i17","i1","i2.GveApiService","i10","i14"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-tween/animation-tween.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline/animation-timeline.component.html","../../../../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/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/ln-heights-editor/ln-heights-editor.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/ln-heights-editor/ln-heights-editor.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/simple-tree/simple-tree.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/simple-tree/simple-tree.component.html","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-timeline-set/animation-timeline-set.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/public-api.ts","../../../../projects/myrmidon/gve-core/src/myrmidon-gve-core.ts"],"sourcesContent":["import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Subscription, debounceTime, distinctUntilChanged } from 'rxjs';\r\n\r\nimport { CommonModule } from '@angular/common';\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 { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { GveAnimationTween, TweenType } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-animation-tween`\r\n *\r\n * A component to edit an animation tween.\r\n * Used by the `gve-animation-timeline` component.\r\n *\r\n * - ▶️ `tween` (`GveAnimationTween`): the tween to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - 🔥 `tweenChange` (`GveAnimationTween`): emitted when the tween is changed.\r\n * - 🔥 `tweenCancel` (`void`): emitted when the user cancels the edit.\r\n */\r\n@Component({\r\n selector: 'gve-animation-tween',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './animation-tween.component.html',\r\n styleUrl: './animation-tween.component.css',\r\n})\r\nexport class AnimationTweenComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _tween?: GveAnimationTween;\r\n\r\n /**\r\n * The tween to edit.\r\n */\r\n @Input()\r\n public get tween(): GveAnimationTween | undefined {\r\n return this._tween;\r\n }\r\n public set tween(value: GveAnimationTween | undefined | null) {\r\n if (this._tween === value) {\r\n return;\r\n }\r\n this._tween = value || undefined;\r\n this.updateForm(this._tween);\r\n }\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n @Input()\r\n public elementIds?: string[];\r\n\r\n /**\r\n * Emitted when the tween is changed.\r\n */\r\n @Output()\r\n public readonly tweenChange = new EventEmitter<GveAnimationTween>();\r\n\r\n /**\r\n * Emitted when the user cancels the edit.\r\n */\r\n @Output()\r\n public readonly tweenCancel = new EventEmitter<void>();\r\n\r\n public types = ['to', 'from', 'fromTo', 'set'];\r\n\r\n public label: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public type: FormControl<TweenType>;\r\n public selector: FormControl<string>;\r\n public vars: FormControl<string>;\r\n public vars2: FormControl<string | null>;\r\n public position: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public elementId: FormControl<string | null>;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.label = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.note = formBuilder.control(null);\r\n this.type = formBuilder.control('to', { nonNullable: true });\r\n this.selector = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(200)],\r\n });\r\n this.vars = formBuilder.control('{}', {\r\n nonNullable: true,\r\n validators: [Validators.required, this.jsonValidator],\r\n });\r\n this.vars2 = formBuilder.control(null, this.jsonValidator);\r\n this.position = formBuilder.control(null, Validators.maxLength(100));\r\n this.form = formBuilder.group({\r\n label: this.label,\r\n note: this.note,\r\n type: this.type,\r\n selector: this.selector,\r\n vars: this.vars,\r\n vars2: this.vars2,\r\n position: this.position,\r\n });\r\n\r\n this.elementId = formBuilder.control(null);\r\n }\r\n\r\n public ngOnInit(): void {\r\n // set selector when elementId changes\r\n this._sub = this.elementId.valueChanges\r\n .pipe(debounceTime(200), distinctUntilChanged())\r\n .subscribe((elementId) => {\r\n if (elementId) {\r\n this.selector.setValue('#' + elementId);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public onVarsChange(vars: string): void {\r\n this.vars.setValue(vars);\r\n this.vars.markAsDirty();\r\n this.vars.updateValueAndValidity();\r\n }\r\n\r\n public onVars2Change(vars: string): void {\r\n this.vars2.setValue(vars);\r\n this.vars2.markAsDirty();\r\n this.vars2.updateValueAndValidity();\r\n }\r\n\r\n public close(): void {\r\n this.tweenCancel.emit();\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(tween?: GveAnimationTween): void {\r\n if (!tween) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.label.setValue(tween.label);\r\n this.note.setValue(tween.note || null);\r\n this.type.setValue(tween.type);\r\n this.selector.setValue(tween.selector);\r\n this.vars.setValue(tween.vars || '{}');\r\n this.vars2.setValue(tween.vars2 || null);\r\n this.position.setValue(tween.position || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getTween(): GveAnimationTween {\r\n return {\r\n label: this.label.value,\r\n note: this.note.value?.trim() || undefined,\r\n type: this.type.value,\r\n selector: this.selector.value.trim(),\r\n vars: this.vars.value,\r\n vars2: this.vars2.value || undefined,\r\n position: this.position.value?.trim() || undefined,\r\n };\r\n }\r\n\r\n public openUrl(url: string): void {\r\n window.open(url, '_blank');\r\n }\r\n\r\n public save(): void {\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n this._tween = this.getTween();\r\n this.tweenChange.emit(this._tween);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- label -->\r\n <mat-form-field>\r\n <mat-label>label</mat-label>\r\n <input matInput [formControl]=\"label\" />\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.required && (label.dirty || label.touched)\"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(label).errors?.maxLength && (label.dirty || label.touched)\"\r\n >label too long</mat-error\r\n >\r\n </mat-form-field>\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 *ngFor=\"let t of types\" [value]=\"t\">{{ t }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- position -->\r\n <mat-form-field>\r\n <mat-label>position</mat-label>\r\n <input matInput [formControl]=\"position\" />\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matSuffix\r\n [attr.aria-label]=\"'Information about position'\"\r\n (click)=\"\r\n openUrl(\r\n 'https://gsap.com/docs/v3/GSAP/Timeline/#positioning-animations-in-a-timeline'\r\n )\r\n \"\r\n >\r\n <mat-icon>info</mat-icon>\r\n </button>\r\n <mat-hint>time label < > += -=</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(position).errors?.maxLength &&\r\n (position.dirty || position.touched)\r\n \"\r\n >position too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- selector -->\r\n <mat-form-field>\r\n <mat-label>selector</mat-label>\r\n <input matInput [formControl]=\"selector\" />\r\n <mat-hint>CSS selector</mat-hint>\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.required &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(selector).errors?.maxLength &&\r\n (selector.dirty || selector.touched)\r\n \"\r\n >selector too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- element id -->\r\n @if (elementIds?.length) {\r\n <mat-form-field>\r\n <mat-label>element ID</mat-label>\r\n <mat-select [formControl]=\"elementId\">\r\n <mat-option *ngFor=\"let id of elementIds\" [value]=\"id\">{{\r\n id\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <!-- note -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>note</mat-label>\r\n <textarea rows=\"2\" matInput [formControl]=\"note\"></textarea>\r\n <mat-error\r\n *ngIf=\"$any(note).errors?.maxLength && (note.dirty || note.touched)\"\r\n >note too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars).errors?.required && (vars.dirty || vars.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 'fromTo') {\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>2nd vars</mat-label>\r\n <textarea matInput [formControl]=\"vars2\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.required && (vars2.dirty || vars2.touched)\"\r\n >vars required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(vars2).errors?.json && (vars2.dirty || vars2.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close tween\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-icon-button\r\n matTooltip=\"Save tween\"\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 { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\nimport { CommonModule } from '@angular/common';\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\nimport { NgToolsModule, NgToolsValidators } from '@myrmidon/ng-tools';\r\nimport {\r\n GveAnimationTimeline,\r\n GveAnimationTween,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTweenComponent } from '../animation-tween/animation-tween.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline`\r\n *\r\n * A component to edit an animation timeline.\r\n * Used by the `gve-animation-timeline-set` component.\r\n *\r\n * - ▶️ `timeline` (`GveAnimationTimeline`): the animation timeline to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected\r\n * by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelineChange` (`GveAnimationTimeline`): emitted when the timeline\r\n * is changed.\r\n * - 🔥 `timelineCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\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 NgToolsModule,\r\n AnimationTweenComponent,\r\n ],\r\n templateUrl: './animation-timeline.component.html',\r\n styleUrl: './animation-timeline.component.css',\r\n})\r\nexport class AnimationTimelineComponent {\r\n private _timeline?: GveAnimationTimeline;\r\n\r\n /**\r\n * The animation timeline to edit.\r\n */\r\n @Input()\r\n public get timeline(): GveAnimationTimeline | undefined {\r\n return this._timeline;\r\n }\r\n public set timeline(value: GveAnimationTimeline | undefined | null) {\r\n this._timeline = value || undefined;\r\n this.updateForm(this._timeline);\r\n }\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n @Input()\r\n public elementIds?: string[];\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n @Input()\r\n public tags: string[] = [];\r\n\r\n /**\r\n * Emitted when the timeline is changed.\r\n */\r\n @Output()\r\n public readonly timelineChange = new EventEmitter<GveAnimationTimeline>();\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n @Output()\r\n public readonly timelineCancel = new EventEmitter<void>();\r\n\r\n public tag: FormControl<string>;\r\n public tweens: FormControl<GveAnimationTween[]>;\r\n public vars: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public editedTweenIndex = -1;\r\n public editedTween?: GveAnimationTween;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.tag = formBuilder.control('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.tweens = formBuilder.control([], {\r\n nonNullable: true,\r\n validators: NgToolsValidators.strictMinLengthValidator(1),\r\n });\r\n this.vars = formBuilder.control(null, this.jsonValidator);\r\n\r\n this.form = formBuilder.group({\r\n tag: this.tag,\r\n tweens: this.tweens,\r\n vars: this.vars,\r\n });\r\n }\r\n\r\n private jsonValidator(\r\n control: AbstractControl\r\n ): { [key: string]: any } | null {\r\n if (!control.value) {\r\n return null;\r\n }\r\n try {\r\n JSON.parse(control.value);\r\n return null;\r\n } catch (e) {\r\n return { json: true };\r\n }\r\n }\r\n\r\n private updateForm(timeline: GveAnimationTimeline | undefined) {\r\n if (!timeline) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.tag.setValue(timeline.tag);\r\n this.tweens.setValue(timeline.tweens);\r\n this.vars.setValue(timeline.vars || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n public addTween(): void {\r\n this.editedTweenIndex = -1;\r\n this.editedTween = {\r\n label: 'tween #' + (this.tweens.value.length + 1),\r\n type: 'to',\r\n selector: '',\r\n };\r\n }\r\n\r\n public editTween(index: number): void {\r\n this.editedTweenIndex = index;\r\n this.editedTween = this.tweens.value[index];\r\n }\r\n\r\n public deleteTween(index: number): void {\r\n this.tweens.setValue(this.tweens.value.filter((_, i) => i !== index));\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public closeTween(): void {\r\n this.editedTween = undefined;\r\n this.editedTweenIndex = -1;\r\n }\r\n\r\n public saveTween(tween: GveAnimationTween): void {\r\n if (this.editedTweenIndex === -1) {\r\n this.tweens.setValue([...this.tweens.value, tween]);\r\n } else {\r\n this.tweens.setValue(\r\n this.tweens.value.map((t, index) =>\r\n index === this.editedTweenIndex ? tween : t\r\n )\r\n );\r\n }\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n this.closeTween();\r\n }\r\n\r\n public moveTweenUp(index: number): void {\r\n if (index < 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index - 1];\r\n tweens[index - 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n public moveTweenDown(index: number): void {\r\n if (index >= this.tweens.value.length - 1) {\r\n return;\r\n }\r\n const tweens = [...this.tweens.value];\r\n const tmp = tweens[index];\r\n tweens[index] = tweens[index + 1];\r\n tweens[index + 1] = tmp;\r\n\r\n this.tweens.setValue(tweens);\r\n this.tweens.markAsDirty();\r\n this.tweens.updateValueAndValidity();\r\n }\r\n\r\n private getTimeline(): GveAnimationTimeline {\r\n return {\r\n tag: this.tag.value || '',\r\n tweens: this.tweens.value,\r\n vars: this.vars.value || undefined,\r\n };\r\n }\r\n\r\n public close(): void {\r\n this.timelineCancel.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this._timeline = this.getTimeline();\r\n this.timelineChange.emit(this._timeline);\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\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-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.maxLength && (tag.dirty || tag.touched)\"\r\n >tag too long</mat-error\r\n >\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- tweens -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- tween editor -->\r\n <mat-expansion-panel [expanded]=\"editedTween\" [disabled]=\"!editedTween\">\r\n @if (editedTween) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween {{ editedTween.label }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds\"\r\n [tween]=\"editedTween\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (tweenCancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close timeline\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save timeline\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { NgToolsModule } from '@myrmidon/ng-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 borderColor: 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, NgToolsModule],\r\n templateUrl: './base-text-char.component.html',\r\n styleUrl: './base-text-char.component.css',\r\n})\r\nexport class BaseTextCharComponent {\r\n private _char: BaseTextChar | undefined;\r\n\r\n public defaultColor = '#D8D8D8';\r\n public defaultBorderColor = '#D8D8D8';\r\n public defaultEmSize = 1.5;\r\n\r\n /**\r\n * The character to display.\r\n */\r\n @Input()\r\n public get char(): BaseTextChar | undefined {\r\n return this._char;\r\n }\r\n public set char(value: BaseTextChar | undefined | null) {\r\n this._char = value || undefined;\r\n }\r\n\r\n /**\r\n * Emitted when the character is clicked.\r\n */\r\n @Output()\r\n public charPick: EventEmitter<BaseTextCharEvent> =\r\n new EventEmitter<BaseTextCharEvent>();\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 { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\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, SnapshotViewService } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * A range in the base text.\r\n */\r\nexport interface VarBaseTextRange {\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.\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 * - ▶️ `defaultBorderColor` (`string`): the default border color for the text.\r\n * - ▶️ `selectionColor` (`string`): the color for the selected text.\r\n * - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next 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` (`VarBaseTextRange`): emitted when a range is picked.\r\n */\r\n@Component({\r\n selector: 'gve-base-text-view',\r\n imports: [CommonModule, BaseTextCharComponent],\r\n templateUrl: './base-text-view.component.html',\r\n styleUrl: './base-text-view.component.css',\r\n})\r\nexport class BaseTextViewComponent {\r\n private _text?: string | CharNode[];\r\n private _lastSelectedChar?: BaseTextChar;\r\n\r\n /**\r\n * The default color for the text.\r\n */\r\n @Input()\r\n public defaultColor = '#DBDBDB';\r\n\r\n /**\r\n * The default border color for the text.\r\n */\r\n @Input()\r\n public defaultBorderColor = '#DBDBDB';\r\n\r\n /**\r\n * The color for the selected text.\r\n */\r\n @Input()\r\n public selectionColor = '#3E92CC';\r\n\r\n /**\r\n * True if line numbers should be displayed next to each line.\r\n */\r\n @Input()\r\n public hasLineNumber = false;\r\n\r\n /**\r\n * The text to display.\r\n */\r\n @Input()\r\n public get text(): string | CharNode[] | undefined {\r\n return this._text;\r\n }\r\n public set text(value: string | CharNode[] | undefined | null) {\r\n this._text = value || undefined;\r\n this.buildLines();\r\n }\r\n\r\n /**\r\n * Emitted when a character is picked.\r\n */\r\n @Output()\r\n public charPick: EventEmitter<BaseTextCharEvent> =\r\n new EventEmitter<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 @Output()\r\n public rangePick: EventEmitter<VarBaseTextRange> =\r\n new EventEmitter<VarBaseTextRange>();\r\n\r\n public lines: BaseTextChar[][] = [];\r\n\r\n private buildLines(): void {\r\n if (!this._text) {\r\n this.lines = [];\r\n return;\r\n }\r\n\r\n const newLines: BaseTextChar[][] = [];\r\n newLines.push([]);\r\n\r\n if (Array.isArray(this._text)) {\r\n const nodes = this._text as CharNode[];\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: this.defaultColor,\r\n borderColor: this.defaultBorderColor,\r\n emSize: 1.5,\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 } else {\r\n for (let i = 0; i < this._text.length; i++) {\r\n const char: BaseTextChar = {\r\n id: i + 1,\r\n value: this._text[i],\r\n label: SnapshotViewService.translateSpecialChar(this._text[i]),\r\n color: this.defaultColor,\r\n borderColor: this.defaultBorderColor,\r\n emSize: 1.5,\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\r\n this.lines = newLines;\r\n }\r\n\r\n private resetColors(): void {\r\n for (const line of this.lines) {\r\n for (const c of line) {\r\n c.color = this.defaultColor;\r\n c.borderColor = this.defaultBorderColor;\r\n }\r\n }\r\n }\r\n\r\n public onCharPick(event: BaseTextCharEvent): void {\r\n this.resetColors();\r\n\r\n if (\r\n this._lastSelectedChar &&\r\n this._lastSelectedChar !== event.char &&\r\n event.event.ctrlKey\r\n ) {\r\n const minId = Math.min(this._lastSelectedChar.id, event.char.id);\r\n const maxId = Math.max(this._lastSelectedChar.id, event.char.id);\r\n\r\n for (const line of this.lines) {\r\n for (const c of line) {\r\n if (c.id >= minId && c.id <= maxId) {\r\n c.color = this.selectionColor;\r\n c.borderColor = this.selectionColor;\r\n }\r\n }\r\n }\r\n\r\n this.charPick.emit(event);\r\n this.rangePick.emit({ at: minId, run: maxId - minId + 1 });\r\n return;\r\n } else {\r\n // select current char\r\n event.char.color = this.selectionColor;\r\n event.char.borderColor = this.selectionColor;\r\n this.charPick.emit(event);\r\n this.rangePick.emit({ at: event.char.id, run: 1 });\r\n }\r\n\r\n this._lastSelectedChar = event.char;\r\n }\r\n}\r\n","<div id=\"text\">\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 } @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 Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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\nimport { CommonModule } from '@angular/common';\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 '@myrmidon/gve-snapshot-view';\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, 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 * - 🔥 `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 imports: [\r\n CommonModule,\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 _feature?: OperationFeature;\r\n private _map?: FeatureMap;\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 @Input()\r\n public featNames: 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 @Input()\r\n public get featValues(): FeatureMap | undefined {\r\n return this._map;\r\n }\r\n public set featValues(value: FeatureMap | undefined | null) {\r\n this._map = value || undefined;\r\n this.nameIds = this.getLabeledIdsFor(this.name.value);\r\n }\r\n\r\n /**\r\n * The feature to edit.\r\n */\r\n @Input()\r\n public get feature(): Feature | OperationFeature | undefined {\r\n return this._feature;\r\n }\r\n public set feature(value: Feature | OperationFeature | undefined | null) {\r\n if (this._feature === value) {\r\n return;\r\n }\r\n this._feature = value || undefined;\r\n\r\n this.updateForm(this._feature);\r\n setTimeout(() => {\r\n this.nameControl?.nativeElement?.focus();\r\n }, 500);\r\n }\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 @Input()\r\n public isVar = false;\r\n\r\n /**\r\n * Event emitted when the user cancels the feature editing.\r\n */\r\n @Output()\r\n public featureCancel = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when the user saves the edited feature.\r\n */\r\n @Output()\r\n public featureChange = new EventEmitter<Feature | OperationFeature>();\r\n\r\n public name: FormControl<string>;\r\n public value: 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\r\n public form: FormGroup;\r\n\r\n public nameIds?: LabeledId[];\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.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 setPolicy: this.setPolicy,\r\n isNegated: this.isNegated,\r\n isGlobal: this.isGlobal,\r\n isShortLived: this.isShortLived,\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n // whenever the name changes, update the value selection\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 = this.getLabeledIdsFor(name);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(id?: string): LabeledId[] | undefined {\r\n if (!id) {\r\n return undefined;\r\n }\r\n return this.featValues ? this.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 } 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 this._frozen = false;\r\n }\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 = 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 this.featureChange.emit(this.feature);\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 <mat-option *ngFor=\"let i of featNames\" [value]=\"i.id\">{{\r\n i.label\r\n }}</mat-option>\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 <mat-error\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >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 <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <mat-select [formControl]=\"value\">\r\n <mat-option *ngFor=\"let e of nameIds\" [value]=\"e.id\">{{\r\n e.label\r\n }}</mat-option>\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 } @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 } @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 { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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 { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\nimport {\r\n FeatureSetPolicy,\r\n LabeledId,\r\n Feature,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\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 greater than the threshold. Default is 5.\r\n * - ▶️ `features` (`Feature[]`): the features to edit.\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 imports: [\r\n CommonModule,\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 NgToolsModule,\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 private _features: Feature[] | OperationFeature[];\r\n private _editedFeatureIndex: number;\r\n\r\n public POLICIES = ['M', 'S', 'SF'];\r\n\r\n /**\r\n * True if the features are variable features.\r\n */\r\n @Input()\r\n public isVar = false;\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 @Input()\r\n public featNames: 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 @Input()\r\n public featValues: 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 @Input()\r\n public filterThreshold = 5;\r\n\r\n /**\r\n * The features to edit.\r\n */\r\n @Input()\r\n public get features(): Feature[] | OperationFeature[] {\r\n return this._features;\r\n }\r\n public set features(value: Feature[] | OperationFeature[]) {\r\n if (this._features === value) {\r\n return;\r\n }\r\n this._features = value;\r\n this.applyFeatureFilter(this.filter.value);\r\n }\r\n\r\n /**\r\n * Emitted when the features change.\r\n */\r\n @Output()\r\n public featuresChange = new EventEmitter<Feature[] | OperationFeature[]>();\r\n\r\n public editedFeature?: Feature | OperationFeature;\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n public filteredFeatures: Feature[] | OperationFeature[];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this._features = [];\r\n this.filteredFeatures = [];\r\n this.filter = formBuilder.control<string | null>(null);\r\n this._editedFeatureIndex = -1;\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures = this.features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\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 }\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 = {\r\n name: '',\r\n value: '',\r\n setPolicy: FeatureSetPolicy.multiple,\r\n };\r\n this._editedFeatureIndex = -1;\r\n }\r\n\r\n public editFeature(feature: Feature | OperationFeature): void {\r\n this.editedFeature = feature;\r\n this._editedFeatureIndex = 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 = features;\r\n this.featuresChange.emit(this.features);\r\n }\r\n\r\n public onFeatureChange(feature: Feature | OperationFeature): void {\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.features = features;\r\n this.editedFeature = undefined;\r\n this._editedFeatureIndex = -1;\r\n this.featuresChange.emit(this.features);\r\n }\r\n\r\n public onFeatureCancel(): void {\r\n this.editedFeature = undefined;\r\n this._editedFeatureIndex = -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>negated</th>\r\n <th>global</th>\r\n <th>short-lived</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (feature of filteredFeatures; track feature) {\r\n <tr>\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 <span>{{ $any(feature).isNegated ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n <td>\r\n <span>{{ $any(feature).isGlobal ? \"yes\" : \"no\" }}</span>\r\n </td>\r\n <td>\r\n <span>{{ $any(feature).isShortLived ? \"yes\" : \"no\" }}</span>\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 <mat-expansion-panel [disabled]=\"!editedFeature\" [expanded]=\"editedFeature\">\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 [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</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } 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 {\r\n CharNode,\r\n Feature,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport { BaseTextCharEvent } from '../base-text-char/base-text-char.component';\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';\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 CommonModule,\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 private _text: CharNode[] = [];\r\n\r\n /**\r\n * The text to edit. In input this can be a string, an array of `CharNode`\r\n * objects. In output this will be an array of `CharNode` objects.\r\n */\r\n @Input()\r\n public get text(): CharNode[] {\r\n return this._text;\r\n }\r\n public set text(value: string | CharNode[] | undefined | null) {\r\n this.resetSelectedChar();\r\n if (this._text === value) {\r\n return;\r\n }\r\n if (!value) {\r\n this._text = [];\r\n } else {\r\n this._text = Array.isArray(value)\r\n ? value\r\n : SnapshotViewService.stringToBaseChars(value);\r\n }\r\n }\r\n\r\n /**\r\n * Emitted for the edited text as an array of `CharNode`'s whenever it changes.\r\n */\r\n @Output()\r\n public readonly textChange = new EventEmitter<CharNode[]>();\r\n\r\n public userText: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public selectedChar?: CharNode;\r\n public selectedCharLabel?: string;\r\n public textRange?: VarBaseTextRange;\r\n\r\n constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\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\r\n private resetSelectedChar(): void {\r\n this.selectedChar = undefined;\r\n this.selectedCharLabel = undefined;\r\n }\r\n\r\n public onSelectedChar(event: BaseTextCharEvent): void {\r\n this.selectedChar = this._text.find((c) => c.id === event.char.id);\r\n this.selectedCharLabel = event.char.label;\r\n }\r\n\r\n public onFeaturesChange(features: Feature[]): void {\r\n this.selectedChar!.features = features;\r\n this.textChange.emit(this._text);\r\n }\r\n\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange = range;\r\n }\r\n\r\n public patchTextFromUser(): void {\r\n // TODO\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.text = this.userText.value;\r\n this.textChange.emit(this._text);\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 <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >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 <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\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 = $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 (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/ng-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharNode,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { 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 result.\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.\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 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 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 */\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 * 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","import {\r\n Component,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Optional,\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 { 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 } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { 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 private _preset?: string;\r\n\r\n public busy?: boolean;\r\n public parseError?: string;\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 @Input()\r\n public get preset(): string | undefined | null {\r\n return this._preset;\r\n }\r\n public set preset(value: string | undefined | null) {\r\n if (this._preset === value) {\r\n return;\r\n }\r\n this._preset = value || undefined;\r\n this.parseOperations();\r\n }\r\n\r\n /**\r\n * Emitted when operations change.\r\n */\r\n @Output()\r\n public readonly operationsChange: EventEmitter<CharChainOperation[]> =\r\n new EventEmitter();\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\r\n public ngOnInit() {\r\n if (this.data?.payload?.preset) {\r\n this.preset = this.data.payload.preset;\r\n this.parseOperations();\r\n }\r\n }\r\n\r\n public parseOperations() {\r\n if (this.busy || !this.text.value) {\r\n return;\r\n }\r\n this.busy = true;\r\n this.parseError = undefined;\r\n\r\n this._api.parseOperations(this.text.value!).subscribe({\r\n next: (wrapper) => {\r\n this.operationsChange.emit(wrapper.result);\r\n if (!this.preset) {\r\n this.dialogRef?.close(wrapper.result);\r\n }\r\n },\r\n error: (error) => {\r\n this.parseError = error.message;\r\n },\r\n complete: () => {\r\n this.busy = 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>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></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>@</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()\"\r\n >\r\n batch add\r\n </button>\r\n </div>\r\n </fieldset>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } 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 '@myrmidon/gve-snapshot-view';\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 imports: [\r\n CommonModule,\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 private _source: OperationSource | undefined;\r\n\r\n /**\r\n * The source to edit.\r\n */\r\n @Input()\r\n public get source(): OperationSource | undefined {\r\n return this._source;\r\n }\r\n public set source(value: OperationSource | undefined | null) {\r\n if (this._source === value) {\r\n return;\r\n }\r\n this._source = value || undefined;\r\n this.updateForm(this._source);\r\n }\r\n\r\n /**\r\n * The list of source IDs when it's closed.\r\n */\r\n @Input()\r\n public ids?: LabeledId[];\r\n\r\n /**\r\n * The list of source types when it's closed.\r\n */\r\n @Input()\r\n public types?: LabeledId[];\r\n\r\n /**\r\n * The event emitted when the source changes.\r\n */\r\n @Output()\r\n public readonly sourceChange = new EventEmitter<\r\n OperationSource | undefined\r\n >();\r\n\r\n /**\r\n * The event emitted when the edit is canceled.\r\n */\r\n @Output()\r\n public sourceCancel = new EventEmitter<void>();\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\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 = {\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 this.sourceChange.emit(this._source);\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\n\r\n/**\r\n * Service to store and retrieve dynamic settings. On demand, settings can\r\n * be persisted in the local storage.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SettingsService {\r\n private readonly _cache: Map<string, any> = new Map<string, any>();\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 * 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 /**\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 = false) {\r\n key = this.getScopedKey(key);\r\n this._cache.set(key, value);\r\n if (persist && value) {\r\n localStorage.setItem(key, JSON.stringify(value));\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): 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);\r\n }\r\n\r\n // try loading value from local storage\r\n const value = localStorage.getItem(key);\r\n if (value) {\r\n const v = JSON.parse(value);\r\n this._cache.set(key, v);\r\n return value as T;\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 * @returns True if the key exists in the store.\r\n */\r\n public contains(key: string): boolean {\r\n key = this.getScopedKey(key);\r\n return this._cache.has(key) || localStorage.getItem(key) !== null;\r\n }\r\n\r\n /**\r\n * Remove a setting if present.\r\n *\r\n * @param key The key.\r\n */\r\n public remove(key: string): void {\r\n key = this.getScopedKey(key);\r\n this._cache.delete(key);\r\n localStorage.removeItem(key);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\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\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 { 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 { NgToolsModule } from '@myrmidon/ng-tools';\r\nimport { DialogService, NgMatToolsModule } from '@myrmidon/ng-mat-tools';\r\nimport {\r\n CharChainOperation,\r\n Feature,\r\n OperationFeature,\r\n OperationType,\r\n OperationSource,\r\n SnapshotBase,\r\n} from '@myrmidon/gve-snapshot-view';\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 { SimpleTreeComponent } from '../simple-tree/simple-tree.component';\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` (`SnapshotBase`): 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 imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n // material\r\n ClipboardModule,\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 // monaco\r\n NgeMonacoModule,\r\n NgToolsModule,\r\n NgMatToolsModule,\r\n // myrmex\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 // monaco\r\n private readonly _disposables: monaco.IDisposable[] = [];\r\n private _editorModel?: monaco.editor.ITextModel;\r\n private _editor?: monaco.editor.IStandaloneCodeEditor;\r\n\r\n private readonly _subs: Subscription[];\r\n private readonly _nanoid = customAlphabet('1234567890abcdef', 10);\r\n\r\n private _operation: CharChainOperation | undefined;\r\n private _editedSourceIndex = -1;\r\n private _snapshot: SnapshotBase | undefined;\r\n\r\n /**\r\n * The operation to edit.\r\n */\r\n @Input()\r\n public get operation(): CharChainOperation | undefined | null {\r\n return this._operation || undefined;\r\n }\r\n public set operation(value: CharChainOperation | undefined) {\r\n if (this._operation === value) {\r\n return;\r\n }\r\n this._operation = value;\r\n this.updateForm(value);\r\n }\r\n\r\n /**\r\n * The snapshot the operation refers to.\r\n */\r\n @Input()\r\n public get snapshot(): SnapshotBase | undefined {\r\n return this._snapshot;\r\n }\r\n public set snapshot(value: SnapshotBase | undefined | null) {\r\n if (this._snapshot === value) {\r\n return;\r\n }\r\n const dirty = this.hasTextChanges(value || undefined);\r\n this._snapshot = value || undefined;\r\n if (dirty) {\r\n this.requestPreview();\r\n this._editorModel?.setValue(this.svg.value || '');\r\n }\r\n }\r\n\r\n /**\r\n * Whether to hide the preview request button.\r\n */\r\n @Input()\r\n public hidePreview?: boolean;\r\n\r\n /**\r\n * Emitted when the operation is changed.\r\n */\r\n @Output()\r\n public readonly operationChange = new EventEmitter<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when the operation preview is requested.\r\n */\r\n @Output()\r\n public readonly operationPreview = new EventEmitter<CharChainOperation>();\r\n\r\n /**\r\n * Emitted when operation editing is cancelled.\r\n */\r\n @Output()\r\n public readonly operationCancel = new EventEmitter<void>();\r\n\r\n public tabIndex: number = 0;\r\n public id?: string;\r\n public hasTo = false;\r\n public hasToRun = false;\r\n public hasValue = false;\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 dpFeatures: FormControl<Feature[]>;\r\n // root\r\n public form: FormGroup;\r\n\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 elements: SVGElement[];\r\n public editedElementId?: string;\r\n\r\n // source\r\n public editedSource?: OperationSource;\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.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 dpFeatures: this.dpFeatures,\r\n });\r\n\r\n // SVG elements\r\n this.elements = [];\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 this._disposables.forEach((d) => d.dispose());\r\n for (const sub of this._subs) {\r\n sub.unsubscribe();\r\n }\r\n }\r\n\r\n private hasTextChanges(snapshot?: SnapshotBase): boolean {\r\n if ((!snapshot && this._snapshot) || (snapshot && !this._snapshot)) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.size?.width !== this._snapshot?.size?.width ||\r\n snapshot?.size?.height !== this._snapshot?.size?.height\r\n ) {\r\n return true;\r\n }\r\n if (\r\n snapshot?.style !== this._snapshot?.style ||\r\n snapshot?.text !== this._snapshot?.text ||\r\n snapshot?.textStyle !== this._snapshot?.textStyle\r\n ) {\r\n return true;\r\n }\r\n // compare textOptions returning true if any different\r\n const options = snapshot?.textOptions;\r\n if (\r\n options?.lineHeightOffset !==\r\n this._snapshot?.textOptions?.lineHeightOffset ||\r\n options?.charSpacingOffset !==\r\n this._snapshot?.textOptions?.charSpacingOffset ||\r\n options?.spcWidthOffset !== this._snapshot?.textOptions?.spcWidthOffset\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public onCreateEditor(editor: monaco.editor.IEditor) {\r\n console.log('creating editor');\r\n editor.updateOptions({\r\n minimap: {\r\n side: 'right',\r\n },\r\n wordWrap: 'on',\r\n automaticLayout: true,\r\n });\r\n this._editorModel =\r\n this._editorModel || monaco.editor.createModel(this.svg.value, 'xml');\r\n editor.setModel(this._editorModel);\r\n this._editor = editor as monaco.editor.IStandaloneCodeEditor;\r\n\r\n this._disposables.push(\r\n this._editorModel.onDidChangeContent((e) => {\r\n console.log('change content');\r\n const code = this._editorModel!.getValue();\r\n if (code !== this.svg.value) {\r\n this.svg.setValue(code);\r\n this.svg.markAsDirty();\r\n this.svg.updateValueAndValidity();\r\n }\r\n })\r\n );\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 = { id: '', type: '' };\r\n this._editedSourceIndex = -1;\r\n }\r\n\r\n public editSource(index: number): void {\r\n this._editedSourceIndex = index;\r\n this.editedSource = this.sources.value[index];\r\n }\r\n\r\n public closeSource(): void {\r\n this._editedSourceIndex = -1;\r\n this.editedSource = 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 // #region svg\r\n public saveSvg(): void {\r\n if (!this.svg.value) {\r\n return;\r\n }\r\n const blob = new Blob([this.svg.value], { type: 'application/xml' });\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // create filename from date and time\r\n const now = new Date();\r\n const date = now.toISOString().split('T')[0];\r\n const time = now.toTimeString().split(' ')[0].replace(':', '-');\r\n a.download = `svg-${date}_${time}.svg`;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n }\r\n\r\n public openSvgEditor(): void {\r\n const url = this._settings.get<string>(\r\n 'svg-editor',\r\n 'https://editor.method.ac/'\r\n // 'https://boxy-svg.com/app'\r\n );\r\n if (url) {\r\n if (this.svg.value) {\r\n this._clipboard.copy(this.svg.value);\r\n }\r\n window.open(url, '_blank');\r\n }\r\n }\r\n\r\n public loadSvg(): void {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.svg';\r\n input.onchange = () => {\r\n const file = input.files?.[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n this.svg.setValue(e.target?.result as string);\r\n };\r\n reader.readAsText(file);\r\n }\r\n };\r\n input.click();\r\n }\r\n\r\n public setSvgFromClipboard(): void {\r\n navigator.clipboard.readText().then((text) => {\r\n this.svg.setValue(text);\r\n });\r\n }\r\n\r\n private parseSvg(svg?: string): SVGElement[] {\r\n if (!svg) {\r\n return [];\r\n }\r\n try {\r\n // parse SVG code extracting all the SVG elements with an id attribute\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(svg, 'image/svg+xml');\r\n const elements = Array.from(doc.querySelectorAll('[id]'));\r\n\r\n // for each element, read x and y and add a transform with a translate\r\n // equal to -x and -y so that the element is at the origin. This is useful\r\n // so that the element can be previewed in its box without wasting space\r\n // just because it happens not to be placed at the SVG origin\r\n for (const element of elements) {\r\n const x = parseFloat(element.getAttribute('x') || '0');\r\n const y = parseFloat(element.getAttribute('y') || '0');\r\n element.setAttribute('transform', `translate(${-x},${-y})`);\r\n }\r\n\r\n return elements as SVGElement[];\r\n } catch (e) {\r\n this.svg.setErrors({ invalidSvg: true });\r\n return [];\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region element features\r\n public onTabIndexChange(index: number): void {\r\n this.tabIndex = index;\r\n if (index === 3) {\r\n this.elements = this.parseSvg(this.svg.value);\r\n }\r\n }\r\n\r\n public editElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const features = this.elementFeatures.value[id] || [];\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [id]: features,\r\n });\r\n this.editedElementId = id;\r\n }\r\n\r\n public deleteElementFeatures(element: SVGElement): void {\r\n const id = element.id;\r\n const elementFeatures = { ...this.elementFeatures.value };\r\n if (!elementFeatures[id]) {\r\n return;\r\n }\r\n\r\n this._dialogService\r\n .confirm('Confirm', 'Delete element features?')\r\n .subscribe((yes: boolean) => {\r\n if (yes) {\r\n delete elementFeatures[id];\r\n this.elementFeatures.setValue(elementFeatures);\r\n\r\n if (this.editedElementId === id) {\r\n this.editedElementId = undefined;\r\n }\r\n }\r\n });\r\n }\r\n\r\n public onElementFeaturesChange(features: Feature[]): void {\r\n if (this.editedElementId) {\r\n this.elementFeatures.setValue({\r\n ...this.elementFeatures.value,\r\n [this.editedElementId]: features,\r\n });\r\n }\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 = to;\r\n this.hasToRun = toRun;\r\n this.hasValue = 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): 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 = operation.id;\r\n } else {\r\n this.id = 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 this.dpFeatures.setValue(operation.diplomatics?.features || []);\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 this.value.setValue(operation.value || null);\r\n\r\n this.svg.setValue(operation.diplomatics?.g || '');\r\n this._editorModel?.setValue(this.svg.value || '');\r\n this.elementFeatures.setValue(operation.diplomatics?.elementFeatures || {});\r\n\r\n this.form.markAsPristine();\r\n\r\n this.elements = this.parseSvg(operation.diplomatics?.g);\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 diplomatics: {\r\n g: this.svg.value,\r\n features: this.dpFeatures.value,\r\n elementFeatures: this.elementFeatures.value,\r\n },\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 value: this.value.value || 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 = 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\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\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\"><mat-icon>layers</mat-icon> replace</mat-option>\r\n <mat-option [value]=\"1\"><mat-icon>close</mat-icon>delete</mat-option>\r\n <mat-option [value]=\"2\"><mat-icon>last_page</mat-icon>add-before</mat-option>\r\n <mat-option [value]=\"3\"><mat-icon>first_page</mat-icon>add-after</mat-option>\r\n <mat-option [value]=\"4\"><mat-icon>login</mat-icon>move-before</mat-option>\r\n <mat-option [value]=\"5\"><mat-icon>logout</mat-icon>move-after</mat-option>\r\n <mat-option [value]=\"6\"><mat-icon>compare_arrows</mat-icon>swap</mat-option>\r\n <mat-option [value]=\"7\"><mat-icon>edit_note</mat-icon>annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\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 <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\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 <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >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 <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >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 [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\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>\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 <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\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 </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit element features\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete all element features\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n [disabled]=\"!$any(elementFeatures.value[e.id])?.length\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <span>{{$any(elementFeatures.value[e.id])?.length || 0}}</span>\r\n </td>\r\n <td class=\"feat-count\">{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\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, Input } from '@angular/core';\r\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\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 { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\nimport {\r\n Feature,\r\n LabeledId,\r\n OperationFeature,\r\n} from '@myrmidon/gve-snapshot-view';\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 CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n NgToolsModule,\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 private _features: Feature[] | OperationFeature[] = [];\r\n\r\n /**\r\n * The features.\r\n */\r\n @Input()\r\n public get features(): Feature[] | OperationFeature[] {\r\n return this._features;\r\n }\r\n public set features(value: Feature[] | OperationFeature[]) {\r\n if (this._features === value) {\r\n return;\r\n }\r\n this._features = value || undefined;\r\n this.filter.reset();\r\n this.applyFeatureFilter();\r\n }\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 @Input()\r\n public featNames: 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 @Input()\r\n public featValues: 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 @Input()\r\n public filterThreshold = 5;\r\n\r\n // filter\r\n public filter: FormControl<string | null>;\r\n public filteredFeatures: Feature[] | OperationFeature[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.filter = formBuilder.control(null);\r\n }\r\n\r\n private applyFeatureFilter(name?: string | null): void {\r\n this.filteredFeatures = this._features.filter((feature) => {\r\n return !name || feature.name.toLowerCase().includes(name.toLowerCase());\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\r\n <span>{{ 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 { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } 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: [CommonModule, MatButtonModule, MatRippleModule, MatTooltipModule],\r\n templateUrl: './steps-map.component.html',\r\n styleUrl: './steps-map.component.css',\r\n})\r\nexport class StepsMapComponent {\r\n private _steps?: ChainOperationContextStep[];\r\n public lines: string[] = [];\r\n\r\n /**\r\n * The steps to display.\r\n */\r\n @Input()\r\n public get steps(): ChainOperationContextStep[] | undefined {\r\n return this._steps;\r\n }\r\n public set steps(value: ChainOperationContextStep[] | undefined | null) {\r\n if (this._steps === value) {\r\n return;\r\n }\r\n const first = this._steps === undefined;\r\n this.selectedStep = undefined;\r\n this._steps = value || undefined;\r\n\r\n if (first && this._steps?.length) {\r\n this.selectedStep = this._steps[this._steps.length - 1];\r\n this.selectedStepChange.emit(this.selectedStep);\r\n }\r\n this.updateLines();\r\n }\r\n\r\n /**\r\n * The step that is currently selected.\r\n */\r\n @Input()\r\n public selectedStep: ChainOperationContextStep | undefined;\r\n\r\n /**\r\n * The font size of the steps text.\r\n */\r\n @Input()\r\n public textFontSize: string = '0.8em';\r\n\r\n /**\r\n * Emitted when the selected step has changed by user, or when\r\n * the steps are set for the first time.\r\n */\r\n @Output()\r\n public selectedStepChange = new EventEmitter<ChainOperationContextStep>();\r\n\r\n private updateLines() {\r\n this.lines = this.selectedStep?.result?.split('\\n') || [];\r\n }\r\n\r\n public onStepClick(step: ChainOperationContextStep) {\r\n this.selectedStep = step;\r\n this.updateLines();\r\n this.selectedStepChange.emit(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 [ngClass]=\"{ selected: step === selectedStep }\"\r\n (click)=\"onStepClick(step)\"\r\n >\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} ▶ </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <div class=\"text\" [style.fontSize]=\"textFontSize\">\r\n @for (line of lines; 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 { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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 '@myrmidon/gve-snapshot-view';\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 VarBaseTextRange,\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\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 CommonModule,\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 ],\r\n templateUrl: './chain-result-view.component.html',\r\n styleUrl: './chain-result-view.component.css',\r\n})\r\nexport class ChainResultViewComponent implements OnInit, OnDestroy {\r\n private _subs?: Subscription[];\r\n private _result?: CharChainResult;\r\n private _initialStepIndex?: number;\r\n\r\n /**\r\n * The result to display.\r\n */\r\n @Input()\r\n public get result(): CharChainResult | undefined {\r\n return this._result;\r\n }\r\n public set result(value: CharChainResult | undefined | null) {\r\n if (this._result === value) {\r\n return;\r\n }\r\n this._result = value || undefined;\r\n this.updateForm(this._result);\r\n\r\n // select the initial step if set\r\n this.selectInitialStep();\r\n }\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 @Input()\r\n public get initialStepIndex(): number | undefined {\r\n return this._initialStepIndex;\r\n }\r\n public set initialStepIndex(value: number | undefined | null) {\r\n if (value === undefined || value === null) {\r\n this._initialStepIndex = undefined;\r\n this.step = undefined;\r\n } else {\r\n this._initialStepIndex = value;\r\n this.selectInitialStep();\r\n }\r\n }\r\n\r\n /**\r\n * Emitted when a result's step is picked by the user.\r\n */\r\n @Output()\r\n public stepPick = new EventEmitter<ChainOperationContextStep>();\r\n\r\n public versionTags: string[] = [];\r\n public tags: string[] = [];\r\n public versionTag: FormControl<string | null>;\r\n public tag: FormControl<string | null>;\r\n public step?: ChainOperationContextStep;\r\n public selection?: string;\r\n public selectionFeatures: OperationFeature[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.versionTag = formBuilder.control<string | null>(null);\r\n this.tag = formBuilder.control<string | null>(null);\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [\r\n // whenever the staged version tag changes, update the form\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.step = this._result?.steps.find(\r\n (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 private selectInitialStep(): void {\r\n if (this._initialStepIndex !== undefined && this._result?.steps) {\r\n this.step =\r\n this._result.steps[\r\n this._initialStepIndex < 0\r\n ? this._result.steps.length + this._initialStepIndex\r\n : this._initialStepIndex\r\n ];\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 = [];\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 = 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 = [];\r\n\r\n if (!result) {\r\n this.step = undefined;\r\n this.selection = undefined;\r\n this.tags = [];\r\n this.versionTags = [];\r\n } else {\r\n this.tags = result.chainTags;\r\n this.updateVersionTags();\r\n }\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 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 onStepCharPick(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 = `${event.char.label} (${node.sourceTag})`;\r\n this.selectionFeatures = [...features];\r\n }\r\n\r\n public onStepRangePick(range: VarBaseTextRange): void {\r\n if (range.run === 1) {\r\n // already handled by onStepCharPick\r\n return;\r\n }\r\n this.selection = range.at + '×' + range.run;\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 = features;\r\n }\r\n\r\n public onStepChange(step: ChainOperationContextStep): void {\r\n // setting the tag will trigger the step change\r\n this.tag.setValue(step.outputTag);\r\n this.selectionFeatures = [];\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 <mat-form-field *ngIf=\"versionTags?.length\">\r\n <mat-label>version</mat-label>\r\n <mat-select [formControl]=\"versionTag\">\r\n <mat-option [value]=\"null\">-</mat-option>\r\n <mat-option *ngFor=\"let t of versionTags\" [value]=\"t\">{{\r\n t\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- tag -->\r\n <mat-form-field *ngIf=\"tags?.length\">\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n <mat-option *ngFor=\"let t of tags\" [value]=\"t\">{{ t }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\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 (charPick)=\"onStepCharPick($event)\"\r\n (rangePick)=\"onStepRangePick($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 { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\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 { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\n/**\r\n * 🔑 `gve-ln-heights-editor`\r\n *\r\n * A component to edit line heights.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `lineCount` (`number`): the number of lines.\r\n * - ▶️ `heights` (`Record<number, number>`): the line heights.\r\n * - 🔥 `heightsChange` (`EventEmitter<Record<number, number>>`): the event\r\n * emitted when the heights change.\r\n */\r\n@Component({\r\n selector: 'gve-ln-heights-editor',\r\n imports: [\r\n CommonModule,\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: './ln-heights-editor.component.html',\r\n styleUrl: './ln-heights-editor.component.css',\r\n})\r\nexport class LnHeightsEditorComponent implements OnInit, OnDestroy {\r\n private _subs?: Subscription[];\r\n private _heights?: Record<number, number>;\r\n private _lineCount: number = 0;\r\n\r\n public lineNumber: FormControl<number>;\r\n public height: FormControl<number>;\r\n\r\n /**\r\n * The total number of lines in the text.\r\n */\r\n @Input()\r\n public get lineCount(): number {\r\n return this._lineCount;\r\n }\r\n public set lineCount(value: number) {\r\n if (this._lineCount === value) return;\r\n this._lineCount = value;\r\n this.lineNumbers = Array.from({ length: value }, (_, i) => i + 1);\r\n }\r\n\r\n /**\r\n * The heights map of the lines. Each key is a line number and the value is\r\n * the height of the line.\r\n */\r\n @Input()\r\n public get heights(): Record<number, number> | undefined {\r\n return this._heights;\r\n }\r\n public set heights(value: Record<number, number> | undefined | null) {\r\n if (this._heights === value) return;\r\n this._heights = value || undefined;\r\n }\r\n\r\n /**\r\n * The event emitted when the heights change.\r\n */\r\n @Output()\r\n public readonly heightsChange: EventEmitter<\r\n Record<number, number> | undefined\r\n > = new EventEmitter();\r\n\r\n public lineNumbers: number[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.lineNumber = formBuilder.control(0, { nonNullable: true });\r\n this.height = formBuilder.control(0, { nonNullable: true });\r\n }\r\n\r\n private pruneHeights(): void {\r\n // remove all the heigths with value=0\r\n this._heights = Object.fromEntries(\r\n Object.entries(this._heights || {}).filter(([_, v]) => v !== 0)\r\n );\r\n // if heights are now empty, set to undefined\r\n if (Object.keys(this._heights).length === 0) {\r\n this._heights = undefined;\r\n }\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._subs = [];\r\n // update heights[ln] when height changes and emit heightsChange\r\n this._subs.push(\r\n this.height.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) {\r\n this._heights = {};\r\n }\r\n this._heights[this.lineNumber.value] = value;\r\n this.pruneHeights();\r\n this.heightsChange.emit(this._heights);\r\n })\r\n );\r\n\r\n // update height when line number changes\r\n this._subs.push(\r\n this.lineNumber.valueChanges\r\n .pipe(distinctUntilChanged(), debounceTime(200))\r\n .subscribe((value) => {\r\n if (!this._heights) return;\r\n this.height.setValue(this._heights[value] || 0);\r\n })\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 public reset(): void {\r\n this._heights = undefined;\r\n this.heightsChange.emit(undefined);\r\n }\r\n}\r\n","@if (lineNumbers.length) {\r\n<div class=\"form-row\">\r\n <!-- line number -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>line</mat-label>\r\n <mat-select [formControl]=\"lineNumber\">\r\n <mat-option *ngFor=\"let n of lineNumbers\" [value]=\"n\">\r\n {{ n }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n @if (lineNumber.value) {\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input matInput type=\"number\" [formControl]=\"height\" min=\"0\" />\r\n </mat-form-field>\r\n }\r\n\r\n <!-- reset button -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Remove all the heights\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n</div>\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { TreeNode } from '@myrmidon/gve-snapshot-view';\r\n\r\n/**\r\n * 🔑 `gve-simple-tree`\r\n *\r\n * A simple tree component.\r\n *\r\n * - ▶️ `node` (`TreeNode<any>`): the node to display.\r\n * - ▶️ `selectedNode` (`TreeNode<any> | null`): the selected node.\r\n * - 🔥 `selectedNodeChange` (`EventEmitter<TreeNode<any> | null>`): the event\r\n * emitted when the selected node changes.\r\n */\r\n@Component({\r\n selector: 'gve-simple-tree',\r\n imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule],\r\n templateUrl: './simple-tree.component.html',\r\n styleUrl: './simple-tree.component.css',\r\n})\r\nexport class SimpleTreeComponent implements OnInit {\r\n private _node: TreeNode<any> | undefined;\r\n\r\n /**\r\n * The node to display.\r\n */\r\n @Input()\r\n public get node(): TreeNode<any> | undefined {\r\n return this._node;\r\n }\r\n public set node(value: TreeNode<any> | undefined) {\r\n if (this._node === value) {\r\n return;\r\n }\r\n this._node = value;\r\n this.level = this.calculateLevel(value);\r\n }\r\n\r\n /**\r\n * The selected node.\r\n */\r\n @Input()\r\n public selectedNode?: TreeNode<any> | null;\r\n\r\n /**\r\n * The event emitted when the selected node changes.\r\n */\r\n @Output() selectedNodeChange = new EventEmitter<TreeNode<any> | null>();\r\n\r\n public level: number = 0;\r\n\r\n public ngOnInit(): void {\r\n this.level = this.calculateLevel(this.node);\r\n }\r\n\r\n private calculateLevel(node: TreeNode<any> | undefined): number {\r\n let level = 0;\r\n if (node) {\r\n let n: TreeNode<any> | undefined = node;\r\n while (n.parent) {\r\n level++;\r\n n = n.parent;\r\n }\r\n }\r\n return level;\r\n }\r\n\r\n public selectNode(node: TreeNode<any>): void {\r\n this.selectedNode = node;\r\n this.selectedNodeChange.emit(node);\r\n }\r\n}\r\n","@if (node) {\r\n<div [style.margin-left]=\"level * 8 + 'px'\">\r\n <ng-template\r\n #tree\r\n let-node\r\n let-parentLevel=\"level\"\r\n let-selectedNode=\"selectedNode\"\r\n >\r\n <div\r\n [style.margin-left]=\"parentLevel * 8 + 'px'\"\r\n [class.selected]=\"node === selectedNode\"\r\n >\r\n <div class=\"toolbar-row\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"node.isExpanded = !node.isExpanded\"\r\n >\r\n <mat-icon>{{\r\n node.isExpanded ? \"expand_more\" : \"chevron_right\"\r\n }}</mat-icon>\r\n </button>\r\n <span class=\"label\" (click)=\"selectNode(node)\">\r\n {{ node.label }}\r\n </span>\r\n </div>\r\n <div *ngIf=\"node.children && node.isExpanded\">\r\n <ng-container *ngFor=\"let child of node.children\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n tree;\r\n context: {\r\n $implicit: child,\r\n level: parentLevel + 1,\r\n selectedNode: selectedNode\r\n }\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- $implicit is the source of let-node -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n tree;\r\n context: { $implicit: node, level: level, selectedNode: selectedNode }\r\n \"\r\n ></ng-container>\r\n</div>\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\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\nimport { NgToolsModule } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\nimport { GveAnimationTimeline } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTimelineComponent } from '../animation-timeline/animation-timeline.component';\r\n\r\n/**\r\n * 🔑 `gve-animation-timeline-set`\r\n *\r\n * A component to edit a set of animation timelines.\r\n * Used by the `gve-snapshot-editor` component.\r\n *\r\n * - ▶️ `timelines` (`GveAnimationTimeline[]`): the animation timelines to edit.\r\n * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween.\r\n * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.\r\n * - 🔥 `timelinesChange` (`GveAnimationTimeline[]`): emitted when the timelines are changed.\r\n * - 🔥 `timelinesCancel` (`void`): emitted when the timeline editing is canceled.\r\n */\r\n@Component({\r\n selector: 'gve-animation-timeline-set',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\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 NgToolsModule,\r\n AnimationTimelineComponent,\r\n ],\r\n templateUrl: './animation-timeline-set.component.html',\r\n styleUrl: './animation-timeline-set.component.css',\r\n})\r\nexport class AnimationTimelineSetComponent {\r\n private _timelines: GveAnimationTimeline[] = [];\r\n public editedTimeline?: GveAnimationTimeline;\r\n\r\n /**\r\n * The animation timelines to edit.\r\n */\r\n @Input()\r\n public get timelines(): GveAnimationTimeline[] {\r\n return this._timelines;\r\n }\r\n public set timelines(value: GveAnimationTimeline[] | undefined | null) {\r\n if (this._timelines === value) {\r\n return;\r\n }\r\n this._timelines = value || [];\r\n this.updateForm(this._timelines);\r\n }\r\n\r\n /**\r\n * The IDs of the elements that can be selected by the tween.\r\n * This list is used to allow the user to select an element from a dropdown.\r\n */\r\n @Input()\r\n public elementIds?: string[];\r\n\r\n /**\r\n * The tags that can be used by the timeline.\r\n */\r\n @Input()\r\n public tags: string[] = [];\r\n\r\n /**\r\n * Emitted when the timelines are changed.\r\n */\r\n @Output()\r\n public readonly timelinesChange = new EventEmitter<GveAnimationTimeline[]>();\r\n\r\n /**\r\n * Emitted when the timeline editing is canceled.\r\n */\r\n @Output()\r\n public readonly timelinesCancel = new EventEmitter<void>();\r\n\r\n public set: FormControl<GveAnimationTimeline[]>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\r\n this.set = formBuilder.control<GveAnimationTimeline[]>([], {\r\n nonNullable: true,\r\n });\r\n this.form = formBuilder.group({\r\n sets: this.set,\r\n });\r\n }\r\n\r\n private updateForm(animations: GveAnimationTimeline[]): void {\r\n if (!animations.length) {\r\n this.form.reset();\r\n } else {\r\n this.set.setValue(animations);\r\n this.set.markAsPristine();\r\n }\r\n }\r\n\r\n public closeTimeline(): void {\r\n this.editedTimeline = undefined;\r\n }\r\n\r\n public newTimeline(): void {\r\n this.editedTimeline = {\r\n tag: '',\r\n tweens: [],\r\n };\r\n }\r\n\r\n public editTimeline(index: number): void {\r\n this.editedTimeline = this._timelines[index];\r\n }\r\n\r\n public onTimelineChange(timeline: GveAnimationTimeline): void {\r\n const timelines = [...this.set.value];\r\n const i = timelines.findIndex((t) => t.tag === timeline!.tag);\r\n if (i === -1) {\r\n timelines.push(timeline);\r\n } else {\r\n timelines[i] = timeline;\r\n }\r\n this.closeTimeline();\r\n\r\n // sort timelines by tag\r\n timelines.sort((a, b) => a.tag.localeCompare(b.tag));\r\n this.set.setValue(timelines);\r\n this.set.markAsDirty();\r\n this.set.updateValueAndValidity();\r\n\r\n this._timelines = this.set.value;\r\n this.timelinesChange.emit(this._timelines);\r\n }\r\n\r\n public deleteTimeline(index: number): void {\r\n this._dialogService\r\n .confirm('Confirm Deletion', `Delete ${this.set.value[index].tag}?`)\r\n .subscribe((yes) => {\r\n if (yes) {\r\n const timelines = [...this.set.value];\r\n timelines.splice(index, 1);\r\n this.set.setValue(timelines);\r\n this.set.markAsDirty();\r\n this.set.updateValueAndValidity();\r\n this._timelines = this.set.value;\r\n this.timelinesChange.emit(this._timelines);\r\n }\r\n });\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\r\n <!-- add -->\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n (click)=\"newTimeline()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n timeline\r\n </button>\r\n </div>\r\n\r\n <!-- table -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>tag</th>\r\n <th>tweens</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of set.value; track t.tag; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button type=\"button\" mat-icon-button (click)=\"editTimeline(index)\">\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button type=\"button\" mat-icon-button (click)=\"deleteTimeline(index)\">\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ t.tag }}</td>\r\n <td>{{ t.tweens.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- editor -->\r\n <mat-expansion-panel [disabled]=\"!editedTimeline\" [expanded]=\"editedTimeline\">\r\n <mat-expansion-panel-header>\r\n timeline {{ editedTimeline?.tag }}\r\n </mat-expansion-panel-header>\r\n <gve-animation-timeline\r\n [elementIds]=\"elementIds\"\r\n [tags]=\"tags\"\r\n [timeline]=\"editedTimeline\"\r\n (timelineChange)=\"onTimelineChange($event)\"\r\n (timelineCancel)=\"closeTimeline()\"\r\n />\r\n </mat-expansion-panel>\r\n</form>\r\n","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n Output,\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 { 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 { NgToolsModule, deepCopy } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport {\r\n CharChainOperation,\r\n CharNode,\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS,\r\n Feature,\r\n GveAnimationTimeline,\r\n GveVisualEvent,\r\n Snapshot,\r\n SnapshotViewComponent,\r\n SnapshotViewData,\r\n SnapshotViewRenderEvent,\r\n SnapshotViewService,\r\n} from '@myrmidon/gve-snapshot-view';\r\n\r\nimport {\r\n BaseTextViewComponent,\r\n VarBaseTextRange,\r\n} from '../base-text-view/base-text-view.component';\r\nimport { ChainOperationEditorComponent } from '../chain-operation-editor/chain-operation-editor.component';\r\nimport {\r\n ChainOperationContextStep,\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 { LnHeightsEditorComponent } from '../ln-heights-editor/ln-heights-editor.component';\r\nimport { BaseTextEditorComponent } from '../base-text-editor/base-text-editor.component';\r\nimport { AnimationTimelineSetComponent } from '../animation-timeline-set/animation-timeline-set.component';\r\nimport { BatchOperationEditorComponent } from '../batch-operation-editor/batch-operation-editor.component';\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 MatSnackBarModule,\r\n MatTabsModule,\r\n MatTooltipModule,\r\n NgToolsModule,\r\n BaseTextEditorComponent,\r\n ChainOperationEditorComponent,\r\n ChainResultViewComponent,\r\n LnHeightsEditorComponent,\r\n AnimationTimelineSetComponent,\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 _snapshot?: Snapshot;\r\n private _renderer?: SnapshotViewService;\r\n private _previewing?: boolean;\r\n private _transparentIds?: string[];\r\n private _stepPickFrozen?: boolean;\r\n\r\n @ViewChild('snapshotView', { static: false })\r\n public snapshotView?: ElementRef<SnapshotViewComponent>;\r\n\r\n /**\r\n * The snapshot to edit.\r\n */\r\n @Input()\r\n public get snapshot(): Snapshot | undefined {\r\n return this._snapshot;\r\n }\r\n public set snapshot(value: Snapshot | undefined | null) {\r\n if (this._snapshot === value) {\r\n return;\r\n }\r\n this._snapshot = value || undefined;\r\n this.updateForm(this._snapshot);\r\n setTimeout(() => {\r\n this.runToLast();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * The batch operations text to set for the editor.\r\n */\r\n @Input()\r\n public batchOps?: string;\r\n\r\n /**\r\n * True to disable saving.\r\n */\r\n @Input()\r\n public noSave?: boolean;\r\n\r\n /**\r\n * True to enable debug mode for view rendition.\r\n */\r\n @Input()\r\n public debug?: boolean;\r\n\r\n /**\r\n * Emitted when the user saves the edited snapshot.\r\n */\r\n @Output()\r\n public readonly snapshotChange: EventEmitter<Snapshot> = new EventEmitter();\r\n\r\n /**\r\n * Emitted when the user cancels the snapshot editing.\r\n */\r\n @Output()\r\n public readonly snapshotCancel = new EventEmitter<void>();\r\n\r\n // general\r\n public width: FormControl<number>;\r\n public height: FormControl<number>;\r\n public style: FormControl<string | null>;\r\n // base text\r\n public baseText: FormControl<CharNode[] | string>;\r\n public offsetX: FormControl<number>;\r\n public offsetY: FormControl<number>;\r\n public lineHeightOffset: FormControl<number>;\r\n public lnHeights: FormControl<Record<number, number> | null>;\r\n public charSpacingOffset: FormControl<number>;\r\n public spcWidthOffset: FormControl<number>;\r\n public textStyle: FormControl<string | null>;\r\n // operations\r\n public operations: FormControl<CharChainOperation[]>;\r\n public opStyle: FormControl<string | null>;\r\n public form: FormGroup;\r\n // image and defs\r\n public imageUrl: FormControl<string | null>;\r\n public imageOpacity: FormControl<number>;\r\n public imageX: FormControl<number>;\r\n public imageY: FormControl<number>;\r\n public imageWidth: FormControl<number>;\r\n public imageHeight: FormControl<number>;\r\n public defs: FormControl<string | null>;\r\n // timelines\r\n public timelines: FormControl<GveAnimationTimeline[]>;\r\n // list of operations output tags\r\n public opTags: string[] = [];\r\n // list of operation diplomatic.g element IDs\r\n public opElementIds: string[] = [];\r\n\r\n // the currently picked base text range\r\n public textRange?: VarBaseTextRange;\r\n // the lines count for the current base text\r\n public lineCount = 0;\r\n\r\n // the currently edited operation\r\n public editedOp?: CharChainOperation;\r\n public editedOpIndex = -1;\r\n\r\n public busy?: boolean;\r\n public parseError?: string;\r\n public 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 // snapshot view data\r\n public viewTitle = VIEW_TITLE;\r\n public viewData?: SnapshotViewData;\r\n public visualInfo?: string;\r\n public rulers = true;\r\n\r\n // operations execution result\r\n public result?: CharChainResult;\r\n public resultOperationId?: string;\r\n public initialStepIndex = -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 // general\r\n this.width = new FormControl<number>(800, { nonNullable: true });\r\n this.height = new FormControl<number>(600, { nonNullable: true });\r\n this.style = new FormControl<string | null>(null);\r\n // base text\r\n this.baseText = new FormControl<CharNode[] | string>([], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n });\r\n this.offsetX = new FormControl<number>(0, { nonNullable: true });\r\n this.offsetY = new FormControl<number>(0, { nonNullable: true });\r\n this.lineHeightOffset = new FormControl<number>(\r\n DEFAULT_SVG_BASE_TEXT_OPTIONS.lineHeightOffset,\r\n { nonNullable: true }\r\n );\r\n this.lnHeights = new FormControl<Record<number, number> | null>(null);\r\n this.charSpacingOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.spcWidthOffset = new FormControl<number>(0, { nonNullable: true });\r\n this.textStyle = new FormControl<string | null>(null);\r\n\r\n // operations\r\n this.operations = new FormControl<CharChainOperation[]>([], {\r\n nonNullable: true,\r\n });\r\n this.opStyle = new FormControl<string | null>(null);\r\n // image\r\n this.imageUrl = new FormControl<string | null>(null);\r\n this.imageOpacity = new FormControl<number>(1, { nonNullable: true });\r\n this.imageX = new FormControl<number>(0, { nonNullable: true });\r\n this.imageY = new FormControl<number>(0, { nonNullable: true });\r\n this.imageWidth = new FormControl<number>(0, { nonNullable: true });\r\n this.imageHeight = new FormControl<number>(0, { nonNullable: true });\r\n this.defs = new FormControl<string | null>(null);\r\n\r\n // timelines\r\n this.timelines = new FormControl<GveAnimationTimeline[]>([], {\r\n nonNullable: true,\r\n });\r\n\r\n // form\r\n this.form = formBuilder.group({\r\n width: this.width,\r\n height: this.height,\r\n style: this.style,\r\n baseText: this.baseText,\r\n offsetX: this.offsetX,\r\n offsetY: this.offsetY,\r\n lineHeightOffset: this.lineHeightOffset,\r\n lnHeights: this.lnHeights,\r\n charSpacingOffset: this.charSpacingOffset,\r\n spcWidthOffset: this.spcWidthOffset,\r\n textStyle: this.textStyle,\r\n operations: this.operations,\r\n opStyle: this.opStyle,\r\n // image\r\n imageUrl: this.imageUrl,\r\n imageOpacity: this.imageOpacity,\r\n imageX: this.imageX,\r\n imageY: this.imageY,\r\n imageWidth: this.imageWidth,\r\n imageHeight: this.imageHeight,\r\n defs: this.defs,\r\n // timelines\r\n timelines: this.timelines,\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 // update view data\r\n this.viewTitle = title;\r\n this.visualInfo = undefined;\r\n this.viewData = {\r\n snapshot: snapshot,\r\n options: {\r\n debug: this.debug,\r\n delayedRender: true,\r\n showRulers: true,\r\n showGrid: true,\r\n panZoom: true,\r\n transparentIds: this._transparentIds,\r\n },\r\n };\r\n\r\n console.log('view data: ', this.viewData);\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\r\n this._transparentIds = undefined;\r\n this.initialStepIndex = -1;\r\n\r\n if (!snapshot) {\r\n this.form.reset();\r\n } else {\r\n this.width.setValue(snapshot.size.width);\r\n this.height.setValue(snapshot.size.height);\r\n this.style.setValue(snapshot.style || null);\r\n this.imageUrl.setValue(snapshot.image?.url || null);\r\n this.imageOpacity.setValue(snapshot.image?.opacity || 0);\r\n this.imageX.setValue(snapshot.image?.canvas?.x || 0);\r\n this.imageY.setValue(snapshot.image?.canvas?.y || 0);\r\n this.imageWidth.setValue(snapshot.image?.canvas?.width || 0);\r\n this.imageHeight.setValue(snapshot.image?.canvas?.height || 0);\r\n this.defs.setValue(snapshot.defs || null);\r\n this.baseText.setValue(snapshot.text);\r\n this.offsetX.setValue(snapshot.textOptions?.offset?.x || 0);\r\n this.offsetY.setValue(snapshot.textOptions?.offset?.y || 0);\r\n this.lineHeightOffset.setValue(snapshot.textOptions?.lineHeightOffset);\r\n this.lnHeights.setValue(snapshot.textOptions?.minLineHeights || null);\r\n this.charSpacingOffset.setValue(snapshot.textOptions?.charSpacingOffset);\r\n this.spcWidthOffset.setValue(snapshot.textOptions?.spcWidthOffset);\r\n this.textStyle.setValue(snapshot.textStyle || null);\r\n this.operations.setValue(snapshot.operations);\r\n this.opStyle.setValue(snapshot.opStyle || null);\r\n // timelines\r\n const timelines: GveAnimationTimeline[] = [];\r\n if (snapshot.timelines) {\r\n for (let tag in snapshot.timelines) {\r\n timelines.push(snapshot.timelines[tag]);\r\n }\r\n }\r\n this.timelines.setValue(timelines);\r\n }\r\n this.updateLineCount(this.baseText.value as CharNode[]);\r\n this.updateOpLists();\r\n\r\n this.form.markAsPristine();\r\n }\r\n\r\n // #region base text\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 = 0;\r\n } else {\r\n this.lineCount = 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 */\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange = range;\r\n }\r\n\r\n /**\r\n * Handle the event fired by the base text editor to change the base text.\r\n * @param text The text to set.\r\n */\r\n public onTextChange(text: CharNode[]) {\r\n console.log('text change', text);\r\n\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 = 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 // remove all timelines\r\n this.timelines.reset();\r\n }\r\n // #endregion\r\n\r\n // #region operations\r\n /**\r\n * Update the lists of operation output tags and element IDs by collecting\r\n * all the operation tags and the IDs of the elements in their diplomatic.g\r\n * SVG code if any.\r\n */\r\n private updateOpLists() {\r\n const tags = new Set<string>();\r\n const ids = new Set<string>();\r\n\r\n let n = 0;\r\n for (const op of this.operations.value) {\r\n // output tag\r\n n++;\r\n tags.add(op.outputTag || `v${n}`);\r\n\r\n // element IDs\r\n if (op.diplomatics?.g) {\r\n this.parseSvgIds(op.diplomatics.g)?.forEach((id) => ids.add(id));\r\n }\r\n }\r\n\r\n this.opTags = [...tags];\r\n this.opElementIds = [...ids];\r\n }\r\n\r\n /**\r\n * Edit a new operation.\r\n */\r\n public editNewOperation() {\r\n // create a new operation and edit it\r\n this.editedOp = {\r\n id: this._nanoid(),\r\n type: 0,\r\n at: this.textRange?.at || 0,\r\n run: this.textRange?.run || 1,\r\n };\r\n this.editedOpIndex = -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 = index;\r\n this.editedOp = deepCopy(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 = -1;\r\n this.editedOp = 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 async onOperationChange(op: CharChainOperation) {\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 // update the operation lists\r\n this.updateOpLists();\r\n\r\n // update the view data\r\n this.result = await this.runTo(i);\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 = 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 operation lists\r\n this.updateOpLists();\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 * 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 operation lists\r\n this.updateOpLists();\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 private removeAllOperations(): void {\r\n this.resultOperationId = undefined;\r\n this.closeEditedOperation();\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.opTags = [];\r\n this.opElementIds = [];\r\n this.setViewData();\r\n this.result = 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 * 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 */\r\n public runTo(\r\n index: number,\r\n lastOperation?: CharChainOperation\r\n ): Promise<CharChainResult> {\r\n return new Promise((resolve, reject) => {\r\n if (this.busy) {\r\n return reject('Busy');\r\n }\r\n console.log('run to: ' + index);\r\n\r\n // get the snapshot (=text and ops) to run operations on\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return reject('No snapshot text');\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 snapshot.operations = [...this.operations.value];\r\n\r\n if (lastOperation) {\r\n snapshot.operations = snapshot.operations.slice(0, index);\r\n snapshot.operations.push(lastOperation);\r\n } else {\r\n snapshot.operations = snapshot.operations.slice(0, index + 1);\r\n }\r\n\r\n // run the operations\r\n this.busy = true;\r\n this.initialStepIndex = 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 reject(wrapper.error);\r\n return;\r\n }\r\n\r\n // extract the IDs from the last operation's diplomatics and filter\r\n // them so that only the ones ending with _t are kept. By convention,\r\n // all the IDs ending with this suffix are to be made invisible at\r\n // their first rendition (opacity=0). An animation will then make\r\n // them visible.\r\n const lastOp = snapshot.operations[snapshot.operations.length - 1];\r\n this._transparentIds = this.getTransparentIds(\r\n lastOp.diplomatics?.g\r\n );\r\n\r\n // update the view data\r\n this.setViewData(snapshot, lastOp.outputTag);\r\n\r\n // return the result\r\n resolve(wrapper.result!);\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._transparentIds = undefined;\r\n this._snackbar.open('Error running operations', 'OK');\r\n reject(error);\r\n },\r\n complete: () => {\r\n this.busy = false;\r\n },\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 async runToLast(): Promise<void> {\r\n if (this.operations.value.length) {\r\n this.result = await this.runTo(this.operations.value.length - 1);\r\n } else {\r\n this.setViewData();\r\n this.result = 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\r\n if (this._previewing || this.editedOpIndex < 0) {\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 * Build the snapshot at the specified execution step. This implies adding\r\n * the nodes introduced by the operations up to the specified step, and\r\n * updating the features of the nodes introduced by the specified step.\r\n * Also, the operations after the specified step are removed from the\r\n * snapshot.\r\n *\r\n * @param step The step to build the snapshot at.\r\n * @returns The snapshot at the specified step.\r\n */\r\n private buildSnapshotAtStep(\r\n step: ChainOperationContextStep\r\n ): Snapshot | null {\r\n // no result, nothing to do\r\n if (!this.result) {\r\n return null;\r\n }\r\n\r\n // get the currently edited snapshot\r\n const snapshot = this.getSnapshot();\r\n // find the max ID in snapshot.text (=original) nodes,\r\n // so that any ID greater than it belongs to new nodes\r\n const maxOriginalId = (snapshot.text as CharNode[]).reduce(\r\n (max, n) => Math.max(max, n.id),\r\n 0\r\n );\r\n // get a copy of the nodes of the snapshot base text\r\n const snapNodes: CharNode[] = deepCopy(snapshot.text as CharNode[]);\r\n\r\n // get the nodes of the picked step\r\n const stepNodes = this.result.taggedNodes[step.outputTag];\r\n\r\n // update the snapshot text nodes copies with the picked step nodes,\r\n // by updating their features if existing, or adding new nodes if not.\r\n for (const sn of stepNodes) {\r\n // find the node in the original snapshot text\r\n const i = snapNodes.findIndex((n) => n.id === sn.id);\r\n // if found, update its features, else add it\r\n if (i > -1) {\r\n snapNodes[i].features = sn.features;\r\n } else {\r\n // new node: we assume that it has a manually set position (x,y features)\r\n snapNodes.push(sn);\r\n }\r\n }\r\n\r\n // append nodes introduced *before* the picked step, if any\r\n // (those introduced by the picked step have already been added)\r\n const stepIndex = this.result.steps.indexOf(step);\r\n\r\n for (let i = 0; i < stepIndex; i++) {\r\n const stepNodes = this.result.taggedNodes[this.result.steps[i].outputTag];\r\n\r\n for (const n of stepNodes) {\r\n if (n.id > maxOriginalId && !snapNodes.find((x) => x.id === n.id)) {\r\n snapNodes.push(n);\r\n }\r\n }\r\n }\r\n\r\n // update the snapshot text nodes\r\n snapshot.text = snapNodes;\r\n\r\n // remove from the snapshot the operations after the picked step\r\n const i = snapshot.operations.findIndex((o) => o.id === step.operation.id);\r\n if (i > -1) {\r\n snapshot.operations = snapshot.operations.slice(0, i + 1);\r\n }\r\n\r\n return snapshot;\r\n }\r\n\r\n private playTimeline(tl: GveAnimationTimeline): void {\r\n const shadowRoot = this.snapshotView?.nativeElement?.shadowRoot;\r\n if (tl && shadowRoot) {\r\n console.log('play timeline', tl);\r\n this._renderer?.playTimeline(tl, undefined, shadowRoot);\r\n } else {\r\n if (!this.snapshotView) {\r\n console.warn('no snapshotView for timeline');\r\n } else {\r\n console.warn('no shadowRoot for timeline');\r\n }\r\n }\r\n }\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 async onStepPick(step: ChainOperationContextStep): Promise<void> {\r\n if (!this.result || this._stepPickFrozen) {\r\n return;\r\n }\r\n\r\n // get the currently edited snapshot\r\n const snapshot = this.buildSnapshotAtStep(step)!;\r\n // update result operation ID\r\n this.resultOperationId = step.operation.id;\r\n // update transparent IDs\r\n this._transparentIds = this.getTransparentIds(\r\n step.operation.diplomatics?.g\r\n );\r\n // update view data\r\n this.setViewData(snapshot, step.outputTag);\r\n\r\n // play animation if any\r\n const tl = this.timelines.value.find((t) => t.tag === step.outputTag);\r\n if (tl) {\r\n this._stepPickFrozen = true;\r\n\r\n // find the index of the picked step in the snapshot operations\r\n const i = snapshot.operations.findIndex(\r\n (o) => o.id === step.operation.id\r\n );\r\n // run the operations up to the picked step as we need to hide\r\n // those visuals to be revealed by the animation\r\n await this.runTo(i);\r\n this._stepPickFrozen = false;\r\n\r\n // play the timeline\r\n setTimeout(() => {\r\n this.playTimeline(tl);\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Handle the event fired by a visual in the snapshot view.\r\n *\r\n * @param event The event.\r\n */\r\n public onVisualEvent(event: CustomEvent<GveVisualEvent>): void {\r\n const d = event.detail;\r\n\r\n if (d.event.type === 'mouseover') {\r\n const visual = d.source;\r\n const sb: string[] = [];\r\n // id (type)\r\n sb.push('#' + visual.id);\r\n sb.push(` (${visual.type})`);\r\n // : label and features\r\n if (visual.data?.label) {\r\n sb.push(': ');\r\n sb.push(visual.data.label);\r\n }\r\n if (visual.data?.features?.length) {\r\n sb.push(' ');\r\n sb.push(\r\n visual.data.features\r\n .map((f: Feature) => `${f.name}=${f.value}`)\r\n .join('\\n')\r\n );\r\n }\r\n // (@x,y width×height)\r\n sb.push(\r\n ` (@${visual.x.toFixed(1)},${visual.y.toFixed(1)} ` +\r\n `◻${visual.width.toFixed(1)}×${visual.height.toFixed(1)})`\r\n );\r\n this.visualInfo = sb.join('');\r\n }\r\n }\r\n\r\n /**\r\n * Handle the change of line heights by updating the form control.\r\n *\r\n * @param heights The line heights.\r\n */\r\n public onHeightsChange(heights: Record<number, number> | undefined): void {\r\n this.lnHeights.setValue(heights || null);\r\n this.lnHeights.markAsDirty();\r\n this.lnHeights.updateValueAndValidity();\r\n }\r\n\r\n /**\r\n * Handle the change of timelines by updating the form control.\r\n *\r\n * @param timelines The timelines.\r\n */\r\n public onTimelinesChange(timelines: GveAnimationTimeline[]): void {\r\n this.timelines.setValue(timelines);\r\n this.timelines.markAsDirty();\r\n this.timelines.updateValueAndValidity();\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 * Handle the render event from the snapshot view to get a reference\r\n * to the renderer.\r\n *\r\n * @param event The rendition event.\r\n */\r\n public onSnapshotRender(event: CustomEvent<SnapshotViewRenderEvent>): void {\r\n this._renderer = (event.detail as SnapshotViewRenderEvent).renderer;\r\n }\r\n\r\n /**\r\n * Toggle rulers in the snapshot view.\r\n */\r\n public toggleRulers(): void {\r\n if (!this._renderer) {\r\n return;\r\n }\r\n this.rulers = this._renderer.toggleRulers();\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 size: {\r\n width: this.width.value,\r\n height: this.height.value,\r\n },\r\n style: this.style.value || undefined,\r\n defs: this.defs.value || undefined,\r\n text: this.baseText.value!,\r\n textStyle: this.textStyle.value || undefined,\r\n textOptions: {\r\n lineHeightOffset: this.lineHeightOffset.value,\r\n minLineHeights: this.lnHeights.value || undefined,\r\n charSpacingOffset: this.charSpacingOffset.value,\r\n spcWidthOffset: this.spcWidthOffset.value,\r\n offset: {\r\n x: this.offsetX.value,\r\n y: this.offsetY.value,\r\n },\r\n },\r\n operations: [...this.operations.value],\r\n opStyle: this.opStyle.value || undefined,\r\n };\r\n\r\n // image\r\n if (this.imageUrl.value) {\r\n snapshot.image = {\r\n url: this.imageUrl.value,\r\n opacity: this.imageOpacity.value || undefined,\r\n };\r\n if (\r\n this.imageX.value ||\r\n this.imageY.value ||\r\n this.imageWidth.value ||\r\n this.imageHeight.value\r\n ) {\r\n snapshot.image.canvas = {\r\n x: this.imageX.value,\r\n y: this.imageY.value,\r\n width: this.imageWidth.value,\r\n height: this.imageHeight.value,\r\n };\r\n }\r\n }\r\n\r\n // timelines\r\n if (this.timelines.value.length) {\r\n snapshot.timelines = {};\r\n this.timelines.value.forEach((t) => {\r\n snapshot.timelines![t.tag] = t;\r\n });\r\n } else {\r\n snapshot.timelines = undefined;\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 = this.getSnapshot();\r\n this.snapshotChange.emit(this._snapshot);\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 [expanded]=\"!baseText.value\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-base-text-editor\r\n [text]=\"baseText.value\"\r\n (textChange)=\"onTextChange($event)\"\r\n />\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div class=\"boxed\">\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount\"\r\n [heights]=\"lnHeights.value\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\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 <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <div class=\"form-row right\">\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 >\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></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 (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [ngClass]=\"{ selected: operation.id === resultOperationId }\"\r\n [ngClass]=\"{ edited: operation.id === editedOp?.id }\"\r\n >\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 </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>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n <mat-expansion-panel [expanded]=\"editedOp\" [disabled]=\"!editedOp\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [hidePreview]=\"editedOpIndex === -1\"\r\n [operation]=\"editedOp\"\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 <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>image</mat-icon> <span class=\"label\">image</span>\r\n </ng-template>\r\n\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img alt=\"background\" [src]=\"imageUrl.value\" width=\"600\" />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- timelines -->\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n <mat-icon>animation</mat-icon> <span class=\"label\">animation</span>\r\n </ng-template>\r\n\r\n <gve-animation-timeline-set\r\n [tags]=\"opTags\"\r\n [elementIds]=\"opElementIds\"\r\n [timelines]=\"timelines.value\"\r\n (timelinesChange)=\"onTimelinesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- progress -->\r\n <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\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 (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n\r\n <!-- snapshot view -->\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n </legend>\r\n <!-- snapshot view -->\r\n <gve-snapshot-view\r\n #snapshotView\r\n [debug]=\"debug\"\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div class=\"button-row\">\r\n <!-- toggle ruler -->\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n <!-- run to last -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"primary\"\r\n matTooltip=\"Run all operations\"\r\n [disabled]=\"!operations.value.length\"\r\n (click)=\"runToLast()\"\r\n >\r\n <mat-icon>play_circle</mat-icon>\r\n </button>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\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","/*\r\n * Public API Surface of gve-core\r\n */\r\n\r\nexport * from './lib/models';\r\nexport * from './lib/components/animation-timeline/animation-timeline.component';\r\nexport * from './lib/components/animation-tween/animation-tween.component';\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/ln-heights-editor/ln-heights-editor.component';\r\nexport * from './lib/components/operation-source-editor/operation-source-editor.component';\r\nexport * from './lib/components/simple-tree/simple-tree.component';\r\nexport * from './lib/components/snapshot-editor/snapshot-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/settings.service';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i5","i7","i8","i9","i6","i2","i3","i1","debounceTime","i3.SettingsService","i11","i12","i13","i15","i17","i2.GveApiService","i10","i16"],"mappings":"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"}
|