@bitrix24/b24ui-nuxt
Version:
Bitrix24 UI-Kit for developing web applications REST API for NUXT & VUE
61 lines (60 loc) • 2.1 kB
JavaScript
import { useFilter as useRekaFilter } from "reka-ui";
import { get } from "../utils/index.js";
export function useFilter() {
const { contains, startsWith } = useRekaFilter({ sensitivity: "base" });
function score(value, searchTerm) {
if (!contains(value, searchTerm)) return null;
if (contains(searchTerm, value)) return 0;
if (startsWith(value, searchTerm)) return 1;
return 2;
}
function scoreItem(item, searchTerm, fields) {
if (typeof item !== "object" || item === null) {
return score(String(item), searchTerm);
}
let bestScore = null;
for (const field of fields) {
const value = get(item, field);
if (value == null) continue;
const values = Array.isArray(value) ? value.map(String) : [String(value)];
for (const v of values) {
const s = score(v, searchTerm);
if (s !== null && (bestScore === null || s < bestScore)) bestScore = s;
if (bestScore === 0) return 0;
}
}
return bestScore;
}
function filter(items, searchTerm, fields) {
if (!searchTerm) return items;
const scored = [];
for (const item of items) {
const s = scoreItem(item, searchTerm, fields);
if (s !== null) {
scored.push({ item, score: s });
}
}
scored.sort((a, b) => a.score - b.score);
return scored.map(({ item }) => item);
}
function filterGroups(groups, searchTerm, options) {
if (!searchTerm) return groups;
return groups.map((group) => {
const result = [];
for (const item of group) {
if (item === void 0 || item === null) continue;
if (options.isStructural?.(item)) {
result.push({ item, score: -1 });
continue;
}
const s = scoreItem(item, searchTerm, options.fields);
if (s !== null) {
result.push({ item, score: s });
}
}
result.sort((a, b) => a.score - b.score);
return result.map(({ item }) => item);
}).filter((group) => group.some((item) => !options.isStructural?.(item)));
}
return { score, scoreItem, filter, filterGroups };
}