@searchcraft/javascript-sdk 0.10.3 → 0.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +4 -4
- package/dist/components/{p-53c795bd.js → p-163402fb.js} +14 -2
- package/dist/components/p-163402fb.js.map +1 -0
- package/dist/components/{p-508ee769.js → p-2d975f19.js} +2 -2
- package/dist/components/{p-508ee769.js.map → p-2d975f19.js.map} +1 -1
- package/dist/components/{p-ad569b01.js → p-35ee16e2.js} +2 -2
- package/dist/components/{p-ad569b01.js.map → p-35ee16e2.js.map} +1 -1
- package/dist/components/{p-da1fb5c0.js → p-4c610bc4.js} +2 -2
- package/dist/components/{p-da1fb5c0.js.map → p-4c610bc4.js.map} +1 -1
- package/dist/components/{p-5a4be632.js → p-6065aee1.js} +2 -2
- package/dist/components/{p-5a4be632.js.map → p-6065aee1.js.map} +1 -1
- package/dist/components/{p-d4558d44.js → p-60fd824d.js} +69 -68
- package/dist/components/p-60fd824d.js.map +1 -0
- package/dist/components/{p-fd564261.js → p-6ed5cca1.js} +4 -4
- package/dist/components/{p-fd564261.js.map → p-6ed5cca1.js.map} +1 -1
- package/dist/components/{p-6717ab82.js → p-9d2e55a7.js} +2 -2
- package/dist/components/{p-6717ab82.js.map → p-9d2e55a7.js.map} +1 -1
- package/dist/components/{p-06bac1fc.js → p-eb633481.js} +2 -2
- package/dist/components/{p-06bac1fc.js.map → p-eb633481.js.map} +1 -1
- package/dist/components/searchcraft-ad.js +1 -1
- package/dist/components/searchcraft-facet-list.js +1 -1
- package/dist/components/searchcraft-filter-panel.js +3 -3
- package/dist/components/searchcraft-input-form.js +1 -1
- package/dist/components/searchcraft-pagination.js +1 -1
- package/dist/components/searchcraft-popover-button.js +1 -1
- package/dist/components/searchcraft-popover-footer.js +1 -1
- package/dist/components/searchcraft-popover-form.js +6 -6
- package/dist/components/searchcraft-popover-list-item.js +1 -1
- package/dist/components/searchcraft-popover-list-view.js +1 -1
- package/dist/components/searchcraft-results-info.js +1 -1
- package/dist/components/searchcraft-search-result.js +1 -1
- package/dist/components/searchcraft-search-results-per-page.js +1 -1
- package/dist/components/searchcraft-search-results.js +3 -3
- package/dist/components/searchcraft-toggle-button.js +1 -1
- package/dist/hydrate/index.js +63 -51
- package/dist/hydrate/index.mjs +63 -51
- package/dist/types/store/SearchcraftStore.types.d.ts +1 -1
- package/package.json +3 -3
- package/dist/components/p-53c795bd.js.map +0 -1
- package/dist/components/p-d4558d44.js.map +0 -1
package/dist/hydrate/index.mjs
CHANGED
|
@@ -335,7 +335,7 @@ var uniqueTime = (key, measureText) => {
|
|
|
335
335
|
};
|
|
336
336
|
}
|
|
337
337
|
};
|
|
338
|
-
var h = (nodeName, vnodeData, ...children) => {
|
|
338
|
+
var h$1 = (nodeName, vnodeData, ...children) => {
|
|
339
339
|
let child = null;
|
|
340
340
|
let key = null;
|
|
341
341
|
let slotName = null;
|
|
@@ -437,7 +437,7 @@ var convertToPrivate = (node) => {
|
|
|
437
437
|
if (node.vname) {
|
|
438
438
|
vnodeData.name = node.vname;
|
|
439
439
|
}
|
|
440
|
-
return h(node.vtag, vnodeData, ...node.vchildren || []);
|
|
440
|
+
return h$1(node.vtag, vnodeData, ...node.vchildren || []);
|
|
441
441
|
}
|
|
442
442
|
const vnode = newVNode(node.vtag, node.vtext);
|
|
443
443
|
vnode.$attrs$ = node.vattrs;
|
|
@@ -1275,7 +1275,7 @@ var renderVdom = (hostRef, renderFnResults, isInitialLoad = false) => {
|
|
|
1275
1275
|
var _c, _d;
|
|
1276
1276
|
const hostElm = hostRef.$hostElement$;
|
|
1277
1277
|
const oldVNode = hostRef.$vnode$ || newVNode(null, null);
|
|
1278
|
-
const rootVnode = isHost(renderFnResults) ? renderFnResults : h(null, null, renderFnResults);
|
|
1278
|
+
const rootVnode = isHost(renderFnResults) ? renderFnResults : h$1(null, null, renderFnResults);
|
|
1279
1279
|
hostTagName = hostElm.tagName;
|
|
1280
1280
|
if (isInitialLoad && rootVnode.$attrs$) {
|
|
1281
1281
|
for (const key of Object.keys(rootVnode.$attrs$)) {
|
|
@@ -1947,14 +1947,14 @@ var hAsync = (nodeName, vnodeData, ...children) => {
|
|
|
1947
1947
|
const flatChildren = children.flat(Infinity);
|
|
1948
1948
|
if (flatChildren.some((child) => child instanceof Promise)) {
|
|
1949
1949
|
return Promise.all(flatChildren).then((resolvedChildren) => {
|
|
1950
|
-
return h(nodeName, vnodeData, ...resolvedChildren);
|
|
1950
|
+
return h$1(nodeName, vnodeData, ...resolvedChildren);
|
|
1951
1951
|
}).catch((err2) => {
|
|
1952
|
-
return h(nodeName, vnodeData);
|
|
1952
|
+
return h$1(nodeName, vnodeData);
|
|
1953
1953
|
});
|
|
1954
1954
|
}
|
|
1955
|
-
return h(nodeName, vnodeData, ...flatChildren);
|
|
1955
|
+
return h$1(nodeName, vnodeData, ...flatChildren);
|
|
1956
1956
|
}
|
|
1957
|
-
return h(nodeName, vnodeData);
|
|
1957
|
+
return h$1(nodeName, vnodeData);
|
|
1958
1958
|
};
|
|
1959
1959
|
function proxyHostElement(elm, cstr) {
|
|
1960
1960
|
const cmpMeta = cstr.cmpMeta;
|
|
@@ -3222,25 +3222,25 @@ function w(a, e, n, r) {
|
|
|
3222
3222
|
return new (n || (n = Promise))(function(i, o) {
|
|
3223
3223
|
function t(c) {
|
|
3224
3224
|
try {
|
|
3225
|
-
|
|
3225
|
+
d(r.next(c));
|
|
3226
3226
|
} catch (s) {
|
|
3227
3227
|
o(s);
|
|
3228
3228
|
}
|
|
3229
3229
|
}
|
|
3230
3230
|
function u(c) {
|
|
3231
3231
|
try {
|
|
3232
|
-
|
|
3232
|
+
d(r.throw(c));
|
|
3233
3233
|
} catch (s) {
|
|
3234
3234
|
o(s);
|
|
3235
3235
|
}
|
|
3236
3236
|
}
|
|
3237
|
-
function
|
|
3237
|
+
function d(c) {
|
|
3238
3238
|
var s;
|
|
3239
3239
|
c.done ? i(c.value) : (s = c.value, s instanceof n ? s : new n(function(p) {
|
|
3240
3240
|
p(s);
|
|
3241
3241
|
})).then(t, u);
|
|
3242
3242
|
}
|
|
3243
|
-
|
|
3243
|
+
d((r = r.apply(a, [])).next());
|
|
3244
3244
|
});
|
|
3245
3245
|
}
|
|
3246
3246
|
function y(a, e) {
|
|
@@ -3251,7 +3251,7 @@ function y(a, e) {
|
|
|
3251
3251
|
return o = { next: u(0), throw: u(1), return: u(2) }, typeof Symbol == "function" && (o[Symbol.iterator] = function() {
|
|
3252
3252
|
return this;
|
|
3253
3253
|
}), o;
|
|
3254
|
-
function u(
|
|
3254
|
+
function u(d) {
|
|
3255
3255
|
return function(c) {
|
|
3256
3256
|
return function(s) {
|
|
3257
3257
|
if (n) throw new TypeError("Generator is already executing.");
|
|
@@ -3298,7 +3298,7 @@ function y(a, e) {
|
|
|
3298
3298
|
}
|
|
3299
3299
|
if (5 & s[0]) throw s[1];
|
|
3300
3300
|
return { value: s[0] ? s[1] : void 0, done: !0 };
|
|
3301
|
-
}([
|
|
3301
|
+
}([d, c]);
|
|
3302
3302
|
};
|
|
3303
3303
|
}
|
|
3304
3304
|
}
|
|
@@ -3317,13 +3317,13 @@ function I(a, e) {
|
|
|
3317
3317
|
if (e === void 0 && (e = 0), e = e ? 0 | e : 0, typeof a == "string" && (n = a, a = new TextEncoder().encode(n).buffer), !(a instanceof ArrayBuffer)) throw new TypeError("Expected key to be ArrayBuffer or string");
|
|
3318
3318
|
var r = new Uint32Array([e, e, e, e]);
|
|
3319
3319
|
(((function(o, t) {
|
|
3320
|
-
for (var u = o.byteLength / 16 | 0,
|
|
3321
|
-
var s =
|
|
3320
|
+
for (var u = o.byteLength / 16 | 0, d = new Uint32Array(o, 0, 4 * u), c = 0; c < u; c++) {
|
|
3321
|
+
var s = d.subarray(4 * c, 4 * (c + 1));
|
|
3322
3322
|
s[0] = Math.imul(s[0], m[0]), s[0] = g(s[0], 15), s[0] = Math.imul(s[0], m[1]), t[0] = t[0] ^ s[0], t[0] = g(t[0], 19), t[0] = t[0] + t[1], t[0] = Math.imul(t[0], 5) + 1444728091, s[1] = Math.imul(s[1], m[1]), s[1] = g(s[1], 16), s[1] = Math.imul(s[1], m[2]), t[1] = t[1] ^ s[1], t[1] = g(t[1], 17), t[1] = t[1] + t[2], t[1] = Math.imul(t[1], 5) + 197830471, s[2] = Math.imul(s[2], m[2]), s[2] = g(s[2], 17), s[2] = Math.imul(s[2], m[3]), t[2] = t[2] ^ s[2], t[2] = g(t[2], 15), t[2] = t[2] + t[3], t[2] = Math.imul(t[2], 5) + 2530024501, s[3] = Math.imul(s[3], m[3]), s[3] = g(s[3], 18), s[3] = Math.imul(s[3], m[0]), t[3] = t[3] ^ s[3], t[3] = g(t[3], 13), t[3] = t[3] + t[0], t[3] = Math.imul(t[3], 5) + 850148119;
|
|
3323
3323
|
}
|
|
3324
3324
|
})))(a, r), function(o, t) {
|
|
3325
|
-
var u = o.byteLength / 16 | 0,
|
|
3326
|
-
switch (
|
|
3325
|
+
var u = o.byteLength / 16 | 0, d = o.byteLength % 16, c = new Uint32Array(4), s = new Uint8Array(o, 16 * u, d);
|
|
3326
|
+
switch (d) {
|
|
3327
3327
|
case 15:
|
|
3328
3328
|
c[3] = c[3] ^ s[14] << 16;
|
|
3329
3329
|
case 14:
|
|
@@ -3399,11 +3399,11 @@ v("audio", function() {
|
|
|
3399
3399
|
var r = new (window.OfflineAudioContext || window.webkitOfflineAudioContext)(1, 5e3, 44100), i = r.createBufferSource(), o = r.createOscillator();
|
|
3400
3400
|
o.frequency.value = 1e3;
|
|
3401
3401
|
var t, u = r.createDynamicsCompressor();
|
|
3402
|
-
u.threshold.value = -50, u.knee.value = 40, u.ratio.value = 12, u.attack.value = 0, u.release.value = 0.2, o.connect(u), u.connect(r.destination), o.start(), r.oncomplete = function(
|
|
3403
|
-
t =
|
|
3402
|
+
u.threshold.value = -50, u.knee.value = 40, u.ratio.value = 12, u.attack.value = 0, u.release.value = 0.2, o.connect(u), u.connect(r.destination), o.start(), r.oncomplete = function(d) {
|
|
3403
|
+
t = d.renderedBuffer.getChannelData(0), e({ sampleHash: H(t), oscillator: o.type, maxChannels: r.destination.maxChannelCount, channelCountMode: i.channelCountMode });
|
|
3404
3404
|
}, r.startRendering();
|
|
3405
|
-
} catch (
|
|
3406
|
-
console.error("Error creating audio fingerprint:",
|
|
3405
|
+
} catch (d) {
|
|
3406
|
+
console.error("Error creating audio fingerprint:", d), n(d);
|
|
3407
3407
|
}
|
|
3408
3408
|
})];
|
|
3409
3409
|
});
|
|
@@ -3440,8 +3440,8 @@ function Y() {
|
|
|
3440
3440
|
if (!i.length || !r.length) {
|
|
3441
3441
|
var t = n.getExtension("WEBGL_debug_renderer_info");
|
|
3442
3442
|
if (t) {
|
|
3443
|
-
var u = (n.getParameter(t.UNMASKED_VENDOR_WEBGL) || "").toString(),
|
|
3444
|
-
u && (o.vendorUnmasked = u),
|
|
3443
|
+
var u = (n.getParameter(t.UNMASKED_VENDOR_WEBGL) || "").toString(), d = (n.getParameter(t.UNMASKED_RENDERER_WEBGL) || "").toString();
|
|
3444
|
+
u && (o.vendorUnmasked = u), d && (o.rendererUnmasked = d);
|
|
3445
3445
|
}
|
|
3446
3446
|
}
|
|
3447
3447
|
return o;
|
|
@@ -3463,9 +3463,9 @@ function ee(a, e) {
|
|
|
3463
3463
|
var s = String(c);
|
|
3464
3464
|
t[s] = (t[s] || 0) + 1;
|
|
3465
3465
|
});
|
|
3466
|
-
var u = o[0],
|
|
3466
|
+
var u = o[0], d = 1;
|
|
3467
3467
|
return Object.keys(t).forEach(function(c) {
|
|
3468
|
-
t[c] >
|
|
3468
|
+
t[c] > d && (u = c, d = t[c]);
|
|
3469
3469
|
}), u;
|
|
3470
3470
|
}(a.map(function(o) {
|
|
3471
3471
|
return r in o ? o[r] : void 0;
|
|
@@ -3499,14 +3499,14 @@ C().name != "Firefox" && v("fonts", function() {
|
|
|
3499
3499
|
var i;
|
|
3500
3500
|
w(this, void 0, void 0, function() {
|
|
3501
3501
|
var o, t, u;
|
|
3502
|
-
return y(this, function(
|
|
3503
|
-
switch (
|
|
3502
|
+
return y(this, function(d) {
|
|
3503
|
+
switch (d.label) {
|
|
3504
3504
|
case 0:
|
|
3505
3505
|
return document.body ? [3, 2] : [4, (c = 50, new Promise(function(p) {
|
|
3506
3506
|
return setTimeout(p, c, s);
|
|
3507
3507
|
}))];
|
|
3508
3508
|
case 1:
|
|
3509
|
-
return
|
|
3509
|
+
return d.sent(), [3, 0];
|
|
3510
3510
|
case 2:
|
|
3511
3511
|
if ((o = document.createElement("iframe")).setAttribute("frameBorder", "0"), (t = o.style).setProperty("position", "fixed"), t.setProperty("display", "block", "important"), t.setProperty("visibility", "visible"), t.setProperty("border", "0"), t.setProperty("opacity", "0"), o.src = "about:blank", document.body.appendChild(o), !(u = o.contentDocument || ((i = o.contentWindow) === null || i === void 0 ? void 0 : i.document))) throw new Error("Iframe document is not accessible");
|
|
3512
3512
|
return r({ iframe: u }), setTimeout(function() {
|
|
@@ -3519,14 +3519,14 @@ C().name != "Firefox" && v("fonts", function() {
|
|
|
3519
3519
|
})(function(r) {
|
|
3520
3520
|
var i = r.iframe;
|
|
3521
3521
|
return w(a, void 0, void 0, function() {
|
|
3522
|
-
var o, t, u,
|
|
3522
|
+
var o, t, u, d;
|
|
3523
3523
|
return y(this, function(c) {
|
|
3524
3524
|
return o = i.createElement("canvas"), t = o.getContext("2d"), u = J.map(function(s) {
|
|
3525
3525
|
return F(t, s);
|
|
3526
|
-
}),
|
|
3526
|
+
}), d = {}, X.forEach(function(s) {
|
|
3527
3527
|
var p = F(t, s);
|
|
3528
|
-
u.includes(p) || (
|
|
3529
|
-
}), e(
|
|
3528
|
+
u.includes(p) || (d[s] = p);
|
|
3529
|
+
}), e(d), [2];
|
|
3530
3530
|
});
|
|
3531
3531
|
});
|
|
3532
3532
|
});
|
|
@@ -3596,18 +3596,18 @@ C().name != "Firefox" && v("fonts", function() {
|
|
|
3596
3596
|
a({ platform: window.navigator.platform, cookieEnabled: window.navigator.cookieEnabled, productSub: navigator.productSub, product: navigator.product, useragent: navigator.userAgent, hardwareConcurrency: navigator.hardwareConcurrency, browser: { name: e.name, version: e.version }, applePayVersion: ne() });
|
|
3597
3597
|
});
|
|
3598
3598
|
});
|
|
3599
|
-
var f, re = C().name !== "SamsungBrowser" ? 1 : 3,
|
|
3599
|
+
var f, re = C().name !== "SamsungBrowser" ? 1 : 3, h = null;
|
|
3600
3600
|
v("webgl", function() {
|
|
3601
3601
|
return w(this, void 0, void 0, function() {
|
|
3602
3602
|
var a;
|
|
3603
3603
|
return y(this, function(e) {
|
|
3604
|
-
typeof document < "u" && ((f = document.createElement("canvas")).width = 200, f.height = 100,
|
|
3604
|
+
typeof document < "u" && ((f = document.createElement("canvas")).width = 200, f.height = 100, h = f.getContext("webgl"));
|
|
3605
3605
|
try {
|
|
3606
|
-
if (!
|
|
3606
|
+
if (!h) throw new Error("WebGL not supported");
|
|
3607
3607
|
return a = Array.from({ length: re }, function() {
|
|
3608
3608
|
return function() {
|
|
3609
3609
|
try {
|
|
3610
|
-
if (!
|
|
3610
|
+
if (!h) throw new Error("WebGL not supported");
|
|
3611
3611
|
var n = `
|
|
3612
3612
|
attribute vec2 position;
|
|
3613
3613
|
void main() {
|
|
@@ -3618,28 +3618,28 @@ v("webgl", function() {
|
|
|
3618
3618
|
void main() {
|
|
3619
3619
|
gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color
|
|
3620
3620
|
}
|
|
3621
|
-
`, i =
|
|
3621
|
+
`, i = h.createShader(h.VERTEX_SHADER), o = h.createShader(h.FRAGMENT_SHADER);
|
|
3622
3622
|
if (!i || !o) throw new Error("Failed to create shaders");
|
|
3623
|
-
if (
|
|
3624
|
-
if (
|
|
3625
|
-
var t =
|
|
3623
|
+
if (h.shaderSource(i, n), h.shaderSource(o, r), h.compileShader(i), !h.getShaderParameter(i, h.COMPILE_STATUS)) throw new Error("Vertex shader compilation failed: " + h.getShaderInfoLog(i));
|
|
3624
|
+
if (h.compileShader(o), !h.getShaderParameter(o, h.COMPILE_STATUS)) throw new Error("Fragment shader compilation failed: " + h.getShaderInfoLog(o));
|
|
3625
|
+
var t = h.createProgram();
|
|
3626
3626
|
if (!t) throw new Error("Failed to create shader program");
|
|
3627
|
-
if (
|
|
3628
|
-
|
|
3629
|
-
for (var u = 137,
|
|
3627
|
+
if (h.attachShader(t, i), h.attachShader(t, o), h.linkProgram(t), !h.getProgramParameter(t, h.LINK_STATUS)) throw new Error("Shader program linking failed: " + h.getProgramInfoLog(t));
|
|
3628
|
+
h.useProgram(t);
|
|
3629
|
+
for (var u = 137, d = new Float32Array(4 * u), c = 2 * Math.PI / u, s = 0; s < u; s++) {
|
|
3630
3630
|
var p = s * c;
|
|
3631
|
-
|
|
3631
|
+
d[4 * s] = 0, d[4 * s + 1] = 0, d[4 * s + 2] = Math.cos(p) * (f.width / 2), d[4 * s + 3] = Math.sin(p) * (f.height / 2);
|
|
3632
3632
|
}
|
|
3633
|
-
var q =
|
|
3634
|
-
|
|
3635
|
-
var R =
|
|
3636
|
-
|
|
3633
|
+
var q = h.createBuffer();
|
|
3634
|
+
h.bindBuffer(h.ARRAY_BUFFER, q), h.bufferData(h.ARRAY_BUFFER, d, h.STATIC_DRAW);
|
|
3635
|
+
var R = h.getAttribLocation(t, "position");
|
|
3636
|
+
h.enableVertexAttribArray(R), h.vertexAttribPointer(R, 2, h.FLOAT, !1, 0, 0), h.viewport(0, 0, f.width, f.height), h.clearColor(0, 0, 0, 1), h.clear(h.COLOR_BUFFER_BIT), h.drawArrays(h.LINES, 0, 2 * u);
|
|
3637
3637
|
var x = new Uint8ClampedArray(f.width * f.height * 4);
|
|
3638
|
-
return
|
|
3638
|
+
return h.readPixels(0, 0, f.width, f.height, h.RGBA, h.UNSIGNED_BYTE, x), new ImageData(x, f.width, f.height);
|
|
3639
3639
|
} catch {
|
|
3640
3640
|
return new ImageData(1, 1);
|
|
3641
3641
|
} finally {
|
|
3642
|
-
|
|
3642
|
+
h && (h.bindBuffer(h.ARRAY_BUFFER, null), h.useProgram(null), h.viewport(0, 0, h.drawingBufferWidth, h.drawingBufferHeight), h.clearColor(0, 0, 0, 0));
|
|
3643
3643
|
}
|
|
3644
3644
|
}();
|
|
3645
3645
|
}), [2, { commonImageHash: I(L(a, f.width, f.height).data.toString()).toString() }];
|
|
@@ -3790,7 +3790,7 @@ const searchcraftStore = zustand.createStore((_set, get) => {
|
|
|
3790
3790
|
// Reset to first page when response count changes
|
|
3791
3791
|
count === state.searchResultsCount ? state.searchResultsPage : 1,
|
|
3792
3792
|
searchResultsCount: count,
|
|
3793
|
-
|
|
3793
|
+
searchResponseFacetPrime: facets,
|
|
3794
3794
|
};
|
|
3795
3795
|
});
|
|
3796
3796
|
state.logger?.log(O.DEBUG, `Search results: ${JSON.stringify(items)}`);
|
|
@@ -5510,6 +5510,10 @@ class SearchcraftFacetList {
|
|
|
5510
5510
|
if (!this.fieldName) {
|
|
5511
5511
|
return;
|
|
5512
5512
|
}
|
|
5513
|
+
/** When the search term is empty, clear all facets from facetRoot */
|
|
5514
|
+
if (!state.searchTerm) {
|
|
5515
|
+
this.facetRoot = undefined;
|
|
5516
|
+
}
|
|
5513
5517
|
/** Things to do when the state's search term has changed, but before the response received */
|
|
5514
5518
|
if (state.searchTerm !== this.lastSearchTerm ||
|
|
5515
5519
|
state.searchMode !== this.lastSearchMode) {
|
|
@@ -5531,6 +5535,14 @@ class SearchcraftFacetList {
|
|
|
5531
5535
|
this.facetRoot = mergeFacetRoots(this.fieldName, this.baseFacetRoot, incomingFacetRoot);
|
|
5532
5536
|
}
|
|
5533
5537
|
}
|
|
5538
|
+
else if (!facetPrime && Object.keys(this.selectedPaths).length === 0) {
|
|
5539
|
+
/**
|
|
5540
|
+
* If there's not facetPrime returned from the search response,
|
|
5541
|
+
* and no facets are currently selected.
|
|
5542
|
+
* Clear all the displayed facets
|
|
5543
|
+
*/
|
|
5544
|
+
this.facetRoot = undefined;
|
|
5545
|
+
}
|
|
5534
5546
|
this.lastSearchTerm = state.searchTerm;
|
|
5535
5547
|
this.lastSearchMode = state.searchMode;
|
|
5536
5548
|
this.lastSortType = state.sortType;
|
|
@@ -47,7 +47,7 @@ export interface SearchcraftStateValues {
|
|
|
47
47
|
searchMode: 'fuzzy' | 'exact';
|
|
48
48
|
searchClientResponseItems: SearchClientResponseItem[];
|
|
49
49
|
searchResponseTimeTaken: number | undefined;
|
|
50
|
-
searchResponseFacetPrime: FacetPrime | undefined;
|
|
50
|
+
searchResponseFacetPrime: FacetPrime | undefined | null;
|
|
51
51
|
searchResultsCount: number;
|
|
52
52
|
searchResultsPage: number;
|
|
53
53
|
searchResultsPerPage: number;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@searchcraft/javascript-sdk",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.4",
|
|
5
5
|
"description": "Searchcraft Javascript SDK",
|
|
6
6
|
"author": "Searchcraft Inc.",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"nanoid": "^5.0.9"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@searchcraft/core": "^0.10.
|
|
47
|
+
"@searchcraft/core": "^0.10.4",
|
|
48
48
|
"@stencil/core": "^4.7.0",
|
|
49
49
|
"@stencil/react-output-target": "^0.8.2",
|
|
50
50
|
"@stencil/sass": "^3.0.12",
|
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"@types/node": "^16.18.11",
|
|
53
53
|
"zustand": "^5.0.1"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "70eeba4e82bb1ce41f5b23ea0d384d75754c676f"
|
|
56
56
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"file":"p-53c795bd.js","mappings":"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","names":[],"sources":["src/utils/facets.ts","src/components/searchcraft-facet-list/searchcraft-facet-list.tsx"],"sourcesContent":["import type {\n FacetChild,\n FacetChildObject,\n FacetRoot,\n} from '@searchcraft/core';\n\nfunction deepMergeWithSpread(obj1, obj2) {\n const result = { ...obj1 };\n\n for (const key in obj2) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n if (obj2.hasOwnProperty(key)) {\n if (obj2[key] instanceof Object && obj1[key] instanceof Object) {\n result[key] = deepMergeWithSpread(obj1[key], obj2[key]);\n } else {\n result[key] = obj2[key];\n }\n }\n }\n\n return result;\n}\n\n/**\n * Given an array of facet paths, removes parent facet paths.\n */\nexport function removeSubstringMatches(arr: string[]): string[] {\n return arr.filter(\n (entry, index, array) =>\n !array.some(\n (otherEntry, otherIndex) =>\n otherIndex !== index && otherEntry.includes(entry),\n ),\n );\n}\n\ntype FacetChildFragment = {\n count: number;\n path: string;\n};\n\nfunction facetToRecord(facet: FacetChild): Record<string, FacetChildFragment> {\n const records: Record<string, FacetChildFragment> = {};\n\n const traverseAndAddToFragments = (facetChild: FacetChild) => {\n records[facetChild.path] = {\n count: facetChild.count,\n path: facetChild.path,\n };\n\n facetChild.children?.forEach((child) => {\n traverseAndAddToFragments(child);\n });\n };\n\n traverseAndAddToFragments(facet);\n\n return records;\n}\n\nfunction recordToObject(\n record: Record<string, FacetChildFragment>,\n): FacetChildObject {\n const root: FacetChildObject = {\n count: 0,\n path: '/',\n children: {},\n };\n\n Object.keys(record).forEach((key) => {\n const fragment = record[key];\n if (!fragment) {\n return;\n }\n\n if (fragment.path === '/') {\n return;\n }\n const pathParts = fragment.path.substring(1).split('/');\n let currentRoot = root;\n let currentPath = '';\n\n pathParts.forEach((part, index) => {\n const nextPath = `${currentPath}/${part}`;\n if (!currentRoot.children[nextPath]) {\n currentRoot.children[nextPath] = {\n count: 0,\n path: nextPath,\n children: {},\n };\n }\n\n if (index === pathParts.length - 1) {\n currentRoot.children[nextPath].count = fragment.count;\n }\n\n currentPath = nextPath;\n currentRoot = currentRoot.children[nextPath];\n });\n });\n\n return root;\n}\n\nfunction objectToFacet(childObject: FacetChildObject): FacetChild {\n const transformed: FacetChild = {\n count: childObject.count,\n path: childObject.path,\n children: [],\n };\n\n if (Object.keys(childObject.children).length > 0) {\n transformed.children = Object.values(childObject.children).map(\n (subChildObject) => objectToFacet(subChildObject),\n );\n }\n\n return transformed;\n}\n\n/**\n * Filters records with the parent paths from record2 OUT of record1\n */\nfunction filterRecordByParentPaths(\n record1: Record<string, FacetChild>,\n record2: Record<string, FacetChild>,\n): Record<string, FacetChild> {\n // Extract all paths (keys) both records\n const paths1 = Object.keys(record1);\n const paths2 = Object.keys(record2);\n\n // Find all parent paths in record2\n const parentPaths = new Set(\n paths2\n .filter((path) => path.split('/').length > 2) // Only consider paths with more than one level\n .map((path) => path.substring(0, path.lastIndexOf('/'))),\n );\n\n // Filter out keys in record1 that share a parent path with any of the identified parent paths\n const filteredRecord = Object.fromEntries(\n paths1\n .filter(\n (path) => !parentPaths.has(path.substring(0, path.lastIndexOf('/'))),\n )\n .map((path) => [path, record1[path]]), // Reconstruct the key-value pairs\n );\n\n return filteredRecord as Record<string, FacetChild>;\n}\n\nexport function mergeFacetRoots(\n fieldName: string,\n currentRoot: FacetRoot,\n incomingRoot: FacetRoot,\n): FacetRoot {\n const currentArray = currentRoot[fieldName];\n const incomingArray = incomingRoot[fieldName];\n\n const currentRootFacetChild: FacetChild = {\n count: 0,\n path: '/',\n children: currentArray,\n };\n\n const incomingRootFacetChild: FacetChild = {\n count: 0,\n path: '/',\n children: incomingArray,\n };\n\n // Flatten them into records\n const currentRecord: Record<string, FacetChildFragment> = facetToRecord(\n currentRootFacetChild,\n );\n\n const incomingRecord: Record<string, FacetChildFragment> = facetToRecord(\n incomingRootFacetChild,\n );\n\n // Filter out the records from record1 (the current set of records)\n // that share a parent path with record2 (the incoming records)\n const filteredCurrentRecord = filterRecordByParentPaths(\n currentRecord,\n incomingRecord,\n );\n\n // Deep merge the records together\n const mergedRecord: Record<string, FacetChildFragment> = deepMergeWithSpread(\n filteredCurrentRecord,\n incomingRecord,\n );\n\n // Convert into a heirarchical object\n const mergedObject: FacetChildObject = recordToObject(mergedRecord);\n\n // Convert the heirarchical object back to the Facet child structure\n const mergedFacetChild = objectToFacet(mergedObject);\n\n return {\n [fieldName]: mergedFacetChild.children,\n } as FacetRoot;\n}\n","import {\n Component,\n h,\n State,\n Prop,\n Event,\n type EventEmitter,\n} from '@stencil/core';\n\nimport type { FacetChild, FacetRoot } from '@searchcraft/core';\n\nimport { searchcraftStore, type SearchcraftState } from '@store';\nimport { mergeFacetRoots, removeSubstringMatches } from '@utils';\n\n/**\n * This web component is designed to display facets in a search interface, allowing users to refine their search results by applying filters based on various attributes.\n * It is consumed within the `searchcraft-filter-panel`.\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-facet-list field-name=\"title\" />\n * ```\n *\n * ```js\n * // index.js\n * const facetList = document.querySelector('searchcraft-facet-list');\n *\n * facetList.addEventListener('facetSelectionUpdated', () => {\n * console.log('Facet selection updated');\n * });\n * ```\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-facet-list',\n shadow: false,\n})\nexport class SearchcraftFacetList {\n /**\n * The name of the field where facets are applied.\n */\n @Prop() fieldName = '';\n\n /**\n * When the facets are updated.\n */\n @Event() facetSelectionUpdated?: EventEmitter<{ paths: string[] }>;\n\n @State() baseFacetRoot: FacetRoot | undefined;\n @State() facetRoot: FacetRoot | undefined;\n @State() selectedPaths: Record<string, boolean> = {};\n @State() lastTimeTaken: number | undefined;\n hasNewSearchTerm = false;\n lastSearchTerm: string | undefined;\n lastSearchMode: string | undefined;\n lastSortType: string | undefined | null;\n unsubscribe: (() => void) | undefined;\n\n private searchStore = searchcraftStore.getState();\n\n handleStateUpdate(state: SearchcraftState) {\n const facetPrime = state.searchResponseFacetPrime;\n const timeTaken = state.searchResponseTimeTaken;\n\n if (!this.fieldName) {\n return;\n }\n\n /** Things to do when the state's search term has changed, but before the response received */\n if (\n state.searchTerm !== this.lastSearchTerm ||\n state.searchMode !== this.lastSearchMode\n ) {\n this.selectedPaths = {};\n this.hasNewSearchTerm = true;\n }\n\n /** Things to do when a new response with a new facet prime has been received */\n if (timeTaken !== this.lastTimeTaken && facetPrime) {\n this.facetRoot = undefined;\n const incomingFacetRoot: FacetRoot | undefined = facetPrime.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n\n /** Data is from a new search term: completely override our facets */\n if (this.hasNewSearchTerm) {\n this.baseFacetRoot = incomingFacetRoot;\n this.facetRoot = incomingFacetRoot;\n this.hasNewSearchTerm = false;\n } else if (this.baseFacetRoot && incomingFacetRoot) {\n /** Data is from an existing search term, merge the facets together */\n this.facetRoot = mergeFacetRoots(\n this.fieldName,\n this.baseFacetRoot,\n incomingFacetRoot,\n );\n }\n }\n\n this.lastSearchTerm = state.searchTerm;\n this.lastSearchMode = state.searchMode;\n this.lastSortType = state.sortType;\n this.lastTimeTaken = timeTaken;\n }\n\n connectedCallback() {\n this.handleStateUpdate(this.searchStore);\n\n this.unsubscribe = searchcraftStore.subscribe((state) => {\n this.handleStateUpdate(state);\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n handleCheckboxChange(path: string) {\n const isCheckboxChecked = !this.selectedPaths[path];\n\n if (isCheckboxChecked) {\n /**\n * Checkbox Checked: Add to the selectedPaths record\n * Uses spread operator here so UI updates.\n */\n this.selectedPaths = {\n ...this.selectedPaths,\n [path]: true,\n };\n } else {\n /**\n * Checkbox Uncheck: Remove any paths and sub-paths\n */\n const updatedPaths = Object.keys(this.selectedPaths).filter(\n (testPath) => !testPath.includes(path),\n );\n\n this.selectedPaths = updatedPaths.reduce(\n (acc, str) => {\n acc[str] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n );\n }\n\n /**\n * Emit the paths array, with parent paths removed.\n */\n const paths = Object.keys(this.selectedPaths).filter(\n (path) => this.selectedPaths[path],\n );\n const pathsWithParentPathsRemoved = removeSubstringMatches(paths);\n\n this.facetSelectionUpdated?.emit({ paths: pathsWithParentPathsRemoved });\n }\n\n formatLabel = (facetChild: FacetChild): string => {\n const label = facetChild.path.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n formatSubLabel = (\n facetChild: FacetChild,\n facetChildAncestor: FacetChild,\n ): string => {\n const facetChildPath = facetChild.path.substring(\n facetChildAncestor.path.length,\n );\n const label = facetChildPath.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n render() {\n if (!this.fieldName) {\n return;\n }\n\n const firstFacet = this.facetRoot?.[this.fieldName];\n\n return (\n <div class='searchcraft-facet-list'>\n {!firstFacet && (\n <p class='searchcraft-facet-list-message'>\n Enter a search to view facets.\n </p>\n )}\n {firstFacet?.map((facetChild: FacetChild) => {\n const isChildSelected = facetChild.children\n ? facetChild.children?.some(\n (child) => this.selectedPaths[child.path],\n )\n : false;\n\n return (\n <div key={facetChild.path} class='searchcraft-facet-list-item'>\n <label class='searchcraft-facet-list-checkbox-label'>\n <div class='searchcraft-facet-list-checkbox-input-wrapper'>\n <input\n class='searchcraft-facet-list-checkbox-input'\n checked={this.selectedPaths[facetChild.path]}\n onChange={(_event: Event) =>\n this.handleCheckboxChange(facetChild.path)\n }\n type='checkbox'\n />\n {isChildSelected ? (\n <div class='searchcraft-facet-list-checkbox-input-dash-icon'>\n <svg width='14' height='3' viewBox='0 0 14 3' fill='none'>\n <title>Checkbox dash</title>\n <line\n x1='1.5'\n y1='1.5'\n x2='12.5'\n y2='1.5'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n />\n </svg>\n </div>\n ) : (\n <div class='searchcraft-facet-list-checkbox-input-check-icon'>\n <svg\n width='16'\n height='16'\n viewBox='0 0 16 16'\n fill='none'\n >\n <title>Checkbox check</title>\n <path\n d='M13.9999 2L5.74988 10L1.99988 6.36364'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n )}\n </div>\n {this.formatLabel(facetChild)}\n </label>\n {facetChild.children && facetChild.children.length > 0 && (\n <div class='searchcraft-facet-child-list'>\n {facetChild.children.map((grandchild) => (\n <label\n key={grandchild.path}\n class='searchcraft-facet-list-checkbox-label searchcraft-facet-child-list-checkbox-label'\n style={{\n display: this.selectedPaths[facetChild.path]\n ? 'flex'\n : 'none',\n }}\n >\n <div class='searchcraft-facet-list-checkbox-input-wrapper searchcraft-facet-child-list-checkbox-input-wrapper'>\n <input\n class='searchcraft-facet-list-checkbox-input searchcraft-facet-child-list-checkbox-input'\n checked={this.selectedPaths[grandchild.path]}\n onChange={(_event: Event) => {\n this.handleCheckboxChange(grandchild.path);\n }}\n type='checkbox'\n />\n <div class='searchcraft-facet-list-checkbox-input-check-icon searchcraft-facet-child-list-checkbox-input-check-icon'>\n <svg\n width='16'\n height='16'\n viewBox='0 0 16 16'\n fill='none'\n >\n <title>Checkbox check</title>\n <path\n d='M13.9999 2L5.74988 10L1.99988 6.36364'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n </div>\n {this.formatSubLabel(grandchild, facetChild)}\n </label>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n}\n"],"version":3}
|