Mirror of https://github.com/roostorg/osprey
github.com/roostorg/osprey
1import { OptionData, OptionGroupData } from 'rc-select/lib/interface/index';
2
3import useApplicationConfigStore from '../stores/ApplicationConfigStore';
4
5const actionNameComparisonRegEx = /ActionName\s?(=|!)=\s['"]?[a-z_]*?$/;
6const actionNameLookupRegEx = /[a-z_]*$/;
7
8export const filterAutoComplete = (inputValue: string, option?: OptionData | OptionGroupData): boolean => {
9 if (option == null) return false;
10 const { knownActionNames } = useApplicationConfigStore.getState();
11 const optionString = String(option.value);
12
13 const isAnActionNameComparison = actionNameComparisonRegEx.test(inputValue);
14 const optionIsAnActionName = knownActionNames.has(optionString);
15
16 if (isAnActionNameComparison && optionIsAnActionName) {
17 const actionNameLookupMatch = actionNameLookupRegEx.exec(inputValue);
18 if (actionNameLookupMatch == null) return false;
19
20 const actionNameLookupString = actionNameLookupMatch[0];
21 return optionString.includes(actionNameLookupString);
22 } else if (isAnActionNameComparison || optionIsAnActionName) {
23 return false;
24 }
25
26 const currentWord = String(inputValue.split(' ').slice(-1));
27 return optionString.toUpperCase().includes(currentWord.toUpperCase());
28};
29
30export const sortOptions = (inputValue: string) => {
31 const upperInput = inputValue.toUpperCase();
32 return (a: OptionData, b: OptionData) => {
33 const upperA = String(a.value).toUpperCase();
34 const upperB = String(b.value).toUpperCase();
35
36 const isExactA = upperA === upperInput ? 0 : 1;
37 const isExactB = upperB === upperInput ? 0 : 1;
38
39 const startsWithA = upperA.startsWith(upperInput) ? 0 : 1;
40 const startsWithB = upperB.startsWith(upperInput) ? 0 : 1;
41
42 return isExactA - isExactB || startsWithA - startsWithB || upperA.localeCompare(upperB);
43 };
44};