@stapel/search-react 0.3.1 → 0.7.0
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/CHANGELOG.md +180 -0
- package/MODULE.md +43 -4
- package/README.md +1 -1
- package/dist/api/generated/schema.d.ts +5 -1
- package/dist/api/generated/schema.d.ts.map +1 -1
- package/dist/default/DegradationNotice.d.ts +34 -0
- package/dist/default/DegradationNotice.d.ts.map +1 -1
- package/dist/default/DegradationNotice.js +28 -6
- package/dist/default/DegradationNotice.js.map +1 -1
- package/dist/default/FacetPanelPane.d.ts +54 -3
- package/dist/default/FacetPanelPane.d.ts.map +1 -1
- package/dist/default/FacetPanelPane.js +119 -19
- package/dist/default/FacetPanelPane.js.map +1 -1
- package/dist/default/LanguageSelect.d.ts +9 -0
- package/dist/default/LanguageSelect.d.ts.map +1 -0
- package/dist/default/LanguageSelect.js +72 -0
- package/dist/default/LanguageSelect.js.map +1 -0
- package/dist/default/PageSizeSelect.d.ts +29 -0
- package/dist/default/PageSizeSelect.d.ts.map +1 -0
- package/dist/default/PageSizeSelect.js +25 -0
- package/dist/default/PageSizeSelect.js.map +1 -0
- package/dist/default/RangeFilterRow.d.ts +12 -0
- package/dist/default/RangeFilterRow.d.ts.map +1 -0
- package/dist/default/RangeFilterRow.js +75 -0
- package/dist/default/RangeFilterRow.js.map +1 -0
- package/dist/default/RankingDisclosurePane.d.ts +5 -0
- package/dist/default/RankingDisclosurePane.d.ts.map +1 -1
- package/dist/default/RankingDisclosurePane.js +15 -15
- package/dist/default/RankingDisclosurePane.js.map +1 -1
- package/dist/default/SearchBox.d.ts +13 -0
- package/dist/default/SearchBox.d.ts.map +1 -0
- package/dist/default/SearchBox.js +67 -0
- package/dist/default/SearchBox.js.map +1 -0
- package/dist/default/SearchPage.d.ts +58 -16
- package/dist/default/SearchPage.d.ts.map +1 -1
- package/dist/default/SearchPage.js +155 -6
- package/dist/default/SearchPage.js.map +1 -1
- package/dist/default/SearchResultCard.d.ts +19 -18
- package/dist/default/SearchResultCard.d.ts.map +1 -1
- package/dist/default/SearchResultCard.js +178 -5
- package/dist/default/SearchResultCard.js.map +1 -1
- package/dist/default/SearchResultsPane.d.ts +54 -3
- package/dist/default/SearchResultsPane.d.ts.map +1 -1
- package/dist/default/SearchResultsPane.js +45 -25
- package/dist/default/SearchResultsPane.js.map +1 -1
- package/dist/default/SortSelect.d.ts +10 -2
- package/dist/default/SortSelect.d.ts.map +1 -1
- package/dist/default/SortSelect.js +27 -24
- package/dist/default/SortSelect.js.map +1 -1
- package/dist/default/UrlIssueNotice.d.ts.map +1 -1
- package/dist/default/UrlIssueNotice.js +19 -1
- package/dist/default/UrlIssueNotice.js.map +1 -1
- package/dist/default/index.d.ts +33 -16
- package/dist/default/index.d.ts.map +1 -1
- package/dist/default/index.js +26 -12
- package/dist/default/index.js.map +1 -1
- package/dist/default/sortLabels.d.ts +5 -0
- package/dist/default/sortLabels.d.ts.map +1 -0
- package/dist/default/sortLabels.js +32 -0
- package/dist/default/sortLabels.js.map +1 -0
- package/dist/headless/FacetPanel.d.ts +17 -0
- package/dist/headless/FacetPanel.d.ts.map +1 -1
- package/dist/headless/FacetPanel.js +23 -2
- package/dist/headless/FacetPanel.js.map +1 -1
- package/dist/headless/SearchResults.d.ts +20 -3
- package/dist/headless/SearchResults.d.ts.map +1 -1
- package/dist/headless/SearchResults.js +3 -1
- package/dist/headless/SearchResults.js.map +1 -1
- package/dist/headless/useAppliedCount.d.ts +8 -0
- package/dist/headless/useAppliedCount.d.ts.map +1 -0
- package/dist/headless/useAppliedCount.js +30 -0
- package/dist/headless/useAppliedCount.js.map +1 -0
- package/dist/headless/useScorerNames.d.ts +4 -0
- package/dist/headless/useScorerNames.d.ts.map +1 -0
- package/dist/headless/useScorerNames.js +34 -0
- package/dist/headless/useScorerNames.js.map +1 -0
- package/dist/headless/useSearchBox.d.ts +44 -0
- package/dist/headless/useSearchBox.d.ts.map +1 -0
- package/dist/headless/useSearchBox.js +116 -0
- package/dist/headless/useSearchBox.js.map +1 -0
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +32 -4
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/keys.d.ts +46 -2
- package/dist/i18n/keys.d.ts.map +1 -1
- package/dist/i18n/keys.js +86 -6
- package/dist/i18n/keys.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +38 -4
- package/dist/i18n/ru.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/model/queries.d.ts +26 -2
- package/dist/model/queries.d.ts.map +1 -1
- package/dist/model/queries.js +38 -1
- package/dist/model/queries.js.map +1 -1
- package/dist/state/degradations.d.ts +41 -0
- package/dist/state/degradations.d.ts.map +1 -1
- package/dist/state/degradations.js +41 -0
- package/dist/state/degradations.js.map +1 -1
- package/dist/state/limits.d.ts +44 -0
- package/dist/state/limits.d.ts.map +1 -0
- package/dist/state/limits.js +44 -0
- package/dist/state/limits.js.map +1 -0
- package/dist/state/ranges.d.ts +52 -0
- package/dist/state/ranges.d.ts.map +1 -0
- package/dist/state/ranges.js +108 -0
- package/dist/state/ranges.js.map +1 -0
- package/llms.txt +16 -5
- package/manifest.json +245 -22
- package/nav-manifest.json +1 -1
- package/package.json +15 -10
- package/src/analytics/generated/events.json +1 -1
- package/src/api/generated/schema.ts +5 -1
- package/src/default/DegradationNotice.tsx +84 -14
- package/src/default/FacetPanelPane.tsx +343 -64
- package/src/default/LanguageSelect.tsx +93 -0
- package/src/default/PageSizeSelect.tsx +80 -0
- package/src/default/RangeFilterRow.tsx +148 -0
- package/src/default/RankingDisclosurePane.tsx +67 -35
- package/src/default/SearchBox.tsx +130 -0
- package/src/default/SearchPage.tsx +356 -41
- package/src/default/SearchResultCard.tsx +231 -24
- package/src/default/SearchResultsPane.tsx +147 -76
- package/src/default/SortSelect.tsx +50 -37
- package/src/default/UrlIssueNotice.tsx +21 -3
- package/src/default/index.ts +42 -16
- package/src/default/sortLabels.ts +34 -0
- package/src/headless/FacetPanel.tsx +30 -2
- package/src/headless/SearchResults.tsx +32 -4
- package/src/headless/useAppliedCount.ts +41 -0
- package/src/headless/useScorerNames.ts +36 -0
- package/src/headless/useSearchBox.ts +189 -0
- package/src/i18n/es.ts +39 -4
- package/src/i18n/keys.ts +97 -6
- package/src/i18n/ru.ts +45 -4
- package/src/index.ts +30 -3
- package/src/model/queries.ts +51 -1
- package/src/state/degradations.ts +60 -0
- package/src/state/limits.ts +50 -0
- package/src/state/ranges.ts +144 -0
- package/dist/default/ErrorAlert.d.ts +0 -9
- package/dist/default/ErrorAlert.d.ts.map +0 -1
- package/dist/default/ErrorAlert.js +0 -27
- package/dist/default/ErrorAlert.js.map +0 -1
- package/dist/default/theme.d.ts +0 -24
- package/dist/default/theme.d.ts.map +0 -1
- package/dist/default/theme.js +0 -39
- package/dist/default/theme.js.map +0 -1
- package/src/default/ErrorAlert.tsx +0 -46
- package/src/default/theme.tsx +0 -66
|
@@ -1,32 +1,132 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Alert, Button, Checkbox,
|
|
3
|
-
import {
|
|
2
|
+
import { Alert, Button, Checkbox, Divider, Flex, InputNumber, Typography, } from "antd";
|
|
3
|
+
import { SlotPlaceholder, isDevBuild, useT } from "@stapel/core";
|
|
4
|
+
import { EmptyState, ErrorAlert, LoadList, SkinTheme, } from "@stapel/tokens-antd/skin";
|
|
5
|
+
import { spacing } from "@stapel/tokens";
|
|
6
|
+
import { featureName } from "@stapel/attributes-react";
|
|
4
7
|
import { FacetPanel } from "../headless/FacetPanel.js";
|
|
8
|
+
import { useSearchState } from "../headless/SearchStateProvider.js";
|
|
9
|
+
import { buildRangeGroups } from "../state/ranges.js";
|
|
5
10
|
import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
11
|
+
import { LanguageSelect } from "./LanguageSelect.js";
|
|
12
|
+
import { RangeFilterRow } from "./RangeFilterRow.js";
|
|
8
13
|
function OptionRow(props) {
|
|
9
14
|
const t = useT();
|
|
10
15
|
const { option, group } = props;
|
|
11
|
-
return (_jsxs(Flex, { justify: "space-between", align: "center", gap:
|
|
16
|
+
return (_jsxs(Flex, { justify: "space-between", align: "center", gap: spacing[2], children: [_jsx(Checkbox, { checked: option.selected, "data-testid": `facet-option-${group.slug}-${option.value}`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onChange: () => {
|
|
12
17
|
props.onToggle(group.slug, option.value);
|
|
13
|
-
}, children: option.label }), option.count === null ? (_jsx(
|
|
18
|
+
}, children: option.label }), option.count === null ? (_jsx(Typography.Text, { type: "secondary", "data-testid": `facet-count-${group.slug}-${option.value}`, children: t(SEARCH_I18N_KEYS.facetsNotCounted) })) : (_jsx(Typography.Text, { type: "secondary", "data-testid": `facet-count-${group.slug}-${option.value}`, children: option.count }))] }));
|
|
19
|
+
}
|
|
20
|
+
/** The category constraint: the host's control, or the door out of it. */
|
|
21
|
+
function CategoryFilter(props) {
|
|
22
|
+
const t = useT();
|
|
23
|
+
const { state, setCategory } = useSearchState();
|
|
24
|
+
const value = state.category;
|
|
25
|
+
if (props.render !== undefined) {
|
|
26
|
+
return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-category", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.categoryTitle) }), props.render({
|
|
27
|
+
value,
|
|
28
|
+
onChange: (path) => {
|
|
29
|
+
setCategory(path);
|
|
30
|
+
},
|
|
31
|
+
})] }));
|
|
32
|
+
}
|
|
33
|
+
if (value === undefined) {
|
|
34
|
+
return _jsx(SlotPlaceholder, { name: "renderCategoryFilter", "data-testid": "search-category-slot" });
|
|
35
|
+
}
|
|
36
|
+
return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-category", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.categoryTitle) }), _jsx(Typography.Text, { type: "secondary", children: t(SEARCH_I18N_KEYS.categoryCurrent, { path: value }) }), _jsx(Button, { style: { alignSelf: "flex-start" }, "data-testid": "search-category-clear", "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: () => {
|
|
37
|
+
setCategory(null);
|
|
38
|
+
}, children: t(SEARCH_I18N_KEYS.categoryClear) })] }));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The location constraint.
|
|
42
|
+
*
|
|
43
|
+
* SETTING a centre needs a geocoder, which is the deployment's and
|
|
44
|
+
* `geo-react`'s. ADJUSTING one that already exists does not: the radius is a
|
|
45
|
+
* number in the URL, and a link shared with `lat/lon/radius_km` is a link this
|
|
46
|
+
* panel can widen, tighten and clear without knowing what a map is. That is the
|
|
47
|
+
* difference between a slot and a hole.
|
|
48
|
+
*/
|
|
49
|
+
function GeoFilter(props) {
|
|
50
|
+
const t = useT();
|
|
51
|
+
const { state, setGeo } = useSearchState();
|
|
52
|
+
const geo = state.geo;
|
|
53
|
+
const slot = props.render !== undefined
|
|
54
|
+
? props.render({
|
|
55
|
+
value: geo,
|
|
56
|
+
onChange: (next) => {
|
|
57
|
+
setGeo(next);
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
: geo === undefined
|
|
61
|
+
? _jsx(SlotPlaceholder, { name: "renderGeoFilter", "data-testid": "search-geo-slot" })
|
|
62
|
+
: null;
|
|
63
|
+
if (geo === undefined) {
|
|
64
|
+
// An unfilled slot is a NAMED hole in development and nothing at all in a
|
|
65
|
+
// production build — so the heading has to follow the placeholder rather
|
|
66
|
+
// than outlive it. It did not, and the live desktop panel printed
|
|
67
|
+
// "Location" over empty space with no location control under it
|
|
68
|
+
// (class NC-ORPHANFIELD): a label is a promise that a control follows.
|
|
69
|
+
if (props.render === undefined && !isDevBuild())
|
|
70
|
+
return null;
|
|
71
|
+
return slot === null ? null : (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-geo", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.geoTitle) }), slot] }));
|
|
72
|
+
}
|
|
73
|
+
return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": "search-geo", children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.geoTitle) }), slot, _jsx(Typography.Text, { type: "secondary", "data-testid": "search-geo-summary", children: geo.kind === "bbox"
|
|
74
|
+
? t(SEARCH_I18N_KEYS.geoBox)
|
|
75
|
+
: t(SEARCH_I18N_KEYS.geoCenter, {
|
|
76
|
+
lat: geo.lat.toFixed(3),
|
|
77
|
+
lon: geo.lon.toFixed(3),
|
|
78
|
+
}) }), geo.kind === "center" && (_jsxs(Flex, { gap: spacing[2], align: "center", wrap: true, children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.geoRadiusLabel) }), _jsx(InputNumber, { min: 1, value: geo.radiusKm ?? null, "aria-label": t(SEARCH_I18N_KEYS.geoRadiusLabel), "data-testid": "search-geo-radius", onChange: (value) => {
|
|
79
|
+
setGeo({
|
|
80
|
+
kind: "center",
|
|
81
|
+
lat: geo.lat,
|
|
82
|
+
lon: geo.lon,
|
|
83
|
+
...(typeof value === "number" ? { radiusKm: value } : {}),
|
|
84
|
+
});
|
|
85
|
+
} })] })), _jsx(Button, { style: { alignSelf: "flex-start" }, "data-testid": "search-geo-clear", "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: () => {
|
|
86
|
+
setGeo(null);
|
|
87
|
+
}, children: t(SEARCH_I18N_KEYS.geoClear) })] }));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The slugs the server skipped, named the way the panel names everything else.
|
|
91
|
+
*
|
|
92
|
+
* `facet_meta.skipped` is a list of index slugs (`power_w`); the sentence that
|
|
93
|
+
* reports them was printing exactly that, so a shopper read "These filters
|
|
94
|
+
* were not counted for this search: power_w". The category schema is already
|
|
95
|
+
* in this component for the option labels — it names these too. A slug the
|
|
96
|
+
* schema does not know stays as it is, because a made-up name would be worse
|
|
97
|
+
* than an honest identifier.
|
|
98
|
+
*/
|
|
99
|
+
function skippedNames(slugs, features, t) {
|
|
100
|
+
return slugs
|
|
101
|
+
.map((slug) => {
|
|
102
|
+
const feature = features?.find((candidate) => candidate.slug === slug);
|
|
103
|
+
if (feature === undefined)
|
|
104
|
+
return slug;
|
|
105
|
+
const name = t(featureName(feature));
|
|
106
|
+
return name.length > 0 ? name : slug;
|
|
107
|
+
})
|
|
108
|
+
.join(", ");
|
|
14
109
|
}
|
|
15
110
|
export function FacetPanelPane(props) {
|
|
16
111
|
const t = useT();
|
|
17
|
-
const
|
|
18
|
-
|
|
112
|
+
const { state } = useSearchState();
|
|
113
|
+
const ranges = buildRangeGroups({
|
|
114
|
+
state,
|
|
115
|
+
...(props.categoryFeatures !== undefined
|
|
116
|
+
? { categoryFeatures: props.categoryFeatures }
|
|
117
|
+
: {}),
|
|
118
|
+
t,
|
|
119
|
+
});
|
|
120
|
+
return (_jsx(SkinTheme, { ...(props.mode !== undefined ? { mode: props.mode } : {}), children: _jsx(FacetPanel, { ...(props.categoryFeatures !== undefined
|
|
19
121
|
? { categoryFeatures: props.categoryFeatures }
|
|
20
|
-
: {}), ...(props.locale !== undefined ? { locale: props.locale } : {}), ...(props.enabled !== undefined ? { enabled: props.enabled } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
ready: (groups) => (_jsxs(Flex, { vertical: true, gap: 16, children: [groups.map((group) => (_jsxs(Flex, { vertical: true, gap: 4, "data-testid": `facet-group-${group.slug}`, "data-counted": group.counted ? "true" : "false", children: [_jsx(Typography.Text, { strong: true, children: group.label }), group.options.map((option) => (_jsx(OptionRow, { group: group, option: option, onToggle: bag.toggle }, option.value)))] }, group.slug))), _jsx(Typography.Text, { type: "secondary", style: { fontSize: 12 }, children: t(SEARCH_I18N_KEYS.facetsDrillDownHint) })] })),
|
|
30
|
-
})] })) }) }));
|
|
122
|
+
: {}), ...(props.locale !== undefined ? { locale: props.locale } : {}), ...(props.enabled !== undefined ? { enabled: props.enabled } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: spacing[3], "data-testid": "search-facets", children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: spacing[2], children: [props.heading === null ? (_jsx("span", {})) : (_jsx(Typography.Title, { level: 5, style: { margin: 0 }, children: props.heading ?? t(SEARCH_I18N_KEYS.facetsTitle) })), bag.activeFilters > 0 && (_jsx(Button, { onClick: bag.clearAll, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", "data-testid": "facets-clear-all", children: t(SEARCH_I18N_KEYS.facetsClearAll, { count: bag.activeFilters }) }))] }), _jsx(CategoryFilter, { ...(props.renderCategoryFilter !== undefined
|
|
123
|
+
? { render: props.renderCategoryFilter }
|
|
124
|
+
: {}) }), _jsx(LanguageSelect, { ...(props.languages !== undefined ? { languages: props.languages } : {}) }), _jsx(GeoFilter, { ...(props.renderGeoFilter !== undefined
|
|
125
|
+
? { render: props.renderGeoFilter }
|
|
126
|
+
: {}) }), bag.approximate && (_jsx(Alert, { type: "info", showIcon: true, "data-testid": "facets-approximate", title: t(SEARCH_I18N_KEYS.facetsApproximate) })), bag.skipped.length > 0 && (_jsx(Alert, { type: "warning", showIcon: true, "data-testid": "facets-skipped", title: t(SEARCH_I18N_KEYS.facetsSkipped, {
|
|
127
|
+
slugs: skippedNames(bag.skipped, props.categoryFeatures, t),
|
|
128
|
+
}) })), ranges.length > 0 && (_jsx(Flex, { vertical: true, gap: spacing[3], "data-testid": "search-ranges", children: ranges.map((group) => (_jsx(RangeFilterRow, { group: group, onApply: bag.setRange }, group.slug))) })), ranges.length > 0 && _jsx(Divider, { style: { margin: 0 } }), _jsx(LoadList, { state: bag.state, testId: "facets", skeletonRows: 4, empty: _jsx(EmptyState, { compact: true, title: t(SEARCH_I18N_KEYS.facetsEmpty), testId: "facets-empty" }), failed: (error) => (_jsx(ErrorAlert, { testId: "facets-failed", thrown: error, message: t(SEARCH_I18N_KEYS.facetsLoadFailed) })), children: (groups) => (_jsxs(Flex, { vertical: true, gap: spacing[4], children: [groups
|
|
129
|
+
.filter((group) => group.options.length > 0)
|
|
130
|
+
.map((group) => (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": `facet-group-${group.slug}`, "data-counted": group.counted ? "true" : "false", children: [_jsx(Typography.Text, { strong: true, children: group.label }), group.options.map((option) => (_jsx(OptionRow, { group: group, option: option, onToggle: bag.toggle }, option.value)))] }, group.slug))), _jsx(Typography.Text, { type: "secondary", children: t(SEARCH_I18N_KEYS.facetsDrillDownHint) })] })) })] })) }) }));
|
|
31
131
|
}
|
|
32
132
|
//# sourceMappingURL=FacetPanelPane.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FacetPanelPane.js","sourceRoot":"","sources":["../../src/default/FacetPanelPane.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"FacetPanelPane.js","sourceRoot":"","sources":["../../src/default/FacetPanelPane.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
/** Width of the language select — a language name plus room for a long one. */
|
|
3
|
+
export declare const LANGUAGE_SELECT_MIN_WIDTH = 176;
|
|
4
|
+
export interface LanguageSelectProps {
|
|
5
|
+
/** BCP-47 tags the deployment indexes (e.g. `["ru", "en"]`). */
|
|
6
|
+
readonly languages?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function LanguageSelect(props: LanguageSelectProps): ReactElement | null;
|
|
9
|
+
//# sourceMappingURL=LanguageSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageSelect.d.ts","sourceRoot":"","sources":["../../src/default/LanguageSelect.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAO1C,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAgBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAwC9E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The query's LANGUAGE — `lang`, and the reason it is a filter rather than a
|
|
4
|
+
* display preference.
|
|
5
|
+
*
|
|
6
|
+
* `lang` does two things server-side (`query.py`): it picks the ANALYZER (so a
|
|
7
|
+
* Russian word stems as Russian rather than as an unknown token) and it
|
|
8
|
+
* NARROWS the corpus to documents indexed in that language. Getting it wrong therefore changes
|
|
9
|
+
* which results exist, not how they are written — which is why the control
|
|
10
|
+
* lives in the filter panel beside the facets and not in a settings menu.
|
|
11
|
+
*
|
|
12
|
+
* ── Which languages a deployment has is not this pair's fact ───────────────
|
|
13
|
+
*
|
|
14
|
+
* The index's languages come from what has been indexed; there is no endpoint
|
|
15
|
+
* that lists them. So the host names them (`languages`), and the labels come
|
|
16
|
+
* from `Intl.DisplayNames` in the reader's own locale — each language named
|
|
17
|
+
* the way THIS reader would name it — rather than from a translation table this
|
|
18
|
+
* pair would have to carry for every language a deployment might index.
|
|
19
|
+
*
|
|
20
|
+
* With no `languages` prop the control renders only when the URL already
|
|
21
|
+
* carries one, and then only to REMOVE it: a constraint that arrived in a
|
|
22
|
+
* shared link must always have a control that widens it again.
|
|
23
|
+
*/
|
|
24
|
+
import { useMemo } from "react";
|
|
25
|
+
import { Flex, Select, Typography } from "antd";
|
|
26
|
+
import { useOptionalI18n, useT } from "@stapel/core";
|
|
27
|
+
import { spacing } from "@stapel/tokens";
|
|
28
|
+
import { useSearchState } from "../headless/SearchStateProvider.js";
|
|
29
|
+
import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
|
|
30
|
+
/** Width of the language select — a language name plus room for a long one. */
|
|
31
|
+
export const LANGUAGE_SELECT_MIN_WIDTH = 176;
|
|
32
|
+
/**
|
|
33
|
+
* A language tag as a person reads it, in THEIR locale. Falls back to the tag
|
|
34
|
+
* itself where the runtime has no name for it — a tag is at least honest,
|
|
35
|
+
* where a blank option is unclickable.
|
|
36
|
+
*/
|
|
37
|
+
function languageName(tag, locale) {
|
|
38
|
+
try {
|
|
39
|
+
const names = new Intl.DisplayNames([locale], { type: "language" });
|
|
40
|
+
return names.of(tag) ?? tag;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return tag;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function LanguageSelect(props) {
|
|
47
|
+
const t = useT();
|
|
48
|
+
// The reader's locale names the languages. Optional on purpose: every other
|
|
49
|
+
// control in this skin renders outside a provider (English floor) rather
|
|
50
|
+
// than throwing, and a language list is not the place to break that.
|
|
51
|
+
const locale = useOptionalI18n()?.locale ?? "en";
|
|
52
|
+
const { state, setLanguage } = useSearchState();
|
|
53
|
+
const active = state.lang;
|
|
54
|
+
const languages = props.languages;
|
|
55
|
+
const options = useMemo(() => {
|
|
56
|
+
const tags = [...(languages ?? [])];
|
|
57
|
+
if (active !== undefined && !tags.includes(active))
|
|
58
|
+
tags.push(active);
|
|
59
|
+
return [
|
|
60
|
+
{ value: "", label: t(SEARCH_I18N_KEYS.languageAny) },
|
|
61
|
+
...tags.map((tag) => ({ value: tag, label: languageName(tag, locale) })),
|
|
62
|
+
];
|
|
63
|
+
}, [languages, active, locale, t]);
|
|
64
|
+
// Nothing offered and nothing applied: a select with one option ("any") is a
|
|
65
|
+
// control that cannot do anything, which §83 calls a dead control.
|
|
66
|
+
if ((languages ?? []).length === 0 && active === undefined)
|
|
67
|
+
return null;
|
|
68
|
+
return (_jsxs(Flex, { gap: spacing[2], align: "center", wrap: true, children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.languageLabel) }), _jsx(Select, { "data-testid": "search-language", "aria-label": t(SEARCH_I18N_KEYS.languageLabel), style: { minWidth: LANGUAGE_SELECT_MIN_WIDTH }, value: active ?? "", onChange: (next) => {
|
|
69
|
+
setLanguage(next === "" ? null : next);
|
|
70
|
+
}, options: options })] }));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=LanguageSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageSelect.js","sourceRoot":"","sources":["../../src/default/LanguageSelect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How many results a page carries — `limit`, the fifth of the nine state
|
|
3
|
+
* setters that had no control.
|
|
4
|
+
*
|
|
5
|
+
* The offered sizes are the pair's, not the schema's: `docs/schema.json`
|
|
6
|
+
* declares `limit` as a bare integer, and the backend clamps it to
|
|
7
|
+
* `1..MAX_PAGE_SIZE` (100) with `DEFAULT_PAGE_SIZE` 24 when it is absent. So
|
|
8
|
+
* the select offers a short ladder around that default and never sends
|
|
9
|
+
* something the server would have to clamp — a person who lands on a link
|
|
10
|
+
* carrying `limit=37` keeps it (it is offered as its own option) rather than
|
|
11
|
+
* being silently moved to 24, which would change what a shared link shows.
|
|
12
|
+
*
|
|
13
|
+
* A page size is a PREFERENCE, not a step through the results: `setLimit`
|
|
14
|
+
* replaces the history entry rather than pushing one, so Back still undoes the
|
|
15
|
+
* last filter and not the last time somebody widened the page.
|
|
16
|
+
*/
|
|
17
|
+
import type { ReactElement } from "react";
|
|
18
|
+
/** The shipped ladder, around stapel-search's own `DEFAULT_PAGE_SIZE` (24). */
|
|
19
|
+
export declare const SEARCH_PAGE_SIZES: readonly number[];
|
|
20
|
+
/** Width of the size select — the widest option plus its caption. */
|
|
21
|
+
export declare const PAGE_SIZE_SELECT_MIN_WIDTH = 148;
|
|
22
|
+
export interface PageSizeSelectProps {
|
|
23
|
+
/** Override the offered ladder (a deployment with its own `MAX_PAGE_SIZE`). */
|
|
24
|
+
readonly sizes?: readonly number[];
|
|
25
|
+
/** What the server uses when the URL names none. Default 24. */
|
|
26
|
+
readonly defaultSize?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function PageSizeSelect(props: PageSizeSelectProps): ReactElement;
|
|
29
|
+
//# sourceMappingURL=PageSizeSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageSizeSelect.d.ts","sourceRoot":"","sources":["../../src/default/PageSizeSelect.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAO1C,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAqB,CAAC;AAErE,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CA2CvE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex, Select, Typography } from "antd";
|
|
3
|
+
import { useT } from "@stapel/core";
|
|
4
|
+
import { fontSize, spacing } from "@stapel/tokens";
|
|
5
|
+
import { useSearchState } from "../headless/SearchStateProvider.js";
|
|
6
|
+
import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
|
|
7
|
+
/** The shipped ladder, around stapel-search's own `DEFAULT_PAGE_SIZE` (24). */
|
|
8
|
+
export const SEARCH_PAGE_SIZES = [12, 24, 48, 96];
|
|
9
|
+
/** Width of the size select — the widest option plus its caption. */
|
|
10
|
+
export const PAGE_SIZE_SELECT_MIN_WIDTH = 148;
|
|
11
|
+
export function PageSizeSelect(props) {
|
|
12
|
+
const t = useT();
|
|
13
|
+
const { state, setLimit } = useSearchState();
|
|
14
|
+
const ladder = props.sizes ?? SEARCH_PAGE_SIZES;
|
|
15
|
+
const active = state.limit ?? props.defaultSize ?? 24;
|
|
16
|
+
const offLadder = !ladder.includes(active);
|
|
17
|
+
const values = offLadder ? [...ladder, active].sort((a, b) => a - b) : ladder;
|
|
18
|
+
return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-off-ladder": offLadder ? "true" : "false", children: [_jsxs(Flex, { gap: spacing[2], align: "center", children: [_jsx(Typography.Text, { type: "secondary", "aria-hidden": "true", children: t(SEARCH_I18N_KEYS.limitLabel) }), _jsx(Select, { "data-testid": "search-limit", "aria-label": t(SEARCH_I18N_KEYS.limitLabel), style: { minWidth: PAGE_SIZE_SELECT_MIN_WIDTH }, value: active, onChange: (next) => {
|
|
19
|
+
setLimit(next);
|
|
20
|
+
}, options: values.map((size) => ({
|
|
21
|
+
value: size,
|
|
22
|
+
label: t(SEARCH_I18N_KEYS.limitOption, { count: size }),
|
|
23
|
+
})) })] }), offLadder && (_jsx(Typography.Text, { type: "secondary", style: { fontSize: fontSize.xs.fontSize }, "data-testid": "search-limit-from-link", children: t(SEARCH_I18N_KEYS.limitFromLink) }))] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=PageSizeSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageSizeSelect.js","sourceRoot":"","sources":["../../src/default/PageSizeSelect.tsx"],"names":[],"mappings":";AAiBA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAErE,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAS9C,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,iBAAiB,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9E,OAAO,CACL,MAAC,IAAI,IAAC,QAAQ,QAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAmB,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,aAC3E,MAAC,IAAI,IAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAC,QAAQ,aACnC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,iBAAa,MAAM,YACjD,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,GACf,EAClB,KAAC,MAAM,mBACO,cAAc,gBACd,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAC1C,KAAK,EAAE,EAAE,QAAQ,EAAE,0BAA0B,EAAE,EAC/C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;4BACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACjB,CAAC,EACD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BAC7B,KAAK,EAAE,IAAI;4BACX,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;yBACxD,CAAC,CAAC,GACH,IACG,EAKN,SAAS,IAAI,CACZ,KAAC,UAAU,CAAC,IAAI,IACd,IAAI,EAAC,WAAW,EAChB,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAC7B,wBAAwB,YAEnC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAClB,CACnB,IACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { SearchRange } from "../api/types.js";
|
|
3
|
+
import type { RangeGroup } from "../state/ranges.js";
|
|
4
|
+
/** Floor width of one bound field, so two of them fit a 390px phone row. */
|
|
5
|
+
export declare const RANGE_FIELD_MIN_WIDTH = 96;
|
|
6
|
+
export interface RangeFilterRowProps {
|
|
7
|
+
readonly group: RangeGroup;
|
|
8
|
+
/** `null` clears the slug's range entirely. */
|
|
9
|
+
readonly onApply: (slug: string, range: SearchRange | null) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function RangeFilterRow(props: RangeFilterRowProps): ReactElement;
|
|
12
|
+
//# sourceMappingURL=RangeFilterRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeFilterRow.d.ts","sourceRoot":"","sources":["../../src/default/RangeFilterRow.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CACrE;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CAyGvE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* One numeric range row — "Price: from ___ to ___".
|
|
4
|
+
*
|
|
5
|
+
* The pair could encode `r.price=100..500`, round-trip it through the URL and
|
|
6
|
+
* send it, and had no control that produced one. A marketplace without a price
|
|
7
|
+
* range filter is not a marketplace (audit S-2), and this is the row that fixes
|
|
8
|
+
* it; `state/ranges.ts` decides which rows exist.
|
|
9
|
+
*
|
|
10
|
+
* ── Why it is applied by a button and not by typing ───────────────────────
|
|
11
|
+
*
|
|
12
|
+
* A facet checkbox commits on click because a click is a finished thought. A
|
|
13
|
+
* range is TWO fields, and committing each keystroke would run a search for
|
|
14
|
+
* `1`, `10`, `100` on the way to `1000` — three wrong result pages, three
|
|
15
|
+
* history entries' worth of churn, and a facet panel that reshuffles under the
|
|
16
|
+
* hand still typing. So the row holds a draft and commits on Apply (or Enter),
|
|
17
|
+
* which is also what makes "from > to" refusable instead of merely empty.
|
|
18
|
+
*/
|
|
19
|
+
import { useRef, useState } from "react";
|
|
20
|
+
import { Button, Flex, InputNumber, Typography } from "antd";
|
|
21
|
+
import { actionAvailable, actionBlocked, useT } from "@stapel/core";
|
|
22
|
+
import { GatedButton } from "@stapel/tokens-antd/skin";
|
|
23
|
+
import { spacing } from "@stapel/tokens";
|
|
24
|
+
import { isRangeUsable } from "../state/ranges.js";
|
|
25
|
+
import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
|
|
26
|
+
/** Floor width of one bound field, so two of them fit a 390px phone row. */
|
|
27
|
+
export const RANGE_FIELD_MIN_WIDTH = 96;
|
|
28
|
+
function toDraft(value) {
|
|
29
|
+
return value ?? "";
|
|
30
|
+
}
|
|
31
|
+
export function RangeFilterRow(props) {
|
|
32
|
+
const t = useT();
|
|
33
|
+
const { group } = props;
|
|
34
|
+
const [from, setFrom] = useState(toDraft(group.from));
|
|
35
|
+
const [to, setTo] = useState(toDraft(group.to));
|
|
36
|
+
// The URL is still the state: when it moves on its own — Back, a shared
|
|
37
|
+
// link, "clear all" — the draft follows it rather than keeping a number the
|
|
38
|
+
// results are no longer about.
|
|
39
|
+
const applied = useRef(`${toDraft(group.from)}..${toDraft(group.to)}`);
|
|
40
|
+
const current = `${toDraft(group.from)}..${toDraft(group.to)}`;
|
|
41
|
+
if (applied.current !== current) {
|
|
42
|
+
applied.current = current;
|
|
43
|
+
if (from !== toDraft(group.from))
|
|
44
|
+
setFrom(toDraft(group.from));
|
|
45
|
+
if (to !== toDraft(group.to))
|
|
46
|
+
setTo(toDraft(group.to));
|
|
47
|
+
}
|
|
48
|
+
const draft = {
|
|
49
|
+
...(from !== "" ? { from } : {}),
|
|
50
|
+
...(to !== "" ? { to } : {}),
|
|
51
|
+
};
|
|
52
|
+
const usable = isRangeUsable(draft);
|
|
53
|
+
const empty = from === "" && to === "";
|
|
54
|
+
const apply = usable
|
|
55
|
+
? actionAvailable()
|
|
56
|
+
: actionBlocked(SEARCH_I18N_KEYS.facetsRangeInvalid);
|
|
57
|
+
const commit = () => {
|
|
58
|
+
if (!usable)
|
|
59
|
+
return;
|
|
60
|
+
props.onApply(group.slug, empty ? null : draft);
|
|
61
|
+
};
|
|
62
|
+
const unit = group.unit === undefined ? "" : ` ${group.unit}`;
|
|
63
|
+
return (_jsxs(Flex, { vertical: true, gap: spacing[1], "data-testid": `facet-range-${group.slug}`, "data-active": group.active ? "true" : "false", children: [_jsx(Typography.Text, { strong: true, children: group.label }), _jsxs(Flex, { gap: spacing[2], align: "center", wrap: true, children: [_jsx(InputNumber, { value: from === "" ? null : Number(from), placeholder: t(SEARCH_I18N_KEYS.facetsRangeFrom), "aria-label": `${t(SEARCH_I18N_KEYS.facetsRangeFromAria, {
|
|
64
|
+
feature: group.label,
|
|
65
|
+
})}${unit}`, "data-testid": `facet-range-${group.slug}-from`, style: { minWidth: RANGE_FIELD_MIN_WIDTH }, ...(group.min !== undefined ? { min: group.min } : {}), ...(group.max !== undefined ? { max: group.max } : {}), ...(group.step !== undefined ? { step: group.step } : {}), onChange: (value) => {
|
|
66
|
+
setFrom(value === null || value === undefined ? "" : String(value));
|
|
67
|
+
}, onPressEnter: commit }), _jsx(InputNumber, { value: to === "" ? null : Number(to), placeholder: t(SEARCH_I18N_KEYS.facetsRangeTo), "aria-label": `${t(SEARCH_I18N_KEYS.facetsRangeToAria, {
|
|
68
|
+
feature: group.label,
|
|
69
|
+
})}${unit}`, "data-testid": `facet-range-${group.slug}-to`, style: { minWidth: RANGE_FIELD_MIN_WIDTH }, ...(group.min !== undefined ? { min: group.min } : {}), ...(group.max !== undefined ? { max: group.max } : {}), ...(group.step !== undefined ? { step: group.step } : {}), onChange: (value) => {
|
|
70
|
+
setTo(value === null || value === undefined ? "" : String(value));
|
|
71
|
+
}, onPressEnter: commit }), _jsx(GatedButton, { gate: apply, type: usable && !empty ? "primary" : "default", testId: `facet-range-${group.slug}-apply`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: commit, children: t(SEARCH_I18N_KEYS.facetsRangeApply) }), group.active && (_jsx(Button, { "data-testid": `facet-range-${group.slug}-clear`, "data-analytics": "none", "data-analytics-reason": "a filter is a read, not a flow step", onClick: () => {
|
|
72
|
+
props.onApply(group.slug, null);
|
|
73
|
+
}, children: t(SEARCH_I18N_KEYS.facetsRangeClear) }))] })] }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=RangeFilterRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeFilterRow.js","sourceRoot":"","sources":["../../src/default/RangeFilterRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -13,5 +13,10 @@ export interface RankingDisclosurePaneProps extends ThemeModeProp {
|
|
|
13
13
|
/** Doc type to disclose; omitted asks for the deployment's default. */
|
|
14
14
|
readonly type?: string;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* The widest a disclosure column may grow. A statutory text is a READING
|
|
18
|
+
* surface: past this it stops being a paragraph and becomes a banner.
|
|
19
|
+
*/
|
|
20
|
+
export declare const RANKING_MAX_WIDTH = 720;
|
|
16
21
|
export declare function RankingDisclosurePane(props: RankingDisclosurePaneProps): ReactElement;
|
|
17
22
|
//# sourceMappingURL=RankingDisclosurePane.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RankingDisclosurePane.d.ts","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RankingDisclosurePane.d.ts","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAc1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,YAAY,CA6Gd"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Flex, List, Tag, Typography } from "antd";
|
|
3
|
+
import { useFormat, useT } from "@stapel/core";
|
|
4
|
+
import { EmptyState, ErrorAlert, LoadList, SkinTheme, } from "@stapel/tokens-antd/skin";
|
|
5
|
+
import { fontSize, spacing } from "@stapel/tokens";
|
|
4
6
|
import { RankingDisclosure } from "../headless/RankingDisclosure.js";
|
|
5
7
|
import { SEARCH_I18N_KEYS } from "../i18n/keys.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
+
import { sortLabel } from "./sortLabels.js";
|
|
9
|
+
/**
|
|
10
|
+
* The widest a disclosure column may grow. A statutory text is a READING
|
|
11
|
+
* surface: past this it stops being a paragraph and becomes a banner.
|
|
12
|
+
*/
|
|
13
|
+
export const RANKING_MAX_WIDTH = 720;
|
|
8
14
|
export function RankingDisclosurePane(props) {
|
|
9
15
|
const t = useT();
|
|
10
|
-
const
|
|
11
|
-
return (_jsx(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
...describe(toFlowError(error)),
|
|
15
|
-
message: t(SEARCH_I18N_KEYS.rankingLoadFailed),
|
|
16
|
-
} })),
|
|
17
|
-
empty: () => (_jsx(Empty, { "data-testid": "ranking-empty", description: t(SEARCH_I18N_KEYS.rankingEmpty) })),
|
|
18
|
-
ready: (scorers) => (_jsx(List, { "data-testid": "ranking-list", dataSource: [...scorers], renderItem: (scorer) => (_jsx(List.Item, { "data-scorer": scorer.slug, children: _jsxs(Flex, { vertical: true, gap: 2, style: { width: "100%" }, children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: 8, children: [_jsx(Typography.Text, { strong: true, children: t(scorer.description_key) }), _jsx(Tag, { children: scorer.weight })] }), _jsx(Typography.Text, { type: "secondary", children: scorer.description }), _jsxs(Typography.Text, { type: "secondary", style: { fontSize: 12 }, children: [t(SEARCH_I18N_KEYS.rankingAppliesTo), ": ", scorer.applies_to_sorts.join(", ")] }), !scorer.active && (_jsx(Typography.Text, { type: "warning", "data-testid": "ranking-inactive", children: t(SEARCH_I18N_KEYS.rankingInactive, {
|
|
16
|
+
const format = useFormat();
|
|
17
|
+
return (_jsx(SkinTheme, { surface: "base", ...(props.mode !== undefined ? { mode: props.mode } : {}), style: { width: "100%", maxWidth: RANKING_MAX_WIDTH }, children: _jsx(RankingDisclosure, { ...(props.type !== undefined ? { type: props.type } : {}), children: (bag) => (_jsxs(Flex, { vertical: true, gap: spacing[3], "data-testid": "search-ranking", children: [_jsx(Typography.Title, { level: 4, style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.rankingTitle) }), _jsx(Typography.Paragraph, { type: "secondary", style: { margin: 0 }, children: t(SEARCH_I18N_KEYS.rankingIntro) }), _jsx(LoadList, { state: bag.state, testId: "ranking", skeletonRows: 4, onRetry: bag.refetch, empty: _jsx(EmptyState, { compact: true, title: t(SEARCH_I18N_KEYS.rankingEmpty), testId: "ranking-empty" }), failed: (error) => (_jsx(ErrorAlert, { testId: "ranking-failed", thrown: error, message: t(SEARCH_I18N_KEYS.rankingLoadFailed), onRetry: bag.refetch })), children: (scorers) => (_jsx(List, { "data-testid": "ranking-list", dataSource: [...scorers], renderItem: (scorer) => (_jsx(List.Item, { "data-scorer": scorer.slug, children: _jsxs(Flex, { vertical: true, gap: spacing[1], style: { width: "100%" }, children: [_jsxs(Flex, { justify: "space-between", align: "center", gap: spacing[2], children: [_jsx(Typography.Text, { strong: true, children: t(scorer.description_key) }), _jsxs(Tag, { children: [t(SEARCH_I18N_KEYS.rankingWeight), " ", format.number(scorer.weight) ?? scorer.weight] })] }), _jsx(Typography.Text, { type: "secondary", children: scorer.description }), _jsxs(Typography.Text, { type: "secondary", style: { fontSize: fontSize.xs.fontSize }, children: [t(SEARCH_I18N_KEYS.rankingAppliesTo), ": ", scorer.applies_to_sorts
|
|
18
|
+
.map((sort) => sortLabel(t, sort))
|
|
19
|
+
.join(", ")] }), !scorer.active && (_jsx(Typography.Text, { type: "warning", "data-testid": "ranking-inactive", children: t(SEARCH_I18N_KEYS.rankingInactive, {
|
|
19
20
|
reason: scorer.inactive_reason,
|
|
20
|
-
}) }))] }) }, scorer.slug)) })),
|
|
21
|
-
}), bag.notes.length > 0 && (_jsxs(Flex, { vertical: true, gap: 2, children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.rankingNotes) }), bag.notes.map((note) => (_jsx(Typography.Text, { type: "secondary", children: note }, note)))] }))] })) }) }));
|
|
21
|
+
}) }))] }) }, scorer.slug)) })) }), bag.notes.length > 0 && (_jsxs(Flex, { vertical: true, gap: spacing[1], children: [_jsx(Typography.Text, { strong: true, children: t(SEARCH_I18N_KEYS.rankingNotes) }), bag.notes.map((note) => (_jsx(Typography.Text, { type: "secondary", children: note }, note)))] }))] })) }) }));
|
|
22
22
|
}
|
|
23
23
|
//# sourceMappingURL=RankingDisclosurePane.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RankingDisclosurePane.js","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":";AAUA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"RankingDisclosurePane.js","sourceRoot":"","sources":["../../src/default/RankingDisclosurePane.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { UseSearchBoxOptions } from "../headless/useSearchBox.js";
|
|
3
|
+
import type { ThemeModeProp } from "./types.js";
|
|
4
|
+
export interface SearchBoxProps extends ThemeModeProp, UseSearchBoxOptions {
|
|
5
|
+
/** Override the placeholder — a category page says what it searches. */
|
|
6
|
+
readonly placeholder?: string;
|
|
7
|
+
/** Render the submit button beside the field. Default `true`: on a phone
|
|
8
|
+
* keyboard "search" is not always offered, and a visible button is. */
|
|
9
|
+
readonly submitButton?: boolean;
|
|
10
|
+
readonly autoFocus?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function SearchBox(props: SearchBoxProps): ReactElement;
|
|
13
|
+
//# sourceMappingURL=SearchBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchBox.d.ts","sourceRoot":"","sources":["../../src/default/SearchBox.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,cAAe,SAAQ,aAAa,EAAE,mBAAmB;IACxE,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;2EACuE;IACvE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAgF7D"}
|