import { IOption, isObject } from '@websolutespa/bom-core';
function escapeRegexChars(text: string) {
return text.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
}
function safeToString(text: string) {
return text === undefined || text === null ? '' : text.toString().trim();
}
function encodeHTML(text: string) {
return safeToString(text)
.replace(/&/g, '&')
.replace(//g, '>');
}
export function highligthText(text: string, query: string | string[] | undefined): string {
if (!query) {
return text;
}
if (!Array.isArray(query)) {
query = query.split(' ');
}
text = encodeHTML(text);
const escapedQuery = query.map(x => escapeRegexChars(x));
const regExp = new RegExp('&[^;]+;|' + escapedQuery.join('|'), 'gi');
// console.log(regExp, query);
return text.replace(regExp, function (match, i, b) {
return '' + match + '';
// return match.toLowerCase() === x.toLowerCase() ? '' + match + '' : match;
});
}
export function isEmptyValue(value: string | string[] | undefined) {
if (Array.isArray(value)) {
return value.length === 0;
}
return Boolean(value) === false;
}
export function outerToInnerSelectValue(
value: string | IOption | string[] | IOption[] | null | undefined
): string | string[] | undefined {
if (Array.isArray(value)) {
return value.map(x => outerToInnerSelectValue(x)) as string[];
}
if (isObject(value)) {
return String(value.id);
}
if (value == null) {
return undefined;
}
return value;
}
export function innerToOuterSelectValue(
value: string | string[] | undefined,
options?: IOption[]
): string | IOption | string[] | IOption[] | null {
if (Array.isArray(value)) {
return value.map(x => innerToOuterSelectValue(x, options)) as (IOption[] | string[]);
}
if (value == null) {
return null;
}
if (Array.isArray(options)) {
return options.find(x => String(x.id) === value) || null;
}
return value;
}
export function outerToInnerValue(
value: string | IOption | string[] | IOption[] | null | undefined
): string | string[] | undefined {
if (Array.isArray(value)) {
return value.map(x => outerToInnerValue(x)) as string[];
}
if (isObject(value)) {
return value.name;
}
if (value == null) {
return undefined;
}
return value;
}
export function innerToOuterValue(
value: string | string[] | undefined,
options?: IOption[]
): string | IOption | string[] | IOption[] | null {
if (Array.isArray(value)) {
return value.map(x => innerToOuterValue(x, options)) as (IOption[] | string[]);
}
if (value == null) {
return null;
}
if (Array.isArray(options)) {
return options.find(x => x.name === value) || null;
}
return value;
}
export function outerToInnerSingleValue(
value: string | IOption | null | undefined
): string | undefined {
if (isObject(value)) {
return value.name;
}
if (value == null) {
return undefined;
}
return value;
}
export function innerToOuterSingleValue(
value: string | undefined,
options?: IOption[]
): string | IOption | null {
if (value == null) {
return null;
}
if (Array.isArray(options)) {
return options.find(x => x.name === value) || null;
}
return value;
}
export type IMatch = { index: number, option: IOption };
export function filterOptions(options: IOption[], value?: string, limit: number = 0) {
if (!value) {
return [...options];
/*
if (limit > 0) {
return options.slice(0, limit);
} else {
return [...options];
}
*/
}
const lowerValue = value.toLowerCase();
const matches = options.reduce((p, x) => {
const index = x.name.toLowerCase().indexOf(lowerValue);
if (index !== -1) {
p.push({ index, option: x });
}
return p;
}, []);
matches.sort((a, b) => {
const order = a.index - b.index;
if (order === 0) {
return a.option.name.localeCompare(b.option.name);
}
return order;
});
const filteredOptions = matches.map(x => x.option);
if (limit > 0) {
return filteredOptions.slice(0, limit);
}
return filteredOptions;
}