1
1
import React , { useCallback , useMemo } from "react"
2
+ import { LearningResourceOfferor } from "api"
2
3
import { ChannelTypeEnum } from "api/v0"
3
4
import { useOfferorsList } from "api/hooks/learningResources"
4
- import { useResourceSearchParams } from "@mitodl/course-search-utils"
5
- import type { Facets , BooleanFacets } from "@mitodl/course-search-utils"
5
+
6
+ import {
7
+ useResourceSearchParams ,
8
+ UseResourceSearchParamsProps ,
9
+ } from "@mitodl/course-search-utils"
10
+ import type {
11
+ Facets ,
12
+ BooleanFacets ,
13
+ FacetManifest ,
14
+ } from "@mitodl/course-search-utils"
6
15
import { useSearchParams } from "@mitodl/course-search-utils/next"
7
16
import SearchDisplay from "@/page-components/SearchDisplay/SearchDisplay"
8
17
import { Container , styled , VisuallyHidden } from "ol-components"
9
18
import { SearchField } from "@/page-components/SearchField/SearchField"
10
- import { getFacets } from "./searchRequests"
19
+
20
+ import { getFacetManifest } from "@/app-pages/SearchPage/SearchPage"
11
21
12
22
import _ from "lodash"
13
23
@@ -25,6 +35,34 @@ const StyledSearchField = styled(SearchField)({
25
35
width : "624px" ,
26
36
} )
27
37
38
+ const FACETS_BY_CHANNEL_TYPE : Record < ChannelTypeEnum , string [ ] > = {
39
+ [ ChannelTypeEnum . Topic ] : [
40
+ "free" ,
41
+ "resource_type" ,
42
+ "certification_type" ,
43
+ "delivery" ,
44
+ "offered_by" ,
45
+ "department" ,
46
+ ] ,
47
+ [ ChannelTypeEnum . Department ] : [
48
+ "free" ,
49
+ "resource_type" ,
50
+ "certification_type" ,
51
+ "topic" ,
52
+ "delivery" ,
53
+ "offered_by" ,
54
+ ] ,
55
+ [ ChannelTypeEnum . Unit ] : [
56
+ "free" ,
57
+ "resource_type" ,
58
+ "topic" ,
59
+ "certification_type" ,
60
+ "delivery" ,
61
+ "department" ,
62
+ ] ,
63
+ [ ChannelTypeEnum . Pathway ] : [ ] ,
64
+ }
65
+
28
66
const SHOW_PROFESSIONAL_TOGGLE_BY_CHANNEL_TYPE : Record <
29
67
ChannelTypeEnum ,
30
68
boolean
@@ -35,6 +73,24 @@ const SHOW_PROFESSIONAL_TOGGLE_BY_CHANNEL_TYPE: Record<
35
73
[ ChannelTypeEnum . Pathway ] : false ,
36
74
}
37
75
76
+ const getFacetManifestForChannelType = (
77
+ channelType : ChannelTypeEnum ,
78
+ offerors : Record < string , LearningResourceOfferor > ,
79
+ constantSearchParams : Facets ,
80
+ resourceCategory : string | null ,
81
+ ) : FacetManifest => {
82
+ const facets = FACETS_BY_CHANNEL_TYPE [ channelType ] || [ ]
83
+ return getFacetManifest ( offerors , resourceCategory )
84
+ . filter (
85
+ ( facetSetting ) =>
86
+ ! Object . keys ( constantSearchParams ) . includes ( facetSetting . name ) &&
87
+ facets . includes ( facetSetting . name ) ,
88
+ )
89
+ . sort (
90
+ ( a , b ) => facets . indexOf ( a . name ) - facets . indexOf ( b . name ) ,
91
+ ) as FacetManifest
92
+ }
93
+
38
94
interface ChannelSearchProps {
39
95
constantSearchParams : Facets & BooleanFacets
40
96
channelType : ChannelTypeEnum
@@ -54,9 +110,14 @@ const ChannelSearch: React.FC<ChannelSearchProps> = ({
54
110
const [ searchParams , setSearchParams ] = useSearchParams ( )
55
111
const resourceCategory = searchParams . get ( "resource_category" )
56
112
57
- const { facetNames , facetManifest } = useMemo (
113
+ const facetManifest = useMemo (
58
114
( ) =>
59
- getFacets ( channelType , offerors , constantSearchParams , resourceCategory ) ,
115
+ getFacetManifestForChannelType (
116
+ channelType ,
117
+ offerors ,
118
+ constantSearchParams ,
119
+ resourceCategory ,
120
+ ) ,
60
121
[ offerors , channelType , constantSearchParams , resourceCategory ] ,
61
122
)
62
123
@@ -79,6 +140,18 @@ const ChannelSearch: React.FC<ChannelSearchProps> = ({
79
140
setPage ( 1 )
80
141
} , [ setPage ] )
81
142
143
+ const facetNames = Array . from (
144
+ new Set (
145
+ facetManifest . flatMap ( ( facet ) => {
146
+ if ( facet . type === "group" ) {
147
+ return facet . facets . map ( ( subfacet ) => subfacet . name )
148
+ } else {
149
+ return [ facet . name ]
150
+ }
151
+ } ) ,
152
+ ) ,
153
+ ) as UseResourceSearchParamsProps [ "facets" ]
154
+
82
155
const {
83
156
hasFacets,
84
157
params,
0 commit comments