63 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import CONFIG from './config';
 | |
| import Vue, { PropType } from 'vue';
 | |
| 
 | |
| export interface Suggestion {
 | |
|   name: string;
 | |
|   help: string;
 | |
|   params: string[];
 | |
| 
 | |
|   disabled: boolean;
 | |
| }
 | |
| 
 | |
| export default Vue.component('suggestions', {
 | |
|   props: {
 | |
|     message: {
 | |
|       type: String
 | |
|     },
 | |
|     
 | |
|     suggestions: {
 | |
|       type: Array as PropType<Suggestion[]>
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {};
 | |
|   },
 | |
|   computed: {
 | |
|     currentSuggestions(): Suggestion[] {
 | |
|       if (this.message === '') {
 | |
|         return [];
 | |
|       }
 | |
|       const currentSuggestions = this.suggestions.filter((s) => {
 | |
|         if (!s.name.startsWith(this.message)) {
 | |
|           const suggestionSplitted = s.name.split(' ');
 | |
|           const messageSplitted = this.message.split(' ');
 | |
|           for (let i = 0; i < messageSplitted.length; i += 1) {
 | |
|             if (i >= suggestionSplitted.length) {
 | |
|               return i < suggestionSplitted.length + s.params.length;
 | |
|             }
 | |
|             if (suggestionSplitted[i] !== messageSplitted[i]) {
 | |
|               return false;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         return true;
 | |
|       }).slice(0, CONFIG.suggestionLimit);
 | |
| 
 | |
|       currentSuggestions.forEach((s) => {
 | |
|         // eslint-disable-next-line no-param-reassign
 | |
|         s.disabled = !s.name.startsWith(this.message);
 | |
| 
 | |
|         s.params.forEach((p, index) => {
 | |
|           const wType = (index === s.params.length - 1) ? '.' : '\\S';
 | |
|           const regex = new RegExp(`${s.name} (?:\\w+ ){${index}}(?:${wType}*)$`, 'g');
 | |
| 
 | |
|           // eslint-disable-next-line no-param-reassign
 | |
|           // @ts-ignore
 | |
|           p.disabled = this.message.match(regex) == null;
 | |
|         });
 | |
|       });
 | |
|       return currentSuggestions;
 | |
|     },
 | |
|   },
 | |
|   methods: {},
 | |
| });
 | 
