@clickview/streamable-learning 0.48.0-rc.1 → 0.48.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/dist/.vite/manifest.json +605 -605
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{CN8PeBwg.chunk.js → BIisq8ZO.chunk.js} +2 -2
- package/dist/scripts/{CN8PeBwg.chunk.js.map → BIisq8ZO.chunk.js.map} +1 -1
- package/dist/scripts/{BaMNOAYj2.chunk.js → BWU6_pPN2.chunk.js} +2 -2
- package/dist/scripts/{BaMNOAYj2.chunk.js.map → BWU6_pPN2.chunk.js.map} +1 -1
- package/dist/scripts/{BvJXPFoz2.chunk.js → BcZFo9Vw2.chunk.js} +2 -2
- package/dist/scripts/{BvJXPFoz2.chunk.js.map → BcZFo9Vw2.chunk.js.map} +1 -1
- package/dist/scripts/Bd2bbHru.chunk.js +1 -0
- package/dist/scripts/{CkYqp83j.chunk.js → BfNy0Hvk.chunk.js} +2 -2
- package/dist/scripts/{CkYqp83j.chunk.js.map → BfNy0Hvk.chunk.js.map} +1 -1
- package/dist/scripts/{D0SYGnyF.chunk.js → BivP7X20.chunk.js} +2 -2
- package/dist/scripts/{D0SYGnyF.chunk.js.map → BivP7X20.chunk.js.map} +1 -1
- package/dist/scripts/{BihZ4r0z2.chunk.js → BjbY4Fbp2.chunk.js} +3 -3
- package/dist/scripts/{BihZ4r0z2.chunk.js.map → BjbY4Fbp2.chunk.js.map} +1 -1
- package/dist/scripts/{DO8_mR5i2.chunk.js → BmxcE73n2.chunk.js} +2 -2
- package/dist/scripts/{DO8_mR5i2.chunk.js.map → BmxcE73n2.chunk.js.map} +1 -1
- package/dist/scripts/{bycmewy72.chunk.js → BnEMhkEE2.chunk.js} +2 -2
- package/dist/scripts/{bycmewy72.chunk.js.map → BnEMhkEE2.chunk.js.map} +1 -1
- package/dist/scripts/{jWpq99N3.chunk.js → Buc8GegC.chunk.js} +2 -2
- package/dist/scripts/{jWpq99N3.chunk.js.map → Buc8GegC.chunk.js.map} +1 -1
- package/dist/scripts/{CrCAJmt6.chunk.js → Byczy1lS.chunk.js} +2 -2
- package/dist/scripts/{CrCAJmt6.chunk.js.map → Byczy1lS.chunk.js.map} +1 -1
- package/dist/scripts/{BZOcEcTA2.chunk.js → C2itEpvc2.chunk.js} +2 -2
- package/dist/scripts/{BZOcEcTA2.chunk.js.map → C2itEpvc2.chunk.js.map} +1 -1
- package/dist/scripts/{smdLElLq.chunk.js → CEFKXxac.chunk.js} +2 -2
- package/dist/scripts/{smdLElLq.chunk.js.map → CEFKXxac.chunk.js.map} +1 -1
- package/dist/scripts/{B-qOny0I2.chunk.js → CEYjJAp52.chunk.js} +2 -2
- package/dist/scripts/{B-qOny0I2.chunk.js.map → CEYjJAp52.chunk.js.map} +1 -1
- package/dist/scripts/{CNJrD44-2.chunk.js → CJSc4YDq2.chunk.js} +2 -2
- package/dist/scripts/{CNJrD44-2.chunk.js.map → CJSc4YDq2.chunk.js.map} +1 -1
- package/dist/scripts/{Br0Uc4GG.chunk.js → CKUA5J3R.chunk.js} +2 -2
- package/dist/scripts/{Br0Uc4GG.chunk.js.map → CKUA5J3R.chunk.js.map} +1 -1
- package/dist/scripts/{CWFInhB82.chunk.js → CYrzupmS2.chunk.js} +2 -2
- package/dist/scripts/{CWFInhB82.chunk.js.map → CYrzupmS2.chunk.js.map} +1 -1
- package/dist/scripts/{Llxar-VU.chunk.js → CcGYZb9f.chunk.js} +2 -2
- package/dist/scripts/{Llxar-VU.chunk.js.map → CcGYZb9f.chunk.js.map} +1 -1
- package/dist/scripts/{BTYwcYPL2.chunk.js → CeQGaFi-2.chunk.js} +2 -2
- package/dist/scripts/{BTYwcYPL2.chunk.js.map → CeQGaFi-2.chunk.js.map} +1 -1
- package/dist/scripts/{D7tastET2.chunk.js → Cr3Blj6H2.chunk.js} +2 -2
- package/dist/scripts/{D7tastET2.chunk.js.map → Cr3Blj6H2.chunk.js.map} +1 -1
- package/dist/scripts/{Dr1flAez.chunk.js → CxCkwLio.chunk.js} +2 -2
- package/dist/scripts/{Dr1flAez.chunk.js.map → CxCkwLio.chunk.js.map} +1 -1
- package/dist/scripts/{DyT1OGvP2.chunk.js → Cxj75Dqe2.chunk.js} +2 -2
- package/dist/scripts/{DyT1OGvP2.chunk.js.map → Cxj75Dqe2.chunk.js.map} +1 -1
- package/dist/scripts/{CsC3VVvE2.chunk.js → D-VNmhoM2.chunk.js} +2 -2
- package/dist/scripts/{CsC3VVvE2.chunk.js.map → D-VNmhoM2.chunk.js.map} +1 -1
- package/dist/scripts/{CKdklY2o2.chunk.js → D2FqnK9m2.chunk.js} +2 -2
- package/dist/scripts/{CKdklY2o2.chunk.js.map → D2FqnK9m2.chunk.js.map} +1 -1
- package/dist/scripts/{qcrBN1zR2.chunk.js → D3sdyN2Q2.chunk.js} +2 -2
- package/dist/scripts/{qcrBN1zR2.chunk.js.map → D3sdyN2Q2.chunk.js.map} +1 -1
- package/dist/scripts/{Ce1TZZdV2.chunk.js → D6IzS-bj2.chunk.js} +2 -2
- package/dist/scripts/{Ce1TZZdV2.chunk.js.map → D6IzS-bj2.chunk.js.map} +1 -1
- package/dist/scripts/{B703cBe72.chunk.js → D8g6nOG92.chunk.js} +2 -2
- package/dist/scripts/{B703cBe72.chunk.js.map → D8g6nOG92.chunk.js.map} +1 -1
- package/dist/scripts/{CCoZQmgX.chunk.js → DCKKwz9L.chunk.js} +2 -2
- package/dist/scripts/{CCoZQmgX.chunk.js.map → DCKKwz9L.chunk.js.map} +1 -1
- package/dist/scripts/{DIavEegC.chunk.js → DL4UFxRK.chunk.js} +2 -2
- package/dist/scripts/{DIavEegC.chunk.js.map → DL4UFxRK.chunk.js.map} +1 -1
- package/dist/scripts/{C5i1HsPp2.chunk.js → DLofRa642.chunk.js} +2 -2
- package/dist/scripts/{C5i1HsPp2.chunk.js.map → DLofRa642.chunk.js.map} +1 -1
- package/dist/scripts/{B5jBIPaP.chunk.js → DMZ--ok1.chunk.js} +2 -2
- package/dist/scripts/{B5jBIPaP.chunk.js.map → DMZ--ok1.chunk.js.map} +1 -1
- package/dist/scripts/{CUUUI6pl.chunk.js → DQFcbMMk.chunk.js} +2 -2
- package/dist/scripts/{CUUUI6pl.chunk.js.map → DQFcbMMk.chunk.js.map} +1 -1
- package/dist/scripts/{Dj4AeYQQ2.chunk.js → DVeqPzBe2.chunk.js} +2 -2
- package/dist/scripts/{Dj4AeYQQ2.chunk.js.map → DVeqPzBe2.chunk.js.map} +1 -1
- package/dist/scripts/{CGxa1Jzq.chunk.js → DWerltCT.chunk.js} +2 -2
- package/dist/scripts/{CGxa1Jzq.chunk.js.map → DWerltCT.chunk.js.map} +1 -1
- package/dist/scripts/{CbLL7dIz2.chunk.js → DatscYpA2.chunk.js} +2 -2
- package/dist/scripts/{CbLL7dIz2.chunk.js.map → DatscYpA2.chunk.js.map} +1 -1
- package/dist/scripts/{DwzBzBlI2.chunk.js → DkaGC5IU2.chunk.js} +2 -2
- package/dist/scripts/{DwzBzBlI2.chunk.js.map → DkaGC5IU2.chunk.js.map} +1 -1
- package/dist/scripts/{BLrjbrp8.chunk.js → DqZWSPDJ.chunk.js} +2 -2
- package/dist/scripts/{BLrjbrp8.chunk.js.map → DqZWSPDJ.chunk.js.map} +1 -1
- package/dist/scripts/{BKnxYKDu2.chunk.js → Dql-1E6g2.chunk.js} +2 -2
- package/dist/scripts/{BKnxYKDu2.chunk.js.map → Dql-1E6g2.chunk.js.map} +1 -1
- package/dist/scripts/{B7iwtSij.chunk.js → DuBHin02.chunk.js} +2 -2
- package/dist/scripts/{B7iwtSij.chunk.js.map → DuBHin02.chunk.js.map} +1 -1
- package/dist/scripts/{BpgHKWR52.chunk.js → QMuFwiiF2.chunk.js} +2 -2
- package/dist/scripts/{BpgHKWR52.chunk.js.map → QMuFwiiF2.chunk.js.map} +1 -1
- package/dist/scripts/{Ces-KTwe.chunk.js → U_sIlzAD.chunk.js} +2 -2
- package/dist/scripts/{Ces-KTwe.chunk.js.map → U_sIlzAD.chunk.js.map} +1 -1
- package/dist/scripts/{ACTQklJQ.chunk.js → WLyOm9Lj.chunk.js} +2 -2
- package/dist/scripts/{ACTQklJQ.chunk.js.map → WLyOm9Lj.chunk.js.map} +1 -1
- package/dist/scripts/{DR80oZtZ.chunk.js → Ymq7JLkU.chunk.js} +2 -2
- package/dist/scripts/{DR80oZtZ.chunk.js.map → Ymq7JLkU.chunk.js.map} +1 -1
- package/dist/scripts/{app-BIigh9wv.js → app-gjHxcZG3.js} +4 -4
- package/dist/scripts/app-gjHxcZG3.js.map +1 -0
- package/dist/scripts/{CNmmq34f.chunk.js → djRnI462.chunk.js} +2 -2
- package/dist/scripts/{CNmmq34f.chunk.js.map → djRnI462.chunk.js.map} +1 -1
- package/dist/scripts/{oTYyWWB-.chunk.js → e2K2YU7z.chunk.js} +2 -2
- package/dist/scripts/{oTYyWWB-.chunk.js.map → e2K2YU7z.chunk.js.map} +1 -1
- package/dist/scripts/{BxypZGPK.chunk.js → fnfhCa1P.chunk.js} +2 -2
- package/dist/scripts/{BxypZGPK.chunk.js.map → fnfhCa1P.chunk.js.map} +1 -1
- package/dist/scripts/{BsAo7Lri2.chunk.js → iyIL3kim2.chunk.js} +2 -2
- package/dist/scripts/{BsAo7Lri2.chunk.js.map → iyIL3kim2.chunk.js.map} +1 -1
- package/dist/scripts/{DK3xia1t.chunk.js → kfFYr9dc.chunk.js} +2 -2
- package/dist/scripts/{DK3xia1t.chunk.js.map → kfFYr9dc.chunk.js.map} +1 -1
- package/dist/scripts/{BXJetawx2.chunk.js → kts5xiiM2.chunk.js} +2 -2
- package/dist/scripts/{BXJetawx2.chunk.js.map → kts5xiiM2.chunk.js.map} +1 -1
- package/dist/scripts/{tYi-sUb22.chunk.js → lLAYbgAy2.chunk.js} +2 -2
- package/dist/scripts/{tYi-sUb22.chunk.js.map → lLAYbgAy2.chunk.js.map} +1 -1
- package/dist/scripts/{BCBfXCYM2.chunk.js → p9ukva5a2.chunk.js} +2 -2
- package/dist/scripts/{BCBfXCYM2.chunk.js.map → p9ukva5a2.chunk.js.map} +1 -1
- package/dist/scripts/{DKnZ8BaN.chunk.js → wOeN2ls0.chunk.js} +2 -2
- package/dist/scripts/{DKnZ8BaN.chunk.js.map → wOeN2ls0.chunk.js.map} +1 -1
- package/dist/scripts/{DU1SE31v2.chunk.js → zp2BHOp82.chunk.js} +2 -2
- package/dist/scripts/{DU1SE31v2.chunk.js.map → zp2BHOp82.chunk.js.map} +1 -1
- package/dist/scripts/{DnSy_Myx.chunk.js → zyVwH8JF.chunk.js} +2 -2
- package/dist/scripts/{DnSy_Myx.chunk.js.map → zyVwH8JF.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/C4MLxDS-.chunk.js +0 -1
- package/dist/scripts/app-BIigh9wv.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./Dp9qJj1C.chunk.js";import{t as e}from"./ImQRQGZr.chunk.js";import{dt as t,lt as n,ut as r}from"./Dun43GrB.chunk.js";import{t as i}from"./B-OL6Vs7.chunk.js";import{l as a,u as o}from"./BQ5XMoHG.chunk.js";import{t as s}from"./DeldjYRc.chunk.js";import{t as c}from"./H6wjCesG.chunk.js";import{t as l}from"./Ca1QPe-q2.chunk.js";import{n as u}from"./D7d5XFW82.chunk.js";import{n as d,t as f}from"./DjIdG9LL2.chunk.js";import{r as p,t as m}from"./D2om474U2.chunk.js";import{I as h,q as g}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./Dp9qJj1C.chunk.js";import{t as e}from"./ImQRQGZr.chunk.js";import{dt as t,lt as n,ut as r}from"./Dun43GrB.chunk.js";import{t as i}from"./B-OL6Vs7.chunk.js";import{l as a,u as o}from"./BQ5XMoHG.chunk.js";import{t as s}from"./DeldjYRc.chunk.js";import{t as c}from"./H6wjCesG.chunk.js";import{t as l}from"./Ca1QPe-q2.chunk.js";import{n as u}from"./D7d5XFW82.chunk.js";import{n as d,t as f}from"./DjIdG9LL2.chunk.js";import{r as p,t as m}from"./D2om474U2.chunk.js";import{I as h,q as g}from"./app-gjHxcZG3.js";import{n as _,r as v}from"./U_sIlzAD.chunk.js";import{t as y}from"./BlBCp_pE.chunk.js";import{r as b,t as x}from"./BBWlVBxr.chunk.js";import{n as S,t as C}from"./ClGIvvk6.chunk.js";import{t as w}from"./BjxC-sgo.chunk.js";import{t as T}from"./BA8QDRzp.chunk.js";import{t as E}from"./Buc8GegC.chunk.js";import{t as D}from"./Blj1z_g2.chunk.js";r();var O={logoContainer:`_logoContainer_x28hp_1`},k=n();function A(){return(0,k.jsx)(k.Fragment,{children:[...Array(24)].map((e,t)=>(0,k.jsx)(`div`,{className:`col-12 col-md-6 col-xl-4`,children:(0,k.jsxs)(`div`,{className:`d-flex align-items-center border w-100 h-100 rounded-3 overflow-hidden`,children:[(0,k.jsx)(`div`,{className:`${O.logoContainer} flex-shrink-0 partial-loading-background`}),(0,k.jsx)(`p`,{className:`partial-loading-background fw-semibold mx-3 mb-0 w-50`,children:`\xA0`})]})},`partial-loading-${t}`))})}var j=`dashboard.contentPartners`,M=e.encloseNamespace(j),N=50;function P(){let n=c(),r=o(),P=a(g.streamablePresentation());f(d.getDefaultMetadata({title:M(`pageTitle`),description:M(`pageDescription`),canonicalLink:y.getCanonicalLink(),allowIndexing:!0,product:h.PRODUCT_NAME}));function F(e){if(P.data)return w.companies({presentation:P.data?.id.toString()},e,N)}function I(e){r(F(e))}function L(t,r){if(t===1)return E(r);n.error(e.getPhrase(j,`error`))}let R=D(F,I,L,e=>e.results);return(0,k.jsxs)(`div`,{className:`px-4`,children:[(0,k.jsx)(v,{active:`partners`,appLinks:_()}),(0,k.jsx)(`h1`,{className:`h2 mb-3`,children:(0,k.jsx)(u,{namespace:j,phrase:`heading`})}),(0,k.jsxs)(`div`,{className:`row g-3`,children:[R.items?.length?(0,k.jsx)(k.Fragment,{children:R.items?.map(e=>{let n=x(e.name,b);return(0,k.jsx)(l,{appLink:{application:i.DASHBOARD,action:s.Dashboard.COMPANY_DASHBOARD,args:[e.id,t.slugify(e.name)]},className:`col-12 col-md-6 col-xl-4`,children:(0,k.jsxs)(`div`,{className:`d-flex align-items-center border w-100 h-100 rounded-3 overflow-hidden`,children:[(0,k.jsx)(`div`,{className:`${O.logoContainer} flex-shrink-0 position-relative`,children:e.logo?(0,k.jsx)(`img`,{className:`w-100 ${!e.metadata?.colour&&n}`,src:m.createUrl(e.logo.url,{size:p.Medium}),alt:e.name,style:{backgroundColor:e.metadata?.colour}}):(0,k.jsx)(C,{type:S.Subject,extraClasses:`w-100`})}),(0,k.jsx)(`p`,{className:`fw-semibold mx-3 mb-0`,children:e.name})]})},e.id)})}):(0,k.jsx)(A,{}),(R.hasMore||R.isFetching)&&(0,k.jsx)(T,{isFetching:R.isFetching,fetchNext:I,nextCursor:R.nextCursor,fetchOnScroll:!0})]})]})}export{P as ContentPartnersView};
|
|
2
|
+
//# sourceMappingURL=BIisq8ZO.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BIisq8ZO.chunk.js","names":[],"sources":["../../src/apps/dashboard/views/content-partners/content-partners.module.scss","../../src/apps/dashboard/views/content-partners/partial-loading/ContentPartnersPartialLoading.tsx","../../src/apps/dashboard/views/content-partners/ContentPartnersView.tsx"],"sourcesContent":[":local {\n .logoContainer {\n width: 8rem;\n height: 8rem;\n }\n}","import React from 'react';\n\nimport styles from '../content-partners.module.scss';\n\nexport function ContentPartnersPartialLoading() {\n return (\n <>\n {[...Array(24)].map((_, index) => (\n <div key={`partial-loading-${index}`} className='col-12 col-md-6 col-xl-4'>\n <div className='d-flex align-items-center border w-100 h-100 rounded-3 overflow-hidden'>\n <div className={`${styles.logoContainer} flex-shrink-0 partial-loading-background`}></div>\n <p className='partial-loading-background fw-semibold mx-3 mb-0 w-50'> </p>\n </div>\n </div>\n ))}\n </>\n );\n}\n","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SearchResults, SearchResultsObject } from 'libs/shared/apps/search/interfaces';\nimport { StreamableHeader } from 'libs/shared/apps/streamable-learning/components/header/StreamableHeader';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Company, Presentation } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { CompanyRequests } from 'shared/flight-requests/CompanyRequests';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { ContentPartnersPartialLoading } from 'apps/dashboard/views/content-partners/partial-loading/ContentPartnersPartialLoading';\nimport { getStreamableHeaderAppLinks } from 'apps/dashboard/views/dashboard/DiscoverViewUtils';\n\nimport styles from './content-partners.module.scss';\n\nconst namespace = 'dashboard.contentPartners';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst SEARCH_RESULTS_LIMIT = 50;\n\ntype CompanySearchResults = SearchResults<SearchResultsObject<Company>>;\n\nexport function ContentPartnersView() {\n const alerts = useAlerts();\n const fetch = Flight.useGetFetch();\n\n const streamablePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: getPhrase('pageTitle'),\n description: getPhrase('pageDescription'),\n canonicalLink: SeoHelper.getCanonicalLink(),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n function getSearchRequest(cursor?: string) {\n if (!streamablePresentation.data) return;\n\n return CompanyRequests.companies(\n { presentation: streamablePresentation.data?.id.toString() },\n cursor,\n SEARCH_RESULTS_LIMIT\n );\n }\n\n function fetchNext(cursor?: string) {\n fetch(getSearchRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const searchResults = useInfiniteList<SearchResultsObject<Company>, SearchResults>(\n getSearchRequest,\n fetchNext,\n onError,\n (data: CompanySearchResults) => data.results\n );\n\n return (\n <div className='px-4'>\n <StreamableHeader active='partners' appLinks={getStreamableHeaderAppLinks()} />\n\n <h1 className='h2 mb-3'><Text namespace={namespace} phrase='heading' /></h1>\n\n <div className='row g-3'>\n {searchResults.items?.length ? (\n <>\n {searchResults.items?.map((company: Company) => {\n const logoFallbackBgClassName = getBgColorClass(company.name, BG_COLOUR_CLASS_NAMES);\n return (\n <AppLink\n appLink={{\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.COMPANY_DASHBOARD,\n args: [ company.id, TextHelper.slugify(company.name) ]\n }}\n className='col-12 col-md-6 col-xl-4'\n key={company.id}\n >\n <div className='d-flex align-items-center border w-100 h-100 rounded-3 overflow-hidden'>\n <div className={`${styles.logoContainer} flex-shrink-0 position-relative`}>\n {company.logo ? (\n <img\n className={`w-100 ${!company.metadata?.colour && logoFallbackBgClassName}`}\n src={ImageHelper.createUrl(company.logo.url, { size: ImageSize.Medium })}\n alt={company.name}\n style={{\n backgroundColor: company.metadata?.colour\n }}\n />\n ) :\n <ImageFallback\n type={ImageFallbackType.Subject}\n extraClasses='w-100'\n />\n }\n </div>\n <p className='fw-semibold mx-3 mb-0'>{company.name}</p>\n </div>\n </AppLink>\n );\n })}\n </>\n ) : <ContentPartnersPartialLoading />}\n {(searchResults.hasMore || searchResults.isFetching) && (\n <InfiniteScrollFooter\n isFetching={searchResults.isFetching}\n fetchNext={fetchNext}\n nextCursor={searchResults.nextCursor}\n fetchOnScroll\n />\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{a as n,t as r,v as i}from"./BJvPfCvt.chunk.js";import{M as a,lt as o,ut as s}from"./Dun43GrB.chunk.js";import{t as c}from"./B7tm2CBz.chunk.js";import{t as l}from"./CxwN2xIE.chunk.js";import{i as u,o as d,r as f,s as p,t as m}from"./8W5MLvcf.chunk.js";import{t as h}from"./CMND6rmE.chunk.js";import{n as g}from"./Ca1QPe-q2.chunk.js";import{n as _,t as v}from"./D7d5XFW82.chunk.js";import{n as y,t as b}from"./CVaCZDos2.chunk.js";import{t as x}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{a as n,t as r,v as i}from"./BJvPfCvt.chunk.js";import{M as a,lt as o,ut as s}from"./Dun43GrB.chunk.js";import{t as c}from"./B7tm2CBz.chunk.js";import{t as l}from"./CxwN2xIE.chunk.js";import{i as u,o as d,r as f,s as p,t as m}from"./8W5MLvcf.chunk.js";import{t as h}from"./CMND6rmE.chunk.js";import{n as g}from"./Ca1QPe-q2.chunk.js";import{n as _,t as v}from"./D7d5XFW82.chunk.js";import{n as y,t as b}from"./CVaCZDos2.chunk.js";import{t as x}from"./Byczy1lS.chunk.js";var S=e(s()),C=o(),w=`search.filterActions`;T.defaultProps={active:!1,className:``};function T(e){return(0,C.jsxs)(`div`,{className:`d-flex justify-content-between ${e.className}`,children:[e.active?(0,C.jsx)(g,{className:`text-secondary hover-text-underline cursor-pointer`,onClick:e.onClickReset,children:(0,C.jsx)(_,{namespace:w,phrase:`reset`})}):(0,C.jsx)(`div`,{className:`invisible`}),(0,C.jsx)(g,{className:`info-link`,onClick:e.onClickApply,children:(0,C.jsx)(_,{namespace:w,phrase:`apply`})})]})}var E={hideCaret:`_hideCaret_zki3y_1`,filterMenu:`_filterMenu_zki3y_4`,twoColumnsWidth:`_twoColumnsWidth_zki3y_8`,nestedCheckboxesWidth:`_nestedCheckboxesWidth_zki3y_16`,switchWidth:`_switchWidth_zki3y_19`,moreFiltersWidth:`_moreFiltersWidth_zki3y_22`,svgContainer:`_svgContainer_zki3y_26`};function D(e){return m.displayTwoColumns(e)?E.twoColumnsWidth:e.id===`classification`?E.classificationWidth:m.displayTwoLayers(e)?E.nestedCheckboxesWidth:e.type===`switch`?E.switchWidth:``}O.defaultProps={hideCaret:!0};function O(e){let{state:t}=S.useContext(d),n=t[e.filter.id],i=e.filter.type===`dropdown`,[a,o]=S.useState(e.filter.name),[s,c]=S.useState(!1),[l,u]=S.useState(n);S.useEffect(()=>{o(m.getLabel(e.filter,n)),u(n)},[e.filter,n?.selection]);function f(e){u(e),i&&_(e)}function p(){let t=e.filter.options?.find(e=>e.default);u({active:!1,selection:t?[t]:[]})}function g(){_(),c(!1)}function _(r=l){m.applyFilter([e.filter],n,{[e.filter.id]:r},t.appLink)}function v(e){c(e),!(e||i)&&_()}let y=S.useMemo(()=>e.filter.customComponent?e.filter.customComponent:m.mapTypeToComponent(e.filter.type),[e.filter.type]),b=e.hideCaret&&!i?E.hideCaret:``,x=D(e.filter);return e.filter.type===`button`?(0,C.jsx)(y,{filter:e.filter,draftState:l,setDraftState:f}):(0,C.jsxs)(h,{onToggle:v,show:s,children:[(0,C.jsxs)(h.Toggle,{id:`filterButton-${e.filter.id}`,className:`fw-semibold mx-1 btn d-flex align-items-center ${b}`,variant:n.active&&!i?`dark`:`outline-dark`,disabled:e.filter.disabled,children:[!!e.filter.icon&&(0,C.jsx)(`div`,{className:E.svgContainer,children:(0,C.jsx)(r,{svg:e.filter.icon})}),e.filter.labelPrefix,` `,a]}),(0,C.jsx)(h.Menu,{children:(0,C.jsxs)(`div`,{className:`mx-1 ${E.filterMenu} ${x} ${i?``:`px-2 py-1`}`,children:[(0,C.jsx)(y,{filter:e.filter,draftState:l,setDraftState:f}),!i&&!e.filter.disabled&&(0,C.jsx)(T,{active:l.active,onClickReset:p,onClickApply:g})]})})]})}var k={getSetStateByKey(e,t,n){return r=>e(e=>{let a=i.isFunction(n)?n:i.useIdentity();return{...e,[t]:a(r,e)}})}};function A(e){return Object.keys(e).reduce((t,n)=>e[n].active?t+1:t,0)}function j(e){let{state:t}=S.useContext(d),n=t.moreFilters,[r,i]=S.useState(e.filter.name),[a,o]=S.useState(!1),[s,c]=S.useState(n),[l,u]=S.useState(A(n)),f=Object.keys(n).map(e=>`${e}:${n[e].active}`).join(`-`);S.useEffect(()=>{c(n),u(A(n))},[e.filter,f]),S.useEffect(()=>{i(l?`${e.filter.name} - ${l}`:e.filter.name)},[l]);function p(){c(Object.keys(n).reduce((t,n)=>{let r=e.filter.filters.find(e=>e.id===n).options?.find(e=>e.default);return t[n]={active:!1,selection:r?[r]:[]},t},{}))}function g(){v(),o(!1)}function _(e){o(e),!e&&v()}function v(){m.applyFilter(e.filter.filters,n,s,t.appLink)}let y=`fw-semibold ${E.hideCaret} mx-1 btn`;return(0,C.jsxs)(h,{onToggle:_,show:a,children:[(0,C.jsx)(h.Toggle,{id:e.filter.id,className:y,variant:l?`dark`:`outline-dark`,children:r}),(0,C.jsx)(h.Menu,{onClick:e=>e.stopPropagation(),children:(0,C.jsxs)(`div`,{className:`mx-1 ${E.moreFiltersWidth} ${e.filter.type===`dropdown`?``:`px-2 py-1`}`,children:[e.filter.filters.map(e=>(0,C.jsx)(`fieldset`,{children:(0,C.jsx)(e.customComponent?e.customComponent:m.mapTypeToComponent(e.type),{filter:e,draftState:s[e.id],setDraftState:k.getSetStateByKey(c,e.id),isOnMoreFilters:!0})},e.id)),(0,C.jsx)(T,{active:!!Object.keys(s).find(e=>s[e].active),onClickReset:p,onClickApply:g})]})})]})}var M={tagItem:`_tagItem_165ya_1`};function N(e){let{state:t}=S.useContext(d);if(!e.filter?.id)return(0,C.jsx)(C.Fragment,{});let n=t[e.filter.id],{selection:r}=n,i=e.filter?.options?.filter(e=>!r?.find(t=>t.id===e.id))??[];function a(i){let a=null,o=-1;if(r.find((e,t)=>{o>-1||e.id.toString()===i.id.toString()&&(o=t)}),o>=0){let e=[...r.slice(0,o),...r.slice(o+1)];a={active:!!e.length,selection:e}}else a={active:!0,selection:r.concat(i)};m.applyFilter([e.filter],n,{[e.filter.id]:a},t.appLink)}function o(){let t=`mb-3`;return s.length&&e.isFetching?t+=` mt-n1`:!s.length&&!e.isFetching&&(t+=` d-none`),t}let s=[...r,...e.isFetching?[]:i];return(0,C.jsx)(`div`,{className:e.isFetching||s.length?`py-2`:``,children:(0,C.jsx)(`div`,{className:o(),children:(!!s.length||e.isFetching)&&(0,C.jsx)(x,{collection:s,childComponent:e=>(0,C.jsx)(b,{...e,selectedItems:r,onClick:a}),staticChildren:e.isFetching?[,,,].fill({component:()=>(0,C.jsx)(y,{tagClass:M.tagItem}),position:`end`}):[],partialLoadingComponent:()=>(0,C.jsx)(`div`,{className:`me-2`,children:(0,C.jsx)(y,{tagClass:`${M.tagItem}`})})})})})}function P(e){let{state:n}=S.useContext(d);return(0,C.jsx)(g,{onClick:()=>{let e=l.getCurrentRoute().appLink?.params??{},r=a.pick(e,[`query`,f,u]);t.trigger({...n.appLink,params:r})},className:`${e.alignLeft?`order-first`:``} hover-text-underline cursor-pointer d-flex align-items-center mx-2`,children:(0,C.jsx)(_,{namespace:`search.resetButton`,phrase:`reset`})})}var F={partialFilterHeading:`_partialFilterHeading_1pjxc_1`,partialButton:`_partialButton_1pjxc_5`,filtersContainer:`_filtersContainer_1pjxc_9`};function I(e){let{queryParams:t,appLink:r,hideHeading:i,isFetchingOptions:o,constantIndices:s=[]}=e,l=S.useMemo(()=>m.deriveInitialStateFromQuery(t,e.mainFilters,e.moreFilters,r),[t,o]),[u,f]=S.useReducer(p,l);S.useEffect(()=>{a.isEqual(l,u)||(f({type:`update`,payload:l}),e.analyticsOptions&&m.logFilterEvent(e.mainFilters,e.moreFilters,l,t.query,e.analyticsOptions))},[l]);let h=c.uniq([...m.getAppliedIndices(t,e._hasNewSearch,e._hasPartnerProfiles),...s]),{mainFilters:g,moreFilters:y}=m.mixinDisabledFields(u,h,e.mainFilters,e.moreFilters),b=g.filter(e=>e.type!==`tag`),x=g.find(e=>e.type===`tag`);return(0,C.jsx)(d.Provider,{value:{state:u,dispatch:f},children:(0,C.jsx)(v.Provider,{value:`search.searchFilters`,children:(0,C.jsxs)(`section`,{children:[(0,C.jsxs)(`div`,{className:n(`d-flex`,!e.hideDivider&&`border-bottom pb-3 mb-3`,e._hasNewSearch&&e.hideDivider&&`pb-3`,e._hasNewSearch&&!e.hideDivider&&`border-gray-300`),children:[!i&&(0,C.jsx)(`h2`,{className:`h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center`,children:(0,C.jsx)(_,{phrase:`heading`})}),(0,C.jsxs)(`div`,{className:n(`d-flex flex-wrap ${F.filtersContainer}`,!i&&`ms-2`),children:[b.map(t=>(0,C.jsx)(O,{filter:t,hideCaret:e.hideCaret},t.id)),y&&(0,C.jsx)(j,{filter:y}),m.hasActiveFilters(t)&&!e.hideResetButton&&(0,C.jsx)(P,{mainFilters:e.mainFilters,moreFilters:e.moreFilters,currentQueryParam:t.query,analyticsOptions:e.analyticsOptions,alignLeft:e.alignResetButtonLeft})]})]}),(0,C.jsx)(N,{filter:x,queryParams:t,isFetching:e.isFetchingOptions})]})})})}export{I as t};
|
|
2
|
+
//# sourceMappingURL=BWU6_pPN2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaMNOAYj2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","../../../../libs/shared/src/apps/search/components/filter-button/filter-button.module.scss","../../../../libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","../../../../libs/shared/src/utils/StateHelper.ts","../../../../libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/tag-filter.module.scss","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","../../../../libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","../../../../libs/shared/src/apps/search/components/search-filters/search-filters.module.scss","../../../../libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}\n",":local {\n .hideCaret::after {\n display: none;\n }\n\n .filterMenu {\n min-width: 10rem;\n width: max-content;\n\n &.twoColumnsWidth {\n max-width: 35rem;\n \n @media screen and (max-width: #{map-get($grid-breakpoints, md) - 1px}) {\n max-width: 20rem;\n }\n }\n\n &.nestedCheckboxesWidth {\n min-width: 12rem;\n }\n\n &.switchWidth {\n max-width: 15rem;\n }\n }\n\n .moreFiltersWidth {\n width: 25rem;\n max-width: calc(100vw - map-get($spacers, 4));\n }\n\n // Icon positioning adjustments to make it look nicer\n .svgContainer {\n margin-top: 0.05rem;\n margin-right: 0.2rem;\n margin-left: -0.2rem;\n }\n}\n","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.module.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent ?\n props.filter.customComponent :\n FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svg={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};\n","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.module.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active ?\n acc + 1 :\n acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent ?\n filter.customComponent :\n FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n",":local {\n .tagItem {\n // Default tag styles\n line-height: 1rem;\n }\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.module.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching ?\n new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n }) :\n []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM } from '../../utils/SharedSearchHelper';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string,\n mainFilters: Array<SearchFilter>,\n moreFilters: MoreFilters,\n alignLeft?: boolean\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n const currentParams = (ContextService.getCurrentRoute().appLink?.params ?? {}) as HashObject;\n const savedParams = ObjectHelper.pick(currentParams, [ 'query', SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM ]);\n\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: savedParams\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}\n",":local {\n .partialFilterHeading {\n height: 1.5rem;\n width: 3.5rem;\n }\n\n .partialButton {\n height: 2.2rem;\n width: 5rem;\n }\n\n .filtersContainer {\n row-gap: map-get($spacers, 1);\n }\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.module.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject,\n mainFilters: SearchFilter[],\n appLink: Core.AppLink,\n moreFilters?: MoreFilters,\n isFetchingOptions?: boolean,\n constantIndices?: SearchIndices[],\n analyticsOptions?: AnalyticsOptions,\n\n hideHeading?: boolean,\n hideDivider?: boolean,\n hideResetButton?: boolean,\n alignResetButtonLeft?: boolean,\n hideCaret?: boolean,\n\n /**\n * Incremental changes flag for new search\n */\n _hasNewSearch?: boolean,\n /**\n * Incremental changes flag for partner profiles\n */\n _hasPartnerProfiles?: boolean\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams, props._hasNewSearch, props._hasPartnerProfiles),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={classNames(\n 'd-flex',\n !props.hideDivider && 'border-bottom pb-3 mb-3',\n (props._hasNewSearch && props.hideDivider && 'pb-3'),\n (props._hasNewSearch && !props.hideDivider && 'border-gray-300')\n )}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={classNames(`d-flex flex-wrap ${styles.filtersContainer}`, !hideHeading && 'ms-2')}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BWU6_pPN2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","../../../../libs/shared/src/apps/search/components/filter-button/filter-button.module.scss","../../../../libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","../../../../libs/shared/src/utils/StateHelper.ts","../../../../libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/tag-filter.module.scss","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","../../../../libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","../../../../libs/shared/src/apps/search/components/search-filters/search-filters.module.scss","../../../../libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}\n",":local {\n .hideCaret::after {\n display: none;\n }\n\n .filterMenu {\n min-width: 10rem;\n width: max-content;\n\n &.twoColumnsWidth {\n max-width: 35rem;\n \n @media screen and (max-width: #{map-get($grid-breakpoints, md) - 1px}) {\n max-width: 20rem;\n }\n }\n\n &.nestedCheckboxesWidth {\n min-width: 12rem;\n }\n\n &.switchWidth {\n max-width: 15rem;\n }\n }\n\n .moreFiltersWidth {\n width: 25rem;\n max-width: calc(100vw - map-get($spacers, 4));\n }\n\n // Icon positioning adjustments to make it look nicer\n .svgContainer {\n margin-top: 0.05rem;\n margin-right: 0.2rem;\n margin-left: -0.2rem;\n }\n}\n","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.module.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent ?\n props.filter.customComponent :\n FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svg={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};\n","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.module.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active ?\n acc + 1 :\n acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent ?\n filter.customComponent :\n FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n",":local {\n .tagItem {\n // Default tag styles\n line-height: 1rem;\n }\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.module.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching ?\n new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n }) :\n []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM } from '../../utils/SharedSearchHelper';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string,\n mainFilters: Array<SearchFilter>,\n moreFilters: MoreFilters,\n alignLeft?: boolean\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n const currentParams = (ContextService.getCurrentRoute().appLink?.params ?? {}) as HashObject;\n const savedParams = ObjectHelper.pick(currentParams, [ 'query', SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM ]);\n\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: savedParams\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}\n",":local {\n .partialFilterHeading {\n height: 1.5rem;\n width: 3.5rem;\n }\n\n .partialButton {\n height: 2.2rem;\n width: 5rem;\n }\n\n .filtersContainer {\n row-gap: map-get($spacers, 1);\n }\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.module.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject,\n mainFilters: SearchFilter[],\n appLink: Core.AppLink,\n moreFilters?: MoreFilters,\n isFetchingOptions?: boolean,\n constantIndices?: SearchIndices[],\n analyticsOptions?: AnalyticsOptions,\n\n hideHeading?: boolean,\n hideDivider?: boolean,\n hideResetButton?: boolean,\n alignResetButtonLeft?: boolean,\n hideCaret?: boolean,\n\n /**\n * Incremental changes flag for new search\n */\n _hasNewSearch?: boolean,\n /**\n * Incremental changes flag for partner profiles\n */\n _hasPartnerProfiles?: boolean\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams, props._hasNewSearch, props._hasPartnerProfiles),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={classNames(\n 'd-flex',\n !props.hideDivider && 'border-bottom pb-3 mb-3',\n (props._hasNewSearch && props.hideDivider && 'pb-3'),\n (props._hasNewSearch && !props.hideDivider && 'border-gray-300')\n )}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={classNames(`d-flex flex-wrap ${styles.filtersContainer}`, !hideHeading && 'ms-2')}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n"],"mappings":"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"}
|