@myrmidon/gve-core 0.0.2 → 0.0.4
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/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +5 -5
- package/esm2022/lib/components/animation-timeline-set/animation-timeline-set.component.mjs +130 -0
- package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +5 -5
- package/esm2022/lib/components/animation-vars/animation-vars.component.mjs +3 -3
- package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +3 -3
- package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +3 -3
- package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +3 -3
- package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +5 -5
- package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +3 -3
- package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +3 -3
- package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +3 -3
- package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +3 -3
- package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +3 -3
- package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +3 -3
- package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +3 -3
- package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +60 -14
- package/esm2022/lib/components/steps-map/steps-map.component.mjs +3 -3
- package/esm2022/lib/services/gve-api.service.mjs +17 -4
- package/esm2022/lib/services/settings.service.mjs +3 -3
- package/fesm2022/myrmidon-gve-core.mjs +234 -67
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/lib/components/animation-timeline-set/animation-timeline-set.component.d.ts +31 -0
- package/lib/components/feature-editor/feature-editor.component.d.ts +1 -1
- package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +7 -1
- package/lib/services/gve-api.service.d.ts +14 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/components/animation-vars/animation-vars.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-vars/animation-vars.component.html","../../../../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/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 ElementRef,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\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 { 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 { GveAnimationVars } from '@myrmidon/gve-snapshot-view';\r\n\r\ninterface VarViewModel {\r\n name: string;\r\n value: string | number | boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'gve-animation-vars',\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: './animation-vars.component.html',\r\n styleUrl: './animation-vars.component.css',\r\n})\r\nexport class AnimationVarsComponent {\r\n private _vars: GveAnimationVars = {};\r\n\r\n @Input()\r\n public get vars(): GveAnimationVars {\r\n return this._vars;\r\n }\r\n public set vars(value: GveAnimationVars) {\r\n if (this._vars === value) {\r\n return;\r\n }\r\n this._vars = value;\r\n this.updateForm(value);\r\n }\r\n\r\n @Output()\r\n public varsChange: EventEmitter<GveAnimationVars> =\r\n new EventEmitter<GveAnimationVars>();\r\n\r\n @ViewChild('vname', { static: true })\r\n public nameInput?: ElementRef;\r\n\r\n public name: FormControl<string>;\r\n public value: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public editedVars: VarViewModel[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.name = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.value = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(1000)],\r\n });\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n value: this.value,\r\n });\r\n }\r\n\r\n private updateForm(vars: GveAnimationVars): void {\r\n this.editedVars = Object.entries(vars)\r\n .map(([name, value]) => ({ name, value }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n\r\n private getVars(): GveAnimationVars {\r\n return this.editedVars.reduce(\r\n (acc, { name, value }) => ({ ...acc, [name]: value }),\r\n {}\r\n );\r\n }\r\n\r\n public addVar(): void {\r\n this.form.reset();\r\n // focus the name input\r\n setTimeout(() => this.nameInput?.nativeElement.focus(), 0);\r\n }\r\n\r\n public editVar(index: number): void {\r\n const { name, value } = this.editedVars[index];\r\n this.form.setValue({ name, value });\r\n this.form.markAsPristine();\r\n // focus the name input\r\n setTimeout(() => this.nameInput?.nativeElement.focus(), 0);\r\n }\r\n\r\n public deleteVar(index: number): void {\r\n this.editedVars = this.editedVars.filter((_, i) => i !== index);\r\n this.varsChange.emit(this.getVars());\r\n }\r\n\r\n private parseValue(value: string): string | number | boolean {\r\n if (!value) {\r\n return '';\r\n }\r\n if (value === 'true') {\r\n return true;\r\n } else if (value === 'false') {\r\n return false;\r\n } else if (/^\\d+$/.test(value)) {\r\n return parseInt(value, 10);\r\n } else if (/^\\d+\\.\\d+$/.test(value)) {\r\n return parseFloat(value);\r\n }\r\n return value;\r\n }\r\n\r\n public saveVar(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n const { name, value } = this.form.value;\r\n\r\n // parse value assuming that if it looks like a boolean/number\r\n // its value should be a boolean/number rather than a string\r\n const v = this.parseValue(value);\r\n\r\n const editedVars = [...this.editedVars];\r\n\r\n // if name already exists, update the value; else add it\r\n const existingIndex = this.editedVars.findIndex((vr) => vr.name === name);\r\n if (existingIndex !== -1) {\r\n editedVars[existingIndex] = { name, value: v };\r\n this.editedVars = editedVars;\r\n return;\r\n } else {\r\n editedVars.push({ name, value: v });\r\n this.editedVars = editedVars.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n this.varsChange.emit(this.getVars());\r\n\r\n setTimeout(() => {\r\n this.nameInput?.nativeElement.focus();\r\n this.form.reset();\r\n this.form.markAsPristine();\r\n this.form.updateValueAndValidity();\r\n }, 0);\r\n }\r\n}\r\n","<div>\r\n <div>\r\n <button type=\"button\" mat-raised-button color=\"primary\" (click)=\"addVar()\">\r\n <mat-icon>add</mat-icon>\r\n property\r\n </button>\r\n </div>\r\n\r\n @if (editedVars.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>name</th>\r\n <th>value</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (v of editedVars; track v.name; let index=$index) {\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)=\"editVar(index)\"\r\n matTooltip=\"Edit this property\"\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 (click)=\"deleteVar(index)\"\r\n matTooltip=\"Delete this property\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ v.name }}</td>\r\n <td>{{ v.value }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @else {\r\n <p class=\"muted\">(no vars)</p>\r\n }\r\n\r\n <form [formGroup]=\"form\" (submit)=\"saveVar()\">\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" #vname />\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 <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- value -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(value).errors?.required && (value.dirty || value.touched)\r\n \"\r\n >value required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(value).errors?.maxLength && (value.dirty || value.touched)\r\n \"\r\n >value too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">add_circle</mat-icon>\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n</div>\r\n","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 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, GveAnimationVars } from '@myrmidon/gve-snapshot-view';\r\nimport { AnimationVarsComponent } from '../animation-vars/animation-vars.component';\r\n\r\n/**\r\n * A component to edit an animation tween.\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 AnimationVarsComponent,\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 @Output()\r\n public readonly tweenChange = new EventEmitter<GveAnimationTween>();\r\n\r\n @Output()\r\n public readonly cancel = new EventEmitter<void>();\r\n\r\n public label: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public type: FormControl<number>;\r\n public selector: FormControl<string>;\r\n public vars: FormControl<GveAnimationVars>;\r\n public vars2: FormControl<GveAnimationVars | null>;\r\n public position: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public elementId: FormControl<string | null>;\r\n public types: { label: string; value: number }[] = [\r\n { label: 'to', value: 0 },\r\n { label: 'from', value: 1 },\r\n { label: 'fromTo', value: 2 },\r\n ];\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(0, { 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({}, { nonNullable: true });\r\n this.vars2 = formBuilder.control(null);\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: GveAnimationVars): 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: GveAnimationVars): 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.cancel.emit();\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:\r\n Object.keys(this.vars.value).length === 0 ? undefined : this.vars.value,\r\n vars2:\r\n this.vars2.value && Object.keys(this.vars2.value).length === 0\r\n ? undefined\r\n : this.vars2.value || undefined,\r\n position: this.position.value?.trim() || undefined,\r\n };\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 <mat-tab-group>\r\n <mat-tab label=\"general\">\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=\"\r\n $any(label).errors?.required && (label.dirty || label.touched)\r\n \"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n \"\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.value\">{{\r\n t.label\r\n }}</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 <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-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 </mat-tab>\r\n\r\n <mat-tab label=\"properties\">\r\n <!-- vars -->\r\n <gve-animation-vars\r\n [vars]=\"vars.value\"\r\n (varsChange)=\"onVarsChange($event)\"\r\n />\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 2) {\r\n <gve-animation-vars\r\n [vars]=\"vars2.value || {}\"\r\n (varsChange)=\"onVars2Change($event)\"\r\n />\r\n }\r\n </mat-tab>\r\n </mat-tab-group>\r\n\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)=\"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 color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Save 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 { 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 { 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 GveAnimationTweenType,\r\n GveAnimationVars,\r\n} from '@myrmidon/gve-snapshot-view';\r\nimport { AnimationTweenComponent } from '../animation-tween/animation-tween.component';\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 @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 @Input()\r\n public tags: string[] = [];\r\n\r\n @Output()\r\n public readonly timelineChange = new EventEmitter<GveAnimationTimeline>();\r\n\r\n @Output()\r\n public readonly cancel = new EventEmitter<void>();\r\n\r\n public tag: FormControl<string>;\r\n public tweens: FormControl<GveAnimationTween[]>;\r\n public vars: FormControl<GveAnimationVars>;\r\n public form: FormGroup;\r\n\r\n public editedTweenIndex = -1;\r\n public editedTween?: GveAnimationTween;\r\n public readonly selectors = {\r\n 0: 'to',\r\n 1: 'from',\r\n 2: 'fromTo',\r\n };\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({}, { nonNullable: true });\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 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 || {});\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: GveAnimationTweenType.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: Object.keys(this.vars.value).length ? this.vars.value : undefined,\r\n };\r\n }\r\n\r\n public close(): void {\r\n this.cancel.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 <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 | flatLookup : selectors }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\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 (cancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\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)=\"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 color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Save 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 { 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\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\nexport interface BaseTextCharEvent {\r\n char: BaseTextChar;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * A component that displays a single character from a base text.\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 @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 @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\nexport interface VarBaseTextRange {\r\n at: number;\r\n run: number;\r\n}\r\n\r\n/**\r\n * A component to display a selectable base text.\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 @Input()\r\n public defaultColor = '#DBDBDB';\r\n\r\n @Input()\r\n public defaultBorderColor = '#DBDBDB';\r\n\r\n @Input()\r\n public selectionColor = '#3E92CC';\r\n\r\n @Input()\r\n public hasLineNumber = false;\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 @Output()\r\n public charPick: EventEmitter<BaseTextCharEvent> =\r\n new EventEmitter<BaseTextCharEvent>();\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 line) {\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 */\r\nexport interface FeatureMap {\r\n [key: string]: LabeledId[];\r\n}\r\n\r\n/**\r\n * Feature editor. This edits a single feature, either free or from\r\n * a closed set. In the latter case you must define the set via\r\n * the `labeledIds` input. Also, you can provide a map of features\r\n * to values via the `map` input. This is useful when you want to\r\n * provide a set of features and values to the user, and you want\r\n * to provide human-readable labels for the values.\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\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 this.value.reset();\r\n this.nameIds = this.getLabeledIdsFor(name);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(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.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 }\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 * Editor for a set of features.\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 /**\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 * True to hide the feature filter.\r\n */\r\n @Input()\r\n public noFilter = false;\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 @if (!noFilter || !features.length) {\r\n <!-- filter -->\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]=\"!noFilter\"\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 @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 @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 * 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@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 * Emits 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 -->\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@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 @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 @Input()\r\n public ids?: LabeledId[];\r\n\r\n @Input()\r\n public types?: LabeledId[];\r\n\r\n @Output()\r\n public readonly sourceChange = new EventEmitter<\r\n OperationSource | undefined\r\n >();\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\nexport class SvgValidators {\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@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 @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 @Input()\r\n public selectedNode?: TreeNode<any> | null;\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.\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 { 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 * A component for editing a variant generation operation.\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 * Emits when the operation is changed.\r\n */\r\n @Output()\r\n public readonly operationChange = new EventEmitter<CharChainOperation>();\r\n\r\n /**\r\n * Emits 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 * Emits when the 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 ) {\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 );\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 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 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 // SVG\r\n this.requestPreview();\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,\r\n groupId: this.groupId.value || undefined,\r\n features: this.features.value,\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,\r\n to: this.to.value,\r\n toAsIndex: this.toAsIndex.value,\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,\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\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">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 (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 (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ 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 changes\"\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=\"Accept changes\"\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@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 minimum count of features required for filter to be visible.\r\n */\r\n @Input()\r\n public minFilterCount = 6;\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 (features.length && features.length >= minFilterCount) {\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 feature) {\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 * A map of steps in a chain operation context.\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 this.selectedStep = undefined;\r\n this._steps = value || undefined;\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.5em';\r\n\r\n /**\r\n * Emitted when the selectd step has changed.\r\n */\r\n @Output()\r\n public selectedStepChange = new EventEmitter<ChainOperationContextStep>();\r\n\r\n public onSelectStep(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)=\"onSelectStep(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 * Component to display a chain result.\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 _stepPickFrozen?: boolean;\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 last step by default\r\n if (this._result?.steps?.length) {\r\n this._stepPickFrozen = true;\r\n this.step = this._result.steps[this._result.steps.length - 1];\r\n this.tag.setValue(this.step.outputTag);\r\n this._stepPickFrozen = false;\r\n }\r\n }\r\n\r\n /**\r\n * Emits when a result's step is picked.\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 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 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 && !this._stepPickFrozen) {\r\n this.stepPick.emit(this.step!);\r\n }\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 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@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 @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 @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 @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 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) return;\r\n this._heights[this.lineNumber.value] = value;\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 <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 <!-- 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 { 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 * 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","import {\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\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 { 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 GveVisualEvent,\r\n Snapshot,\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\n\r\nconst VIEW_TITLE = 'preview';\r\n\r\n/**\r\n * A component to edit a text snapshot.\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 ],\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 _snapshot?: Snapshot;\r\n private _renderer?: SnapshotViewService;\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 this.updateViewData();\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 * 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\r\n public textRange?: VarBaseTextRange;\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: 'addBefore',\r\n 3: 'addAfter',\r\n 4: 'moveBefore',\r\n 5: 'moveAfter',\r\n 6: 'swap',\r\n 7: 'annotate',\r\n };\r\n public lineCount = 0;\r\n\r\n public viewTitle = VIEW_TITLE;\r\n public viewData?: SnapshotViewData;\r\n public visualInfo?: string;\r\n public rulers = true;\r\n // run result\r\n public result?: CharChainResult;\r\n public resultOperationId?: string;\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 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 });\r\n }\r\n\r\n public ngOnInit(): void {\r\n if (this.batchOps) {\r\n this.inputOps.setValue(this.batchOps);\r\n this.parseOperations();\r\n }\r\n }\r\n\r\n public updateViewData(\r\n newOperation?: CharChainOperation,\r\n snapshot?: Snapshot,\r\n title = VIEW_TITLE\r\n ): void {\r\n if (!snapshot) {\r\n snapshot = this.getSnapshot();\r\n }\r\n\r\n // update or add new operation in copy\r\n if (newOperation) {\r\n const index = snapshot.operations.findIndex(\r\n (op) => op.id === newOperation.id\r\n );\r\n if (index > -1) {\r\n snapshot.operations.splice(index, 1, newOperation);\r\n } else {\r\n snapshot.operations.push(newOperation);\r\n }\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: true,\r\n delayedRender: true,\r\n showRulers: true,\r\n showGrid: true,\r\n panZoom: true,\r\n },\r\n };\r\n }\r\n\r\n private updateForm(snapshot: Snapshot | undefined) {\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 }\r\n this.form.markAsPristine();\r\n }\r\n\r\n public editNewOperation() {\r\n this.editedOp = {\r\n id: '',\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 public editOperation(index: number) {\r\n this.editedOp = this.operations.value[index];\r\n this.editedOpIndex = index;\r\n }\r\n\r\n private closeEditedOp() {\r\n this.editedOp = undefined;\r\n this.editedOpIndex = -1;\r\n }\r\n\r\n public onOperationCancel() {\r\n this.closeEditedOp();\r\n }\r\n\r\n public onOperationChange(op: CharChainOperation) {\r\n const operations = [...this.operations.value];\r\n\r\n if (this.editedOpIndex > -1) {\r\n operations.splice(this.editedOpIndex, 1, op);\r\n } else {\r\n operations.push(op);\r\n }\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n this.closeEditedOp();\r\n }\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 if (this.resultOperationId === this.operations.value[index].id) {\r\n this.resultOperationId = undefined;\r\n }\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 });\r\n }\r\n\r\n public onTextChange(text: CharNode[]) {\r\n this.baseText.setValue(text);\r\n this.baseText.updateValueAndValidity();\r\n this.baseText.markAsDirty();\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 this.textRange = undefined;\r\n this.closeEditedOp();\r\n this.operations.reset();\r\n this.updateViewData();\r\n }\r\n\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange = range;\r\n }\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 this.updateViewData();\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 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.resultOperationId = undefined;\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.updateViewData();\r\n }\r\n });\r\n }\r\n\r\n public onOperationPreview(operation: CharChainOperation): void {\r\n this.updateViewData(operation);\r\n }\r\n\r\n public runTo(index: number): void {\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n const operations = this.operations.value.slice(0, index + 1);\r\n this.busy = true;\r\n this._api.runOperations(snapshot.text as CharNode[], operations).subscribe({\r\n next: (wrapper) => {\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n return;\r\n }\r\n this.result = wrapper.result!;\r\n // TODO update view\r\n // this.updateViewData(\r\n // undefined,\r\n // snapshot,\r\n // this.operations.value[index].outputTag\r\n // );\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy = false;\r\n },\r\n });\r\n }\r\n\r\n public onStepPick(step: ChainOperationContextStep): void {\r\n if (!this.result) {\r\n return;\r\n }\r\n this.resultOperationId = step.operation.id;\r\n\r\n // get snapshot for preview by updating its text and\r\n // removing operations past the last executed\r\n const stepNodes = this.result.taggedNodes[step.outputTag];\r\n\r\n // we always display the original base text, just updating\r\n // its nodes features to those of the picked step, and adding\r\n // new nodes if they are not in the original text. It is assumed\r\n // that these new nodes have a manually set position.\r\n const snapshot = this.getSnapshot();\r\n const nodes: CharNode[] = deepCopy(snapshot.text as CharNode[]);\r\n for (const sn of stepNodes) {\r\n const i = nodes.findIndex((n) => n.id === sn.id);\r\n if (i > -1) {\r\n nodes[i].features = sn.features;\r\n } else {\r\n nodes.push(sn);\r\n }\r\n }\r\n\r\n // find 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\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 for (let i = 0; i < stepIndex; i++) {\r\n const stepNodes = this.result.taggedNodes[this.result.steps[i].outputTag];\r\n for (const n of stepNodes) {\r\n if (n.id > maxOriginalId && !nodes.find((x) => x.id === n.id)) {\r\n nodes.push(n);\r\n }\r\n }\r\n }\r\n\r\n snapshot.text = nodes;\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 this.updateViewData(undefined, snapshot, step.outputTag);\r\n }\r\n\r\n public onVisualEvent(event: CustomEvent<GveVisualEvent>): void {\r\n const d = event.detail;\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 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 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 public close(): void {\r\n this.snapshotCancel.emit();\r\n }\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 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 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 timelines: {}, // TODO\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 return snapshot;\r\n }\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 label=\"text\">\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>\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 label=\"operations\">\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 <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\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 [ngClass]=\"{ selected: operation.id === resultOperationId }\">\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\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 color=\"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 color=\"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 [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 <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\r\n </div>\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\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 (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab label=\"image\">\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 </mat-tab-group>\r\n\r\n <!-- preview -->\r\n @if (snapshot) {\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n <button\r\n color=\"primary\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"updateViewData()\"\r\n >\r\n <mat-icon class=\"mat-primary\">refresh</mat-icon>\r\n </button>\r\n </legend>\r\n <gve-snapshot-view\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\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 || form.pristine\"\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/animation-vars/animation-vars.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":["i7","i9","i4","i5","i6","i11","i2","i3","i8","debounceTime","i3.SettingsService","i10","i12","i14","i16","i1","i2.GveApiService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"myrmidon-gve-core.mjs","sources":["../../../../projects/myrmidon/gve-core/src/lib/components/animation-vars/animation-vars.component.ts","../../../../projects/myrmidon/gve-core/src/lib/components/animation-vars/animation-vars.component.html","../../../../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 ElementRef,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n ViewChild,\r\n} from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\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 { 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 { GveAnimationVars } from '@myrmidon/gve-snapshot-view';\r\n\r\ninterface VarViewModel {\r\n name: string;\r\n value: string | number | boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'gve-animation-vars',\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: './animation-vars.component.html',\r\n styleUrl: './animation-vars.component.css',\r\n})\r\nexport class AnimationVarsComponent {\r\n private _vars: GveAnimationVars = {};\r\n\r\n @Input()\r\n public get vars(): GveAnimationVars {\r\n return this._vars;\r\n }\r\n public set vars(value: GveAnimationVars) {\r\n if (this._vars === value) {\r\n return;\r\n }\r\n this._vars = value;\r\n this.updateForm(value);\r\n }\r\n\r\n @Output()\r\n public varsChange: EventEmitter<GveAnimationVars> =\r\n new EventEmitter<GveAnimationVars>();\r\n\r\n @ViewChild('vname', { static: true })\r\n public nameInput?: ElementRef;\r\n\r\n public name: FormControl<string>;\r\n public value: FormControl<string>;\r\n public form: FormGroup;\r\n\r\n public editedVars: VarViewModel[] = [];\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n this.name = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(100)],\r\n });\r\n this.value = formBuilder.control<string>('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(1000)],\r\n });\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n value: this.value,\r\n });\r\n }\r\n\r\n private updateForm(vars: GveAnimationVars): void {\r\n this.editedVars = Object.entries(vars)\r\n .map(([name, value]) => ({ name, value }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n\r\n private getVars(): GveAnimationVars {\r\n return this.editedVars.reduce(\r\n (acc, { name, value }) => ({ ...acc, [name]: value }),\r\n {}\r\n );\r\n }\r\n\r\n public addVar(): void {\r\n this.form.reset();\r\n // focus the name input\r\n setTimeout(() => this.nameInput?.nativeElement.focus(), 0);\r\n }\r\n\r\n public editVar(index: number): void {\r\n const { name, value } = this.editedVars[index];\r\n this.form.setValue({ name, value });\r\n this.form.markAsPristine();\r\n // focus the name input\r\n setTimeout(() => this.nameInput?.nativeElement.focus(), 0);\r\n }\r\n\r\n public deleteVar(index: number): void {\r\n this.editedVars = this.editedVars.filter((_, i) => i !== index);\r\n this.varsChange.emit(this.getVars());\r\n }\r\n\r\n private parseValue(value: string): string | number | boolean {\r\n if (!value) {\r\n return '';\r\n }\r\n if (value === 'true') {\r\n return true;\r\n } else if (value === 'false') {\r\n return false;\r\n } else if (/^\\d+$/.test(value)) {\r\n return parseInt(value, 10);\r\n } else if (/^\\d+\\.\\d+$/.test(value)) {\r\n return parseFloat(value);\r\n }\r\n return value;\r\n }\r\n\r\n public saveVar(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n const { name, value } = this.form.value;\r\n\r\n // parse value assuming that if it looks like a boolean/number\r\n // its value should be a boolean/number rather than a string\r\n const v = this.parseValue(value);\r\n\r\n const editedVars = [...this.editedVars];\r\n\r\n // if name already exists, update the value; else add it\r\n const existingIndex = this.editedVars.findIndex((vr) => vr.name === name);\r\n if (existingIndex !== -1) {\r\n editedVars[existingIndex] = { name, value: v };\r\n this.editedVars = editedVars;\r\n return;\r\n } else {\r\n editedVars.push({ name, value: v });\r\n this.editedVars = editedVars.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n this.varsChange.emit(this.getVars());\r\n\r\n setTimeout(() => {\r\n this.nameInput?.nativeElement.focus();\r\n this.form.reset();\r\n this.form.markAsPristine();\r\n this.form.updateValueAndValidity();\r\n }, 0);\r\n }\r\n}\r\n","<div>\r\n <div>\r\n <button type=\"button\" mat-raised-button color=\"primary\" (click)=\"addVar()\">\r\n <mat-icon>add</mat-icon>\r\n property\r\n </button>\r\n </div>\r\n\r\n @if (editedVars.length) {\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>name</th>\r\n <th>value</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (v of editedVars; track v.name; let index=$index) {\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)=\"editVar(index)\"\r\n matTooltip=\"Edit this property\"\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 (click)=\"deleteVar(index)\"\r\n matTooltip=\"Delete this property\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ v.name }}</td>\r\n <td>{{ v.value }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n } @else {\r\n <p class=\"muted\">(no vars)</p>\r\n }\r\n\r\n <form [formGroup]=\"form\" (submit)=\"saveVar()\">\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- name -->\r\n <mat-form-field>\r\n <mat-label>name</mat-label>\r\n <input matInput [formControl]=\"name\" #vname />\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 <mat-error\r\n *ngIf=\"$any(name).errors?.maxLength && (name.dirty || name.touched)\"\r\n >name too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- value -->\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(value).errors?.required && (value.dirty || value.touched)\r\n \"\r\n >value required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(value).errors?.maxLength && (value.dirty || value.touched)\r\n \"\r\n >value too long</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">add_circle</mat-icon>\r\n </button>\r\n </div>\r\n </fieldset>\r\n </form>\r\n</div>\r\n","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 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, GveAnimationVars } from '@myrmidon/gve-snapshot-view';\r\nimport { AnimationVarsComponent } from '../animation-vars/animation-vars.component';\r\n\r\n/**\r\n * A component to edit an animation tween.\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 AnimationVarsComponent,\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 @Output()\r\n public readonly tweenChange = new EventEmitter<GveAnimationTween>();\r\n\r\n @Output()\r\n public readonly cancel = new EventEmitter<void>();\r\n\r\n public label: FormControl<string>;\r\n public note: FormControl<string | null>;\r\n public type: FormControl<number>;\r\n public selector: FormControl<string>;\r\n public vars: FormControl<GveAnimationVars>;\r\n public vars2: FormControl<GveAnimationVars | null>;\r\n public position: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public elementId: FormControl<string | null>;\r\n public types: { label: string; value: number }[] = [\r\n { label: 'to', value: 0 },\r\n { label: 'from', value: 1 },\r\n { label: 'fromTo', value: 2 },\r\n ];\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(0, { 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({}, { nonNullable: true });\r\n this.vars2 = formBuilder.control(null);\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: GveAnimationVars): 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: GveAnimationVars): 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.cancel.emit();\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:\r\n Object.keys(this.vars.value).length === 0 ? undefined : this.vars.value,\r\n vars2:\r\n this.vars2.value && Object.keys(this.vars2.value).length === 0\r\n ? undefined\r\n : this.vars2.value || undefined,\r\n position: this.position.value?.trim() || undefined,\r\n };\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 <mat-tab-group>\r\n <mat-tab label=\"general\">\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=\"\r\n $any(label).errors?.required && (label.dirty || label.touched)\r\n \"\r\n >label required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(label).errors?.maxLength && (label.dirty || label.touched)\r\n \"\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.value\">{{\r\n t.label\r\n }}</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 <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-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 </mat-tab>\r\n\r\n <mat-tab label=\"properties\">\r\n <!-- vars -->\r\n <gve-animation-vars\r\n [vars]=\"vars.value\"\r\n (varsChange)=\"onVarsChange($event)\"\r\n />\r\n\r\n <!-- vars2 only when type is fromTo -->\r\n @if (type.value === 2) {\r\n <gve-animation-vars\r\n [vars]=\"vars2.value || {}\"\r\n (varsChange)=\"onVars2Change($event)\"\r\n />\r\n }\r\n </mat-tab>\r\n </mat-tab-group>\r\n\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=\"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 color=\"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 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 GveAnimationTweenType,\r\n GveAnimationVars,\r\n} from '@myrmidon/gve-snapshot-view';\r\nimport { AnimationTweenComponent } from '../animation-tween/animation-tween.component';\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 @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 @Input()\r\n public tags: string[] = [];\r\n\r\n @Output()\r\n public readonly timelineChange = new EventEmitter<GveAnimationTimeline>();\r\n\r\n @Output()\r\n public readonly cancel = new EventEmitter<void>();\r\n\r\n public tag: FormControl<string>;\r\n public tweens: FormControl<GveAnimationTween[]>;\r\n public vars: FormControl<GveAnimationVars>;\r\n public form: FormGroup;\r\n\r\n public editedTweenIndex = -1;\r\n public editedTween?: GveAnimationTween;\r\n public readonly selectors = {\r\n 0: 'to',\r\n 1: 'from',\r\n 2: 'fromTo',\r\n };\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({}, { nonNullable: true });\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 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 || {});\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: GveAnimationTweenType.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: Object.keys(this.vars.value).length ? this.vars.value : undefined,\r\n };\r\n }\r\n\r\n public close(): void {\r\n this.cancel.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 <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 | flatLookup : selectors }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\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 (cancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\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=\"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 color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Save timeline\"\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 { MatRippleModule } from '@angular/material/core';\r\n\r\nimport { NgToolsModule } from '@myrmidon/ng-tools';\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\nexport interface BaseTextCharEvent {\r\n char: BaseTextChar;\r\n event: MouseEvent;\r\n}\r\n\r\n/**\r\n * A component that displays a single character from a base text.\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 @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 @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\nexport interface VarBaseTextRange {\r\n at: number;\r\n run: number;\r\n}\r\n\r\n/**\r\n * A component to display a selectable base text.\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 @Input()\r\n public defaultColor = '#DBDBDB';\r\n\r\n @Input()\r\n public defaultBorderColor = '#DBDBDB';\r\n\r\n @Input()\r\n public selectionColor = '#3E92CC';\r\n\r\n @Input()\r\n public hasLineNumber = false;\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 @Output()\r\n public charPick: EventEmitter<BaseTextCharEvent> =\r\n new EventEmitter<BaseTextCharEvent>();\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 line) {\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 */\r\nexport interface FeatureMap {\r\n [key: string]: LabeledId[];\r\n}\r\n\r\n/**\r\n * Feature editor. This edits a single feature, either free or from\r\n * a closed set. In the latter case you must define the set via\r\n * the `labeledIds` input. Also, you can provide a map of features\r\n * to values via the `map` input. This is useful when you want to\r\n * provide a set of features and values to the user, and you want\r\n * to provide human-readable labels for the values.\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\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 this.value.reset();\r\n this.nameIds = this.getLabeledIdsFor(name);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n private getLabeledIdsFor(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.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 }\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 * Editor for a set of features.\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 /**\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 * True to hide the feature filter.\r\n */\r\n @Input()\r\n public noFilter = false;\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 @if (!noFilter || !features.length) {\r\n <!-- filter -->\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]=\"!noFilter\"\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 @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 @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 * 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@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 * Emits 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 -->\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@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 @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 @Input()\r\n public ids?: LabeledId[];\r\n\r\n @Input()\r\n public types?: LabeledId[];\r\n\r\n @Output()\r\n public readonly sourceChange = new EventEmitter<\r\n OperationSource | undefined\r\n >();\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\nexport class SvgValidators {\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@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 @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 @Input()\r\n public selectedNode?: TreeNode<any> | null;\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.\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 { 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 * A component for editing a variant generation operation.\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 * Emits when the operation is changed.\r\n */\r\n @Output()\r\n public readonly operationChange = new EventEmitter<CharChainOperation>();\r\n\r\n /**\r\n * Emits 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 * Emits when the 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 ) {\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 );\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 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 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 // SVG\r\n this.requestPreview();\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,\r\n groupId: this.groupId.value || undefined,\r\n features: this.features.value,\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,\r\n to: this.to.value,\r\n toAsIndex: this.toAsIndex.value,\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,\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\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">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 (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 (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ 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@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 minimum count of features required for filter to be visible.\r\n */\r\n @Input()\r\n public minFilterCount = 6;\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 (features.length && features.length >= minFilterCount) {\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 feature) {\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 * A map of steps in a chain operation context.\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 this.selectedStep = undefined;\r\n this._steps = value || undefined;\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.5em';\r\n\r\n /**\r\n * Emitted when the selectd step has changed.\r\n */\r\n @Output()\r\n public selectedStepChange = new EventEmitter<ChainOperationContextStep>();\r\n\r\n public onSelectStep(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)=\"onSelectStep(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 * Component to display a chain result.\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 _stepPickFrozen?: boolean;\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 last step by default\r\n if (this._result?.steps?.length) {\r\n this._stepPickFrozen = true;\r\n this.step = this._result.steps[this._result.steps.length - 1];\r\n this.tag.setValue(this.step.outputTag);\r\n this._stepPickFrozen = false;\r\n }\r\n }\r\n\r\n /**\r\n * Emits when a result's step is picked.\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 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 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 && !this._stepPickFrozen) {\r\n this.stepPick.emit(this.step!);\r\n }\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 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@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 @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 @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 @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 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) return;\r\n this._heights[this.lineNumber.value] = value;\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 <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 <!-- 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 { GveAnimationTimeline } from '@myrmidon/gve-snapshot-view';\r\n\r\nimport { AnimationTimelineComponent } from '../animation-timeline/animation-timeline.component';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\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 @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 @Input()\r\n public tags: string[] = [];\r\n\r\n @Output()\r\n public readonly timelinesChange = new EventEmitter<GveAnimationTimeline[]>();\r\n\r\n @Output()\r\n public readonly cancel = 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 saveTimeline(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)=\"saveTimeline($event)\"\r\n (cancel)=\"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 EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\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 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\nconst VIEW_TITLE = 'preview';\r\n\r\n/**\r\n * A component to edit a text snapshot.\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\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 this.updateViewData();\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 * 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\r\n public textRange?: VarBaseTextRange;\r\n public editedOp?: CharChainOperation;\r\n public editedOpIndex = -1;\r\n\r\n public opTags: string[] = [];\r\n public opElementIds: string[] = [];\r\n // TODO: add code to update opTags and opElementIds\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 public lineCount = 0;\r\n\r\n public viewTitle = VIEW_TITLE;\r\n public viewData?: SnapshotViewData;\r\n public visualInfo?: string;\r\n public rulers = true;\r\n // run result\r\n public result?: CharChainResult;\r\n public resultOperationId?: string;\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 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 (this.batchOps) {\r\n this.inputOps.setValue(this.batchOps);\r\n this.parseOperations();\r\n }\r\n }\r\n\r\n public updateViewData(\r\n newOperation?: CharChainOperation,\r\n snapshot?: Snapshot,\r\n title = VIEW_TITLE\r\n ): void {\r\n console.log('update view data');\r\n if (!snapshot) {\r\n snapshot = this.getSnapshot();\r\n }\r\n // update or add new operation in copy\r\n if (newOperation) {\r\n const index = snapshot.operations.findIndex(\r\n (op) => op.id === newOperation.id\r\n );\r\n if (index > -1) {\r\n snapshot.operations.splice(index, 1, newOperation);\r\n } else {\r\n snapshot.operations.push(newOperation);\r\n }\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: true,\r\n delayedRender: true,\r\n showRulers: true,\r\n showGrid: true,\r\n panZoom: true,\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 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.form.markAsPristine();\r\n }\r\n\r\n public editNewOperation() {\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 public editOperation(index: number) {\r\n this.editedOpIndex = index;\r\n this.editedOp = deepCopy(this.operations.value[index]);\r\n }\r\n\r\n private closeEditedOp() {\r\n this.editedOpIndex = -1;\r\n this.editedOp = undefined;\r\n }\r\n\r\n public onOperationCancel() {\r\n this.closeEditedOp();\r\n }\r\n\r\n public onOperationChange(op: CharChainOperation) {\r\n console.log('operation change');\r\n const operations = [...this.operations.value];\r\n\r\n if (this.editedOpIndex > -1) {\r\n operations.splice(this.editedOpIndex, 1, op);\r\n } else {\r\n operations.push(op);\r\n }\r\n this.operations.setValue(operations);\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n\r\n this.closeEditedOp();\r\n }\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 if (this.resultOperationId === this.operations.value[index].id) {\r\n this.resultOperationId = undefined;\r\n }\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 });\r\n }\r\n\r\n public onTextChange(text: CharNode[]) {\r\n console.log('text change: ' + text);\r\n this.baseText.setValue(text);\r\n this.baseText.updateValueAndValidity();\r\n this.baseText.markAsDirty();\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 this.textRange = undefined;\r\n this.closeEditedOp();\r\n this.operations.reset();\r\n this.updateViewData();\r\n }\r\n\r\n public onRangePick(range: VarBaseTextRange) {\r\n this.textRange = range;\r\n }\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 this.updateViewData();\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 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.resultOperationId = undefined;\r\n this.operations.reset();\r\n this.operations.markAsDirty();\r\n this.operations.updateValueAndValidity();\r\n this.updateViewData();\r\n }\r\n });\r\n }\r\n\r\n public onOperationPreview(operation: CharChainOperation): void {\r\n if (this._previewing) {\r\n return;\r\n }\r\n this._previewing = true;\r\n setTimeout(() => {\r\n this.updateViewData(operation);\r\n this._previewing = false;\r\n }, 0);\r\n }\r\n\r\n public runTo(index: number): void {\r\n const snapshot = this.getSnapshot();\r\n if (!snapshot.text) {\r\n return;\r\n }\r\n const operations = this.operations.value.slice(0, index + 1);\r\n this.busy = true;\r\n this._api.runOperations(snapshot.text as CharNode[], operations).subscribe({\r\n next: (wrapper) => {\r\n if (wrapper.error) {\r\n this._snackbar.open(wrapper.error, 'OK');\r\n return;\r\n }\r\n this.result = wrapper.result!;\r\n // TODO update view\r\n // this.updateViewData(\r\n // undefined,\r\n // snapshot,\r\n // this.operations.value[index].outputTag\r\n // );\r\n },\r\n error: (error) => {\r\n console.error(error);\r\n this._snackbar.open('Error running operations', 'OK');\r\n },\r\n complete: () => {\r\n this.busy = false;\r\n },\r\n });\r\n }\r\n\r\n public onStepPick(step: ChainOperationContextStep): void {\r\n if (!this.result) {\r\n return;\r\n }\r\n this.resultOperationId = step.operation.id;\r\n\r\n // get snapshot for preview by updating its text and\r\n // removing operations past the last executed\r\n const stepNodes = this.result.taggedNodes[step.outputTag];\r\n\r\n // we always display the original base text, just updating\r\n // its nodes features to those of the picked step, and adding\r\n // new nodes if they are not in the original text. It is assumed\r\n // that these new nodes have a manually set position.\r\n const snapshot = this.getSnapshot();\r\n const nodes: CharNode[] = deepCopy(snapshot.text as CharNode[]);\r\n for (const sn of stepNodes) {\r\n const i = nodes.findIndex((n) => n.id === sn.id);\r\n if (i > -1) {\r\n nodes[i].features = sn.features;\r\n } else {\r\n nodes.push(sn);\r\n }\r\n }\r\n\r\n // find 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\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 for (let i = 0; i < stepIndex; i++) {\r\n const stepNodes = this.result.taggedNodes[this.result.steps[i].outputTag];\r\n for (const n of stepNodes) {\r\n if (n.id > maxOriginalId && !nodes.find((x) => x.id === n.id)) {\r\n nodes.push(n);\r\n }\r\n }\r\n }\r\n\r\n snapshot.text = nodes;\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 this.updateViewData(undefined, snapshot, step.outputTag);\r\n }\r\n\r\n public onVisualEvent(event: CustomEvent<GveVisualEvent>): void {\r\n const d = event.detail;\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 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 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 public close(): void {\r\n this.snapshotCancel.emit();\r\n }\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 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 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 timelines: {}, // TODO\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 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 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 label=\"text\">\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>\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 label=\"operations\">\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 color=\"primary\"\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 color=\"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 color=\"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 [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 <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\r\n </div>\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\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 (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab label=\"image\">\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 label=\"animation\">\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 <!-- preview -->\r\n @if (snapshot) {\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n <button\r\n color=\"primary\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"updateViewData()\"\r\n >\r\n <mat-icon class=\"mat-primary\">refresh</mat-icon>\r\n </button>\r\n </legend>\r\n <gve-snapshot-view\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\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 || form.pristine\"\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/animation-vars/animation-vars.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":["i7","i9","i4","i5","i6","i11","i2","i3","i8","debounceTime","i3.SettingsService","i10","i12","i14","i16","i1","i2.GveApiService","i15"],"mappings":"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"}
|