-
Notifications
You must be signed in to change notification settings - Fork 124
/
Copy pathui-core.js
106 lines (98 loc) · 3.23 KB
/
ui-core.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import PagefindSvelte from "./svelte/ui.svelte";
let scriptBundlePath;
try {
// Important: Check that the element is indeed a <script> node, to avoid a DOM clobbering vulnerability
if (document?.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') {
scriptBundlePath = new URL(document.currentScript.src).pathname.match(
/^(.*\/)(?:pagefind-)?ui.js.*$/
)[1];
}
} catch (e) {
scriptBundlePath = "/pagefind/";
}
export class PagefindUI {
constructor(opts) {
this._pfs = null;
let selector = opts.element ?? "[data-pagefind-ui]";
let bundlePath = opts.bundlePath ?? scriptBundlePath;
let pageSize = opts.pageSize ?? 5;
let resetStyles = opts.resetStyles ?? true;
let showImages = opts.showImages ?? true;
let showSubResults = opts.showSubResults ?? false;
let excerptLength = opts.excerptLength ?? 0;
let processResult = opts.processResult ?? null;
let processTerm = opts.processTerm ?? null;
let showEmptyFilters = opts.showEmptyFilters ?? true;
let openFilters = opts.openFilters ?? [];
let debounceTimeoutMs = opts.debounceTimeoutMs ?? 300;
let mergeIndex = opts.mergeIndex ?? [];
let translations = opts.translations ?? [];
let autofocus = opts.autofocus ?? false;
let sort = opts.sort ?? null;
// Remove the UI-specific config before passing it along to the Pagefind backend
delete opts["element"];
delete opts["bundlePath"];
delete opts["pageSize"];
delete opts["resetStyles"];
delete opts["showImages"];
delete opts["showSubResults"];
delete opts["excerptLength"];
delete opts["processResult"];
delete opts["processTerm"];
delete opts["showEmptyFilters"];
delete opts["openFilters"];
delete opts["debounceTimeoutMs"];
delete opts["mergeIndex"];
delete opts["translations"];
delete opts["autofocus"];
delete opts["sort"];
const dom =
selector instanceof HTMLElement
? selector
: document.querySelector(selector);
if (dom) {
this._pfs = new PagefindSvelte({
target: dom,
props: {
base_path: bundlePath,
page_size: pageSize,
reset_styles: resetStyles,
show_images: showImages,
show_sub_results: showSubResults,
excerpt_length: excerptLength,
process_result: processResult,
process_term: processTerm,
show_empty_filters: showEmptyFilters,
open_filters: openFilters,
debounce_timeout_ms: debounceTimeoutMs,
merge_index: mergeIndex,
translations,
autofocus,
sort,
pagefind_options: opts,
},
});
} else {
console.error(`Pagefind UI couldn't find the selector ${selector}`);
}
}
triggerSearch(term) {
this._pfs.$$set({ trigger_search_term: term });
}
triggerFilters(filters) {
let selected_filters = {};
for (let [filter, key] of Object.entries(filters)) {
if (Array.isArray(key)) {
for (let val of key) {
selected_filters[`${filter}:${val}`] = true;
}
} else {
selected_filters[`${filter}:${key}`] = true;
}
}
this._pfs.$$set({ selected_filters });
}
destroy() {
this._pfs.$destroy();
}
}