major server manager overhaul
This commit is contained in:
+175
@@ -0,0 +1,175 @@
|
||||
import {
|
||||
getPropertyFromItem,
|
||||
propsFactory,
|
||||
wrapInArray
|
||||
} from "./chunk-LZ5T2ERG.js";
|
||||
import {
|
||||
Fragment,
|
||||
computed,
|
||||
createBaseVNode,
|
||||
normalizeClass,
|
||||
shallowRef,
|
||||
unref,
|
||||
watchEffect
|
||||
} from "./chunk-2MKFL3BX.js";
|
||||
|
||||
// node_modules/vuetify/lib/composables/filter.js
|
||||
var defaultFilter = (value, query, item) => {
|
||||
if (value == null || query == null) return -1;
|
||||
if (!query.length) return 0;
|
||||
value = value.toString().toLocaleLowerCase();
|
||||
query = query.toString().toLocaleLowerCase();
|
||||
const result = [];
|
||||
let idx = value.indexOf(query);
|
||||
while (~idx) {
|
||||
result.push([idx, idx + query.length]);
|
||||
idx = value.indexOf(query, idx + query.length);
|
||||
}
|
||||
return result.length ? result : -1;
|
||||
};
|
||||
function normaliseMatch(match, query) {
|
||||
if (match == null || typeof match === "boolean" || match === -1) return;
|
||||
if (typeof match === "number") return [[match, match + query.length]];
|
||||
if (Array.isArray(match[0])) return match;
|
||||
return [match];
|
||||
}
|
||||
var makeFilterProps = propsFactory({
|
||||
customFilter: Function,
|
||||
customKeyFilter: Object,
|
||||
filterKeys: [Array, String],
|
||||
filterMode: {
|
||||
type: String,
|
||||
default: "intersection"
|
||||
},
|
||||
noFilter: Boolean
|
||||
}, "filter");
|
||||
function filterItems(items, query, options) {
|
||||
const array = [];
|
||||
const filter = options?.default ?? defaultFilter;
|
||||
const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false;
|
||||
const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length;
|
||||
if (!items?.length) return array;
|
||||
let lookAheadItem = null;
|
||||
loop: for (let i = 0; i < items.length; i++) {
|
||||
const [item, transformed = item] = wrapInArray(items[i]);
|
||||
const customMatches = {};
|
||||
const defaultMatches = {};
|
||||
let match = -1;
|
||||
if ((query || customFiltersLength > 0) && !options?.noFilter) {
|
||||
let hasOnlyCustomFilters = false;
|
||||
if (typeof item === "object") {
|
||||
if (item.type === "divider" || item.type === "subheader") {
|
||||
if (lookAheadItem?.type === "divider" && item.type === "subheader") {
|
||||
array.push(lookAheadItem);
|
||||
}
|
||||
lookAheadItem = {
|
||||
index: i,
|
||||
matches: {},
|
||||
type: item.type
|
||||
};
|
||||
continue;
|
||||
}
|
||||
const filterKeys = keys || Object.keys(transformed);
|
||||
hasOnlyCustomFilters = filterKeys.length === customFiltersLength;
|
||||
for (const key of filterKeys) {
|
||||
const value = getPropertyFromItem(transformed, key);
|
||||
const keyFilter = options?.customKeyFilter?.[key];
|
||||
match = keyFilter ? keyFilter(value, query, item) : filter(value, query, item);
|
||||
if (match !== -1 && match !== false) {
|
||||
if (keyFilter) customMatches[key] = normaliseMatch(match, query);
|
||||
else defaultMatches[key] = normaliseMatch(match, query);
|
||||
} else if (options?.filterMode === "every") {
|
||||
continue loop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
match = filter(item, query, item);
|
||||
if (match !== -1 && match !== false) {
|
||||
defaultMatches.title = normaliseMatch(match, query);
|
||||
}
|
||||
}
|
||||
const defaultMatchesLength = Object.keys(defaultMatches).length;
|
||||
const customMatchesLength = Object.keys(customMatches).length;
|
||||
if (!defaultMatchesLength && !customMatchesLength) continue;
|
||||
if (options?.filterMode === "union" && customMatchesLength !== customFiltersLength && !defaultMatchesLength) continue;
|
||||
if (options?.filterMode === "intersection" && (customMatchesLength !== customFiltersLength || !defaultMatchesLength && customFiltersLength > 0 && !hasOnlyCustomFilters)) continue;
|
||||
}
|
||||
if (lookAheadItem) {
|
||||
array.push(lookAheadItem);
|
||||
lookAheadItem = null;
|
||||
}
|
||||
array.push({
|
||||
index: i,
|
||||
matches: {
|
||||
...defaultMatches,
|
||||
...customMatches
|
||||
}
|
||||
});
|
||||
}
|
||||
return array;
|
||||
}
|
||||
function useFilter(props, items, query, options) {
|
||||
const filteredItems = shallowRef([]);
|
||||
const filteredMatches = shallowRef(/* @__PURE__ */ new Map());
|
||||
const transformedItems = computed(() => options?.transform ? unref(items).map((item) => [item, options.transform(item)]) : unref(items));
|
||||
watchEffect(() => {
|
||||
const _query = typeof query === "function" ? query() : unref(query);
|
||||
const strQuery = typeof _query !== "string" && typeof _query !== "number" ? "" : String(_query);
|
||||
const results = filterItems(transformedItems.value, strQuery, {
|
||||
customKeyFilter: {
|
||||
...props.customKeyFilter,
|
||||
...unref(options?.customKeyFilter)
|
||||
},
|
||||
default: props.customFilter,
|
||||
filterKeys: props.filterKeys,
|
||||
filterMode: props.filterMode,
|
||||
noFilter: props.noFilter
|
||||
});
|
||||
const originalItems = unref(items);
|
||||
const _filteredItems = [];
|
||||
const _filteredMatches = /* @__PURE__ */ new Map();
|
||||
results.forEach((_ref) => {
|
||||
let {
|
||||
index,
|
||||
matches
|
||||
} = _ref;
|
||||
const item = originalItems[index];
|
||||
_filteredItems.push(item);
|
||||
_filteredMatches.set(item.value, matches);
|
||||
});
|
||||
filteredItems.value = _filteredItems;
|
||||
filteredMatches.value = _filteredMatches;
|
||||
});
|
||||
function getMatches(item) {
|
||||
return filteredMatches.value.get(item.value);
|
||||
}
|
||||
return {
|
||||
filteredItems,
|
||||
filteredMatches,
|
||||
getMatches
|
||||
};
|
||||
}
|
||||
function highlightResult(name, text, matches) {
|
||||
if (matches == null || !matches.length) return text;
|
||||
return matches.map((match, i) => {
|
||||
const start = i === 0 ? 0 : matches[i - 1][1];
|
||||
const result = [createBaseVNode("span", {
|
||||
"class": normalizeClass(`${name}__unmask`)
|
||||
}, [text.slice(start, match[0])]), createBaseVNode("span", {
|
||||
"class": normalizeClass(`${name}__mask`)
|
||||
}, [text.slice(match[0], match[1])])];
|
||||
if (i === matches.length - 1) {
|
||||
result.push(createBaseVNode("span", {
|
||||
"class": normalizeClass(`${name}__unmask`)
|
||||
}, [text.slice(match[1])]));
|
||||
}
|
||||
return createBaseVNode(Fragment, null, [result]);
|
||||
});
|
||||
}
|
||||
|
||||
export {
|
||||
makeFilterProps,
|
||||
useFilter,
|
||||
highlightResult
|
||||
};
|
||||
//# sourceMappingURL=chunk-RB6DAYHX.js.map
|
||||
Reference in New Issue
Block a user