UNPKG

@bitrix24/b24ui-nuxt

Version:

Bitrix24 UI-Kit for developing web applications REST API for NUXT & VUE

61 lines (60 loc) 2.1 kB
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 }; }