@fluid-topics/ft-search-context 1.3.15 → 1.3.17

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.
@@ -24,7 +24,9 @@ export declare class FtSearchStateManager {
24
24
  forceContentLocale(contentLocale?: string): void;
25
25
  setPageSize(pageSize: number): void;
26
26
  setPageNumber(pageNumber: number): void;
27
+ get sortOptions(): import("@fluid-topics/public-api").FtSearchSortOption[];
27
28
  setSort(sort: FtSearchSortCriterion[]): void;
29
+ setSortId(sortId?: string): string | undefined;
28
30
  setFilters(filters: FtMetadataFilter[]): void;
29
31
  setClusterSortCriterion(criterions: FtPublicClusterSortCriterion[]): void;
30
32
  setSearchInDocumentTitlesOnly(searchInDocumentTitleOnly: boolean): void;
@@ -27,7 +27,7 @@ export class FtSearchStateManager {
27
27
  this.buildSearchRequest = (state) => {
28
28
  return {
29
29
  ...state.request,
30
- facets: this.facetIds.map(id => ({ id })),
30
+ facets: this.facetIds.map((id) => ({ id })),
31
31
  };
32
32
  };
33
33
  this.suggestDebouncer = new Debouncer(300);
@@ -35,10 +35,12 @@ export class FtSearchStateManager {
35
35
  return this.suggestDebouncer.run(() => this.fetchSuggestData(request !== null && request !== void 0 ? request : this.buildSuggestRequest(this.store.getState())));
36
36
  };
37
37
  this.buildSuggestRequest = (state) => {
38
+ var _a;
38
39
  return {
39
40
  input: state.liveQuery,
40
41
  metadataFilters: state.request.metadataFilters,
41
- sort: state.request.sort,
42
+ sort: (_a = state.request.sort) !== null && _a !== void 0 ? _a : [],
43
+ sortId: state.request.sortId,
42
44
  contentLocale: state.request.contentLocale,
43
45
  scope: state.request.scope,
44
46
  };
@@ -54,6 +56,7 @@ export class FtSearchStateManager {
54
56
  }
55
57
  async initService() {
56
58
  this.updateLocales();
59
+ this.service.getConfiguration().then((conf) => this.store.actions.configuration(conf));
57
60
  return this.launchSearch();
58
61
  }
59
62
  setQuery(query) {
@@ -63,11 +66,11 @@ export class FtSearchStateManager {
63
66
  }
64
67
  setContentLocale(contentLocale) {
65
68
  var _a;
66
- let locales = (_a = this.store.getState().locales) !== null && _a !== void 0 ? _a : [];
67
- let previousContentLocale = this.store.getState().request.contentLocale;
69
+ const locales = (_a = this.store.getState().locales) !== null && _a !== void 0 ? _a : [];
70
+ const previousContentLocale = this.store.getState().request.contentLocale;
68
71
  if (contentLocale != previousContentLocale) {
69
72
  if (locales.length > 0) {
70
- const isKnown = (locale) => locales.some(l => l.lang == locale);
73
+ const isKnown = (locale) => locales.some((l) => l.lang == locale);
71
74
  if (!isKnown(contentLocale)) {
72
75
  contentLocale = isKnown(previousContentLocale) ? previousContentLocale : locales[0].lang;
73
76
  }
@@ -87,12 +90,27 @@ export class FtSearchStateManager {
87
90
  setPageNumber(pageNumber) {
88
91
  this.store.actions.setPageNumber(pageNumber);
89
92
  }
93
+ get sortOptions() {
94
+ var _a, _b;
95
+ return (_b = (_a = this.store.getState().configuration) === null || _a === void 0 ? void 0 : _a.sortOptions) !== null && _b !== void 0 ? _b : [];
96
+ }
90
97
  setSort(sort) {
91
98
  this.store.actions.setRequestSort(sort);
92
99
  this.store.actions.setPageNumber(1);
93
100
  }
101
+ setSortId(sortId) {
102
+ var _a;
103
+ this.store.actions.setPageNumber(1);
104
+ if (sortId == undefined || this.sortOptions.length == 0) {
105
+ this.store.actions.setRequestSortId(sortId);
106
+ return sortId;
107
+ }
108
+ const selectedSort = (_a = this.sortOptions.find((option) => option.id == sortId)) !== null && _a !== void 0 ? _a : this.sortOptions[0];
109
+ this.store.actions.setRequestSortId(selectedSort.id);
110
+ return selectedSort.id;
111
+ }
94
112
  setFilters(filters) {
95
- const cleanFilters = filters.filter(f => !f.valueFilter || f.valueFilter.values.length > 0);
113
+ const cleanFilters = filters.filter((f) => !f.valueFilter || f.valueFilter.values.length > 0);
96
114
  this.store.actions.setRequestFilters(cleanFilters);
97
115
  this.store.actions.setPageNumber(1);
98
116
  }
@@ -124,7 +142,7 @@ export class FtSearchStateManager {
124
142
  this.facetIds = [...this.facetIds, id];
125
143
  }
126
144
  replaceFacet(oldId, newId) {
127
- let facetIds = this.facetIds.filter(id => id != oldId);
145
+ const facetIds = this.facetIds.filter((id) => id != oldId);
128
146
  if (newId) {
129
147
  facetIds.push(newId);
130
148
  }
@@ -135,14 +153,14 @@ export class FtSearchStateManager {
135
153
  const request = this.store.getState().request;
136
154
  return [
137
155
  ...new Set([
138
- ...request.facets.map(f => f.id),
139
- ...((_a = request.metadataFilters) !== null && _a !== void 0 ? _a : []).map(f => f.key),
140
- ])
156
+ ...request.facets.map((f) => f.id),
157
+ ...((_a = request.metadataFilters) !== null && _a !== void 0 ? _a : []).map((f) => f.key),
158
+ ]),
141
159
  ];
142
160
  }
143
161
  set facetIds(ids) {
144
- let uniqIds = [...new Set(ids)];
145
- let facetsConf = uniqIds.map(id => ({ id: id }));
162
+ const uniqIds = [...new Set(ids)];
163
+ const facetsConf = uniqIds.map((id) => ({ id: id }));
146
164
  this.store.actions.setRequestFacets(facetsConf);
147
165
  }
148
166
  /** @deprecated */
@@ -150,65 +168,65 @@ export class FtSearchStateManager {
150
168
  this.setValueFilter(key, values);
151
169
  }
152
170
  setValueFilter(key, values) {
153
- let existingFilters = this.store.getState().request.metadataFilters;
154
- let newFilter = {
171
+ const existingFilters = this.store.getState().request.metadataFilters;
172
+ const newFilter = {
155
173
  key: key,
156
174
  valueFilter: {
157
175
  values: values,
158
176
  negative: false,
159
177
  },
160
178
  };
161
- let filters = [
162
- ...existingFilters.filter(f => !f.valueFilter),
163
- ...existingFilters.filter(f => f.valueFilter && f.key !== newFilter.key),
164
- newFilter
179
+ const filters = [
180
+ ...existingFilters.filter((f) => !f.valueFilter),
181
+ ...existingFilters.filter((f) => f.valueFilter && f.key !== newFilter.key),
182
+ newFilter,
165
183
  ];
166
184
  this.setFilters(filters);
167
185
  }
168
186
  setDateFilter(key, dateType) {
169
- let existingFilters = this.store.getState().request.metadataFilters;
170
- let newFilter = {
187
+ const existingFilters = this.store.getState().request.metadataFilters;
188
+ const newFilter = {
171
189
  key: key,
172
190
  dateFilter: {
173
- type: dateType
191
+ type: dateType,
174
192
  },
175
193
  };
176
- let filters = [
177
- ...existingFilters.filter(f => !f.dateFilter),
178
- ...existingFilters.filter(f => f.dateFilter && f.key !== newFilter.key),
179
- newFilter
194
+ const filters = [
195
+ ...existingFilters.filter((f) => !f.dateFilter),
196
+ ...existingFilters.filter((f) => f.dateFilter && f.key !== newFilter.key),
197
+ newFilter,
180
198
  ];
181
199
  this.setFilters(filters);
182
200
  }
183
201
  removeDateFilter(key) {
184
- let existingFilters = this.store.getState().request.metadataFilters;
202
+ const existingFilters = this.store.getState().request.metadataFilters;
185
203
  const filters = [
186
- ...existingFilters.filter(f => !f.dateFilter),
187
- ...existingFilters.filter(f => f.dateFilter && f.key !== key),
204
+ ...existingFilters.filter((f) => !f.dateFilter),
205
+ ...existingFilters.filter((f) => f.dateFilter && f.key !== key),
188
206
  ];
189
207
  this.setFilters(filters);
190
208
  }
191
209
  setRangeFilter(key, from, to) {
192
- let existingFilters = this.store.getState().request.metadataFilters;
193
- let newFilter = {
210
+ const existingFilters = this.store.getState().request.metadataFilters;
211
+ const newFilter = {
194
212
  key: key,
195
213
  rangeFilter: {
196
214
  from: from,
197
- to: to
215
+ to: to,
198
216
  },
199
217
  };
200
- let filters = [
201
- ...existingFilters.filter(f => !f.rangeFilter),
202
- ...existingFilters.filter(f => f.rangeFilter && f.key !== newFilter.key),
203
- newFilter
218
+ const filters = [
219
+ ...existingFilters.filter((f) => !f.rangeFilter),
220
+ ...existingFilters.filter((f) => f.rangeFilter && f.key !== newFilter.key),
221
+ newFilter,
204
222
  ];
205
223
  this.setFilters(filters);
206
224
  }
207
225
  removeRangeFilter(key) {
208
- let existingFilters = this.store.getState().request.metadataFilters;
226
+ const existingFilters = this.store.getState().request.metadataFilters;
209
227
  const filters = [
210
- ...existingFilters.filter(f => !f.rangeFilter),
211
- ...existingFilters.filter(f => f.rangeFilter && f.key !== key),
228
+ ...existingFilters.filter((f) => !f.rangeFilter),
229
+ ...existingFilters.filter((f) => f.rangeFilter && f.key !== key),
212
230
  ];
213
231
  this.setFilters(filters);
214
232
  }
@@ -218,7 +236,7 @@ export class FtSearchStateManager {
218
236
  setRequest(request) {
219
237
  this.store.actions.setRequest({
220
238
  ...request,
221
- facets: this.store.getState().request.facets
239
+ facets: this.store.getState().request.facets,
222
240
  });
223
241
  this.store.actions.liveQuery(request.query);
224
242
  this.store.actions.setPageNumber(1);
@@ -245,19 +263,21 @@ export class FtSearchStateManager {
245
263
  this.store.actions.paging(undefined);
246
264
  if (this.ignoreEmptyQuery && request.query.length == 0) {
247
265
  this.store.actions.results(undefined);
266
+ this.store.actions.announcements(undefined);
248
267
  this.store.actions.facets(undefined);
249
268
  this.store.actions.spellcheck(undefined);
250
269
  }
251
270
  else {
252
271
  this.cancelableSearch = cancelable(this.service.launchSearch(request));
253
272
  const results = await this.cancelableSearch;
273
+ this.store.actions.announcements(results.announcements);
254
274
  if (results.paging.currentPage <= 1) {
255
275
  this.store.actions.results(results.results);
256
276
  this.store.actions.facets(results.facets);
257
277
  this.store.actions.spellcheck(results.spellcheck);
258
278
  }
259
279
  else {
260
- let newResults = ((_b = this.store.getState().results) !== null && _b !== void 0 ? _b : []).concat(results.results);
280
+ const newResults = ((_b = this.store.getState().results) !== null && _b !== void 0 ? _b : []).concat(results.results);
261
281
  this.store.actions.results(newResults);
262
282
  // Focus on first new result
263
283
  this.store.commands.clear(/^focus-result-/);
@@ -278,7 +298,7 @@ export class FtSearchStateManager {
278
298
  try {
279
299
  (_a = this.cancelableSuggest) === null || _a === void 0 ? void 0 : _a.cancel();
280
300
  this.cancelableSuggest = cancelable(this.service.launchSuggest(request));
281
- let results = await this.cancelableSuggest;
301
+ const results = await this.cancelableSuggest;
282
302
  this.store.actions.suggestResults(results.suggestions);
283
303
  }
284
304
  catch (e) {
@@ -293,6 +313,7 @@ export class FtSearchStateManager {
293
313
  clearResults() {
294
314
  this.store.actions.paging(undefined);
295
315
  this.store.actions.results(undefined);
316
+ this.store.actions.announcements(undefined);
296
317
  this.store.actions.facets(undefined);
297
318
  this.store.actions.spellcheck(undefined);
298
319
  }
@@ -1,9 +1,11 @@
1
- import { FtSearchFacet, FtSearchLocale, FtSearchResultCluster, FtSearchResultsPageInfo, FtSpellcheck, FtSuggestResult } from "@fluid-topics/public-api";
1
+ import { FtSearchConfiguration, FtSearchFacet, FtSearchLocale, FtSearchResultAnnouncement, FtSearchResultCluster, FtSearchResultsPageInfo, FtSpellcheck, FtSuggestResult } from "@fluid-topics/public-api";
2
2
  import { EnrichedFtSearchRequest } from "@fluid-topics/ft-wc-utils";
3
3
  export interface FtSearchPageState {
4
+ configuration: FtSearchConfiguration | undefined;
4
5
  locales: Array<FtSearchLocale> | undefined;
5
6
  request: EnrichedFtSearchRequest;
6
7
  results: Array<FtSearchResultCluster> | undefined;
8
+ announcements: Array<FtSearchResultAnnouncement> | undefined;
7
9
  facets: Array<FtSearchFacet> | undefined;
8
10
  paging: FtSearchResultsPageInfo | undefined;
9
11
  spellcheck: FtSpellcheck | undefined;
@@ -8,6 +8,7 @@ declare const searchPageStateReducers: {
8
8
  setPageSize: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["paging"]["perPage"]>) => void;
9
9
  setPageNumber: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["paging"]["page"]>) => void;
10
10
  setRequestSort: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["sort"]>) => void;
11
+ setRequestSortId: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["sortId"]>) => void;
11
12
  setRequestFilters: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["metadataFilters"]>) => void;
12
13
  setRequestFacets: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["facets"]>) => void;
13
14
  setRequestVirtualField: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["virtualField"]>) => void;
@@ -23,6 +24,7 @@ export declare const createSearchPageStore: (id: string) => FtReduxStore<FtSearc
23
24
  setPageSize: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["paging"]["perPage"]>) => void;
24
25
  setPageNumber: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["paging"]["page"]>) => void;
25
26
  setRequestSort: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["sort"]>) => void;
27
+ setRequestSortId: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["sortId"]>) => void;
26
28
  setRequestFilters: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["metadataFilters"]>) => void;
27
29
  setRequestFacets: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["facets"]>) => void;
28
30
  setRequestVirtualField: (state: FtSearchPageState, action: PayloadAction<FtSearchPageState["request"]["virtualField"]>) => void;
@@ -20,6 +20,9 @@ const searchPageStateReducers = {
20
20
  setRequestSort: (state, action) => {
21
21
  state.request.sort = action.payload;
22
22
  },
23
+ setRequestSortId: (state, action) => {
24
+ state.request.sortId = action.payload;
25
+ },
23
26
  setRequestFilters: (state, action) => {
24
27
  state.request.metadataFilters = action.payload;
25
28
  },
@@ -49,6 +52,7 @@ export const createSearchPageStore = (id) => FtReduxStore.get({
49
52
  metadataFilters: [],
50
53
  facets: [],
51
54
  sort: [],
55
+ sortId: undefined,
52
56
  paging: {
53
57
  page: 1,
54
58
  perPage: 20,
@@ -60,7 +64,9 @@ export const createSearchPageStore = (id) => FtReduxStore.get({
60
64
  spellcheck: undefined,
61
65
  locales: [],
62
66
  results: undefined,
63
- suggestResults: undefined
67
+ announcements: undefined,
68
+ suggestResults: undefined,
69
+ configuration: undefined,
64
70
  },
65
- reducers: searchPageStateReducers
71
+ reducers: searchPageStateReducers,
66
72
  });
@@ -1,9 +1,10 @@
1
- import { type FluidTopicsApi, FtSearchLocales, FtSearchRequest, FtSearchResults, FtSuggestRequest, FtSuggestResults } from "@fluid-topics/public-api";
1
+ import { type FluidTopicsApi, FtSearchConfiguration, FtSearchLocales, FtSearchRequest, FtSearchResults, FtSuggestRequest, FtSuggestResults } from "@fluid-topics/public-api";
2
2
  import { FtServiceWithCache } from "@fluid-topics/ft-app-context";
3
3
  export declare class FtSearchService extends FtServiceWithCache {
4
4
  constructor(overrideApi?: FluidTopicsApi);
5
5
  launchSearch(request: FtSearchRequest): Promise<FtSearchResults>;
6
6
  launchSuggest(request: FtSuggestRequest): Promise<FtSuggestResults>;
7
7
  getAvailableSearchLocales(): Promise<FtSearchLocales>;
8
+ getConfiguration(): Promise<FtSearchConfiguration>;
8
9
  private sortFilters;
9
10
  }
@@ -2,6 +2,7 @@ import { FtServiceWithCache } from "@fluid-topics/ft-app-context";
2
2
  export class FtSearchService extends FtServiceWithCache {
3
3
  constructor(overrideApi) {
4
4
  super(true, overrideApi);
5
+ this.cache.registerFinal("search-configuration", async () => (await this.awaitApi).getSearchConfiguration());
5
6
  }
6
7
  async launchSearch(request) {
7
8
  const sortedRequest = {
@@ -14,21 +15,24 @@ export class FtSearchService extends FtServiceWithCache {
14
15
  async launchSuggest(request) {
15
16
  const sortedRequest = {
16
17
  ...request,
17
- metadataFilters: this.sortFilters(request.metadataFilters)
18
+ metadataFilters: this.sortFilters(request.metadataFilters),
18
19
  };
19
20
  return this.cache.get("suggest-" + this.hash(sortedRequest), async () => (await this.awaitApi).getSuggestions(request), 2 * 60 * 1000);
20
21
  }
21
22
  async getAvailableSearchLocales() {
22
23
  return this.cache.get("available-locales", async () => (await this.awaitApi).getAvailableSearchLocales());
23
24
  }
25
+ async getConfiguration() {
26
+ return this.cache.get("search-configuration");
27
+ }
24
28
  sortFilters(filters) {
25
29
  return filters
26
- .map(f => f.valueFilter == null ? f : {
30
+ .map((f) => f.valueFilter == null ? f : {
27
31
  ...f,
28
32
  valueFilter: {
29
33
  ...f.valueFilter,
30
- values: [...f.valueFilter.values].sort((a, b) => a.localeCompare(b))
31
- }
34
+ values: [...f.valueFilter.values].sort((a, b) => a.localeCompare(b)),
35
+ },
32
36
  })
33
37
  .sort((a, b) => a.key.localeCompare(b.key));
34
38
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-topics/ft-search-context",
3
- "version": "1.3.15",
3
+ "version": "1.3.17",
4
4
  "description": "Context block for integrated search components",
5
5
  "keywords": [
6
6
  "Lit"
@@ -19,12 +19,12 @@
19
19
  "url": "ssh://git@scm.mrs.antidot.net:2222/fluidtopics/ft-web-components.git"
20
20
  },
21
21
  "dependencies": {
22
- "@fluid-topics/ft-app-context": "1.3.15",
23
- "@fluid-topics/ft-wc-utils": "1.3.15",
22
+ "@fluid-topics/ft-app-context": "1.3.17",
23
+ "@fluid-topics/ft-wc-utils": "1.3.17",
24
24
  "lit": "3.1.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@fluid-topics/public-api": "1.0.100"
27
+ "@fluid-topics/public-api": "1.0.102"
28
28
  },
29
- "gitHead": "5aa2861244264a93f9ce941c3541191eb22a4650"
29
+ "gitHead": "ca55c7b44d386d960ceb68323361ce0ab3aefaa8"
30
30
  }