import { Component, OnInit, Inject, Pipe, PipeTransform, ViewChild, AfterViewInit } from '@angular/core'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { MAT_DIALOG_DATA, MatDialogRef, MatDialog } from '@angular/material/dialog'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { FormControl } from '@angular/forms'; import { args, args_info } from './youtubedl_args'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators/map'; import { startWith } from 'rxjs/operators/startWith'; import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; @Pipe({ name: 'highlight' }) export class HighlightPipe implements PipeTransform { transform(text: string, search): string { const pattern = search ? search .replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') .split(' ') .filter(t => t.length > 0) .join('|') : undefined; const regex = new RegExp(pattern, 'gi'); return search ? text.replace(regex, match => `${match}`) : text; } }; @Component({ selector: 'app-arg-modifier-dialog', templateUrl: './arg-modifier-dialog.component.html', providers: [HighlightPipe], styleUrls: ['./arg-modifier-dialog.component.scss'], }) export class ArgModifierDialogComponent implements OnInit, AfterViewInit { myGroup = new FormControl(); firstArg = ''; secondArg = ''; secondArgEnabled = false; modified_args = ''; stateCtrl = new FormControl(); chipCtrl = new FormControl(); availableArgs = null; argsByCategory = null; argsByKey = null; argsInfo = null; filteredOptions: Observable; filteredChipOptions: Observable; // chip list chipInput = ''; visible = true; selectable = true; removable = true; addOnBlur = false; args_array = null; readonly separatorKeysCodes: number[] = [ENTER, COMMA]; @ViewChild( 'chipper', {read: MatAutocompleteTrigger}) autoTrigger: MatAutocompleteTrigger; static forRoot() { return { ngModule: ArgModifierDialogComponent, providers: [], }; } constructor(@Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef, private dialog: MatDialog) { } ngOnInit(): void { if (this.data) { this.modified_args = this.data.initial_args; this.generateArgsArray(); } this.getAllPossibleArgs(); // autocomplete setup this.filteredOptions = this.stateCtrl.valueChanges .pipe( startWith(''), map(val => this.filter(val)) ); this.filteredChipOptions = this.chipCtrl.valueChanges .pipe( startWith(''), map(val => this.filter(val)) ); } ngAfterViewInit() { this.autoTrigger.panelClosingActions.subscribe( x => { if (this.autoTrigger.activeOption) { console.log(this.autoTrigger.activeOption.value) this.chipCtrl.setValue(this.autoTrigger.activeOption.value) } } ) } // autocomplete filter filter(val) { if (this.availableArgs) { return this.availableArgs.filter(option => option.key.toLowerCase().includes(val.toLowerCase())); } } addArg() { if (!this.modified_args) { this.modified_args = ''; } // adds space if (this.modified_args !== '') { this.modified_args += ',,'; } this.modified_args += this.stateCtrl.value + (this.secondArgEnabled ? ',,' + this.secondArg : ''); this.generateArgsArray(); } canAddArg() { return this.stateCtrl.value && this.stateCtrl.value !== '' && (!this.secondArgEnabled || (this.secondArg && this.secondArg !== '')); } getFirstArg() { return new Promise(resolve => { resolve(this.stateCtrl.value); }); } getValueAsync(val) { return new Promise(resolve => { resolve(val); }); } getAllPossibleArgs() { const all_args = args; const arg_arrays = Object.keys(all_args).map(function(key) { return all_args[key]; }); // converts array of arrays to one array const singular_arg_array = [].concat.apply([], arg_arrays); const args_by_key = singular_arg_array.reduce((acc, curr) => { acc[curr.key] = curr; return acc; }, {}); this.argsByKey = args_by_key; this.availableArgs = singular_arg_array; this.argsByCategory = all_args; this.argsInfo = args_info; } setFirstArg(arg_key) { this.stateCtrl.setValue(arg_key); } // chip list functions add(event) { const input = event.input; const arg = event.value; this.args_array.push(arg); if (this.modified_args.length > 0) { this.modified_args += ',,' } this.modified_args += arg; if (input) { input.value = ''; } } remove(arg_index) { this.args_array.splice(arg_index, 1); this.modified_args = this.args_array.join(',,'); } generateArgsArray() { if (this.modified_args.trim().length === 0) { this.args_array = []; return; } this.args_array = this.modified_args.split(',,'); } drop(event: CdkDragDrop) { moveItemInArray(this.args_array, event.previousIndex, event.currentIndex); this.modified_args = this.args_array.join(',,'); } }